ZnVuY3Rpb24gZ2V0T2JqZWN0UXVlcnkoKSB7CiAgICB2YXIgc2VsZWN0ZWROb2RlVHh0ID0gJCgnLmN1cnJlbnRPcmlnaW5hbE5vZGUnKS50ZXh0KCk7CiAgICBzZWxlY3RlZE5vZGVUeHQgPSBzZWxlY3RlZE5vZGVUeHQudHJpbSgpOwogICAgc2VsZWN0ZWROb2RlVHh0ID0gc2VsZWN0ZWROb2RlVHh0LnNwbGl0KCcgJykuam9pbignJyk7Ly9zZWxlY3RlZE5vZGVUeHQucmVwbGFjZSgiICIsICIiKQogICAgdmFyIHBhcmVudE5vZGVUeHQgPSAkKCcuc2VsZWN0ZWRNYWluTmF2JykudGV4dCgpOwogICAgcGFyZW50Tm9kZVR4dCA9IHBhcmVudE5vZGVUeHQucmVwbGFjZSgiL1xuIiwiIik7CiAgICBwYXJlbnROb2RlVHh0ID0gcGFyZW50Tm9kZVR4dC5yZXBsYWNlKCK7IiwiIik7CiAgICBwYXJlbnROb2RlVHh0ID0gcGFyZW50Tm9kZVR4dC50cmltKCk7CiAgICBpZiAocGFyZW50Tm9kZVR4dC5sZW5ndGggPiAwICYmIHBhcmVudE5vZGVUeHQuY2hhckF0KHBhcmVudE5vZGVUeHQubGVuZ3RoLTEpPT0ncycpIHsKICAgICAgICAgICAgcGFyZW50Tm9kZVR4dCA9IHBhcmVudE5vZGVUeHQuc3Vic3RyaW5nKDAsIHBhcmVudE5vZGVUeHQubGVuZ3RoLTEpOwogICAgfQoKICAgIGlmIChwYXJlbnROb2RlVHh0ID09ICJTbGljZSIpIHsKICAgICAgICByZXR1cm4gIiZzbGljZT0iICsgc2VsZWN0ZWROb2RlVHh0OwogICAgfSBlbHNlIGlmIChwYXJlbnROb2RlVHh0ID09ICJTaXRlIikgewogICAgICAgIHJldHVybiAiJnNpdGU9IiArIHNlbGVjdGVkTm9kZVR4dDsKICAgIH0gZWxzZSBpZiAocGFyZW50Tm9kZVR4dCA9PSAiTm9kZSIpIHsKICAgICAgICByZXR1cm4gIiZub2RlPSIgKyBzZWxlY3RlZE5vZGVUeHQ7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAiIjsKICAgIH0KfQoKCmZ1bmN0aW9uIHNldFBhZ2VTdGF0SW50KGxhYmVsTmFtZSwgdmFsdWVOYW1lLCBsZWdlbmQsIHVuaXRzLCB2YWx1ZSkgewogICAgJCgnLicrbGFiZWxOYW1lKS50ZXh0KGxlZ2VuZCkuc2hvdygpOwogICAgJCgnLicrdmFsdWVOYW1lKS50ZXh0KE1hdGgucm91bmQodmFsdWUpK3VuaXRzKS5zaG93KCk7Cn0KCmZ1bmN0aW9uIHNldFBhZ2VTdGF0RmxvYXQobGFiZWxOYW1lLCB2YWx1ZU5hbWUsIGxlZ2VuZCwgdW5pdHMsIHZhbHVlLCBkcCkgewogICAgJCgnLicrbGFiZWxOYW1lKS50ZXh0KGxlZ2VuZCkuc2hvdygpOwogICAgJCgnLicrdmFsdWVOYW1lKS50ZXh0KE51bWJlcih2YWx1ZSkudG9GaXhlZChkcCkrdW5pdHMpLnNob3coKTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBub2RlIGNvdW50IGFuZCBhdmVyYWdlIGNwdSB1dGlsaXphdGlvbgoKZnVuY3Rpb24gdXBkYXRlUGFnZUFuYWx5dGljc0RhdGEoc3VtbWFyeURhdGEpIHsKICAgIHdpbmRvdy5wYWdlQW5hbHl0aWNzRGF0YSA9IHN1bW1hcnlEYXRhOwogICAgbGFzdFJvdyA9IHN1bW1hcnlEYXRhLnJvd3MubGVuZ3RoLTE7CiAgICBzZXRQYWdlU3RhdEludCgibm9kZXNMYWJlbCIsICJub2Rlc1ZhbHVlIiwgIk5vZGUgQ291bnQiLCAiIiwgc3VtbWFyeURhdGEucm93c1tsYXN0Um93XVsiY291bnRfaG9zdG5hbWUiXSk7CiAgICBzZXRQYWdlU3RhdEludCgiY3B1TGFiZWwiLCAiY3B1VmFsdWUiLCAiQXZnIExvYWQiLCAiJSIsIHN1bW1hcnlEYXRhLnJvd3NbbGFzdFJvd11bImF2Z19jcHUiXSk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZVBhZ2VBbmFseXRpY3MoKSB7CiAgICAkLmFqYXgoewogICAgdXJsIDogJy9hbmFseXRpY3MvYmlncXVlcnkvP2F2Zz0lY3B1JmNvdW50PSVob3N0bmFtZScgKyBnZXRPYmplY3RRdWVyeSgpLAogICAgZGF0YVR5cGUgOiAnanNvbicsCiAgICB0eXBlIDogJ0dFVCcsCiAgICBzdWNjZXNzOiBmdW5jdGlvbihuZXdEYXRhKQogICAgewogICAgICAgIHVwZGF0ZVBhZ2VBbmFseXRpY3NEYXRhKG5ld0RhdGEpOwogICAgfQp9KTsKICAgIHNldFRpbWVvdXQodXBkYXRlUGFnZUFuYWx5dGljcywgMzAwMDApOwp9CgpzZXRUaW1lb3V0KHVwZGF0ZVBhZ2VBbmFseXRpY3MsIDUwMDApOwoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBiYW5kd2lkdGgKCmZ1bmN0aW9uIHVwZGF0ZVBhZ2VCYW5kd2lkdGhEYXRhKHN1bW1hcnlEYXRhKSB7CiAgICB3aW5kb3cucGFnZUJhbmREYXRhID0gc3VtbWFyeURhdGE7CiAgICBsYXN0Um93ID0gc3VtbWFyeURhdGEucm93cy5sZW5ndGgtMTsKICAgIHNldFBhZ2VTdGF0RmxvYXQoImJhbmR3aWR0aExhYmVsIiwgImJhbmR3aWR0aFZhbHVlIiwgIkJhbmR3aWR0aCIsICJHYnBzIiwgc3VtbWFyeURhdGEucm93c1tsYXN0Um93XVsic3VtX2NvbXB1dGVkX2J5dGVzX3NlbnRfZGl2X2VsYXBzZWQiXSo4LjAvMTAyNC8xMDI0LzEwMjQsMik7Cn0KCmZ1bmN0aW9uIHVwZGF0ZVBhZ2VCYW5kd2lkdGgoKSB7CiAgICAkLmFqYXgoewogICAgdXJsIDogJy9hbmFseXRpY3MvYmlncXVlcnkvP2NvbXB1dGVkPSVieXRlc19zZW50LyVlbGFwc2VkJyArIGdldE9iamVjdFF1ZXJ5KCksCiAgICBkYXRhVHlwZSA6ICdqc29uJywKICAgIHR5cGUgOiAnR0VUJywKICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKG5ld0RhdGEpCiAgICB7CiAgICAgICAgdXBkYXRlUGFnZUJhbmR3aWR0aERhdGEobmV3RGF0YSk7CiAgICB9Cn0pOwogICAgc2V0VGltZW91dCh1cGRhdGVQYWdlQmFuZHdpZHRoLCAzMDAwMCk7Cn0KCnNldFRpbWVvdXQodXBkYXRlUGFnZUJhbmR3aWR0aCwgNTAwMCk7Cgo=