ZnVuY3Rpb24gZ2V0UGFnZUtpbmQoKSB7CiAgICB2YXIgcGFyZW50Tm9kZVR4dCA9ICQoJyNzZWxlY3RlZE1haW5OYXYnKS50ZXh0KCk7CiAgICBwYXJlbnROb2RlVHh0ID0gcGFyZW50Tm9kZVR4dC5yZXBsYWNlKCIvXG4iLCIiKTsKICAgIHBhcmVudE5vZGVUeHQgPSBwYXJlbnROb2RlVHh0LnJlcGxhY2UoIrsiLCIiKTsKICAgIHBhcmVudE5vZGVUeHQgPSBwYXJlbnROb2RlVHh0LnRyaW0oKTsKICAgIGlmIChwYXJlbnROb2RlVHh0Lmxlbmd0aCA+IDAgJiYgcGFyZW50Tm9kZVR4dC5jaGFyQXQocGFyZW50Tm9kZVR4dC5sZW5ndGgtMSk9PSdzJykgewogICAgICAgICAgICBwYXJlbnROb2RlVHh0ID0gcGFyZW50Tm9kZVR4dC5zdWJzdHJpbmcoMCwgcGFyZW50Tm9kZVR4dC5sZW5ndGgtMSk7CiAgICB9CiAgICByZXR1cm4gcGFyZW50Tm9kZVR4dDsKfQoKZnVuY3Rpb24gZ2V0T2JqZWN0UXVlcnkoKSB7CiAgICB2YXIgc2VsZWN0ZWROb2RlVHh0ID0gJCgnI2N1cnJlbnRPcmlnaW5hbE5vZGUnKS50ZXh0KCk7CiAgICBzZWxlY3RlZE5vZGVUeHQgPSBzZWxlY3RlZE5vZGVUeHQudHJpbSgpOwogICAgc2VsZWN0ZWROb2RlVHh0ID0gc2VsZWN0ZWROb2RlVHh0LnNwbGl0KCcgJykuam9pbignJyk7Ly9zZWxlY3RlZE5vZGVUeHQucmVwbGFjZSgiICIsICIiKQogICAgcGFyZW50Tm9kZVR4dCA9IGdldFBhZ2VLaW5kKCk7CgogICAgaWYgKHBhcmVudE5vZGVUeHQgPT0gIlNsaWNlIikgewogICAgICAgIHJldHVybiAiJnNsaWNlPSIgKyBzZWxlY3RlZE5vZGVUeHQ7CiAgICB9IGVsc2UgaWYgKHBhcmVudE5vZGVUeHQgPT0gIlNpdGUiKSB7CiAgICAgICAgcmV0dXJuICImc2l0ZT0iICsgc2VsZWN0ZWROb2RlVHh0OwogICAgfSBlbHNlIGlmIChwYXJlbnROb2RlVHh0ID09ICJOb2RlIikgewogICAgICAgIHJldHVybiAiJm5vZGU9IiArIHNlbGVjdGVkTm9kZVR4dDsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgfQp9CgoKZnVuY3Rpb24gc2V0UGFnZVN0YXRJbnQobGFiZWxOYW1lLCB2YWx1ZU5hbWUsIGxlZ2VuZCwgdW5pdHMsIHZhbHVlKSB7CiAgICAkKGxhYmVsTmFtZSkudGV4dChsZWdlbmQpLnNob3coKTsKICAgICQodmFsdWVOYW1lKS50ZXh0KE1hdGgucm91bmQodmFsdWUpK3VuaXRzKS5zaG93KCk7Cn0KCmZ1bmN0aW9uIHNldFBhZ2VTdGF0RmxvYXQobGFiZWxOYW1lLCB2YWx1ZU5hbWUsIGxlZ2VuZCwgdW5pdHMsIHZhbHVlLCBkcCkgewogICAgJChsYWJlbE5hbWUpLnRleHQobGVnZW5kKS5zaG93KCk7CiAgICAkKHZhbHVlTmFtZSkudGV4dChOdW1iZXIodmFsdWUpLnRvRml4ZWQoZHApK3VuaXRzKS5zaG93KCk7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gbm9kZSBjb3VudCBhbmQgYXZlcmFnZSBjcHUgdXRpbGl6YXRpb24KCmZ1bmN0aW9uIHVwZGF0ZVBhZ2VBbmFseXRpY3NEYXRhKHN1bW1hcnlEYXRhKSB7CiAgICB3aW5kb3cucGFnZUFuYWx5dGljc1VybCA9IHN1bW1hcnlEYXRhWyJkYXRhU291cmNlVXJsIl07CiAgICBsYXN0Um93ID0gc3VtbWFyeURhdGEucm93cy5sZW5ndGgtMTsKCiAgICBpZiAoc3VtbWFyeURhdGEubXNnKSB7CiAgICAgICAgJCgiI21pbmlkYXNoU3RhdHVzIikudGV4dChzdW1tYXJ5RGF0YS5tc2cpLnNob3coKTsKICAgIH0gZWxzZSB7CiAgICAgICAgJCgiI21pbmlkYXNoU3RhdHVzIikudGV4dCgiIikuaGlkZSgpOwogICAgfQoKICAgIGlmIChzdW1tYXJ5RGF0YS5yb3dzLmxlbmd0aCA8PSAwKSB7CiAgICAgICAgLy9jb25zb2xlLmxvZygibm8gZGF0YSByZWNlaXZlZCBmcm9tIHBhZ2UgYW5hbHl0aWNzIGFqYXgiKQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvL09sZCBtaW5pZGFzaGJvYXJkCiAgICAvL3NldFBhZ2VTdGF0SW50KCIubm9kZXNMYWJlbCIsICIubm9kZXNWYWx1ZSIsICJOb2RlIENvdW50IiwgIiIsIHN1bW1hcnlEYXRhLnJvd3NbbGFzdFJvd11bImNvdW50X2hvc3RuYW1lIl0pOwogICAgLy9zZXRQYWdlU3RhdEludCgiLmNwdUxhYmVsIiwgIi5jcHVWYWx1ZSIsICJBdmcgTG9hZCIsICIlIiwgc3VtbWFyeURhdGEucm93c1tsYXN0Um93XVsiYXZnX2NwdSJdKTsKCiAgICAvL05ldyBtaW5pRGFzaGJvYXJkCiAgICBzZXRQYWdlU3RhdEludCgiI21pbmlEYXNoTm9kZUNvdW50TGFiZWwiLCAiI21pbmlEYXNoTm9kZUNvdW50IiwgIk5vZGUgQ291bnQiLCAiIiwgc3VtbWFyeURhdGEucm93c1tsYXN0Um93XVsiY291bnRfaG9zdG5hbWUiXSk7CiAgICBzZXRQYWdlU3RhdEludCgiI21pbmlEYXNoQXZnTG9hZExhYmVsIiwgIiNtaW5pRGFzaEF2Z0xvYWQiLCAiQXZnIExvYWQiLCAiJSIsIHN1bW1hcnlEYXRhLnJvd3NbbGFzdFJvd11bImF2Z19jcHUiXSk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZVBhZ2VBbmFseXRpY3MoKSB7CiAgICB2YXIgdXJsPSAnL2FuYWx5dGljcy9iaWdxdWVyeS8/YXZnPSVjcHUmY291bnQ9JWhvc3RuYW1lJmNhY2hlZD1kZWZhdWx0JyArIGdldE9iamVjdFF1ZXJ5KCk7CiAgICAkLmFqYXgoewogICAgdXJsOiB1cmwsCiAgICBkYXRhVHlwZSA6ICdqc29uJywKICAgIHR5cGUgOiAnR0VUJywKICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKG5ld0RhdGEpIHsKICAgICAgICB1cGRhdGVQYWdlQW5hbHl0aWNzRGF0YShuZXdEYXRhKTsKICAgICAgICBzZXRUaW1lb3V0KHVwZGF0ZVBhZ2VBbmFseXRpY3MsIDMwMDAwKTsKICAgIH0sCiAgICBlcnJvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgY29uc29sZS5sb2coImVycm9yIHJldHJpZXZpbmcgc3RhdGlzdGljczsgcmV0cnkgaW4gNSBzZWNvbmRzIik7CiAgICAgICAgc2V0VGltZW91dCh1cGRhdGVQYWdlQmFuZHdpZHRoLCA1MDAwKTsKICAgIH0KfSk7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gYmFuZHdpZHRoCgpmdW5jdGlvbiB1cGRhdGVQYWdlQmFuZHdpZHRoRGF0YShzdW1tYXJ5RGF0YSkgewogICAgd2luZG93LnBhZ2VCYW5kd2lkdGhVcmwgPSBzdW1tYXJ5RGF0YVsiZGF0YVNvdXJjZVVybCJdOwogICAgbGFzdFJvdyA9IHN1bW1hcnlEYXRhLnJvd3MubGVuZ3RoLTE7CgogICAgaWYgKHN1bW1hcnlEYXRhLnJvd3MubGVuZ3RoIDw9IDApIHsKICAgICAgICAvL2NvbnNvbGUubG9nKCJubyBkYXRhIHJlY2VpdmVkIGZyb20gcGFnZSBiYW5kd2lkdGggYWpheCIpCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vT2xkIG1pbmlkYXNoYm9hcmQKICAgIC8vc2V0UGFnZVN0YXRGbG9hdCgiLmJhbmR3aWR0aExhYmVsIiwgIi5iYW5kd2lkdGhWYWx1ZSIsICJCYW5kd2lkdGgiLCAiIEdicHMiLCBzdW1tYXJ5RGF0YS5yb3dzW2xhc3RSb3ddWyJzdW1fY29tcHV0ZWRfYnl0ZXNfc2VudF9kaXZfZWxhcHNlZCJdKjguMC8xMDI0LzEwMjQvMTAyNCwyKTsKCiAgICAvL05ldyBtaW5pZGFzaGJvYXJkCiAgICBzZXRQYWdlU3RhdEZsb2F0KCIjbWluaURhc2hCYW5kd2lkdGhMYWJlbCIsICIjbWluaURhc2hCYW5kd2lkdGgiLCAiQmFuZHdpZHRoIiwgIiBHYnBzIiwgc3VtbWFyeURhdGEucm93c1tsYXN0Um93XVsic3VtX2NvbXB1dGVkX2J5dGVzX3NlbnRfZGl2X2VsYXBzZWQiXSo4LjAvMTAyNC8xMDI0LzEwMjQsMik7Cn0KCmZ1bmN0aW9uIHVwZGF0ZVBhZ2VCYW5kd2lkdGgoKSB7CiAgICB2YXIgdXJsPScvYW5hbHl0aWNzL2JpZ3F1ZXJ5Lz9jb21wdXRlZD0lYnl0ZXNfc2VudC8lZWxhcHNlZCZjYWNoZWQ9ZGVmYXVsdCcgKyBnZXRPYmplY3RRdWVyeSgpOwoKICAgIGlmIChnZXRQYWdlS2luZCgpIT0iU2xpY2UiKSB7CiAgICAgICAgdXJsID0gdXJsICsgIiZldmVudD1ub2RlX2hlYXJ0YmVhdCI7CiAgICB9CgogICAgJC5hamF4KHsKICAgIHVybCA6IHVybCwKICAgIGRhdGFUeXBlIDogJ2pzb24nLAogICAgdHlwZSA6ICdHRVQnLAogICAgc3VjY2VzczogZnVuY3Rpb24obmV3RGF0YSkgewogICAgICAgIHVwZGF0ZVBhZ2VCYW5kd2lkdGhEYXRhKG5ld0RhdGEpOwogICAgICAgIHNldFRpbWVvdXQodXBkYXRlUGFnZUJhbmR3aWR0aCwgMzAwMDApOwogICAgfSwKICAgIGVycm9yOiBmdW5jdGlvbigpIHsKICAgICAgICBjb25zb2xlLmxvZygiZXJyb3IgcmV0cmlldmluZyBzdGF0aXN0aWNzOyByZXRyeSBpbiA1IHNlY29uZHMiKQogICAgICAgIHNldFRpbWVvdXQodXBkYXRlUGFnZUJhbmR3aWR0aCwgNTAwMCk7CiAgICB9Cn0pOwp9CgokKCBkb2N1bWVudCApLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgdXBkYXRlUGFnZUFuYWx5dGljcygpOwogICAgdXBkYXRlUGFnZUJhbmR3aWR0aCgpOwp9KTsNCgo=