ZnVuY3Rpb24gZ2V0T2JqZWN0QW5kRXZlbnRRdWVyeSgpIHsKICAgIHZhciBzZWxlY3RlZE5vZGVUeHQgPSAkKCcjY3VycmVudE9yaWdpbmFsTm9kZScpLnRleHQoKTsKICAgIHNlbGVjdGVkTm9kZVR4dCA9IHNlbGVjdGVkTm9kZVR4dC50cmltKCk7CiAgICBzZWxlY3RlZE5vZGVUeHQgPSBzZWxlY3RlZE5vZGVUeHQuc3BsaXQoJyAnKS5qb2luKCcnKTsvL3NlbGVjdGVkTm9kZVR4dC5yZXBsYWNlKCIgIiwgIiIpCiAgICB2YXIgcGFyZW50Tm9kZVR4dCA9ICQoJyNzZWxlY3RlZE1haW5OYXYnKS50ZXh0KCk7CiAgICBwYXJlbnROb2RlVHh0ID0gcGFyZW50Tm9kZVR4dC5yZXBsYWNlKCIvXG4iLCIiKTsKICAgIHBhcmVudE5vZGVUeHQgPSBwYXJlbnROb2RlVHh0LnJlcGxhY2UoIrsiLCIiKTsKICAgIHBhcmVudE5vZGVUeHQgPSBwYXJlbnROb2RlVHh0LnRyaW0oKTsKICAgIGlmIChwYXJlbnROb2RlVHh0Lmxlbmd0aCA+IDAgJiYgcGFyZW50Tm9kZVR4dC5jaGFyQXQocGFyZW50Tm9kZVR4dC5sZW5ndGgtMSk9PSdzJykgewogICAgICAgICAgICBwYXJlbnROb2RlVHh0ID0gcGFyZW50Tm9kZVR4dC5zdWJzdHJpbmcoMCwgcGFyZW50Tm9kZVR4dC5sZW5ndGgtMSk7CiAgICB9CgogICAgaWYgKHBhcmVudE5vZGVUeHQgPT0gIlNsaWNlIikgewogICAgICAgIHJldHVybiAiJmV2ZW50PWxpYnZpcnRfaGVhcnRiZWF0JnNsaWNlPSIgKyBzZWxlY3RlZE5vZGVUeHQ7CiAgICB9IGVsc2UgaWYgKHBhcmVudE5vZGVUeHQgPT0gIlNpdGUiKSB7CiAgICAgICAgcmV0dXJuICImZXZlbnQ9bm9kZV9oZWFydGJlYXQmc2l0ZT0iICsgc2VsZWN0ZWROb2RlVHh0OwogICAgfSBlbHNlIGlmIChwYXJlbnROb2RlVHh0ID09ICJOb2RlIikgewogICAgICAgIHJldHVybiAiJmV2ZW50PW5vZGVfaGVhcnRiZWF0Jm5vZGU9IiArIHNlbGVjdGVkTm9kZVR4dDsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICImZXZlbnQ9bm9kZV9oZWFydGJlYXQiOwogICAgfQp9CgoKZnVuY3Rpb24gc2V0UGFnZVN0YXRJbnQobGFiZWxOYW1lLCB2YWx1ZU5hbWUsIGxlZ2VuZCwgdW5pdHMsIHZhbHVlKSB7CiAgICAkKGxhYmVsTmFtZSkudGV4dChsZWdlbmQpLnNob3coKTsKICAgICQodmFsdWVOYW1lKS50ZXh0KE1hdGgucm91bmQodmFsdWUpK3VuaXRzKS5zaG93KCk7Cn0KCmZ1bmN0aW9uIHNldFBhZ2VTdGF0RmxvYXQobGFiZWxOYW1lLCB2YWx1ZU5hbWUsIGxlZ2VuZCwgdW5pdHMsIHZhbHVlLCBkcCkgewogICAgJChsYWJlbE5hbWUpLnRleHQobGVnZW5kKS5zaG93KCk7CiAgICAkKHZhbHVlTmFtZSkudGV4dChOdW1iZXIodmFsdWUpLnRvRml4ZWQoZHApK3VuaXRzKS5zaG93KCk7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gbm9kZSBjb3VudCBhbmQgYXZlcmFnZSBjcHUgdXRpbGl6YXRpb24KCmZ1bmN0aW9uIHVwZGF0ZVBhZ2VBbmFseXRpY3NEYXRhKHN1bW1hcnlEYXRhKSB7CiAgICB3aW5kb3cucGFnZUFuYWx5dGljc1VybCA9IHN1bW1hcnlEYXRhWyJkYXRhU291cmNlVXJsIl07CiAgICBsYXN0Um93ID0gc3VtbWFyeURhdGEucm93cy5sZW5ndGgtMTsKCiAgICBzZXRQYWdlU3RhdEludCgiLm5vZGVzTGFiZWwiLCAiLm5vZGVzVmFsdWUiLCAiTm9kZSBDb3VudCIsICIiLCBzdW1tYXJ5RGF0YS5yb3dzW2xhc3RSb3ddWyJjb3VudF9ob3N0bmFtZSJdKTsKICAgIHNldFBhZ2VTdGF0SW50KCIuY3B1TGFiZWwiLCAiLmNwdVZhbHVlIiwgIkF2ZyBMb2FkIiwgIiUiLCBzdW1tYXJ5RGF0YS5yb3dzW2xhc3RSb3ddWyJhdmdfY3B1Il0pOwoKICAgIC8vTmV3IG1pbmlEYXNoYm9hcmQKICAgIHNldFBhZ2VTdGF0SW50KCIjbWluaURhc2hOb2RlQ291bnRMYWJlbCIsICIjbWluaURhc2hOb2RlQ291bnQiLCAiTm9kZSBDb3VudCIsICIiLCBzdW1tYXJ5RGF0YS5yb3dzW2xhc3RSb3ddWyJjb3VudF9ob3N0bmFtZSJdKTsKICAgIHNldFBhZ2VTdGF0SW50KCIjbWluaURhc2hBdmdMb2FkTGFiZWwiLCAiI21pbmlEYXNoQXZnTG9hZCIsICJBdmcgTG9hZCIsICIlIiwgc3VtbWFyeURhdGEucm93c1tsYXN0Um93XVsiYXZnX2NwdSJdKTsKfQoKZnVuY3Rpb24gdXBkYXRlUGFnZUFuYWx5dGljcygpIHsKICAgIHZhciB1cmw9ICcvYW5hbHl0aWNzL2JpZ3F1ZXJ5Lz9hdmc9JWNwdSZjb3VudD0laG9zdG5hbWUmY2FjaGVkPTEnICsgZ2V0T2JqZWN0QW5kRXZlbnRRdWVyeSgpOwogICAgY29uc29sZS5sb2codXJsKTsKICAgICQuYWpheCh7CiAgICB1cmw6IHVybCwKICAgIGRhdGFUeXBlIDogJ2pzb24nLAogICAgdHlwZSA6ICdHRVQnLAogICAgc3VjY2VzczogZnVuY3Rpb24obmV3RGF0YSkKICAgIHsKICAgICAgICB1cGRhdGVQYWdlQW5hbHl0aWNzRGF0YShuZXdEYXRhKTsKICAgIH0KfSk7CiAgICBzZXRUaW1lb3V0KHVwZGF0ZVBhZ2VBbmFseXRpY3MsIDMwMDAwKTsKfQoKc2V0VGltZW91dCh1cGRhdGVQYWdlQW5hbHl0aWNzLCA1MDAwKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gYmFuZHdpZHRoCgpmdW5jdGlvbiB1cGRhdGVQYWdlQmFuZHdpZHRoRGF0YShzdW1tYXJ5RGF0YSkgewogICAgd2luZG93LnBhZ2VCYW5kd2lkdGhVcmwgPSBzdW1tYXJ5RGF0YVsiZGF0YVNvdXJjZVVybCJdOwogICAgbGFzdFJvdyA9IHN1bW1hcnlEYXRhLnJvd3MubGVuZ3RoLTE7CiAgICBzZXRQYWdlU3RhdEZsb2F0KCIuYmFuZHdpZHRoTGFiZWwiLCAiLmJhbmR3aWR0aFZhbHVlIiwgIkJhbmR3aWR0aCIsICIgR2JwcyIsIHN1bW1hcnlEYXRhLnJvd3NbbGFzdFJvd11bInN1bV9jb21wdXRlZF9ieXRlc19zZW50X2Rpdl9lbGFwc2VkIl0qOC4wLzEwMjQvMTAyNC8xMDI0LDIpOwogICAgc2V0UGFnZVN0YXRGbG9hdCgiI21pbmlEYXNoQmFuZHdpZHRoTGFiZWwiLCAiI21pbmlEYXNoQmFuZHdpZHRoIiwgIkJhbmR3aWR0aCIsICIgR2JwcyIsIHN1bW1hcnlEYXRhLnJvd3NbbGFzdFJvd11bInN1bV9jb21wdXRlZF9ieXRlc19zZW50X2Rpdl9lbGFwc2VkIl0qOC4wLzEwMjQvMTAyNC8xMDI0LDIpOwp9CgpmdW5jdGlvbiB1cGRhdGVQYWdlQmFuZHdpZHRoKCkgewogICAgdmFyIHVybD0nL2FuYWx5dGljcy9iaWdxdWVyeS8/Y29tcHV0ZWQ9JWJ5dGVzX3NlbnQvJWVsYXBzZWQmY2FjaGVkPTEnICsgZ2V0T2JqZWN0QW5kRXZlbnRRdWVyeSgpOwoKICAgICQuYWpheCh7CiAgICB1cmwgOiB1cmwsCiAgICBkYXRhVHlwZSA6ICdqc29uJywKICAgIHR5cGUgOiAnR0VUJywKICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKG5ld0RhdGEpCiAgICB7CiAgICAgICAgdXBkYXRlUGFnZUJhbmR3aWR0aERhdGEobmV3RGF0YSk7CiAgICB9Cn0pOwogICAgc2V0VGltZW91dCh1cGRhdGVQYWdlQmFuZHdpZHRoLCAzMDAwMCk7Cn0KCnNldFRpbWVvdXQodXBkYXRlUGFnZUJhbmR3aWR0aCwgNTAwMCk7Cgo=