Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@百度网盘@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoi55m+5bqm572R55uYIiwiYXV0aG9yIjoiZHkyMDIwIiwidXJsIjoiaGlrZXI6Ly9lbXB0eSMjZnlwYWdlIiwidmVyc2lvbiI6MjAyNTA1MjkxOCwiY29sX3R5cGUiOiJtb3ZpZV8zIiwiY2xhc3NfbmFtZSI6IiIsInR5cGUiOiJ2aWRlbyIsImNsYXNzX3VybCI6IiIsImFyZWFfbmFtZSI6IiIsImFyZWFfdXJsIjoiIiwic29ydF9uYW1lIjoiIiwieWVhcl9uYW1lIjoiIiwic29ydF91cmwiOiIiLCJ5ZWFyX3VybCI6IiIsImZpbmRfcnVsZSI6ImpzOlxuLy9jbGVhckl0ZW0oJ2hpc3RvcnknKTtcbnZhciBkID0gW107XG4vL+WOn+eJiOS9nOiAhUpvZeS9rCzmlbTlkIhaSEFP5aSn5L2s54mI5pysXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xuICAgIGNsZWFyTXlWYXIoJ3BhdGhzJyk7XG59KSk7XG5cbmxldCBsYXN0VGltZSA9IGdldEl0ZW0oJ2dldFRpbWUnKTtcbmxldCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG5zZXRJdGVtKCdnZXRUaW1lJywgY3VycmVudFRpbWUgKyAnJyk7XG5pZiAobGFzdFRpbWUgPT0gJ3VuZGVmaW5lZCcgfHwgY3VycmVudFRpbWUgLSBsYXN0VGltZSA+PSA4NjQwMDAwMCkge1xuICAgIGxldCBwYXRoR2l0ZWUgPSAnaHR0cHM6Ly9naXRlZS5jb20vbWlzdHl3YXRlci9oaWtlcl9pbmZvL3Jhdy9tYXN0ZXIvJUU3JTk5JUJFJUU1JUJBJUE2JUU3JUJEJTkxJUU3JTlCJTk4Lmpzb24nO1xuICAgIGxldCBodG1sR2l0ZWUgPSBmZXRjaFBDKHBhdGhHaXRlZSk7XG4gICAgbGV0IHZlcnNpb24gPSBodG1sR2l0ZWUubWF0Y2goL3ZlcnNpb25cIjooXFxkKykvKVsxXTtcbiAgICBpZiAoTVlfUlVMRS52ZXJzaW9uIDwgdmVyc2lvbikge1xuICAgICAgICBjb25maXJtKHtcbiAgICAgICAgICAgIHRpdGxlOiBcIuacieaWsOeJiOacrFwiLFxuICAgICAgICAgICAgY29udGVudDogJ+WvvOWFpeaWsOeJiOacrOWQlz8nLFxuICAgICAgICAgICAgY29uZmlybSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJydWxlOi8vNXJXMzZaaVU2S2VHNTVXTTZhYVc2YUcxNmFLUjZZR1Q2S2VFNVlpWjQ0Q1E1NW0rNWJxbTU3MlI1NXVZNDRDUjc3K2xhRzl0WlY5eWRXeGxYM1Z5Yk8rL3BXaDBkSEJ6T2k4dloybDBaV1V1WTI5dEwyMXBjM1I1ZDJGMFpYSXZhR2xyWlhKZmFXNW1ieTl5WVhjdmJXRnpkR1Z5TCtlWnZ1VzZwdWU5a2VlYm1DNXFjMjl1XCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FuY2VsKCkge31cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5pZiAoZ2V0SXRlbShcImZpcnN0XCIpICE9IE1ZX1JVTEUudmVyc2lvbikge1xuICAgICQucmVxdWlyZShcIuivtOaYjlwiKTtcbn0gZWxzZSB7XG4gICAgcmMoZmV0Y2hQQygnaHR0cHM6Ly9naXRlZS5jb20vbWlzdHl3YXRlci9oaWtlcl9pbmZvL3Jhdy9tYXN0ZXIvZ2l0aHVicHJveHkuanNvbicpICsgJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9taXN0eXdhdGVyL2hpa2VyL21haW4vZicsIDI0KTtcblxuICAgIGlmIChNWV9QQUdFID09IDEpIHtcbiAgICAgICAgZC5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiAn8J+UjScsXG4gICAgICAgICAgICB1cmw6ICQudG9TdHJpbmcoKHIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJWYXIoJ3BhdGhzJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJWYXIoJ3BhdGhzJyk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVmFyKCdrZXl3b3JkJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKCdrZXl3b3JkJywgaW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXCJoaWtlcjovL3BhZ2UvbGlzdHNcIikuc3RvcmVIaXN0b3J5U2VhcmNoKGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcImhpa2VyOi8vcGFnZS9saXN0c1wiKS5jb2RlUGFyc2VTZWFyY2hVcmwoaW5wdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSc7XG4gICAgICAgICAgICB9LCBNWV9SVUxFLnRpdGxlKSxcbiAgICAgICAgICAgIGRlc2M6ICflhbPplK7or418QOWFs+mUruivjXzliIbkuqvpk77mjqV856m65qC8Oua4hemZpCcsXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcbiAgICAgICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ2tleXdvcmQnLCAnJyksXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6ICforr7nva4nLFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2xvZ2luJyxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXG4gICAgICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgICAgIGlkOiAn6K6+572uJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGdldEl0ZW0oXCJhY2Nlc3NfdG9rZW5cIikgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZC5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiAndG9rZW7kuI3lrZjlnKgs6ZyA6KaBdG9rZW7nmbvlvZUnLFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2xvZ2luJyxcbiAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZ2V0SXRlbShcIkJEVVNTXCIpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGQucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogJ2Nvb2tpZeS4jeWtmOWcqCzpnIDopoHnvZHpobXnmbvlvZUnLFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2xvZ2luJyxcbiAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZ2V0SXRlbShcImFjY2Vzc190b2tlblwiKSAhPSAndW5kZWZpbmVkJyAmJiBnZXRJdGVtKFwiQkRVU1NcIikgIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgJC5yZXF1aXJlKFwiaGlrZXI6Ly9wYWdlL2xpc3RzXCIpLmNvZGVMaXN0KCk7XG4gICAgfVxufVxuc2V0UmVzdWx0KGQpOyIsInNlYXJjaF91cmwiOiJoaWtlcjovL2VtcHR5IyNmeXBhZ2UjIyoqIiwiZ3JvdXAiOiLikaA9PeiHqueUqCIsInNlYXJjaEZpbmQiOiJqczovL2h0dHBzOi8vd3d3LnR2c28udWsvXG5ldmFsKEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vcGFnZS9zZWFyY2g/cnVsZT3nmb7luqbnvZHnm5gnKSkucnVsZSk7XG5zZXRSZXN1bHQoZCk7IiwiZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsImRldGFpbF9maW5kX3J1bGUiOiIiLCJzZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsInNkZXRhaWxfZmluZF9ydWxlIjoiIiwidWEiOiJtb2JpbGUiLCJwcmVSdWxlIjoiLyo8JD5cbkBpbmNsdWRlIHN0YXJ0XG5odHRwczovL2dpdGVlLmNvbS9taXN0eXdhdGVyL2hpa2VyX2luZm8vcmF3L21hc3Rlci9nbG9iYWxWYXIuanNvblxuQGluY2x1ZGUgZW5kXG48JD4qLyIsInBhZ2VzIjoiW3tcImNvbF90eXBlXCI6XCJ0ZXh0XzJcIixcIm5hbWVcIjpcIuiuvue9rlwiLFwicGF0aFwiOlwibG9naW5cIixcInJ1bGVcIjpcImpzOlxcbnJjKGZldGNoUEMoJ2h0dHBzOi8vZ2l0ZWUuY29tL21pc3R5d2F0ZXIvaGlrZXJfaW5mby9yYXcvbWFzdGVyL2dpdGh1YnByb3h5Lmpzb24nKSArICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbWlzdHl3YXRlci9oaWtlci9tYWluL2YnLCAyNCk7XFxudmFyIGQgPSBbXTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogc2IoXFxcInRva2Vu55m75b2V5ZKM572R6aG155m75b2V6YO96ZyA6KaB55m75b2VXFxcIiwgJ0ZGMDAwMCcpLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogIWdldEl0ZW0oXFxcImFjY2Vzc190b2tlblxcXCIsICcnKSA/IHN0cm9uZyhcXFwi5YWI6I635Y+WdG9rZW5cXFwiLCAnRkYwMDAwJykgOiBjb2xvcign5beydG9rZW7nmbvlvZUnLCAnMDBGRjAwJyksXFxuICAgIHVybDogXFxcImh0dHBzOi8vb3BlbmFwaS5iYWlkdS5jb20vb2F1dGgvMi4wL2F1dGhvcml6ZT9yZXNwb25zZV90eXBlPWNvZGUmY2xpZW50X2lkPWlZQ2VDOWcwOGg1dnVQOVVxdlBIS0tTVnJLRlhHYTF2JnJlZGlyZWN0X3VyaT1odHRwczovL2FsaXN0Lm5uLmNpL3Rvb2wvYmFpZHUvY2FsbGJhY2smc2NvcGU9YmFzaWMsbmV0ZGlzayZxcmNvZGU9MVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogIWdldEl0ZW0oXFxcIkJEVVNTXFxcIiwgJycpID8gY29sb3IoXFxcIuacque9kemhteeZu+W9lVxcXCIsICdGRjAwMDAnKSA6IGNvbG9yKCflt7LnvZHpobXnmbvlvZUnLCAnMDBGRjAwJyksXFxuICAgIHVybDogJChcXFwiaGlrZXI6Ly9lbXB0eVxcXCIpLnJ1bGUoKCkgPT4ge1xcbiAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFwi55m75b2V6LSm5Y+3XFxcIik7XFxuICAgICAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcImNvb2tpZVxcXCIpKTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJznoa7orqTnmbvlvZXigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHZhciBiZHdwX2Nvb2tpZSA9IHJlcXVlc3QoXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvYmR3cF9jb29raWUudHh0XFxcIikgfHwgXFxcIlxcXCI7IC8vbG9nKGJkd3BfY29va2llKVxcbiAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0ge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiQW5kcm9pZFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3Bhbi5iYWlkdS5jb20vXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJDb29raWVcXFwiOiBiZHdwX2Nvb2tpZSxcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IHJlcXVlc3QoXFxcImh0dHBzOi8vd2FwcGFzcy5iYWlkdS5jb20vdjMvbG9naW4vYXBpL2F1dGg/bm90anVtcD0xJnJldHVybl90eXBlPTUmdHBsPW5ldGRpc2smdT1odHRwczovL3Bhbi5iYWlkdS5jb20vYnV5L2FkL2hvbWU/dXNlQ2FudmFzPTEmcGF0aG5hbWU9L3NoYXJlX3dhcFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXFxcIkdFVFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICBvbmx5SGVhZGVyczogdHJ1ZVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IEpTT04ucGFyc2UoaHRtbCkuaGVhZGVycy5sb2NhdGlvblswXTsgLy9sb2codXJsKVxcbiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IHJlcXVlc3QodXJsLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXIsXFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFxcXCJHRVRcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Q6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICAgICAgb25seUhlYWRlcnM6IHRydWVcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHZhciBzZXRjb29raWUgPSBKU09OLnBhcnNlKGh0bWwpLmhlYWRlcnNbXFxcInNldC1jb29raWVcXFwiXS50b1N0cmluZygpOyAvL2xvZyhzZXRjb29raWUpXFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImNvb2tpZVRtcFxcXCIsIHNldGNvb2tpZSk7XFxuICAgICAgICAgICAgICAgIGlmIChiZHdwX2Nvb2tpZS5pbmNsdWRlcyhcXFwiQkRVU1M9XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChiZHdwX2Nvb2tpZS5pbmNsdWRlcyhcXFwiQkRVU1M9XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgQkRVU1MgPSBiZHdwX2Nvb2tpZS5tYXRjaCgvKEJEVVNTPS4qPyk7LylbMV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKEJEVVNTKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcIkJEVVNTXFxcIiwgQkRVU1MpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2coXFxcIkJEVVNT6K6+572u5oiQ5YqfXFxcIilcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXRjb29raWUuaW5jbHVkZXMoXFxcIlNUT0tFTj1cXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBTVE9LRU4gPSBzZXRjb29raWUubWF0Y2goL1NUT0tFTj1cXFxcdyovKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coU1RPS0VOKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcIlNUT0tFTlxcXCIsIFNUT0tFTilcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2xvZyhcXFwiU1RPS0VO6K6+572u5oiQ5YqfXFxcIilcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLnmbvlvZXmiJDlip9cXFwiKVxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGRlc2M6IFxcXCLigJzigJzigJ3igJ08c21hbGw+54K55Ye75aS05YOP5Y+v5Lul6YCA5Ye66LSm5Y+36YeN5paw55m75b2VPC9zbWFsbD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCB1cmwgPSAnaHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9wYXNzcG9ydD9sb2dpbiZhdXRoc2l0ZT0xJnRwbD1uZXRkaXNrJm92ZXJzZWFzPTEmcmVnZG9tZXN0aWM9MSZzbXNMb2dpbkxpbms9MSZkaXNwbGF5PW1vYmlsZSZ1PWh0dHBzOi8vcGFuLmJhaWR1LmNvbS93YXAvaG9tZT9sb2dpbmZvcm09cGFzcyZyZWFsTmFtZT0xJndhcEJlaGF2aW9yTG9nPXdhcF9jbGlja193ZWxjb21lX2xvZ2luJmJyYW5jaFR5cGU9U01TbG9naW4jL29uZV9rZXlfaDVfbmV3J1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ3g1X3dlYnZpZXdfc2luZ2xlJyxcXG4gICAgICAgICAgICB1cmw6IHVybCxcXG4gICAgICAgICAgICBkZXNjOiAnbGlzdCYmc2NyZWVuLTE1MCcsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgdWE6ICdBbmRyb2lkJyxcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHVybCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2soKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvID0gZmJhLmdldENvb2tpZSh1cmwpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coY28pXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvLmluY2x1ZGVzKCdTVE9LRU49JykpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLnBhcnNlTGF6eVJ1bGUoJCQkKCkubGF6eVJ1bGUoKGNvKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvY2FjaGUvYmR3cF9jb29raWUudHh0JywgY28pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoJ0Nvb2tpZeiOt+WPluaIkOWKn++8jOivt+ehruiupOeZu+W9lScpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChjaGVjaywgNTAwKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBjaGVjaygpO1xcbiAgICAgICAgICAgICAgICB9LCB1cmwpXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgc2V0UmVzdWx0KGQpXFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMicsXFxufSk7XFxuLy9jbGVhckl0ZW0oXFxcImFjY2Vzc190b2tlblxcXCIpXFxuLy9jbGVhckl0ZW0oXFxcInJlZnJlc2hfdG9rZW5cXFwiKVxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAhZ2V0SXRlbShcXFwiYWNjZXNzX3Rva2VuXFxcIiwgJycpID8gY29sb3IoXFxcIuacqnRva2Vu55m75b2VXFxcIiwgJ0ZGMDAwMCcpIDogY29sb3IoJ+W3snRva2Vu55m75b2VJywgJzAwRkYwMCcpLFxcbiAgICB1cmw6ICQoZ2V0SXRlbSgncmVmcmVzaF90b2tlbicpLCBcXFwi5aGr5YaZ6I635Y+W5Yiw55qEdG9rZW5cXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICBzZXRJdGVtKCdyZWZyZXNoX3Rva2VuJywgaW5wdXQpO1xcbiAgICAgICAgbGV0IHJlcyA9IEpTT04ucGFyc2UocmVxdWVzdChidWlsZFVybChcXFwiaHR0cHM6Ly9vcGVuYXBpLmJhaWR1LmNvbS9vYXV0aC8yLjAvdG9rZW5cXFwiLCB7XFxuICAgICAgICAgICAgXFxcImdyYW50X3R5cGVcXFwiOiBcXFwicmVmcmVzaF90b2tlblxcXCIsXFxuICAgICAgICAgICAgXFxcInJlZnJlc2hfdG9rZW5cXFwiOiBpbnB1dCxcXG4gICAgICAgICAgICBcXFwiY2xpZW50X2lkXFxcIjogXFxcImlZQ2VDOWcwOGg1dnVQOVVxdlBIS0tTVnJLRlhHYTF2XFxcIixcXG4gICAgICAgICAgICBcXFwiY2xpZW50X3NlY3JldFxcXCI6IFxcXCJqWGlGTU9QVlBDV2xPMk01Q3dXUXpmZnBOUGFHVFJCR1xcXCJcXG4gICAgICAgIH0pKSk7XFxuICAgICAgICBpZiAoIXJlcy5hY2Nlc3NfdG9rZW4pIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6ZSZ6K+v77yB77yB77yBXFxcIlxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJhY2Nlc3NfdG9rZW5cXFwiLCByZXMuYWNjZXNzX3Rva2VuKVxcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInJlZnJlc2hfdG9rZW5cXFwiLCByZXMucmVmcmVzaF90b2tlbilcXG4gICAgICAgICAgICAvL2JhY2soKTtcXG4gICAgICAgIH1cXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIkNvb2tpZeeZu+W9lVxcXCIsXFxuICAgIHVybDogJChnZXRJdGVtKFxcXCJCRFVTU1xcXCIpKyc7JytnZXRJdGVtKFxcXCJTVE9LRU5cXFwiKSwgXFxcIuWhq+WGmUNvb2tpZVxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgIGlmICghaW5wdXQuaW5jbHVkZXMoXFxcIkFBQUFcXFwiKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9Db29raWXplJnor69cXFwiXFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlmIChpbnB1dC5pbmNsdWRlcyhcXFwiQkRVU1M9XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgdmFyIEJEVVNTID0gaW5wdXQubWF0Y2goLyhCRFVTUz0uKj8pOy8pWzFdO1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJCRFVTU1xcXCIsIEJEVVNTKVxcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwiQkRVU1Porr7nva7miJDlip9cXFwiKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoaW5wdXQuaW5jbHVkZXMoXFxcIlNUT0tFTj1cXFwiKSkge1xcbiAgICAgICAgICAgICAgICB2YXIgU1RPS0VOID0gaW5wdXQubWF0Y2goL1NUT0tFTj1cXFxcdyovKVswXTtcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFwiU1RPS0VOXFxcIiwgU1RPS0VOKVxcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwiU1RPS0VO6K6+572u5oiQ5YqfXFxcIilcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgfVxcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5riF6ZmkdG9rZW5cXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgcmV0dXJuICQoJ+ehruiupOa4hemZpOWQlz8nKS5jb25maXJtKCgpID0+IHtcXG4gICAgICAgICAgICBjbGVhckl0ZW0oXFxcImFjY2Vzc190b2tlblxcXCIpO1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLlt7LmuIXpmaR0b2tlblxcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSc7XFxuICAgICAgICB9KTtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIua4hemZpGNvb2tpZVxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICByZXR1cm4gJCgn56Gu6K6k5riF6Zmk5ZCXPycpLmNvbmZpcm0oKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcImNvb2tpZVRtcFxcXCIsIGdldEl0ZW0oXFxcIkJEVVNTXFxcIikgKyAnOycgKyBnZXRJdGVtKFxcXCJTVE9LRU5cXFwiKSk7XFxuICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJCRFVTU1xcXCIpO1xcbiAgICAgICAgICAgIGNsZWFySXRlbShcXFwiU1RPS0VOXFxcIik7XFxuICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJQVE9LRU5cXFwiKTtcXG4gICAgICAgICAgICB0b2FzdChcXFwi5bey5riF6ZmkY29va2llXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5JztcXG4gICAgICAgIH0pO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YCJ5oup5o6l5Y+j77yaXFxcIiArIChnZXRJdGVtKFxcXCJqa1xcXCIsIFxcXCIwXFxcIikgPT0gXFxcIjBcXFwiID8gXFxcIuWumOaWueaOpeWPo++8muS4jeaYr3ZpcOS8mumZkOmAn++8jOeos+WumlxcXCIgOiBcXFwi55m+5bqm572R55uYVFbmjqXlj6NcXFwiKSxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgc2V0SXRlbShcXFwiamtcXFwiLCBnZXRJdGVtKFxcXCJqa1xcXCIsIFxcXCIwXFxcIikgPT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKVxcbiAgICAgICAgcmVmcmVzaFBhZ2UoKVxcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbn0pO1xcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuS7o+eggVwiLFwicGF0aFwiOlwiY29kZVwiLFwicnVsZVwiOlwiJC5leHBvcnRzLmdldEljb24gPSBmdW5jdGlvbihjb250ZW50KSB7XFxuICAgIGxldCB7XFxuICAgICAgICBnZXRIem1cXG4gICAgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2NvZGUnKVxcbiAgICBsZXQgcm9vdCA9ICdodHRwczovL2dpdGVlLmNvbS9taXN0eXdhdGVyL2hpa2VyX2luZm8vcmF3L21hc3Rlci9pY29uU3lzdGVtLyc7XFxuICAgIGlmIChjb250ZW50LmlzZGlyID09IDEpIHtcXG4gICAgICAgIGltZyA9ICdodHRwczovL3N0YXRpY3Nucy5jZG4uYmNlYm9zLmNvbS9hbWlzLzIwMjQtOC8xNzIyNTkyNDAyOTYwLyVFNiU5NiU4NyVFNCVCQiVCNiVFNSVBNCVCOSUyMCgyKS5wbmcnO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgbGV0IGZpbGVzID0gJzNncHxhaXxhcGV8YXBrfGF2aXxhdmlmfGJhdHxjaG18Y3NzfGRtZ3xkb2N8ZXB1YnxleGN8ZXhlfGY0dnxmbGFjfGZsdnxnaWZ8aGlrZXJ8aHRtfGh0bWx8aWNvfGlmZnxpbGJtfGlzb3xqZmlmfGpwZXxqcGVnfGpwZ3xqc3xqc29ufGp4cnxrdXh8bG9nfG0zdTh8bTRhfG00dnxta3Z8bW5nfG1vdnxtcDN8bXA0fG1wZWd8bXBnfG9nZ3xvcHVzfG90ZnxwY3h8cGRmfHBocHxwanB8cGpwZWd8cG1wfHBuZ3xwcG18cHB0fHBzZHxwc3B8cXN2fHJhbXxyYXJ8cmVnfHJtfHJtdmJ8c2FpfHN2Z3xzdmd6fHN3Znx0YWJsZXx0aWZ8dGlmZnx0c3x0dGZ8dHh0fHVmb3x3YXZ8d2VibXx3ZWJwfHdtdnx4Ym18eGNmfHhsc3x4bHN4fHhwbXx6aXAnLnNwbGl0KCd8Jyk7XFxuICAgICAgICBsZXQgZmlsZU5hbWUgPSBjb250ZW50LnNlcnZlcl9maWxlbmFtZTtcXG4gICAgICAgIGxldCBoem0gPSBnZXRIem0oZmlsZU5hbWUpO1xcbiAgICAgICAgaWYgKGZpbGVzLmluY2x1ZGVzKGh6bSkpIHtcXG4gICAgICAgICAgICBpbWcgPSByb290ICsgaHptICsgJy5wbmcnO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBpbWcgPSByb290ICsgJ+aWh+S7ti5wbmcnXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgcmV0dXJuIGltZ1xcbn1cXG4kLmV4cG9ydHMuZ2V0SHptID0gZnVuY3Rpb24oZmlsZU5hbWUpIHtcXG4gICAgdmFyIGV4dCA9IChmaWxlTmFtZS5zdWJzdHIoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpKS50b0xvd2VyQ2FzZSgpO1xcbiAgICBpZiAoL15yXFxcXGQrfF43ei9pLnRlc3QoZXh0KSkge1xcbiAgICAgICAgZXh0ID0gJ3Jhcic7XFxuICAgIH0gZWxzZSBpZiAoL15tZC9pLnRlc3QoZXh0KSkge1xcbiAgICAgICAgZXh0ID0gJ2lzbyc7XFxuICAgIH0gZWxzZSBpZiAoL15tZC9pLnRlc3QoZXh0KSkge1xcbiAgICAgICAgZXh0ID0gJ2lzbyc7XFxuICAgIH0gZWxzZSBpZiAoL15odHxtaHQvaS50ZXN0KGV4dCkpIHtcXG4gICAgICAgIGV4dCA9ICdodG1sJztcXG4gICAgfSBlbHNlIGlmICgvXnhsfF5ldC9pLnRlc3QoZXh0KSkge1xcbiAgICAgICAgZXh0ID0gJ3hsc3gnO1xcbiAgICB9IGVsc2UgaWYgKC9ebG9nfF5scmMvaS50ZXN0KGV4dCkpIHtcXG4gICAgICAgIGV4dCA9ICd0eHQnO1xcbiAgICB9IGVsc2UgaWYgKC9eKDNncHxhdml8ZjR2fGZsdnxrdXh8bTN1OHxtNHZ8bWt2fG1vdnxtcDR8bXBlZ3xtcGd8cG1wfHFzdnxyYW18cm18cm12Ynxzd2Z8dHN8d2VibXx3bXYpL2kudGVzdChleHQpKSB7XFxuICAgICAgICBleHQgPSAnbWt2JztcXG4gICAgfVxcbiAgICByZXR1cm4gZXh0O1xcbn1cXG4kLmV4cG9ydHMuZ2V0TGluayA9IGZ1bmN0aW9uKGV4dCwgaWQsIHBhdGgsIGltZykge1xcbiAgICByZXR1cm4gJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoZXh0LCBpZCwgcGF0aCwgaW1nKSA9PiB7XFxuICAgICAgICBsZXQgaGlzdG9yeSA9IHN0b3JhZ2UwLmdldEl0ZW0oJ2hpc3RvcnknLCBbXSk7XFxuICAgICAgICBsZXQgZGF0YVBhdGggPSBgJHtwYXRofUBAJHtpZH1AQCR7ZXh0fUBAJHtpbWd9YDtcXG4gICAgICAgIGlmICghaGlzdG9yeS5pbmNsdWRlcyhkYXRhUGF0aCkpIHtcXG4gICAgICAgICAgICBoaXN0b3J5LnB1c2goZGF0YVBhdGgpO1xcbiAgICAgICAgfVxcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbSgnaGlzdG9yeScsIGhpc3RvcnkpO1xcbiAgICAgICAgaWYgKC9zaGFyZS8udGVzdChKU09OLnN0cmluZ2lmeShwYXRoKSkgJiYgZXh0ID09ICdtb3ZpZScpIHtcXG4gICAgICAgICAgICB2YXIgdXJsID0gZ2V0VmFyKCd1cmxCYWlkdScpIHx8IGdldFZhcigna2V5d29yZCcpO1xcbiAgICAgICAgICAgIGlmICh1cmwgJiYgL1xcXFwvKHN8c2hhcmUpXFxcXC8vLnRlc3QodXJsKSkge1xcbiAgICAgICAgICAgICAgICB2YXIgc3VybCA9IC9zaGFyZS8udGVzdCh1cmwpID8gJzEnICsgdXJsLnNwbGl0KC8mfD0vKVsxXSA6IHVybC5zcGxpdCgvXFxcXC98XFxcXD8vKVs0XTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBpZiAoL3JlYWx1cmw9Ly50ZXN0KE1ZX1VSTCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIE1ZX1VSTCA9IE1ZX1VSTC5zcGxpdCgncmVhbHVybD0nKVsxXTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB2YXIgc3VybCA9IC9zaGFyZS8udGVzdChNWV9VUkwpID8gJzEnICsgTVlfVVJMLnNwbGl0KC8mfD0vKVsxXSA6IE1ZX1VSTC5zcGxpdCgvXFxcXC98XFxcXD8vKVs0XTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgdmFyIHVrID0gZ2V0VmFyKCdzaGFyZV91aycpO1xcbiAgICAgICAgICAgIHZhciBzaGFyZWlkID0gZ2V0VmFyKCdzaGFyZV9pZCcpO1xcbiAgICAgICAgICAgIHZhciBmc19pZCA9IGlkO1xcbiAgICAgICAgICAgIHZhciBqc1Rva2VuID0gZ2V0VmFyKCdqc1Rva2VuJyk7XFxuXFxuXFxuICAgICAgICAgICAgdmFyIGhlYWRlciA9IHtcXG4gICAgICAgICAgICAgICAgJ0Nvb2tpZSc6IGdldFZhcignY2snKSxcXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEyNi4wLjAuMCBTYWZhcmkvNTM3LjM2J1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB2YXIgdXJsMzEgPSAnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3NoYXJlL3RwbGNvbmZpZz9zdXJsPScgKyBzdXJsICsgJyZmaWVsZHM9Y2Zyb21faWQsRXNwYWNlX2luZm8sY2FyZF9pbmZvLHNpZ24sdGltZXN0YW1wJ1xcbiAgICAgICAgICAgIHZhciBodG1sMzEgPSByZXF1ZXN0KHVybDMxLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcixcXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJ1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHZhciBodG1sMzIgPSBKU09OLnBhcnNlKGh0bWwzMSkuZGF0YTtcXG4gICAgICAgICAgICB2YXIgdGltZXN0YW1wID0gaHRtbDMyLnRpbWVzdGFtcDtcXG4gICAgICAgICAgICB2YXIgc2lnbiA9IGh0bWwzMi5zaWduO1xcbiAgICAgICAgICAgIHZhciBwbGF5NDgwID0gJ2h0dHBzOi8vcGFuLmJhaWR1LmNvbS9zaGFyZS9zdHJlYW1pbmc/dWs9JyArIHVrICsgJyZmaWQ9JyArIGZzX2lkICsgJyZzaWduPScgKyBzaWduICsgJyZ0aW1lc3RhbXA9JyArIHRpbWVzdGFtcCArICcmc2hhcmVpZD0nICsgc2hhcmVpZCArICcmdHlwZT1NM1U4X0FVVE9fNDgwJmpzVG9rZW49JyArIGpzVG9rZW47XFxuICAgICAgICAgICAgdmFyIHBsYXk3MjAgPSAnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3NoYXJlL3N0cmVhbWluZz91az0nICsgdWsgKyAnJmZpZD0nICsgZnNfaWQgKyAnJnNpZ249JyArIHNpZ24gKyAnJnRpbWVzdGFtcD0nICsgdGltZXN0YW1wICsgJyZzaGFyZWlkPScgKyBzaGFyZWlkICsgJyZ0eXBlPU0zVThfQVVUT183MjAmanNUb2tlbj0nICsganNUb2tlbjtcXG4gICAgICAgICAgICB2YXIgcGxheTEwODAgPSAnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3NoYXJlL3N0cmVhbWluZz91az0nICsgdWsgKyAnJmZpZD0nICsgZnNfaWQgKyAnJnNpZ249JyArIHNpZ24gKyAnJnRpbWVzdGFtcD0nICsgdGltZXN0YW1wICsgJyZzaGFyZWlkPScgKyBzaGFyZWlkICsgJyZ0eXBlPU0zVThfQVVUT18xMDgwJmpzVG9rZW49JyArIGpzVG9rZW47XFxuICAgICAgICAgICAgdmFyIHBsYXkySyA9ICdodHRwczovL3Bhbi5iYWlkdS5jb20vc2hhcmUvc3RyZWFtaW5nP3VrPScgKyB1ayArICcmZmlkPScgKyBmc19pZCArICcmc2lnbj0nICsgc2lnbiArICcmdGltZXN0YW1wPScgKyB0aW1lc3RhbXAgKyAnJnNoYXJlaWQ9JyArIHNoYXJlaWQgKyAnJnR5cGU9TTNVOF9BVVRPXzJLJmpzVG9rZW49JyArIGpzVG9rZW47XFxuICAgICAgICAgICAgdmFyIHBsYXk0SyA9ICdodHRwczovL3Bhbi5iYWlkdS5jb20vc2hhcmUvc3RyZWFtaW5nP3VrPScgKyB1ayArICcmZmlkPScgKyBmc19pZCArICcmc2lnbj0nICsgc2lnbiArICcmdGltZXN0YW1wPScgKyB0aW1lc3RhbXAgKyAnJnNoYXJlaWQ9JyArIHNoYXJlaWQgKyAnJnR5cGU9TTNVOF9BVVRPXzRLJmpzVG9rZW49JyArIGpzVG9rZW47XFxuXFxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgdXJsczogW3BsYXkxMDgwLCBwbGF5NEssIHBsYXkySywgcGxheTcyMCwgcGxheTQ4MCArICcjaXNWaWRlbz10cnVlIyddLFxcbiAgICAgICAgICAgICAgICBuYW1lczogWycxMDgwUCcsICc0SycsICcySycsICc3MjBQJywgJzQ4MFAnXSxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczogW2hlYWRlciwgaGVhZGVyLCBoZWFkZXIsIGhlYWRlciwgaGVhZGVyXVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9IGVsc2UgaWYgKC9zaGFyZS8udGVzdChKU09OLnN0cmluZ2lmeShwYXRoKSkpIHtcXG5cXG4gICAgICAgIH0gZWxzZSBpZiAoIS9zaGFyZS8udGVzdChKU09OLnN0cmluZ2lmeShwYXRoKSkgfHwgZXh0ICE9ICdpbWcnKSB7XFxuICAgICAgICAgICAgLy9jbGVhckl0ZW0oJ2prJyk7XFxuICAgICAgICAgICAgaWYgKGdldEl0ZW0oJ2prJywgJzAnKSA9PSAnMScgJiYgZXh0ID09ICdtb3ZpZScpIHtcXG4gICAgICAgICAgICAgICAgLy/mkq3mlL7mjqXlj6PmnaXoh6rnmb7luqbnvZHnm5hUVlxcbiAgICAgICAgICAgICAgICB2YXIgYmR0dm0gPSByZXF1ZXN0KCdodHRwczovL3Bhbi5iYWlkdS5jb20vYXBpL21lZGlhaW5mbz90eXBlPU0zVThfRkxWXzI2NF80ODAmcGF0aD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpICsgJyZjbGllbnR0eXBlPTgwJm9yaWdpbj1kbG5hJywge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICdDb29raWUnOiBnZXRJdGVtKFxcXCJCRFVTU1xcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ25ldGRpc2s7MS40LjI7MjIwMjEyMTFSQzthbmRyb2lkLWFuZHJvaWQ7MTI7SlNicmlkZ2U0LjQuMDtqb2ludEJyaWRnZTsxLjEuMDsnXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJ1xcbiAgICAgICAgICAgICAgICB9KTsgLy9sb2coYmR0dm0pXFxuICAgICAgICAgICAgICAgIHZhciByZXN0dm0gPSBKU09OLnBhcnNlKGJkdHZtKS5pbmZvLmRsaW5rOyAvL2xvZyhyZXN0dm0pO1xcbiAgICAgICAgICAgICAgICBsZXQgdXJsMiA9IHJlcXVlc3QocmVzdHZtLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwibmV0ZGlzazsxLjQuMjsyMjAyMTIxMVJDO2FuZHJvaWQtYW5kcm9pZDsxMjtKU2JyaWRnZTQuNC4wO2pvaW50QnJpZGdlOzEuMS4wO1xcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlJhbmdlXFxcIjogXFxcImJ5dGVzPTAtMFxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxcbiAgICAgICAgICAgICAgICAgICAgb25seUhlYWRlcnM6IHRydWVcXG4gICAgICAgICAgICAgICAgfSk7IC8vbG9nKHVybDIpXFxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBKU09OLnBhcnNlKHVybDIpLnVybFxcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHN0YXJ0UHJveHlTZXJ2ZXIoJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYmFzZTY0RGVjb2RlKE1ZX1BBUkFNUy51cmwpO1xcbiAgICAgICAgICAgICAgICAgICAgLy9sb2coXFxcIuaIkeWcqOS7o+eQhlxcXCIgKyB1cmwpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAzMDIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiTG9jYXRpb25cXFwiOiB1cmxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgdXJsczogW3UgKyBcXFwiP3VybD1cXFwiICsgYmFzZTY0RW5jb2RlKHVybCkgKyBcXFwiI2lzVmlkZW89dHJ1ZSMjZmFzdFBsYXlNb2RlIyN0aHJlYWRzPTEwI1xcXCJdLFxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFxcXCJuZXRkaXNrOzEuNC4yOzIyMDIxMjExUkM7YW5kcm9pZC1hbmRyb2lkOzEyO0pTYnJpZGdlNC40LjA7am9pbnRCcmlkZ2U7MS4xLjA7XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IGJ1aWxkVXJsKCdodHRwczovL3Bhbi5iYWlkdS5jb20vcmVzdC8yLjAveHBhbi9tdWx0aW1lZGlhJywge1xcbiAgICAgICAgICAgICAgICAgICAgJ2FjY2Vzc190b2tlbic6IGdldEl0ZW0oJ2FjY2Vzc190b2tlbicpLFxcbiAgICAgICAgICAgICAgICAgICAgJ21ldGhvZCc6ICdmaWxlbWV0YXMnLFxcbiAgICAgICAgICAgICAgICAgICAgJ2ZzaWRzJzogYFske2lkfV1gLFxcbiAgICAgICAgICAgICAgICAgICAgJ2RsaW5rJzogJzEnXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IHJlcXVlc3QodXJsLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAncGFuLmJhaWR1LmNvbSdcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHZhciByZXMgPSBKU09OLnBhcnNlKGh0bWwpLmxpc3RbMF0uZGxpbmsgKyAnJmFjY2Vzc190b2tlbj0nICsgZ2V0SXRlbSgnYWNjZXNzX3Rva2VuJyk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB2YXIgdXJsID0gYnVpbGRVcmwoJ2h0dHBzOi8vcGFuLmJhaWR1LmNvbS9yZXN0LzIuMC94cGFuL211bHRpbWVkaWEnLCB7XFxuICAgICAgICAgICAgICAgICdhY2Nlc3NfdG9rZW4nOiBnZXRJdGVtKCdhY2Nlc3NfdG9rZW4nKSxcXG4gICAgICAgICAgICAgICAgJ21ldGhvZCc6ICdmaWxlbWV0YXMnLFxcbiAgICAgICAgICAgICAgICAnZnNpZHMnOiBgWyR7aWR9XWAsXFxuICAgICAgICAgICAgICAgICdkbGluayc6ICcxJ1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHZhciBodG1sID0gcmVxdWVzdCh1cmwsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAncGFuLmJhaWR1LmNvbSdcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHZhciByZXMgPSBKU09OLnBhcnNlKGh0bWwpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGV4dCA9PSAnbW92aWUnKSB7XFxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgdXJsczogW3JlcyArICcjaXNWaWRlbz10cnVlIyddLFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdwYW4uYmFpZHUuY29tJ1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2UgaWYgKGV4dCA9PSAnbXAzJykge1xcbiAgICAgICAgICAgIGZ1bmN0aW9uIGJ1aWxkUmVzcG9uc2UocmVzLCBseXJpYykge1xcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHtcXG4gICAgICAgICAgICAgICAgICAgIHVybHM6IFtyZXMgKyAnI2lzTXVzaWM9dHJ1ZSMnXSxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdwYW4uYmFpZHUuY29tJ1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICBpZiAobHlyaWMpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmx5cmljID0gbHlyaWM7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgY29uc3QgX2xpc3RpZCA9IHBhdGgucmVwbGFjZSgvXFxcXC9bXlxcXFwvXSskLywgXFxcIi9cXFwiKTtcXG4gICAgICAgICAgICBjb25zdCBfbGlzdCA9IHN0b3JhZ2UwLmdldFZhcihfbGlzdGlkKTtcXG4gICAgICAgICAgICBpZiAoX2xpc3QgJiYgX2xpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguc3BsaXQoJy8nKS5hdCgtMSkucmVwbGFjZSgvXFxcXC5tcDMkLywgJy5scmMnKTtcXG4gICAgICAgICAgICAgICAgbGV0IGZzX2lkO1xcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpdGVtIG9mIF9saXN0KSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5zZXJ2ZXJfZmlsZW5hbWUgPT09IGZpbGVuYW1lKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZnNfaWQgPSBpdGVtLmZzX2lkO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChmc19pZCkge1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsbHlyaWMgPSBidWlsZFVybCgnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3Jlc3QvMi4wL3hwYW4vbXVsdGltZWRpYScsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnYWNjZXNzX3Rva2VuJzogZ2V0SXRlbSgnYWNjZXNzX3Rva2VuJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21ldGhvZCc6ICdmaWxlbWV0YXMnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmc2lkcyc6IGBbJHtmc19pZH1dYCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGxpbmsnOiAnMSdcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaHRtbGx5cmljID0gcmVxdWVzdCh1cmxseXJpYywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAncGFuLmJhaWR1LmNvbSdcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc2x5cmljID0gSlNPTi5wYXJzZShodG1sbHlyaWMpLmxpc3RbMF0uZGxpbmsgKyAnJmFjY2Vzc190b2tlbj0nICsgZ2V0SXRlbSgnYWNjZXNzX3Rva2VuJyk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdHh0bHlyaWMgPSBmZXRjaFBDKHJlc2x5cmljKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICgv77+9Ly50ZXN0KHR4dGx5cmljKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHR4dGx5cmljID0gZmV0Y2hQQyhyZXNseXJpYywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2NoYXJzZXQ9R0IyMzEyJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBpZiAoL++/vS8udGVzdCh0eHRseXJpYykpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0eHRseXJpYyA9IGZldGNoUEMocmVzbHlyaWMsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdjaGFyc2V0PUdCSydcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkUmVzcG9uc2UocmVzLCB0eHRseXJpYyk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkUmVzcG9uc2UocmVzKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoZXh0ID09ICdscmMnKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHJlcztcXG4gICAgICAgIH0gZWxzZSBpZiAoZXh0ID09ICdhdWRpbycpIHtcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICB1cmxzOiBbcmVzICsgJyNpc011c2ljPXRydWUjJ10sXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ3Bhbi5iYWlkdS5jb20nXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSBpZiAoZXh0ID09ICdpbWcnKSB7XFxuICAgICAgICAgICAgLy9pZiAodHlwZW9mKHJlcykgIT0gJ3VuZGVmaW5lZCcpIHtcXG4gICAgICAgICAgICAvLyAgICByZXR1cm4gJ3BpY3M6Ly8nICsgcmVzICsgYCMuanBnO3tVc2VyLUFnZW50QHBhbi5iYWlkdS5jb219YFxcbiAgICAgICAgICAgIC8vfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gJ3BpY3M6Ly8nICsgaW1nLnJlcGxhY2UoL2NcXFxcZCtfdVxcXFxkKy8sICdjMzAwMF91MjAwMCcpO1xcbiAgICAgICAgICAgIC8vfVxcbiAgICAgICAgfSBlbHNlIGlmIChleHQgPT0gJ3R4dCcpIHtcXG4gICAgICAgICAgICB2YXIgbGF6eSA9ICQoJyNyZWFkVGhlbWUjJykucnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHZhciBkID0gW107XFxuICAgICAgICAgICAgICAgIGRvd25sb2FkRmlsZShNWV9VUkwsICdoaWtlcjovL2ZpbGVzL2NhY2hlL3RtcC50eHQnKTtcXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBmZXRjaCgnaGlrZXI6Ly9maWxlcy9jYWNoZS90bXAudHh0Jyk7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogZGF0YS5yZXBsYWNlKC8o44CA44CAfCAgICApL2csICc8cD7jgIDjgIAnKSxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFNpemU6IDE4LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiB0cnVlLFxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldFJlc3VsdChkKTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gcmVzICsgbGF6eTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuICdkb3dubG9hZDovLycgKyByZXMgKyBgO3tVc2VyLUFnZW50QHBhbi5iYWlkdS5jb219YDtcXG4gICAgICAgIH1cXG4gICAgfSwgZXh0LCBpZCwgcGF0aCwgaW1nKTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJsaXN0XCIsXCJwYXRoXCI6XCJsaXN0XCIsXCJydWxlXCI6XCJqczpcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhclZhcigndXJsQmFpZHUnKVxcbiAgICBjbGVhclZhcigncGF0aHMnKTtcXG4gICAgY2xlYXJWYXIoJ3JlYWx1cmwnKTtcXG5cXG59KSk7XFxucmMoZmV0Y2hQQygnaHR0cHM6Ly9naXRlZS5jb20vbWlzdHl3YXRlci9oaWtlcl9pbmZvL3Jhdy9tYXN0ZXIvZ2l0aHVicHJveHkuanNvbicpICsgJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9taXN0eXdhdGVyL2hpa2VyL21haW4vZicsIDI0KTtcXG52YXIgZCA9IFtdO1xcbnRyeSB7XFxuICAgIGlmIChnZXRWYXIoJ3JlYWx1cmwnKSkge1xcbiAgICAgICAgTVlfVVJMID0gZ2V0VmFyKCdyZWFsdXJsJyk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBNWV9VUkwgPSBNWV9VUkwuc3BsaXQoJ3JlYWx1cmw9JylbMV0ucmVwbGFjZSgvaGlrZXIuKj8jIy8sICcnKTtcXG4gICAgICAgIGxvZygnMTExOicrTVlfVVJMKTtcXG4gICAgICAgIGV2YWwoJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHNcXFwiKS5jb2RlU2hhcmUpO1xcbiAgICAgICAgcHV0VmFyKCdyZWFsdXJsJywgTVlfVVJMKTtcXG4gICAgfVxcbiAgICAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVMaXN0KCk7XFxufSBjYXRjaCAoZSkge1xcbiAgICBsb2coZS5tZXNzYWdlKVxcbiAgICB0b2FzdCgn6ZO+5o6l6ZSZ6K+v5oiW6ICF5YiG5Lqr5bey5aSx5pWIIScpXFxufVxcblxcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIueZvuW6puS4i+i9veWZqFwiLFwicGF0aFwiOlwiQmFpZHVNdWx0aVRocmVhZGVkRG93bmxvYWRlclwiLFwicnVsZVwiOlwiLy9ieSBMb3lEZ0lrIOS9rFxcbmNvbnN0IEZpbGVzID0gamF2YS5uaW8uZmlsZS5GaWxlcztcXG5jb25zdCBQYXRocyA9IGphdmEubmlvLmZpbGUuUGF0aHM7XFxuY29uc3QgQnVmZmVyZWRJbnB1dFN0cmVhbSA9IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbVxcbmNvbnN0IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtID0gamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbVxcbmNvbnN0IEZpbGVPdXRwdXRTdHJlYW0gPSBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07XFxuLy9jb25zdCBqYXZhLnV0aWwuQXJyYXlMaXN0O1xcbi8vY29uc3QgamF2YS51dGlsLkxpc3Q7XFxuY29uc3QgRXhlY3V0b3JTZXJ2aWNlID0gamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlO1xcbmNvbnN0IEV4ZWN1dG9ycyA9IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9ycztcXG5jb25zdCBUaW1lVW5pdCA9IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0XFxuY29uc3QgUnVubmFibGUgPSBqYXZhLmxhbmcuUnVubmFibGU7XFxuY29uc3QgQXRvbWljQm9vbGVhbiA9IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuO1xcbmNvbnN0IFVSTCA9IGphdmEubmV0LlVSTDtcXG5jb25zdCBMb25nID0gamF2YS5sYW5nLkxvbmc7XFxuXFxuY29uc3QgT2tHbyA9IGNvbS5senkub2tnby5Pa0dvO1xcbmNvbnN0IEh0dHBzVXRpbHMgPSBjb20ubHp5Lm9rZ28uaHR0cHMuSHR0cHNVdGlscztcXG5jb25zdCBBcnJheXMgPSBqYXZhLnV0aWwuQXJyYXlzO1xcbmNvbnN0IENvbXBhcmF0b3IgPSBqYXZhLnV0aWwuQ29tcGFyYXRvcjtcXG5jb25zdCBCVUZGRVJfU0laRSA9IDQwOTY7XFxuY29uc3QgRmlsZSA9IGphdmEuaW8uRmlsZTtcXG5jb25zdCBUaHJlYWQgPSBqYXZhLmxhbmcuVGhyZWFkO1xcbmNvbnN0IFJhbmRvbUFjY2Vzc0ZpbGUgPSBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7XFxuY29uc3QgT2tIdHRwQ2xpZW50ID0gUGFja2FnZXMub2todHRwMy5Pa0h0dHBDbGllbnQ7XFxuY29uc3QgRmlsZUlucHV0U3RyZWFtID0gamF2YS5pby5GaWxlSW5wdXRTdHJlYW07XFxuLyoqXFxuICog5L2/55So5aSa57q/56iL5YiG5Z2X5LiL6L295paH5Lu277yM5pSv5oyB6Ieq5a6a5LmJIEhlYWRlcnPvvIzlubblsIbliIblnZflhYjlhpnlhaXkuLTml7bmlofku7bvvIzlho3lkIjlubbjgIJcXG4gKlxcbiAqIEBwYXJhbSB1cmwgICAgICAgICDmlofku7bkuIvovb3lnLDlnYBcXG4gKiBAcGFyYW0gb3V0cHV0UGF0aCAg5paH5Lu25pyA57uI5L+d5a2Y6Lev5b6EXFxuICogQHBhcmFtIGNodW5rU2l6ZSAgIOavj+S4que6v+eoi+S4i+i9veeahOWIhuWdl+Wkp+Wwj++8iOWNleS9je+8muWtl+iKgu+8iVxcbiAqIEBwYXJhbSB0aHJlYWRDb3VudCDkuIvovb3kvb/nlKjnmoTnur/nqIvmlbBcXG4gKiBAcGFyYW0gcmV0cnlDb3VudCAg5q+P5Liq5YiG5Z2X5LiL6L295aSx6LSl55qE5pyA5aSn6YeN6K+V5qyh5pWwXFxuICogQHBhcmFtIGhlYWRlcnMgICAgIOmcgOimgea3u+WKoOWIsOivt+axguS4reeahOiHquWumuS5ieivt+axguWktO+8iOWPr+S4uiBudWxsIOihqOekuuS4jemcgOimge+8iVxcbiAqL1xcbmZ1bmN0aW9uIGRvd25sb2FkRmlsZShcXG4gICAgdXJsLFxcbiAgICBvdXRwdXRQYXRoLFxcbiAgICBmaWxlbmFtZSxcXG4gICAgY29uZmlnXFxuKSB7XFxuICAgIGxldCB7XFxuICAgICAgICBjaHVua1NpemUsXFxuICAgICAgICB0aHJlYWRDb3VudCxcXG4gICAgICAgIHJldHJ5Q291bnQsXFxuICAgICAgICBoZWFkZXJzXFxuICAgIH0gPSBjb25maWcgfHwge307XFxuICAgIGxldCBoZWFkID0gaGVhZGVycyB8fCB7fTtcXG4gICAgY2h1bmtTaXplID0gY2h1bmtTaXplIHx8IDIgKiAxMDI0ICogMTAyNDtcXG4gICAgdGhyZWFkQ291bnQgPSB0aHJlYWRDb3VudCB8fCA0O1xcbiAgICByZXRyeUNvdW50ID0gcmV0cnlDb3VudCB8fCAzO1xcbiAgICBoZWFkZXJzID0gbmV3IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwKCk7XFxuICAgIGZvciAobGV0IGsgaW4gaGVhZCkge1xcbiAgICAgICAgaGVhZGVycy5wdXQoaywgaGVhZFtrXSk7XFxuICAgIH1cXG4gICAgbGV0IGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2wodGhyZWFkQ291bnQpO1xcbiAgICBsZXQgZnV0dXJlcyA9IFtdXFxuICAgIGxldCBkb3dubG9hZEZhaWxlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTtcXG4gICAgbGV0IGZpbGVTaXplO1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IGZpbGVpbmZvID0gZ2V0RmlsZUluZm8odXJsLCBoZWFkKTtcXG4gICAgICAgIGZpbGVTaXplID0gZmlsZWluZm8uc2l6ZTtcXG4gICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUgfHwgZmlsZWluZm8ubmFtZSB8fCBtZDUodXJsKTtcXG4gICAgICAgIGlmICghZmlsZVNpemUgfHwgTnVtYmVyLmlzTmFOKGZpbGVTaXplKSkge1xcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxcXCLmlofku7blpKflsI/ojrflj5blpLHotKVcXFwiKTtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKFxcXCLojrflj5bmlofku7blpKflsI/lpLHotKU6IFxcXCIgKyBlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duTm93KCk7XFxuICAgICAgICByZXR1cm47XFxuICAgIH1cXG4gICAgaWYgKGZpbGVTaXplIDw9IDApIHtcXG4gICAgICAgIGxvZyhcXFwi5peg5rOV6I635Y+W5paH5Lu25aSn5bCP5oiW5paH5Lu25aSn5bCP5Li6MO+8jOS4i+i9vee7iOatouOAglxcXCIpO1xcbiAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duTm93KCk7XFxuICAgICAgICByZXR1cm47XFxuICAgIH1cXG4gICAgb3V0cHV0UGF0aCA9IG91dHB1dFBhdGggKyBcXFwiL1xcXCIgKyBmaWxlbmFtZTtcXG5cXG4gICAgbGV0IHRlbXBEaXIgPSBuZXcgRmlsZShvdXRwdXRQYXRoICsgXFxcIi50bXBcXFwiKTtcXG4gICAgaWYgKCF0ZW1wRGlyLmV4aXN0cygpKSB7XFxuICAgICAgICB0ZW1wRGlyLm1rZGlyKCk7XFxuICAgIH1cXG5cXG4gICAgbGV0IGNodW5rQ291bnQgPSBNYXRoLmNlaWwoZmlsZVNpemUgLyBjaHVua1NpemUpO1xcbiAgICBsZXQgb2Zmc2V0ID0gMDtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaHVua0NvdW50OyBpKyspIHtcXG4gICAgICAgIC8vIOi1t+Wni+S9jee9rlxcbiAgICAgICAgbGV0IHN0YXJ0ID0gb2Zmc2V0O1xcbiAgICAgICAgLy8g57uT5p2f5L2N572u77yI5pyA5ZCO5LiA5Liq57q/56iL5Y+v6IO95YiwIGZpbGVTaXplIC0gMSDvvIlcXG4gICAgICAgIGxldCBlbmQgPSAoaSA9PSBjaHVua0NvdW50IC0gMSkgPyAoZmlsZVNpemUgLSAxKSA6IChvZmZzZXQgKyBjaHVua1NpemUgLSAxKTtcXG4gICAgICAgIG9mZnNldCA9IGVuZCArIDE7XFxuXFxuXFxuICAgICAgICBsZXQgdGVtcEZpbGUgPSBuZXcgRmlsZSh0ZW1wRGlyLCBcXFwiY2h1bmtfXFxcIiArIHN0YXJ0ICsgXFxcIl9cXFwiICsgZW5kICsgXFxcIi50bXBcXFwiKTtcXG5cXG5cXG4gICAgICAgIGxldCBmaW5hbFN0YXJ0ID0gc3RhcnQ7XFxuICAgICAgICBsZXQgZmluYWxFbmQgPSBlbmQ7XFxuICAgICAgICBsZXQgZmluYWxUZW1wRmlsZSA9IHRlbXBGaWxlO1xcblxcbiAgICAgICAgbGV0IGZ1dHVyZSA9IGV4ZWN1dG9yU2VydmljZS5zdWJtaXQobmV3IFJ1bm5hYmxlKCgpID0+IHtcXG4gICAgICAgICAgICBsZXQgYXR0ZW1wdHMgPSAwO1xcbiAgICAgICAgICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XFxuXFxuICAgICAgICAgICAgd2hpbGUgKCFkb3dubG9hZEZhaWxlZC5nZXQoKSAmJiBhdHRlbXB0cyA8IHJldHJ5Q291bnQgJiYgIXN1Y2Nlc3MpIHtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkQ2h1bmsodXJsLCBmaW5hbFN0YXJ0LCBmaW5hbEVuZCwgZmluYWxUZW1wRmlsZSwgaGVhZGVycyk7XFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTtcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdHMrKztcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhcXFwi57q/56iLIFxcXCIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIiDkuIvovb3liIblnZcgW1xcXCIgKyBmaW5hbFN0YXJ0ICsgXFxcIiAtIFxcXCIgKyBmaW5hbEVuZCArIFxcXCJdIOWksei0pe+8jOmHjeivlSBcXFwiICtcXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0cyArIFxcXCIvXFxcIiArIHJldHJ5Q291bnQgKyBcXFwi77yM5Y6f5Zug77yaXFxcIiArIGUudG9TdHJpbmcoKSk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdHMgPj0gcmV0cnlDb3VudCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOagh+iusOaVtOS4quS4i+i9vei/h+eoi+Wksei0pVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkRmFpbGVkLnNldCh0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDmipvlh7rlvILluLjvvIznu4jmraLlvZPliY3ku7vliqFcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIue6v+eoiyBcXFwiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgK1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiIOi2heWHuuacgOWkp+mHjeivleasoeaVsO+8jOS4i+i9veWksei0peOAgkVycm9yOlxcXCIgKyBlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xcbiAgICAgICAgfSkpO1xcbiAgICAgICAgZnV0dXJlcy5wdXNoKGZ1dHVyZSk7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGZvciAobGV0IGYgb2YgZnV0dXJlcykge1xcbiAgICAgICAgICAgIGYuZ2V0KCk7IC8vIOWmguaenOacieW8guW4uO+8jOS8muWcqOi/memHjOaKm+WHulxcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coXFxcIuaJp+ihjOS4i+i9veS7u+WKoeaXtuWHuueOsOW8guW4uDogXFxcIiArIGUudG9TdHJpbmcoKSk7XFxuICAgICAgICBkb3dubG9hZEZhaWxlZC5zZXQodHJ1ZSk7XFxuICAgIH0gZmluYWxseSB7XFxuICAgICAgICAvLyDlhbPpl63nur/nqIvmsaBcXG4gICAgICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bk5vdygpO1xcbiAgICB9XFxuXFxuICAgIC8vIOWQiOW5tuWIhuWdl+aWh+S7tlxcbiAgICBpZiAoIWRvd25sb2FkRmFpbGVkLmdldCgpKSB7XFxuICAgICAgICBtZXJnZUNodW5rcyh0ZW1wRGlyLCBvdXRwdXRQYXRoKTtcXG4gICAgICAgIC8vIOWIoOmZpOS4tOaXtuaWh+S7tuWkueWPiuWFtuS4reeahOaWh+S7tlxcbiAgICAgICAgZGVsZXRlVGVtcEZpbGVzKHRlbXBEaXIpO1xcbiAgICAgICAgbG9nKFxcXCLmlofku7bkuIvovb3lubblkIjlubblrozmiJDvvIzkv53lrZjot6/lvoTvvJpcXFwiICsgb3V0cHV0UGF0aCk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICAvLyDlpoLmnpzkuIvovb3lpLHotKXvvIzmuIXnqbrkuLTml7bnm67lvZVcXG4gICAgICAgIGRlbGV0ZVRlbXBGaWxlcyh0ZW1wRGlyKTtcXG4gICAgICAgIGxvZyhcXFwi5LiL6L295aSx6LSl77yM5Li05pe25paH5Lu25bey5Yig6Zmk44CCXFxcIik7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZ2V0RmlsZUluZm8odXJsLCBoZWFkZXJzKSB7XFxuICAgIGxldCBoZWFkID0gSlNPTi5wYXJzZShmZXRjaCh1cmwsIHtcXG4gICAgICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oe30sIGhlYWRlcnMpLFxcbiAgICAgICAgb25seUhlYWRlcnM6IHRydWUsXFxuICAgICAgICBtZXRob2Q6IFxcXCJIRUFEXFxcIlxcbiAgICB9KSkuaGVhZGVycztcXG4gICAgT2JqZWN0LmtleXMoaGVhZCkuZm9yRWFjaCh2ID0+IHtcXG4gICAgICAgIGhlYWRbdl0gPSBoZWFkW3ZdWzBdO1xcbiAgICB9KTtcXG4gICAgbGV0IGZpbGVpbmZvID0ge1xcbiAgICAgICAgbWQ1OiBoZWFkW1xcXCJjb250ZW50LW1kNVxcXCJdLFxcbiAgICAgICAgc2l6ZTogTnVtYmVyKGhlYWRbXFxcIngtYnMtZmlsZS1zaXplXFxcIl0gfHwgaGVhZFtcXFwiY29udGVudC1sZW5ndGhcXFwiXSksXFxuICAgICAgICBuYW1lOiAvZmlsZW5hbWU9XFxcIiguKj8pXFxcIi8udGVzdChoZWFkW1xcXCJjb250ZW50LWRpc3Bvc2l0aW9uXFxcIl0pID8gUmVnRXhwLiQxIDogXFxcIlxcXCJcXG4gICAgfTtcXG4gICAgcmV0dXJuIGZpbGVpbmZvO1xcbn1cXG5cXG5mdW5jdGlvbiBtZXJnZUNodW5rcyh0ZW1wRGlyLCBvdXRwdXRQYXRoKSB7XFxuICAgIGxldCBvdXRwdXRGaWxlID0gbmV3IEZpbGUob3V0cHV0UGF0aCk7XFxuICAgIGxldCByYWYgPSBudWxsO1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKG91dHB1dEZpbGUsIFxcXCJyd1xcXCIpO1xcblxcbiAgICAgICAgbGV0IGNodW5rRmlsZXMgPSB0ZW1wRGlyLmxpc3RGaWxlcyhuZXcgamF2YS5pby5GaWxlbmFtZUZpbHRlcigoZGlyLCBuYW1lKSA9PiBuYW1lLmVuZHNXaXRoKFxcXCIudG1wXFxcIikpKTtcXG4gICAgICAgIGlmIChjaHVua0ZpbGVzID09IG51bGwpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuaXoOazleiOt+WPluS4tOaXtuaWh+S7tuWkueS4reeahOWIhuWdl+aWh+S7tuOAglxcXCIpO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgQXJyYXlzLnNvcnQoY2h1bmtGaWxlcywgQ29tcGFyYXRvci5jb21wYXJpbmdMb25nKGZpbGUgPT4ge1xcbiAgICAgICAgICAgIGxldCBuYW1lID0gZmlsZS5nZXROYW1lKCk7XFxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gTG9uZy5wYXJzZUxvbmcobmFtZS5zcGxpdChcXFwiX1xcXCIpWzFdKTtcXG4gICAgICAgICAgICByZXR1cm4gc3RhcnQ7XFxuICAgICAgICB9KSk7XFxuXFxuXFxuICAgICAgICBmb3IgKGxldCBjaHVua0ZpbGUgb2YgY2h1bmtGaWxlcykge1xcbiAgICAgICAgICAgIGxldCBmaXMsIGJpcztcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBsZXQgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjaHVua0ZpbGUpO1xcbiAgICAgICAgICAgICAgICBsZXQgYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmlzKTtcXG5cXG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGphdmEubGFuZy5CeXRlLlRZUEUsIEJVRkZFUl9TSVpFKTtcXG4gICAgICAgICAgICAgICAgbGV0IGxlbjtcXG4gICAgICAgICAgICAgICAgd2hpbGUgKChsZW4gPSBiaXMucmVhZChidWZmZXIpKSAhPSAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmFmLndyaXRlKGJ1ZmZlciwgMCwgbGVuKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZmluYWxseSB7XFxuICAgICAgICAgICAgICAgIGZpcyAmJiBmaXMuY2xvc2UoKTtcXG4gICAgICAgICAgICAgICAgYmlzICYmIGJpcy5jbG9zZSgpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKFxcXCLlkIjlubbliIblnZfmlofku7bml7blh7rplJnvvJpcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgfSBmaW5hbGx5IHtcXG4gICAgICAgIHJhZiAmJiByYWYuY2xvc2UoKTtcXG4gICAgfVxcbn1cXG5jb25zdCBkb3dubG9hZENsaWVudCA9IG5ldyBPa0h0dHBDbGllbnQuQnVpbGRlcigpXFxuICAgIC5jb25uZWN0VGltZW91dCgzMCwgVGltZVVuaXQuU0VDT05EUylcXG4gICAgLnJlYWRUaW1lb3V0KDUwLCBUaW1lVW5pdC5TRUNPTkRTKVxcbiAgICAud3JpdGVUaW1lb3V0KDQwLCBUaW1lVW5pdC5TRUNPTkRTKVxcbiAgICAuc3NsU29ja2V0RmFjdG9yeShIdHRwc1V0aWxzLmdldFNzbFNvY2tldEZhY3RvcnkoKS5zU0xTb2NrZXRGYWN0b3J5LCBIdHRwc1V0aWxzLlVuU2FmZVRydXN0TWFuYWdlcilcXG4gICAgLmhvc3RuYW1lVmVyaWZpZXIoSHR0cHNVdGlscy5VblNhZmVIb3N0bmFtZVZlcmlmaWVyKVxcbiAgICAuYnVpbGQoKTtcXG5cXG5mdW5jdGlvbiBkb3dubG9hZENodW5rKFxcbiAgICB1cmwsXFxuICAgIHN0YXJ0LFxcbiAgICBlbmQsXFxuICAgIHRlbXBGaWxlLFxcbiAgICBoZWFkZXJzXFxuKSB7XFxuXFxuICAgIGxldCByZXF1ZXN0ID0gT2tHby5nZXQodXJsKTtcXG4gICAgLy8g5aaC5p6c5pyJ6Ieq5a6a5LmJIEhlYWRlcnPvvIzliJnmt7vliqBcXG4gICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkge1xcbiAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgaGVhZGVycy5lbnRyeVNldCgpKSB7XFxuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICAvL2xvZyhPYmplY3Qua2V5cyhyZXF1ZXN0KSlcXG4gICAgcmVxdWVzdC5oZWFkZXJzKFxcXCJSYW5nZVxcXCIsIFxcXCJieXRlcz1cXFwiICsgc3RhcnQgKyBcXFwiLVxcXCIgKyBlbmQpO1xcbiAgICByZXF1ZXN0LmNsaWVudChkb3dubG9hZENsaWVudCk7XFxuICAgIC8vIOaJp+ihjOWQjOatpeivt+axgu+8jOiOt+WPluWTjeW6lFxcbiAgICBsZXQgcmVzcG9uc2UgPSByZXF1ZXN0LmV4ZWN1dGUoKTtcXG4gICAgaWYgKHJlc3BvbnNlID09IG51bGwgfHwgfn4ocmVzcG9uc2UuY29kZSgpIC8gMTAwKSAhPSAyKSB7XFxuICAgICAgICBsb2cofn4ocmVzcG9uc2UuY29kZSgpIC8gMTAwKSlcXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi5pyN5Yqh5Zmo6L+U5Zue5byC5bi477yMSFRUUCBjb2RlID0gXFxcIiArXFxuICAgICAgICAgICAgKHJlc3BvbnNlID09IG51bGwgPyBcXFwibnVsbFxcXCIgOiByZXNwb25zZS5jb2RlKCkpKTtcXG4gICAgfVxcblxcbiAgICAvLyDlsIblk43lupTkvZPlhpnlhaXkuLTml7bmlofku7ZcXG4gICAgbGV0IGlzID0gbnVsbCxcXG4gICAgICAgIGJpcyA9IG51bGwsXFxuICAgICAgICBmb3MgPSBudWxsO1xcbiAgICB0cnkge1xcbiAgICAgICAgaXMgPSByZXNwb25zZS5ib2R5KCk7XFxuICAgICAgICBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpcy5ieXRlU3RyZWFtKCkpO1xcbiAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpO1xcblxcbiAgICAgICAgbGV0IGJ1ZmZlciA9IGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGphdmEubGFuZy5CeXRlLlRZUEUsIEJVRkZFUl9TSVpFKTtcXG4gICAgICAgIGxldCBsZW47XFxuICAgICAgICB3aGlsZSAoKGxlbiA9IGJpcy5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7XFxuICAgICAgICAgICAgZm9zLndyaXRlKGJ1ZmZlciwgMCwgbGVuKTtcXG4gICAgICAgIH1cXG4gICAgfSBmaW5hbGx5IHtcXG4gICAgICAgIGlzICYmIGlzLmNsb3NlKCk7XFxuICAgICAgICBiaXMgJiYgYmlzLmNsb3NlKCk7XFxuICAgICAgICBmb3MgJiYgZm9zLmNsb3NlKCk7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZGVsZXRlVGVtcEZpbGVzKHRlbXBEaXIpIHtcXG4gICAgaWYgKHRlbXBEaXIuZXhpc3RzKCkgJiYgdGVtcERpci5pc0RpcmVjdG9yeSgpKSB7XFxuICAgICAgICBmb3IgKGxldCBmaWxlIG9mIHRlbXBEaXIubGlzdEZpbGVzKCkgfHwgW10pIHtcXG4gICAgICAgICAgICBmaWxlLmRlbGV0ZSgpO1xcbiAgICAgICAgfVxcbiAgICAgICAgdGVtcERpci5kZWxldGUoKTtcXG4gICAgfVxcbn1cXG5sZXQgaXNEb3dubG9hZCA9IGZhbHNlO1xcbiQuZXhwb3J0cy5kb3dubG9hZEZpbGUgPSBmdW5jdGlvbih1cmwsXFxuICAgIG91dHB1dFBhdGgsXFxuICAgIGZpbGVuYW1lLFxcbiAgICBjb25maWcpIHtcXG4gICAgaWYgKGlzRG93bmxvYWQpIHJldHVybiBmYWxzZTtcXG4gICAgaXNEb3dubG9hZCA9IHRydWU7XFxuICAgIGRvd25sb2FkRmlsZSh1cmwsXFxuICAgICAgICBvdXRwdXRQYXRoLFxcbiAgICAgICAgZmlsZW5hbWUsXFxuICAgICAgICBjb25maWcpO1xcbiAgICBpc0Rvd25sb2FkID0gZmFsc2U7XFxuICAgIHJldHVybiB0cnVlO1xcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcImxpc3RzXCIsXCJwYXRoXCI6XCJsaXN0c1wiLFwicnVsZVwiOlwiLy/ni5fmtanlpKfkvazmj5DkvptcXG4vL+WIhuS6q+mTvuaOpei9rOeggeaSreaUvu+8jOaOpeWPo+adpeiHqueZvuW6pue9keebmOe9kemhteeJiHBjIHVhXFxuJC5leHBvcnRzLmNvZGVIaXN0b3J5VmlldyA9IGZ1bmN0aW9uKG15VVJMKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+ingueci+iusOW9lScsXFxuICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgobXlVUkwpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcignc2VsZWN0JywgJ3ZpZXcnKTtcXG4gICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5zZWxlY3RIaXN0b3J5KG15VVJMKTtcXG4gICAgICAgIH0sIG15VVJMKSxcXG4gICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfmuIXpmaTop4LnnIvorrDlvZUnLFxcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oJ2hpc3RvcnlWaWV3Jyk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIH1dXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG4kLmV4cG9ydHMuY29kZUhpc3RvcnlTZWFyY2ggPSBmdW5jdGlvbihteVVSTCkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfmkJzntKLorrDlvZUnLFxcbiAgICAgICAgdXJsOiAkKCcnKS5sYXp5UnVsZSgobXlVUkwpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcignc2VsZWN0JywgJ3NlYXJjaCcpO1xcbiAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLnNlbGVjdEhpc3RvcnkobXlVUkwpO1xcbiAgICAgICAgfSwgbXlVUkwpLFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+a4hemZpOaQnOe0ouiusOW9lScsXFxuICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGNsZWFySXRlbSgnaGlzdG9yeVNlYXJjaCcpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICB9XVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuJC5leHBvcnRzLnNlbGVjdEhpc3RvcnkgPSBmdW5jdGlvbihteVVSTCkge1xcbiAgICBpZiAodHlwZW9mKG15VVJMKSA9PSAndW5kZWZpbmVkJykgbXlVUkwgPSAnJztcXG4gICAgY29uc3QgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcImh0dHBzOi8vZ2l0ZWUuY29tL21pc3R5d2F0ZXIvaGlrZXJfaW5mby9yYXcvbWFzdGVyL1BvcHVwLmpzXFxcIik7XFxuICAgIGxldCBzb3VyY2VMaXN0ID0gZ2V0TXlWYXIoJ3NlbGVjdCcpID09ICdzZWFyY2gnID8gc3RvcmFnZTAuZ2V0SXRlbSgnaGlzdG9yeVNlYXJjaCcsIFtdKSA6IHN0b3JhZ2UwLmdldEl0ZW0oJ2hpc3RvcnlWaWV3JywgW10pO1xcbiAgICBzb3VyY2VMaXN0ID0gc291cmNlTGlzdC5yZXZlcnNlKCk7XFxuICAgIGhpa2VyUG9wLnNldFVzZVN0YXJ0QWN0aXZpdHkoZmFsc2UpO1xcbiAgICBsZXQgc3BlbiA9IGdldE15VmFyKCdzZWxlY3QnKSA9PSAnc2VhcmNoJyA/IDMgOiAxO1xcbiAgICBsZXQgaW5wdXRCb3g7XFxuICAgIGxldCBwb3AgPSBoaWtlclBvcC5zZWxlY3RCb3R0b21SZXMoe1xcbiAgICAgICAgb3B0aW9uczogc291cmNlTGlzdCxcXG4gICAgICAgIGNvbHVtbnM6IHNwZW4sXFxuICAgICAgICB0aXRsZTogXFxcIuW9k+WJjeWQiOiuoTpcXFwiICsgc291cmNlTGlzdC5sZW5ndGgsXFxuICAgICAgICBub0F1dG9EaXNtaXNzOiB0cnVlLFxcbiAgICAgICAgLy90b1Bvc2l0aW9uOiBpbmRleCxcXG4gICAgICAgIGV4dHJhSW5wdXRCb3g6IChpbnB1dEJveCA9IG5ldyBoaWtlclBvcC5SZXNFeHRyYUlucHV0Qm94KHtcXG4gICAgICAgICAgICBoaW50OiBcXFwi5YWz6ZSu5a2X562b6YCJXFxcIixcXG4gICAgICAgICAgICB0aXRsZTogXFxcIlxcXCIsXFxuICAgICAgICAgICAgb25DaGFuZ2UocywgbWFuYWdlKSB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJzb3VyY2VMaXN0RmlsdGVyXFxcIiwgcyk7XFxuICAgICAgICAgICAgICAgIHRtcExpc3QgPSBzb3VyY2VMaXN0LmZpbHRlcih4ID0+IHgudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzLnRvTG93ZXJDYXNlKCkpKTtcXG4gICAgICAgICAgICAgICAgbGV0IGZsaXN0ID0gdG1wTGlzdDtcXG4gICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgICAgICAgICAgZmxpc3QuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFxcXCJzb3VyY2VMaXN0RmlsdGVyXFxcIiwgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogdHJ1ZVxcbiAgICAgICAgfSkpLFxcbiAgICAgICAgbG9uZ0NsaWNrKHMsIGksIG1hbmFnZSkge30sXFxuICAgICAgICBjbGljayhzLCBpLCBtYW5hZ2UpIHtcXG4gICAgICAgICAgICBwb3AuZGlzbWlzcygpO1xcbiAgICAgICAgICAgIGxldCBpbnB1dCA9IHM7XFxuICAgICAgICAgICAgaWYgKHRtcExpc3RbaV0gPT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGdldE15VmFyKCdzZWxlY3QnKSA9PSAnc2VhcmNoJykge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0VmFyKCdrZXl3b3JkJywgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuY29kZVBhcnNlU2VhcmNoVXJsKGlucHV0LCBteVVSTCk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IC9odHRwLy50ZXN0KGlucHV0LnNwbGl0KCdAQCcpWzBdKSA/IGlucHV0LnNwbGl0KCdAQCcpWzBdIDogaW5wdXQuc3BsaXQoJ0BAJylbMV07XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlUGFyc2VVcmwoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+a6kOWIl+ihqOe0ouW8leW8guW4uCdcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICAgICAgbWVudUNsaWNrKG1hbmFnZSkge1xcbiAgICAgICAgICAgIGxldCBtZW51YXJyID0gW1xcXCLmoLflvI9cXFwiLCBnZXRJdGVtKCdzZWxlY3RPcmRlcicsICdhc2MnKSA9PSBcXFwiYXNjXFxcIiA/IFxcXCLmraPluo9cXFwiIDogXFxcIuWAkuW6j1xcXCIsIFxcXCLmjpLluo9cXFwiXTtcXG4gICAgICAgICAgICBoaWtlclBvcC5zZWxlY3RDZW50ZXIoe1xcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBtZW51YXJyLFxcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiAyLFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuivt+mAieaLqVxcXCIsXFxuICAgICAgICAgICAgICAgIGNsaWNrKHMsIGkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlbiA9IHNwZW4gPT0gMSA/IDIgOiAoc3BlbiA9PSAyID8gMyA6IDEpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2VDb2x1bW5zKHNwZW4pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbmFnZS5zY3JvbGxUb1Bvc2l0aW9uKGluZGV4LCBmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0T3JkZXIgPSBnZXRJdGVtKCdzZWxlY3RPcmRlcicsICdhc2MnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5yZXZlcnNlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0T3JkZXIgPSBzZWxlY3RPcmRlciA9PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oJ3NlbGVjdE9yZGVyJywgc2VsZWN0T3JkZXIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL21hbmFnZS5zY3JvbGxUb1Bvc2l0aW9uKGluZGV4LCB0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb3J0dHlwZSA9IFtcXFwi5pu05paw5pe26Ze0XFxcIiwgXFxcIuaOpeWPo+WQjeensFxcXCIsIFxcXCLkvb/nlKjpopHnjodcXFwiXS5tYXAodiA9PiB2ID09IGdldEl0ZW0oJ3NvdXJjZUxpc3RTb3J0JywgJ+abtOaWsOaXtumXtCcpID8gdiArIFxcXCLiiJpcXFwiIDogdik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1NlbGVjdE9wdGlvbnMoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidGl0bGVcXFwiOiBcXFwi6YCJ5oup5o6S5bqP5pa55byPXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm9wdGlvbnNcXFwiOiBzb3J0dHlwZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImNvbFxcXCI6IDEsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJqc1xcXCI6IGBzZXRJdGVtKCdzb3VyY2VMaXN0U29ydCcsIGlucHV0LnJlcGxhY2UoXFxcIuKImlxcXCIsXFxcIlxcXCIpKTsndG9hc3Q6Ly/mjpLluo/mlrnlvI/lnKjkuIvmrKHnlJ/mlYjvvJonICsgaW5wdXQucmVwbGFjZShcXFwi4oiaXFxcIixcXFwiXFxcIilgXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaWtlclBvcC5jYW5CaW9tZXRyaWMoKSAhPT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6LCD55So55Sf54mp5a2m6aqM6K+B5Ye66ZSZXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvcCA9IGhpa2VyUG9wLmNoZWNrQnlCaW9tZXRyaWMoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcign5bey6aqM6K+B5oyH57q5JywgJzEnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoXFxcIumqjOivgeaIkOWKn++8jOmHjeaWsOeCueWIh+aNouermea6kOWQp1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknO1xcbn1cXG4kLmV4cG9ydHMuc3RvcmVIaXN0b3J5VmlldyA9IGZ1bmN0aW9uKGlucHV0LCB0aXRsZSkge1xcbiAgICBsZXQgaGlzdG9yeVZpZXcgPSBzdG9yYWdlMC5nZXRJdGVtKCdoaXN0b3J5VmlldycsIFtdKTtcXG4gICAgaWYgKCFoaXN0b3J5Vmlldy5pbmNsdWRlcyh0aXRsZSArICdAQCcgKyBpbnB1dCkpIHtcXG4gICAgICAgIGhpc3RvcnlWaWV3LnB1c2godGl0bGUgKyAnQEAnICsgaW5wdXQpO1xcbiAgICB9XFxuICAgIHN0b3JhZ2UwLnNldEl0ZW0oJ2hpc3RvcnlWaWV3JywgaGlzdG9yeVZpZXcpO1xcbn1cXG4kLmV4cG9ydHMuc3RvcmVIaXN0b3J5U2VhcmNoID0gZnVuY3Rpb24oaW5wdXQpIHtcXG4gICAgbGV0IGhpc3RvcnlTZWFyY2ggPSBzdG9yYWdlMC5nZXRJdGVtKCdoaXN0b3J5U2VhcmNoJywgW10pO1xcbiAgICBpZiAoIWhpc3RvcnlTZWFyY2guaW5jbHVkZXMoaW5wdXQpKSB7XFxuICAgICAgICBoaXN0b3J5U2VhcmNoLnB1c2goaW5wdXQpO1xcbiAgICB9XFxuICAgIHN0b3JhZ2UwLnNldEl0ZW0oJ2hpc3RvcnlTZWFyY2gnLCBoaXN0b3J5U2VhcmNoKTtcXG59XFxuJC5leHBvcnRzLmNvZGVQYXJzZVVybCA9IGZ1bmN0aW9uKHVybCwg5L6d6LWWKSB7XFxuICAgIGlmICgvYmFpZHUvLnRlc3QodXJsKSkge1xcbiAgICAgICAgcHV0VmFyKCd1cmxCYWlkdScsIHVybCk7XFxuICAgICAgICB1cmwgPSBcXFwiaGlrZXI6Ly9wYWdlL2xpc3Q/cnVsZT3nmb7luqbnvZHnm5gmcmVhbHVybD1cXFwiICsgdXJsO1xcbiAgICB9IGVsc2UgaWYgKC9hbGl5dW5kcml2ZXxhbGlwYW58cXVhcmt8dWNcXFxcLi8udGVzdCh1cmwpKSB7XFxuICAgICAgICBpZiAoIeS+nei1likg5L6d6LWWID0gJ2h0dHBzOi8vY29kZWJlcmcub3JnL3NyYzQ4NTk3OTYyL2hrL3Jhdy9icmFuY2gvSnUvU3JjSnUuanMnO1xcbiAgICAgICAgcmVxdWlyZSjkvp3otZYubWF0Y2goL2h0dHAocyk/OlxcXFwvXFxcXC8uKlxcXFwvLylbMF0gKyAnU3JjUGFyc2VTLmpzJyk7XFxuICAgICAgICB1cmwgPSBTcmNQYXJzZVMu6IGa6ZiFKHVybCk7XFxuICAgIH0gZWxzZSBpZiAoLyh4dW5sZWl8ZWQyazp8YnQ6fGZ0cDp8XFxcXC50b3JyZW50fG1hZ25ldCkvLnRlc3QodXJsKSkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvZGlhb3lvbmc/cnVsZT3ov4Xpm7cmcGFnZT1meXBhZ2UjXFxcIiArIHVybDtcXG4gICAgfSBlbHNlIGlmICgvbWFnbmV0Ly50ZXN0KHVybCkpIHtcXG4gICAgICAgIHVybCA9IHVybDtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHZhciBodG1sID0gZmV0Y2hQQyh1cmwpO1xcbiAgICAgICAgaWYgKC9yIHBsYXllcl8vLnRlc3QoaHRtbCkpIHtcXG4gICAgICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2UoaHRtbC5tYXRjaCgvciBwbGF5ZXJfLio/PSguKj8pPC8pWzFdKTtcXG4gICAgICAgICAgICB2YXIgdXJsX3QgPSBqc29uLnVybDtcXG4gICAgICAgICAgICBpZiAoanNvbi5lbmNyeXB0ID09ICcxJykge1xcbiAgICAgICAgICAgICAgICB1cmxfdCA9IHVuZXNjYXBlKHVybF90KTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGpzb24uZW5jcnlwdCA9PSAnMicpIHtcXG4gICAgICAgICAgICAgICAgdXJsX3QgPSB1bmVzY2FwZShiYXNlNjREZWNvZGUodXJsX3QpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdXJsID0gJ3ZpZGVvOi8vJyArIHVybDtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdXJsID0gJ3ZpZGVvOi8vJyArIHVybDtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICByZXR1cm4gdXJsO1xcbn1cXG4kLmV4cG9ydHMuY29kZVBhcnNlU2VhcmNoVXJsID0gZnVuY3Rpb24oaW5wdXQsIG15VVJMKSB7XFxuICAgIGlmICh0eXBlb2YobXlVUkwpID09ICd1bmRlZmluZWQnKSBteVVSTCA9ICcnO1xcbiAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aCgnaHR0cHM6Ly9wYW4uYmFpZHUuY29tJykpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgZXZhbCgkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVTaGFyZSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICB0b2FzdCgn6ZO+5o6l6ZSZ6K+v5oiW6ICF5peg5rOV6K6/6ZeuIScpO1xcbiAgICAgICAgfVxcbiAgICB9IGVsc2UgaWYgKC9hbGl5dW5kcml2ZXxhbGlwYW58cXVhcmt8dWMuY24vLnRlc3QoaW5wdXQpKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcXG4gICAgICAgICAgICAgICAg5L6d6LWWOiAnaHR0cHM6Ly9jb2RlYmVyZy5vcmcvc3JjNDg1OTc5NjIvaGsvcmF3L2JyYW5jaC9KdS9TcmNQYXJzZVMuanMnXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICByZXF1aXJlKGNvbmZpZy7kvp3otZYubWF0Y2goL2h0dHAocyk/OlxcXFwvXFxcXC8uKlxcXFwvLylbMF0gKyAnU3JjUGFyc2VTLmpzJyk7XFxuICAgICAgICAgICAgcmV0dXJuIFNyY1BhcnNlUy7ogZrpmIUoaW5wdXQpO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHRvYXN0KCfpk77mjqXplJnor6/miJbogIXml6Dms5Xorr/pl64hJyk7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAoL3h1bmxlaXxlZDJrOnxidDp8ZnRwOnxcXFxcLnRvcnJlbnR8bWFnbmV0Ly50ZXN0KGlucHV0KSkge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9kaWFveW9uZz9ydWxlPei/hembtyZwYWdlPWZ5cGFnZSNcXFwiICsgaW5wdXQ7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgdG9hc3QoJ+mTvuaOpemUmeivr+aIluiAheaXoOazleiuv+mXriEnKTtcXG4gICAgICAgIH1cXG4gICAgfSBlbHNlIGlmIChpbnB1dC5zdGFydHNXaXRoKCdAJykpIHtcXG4gICAgICAgIHZhciBodG1sID0gZmV0Y2hQQygnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL2FwaS9zZWFyY2g/Y2xpZW50dHlwZT0wJmFwcF9pZD0md2ViPTEmZHAtbG9naWQ9Jm9yZGVyPW5hbWUmZGVzYz0wJm51bT05OTk5JnBhZ2U9MSZyZWN1cnNpb249MSZrZXk9JyArIGlucHV0LnNsaWNlKDEpLnRyaW0oKSk7XFxuICAgICAgICB2YXIgbGlzdFNlYXJjaCA9IEpTT04ucGFyc2UoaHRtbCkubGlzdDtcXG4gICAgICAgIHN0b3JhZ2UwLnB1dFZhcigncGF0aHMnLCBbe1xcbiAgICAgICAgICAgIHBhdGg6ICcvc2VhcmNoJyxcXG4gICAgICAgICAgICBuYW1lOiAn8J+PoCdcXG4gICAgICAgIH1dKTtcXG4gICAgICAgIHN0b3JhZ2UwLnB1dFZhcignZmlsZV9saXN0JywgbGlzdFNlYXJjaCk7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5JztcXG4gICAgfSBlbHNlXFxuICAgIGlmIChteVVSTC5zdGFydHNXaXRoKCdoaWtlcjovL3BhZ2Uvc2VhcmNoJykpIHtcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL3BhZ2Uvc2VhcmNoP2Z5cGFnZSZydWxlPeeZvuW6pue9keebmCc7XFxuXFxuICAgIH1cXG59XFxuJC5leHBvcnRzLmNvZGVIaXN0b3J5UGFuID0gJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGxldCBoaXN0b3J5ID0gc3RvcmFnZTAuZ2V0SXRlbSgnaGlzdG9yeScsIFtdKTtcXG4gICAgaGlzdG9yeTEgPSBoaXN0b3J5LmZpbHRlcih4ID0+IC9AQC8udGVzdCh4KSk7XFxuICAgIGhpc3RvcnkyID0gaGlzdG9yeS5maWx0ZXIoeCA9PiAhL0BALy50ZXN0KHgpKTtcXG4gICAgaGlzdG9yeSA9IGdldEl0ZW0oJ2ZvbGRlck9ubHknLCAnMCcpID09IDAgPyBzb3J0QXJyYXkoaGlzdG9yeTEpLmNvbmNhdChoaXN0b3J5MikgOiBoaXN0b3J5MjtcXG4gICAgaGlzdG9yeU5ldyA9IGhpc3RvcnkubWFwKGggPT4gL0BALy50ZXN0KGgpID8gaC5zcGxpdCgnQEAnKVswXS5zcGxpdCgnLycpLmF0KC0xKS5yZXBsYWNlKC9cXFxcPy4qLywgJycpIDogaCk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+e9keebmOiusOW9lScsXFxuICAgICAgICB1cmw6ICQoaGlzdG9yeU5ldywgMSwgJ+mAieaLqeebruW9lScpLnNlbGVjdCgoaGlzdG9yeSwgaGlzdG9yeU5ldykgPT4ge1xcblxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlUGF0aE9iamVjdHMocGF0aCkge1xcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy8nKS5maWx0ZXIocCA9PiBwLnRyaW0oKSAhPT0gJycpO1xcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBbe1xcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogJy8nLFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ/Cfj6AnXFxuICAgICAgICAgICAgICAgIH1dO1xcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudFBhdGggPSAnJztcXG4gICAgICAgICAgICAgICAgcGFydHMuZm9yRWFjaChwYXJ0ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoICs9IGAvJHtwYXJ0fWA7XFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3VycmVudFBhdGgsXFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcGFydFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoIS9AQC8udGVzdChoaXN0b3J5W2hpc3RvcnlOZXcuaW5kZXhPZihpbnB1dCldKSkge1xcbiAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRWYXIoJ3BhdGhzJywgZ2VuZXJhdGVQYXRoT2JqZWN0cyhpbnB1dCkpO1xcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgY29uc3Qge1xcbiAgICAgICAgICAgICAgICAgICAgZ2V0SWNvbixcXG4gICAgICAgICAgICAgICAgICAgIGdldEh6bSxcXG4gICAgICAgICAgICAgICAgICAgIGdldExpbmtcXG4gICAgICAgICAgICAgICAgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2NvZGU/cnVsZT3nmb7luqbnvZHnm5gnKTtcXG4gICAgICAgICAgICAgICAgaW5wdXQgPSBoaXN0b3J5W2hpc3RvcnlOZXcuaW5kZXhPZihpbnB1dCldO1xcbiAgICAgICAgICAgICAgICBzZXRQYWdlVGl0bGUoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TGluayhpbnB1dC5zcGxpdCgnQEAnKVsyXSwgaW5wdXQuc3BsaXQoJ0BAJylbMV0sIGlucHV0LnNwbGl0KCdAQCcpWzBdLCBpbnB1dC5zcGxpdCgnQEAnKVszXSlcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBoaXN0b3J5LCBoaXN0b3J5TmV3KSxcXG4gICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGNsczogJ3BsYXlsaXN0IOe9keebmOiusOW9lScsXFxuICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+a4hemZpOe9keebmOiusOW9lScsXFxuICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGNsZWFySXRlbSgnaGlzdG9yeScpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBnZXRJdGVtKCdmb2xkZXJPbmx5JywgJzAnKSA9PSAwID8gJ+WPquaYvuekuuaWh+S7tuWkuScgOiAn5pi+56S65YWo6YOoJyxcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbSgnZm9sZGVyT25seScsIGdldEl0ZW0oJ2ZvbGRlck9ubHknLCAnMCcpID09IDAgPyAnMScgOiAnMCcpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICB9XVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59KTtcXG5cXG4kLmV4cG9ydHMuY29kZU5ld1BhZ2UgPSBmdW5jdGlvbihwYXRoc05ldykge1xcbiAgICByZXR1cm4ge1xcbiAgICAgICAgdGl0bGU6ICflvIDmlrDpobXpnaInLFxcbiAgICAgICAganM6ICQudG9TdHJpbmcoKHBhdGhzTmV3KSA9PiB7XFxuICAgICAgICAgICAgaWYgKGdldE15VmFyKCdlcmppJykgPT0gMSkge1xcbiAgICAgICAgICAgICAgICB0b2FzdCgn5bey57uP5piv5LqM57qn6aG16Z2i5LqGIScpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dFZhcigncGF0aHNUbXAnLCBzdG9yYWdlMC5nZXRWYXIoJ3BhdGhzJykpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJCgnaGlrZXI6Ly9lbXB0eSMjZnlwYWdlJykucnVsZSgocGF0aHNOZXcpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ2VyamknLCAnMCcpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoJ2ZpcnN0TGlzdE5ldycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoJ2ZpcnN0Jyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGhMYXN0ID0gc3RvcmFnZTAuZ2V0VmFyKCdwYXRocycpLmF0KC0xKS5wYXRoO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXN0b3J5ID0gc3RvcmFnZTAuZ2V0SXRlbSgnaGlzdG9yeScsIFtdKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhpc3RvcnkuaW5jbHVkZXMocGF0aExhc3QpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnkgPSBoaXN0b3J5LmZpbHRlcih4ID0+IHBhdGhMYXN0LmluZGV4T2YoeCkgPT0gLTEpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2gocGF0aExhc3QpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKCdoaXN0b3J5JywgaGlzdG9yeSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0VmFyKCdwYXRocycsIHN0b3JhZ2UwLmdldFZhcigncGF0aHNUbXAnKSk7XFxuXFxuICAgICAgICAgICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcignZXJqaScsICcxJyk7XFxuICAgICAgICAgICAgICAgICAgICBkID0gW107XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWdldE15VmFyKCdmaXJzdExpc3ROZXcnKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dFZhcigncGF0aHMnLCBwYXRoc05ldyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ2ZpcnN0TGlzdE5ldycsICcxJyk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICByYyhmZXRjaFBDKCdodHRwczovL2dpdGVlLmNvbS9taXN0eXdhdGVyL2hpa2VyX2luZm8vcmF3L21hc3Rlci9naXRodWJwcm94eS5qc29uJykgKyAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21pc3R5d2F0ZXIvaGlrZXIvbWFpbi9mJywgMjQpO1xcbiAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlTGlzdCgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldFJlc3VsdChkKTtcXG4gICAgICAgICAgICAgICAgfSwgcGF0aHNOZXcpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIHBhdGhzTmV3KSxcXG4gICAgfTtcXG59XFxuXFxuJC5leHBvcnRzLmNvZGVTaGFyZSA9ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBpZiAodHlwZW9mKGlucHV0KSAhPSAndW5kZWZpbmVkJyAmJiBpbnB1dC5zdGFydHNXaXRoKCdodHRwczovL3Bhbi5iYWlkdS5jb20vc2hhcmUnKSkge1xcbiAgICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKCdzaGFyZS9pbml0P3N1cmw9JywgJ3MvMScpLnJlcGxhY2UoJyZwd2QnLCAnP3B3ZCcpO1xcbiAgICB9XFxuICAgIHZhciBodG1sMTEgPSByZXF1ZXN0KHR5cGVvZihpbnB1dCkgIT0gJ3VuZGVmaW5lZCcgPyBpbnB1dCA6IE1ZX1VSTCwge1xcbiAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgIENvb2tpZTogJyNub0Nvb2tpZSMnXFxuICAgICAgICB9LFxcbiAgICAgICAgbWV0aG9kOiAnSEVBRCcsXFxuICAgICAgICBvbmx5SGVhZGVyczogdHJ1ZVxcbiAgICB9KTtcXG4gICAgdmFyIHVybDExID0gSlNPTi5wYXJzZShodG1sMTEpLnVybDtcXG4gICAgaWYgKCEvc3VybC8udGVzdCh1cmwxMSkgJiYgL1xcXFwvc1xcXFwvLy50ZXN0KHVybDExKSkge1xcbiAgICAgICAgdXJsMTEgPSB1cmwxMS5yZXBsYWNlKCcvcy8xJywgJy93YXAvaW5pdD9zdXJsPXMnKTtcXG4gICAgfVxcbiAgICB2YXIgaHRtbDIxID0gcmVxdWVzdCgnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL3NoYXJlL3ZlcmlmeT9zdXJsPScgKyB1cmwxMS5zcGxpdCgnP3N1cmw9JylbMV0uc3BsaXQoJyZwd2Q9JylbMF0sIHtcXG4gICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICBSZWZlcmVyOiB1cmwxMVxcbiAgICAgICAgfSxcXG4gICAgICAgIGJvZHk6ICgvcHdkLy50ZXN0KHVybDExKSA/ICdwd2Q9JyArIHVybDExLnNwbGl0KCcmcHdkPScpWzFdICsgJyYnIDogJycpICsgJ3Zjb2RlPSZ2Y29kZV9zdHI9JyxcXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgIH0pO1xcbiAgICB2YXIgcmFuZHNrID0gSlNPTi5wYXJzZShodG1sMjEpLnJhbmRzaztcXG4gICAgdmFyIGh0bWwzMSA9IHJlcXVlc3QodHlwZW9mKGlucHV0KSAhPSAndW5kZWZpbmVkJyA/IGlucHV0IDogTVlfVVJMLCB7XFxuICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgJ0Nvb2tpZSc6IGdldEl0ZW0oJ0JEVVNTJykgKyAnOyAnICsgZ2V0SXRlbSgnU1RPS0VOJykgKyAnOyAnICsgJ0JEQ0xORD0nICsgcmFuZHNrLFxcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMjYuMC4wLjAgU2FmYXJpLzUzNy4zNidcXG4gICAgICAgIH0sXFxuICAgICAgICBtZXRob2Q6ICdHRVQnLFxcbiAgICAgICAgcmVkaXJlY3Q6IGZhbHNlXFxuICAgIH0pO1xcbiAgICB2YXIgaHRtbDMyID0gaHRtbDMxLm1hdGNoKC9sb2NhbHNcXFxcLm1zZXRcXFxcKCguKilcXFxcKS8pWzFdO1xcbiAgICB2YXIgaHRtbDMzID0gSlNPTi5wYXJzZShodG1sMzIpO1xcbiAgICB2YXIgZmlsZV9saXN0ID0gaHRtbDMzLmZpbGVfbGlzdDtcXG4gICAgdmFyIGlzZGlyID0gZmlsZV9saXN0WzBdLmlzZGlyO1xcbiAgICB2YXIgdWsgPSBodG1sMzMuc2hhcmVfdWs7XFxuICAgIHZhciBzaGFyZWlkID0gaHRtbDMzLnNoYXJlaWQ7XFxuICAgIHZhciBmc19pZCA9IGZpbGVfbGlzdFswXS5mc19pZDtcXG4gICAgdmFyIHBhdGggPSBmaWxlX2xpc3RbMF0ucGF0aDtcXG4gICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy9zaGFyZWxpbmsnKSkge1xcbiAgICAgICAgcGF0aCA9IGAvc2hhcmVsaW5rJHt1a30tJHtmc19pZH0ke3BhdGh9YDtcXG4gICAgfVxcbiAgICB2YXIganNUb2tlbiA9IGh0bWwzMS5zcGxpdChcXFwianNUb2tlbiUyMCUzRCUyMGElN0QlM0JmbiUyOCUyMlxcXCIpWzFdLnNwbGl0KFxcXCIlMjIlMjknKSlcXFwiKVswXTtcXG4gICAgcHV0VmFyKCdjaycsIGdldEl0ZW0oJ0JEVVNTJykgKyAnOyAnICsgZ2V0SXRlbSgnU1RPS0VOJykgKyAnOyAnICsgJ0JEQ0xORD0nICsgcmFuZHNrKTtcXG4gICAgcHV0VmFyKCdyYW5kc2snLCByYW5kc2spO1xcbiAgICBwdXRWYXIoJ2pzVG9rZW4nLCBqc1Rva2VuKTtcXG4gICAgcHV0VmFyKCdzaGFyZV91aycsIHVrKTtcXG4gICAgcHV0VmFyKCdzaGFyZV9pZCcsIHNoYXJlaWQgKyAnJyk7XFxuICAgIHN0b3JhZ2UwLnB1dFZhcigncGF0aHMnLCBbe1xcbiAgICAgICAgcGF0aDogcGF0aCxcXG4gICAgICAgIG5hbWU6ICfwn4+gJ1xcbiAgICB9XSk7XFxuICAgIHN0b3JhZ2UwLnB1dFZhcignZmlsZV9saXN0JywgZmlsZV9saXN0KTtcXG59KTtcXG5cXG4kLmV4cG9ydHMuY29kZUxpc3QgPSBmdW5jdGlvbigpIHtcXG5cXG4gICAgcGF0aHMgPSBzdG9yYWdlMC5nZXRWYXIoJ3BhdGhzJyk7XFxuICAgIGlmICghcGF0aHMgfHwgcGF0aHMubGVuZ3RoID09IDApIHtcXG4gICAgICAgIHBhdGhzID0gW3tcXG4gICAgICAgICAgICBwYXRoOiAnLycsXFxuICAgICAgICAgICAgbmFtZTogJ/Cfj6AnXFxuICAgICAgICB9XTtcXG4gICAgfVxcbiAgICBsb2cocGF0aHMpO1xcbiAgICB2YXIgcGF0aCA9IHBhdGhzLmF0KC0xKS5wYXRoLnJlcGxhY2UoLyMvZywgJyUyMycpO1xcbiAgICBpZiAoL3NlYXJjaC8udGVzdChwYXRoKSAmJiAhc3RvcmFnZTAuZ2V0VmFyKCdmaWxlX2xpc3QnKSkge1xcbiAgICAgICAgc3RvcmFnZTAucHV0VmFyKCdmaWxlX2xpc3QnLCBzdG9yYWdlMC5nZXRWYXIoJ2ZpbGVfbGlzdF90bXAnKSk7XFxuICAgIH1cXG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvJi9nLCAnJTI2JykucmVwbGFjZSgvXFxcXCsvZywgJyUyQicpO1xcbiAgICBpZiAoTVlfUEFHRSA9PSAxKSB7XFxuXFxuICAgICAgICB2YXIgY3R5cGVUbXAgPSBnZXRNeVZhcihwYXRoICsgJ2N0eXBlSW5kZXgnLCAnMCcpO1xcbiAgICAgICAgdmFyIGN0eXBlU3R5bGUgPSBbJ2F2YXRhcicsICdtb3ZpZV8xX3ZlcnRpY2FsX3BpYycsICdtb3ZpZV8xJywgJ21vdmllXzInLCAnbW92aWVfMycsICdwaWNfMV9jZW50ZXInLCAncGljXzFfZnVsbCcsICdwaWNfMScsICdwaWNfMicsICdwaWNfMycsICdwaWNfMV9jYXJkJywgJ3BpY18yX2NhcmQnLCAncGljXzFfY2VudGVyJywgJ2NhcmRfcGljXzEnLCAnY2FyZF9waWNfMicsICforr7nva7lhajlsYDmoLflvI8nLCAn5Y+W5raI5YWo5bGA5qC35byPJ107XFxuICAgICAgICBjdHlwZVN0eWxlW2N0eXBlVG1wXSA9ICfinqHvuI8nICsgY3R5cGVTdHlsZVtjdHlwZVRtcF07XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBjdHlwZVN0eWxlW2N0eXBlVG1wXS5zbGljZSgxKSxcXG4gICAgICAgICAgICB1cmw6ICQoY3R5cGVTdHlsZSwgMiwgJ+agt+W8jycpLnNlbGVjdCgoY3R5cGVTdHlsZSwgcGF0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gJ+iuvue9ruWFqOWxgOagt+W8jycpIHtcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCdiYWlkdWN0eXBlJywgZ2V0TXlWYXIocGF0aCArICdjdHlwZScsICdhdmF0YXInKSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT0gJ+WPlua2iOWFqOWxgOagt+W8jycpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoJ2JhaWR1Y3R5cGUnKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhdGggKyAnY3R5cGVJbmRleCcsIE1ZX0lOREVYKTtcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhdGggKyAnY3R5cGUnLCBpbnB1dC5yZXBsYWNlKCfinqHvuI8nLCAnJykpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSc7XFxuICAgICAgICAgICAgfSwgY3R5cGVTdHlsZSwgcGF0aCksXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogJ2N0eXBlJ1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogZ2V0TXlWYXIoJ21lZGlhJywgJzAnKSA9PSAnMScgPyAn5b2x6KeGJyA6ICflhajpg6gnLFxcbiAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKCdtZWRpYScsIFN0cmluZygxIC0gZ2V0TXlWYXIoJ21lZGlhJywgJzAnKSkpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXG4gICAgICAgIH0pO1xcblxcbiAgICAgICAgdmFyIHNvcnRUbXAgPSBnZXRNeVZhcihwYXRoICsgJ19zb3J0JywgJzAnKTtcXG4gICAgICAgIHZhciBzb3J0U3R5bGUgPSBbJ+m7mOiupOato+W6jycsICfpu5jorqTlgJLluo8nLCAn6Iux5paH5q2j5bqPJywgJ+iLseaWh+WAkuW6jycsICfmi7zpn7PmraPluo8nLCAn5ou86Z+z5YCS5bqPJywgJ+aVsOWtl+ato+W6jycsICfmlbDlrZflgJLluo8nLCAn5pe26Ze05q2j5bqPJywgJ+aXtumXtOWAkuW6jyddO1xcbiAgICAgICAgc29ydFN0eWxlW3NvcnRUbXBdID0gJ+Keoe+4jycgKyBzb3J0U3R5bGVbc29ydFRtcF07XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBzb3J0U3R5bGVbc29ydFRtcF0uc2xpY2UoMSksXFxuICAgICAgICAgICAgdXJsOiAkKHNvcnRTdHlsZSwgMiwgJ+aOkuW6jycpLnNlbGVjdCgoc29ydFN0eWxlKSA9PiB7XFxuICAgICAgICAgICAgICAgIHZhciBwYXRocyA9IHN0b3JhZ2UwLmdldFZhcigncGF0aHMnKTtcXG4gICAgICAgICAgICAgICAgaWYgKCFwYXRocyB8fCBwYXRocy5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgcGF0aHMgPSBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICcvJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn8J+PoCdcXG4gICAgICAgICAgICAgICAgICAgIH1dO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHZhciBwYXRoID0gcGF0aHMuYXQoLTEpLnBhdGg7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhdGggKyAnX3NvcnQnLCBNWV9JTkRFWCk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSc7XFxuICAgICAgICAgICAgfSwgc29ydFN0eWxlKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiAnc29ydCdcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6ICdibGFua19ibG9jaydcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ/CflI0nLFxcbiAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyNmeXBhZ2UnKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBpbnB1dCA9IGdldFZhcigna2V5d29yZCcpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9zZWFyY2g/ZnlwYWdlJnJ1bGU955m+5bqm572R55uYXFxcIiAvLy5jb2RlUGFyc2VTZWFyY2hVcmwoaW5wdXQpO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXG4gICAgICAgIH0pO1xcbiAgICAgICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlSGlzdG9yeVNlYXJjaChNWV9VUkwpO1xcbiAgICAgICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlSGlzdG9yeVZpZXcoTVlfVVJMKTtcXG4gICAgICAgIGV2YWwoJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlSGlzdG9yeVBhbik7XFxuICAgICAgICBbJ+ebmOW6k+WQp1/nm5jlupPlkKfwn5C5X+W9seinhicsICfkuIPlkbPnvZFf5LiD5ZGz572R4pqT8J+QuV/lvbHop4YnLCAn6YeR54mM5b2x6ZmiX+mHkeeJjOW9semZovCfkLlf5b2x6KeGJywgJ+Wwj+e6ouW9seinhl/lsI/nuqLlvbHop4bwn5C5X+W9seinhicsICfkuIPnjKvlsI/or7Rf5LiD54yr5bCP6K+08J+QuV/lsI/or7QnXS5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGl0ZW0uc3BsaXQoJ18nKVswXSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGl0ZW0pID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25maWdQYXRoID0gJ2hpa2VyOi8vZmlsZXMvcnVsZXMvU3JjL0p1L2NvbmZpZy5qc29uJztcXG4gICAgICAgICAgICAgICAgICAgIGxldCBodG1sQ29uZmlnSnUgPSBmZXRjaFBDKGNvbmZpZ1BhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxDb25maWdKdSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2VLZXkgPSBpdGVtLnNwbGl0KCdfJylbMl0gKyAnc291cmNlbmFtZSc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbENvbmZpZ0p1ID0gaHRtbENvbmZpZ0p1XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFwicnVuTW9kZVxcXCI6XFxcIi4qP1xcXCIvLCBgXFxcInJ1bk1vZGVcXFwiOlxcXCIke2l0ZW0uc3BsaXQoJ18nKVsyXX1cXFwiYClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcIiR7c291cmNlS2V5fVxcXCI6XFxcIi4qP1xcXCJgKSwgYFxcXCIke2l0ZW0uc3BsaXQoJ18nKVsyXX1zb3VyY2VuYW1lXFxcIjpcXFwiJHtpdGVtLnNwbGl0KCdfJylbMV19XFxcImApO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZShjb25maWdQYXRoLCBodG1sQ29uZmlnSnUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9ob21lQOiBmumYheKImic7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KCfml6DogZrpmIXiiJrlsI/nqIvluo9+ficpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSc7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICAgIH0sIGl0ZW0pLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9KTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6ICdibGFua19ibG9jaydcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcGF0aHMuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBwYXRoc05ld1BhcmFtID0gcGF0aHMuc2xpY2UoMCwgaSArIDEpO1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgocGF0aHMsIGksIHBhdGgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IDAgJiYgIS9zaGFyZS8udGVzdChwYXRoKSAmJiAhL3NlYXJjaC8udGVzdChwYXRoc1swXS5wYXRoKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoJ3BhdGhzJyk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCAmJiAoL3NoYXJlLy50ZXN0KHBhdGgpIHx8IC9zZWFyY2gvLnRlc3QocGF0aHNbMF0ucGF0aCkpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0VmFyKCdmaWxlX2xpc3QnLCBzdG9yYWdlMC5nZXRWYXIoJ2ZpbGVfbGlzdF90bXAnKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRWYXIoJ3BhdGhzJywgcGF0aHMuc2xpY2UoMCwgaSArIDEpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICAgICAgICAgICAgICAvL31cXG4gICAgICAgICAgICAgICAgfSwgcGF0aHMsIGksIHBhdGgpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlTmV3UGFnZShwYXRoc05ld1BhcmFtKV1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSk7XFxuICAgIH1cXG5cXG4gICAgdHJ5IHtcXG4gICAgICAgIGNvbnN0IHtcXG4gICAgICAgICAgICBnZXRJY29uLFxcbiAgICAgICAgICAgIGdldEh6bSxcXG4gICAgICAgICAgICBnZXRMaW5rXFxuICAgICAgICB9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvY29kZT9ydWxlPeeZvuW6pue9keebmCcpO1xcbiAgICAgICAgaWYgKCFzdG9yYWdlMC5nZXRWYXIoJ2ZpbGVfbGlzdCcpKSB7XFxuICAgICAgICAgICAgaWYgKC9zaGFyZS8udGVzdChwYXRoKSkge1xcbiAgICAgICAgICAgICAgICB2YXIgdXJsX3RtcCA9ICdodHRwczovL3Bhbi5iYWlkdS5jb20vc2hhcmUvbGlzdD91az0nICsgZ2V0VmFyKCdzaGFyZV91aycpICsgJyZzaGFyZWlkPScgKyBnZXRWYXIoJ3NoYXJlX2lkJykgKyAnJmRpcj0nICsgcGF0aDtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB2YXIgdXJsX3RtcCA9IGJ1aWxkVXJsKCdodHRwczovL3Bhbi5iYWlkdS5jb20vcmVzdC8yLjAveHBhbi9maWxlJywge1xcbiAgICAgICAgICAgICAgICAgICAgJ2FjY2Vzc190b2tlbic6IGdldEl0ZW0oJ2FjY2Vzc190b2tlbicpLFxcbiAgICAgICAgICAgICAgICAgICAgJ21ldGhvZCc6ICdsaXN0JyxcXG4gICAgICAgICAgICAgICAgICAgICdkaXInOiBwYXRoLFxcbiAgICAgICAgICAgICAgICAgICAgJ3dlYic6ICd3ZWInLFxcbiAgICAgICAgICAgICAgICAgICAgJ2xpbWl0JzogMCxcXG4gICAgICAgICAgICAgICAgICAgICdsaW1pdCc6IDIwMFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy9sb2codXJsX3RtcCk7XFxuICAgICAgICAgICAgaWYgKC9zaGFyZS8udGVzdChwYXRoKSkge1xcbiAgICAgICAgICAgICAgICB2YXIgcmVzID0gSlNPTi5wYXJzZShyZXF1ZXN0KCdodHRwczovL3Bhbi5iYWlkdS5jb20vc2hhcmUvbGlzdD91az0nICsgZ2V0VmFyKCdzaGFyZV91aycpICsgJyZzaGFyZWlkPScgKyBnZXRWYXIoJ3NoYXJlX2lkJykgKyAnJmRpcj0nICsgcGF0aCwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICdDb29raWUnOiAnQkRDTE5EPScgKyBnZXRWYXIoJ3JhbmRzaycpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMjYuMC4wLjAgU2FmYXJpLzUzNy4zNidcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHZhciByZXMgPSBKU09OLnBhcnNlKHJlcXVlc3QodXJsX3RtcCwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29va2llOiBnZXRWYXIoJ2NrJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnbmV0ZGlzazsxMS4xMC40O1JlZG1pK0szMDthbmRyb2lkLWFuZHJvaWQ7OTtKU2JyaWRnZTQuNC4wO2pvaW50QnJpZGdlOzEuMS4wOydcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvL2xvZyhyZXMpO1xcbiAgICAgICAgICAgIGlmIChnZXRNeVZhcignbWVkaWEnLCAnMCcpID09ICcxJykge1xcbiAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IHJlcy5saXN0LmZpbHRlcihoID0+IGguY2F0ZWdvcnkgPT0gJzEnIHx8IGguaXNkaXIgPT0gJzEnIHx8IGguY2F0ZWdvcnkgPT0gJzInKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IHJlcy5saXN0O1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoL3NoYXJlLy50ZXN0KHBhdGgpKSB7XFxuICAgICAgICAgICAgICAgIGxpc3QgPSBsaXN0LmZpbHRlcih4ID0+IHguaXNkaXIgPT09IDEpLnJldmVyc2UoKS5jb25jYXQobGlzdC5maWx0ZXIoeCA9PiB4LmlzZGlyID09PSAwKS5yZXZlcnNlKCkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdmFyIGxpc3QgPSBzdG9yYWdlMC5nZXRWYXIoJ2ZpbGVfbGlzdCcpO1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dFZhcignZmlsZV9saXN0X3RtcCcsIGxpc3QpO1xcbiAgICAgICAgICAgIGNsZWFyVmFyKCdmaWxlX2xpc3QnKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxpc3QgPSBsaXN0LnNsaWNlKChNWV9QQUdFIC0gMSkgKiAyMDAsIE1ZX1BBR0UgKiAyMDApO1xcbiAgICAgICAgLy9sb2cobGlzdCk7XFxuICAgICAgICAvKmlmIChsaXN0Lmxlbmd0aCA+IDAmJnNvcnRUbXAhPTYpIHtcXG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gbGlzdCl7XFxuICAgICAgICAgICAgICAgIGlmIChsaXN0W2tdLmlzZGlyID09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGsgPT0gbGlzdC5sZW5ndGggLSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydFRtcCA9ICc2JztcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihzcyArICdfc29ydCcsICc2Jyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSovXFxuICAgICAgICBjb25zdCBnZXRTb3J0ZWRMaXN0ID0gKGxpc3QsIGtleSwgb3JkZXIsIGlzUmV2ZXJzZSkgPT4ge1xcbiAgICAgICAgICAgIHJldHVybiBzb3J0QXJyYXkobGlzdC5maWx0ZXIoeCA9PiB4LmlzZGlyID09IDEpLCBrZXksIG9yZGVyLCBpc1JldmVyc2UpXFxuICAgICAgICAgICAgICAgIC5jb25jYXQoc29ydEFycmF5KGxpc3QuZmlsdGVyKHggPT4geC5pc2RpciA9PSAwKSwga2V5LCBvcmRlciwgaXNSZXZlcnNlKSk7XFxuICAgICAgICB9O1xcbiAgICAgICAgY29uc3Qgc29ydE1hcCA9IHtcXG4gICAgICAgICAgICAnMCc6IGxpc3QgPT4gbGlzdCxcXG4gICAgICAgICAgICAnMSc6IGxpc3QgPT4gbGlzdC5maWx0ZXIoeCA9PiB4LmlzZGlyID09PSAxKS5yZXZlcnNlKCkuY29uY2F0KGxpc3QuZmlsdGVyKHggPT4geC5pc2RpciA9PT0gMCkucmV2ZXJzZSgpKSxcXG4gICAgICAgICAgICAnMic6IGxpc3QgPT4gZ2V0U29ydGVkTGlzdChsaXN0LCAnc2VydmVyX2ZpbGVuYW1lJywgMSksXFxuICAgICAgICAgICAgJzMnOiBsaXN0ID0+IGdldFNvcnRlZExpc3QobGlzdCwgJ3NlcnZlcl9maWxlbmFtZScsIDEsIDEpLFxcbiAgICAgICAgICAgICc0JzogbGlzdCA9PiBnZXRTb3J0ZWRMaXN0KGxpc3QsICdzZXJ2ZXJfZmlsZW5hbWUnLCAyKSxcXG4gICAgICAgICAgICAnNSc6IGxpc3QgPT4gZ2V0U29ydGVkTGlzdChsaXN0LCAnc2VydmVyX2ZpbGVuYW1lJywgMiwgMSksXFxuICAgICAgICAgICAgJzYnOiBsaXN0ID0+IGdldFNvcnRlZExpc3QobGlzdCwgJ3NlcnZlcl9maWxlbmFtZScsIDMpLFxcbiAgICAgICAgICAgICc3JzogbGlzdCA9PiBnZXRTb3J0ZWRMaXN0KGxpc3QsICdzZXJ2ZXJfZmlsZW5hbWUnLCAzLCAxKSxcXG4gICAgICAgICAgICAnOCc6IGxpc3QgPT4gZ2V0U29ydGVkTGlzdChsaXN0LCAnc2VydmVyX210aW1lJywgMywgMSksXFxuICAgICAgICAgICAgJzknOiBsaXN0ID0+IGdldFNvcnRlZExpc3QobGlzdCwgJ3NlcnZlcl9tdGltZScsIDMpXFxuICAgICAgICB9O1xcbiAgICAgICAgY29uc3QgX2xpc3QgPSBzb3J0VG1wID8gc29ydE1hcFtzb3J0VG1wXShsaXN0KSA6IGxpc3Q7XFxuICAgICAgICBpZiAoX2xpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgIHZhciBfbGlzdGlkID0gX2xpc3QuYXQoLTEpLnBhdGgucmVwbGFjZSgvXFxcXC9bXlxcXFwvXSskLywgXFxcIi9cXFwiKTtcXG4gICAgICAgIH1cXG4gICAgICAgIF9saXN0LmZvckVhY2goaXRlbSA9PiB7XFxuICAgICAgICAgICAgLy9sb2coaXRlbSk7XFxuICAgICAgICAgICAgaXRlbS5wYXRoID0gaXRlbS5wYXRoLnJlcGxhY2UoLyYvZywgJyUyNicpLnJlcGxhY2UoL1xcXFwrL2csICclMkInKTtcXG4gICAgICAgICAgICB2YXIgdGl0bGUgPSBpdGVtLnNlcnZlcl9maWxlbmFtZTtcXG4gICAgICAgICAgICBpZiAoc3RvcmFnZTAuZ2V0VmFyKF9saXN0aWQpICE9ICd1bmRlZmluZWQnICYmIHN0b3JhZ2UwLmdldFZhcihfbGlzdGlkKSAhPSAnJykge30gZWxzZSBpZiAoL1xcXFwubXAzJC9pLnRlc3QodGl0bGUpKSB7XFxuICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dFZhcihfbGlzdGlkLCBfbGlzdCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICh0eXBlb2YoaXRlbS50aHVtYnMpICE9ICd1bmRlZmluZWQnICYmIC9cXFxcLigzZ3B8YXZpfGY0dnxmbHZ8a3V4fG0zdTh8bTR2fG1rdnxtb3Z8bXA0fG1wZWd8bXBnfHBtcHxxc3Z8cmFtfHJtfHJtdmJ8c3dmfHRzfHdlYm18d212fGpwZ3xqcGVnfGpwZXxqeHJ8cG5nfHRpZnx0aWZmfGF2aWZ8eGJtfHBqcHxzdmd6fGljb3xzdmd8amZpZnx3ZWJwfHBqcGVnfGdpZnxpZmZ8aWxibXxwcG18cGN4fHhjZnx4cG18cHNkfG1uZ3xzYWl8cHNwfHVmbykkL2kudGVzdChpdGVtLnNlcnZlcl9maWxlbmFtZSkpIHtcXG4gICAgICAgICAgICAgICAgdmFyIGltZyA9IGl0ZW0udGh1bWJzLnVybDI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdmFyIGltZyA9IGdldEljb24oaXRlbSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChpdGVtLmlzZGlyID09IDEpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGl0ZW0sIHBhdGhzKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIS9zaGFyZXxzZWFyY2gvLnRlc3QoaXRlbS5wYXRoKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXN0b3J5ID0gc3RvcmFnZTAuZ2V0SXRlbSgnaGlzdG9yeScsIFtdKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhpc3RvcnkuaW5jbHVkZXMoaXRlbS5wYXRoKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5ID0gaGlzdG9yeS5maWx0ZXIoeCA9PiBpdGVtLnBhdGguaW5kZXhPZih4KSA9PSAtMSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnkucHVzaChpdGVtLnBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKCdoaXN0b3J5JywgaGlzdG9yeSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBpdGVtLnBhdGgsXFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5zZXJ2ZXJfZmlsZW5hbWVcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0VmFyKCdwYXRocycsIHBhdGhzKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknO1xcbiAgICAgICAgICAgICAgICB9LCBpdGVtLCBwYXRocyk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmICgvXFxcXC4oM2dwfGF2aXxmNHZ8Zmx2fGt1eHxtM3U4fG00dnxta3Z8bW92fG1wNHxtcGVnfG1wZ3xwbXB8cXN2fHJhbXxybXxybXZifHN3Znx0c3x3ZWJtfHdtdikvaS50ZXN0KHRpdGxlKSkge1xcbiAgICAgICAgICAgICAgICB2YXIgdXJsID0gZ2V0TGluaygnbW92aWUnLCBpdGVtLmZzX2lkLCBpdGVtLnBhdGgpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL1xcXFwuKGZsYWN8bTRhfG1wM3xvZ2d8b3B1c3x3YXYpL2kudGVzdCh0aXRsZSkpIHtcXG4gICAgICAgICAgICAgICAgaWYgKC9cXFxcLm1wMy9pLnRlc3QodGl0bGUpKSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gZ2V0TGluaygnbXAzJywgaXRlbS5mc19pZCwgaXRlbS5wYXRoKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSBnZXRMaW5rKCdhdWRpbycsIGl0ZW0uZnNfaWQsIGl0ZW0ucGF0aCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCgvXFxcXC4odHh0fGxvZ3xqc29ufGxyYykvaS50ZXN0KHRpdGxlKSkgfHwgKC9cXFxcLihiYXR8cmVnKS9pLnRlc3QodGl0bGUpICYmIGl0ZW0uY2F0ZWdvcnkgPT0gNikpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IGdldExpbmsoJ3R4dCcsIGl0ZW0uZnNfaWQsIGl0ZW0ucGF0aCk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmICgvXFxcXC4oanBnfGpwZWd8anBlfGp4cnxwbmd8dGlmfHRpZmZ8YXZpZnx4Ym18cGpwfHN2Z3p8aWNvfHN2Z3xqZmlmfHdlYnB8cGpwZWd8Z2lmfGlmZnxpbGJtfHBwbXxwY3h8eGNmfHhwbXxwc2R8bW5nfHNhaXxwc3B8dWZvKS9pLnRlc3QodGl0bGUpKSB7XFxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSBnZXRMaW5rKCdpbWcnLCBpdGVtLmZzX2lkLCBpdGVtLnBhdGgsIGltZyk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IGdldExpbmsoJycsIGl0ZW0uZnNfaWQsIGl0ZW0ucGF0aCwgaW1nKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLyppZiAodXJsX3RtcC5zcGxpdCgnZGlyPScpWzFdLm1hdGNoKC9cXFxcLy9nKS5sZW5ndGggPT0gMSkge1xcbiAgICAgICAgICAgICAgICBwdXRNeVZhcignY3R5cGUnLCAnYXZhdGFyJyk7XFxuICAgICAgICAgICAgfSovXFxuICAgICAgICAgICAgdmFyIGN0eXBlID0gZ2V0TXlWYXIoJ2JhaWR1Y3R5cGUnKTtcXG4gICAgICAgICAgICBpZiAoIWN0eXBlKSB7XFxuICAgICAgICAgICAgICAgIGN0eXBlID0gZ2V0TXlWYXIocGF0aCArICdjdHlwZScsICdhdmF0YXInKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdmFyIHNqID0gdGltZXN0YW1wVG9EYXRlKHBhcnNlSW50KGl0ZW0uc2VydmVyX210aW1lKSAqIDEwMDApO1xcbiAgICAgICAgICAgIHZhciBkZXNjID0gIWl0ZW0uaXNkaXIgPyBnZnMoaXRlbS5zaXplKSA6IHNqO1xcbiAgICAgICAgICAgIGlmIChjdHlwZSA9PSAnYXZhdGFyJykge1xcbiAgICAgICAgICAgICAgICB0aXRsZSA9IGNvbG9yUih0aXRsZSwgJ0ZGMzM5OScpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R5cGUgPT0gJ21vdmllXzFfdmVydGljYWxfcGljJykge1xcbiAgICAgICAgICAgICAgICB0aXRsZSA9IGNvbG9yKHRpdGxlLCAnRkYzMzk5Jyk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdmFyIHpodWFuY3VuID0gZnVuY3Rpb24odWssIHNoYXJlaWQsIGZzX2lkLCByYW5kc2spIHtcXG4gICAgICAgICAgICAgICAgdmFyIGh0bWwgPSByZXF1ZXN0KCdodHRwczovL3Bhbi5iYWlkdS5jb20vc2hhcmUvdHJhbnNmZXInLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnQW5kcm9pZCcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly9wYW4uYmFpZHUuY29tJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29va2llJzogZ2V0SXRlbSgnQkRVU1MnKSArICc7ICcgKyAnQkRDTE5EPScgKyByYW5kc2ssXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogJ2Zyb209JyArIHVrICsgJyZzaGFyZWlkPScgKyBzaGFyZWlkICsgJyZvbmR1cD1uZXdjb3B5JnBhdGg9L+aIkeeahOi1hOa6kC8mZnNpZGxpc3Q9WycgKyBmc19pZCArICddJyxcXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB2YXIgaHRtbDEgPSBKU09OLnBhcnNlKGh0bWwpXFxuICAgICAgICAgICAgICAgIGlmIChodG1sMS5lcnJubyA9PSAnMCcpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0KCflt7LovazlrZgnKVxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdG9hc3QoaHRtbDEuc2hvd19tc2cpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdmFyIHNoYW5jaHUgPSBmdW5jdGlvbihwYXRoKSB7XFxuICAgICAgICAgICAgICAgIHZhciBodG1sID0gcmVxdWVzdCgnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL2FwaS9maWxlbWFuYWdlcj9vcGVyYT1kZWxldGUmY2xpZW50dHlwZT0xJywge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ0FuZHJvaWQnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdDb29raWUnOiBnZXRJdGVtKCdCRFVTUycpICsgJzsgJyArIGdldEl0ZW0oJ1NUT0tFTicpLFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6ICdmaWxlbGlzdD1bXFxcIicgKyBwYXRoICsgJ1xcXCJdJyxcXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB2YXIgaHRtbDEgPSBKU09OLnBhcnNlKGh0bWwpO1xcbiAgICAgICAgICAgICAgICBpZiAoaHRtbDEuZXJybm8gPT0gJzAnKSB7XFxuICAgICAgICAgICAgICAgICAgICB0b2FzdCgn5bey5Yig6ZmkJylcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0KCfliKDpmaTlpLHotKUnKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHZhciByZW5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi5paH5Lu25ZCN5Yqg5paH5Lu25ZCO57yAXFxcIikuaW5wdXQoKHBhdGgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXNraWQgPSBKU09OLnBhcnNlKHJlcXVlc3QoJ2h0dHBzOi8vcGFuLmJhaWR1LmNvbS9hcGkvZmlsZW1hbmFnZXI/b3BlcmE9cmVuYW1lJmNsaWVudHR5cGU9MScsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ0FuZHJvaWQnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29va2llJzogZ2V0SXRlbSgnQkRVU1MnKSArICc7ICcgKyBnZXRJdGVtKCdTVE9LRU4nKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6ICdmaWxlbGlzdD1be1xcXCJwYXRoXFxcIjpcXFwiJyArIHBhdGgucmVwbGFjZSgvJi9nLCAnJTI2JykgKyAnXFxcIixcXFwibmV3bmFtZVxcXCI6XFxcIicgKyBpbnB1dCArICdcXFwifV0mYXN5bmM9MicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICAgICAgICAgIH0pKS50YXNraWQ7XFxuXFxuICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IHJlcXVlc3QoJ2h0dHBzOi8vcGFuLmJhaWR1LmNvbS9hcGkvdGFza3F1ZXJ5P3Rhc2tpZD0nICsgdGFza2lkICsgJyZjbGllbnR0eXBlPTEnLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdBbmRyb2lkJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Nvb2tpZSc6IGdldEl0ZW0oJ0JEVVNTJykgKyAnOyAnICsgZ2V0SXRlbSgnU1RPS0VOJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbDEgPSBKU09OLnBhcnNlKGh0bWwpXFxuICAgICAgICAgICAgICAgICAgICBpZiAoaHRtbDEuZXJybm8gPT0gJzAnKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoJ+W3sumHjeWRveWQjScpXFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KCfph43lkb3lkI3lpLHotKUnKVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgfSwgcGF0aCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHZhciB5bHh6ID0gZnVuY3Rpb24ocGF0aCwgcmVzdHZpKSB7XFxuICAgICAgICAgICAgICAgIHZhciBiZHR2aSA9IHJlcXVlc3QoJ2h0dHBzOi8vZC5wY3MuYmFpZHUuY29tL3Jlc3QvMi4wL3Bjcy9maWxlP2FwcF9pZD0yNTA1MjgmbWV0aG9kPWxvY2F0ZWRvd25sb2FkJnBhdGg9JyArIGVuY29kZVVSSUNvbXBvbmVudChwYXRoKSArICcmY2xpZW50dHlwZT0xNyZ2ZXJzaW9uPTIuMi45MS4xMzYmdXNlPTEnLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0Nvb2tpZSc6IGdldEl0ZW0oXFxcIkJEVVNTXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnbmV0ZGlzaztQMlNQOzIuMi45MS4xMzY7bmV0ZGlzazsxMS4zMC4yOzIyMDIxMjExUkM7YW5kcm9pZC1hbmRyb2lkOzEyO0pTYnJpZGdlNC40LjA7am9pbnRCcmlkZ2U7MS4xLjA7J1xcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCdcXG4gICAgICAgICAgICAgICAgfSk7IC8vbG9nKGJkdHZpKVxcbiAgICAgICAgICAgICAgICB2YXIgcmVzdHZpID0gSlNPTi5wYXJzZShiZHR2aSkudXJsc1swXS51cmw7IC8vbG9nKHJlc3R2aSlcXG4gICAgICAgICAgICAgICAgdmFyIGZwYXRoID0gKHBhdGgubWF0Y2goL1xcXFwvL2cpIHx8IFtdKS5sZW5ndGggPD0gMSA/IFxcXCLova/ku7ZcXFwiIDogcGF0aC5tYXRjaCgvXFxcXC8oLiopXFxcXC8vKVsxXVxcbiAgICAgICAgICAgICAgICB2YXIgcmVzdHZpID0gKHBhdGgubWF0Y2goL1xcXFwvL2cpIHx8IFtdKS5sZW5ndGggPD0gMSA/IHJlc3R2aS5yZXBsYWNlKCdtdF9zY2VuZScsICdmcGF0aD0nICsgZnBhdGggKyAnJm10X3NjZW5lJykgOiByZXN0dmk7XFxuICAgICAgICAgICAgICAgIC8vbG9nKHJlc3R2aSlcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQocmVzdHZpLCBcXFwi5LiL6L295Zyw5Z2AXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgdG9hc3QoXFxcIuW8gOWni+S4i+i9veaWh+S7tlxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIEJhaWR1TXVsdGlUaHJlYWRlZERvd25sb2FkZXIgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkJhaWR1TXVsdGlUaHJlYWRlZERvd25sb2FkZXJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCYWlkdU11bHRpVGhyZWFkZWREb3dubG9hZGVyLmRvd25sb2FkRmlsZShpbnB1dCwgXFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvZG93bmxvYWQvXFxcIiwgbnVsbCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwibmV0ZGlzaztQMlNQOzIuMi45MS4xMzY7bmV0ZGlzazsxMS4zMC4yOzIyMDIxMjExUkM7YW5kcm9pZC1hbmRyb2lkOzEyO0pTYnJpZGdlNC40LjA7am9pbnRCcmlkZ2U7MS4xLjA7XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlJhbmdlXFxcIjogXFxcIjAtMVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZENvdW50OiA2XFxuICAgICAgICAgICAgICAgICAgICB9KSA/IFxcXCJ0b2FzdDovL+S4i+i9veWujOaIkFxcXCIgOiBcXFwidG9hc3Q6Ly/or7fnrYnlvoXkuIvovb3nu5PmnZ9cXFwiO1xcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoL3NoYXJlLy50ZXN0KHBhdGgpKSB7XFxuICAgICAgICAgICAgICAgIHZhciBleHRyYSA9IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiB1cmwsXFxuICAgICAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfovazlrZjmkq3mlL4nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCh1aywgc2hhcmVpZCwgZnNfaWQsIHJhbmRzaywgdGl0bGUsIHpodWFuY3VuLCBnZXRMaW5rKSA9PiB7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpodWFuY3VuKHVrLCBzaGFyZWlkLCBmc19pZCwgcmFuZHNrKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0VmFyKCdwYXRocycsIFt7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnLycsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAn8J+PoCdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJy/miJHnmoTotYTmupAvJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICfmiJHnmoTotYTmupAnXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBnZXRWYXIoJ3NoYXJlX3VrJyksIGdldFZhcignc2hhcmVfaWQnKSwgaXRlbS5mc19pZCwgZ2V0VmFyKCdyYW5kc2snKSwgaXRlbS5zZXJ2ZXJfZmlsZW5hbWUsIHpodWFuY3VuLCBnZXRMaW5rKVxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn6L2s5a2YJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygodWssIHNoYXJlaWQsIGZzX2lkLCByYW5kc2ssIHpodWFuY3VuKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpodWFuY3VuKHVrLCBzaGFyZWlkLCBmc19pZCwgcmFuZHNrKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBnZXRWYXIoJ3NoYXJlX3VrJyksIGdldFZhcignc2hhcmVfaWQnKSwgaXRlbS5mc19pZCwgZ2V0VmFyKCdyYW5kc2snKSwgemh1YW5jdW4pXFxuICAgICAgICAgICAgICAgICAgICB9XVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdmFyIGV4dHJhID0ge1xcbiAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5Yig6ZmkJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoaXRlbSwgc2hhbmNodSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xvZyhpdGVtLnBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFuY2h1KGl0ZW0ucGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBpdGVtLCBzaGFuY2h1KVxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn6YeN5ZG95ZCNJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoaXRlbSwgcmVuYW1lKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZW5hbWUoaXRlbS5wYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBpdGVtLCByZW5hbWUpXFxuICAgICAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfkuIvovb0nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtLCB5bHh6KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5bHh6KGl0ZW0ucGF0aCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgaXRlbSwgeWx4eilcXG4gICAgICAgICAgICAgICAgICAgIH1dXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgZXh0cmEubG9uZ0NsaWNrLnVuc2hpZnQoe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+agt+W8jycsXFxuICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgY3R5cGVUbXAgPSBnZXRNeVZhcihwYXRoICsgJ2N0eXBlSW5kZXgnLCAnMCcpO1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN0eXBlU3R5bGUgPSBbJ2F2YXRhcicsICdtb3ZpZV8xX3ZlcnRpY2FsX3BpYycsICdtb3ZpZV8xJywgJ21vdmllXzInLCAnbW92aWVfMycsICdwaWNfMV9jZW50ZXInLCAncGljXzFfZnVsbCcsICdwaWNfMScsICdwaWNfMicsICdwaWNfMycsICdwaWNfMV9jYXJkJywgJ3BpY18yX2NhcmQnLCAncGljXzFfY2VudGVyJywgJ2NhcmRfcGljXzEnLCAnY2FyZF9waWNfMicsICforr7nva7lhajlsYDmoLflvI8nLCAn5Y+W5raI5YWo5bGA5qC35byPJ107XFxuICAgICAgICAgICAgICAgICAgICBjdHlwZVN0eWxlW2N0eXBlVG1wXSA9ICfinqHvuI8nICsgY3R5cGVTdHlsZVtjdHlwZVRtcF07XFxuICAgICAgICAgICAgICAgICAgICBzaG93U2VsZWN0T3B0aW9ucyh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLpgInmi6nmoLflvI9cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogMixcXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBjdHlwZVN0eWxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKChwYXRoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PSAn6K6+572u5YWo5bGA5qC35byPJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ2JhaWR1Y3R5cGUnLCBnZXRNeVZhcihwYXRoICsgJ2N0eXBlJywgJ2F2YXRhcicpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PSAn5Y+W5raI5YWo5bGA5qC35byPJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcignYmFpZHVjdHlwZScpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGF0aCArICdjdHlwZUluZGV4JywgTVlfSU5ERVgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGF0aCArICdjdHlwZScsIGlucHV0LnJlcGxhY2UoJ+Keoe+4jycsICcnKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHBhdGgpXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIHBhdGgpLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxldCBzdHlsZUFjdGlvbiA9IHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IChnZXRNeVZhcignYmFpZHVjdHlwZScpID8gJ+KdjCDlj5bmtojlhajlsYDmoLflvI8nIDogJ+KclO+4jyDorr7nva7lhajlsYDmoLflvI8nKSxcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHBhdGgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRNeVZhcignYmFpZHVjdHlwZScpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcignYmFpZHVjdHlwZScpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcignYmFpZHVjdHlwZScsIGdldE15VmFyKHBhdGggKyAnY3R5cGUnLCAnYXZhdGFyJykpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgfSwgcGF0aCksXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBleHRyYS5sb25nQ2xpY2suc3BsaWNlKDEsIDAsIHN0eWxlQWN0aW9uKTtcXG4gICAgICAgICAgICBpZiAoaXRlbS5pc2RpciA9PSAxKSB7XFxuICAgICAgICAgICAgICAgIGxldCBwYXRoc0l0ZW1OZXdUbXAgPSBwYXRocy5zbGljZSgpO1xcbiAgICAgICAgICAgICAgICBwYXRoc0l0ZW1OZXdUbXAucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBpdGVtLnBhdGgsXFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLnBhdGguc3BsaXQoJy8nKS5hdCgtMSlcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIGxldCBwYXRoc05ld1BhcmFtID0gcGF0aHNJdGVtTmV3VG1wO1xcbiAgICAgICAgICAgICAgICBleHRyYS5sb25nQ2xpY2sucHVzaCgkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVOZXdQYWdlKHBhdGhzTmV3UGFyYW0pKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKC9waWMvLnRlc3QoY3R5cGUpKSB7XFxuICAgICAgICAgICAgICAgIGltZyA9IGltZy5yZXBsYWNlKC9jXFxcXGQrX3VcXFxcZCsvLCAnYzMwMDBfdTIwMDAnKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICBkZXNjOiBkZXNjLFxcbiAgICAgICAgICAgICAgICBpbWc6IGltZyxcXG4gICAgICAgICAgICAgICAgdXJsOiB1cmwsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBjdHlwZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IGV4dHJhXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9KTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUubWVzc2FnZSlcXG4gICAgICAgIHRvYXN0KCflh7rnjrDplJnor6/vvIzor7fmn6XnnIvml6Xlv5cnKVxcbiAgICB9XFxuICAgIC8vfVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcInNlYXJjaFwiLFwicGF0aFwiOlwic2VhcmNoXCIsXCJydWxlXCI6XCJqczpcXG5yYyhmZXRjaFBDKCdodHRwczovL2dpdGVlLmNvbS9taXN0eXdhdGVyL2hpa2VyX2luZm8vcmF3L21hc3Rlci9naXRodWJwcm94eS5qc29uJykgKyAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21pc3R5d2F0ZXIvaGlrZXIvbWFpbi9mJywgMjQpO1xcbnZhciBkID0gW107XFxubGV0IGhvc3QgPSAnYmFpZHV5dW5wYW4nO1xcbmNvbnN0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9Mb3lEZ0lrL2FsaVNpbXBsZVJ1bGVzLmpzb25cXFwiO1xcbmxldCBqc29uU2VhcmNoID0gSlNPTi5wYXJzZShyZWFkRmlsZShwYXRoKSB8fCBcXFwiW11cXFwiKTtcXG5sZXQgbG9jYWxTZWFyY2ggPSB7XFxuICAgIHRpdGxlOiAn55uY5bqT5ZCnJua3t+WQiOebmCZUVuaQnCblsI/lhZTmkJznm5gm5bqm55uY5pCcJuW9seebmOekvibkuIPlkbPnvZEmRFlEJyxcXG4gICAgaWQ6ICdodHRwczovL3Bhbmt1OC5jb20maHR0cHM6Ly9odW5oZXBhbi5jb20maHR0cHM6Ly93d3cudHZzby51ayZodHRwczovL3hpYW90dXNvc28uY29tJmh0dHBzOi8veXN4amprbC5zb3V5aXNvdS50b3AmaHR0cHM6Ly93d3cubWVsb3N0LmNuJmh0dHBzOi8vd3d3LnFubXA0LmNvbSZodHRwOi8vd3d3LmR5ZGhoeS5jb20nXFxufTtcXG5cXG5mdW5jdGlvbiB5YW56aGVuZyhzdHIsIHVybCwgdCwgcykge1xcbiAgICBpZiAoIXQpIHQgPSBob3N0O1xcbiAgICBpZiAoIXMpIHtcXG4gICAgICAgIHMgPSAn5ri45oiPJztcXG4gICAgfVxcbiAgICByZXR1cm4gJC50b1N0cmluZygoc3RyLCB1cmwsIHQsIHMpID0+IHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJjigJjigJnigJk8c3Ryb25nPjxmb250IGNvbG9yPSBcXFwiI0ZGMDAwMFxcXCI+JyArICfngrnlh7vmkJzntKInLFxcbiAgICAgICAgICAgIHVybDogJCgnaGlrZXI6Ly9lbXB0eScpLnJ1bGUoKHN0ciwgdXJsLCB0LCBzKSA9PiB7XFxuICAgICAgICAgICAgICAgIHZhciBkID0gW107XFxuXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3g1X3dlYnZpZXdfc2luZ2xlJyxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogJ2xpc3QmJnNjcmVlbicsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHVhOiBNT0JJTEVfVUEsXFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoc3RyLCB1cmwsIHQsIHMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VhcmNoLXdvcmQnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dEVsZW1lbnQpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEVsZW1lbnQudmFsdWUgPSBzO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWFyY2hCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VhcmNoLWJ0bicpOyAvLyDpgJrov4fpgInmi6nlmajojrflj5bmkJzntKLmjInpkq5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hCdXR0b24uY2xpY2soKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNoZWNrKCkge1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzdHIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVzICYmIG5vZGVzLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5wdXRWYXIodCArIHMsIGN1cnJlbnRVcmwpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5wYXJzZUxhenlSdWxlKCQkJCgpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrLCA1MDApO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgc3RyLCB1cmwsIHQsIHMpLFxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldFJlc3VsdChkKTtcXG4gICAgICAgICAgICB9LCBzdHIsIHVybCwgdCwgcyksXFxuICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbiAgICAgICAgfSk7XFxuICAgIH0sIHN0ciwgdXJsLCB0LCBzKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0SHRtbENvbnRlbnQodXJsUywgdSkge1xcbiAgICBsZXQgaHRtbCA9IGdldE15VmFyKHVybFMpO1xcbiAgICBpZiAoIWh0bWwpIHtcXG4gICAgICAgIGh0bWwgPSBmZXRjaFBDKHVybFMpO1xcbiAgICAgICAgcHV0TXlWYXIodXJsUywgaHRtbCk7XFxuICAgIH1cXG4gICAgcmV0dXJuIGh0bWw7XFxufVxcbmlmIChNWV9QQUdFID09IDEpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn8J+UjScsXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcoKHIsIG15VVJMKSA9PiB7XFxuICAgICAgICAgICAgaWYgKCFpbnB1dCkge1xcbiAgICAgICAgICAgICAgICBjbGVhclZhcigncGF0aHMnKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ2tleXdvcmQnLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuc3RvcmVIaXN0b3J5U2VhcmNoKGlucHV0KTtcXG4gICAgICAgICAgICAgICAgbG9nKG15VVJMKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuY29kZVBhcnNlU2VhcmNoVXJsKGlucHV0LCBteVVSTCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgTVlfUlVMRS50aXRsZSwgTVlfVVJMKSxcXG4gICAgICAgIGRlc2M6ICflhbPplK7or418QOWFs+mUruivjXzliIbkuqvpk77mjqV856m655m9Oua4hemZpCcsXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ2tleXdvcmQnLCAn5ri45oiPJyksXFxuICAgICAgICB9XFxuICAgIH0pO1xcblxcbiAgICBsZXQgZGF0YUNsYXNzID0gW3tcXG4gICAgICAgIHRpdGxlOiBsb2NhbFNlYXJjaC50aXRsZSArIGpzb25TZWFyY2gubWFwKGggPT4gJyYnICsgaC5uYW1lKS5qb2luKCcnKSxcXG4gICAgICAgIGlkOiBsb2NhbFNlYXJjaC5pZCArIGpzb25TZWFyY2gubWFwKGggPT4gJyYnICsgaC5iYXNpY1VybCkuam9pbignJyksXFxuICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiAn57u85ZCI5YWo6YOoJueZvuW6puS6keebmCblpLjlhYvkupHnm5gm6Zi/6YeM5LqR55uYJlVD572R55uYJui/hembt+e9keebmCYxMTXnvZHnm5gm5aSp57+8572R55uYJyxcXG4gICAgICAgIGlkOiAnJmJhaWR1JnF1YXJrJmFsaSZ1YyZ4dW5sZWkmMTE1cGFuJnRpYW55aSdcXG4gICAgfSwge1xcbiAgICAgICAgdGl0bGU6ICfnu7zlkIgm5paH5Lu25aS5JuaWh+ahoybop4bpopEm5Zu+54mHJuWOi+e8qeWMhSbpn7PpopEm5YW25a6DJyxcXG4gICAgICAgIGlkOiAnJmZvbGRlciZkb2MmdmlkZW8maW1hZ2UmcGFja2FnZSZtdXNpYyZvdGhlcidcXG4gICAgfV07XFxuICAgIGRhdGFDbGFzcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xcbiAgICAgICAgY2xhc3NUb3AoaW5kZXgsIGl0ZW0sIGhvc3QsIGQsIDEsIDAsICdjJywgJycsICcnLCAwLCAwKTtcXG4gICAgfSk7XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogJ2JsYW5rX2Jsb2NrJ1xcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn8J+UjScsXFxuICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKG15VVJMKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGlucHV0ID0gZ2V0VmFyKCdrZXl3b3JkJywgJ+a4uOaIjycpO1xcbiAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVQYXJzZVNlYXJjaFVybChpbnB1dCwgbXlVUkwpO1xcbiAgICAgICAgfSwgTVlfVVJMKSxcXG4gICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXG4gICAgfSk7XFxuXFxuICAgICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuY29kZUhpc3RvcnlTZWFyY2goTVlfVVJMKTtcXG4gICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlSGlzdG9yeVZpZXcoTVlfVVJMKTtcXG4gICAgZXZhbCgkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVIaXN0b3J5UGFuKTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnYmxhbmtfYmxvY2snXFxuICAgIH0pO1xcbn1cXG5sZXQgaW5kZXggPSBnZXRNeVZhcihob3N0ICsgJ2NpbmRleDAnLCAnMCcpO1xcbmxldCBjMCA9IGdldE15VmFyKGhvc3QgKyAnYzAnLCAnaHR0cHM6Ly9wYW5rdTguY29tJyk7XFxudmFyIGJhc2ljVXJsID0gYzA7XFxubGV0IGMxID0gZ2V0TXlWYXIoaG9zdCArICdjMScsICcnKTtcXG5sZXQgYzIgPSBnZXRNeVZhcihob3N0ICsgJ2MyJywgJycpO1xcbmxldCB1cmxTO1xcbnZhciBzID0gZ2V0VmFyKCdrZXl3b3JkJywgJ+a4uOaIjycpLnRyaW0oKTtcXG5sZXQga2V5d29yZCA9IHM7XFxudmFyIHBhZ2UgPSBNWV9QQUdFO1xcbmxldCBodG1sO1xcbnN3aXRjaCAoYzApIHtcXG4gICAgY2FzZSAnaHR0cHM6Ly93d3cudHZzby51ayc6XFxuICAgICAgICB7ICAgXFxuICAgICAgICAgICAgdXJsUyA9ICdodHRwczovL3d3dy50dnNvLnVrL3M/cXVlcnk9JyArIGtleXdvcmQ7XFxuICAgICAgICAgICAgbG9nKHVybFMpO2h0bWwgPSBnZXRIdG1sQ29udGVudCh1cmxTKTtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IHBkZmEoaHRtbCwgJ2JvZHkmJi53LWZ1bGwucHgtMy5weS0zJyk7XFxuICAgICAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgobGlzdCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHBkKGxpc3QsICdhJiZocmVmJywgYzApO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcGRmaChsaXN0LCAnLmZvbnQtbWVkaXVtLmJyZWFrLWFsbC53aGl0ZXNwYWNlLW5vcm1hbCYmVGV4dCcpO1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9KCdbJyt0aXRsZS5zbGljZSgwLDIpKyddICcpLnN0cm9uZ1IoJzAwOTk5OScpK3RpdGxlLnNsaWNlKDIpLnJlcGxhY2UobmV3IFJlZ0V4cChnZXRWYXIoJ2tleXdvcmQnKSwgJ2dpJyksIG0gPT4gY29sb3JSKG0sICdGRjAwMDAnKSk7XFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2Rlc2M6ICBwZGZoKGxpc3QsICcjY2FsZW5kYXImJlRleHQnKS5zcGxpdCgnICcpWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZzpwZChsaXN0LCAnaW1nJiZzcmMnLGMwKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQodXJsICsgJyNub0hpc3RvcnkjJykubGF6eVJ1bGUoKHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBodG1sID0gZmV0Y2hQQyhpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gaHRtbC5tYXRjaCgvXFxcInF1YXJrTGluay4qPyhodHRwLio/KVxcXFxcXFxcLylbMV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuc3RvcmVIaXN0b3J5VmlldyhpbnB1dCwgdGl0bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlUGFyc2VVcmwoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRpdGxlKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2F2YXRhcicsXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgY2FzZSAnaHR0cHM6Ly94aWFvdHVzb3NvLmNvbSc6XFxuICAgICAgICB7ZXZhbChnZXRDcnlwdG9KUygpKTtcXG4gICAgICAgICAgICBjMSA9ICdhbGknID09IGMxID8gJ0FMWScgOiAoJ2JhaWR1JyA9PSBjMSA/ICdCRFknIDogKCdxdWFyaycgPT0gYzEgPyAnUVVBUksnIDogKCd4dW5sZWknID09IGMxID8gJ1hVTkxFSScgOiAnQUxMJykpKTtcXG4gICAgICAgICAgICBjMiA9IGMyID09ICdvdGhlcicgPyAnc29mdHdhcmUnIDogYzI7XFxuICAgICAgICAgICAgdXJsUyA9IGBodHRwczovL3hpYW90dXNvc28uY29tL2FwaS9leHRyYS9kaXNrL3NlYXJjaD9ib2R5PXtcXFwicGFnZVxcXCI6JHtwYWdlfSxcXFwic2l6ZVxcXCI6MjAsXFxcInFcXFwiOlxcXCIke2tleXdvcmR9XFxcIixcXFwidHlwZVxcXCI6XFxcIiR7YzF9XFxcIixcXFwic2hhcmVfdGltZVxcXCI6XFxcIkFMTFxcXCIsXFxcImZvcm1hdFxcXCI6XFxcIiR7YzJ9XFxcIixcXFwibW9kZVxcXCI6XFxcImV4YWN0XFxcIixcXFwiZ2F0ZXdheVxcXCI6XFxcIkcxXFxcIn1gOyAgICAgICAgICAgIFxcbiAgICAgICAgICAgIGxvZyh1cmxTKTtcXG4gICAgICAgICAgICB2YXIgYm9keT1KU09OLnBhcnNlKGB7XFxcImZvcm1hdFxcXCI6XFxcIiR7YzJ9XFxcIixcXFwiZ2F0ZXdheVxcXCI6XFxcIkcxXFxcIixcXFwibW9kZVxcXCI6XFxcImV4YWN0XFxcIixcXFwicGFnZVxcXCI6JHtwYWdlfSxcXFwicVxcXCI6XFxcIiR7a2V5d29yZH1cXFwiLFxcXCJzaGFyZV90aW1lXFxcIjpcXFwiQUxMXFxcIixcXFwic2l6ZVxcXCI6MjAsXFxcInR5cGVcXFwiOlxcXCIke2MxfVxcXCJ9YCk7XFxuICAgICAgICAgICAgbG9nKGJvZHkpO1xcbiAgICAgICAgICAgIGxldCBzID0gRGF0ZS5ub3coKS50b1N0cmluZygpO1xcbiAgICAgICAgICAgIGxldCB4ID0gKGUsIHMsIHQpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGwgPSBPYmplY3Qua2V5cyhlKS5zb3J0KCkubWFwKHMgPT4gXFxcIlxcXCIuY29uY2F0KHMsIFxcXCI9XFxcIikuY29uY2F0KGVbc10pKS5qb2luKFxcXCImXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBhID0gXFxcIlxcXCIuY29uY2F0KGwsIFxcXCImdGltZXN0YW1wPVxcXCIpLmNvbmNhdChzLCBcXFwiJmFwcF9rZXk9XFxcIikuY29uY2F0KHQpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gQ3J5cHRvSlMuU0hBMjU2KGEpLnRvU3RyaW5nKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIFxcbiAgICAgICAgICAgIGxldCB0ID0geChib2R5LCBzLCBcXFwiWUpDU1hETFxcXCIpO1xcbiAgICAgICAgICAgIGh0bWwgPSBwb3N0KCdodHRwczovL3hpYW90dXNvc28uY29tL2FwaS9leHRyYS9kaXNrL3NlYXJjaCcse1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOntcXG4gICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOidhcHBsaWNhdGlvbi9qc29uJyxcXG4gICAgICAgICAgICAgICAgICAgICdjb29raWUnOidfZ2E9R0ExLjEuMzYwNTQ0NjAwLjE3NDcxMTk5MDk7IF9nYV9YRjVWUU05UkpOPUdTMi4xLnMxNzQ4MjQ4NDAwJG81JGcxJHQxNzQ4MjQ4NDU0JGowJGwwJGgwJyxcXG4gICAgICAgICAgICAgICAgICAgICdyZWZlcmVyJzonaHR0cHM6Ly94aWFvdHVzb3NvLmNvbS8nLFxcbiAgICAgICAgICAgICAgICAgICAgJ3gtdGltZXN0YW1wJzpzLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIlgtU2lnblxcXCI6IHRcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgIGJvZHk6SlNPTi5zdHJpbmdpZnkoYm9keSksXFxuICAgICAgICAgICAgfSk7IFxcbiAgICAgICAgICAgICAgICB0cnl7bGV0IGxpc3QgPSBKU09OLnBhcnNlKGh0bWwpLnJlc3VsdC5saXN0O1xcbiAgICAgICAgICAgICAgICBsaXN0LmZvckVhY2goKGxpc3QpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBsaXN0Lmxpbms7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBsaXN0LmRpc2tfbmFtZS5yZXBsYWNlKC88XFxcXC8/ZW0+L2csJycpO1xcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUucmVwbGFjZShuZXcgUmVnRXhwKGdldFZhcigna2V5d29yZCcpLCAnZ2knKSwgbSA9PiBjb2xvclIobSwgJ0ZGMDAwMCcpKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBsaXN0LnVwZGF0ZV90aW1lLnNwbGl0KCcgJylbMF0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nOmltZ0Nsb3VkU3RvcmFnZShsaXN0LmxpbmspLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCh1cmwgKyAnI25vSGlzdG9yeSMnKS5sYXp5UnVsZSgodGl0bGUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ9aW5wdXQucmVwbGFjZSgvIy4rLywnJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5zdG9yZUhpc3RvcnlWaWV3KGlucHV0LCB0aXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVQYXJzZVVybChpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGl0bGUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9KTt9Y2F0Y2goZSl7fVxcbiAgICAgICAgIFxcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgfVxcbiAgICBjYXNlICdodHRwczovL3d3dy5idXl1dHUuY29tJzpcXG4gICAgICAgIHtjMT1jMT09J2FsaSc/J2FsaXBhbic6YzE7XFxuICAgICAgICAgICAgYzIgPSAhYzIgPyAnJyA6IChjMiA9PSAndmlkZW8nID8gJzAnIDogKGMyID09ICdpbWFnZScgPyAnMScgOiAoYzIgPT0gJ2RvYycgPyAnMicgOiAoYzIgPT0gJ211c2ljJyA/ICczJyA6IChjMiA9PSAncGFja2FnZScgPyAnNCcgOiAoYzIgPT0gJ2ZvbGRlcicgPyAnZGlyJyA6ICc1JykpKSkpKTtcXG4gICAgICAgICAgICB1cmxTID0gJ2h0dHBzOi8vd3d3LmJ1eXV0dS5jb20vcy8nICsgYmFzZTY0RW5jb2RlKGtleXdvcmQpICsgJz9kaXNrdHlwZT0nICsgYzEgKyAnJnR5cGU9JyArIGMyICsgJyZwPScgKyBwYWdlO1xcbiAgICAgICAgICAgIHVybFM9dXJsUy5yZXBsYWNlKC9kaXNrdHlwZT0mfHR5cGU9Ji9nLCcmJyk7XFxuICAgICAgICAgICAgbG9nKHVybFMpO2h0bWwgPSBnZXRIdG1sQ29udGVudCh1cmxTKTtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IHBkZmEoaHRtbCwgJ2JvZHkmJiNsaXN0Jyk7XFxuICAgICAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgobGlzdCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHBkKGxpc3QsICdhJiZocmVmJywgYzApO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcGRmaChsaXN0LCAnYSYmdGl0bGUnKTtcXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cChnZXRWYXIoJ2tleXdvcmQnKSwgJ2dpJyksIG0gPT4gY29sb3JSKG0sICdGRjAwMDAnKSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogIHBkZmgobGlzdCwgJyNjYWxlbmRhciYmVGV4dCcpLnNwbGl0KCcgJylbMF0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nOmltZ0Nsb3VkU3RvcmFnZShwZGZoKGxpc3QsICcjY2xvdWQmJlRleHQnKSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKHVybCArICcjbm9IaXN0b3J5IycpLmxhenlSdWxlKCh0aXRsZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IGZldGNoUEMoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IHBkZmgoaHRtbCwgJyNiYmI0JiZhJiZocmVmJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuc3RvcmVIaXN0b3J5VmlldyhpbnB1dCwgdGl0bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlUGFyc2VVcmwoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRpdGxlKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2F2YXRhcicsXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgY2FzZSAnaHR0cHM6Ly95c3hqamtsLnNvdXlpc291LnRvcCc6XFxuICAgICAgICB7XFxuICAgICAgICAgICAgdXJsUyA9ICdodHRwczovL3lzeGpqa2wuc291eWlzb3UudG9wLz9zZWFyY2g9JyArIGtleXdvcmQgKyAnJmxpbWl0PTUwJyArICcmcGFnZT0nICsgcGFnZTtcXG4gICAgICAgICAgICBsb2codXJsUyk7aHRtbCA9IGdldEh0bWxDb250ZW50KHVybFMpO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGxldCBsaXN0ID0gcGRmYShodG1sLCAnYm9keSYmI3NlYXJjaFdyYXBwZXImJi5ib3gnKTtcXG4gICAgICAgICAgICAgICAgbGlzdC5mb3JFYWNoKChsaXN0KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gcGQobGlzdCwgJ2EmJmhyZWYnLCBjMCk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBwZGZoKGxpc3QsICcuaW5mbyYmVGV4dCcpLnJlcGxhY2UoL1tcXFxcc10r6ZO+5o6lLiovLCAnJyk7XFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAoZ2V0VmFyKCdrZXl3b3JkJyksICdnaScpLCBtID0+IGNvbG9yUihtLCAnRkYwMDAwJykpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6ICcnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZzppbWdDbG91ZFN0b3JhZ2UodXJsKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQodXJsICsgJyNub0hpc3RvcnkjJykubGF6eVJ1bGUoKHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3BsaXQoJyMnKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5zdG9yZUhpc3RvcnlWaWV3KGlucHV0LCB0aXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVQYXJzZVVybChpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGl0bGUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgfVxcbiAgICBjYXNlICdodHRwczovL3d3dy5xbm1wNC5jb20nOlxcbiAgICAgICAge1xcblxcbiAgICAgICAgICAgIHVybFMgPSBgaHR0cHM6Ly93d3cucW5tcDQuY29tL3ZzLyR7a2V5d29yZH0tLS0tLS0tLS0tJHtNWV9QQUdFfS0tLS5odG1sYDtcXG4gICAgICAgICAgICBodG1sID0gcmVxdWVzdCh1cmxTLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdDb29raWUnOiBnZXRWYXIoYzAgKyAnY2snLCAnJyksXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBpZiAoL+i+k+WFpemqjOivgeeggXzns7vnu5/lronlhajpqozor4EvLnRlc3QoaHRtbCkpIHtcXG4gICAgICAgICAgICAgICAgTVlfVVJMID0gdXJsUztcXG4gICAgICAgICAgICAgICAgeWFuemhlbmdkKGQsICcuYnJlYWRjcnVtYnMnLCB1cmxTLCBjMCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgbGlzdCA9IHBkZmEoaHRtbCwgJy5zcl9saXN0cyYmbGknKTtcXG4gICAgICAgICAgICAgICAgbGlzdC5mb3JFYWNoKChsaXN0KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGxpc3QsICdoMyYmVGV4dCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IHBkZmgobGlzdCwgJ3AmJlRleHQnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBwZGZoKGxpc3QsIFxcXCIucDAmJlRleHRcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWc6IHBkZmgobGlzdCwgJ2ltZyYmZGF0YS1vcmlnaW5hbHx8c3JjJykgKyAnQFJlZmVyZXI9JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQoJ2hpa2VyOi8vZW1wdHkjI2h0dHBzOi8vd3d3LnFubXA0LmNvbScgKyBwZGZoKGxpc3QsICdhJiZocmVmJykpLnJ1bGUoKGMwKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjKGZjKCdodHRwczovL2dpdGVlLmNvbS9taXN0eXdhdGVyL2hpa2VyX2luZm8vcmF3L21hc3Rlci9naXRodWJwcm94eS5qc29uJykgKyAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21pc3R5d2F0ZXIvaGlrZXIvbWFpbi9mJywgMjQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNWV9VUkwgPSBNWV9VUkwuc3BsaXQoJyMjJylbMV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChNWV9VUkwsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29va2llJzogZ2V0VmFyKGMwICsgJ2NrJywgJycpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydodHRwczovL3d3dy5hbGlwYW4nLCAnaHR0cHM6Ly9wYW4uYmFpZHUnLCAnaHR0cHM6Ly9kcml2ZS51YycsICdtYWduZXQ6P3h0PSddLmZvckVhY2goKGl0LCBpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDw9IDIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdEV4dGVuZEl0ZW1zID0gcGRmYShodG1sLCBgYm9keSYmLmdkdC5jb250ZW50OmhhcyhhW2hyZWZePScke2l0fSddKSYmbGlgKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RFeHRlbmRJdGVtcyA9IHBkZmEoaHRtbCwgYGJvZHkmJi5nZHQuY29udGVudDpoYXMoYVtocmVmXj0nJHtpdH0nXSlgKS5tYXAoaCA9PiBwZGZhKGgsICdib2R5JiZsaScpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0RXh0ZW5kSXRlbXMgPSBsaXN0RXh0ZW5kSXRlbXMuZmxhdChJbmZpbml0eSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdEV4dGVuZEl0ZW1zLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGVFeHRlbmRJdGVtcyA9IGluZGV4ID09IDAgPyAn6Zi/6YeM572R55uYJyA6IChpbmRleCA9PSAxID8gJ+eZvuW6pue9keebmCcgOiAoaW5kZXggPT0gMiA/ICdVQ+e9keebmCcgOiAoJ+ejgeWKmycpKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogc3Ryb25nUih0aXRsZUV4dGVuZEl0ZW1zLCAnMDdhN2UxJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZzogJ2hpa2VyOi8vaW1hZ2VzL2ljb25fZG93bjUnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2ljb24nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEV4dGVuZEl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChpdGVtLCAnYm9keSYmVGV4dCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQocGRmaChpdGVtLCAnYSYmaHJlZicpKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoL2JhaWR1Ly50ZXN0KGlucHV0KSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dFZhcigndXJsQmFpZHUnLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvbGlzdD9ydWxlPeeZvuW6pue9keebmCZyZWFsdXJsPVxcXCIgKyBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoL2FsaXl1bmRyaXZlfGFsaXBhbnxxdWFya3x1Y1xcXFwuLy50ZXN0KGlucHV0KSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5L6d6LWWOiAnaHR0cHM6Ly9jb2RlYmVyZy5vcmcvc3JjNDg1OTc5NjIvaGsvcmF3L2JyYW5jaC9KdS9TcmNQYXJzZVMuanMnXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKGNvbmZpZy7kvp3otZYubWF0Y2goL2h0dHAocyk/OlxcXFwvXFxcXC8uKlxcXFwvLylbMF0gKyAnU3JjUGFyc2VTLmpzJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNyY1BhcnNlUy7ogZrpmIUoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfMScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmxlbmd0aCA8PSAyKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBzdHJvbmdSKHBkZmgoaHRtbCwgJy5weS10YWJzJiZvcHRpb24mJlRleHQnKSwgJzA3YTdlMScpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZzogJ2hpa2VyOi8vaW1hZ2VzL2ljb25fZG93bjUnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHknLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9pY29uJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBwZGZhKGh0bWwsICdib2R5JiYucGxheWVyLWFsbC11bCYmbGkmJmEnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgobGlzdCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGxpc3QsICdib2R5JiZUZXh0JyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJChwZChsaXN0LCAnYSYmaHJlZicpKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IGZldGNoUEMoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC9yIHBsYXllcl8vLnRlc3QoaHRtbCkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoaHRtbC5tYXRjaCgvciBwbGF5ZXJfLio/PSguKj8pPC8pWzFdKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsX3QgPSBqc29uLnVybDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNvbi5lbmNyeXB0ID09ICcxJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxfdCA9IHVuZXNjYXBlKHVybF90KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpzb24uZW5jcnlwdCA9PSAnMicpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsX3QgPSB1bmVzY2FwZShiYXNlNjREZWNvZGUodXJsX3QpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSAndmlkZW86Ly8nICsgdXJsX3Q7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gJ3ZpZGVvOi8vJyArIGlucHV0O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdmbGV4X2J1dHRvbicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQoZCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgYzApLFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG5cXG4gICAgY2FzZSAnaHR0cHM6Ly93d3cubWVsb3N0LmNuJzpcXG4gICAgICAgIHtcXG4gICAgICAgICAgICBjMSA9IC9hbGkvLnRlc3QoYzEpID8gJ0FMWScgOiAoL2JhaWR1Ly50ZXN0KGMxKSA/ICdCRFknIDogKC9xdWFyay8udGVzdChjMSkgPyAnUVVBUksnIDogKC91Yy8udGVzdChjMSkgPyAnVUMnIDogKC94dW5sZWkvLnRlc3QoYzEpID8gJ1hVTkxFSScgOicnKSkpKTtcXG4gICAgICAgICAgICB1cmxTID0gJ2h0dHBzOi8vd3d3Lm1lbG9zdC5jbi9zZWFyY2g/ZXhhY3Q9dHJ1ZSZxPScgKyBrZXl3b3JkICsgJyZ0eXBlPScgKyBjMSArICcmZm9ybWF0PScgKyBjMiArICcmcGFnZT0nICsgcGFnZTtcXG4gICAgICAgICAgICBsb2codXJsUyk7aHRtbCA9IGdldEh0bWxDb250ZW50KHVybFMpO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGxldCBsaXN0ID0gcGRmYShodG1sLCAnYm9keSYmLnJtLXNlYXJjaC1jb250ZW50PmRpdicpO1xcbiAgICAgICAgICAgICAgICBsaXN0LmZvckVhY2goKGxpc3QpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBwZChsaXN0LCAnYSYmaHJlZicsIGMwKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHBkZmgobGlzdCwgJ2EmJnRpdGxlJyk7XFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAoZ2V0VmFyKCdrZXl3b3JkJyksICdnaScpLCBtID0+IGNvbG9yUihtLCAnRkYwMDAwJykpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6ICcnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZzppbWdDbG91ZFN0b3JhZ2UodXJsKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQodXJsICsgJyNub0hpc3RvcnkjJykubGF6eVJ1bGUoKHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3BsaXQoJyMnKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5zdG9yZUhpc3RvcnlWaWV3KGlucHV0LCB0aXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVQYXJzZVVybChpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGl0bGUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgfVxcbiAgICBjYXNlICdodHRwczovL3Bhbmt1OC5jb20nOlxcbiAgICAgICAge1xcbiAgICAgICAgICAgIGMxID0gL2FsaS8udGVzdChjMSkgPyAnLzMnIDogKC9iYWlkdS8udGVzdChjMSkgPyAnLzEnIDogKC9xdWFyay8udGVzdChjMSkgPyAnLzInIDogKC91Yy8udGVzdChjMSkgPyAnLzcnIDogJy8wJykpKTtcXG4gICAgICAgICAgICB1cmxTID0gJ2h0dHBzOi8vcGFua3U4LmNvbS9zLycgKyBrZXl3b3JkICsgYzEgKyAnLycgKyBwYWdlO1xcbiAgICAgICAgICAgIGxvZyh1cmxTKTtodG1sID0gZ2V0SHRtbENvbnRlbnQodXJsUyk7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBwZGZhKGh0bWwsICdib2R5JiYubXQtMj5hJyk7XFxuICAgICAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgobGlzdCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHBkKGxpc3QsICdhJiZocmVmJywgYzApO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcGRmaChsaXN0LCAnLmZzLTUmJlRleHQnKTtcXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cChnZXRWYXIoJ2tleXdvcmQnKSwgJ2dpJyksIG0gPT4gY29sb3JSKG0sICdGRjAwMDAnKSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogIHBkZmgobGlzdCwgJy5hbGlnbi1pdGVtcy1jZW50ZXIsLTEmJlRleHQnKS5zcGxpdCgnICcpWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZzppbWdDbG91ZFN0b3JhZ2UocGRmaChsaXN0LCAnLnRleHQtc3VjY2VzcyYmVGV4dCcpKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQodXJsICsgJyNub0hpc3RvcnkjJykubGF6eVJ1bGUoKHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBodG1sID0gZmV0Y2hQQyhpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gcGRmaChodG1sLCAnLmNvcHktdXJsJiZhLC0xJiZocmVmJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuc3RvcmVIaXN0b3J5VmlldyhpbnB1dCwgdGl0bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlUGFyc2VVcmwoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRpdGxlKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2F2YXRhcicsXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgY2FzZSAnaHR0cHM6Ly9taWFvc291LmZ1bic6XFxuICAgICAgICB7XFxuICAgICAgICAgICAgbGV0IGtleSA9IFxcXCI0T1RvU2NVRk9hZVZUckhFXFxcIjtcXG4gICAgICAgICAgICBsZXQgaXYgPSBcXFwiOUNMR2FvMXZIS3FtMTdPelxcXCI7XFxuICAgICAgICAgICAgdXJsUyA9ICdodHRwczovL21pYW9zb3UuZnVuL2FwaS9zZWNlbmRzZWFyY2g/bmFtZT0nICsga2V5d29yZCArICcmcGFnZU5vPScgKyBNWV9QQUdFICsgJyZ0eXBlPScgKyBjMiArICcmZnJvbT0nICsgYzE7XFxuICAgICAgICAgICAgbG9nKHVybFMpO1xcbiAgICAgICAgICAgIGh0bWwgPSBnZXRIdG1sQ29udGVudCh1cmxTKTtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoaHRtbCk7XFxuICAgICAgICAgICAgICAgIGxldCBsaXN0ID0ganNvbi5kYXRhLmxpc3Q7XFxuICAgICAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgobGlzdCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGRlKGtleSwgaXYsIGxpc3QudXJsLCAnQUVTL0NCQy9QS0NTN1BhZGRpbmcnKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGxpc3QubmFtZS5yZXBsYWNlKC88Lio/Pi9nLCAnJyk7XFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAoZ2V0VmFyKCdrZXl3b3JkJyksICdnaScpLCBtID0+IGNvbG9yUihtLCAnRkYwMDAwJykpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IGxpc3QuZnJvbS5yZXBsYWNlKC9hbGkuKi8sICfpmL/ph4zkupHnm5gnKS5yZXBsYWNlKC9iYWlkdS4qLywgJ+eZvuW6pue9keebmCcpLnJlcGxhY2UoL3F1YXJrLiovLCAn5aS45YWL572R55uYJykucmVwbGFjZSgvdWMuKi8sICdVQ+e9keebmCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCh1cmwgKyAnI25vSGlzdG9yeSMnKS5sYXp5UnVsZSgodGl0bGUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5zdG9yZUhpc3RvcnlWaWV3KGlucHV0LCB0aXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVQYXJzZVVybChpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGl0bGUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgfVxcbiAgICBjYXNlICdodHRwczovL3d3dy5jb2RlbGljZW5jZS5jbic6XFxuICAgICAgICB7XFxuICAgICAgICAgICAgdXJsUyA9IGMwICsgJy8nICsgcyArICc/cGFnZT0nICsgcGFnZTtcXG4gICAgICAgICAgICBsb2codXJsUyk7XFxuICAgICAgICAgICAgaWYgKGdldE15VmFyKGhvc3QgKyB1cmxTKSAmJiAvZGF0YV9zaXplLy50ZXN0KGdldE15VmFyKGhvc3QgKyB1cmxTKSkpIHtcXG4gICAgICAgICAgICAgICAgaHRtbCA9IGdldE15VmFyKGhvc3QgKyB1cmxTKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBpZiAocGFnZSA9PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICBldmFsKHlhbnpoZW5nKCcucicsIGMwLCBjMCwgcykpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCByZWRpcmVjdFVybCA9IGdldFZhcihjMCArIHMpO1xcbiAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RVcmwpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hVcmwgPSByZWRpcmVjdFVybCArIFxcXCI/cD1cXFwiICsgcGFnZTtcXG4gICAgICAgICAgICAgICAgICAgIGh0bWwgPSByZXF1ZXN0KHNlYXJjaFVybCk7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihob3N0ICsgdXJsUywgaHRtbCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGFyciA9IHBkZmEoaHRtbCwgXFxcImJvZHkmJi5saXN0JiZ1bFxcXCIpO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgICAgICAgICAgICAgbGV0IHV0aXRsZSA9IHBkZmgoaXQsIFxcXCJhJiZUZXh0XFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCB1c2VyaWFsID0gcGRmaChpdCwgXFxcImxpJiZkYXRhX3NpemVcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwZChpdCwgXFxcImEmJmhyZWZcXFwiLCBjMCk7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdXRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cChnZXRWYXIoJ2tleXdvcmQnKSwgJ2dpJyksIG0gPT4gY29sb3IobSwgJ0ZGMDAwMCcpKSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogJCh1KS5sYXp5UnVsZSgoYzAsIHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybHJlZCA9IGMwICsgcGRmaChyZXF1ZXN0KGlucHV0KSwgXFxcIi5kb3duJiZhJiZocmVmXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KHVybHJlZCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IEpTT04ucGFyc2UoaHRtbCkuaGVhZGVycy5sb2NhdGlvblswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLnN0b3JlSGlzdG9yeVZpZXcodXJsLCB0aXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuY29kZVBhcnNlVXJsKHVybCk7XFxuICAgICAgICAgICAgICAgICAgICB9LCBjMCwgdXRpdGxlKSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHVzZXJpYWwsXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfMScsXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgY2FzZSAnaHR0cHM6Ly9odW5oZXBhbi5jb20nOlxcbiAgICAgICAge1xcbiAgICAgICAgICAgIGxldCB0ID0gYzEgPT0gJycgPyAnJyA6IChjMSA9PSAnYmFpZHUnID8gJ0JEWScgOiAoYzEgPT0gJ3F1YXJrJyA/ICdRVUFSSycgOiAoYzEgPT0gJ2FsaScgPyAnQUxZJyA6IChjMSA9PSAndWMnID8gJ1VDJyA6IChjMSA9PSAneHVubGVpJyA/ICdYVU5MRUknOicnKSkpKSk7XFxuICAgICAgICAgICAgdXJsUyA9IGBodHRwczovL2h1bmhlcGFuLmNvbS9zZWFyY2g/ZnJvbT13ZWImcT0ke2tleXdvcmR9JnBhZ2U9JHtwYWdlfSZzaXplPTUwJnR5cGU9JHt0fWA7XFxuICAgICAgICAgICAgbG9nKHVybFMpO1xcbiAgICAgICAgICAgIGh0bWwgPSBnZXRNeVZhcih1cmxTKTtcXG4gICAgICAgICAgICBpZiAoIWh0bWwpIHtcXG4gICAgICAgICAgICAgICAgaHRtbCA9IHBvc3QoJ2h0dHBzOi8vaHVuaGVwYW4uY29tL3YxL3NlYXJjaD9mcm9tPXdlYicsIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVyOiBcXFwiaHR0cHM6Ly9odW5oZXBhbi5jb20vXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IGB7XFxcInFcXFwiOlxcXCIke2tleXdvcmR9XFxcIixcXFwiZXhhY3RcXFwiOmZhbHNlLFxcXCJwYWdlXFxcIjoke01ZX1BBR0V9LFxcXCJzaXplXFxcIjoxNSxcXFwidHlwZVxcXCI6XFxcIiR7dH1cXFwiLFxcXCJ0aW1lXFxcIjpcXFwiXFxcIixcXFwiZnJvbVxcXCI6XFxcIndlYlxcXCIsXFxcInVzZXJfaWRcXFwiOjAsXFxcImZpbHRlclxcXCI6dHJ1ZX1gLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIodXJsUywgaHRtbCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShodG1sKTtcXG4gICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBqc29uLmRhdGEubGlzdC5maWx0ZXIoeCA9PiAhL+OAkOW5tOi0p+iKguOAkS8udGVzdCh4LmRpc2tfbmFtZSkpO1xcbiAgICAgICAgICAgICAgICBsaXN0LmZvckVhY2gobGlzdCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBsaXN0LmRpc2tfbmFtZS5yZXBsYWNlKC88ZW0+KC4qPyk8XFxcXC9lbT4vZywgbSA9PiBjb2xvclIobS5yZXBsYWNlKC88XFxcXC8/ZW0+L2csICcnKSwgJ0ZGMDAwMCcpKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiAnJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpbWc6aW1nQ2xvdWRTdG9yYWdlKGxpc3QubGluayksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKGxpc3QubGluayArICcjbm9IaXN0b3J5IycpLmxhenlSdWxlKCh0aXRsZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLnN0b3JlSGlzdG9yeVZpZXcoaW5wdXQsIHRpdGxlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuY29kZVBhcnNlVXJsKGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBsaXN0LmRpc2tfbmFtZS5yZXBsYWNlKC88XFxcXC8/ZW0+L2csICcnKSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdhdmF0YXInLFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICB9XFxuICAgIGNhc2UgJ2h0dHA6Ly93d3cuZHlkaGh5LmNvbSc6XFxuICAgICAgICB7XFxuICAgICAgICAgICAgdXJsUyA9IGBodHRwOi8vd3d3LmR5ZGhoeS5jb20vcGFnZS8ke3BhZ2V9Lz9zPSR7c31gO1xcbiAgICAgICAgICAgIGxvZyh1cmxTKTtcXG4gICAgICAgICAgICBodG1sID0gZ2V0SHRtbENvbnRlbnQodXJsUyk7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBwZGZhKGh0bWwsICcuY29udGVudC1saXN0JiYucG9zdCcpO1xcbiAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgobGlzdCkgPT4ge1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHBkZmgobGlzdCwgXFxcIi5lbnRyeS10aXRsZSYmVGV4dFxcXCIpLnJlcGxhY2UoXFxcIumYv+mHjOS6keebmCAtIFxcXCIsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHBkZmgobGlzdCwgXFxcIi5lbnRyeS1zdW1tYXJ5JiZUZXh0XFxcIiksXFxuICAgICAgICAgICAgICAgICAgICBpbWc6IHBkZmgobGlzdCwgXFxcImltZyYmZGF0YS1zcmN8fHNyY1xcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAkKCdoaWtlcjovL2VtcHR5IyMnICsgcGRmaChsaXN0LCBcXFwiYSYmaHJlZlxcXCIpICsgJyNub0hpc3RvcnkjJykucnVsZSgoYzApID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByYyhmYygnaHR0cHM6Ly9naXRlZS5jb20vbWlzdHl3YXRlci9oaWtlcl9pbmZvL3Jhdy9tYXN0ZXIvZ2l0aHVicHJveHkuanNvbicpICsgJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9taXN0eXdhdGVyL2hpa2VyL21haW4vZicsIDI0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBNWV9VUkwgPSBNWV9VUkwuc3BsaXQoJyMjJylbMV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoTVlfVVJMKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGVQYWdlID0gcGRmaChodG1sLCAnaDEuZW50cnktdGl0bGUmJlRleHQnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGRmYShodG1sLCAnYm9keSYmZmllbGRzZXQnKS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZmEoaHRtbCwgJ2JvZHkmJmZpZWxkc2V0JykuZm9yRWFjaCgoaXQsIGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBzdHJvbmdSKChpbmRleCA9PSAwID8gJ+e9keebmOS4i+i9vScgOiAn56OB5Yqb5LiL6L29JyksICcwN2E3ZTEnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWc6ICdoaWtlcjovL2ltYWdlcy9pY29uX2Rvd241JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfaWNvbicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZmEoaXQsICdib2R5JiZmaWVsZHNldD4qJykuc2xpY2UoMSkuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZGZhKGl0ZW0sICdib2R5JiZsaScpLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmYShpdGVtLCAnYm9keSYmbGknKS5mb3JFYWNoKChsaSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogc21hbGwocGRmaChsaSwgJ2JvZHkmJlRleHQnKSwgNTU1NTU1KSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQocGRmaChsaSwgJ2EmJmhyZWYnKSkubGF6eVJ1bGUoKHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xpc3RzP3J1bGU955m+5bqm572R55uYXFxcIikuc3RvcmVIaXN0b3J5VmlldyhpbnB1dCwgdGl0bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlUGFyc2VVcmwoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRpdGxlUGFnZSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzEnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmw7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZGZoKGl0ZW0sICdhJiZocmVmJykpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9ICQocGRmaChpdGVtLCAnYSYmaHJlZicpKS5sYXp5UnVsZSgodGl0bGUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLnN0b3JlSGlzdG9yeVZpZXcoaW5wdXQsIHRpdGxlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5jb2RlUGFyc2VVcmwoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGl0bGVQYWdlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9ICdoaWtlcjovL2VtcHR5JztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHBkZmgoaXRlbSwgJ2EmJmhyZWYnKSA/IHNtYWxsKHBkZmgoaXRlbSwgJ2JvZHkmJlRleHQnKSwgNTU1NTU1KSA6IHNtYWxsKHBkZmgoaXRlbSwgJ2JvZHkmJlRleHQnKSwgJzA3YTdlMScpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfMScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZhKGh0bWwsICdib2R5JiYuZW50cnktY29udGVudD4qJykuZmlsdGVyKHggPT4gIS9zdHlsZXxkaXYvLnRlc3QoeCkpLmZvckVhY2goaXRlbSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkZmgoaXRlbSwgJ2EmJmhyZWYnKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHBkZmgoaXRlbSwgJ2EmJmhyZWYnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHdkID0gL3BhblxcXFwuYmFpZHUvLnRlc3QoaXRlbSkgJiYgIS9wd2QvLnRlc3QodXJsKSAmJiAv5a+G56CBLy50ZXN0KGl0ZW0pID8gcGRmaChpdGVtLCAnYm9keSYmVGV4dCcpLm1hdGNoKC/lr4bnoIEuKj8oW2EtejAtOV17NH0pLylbMV0gOiAnJztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBwd2QgPyB1cmwgKyAnP3B3ZD0nICsgcHdkIDogdXJsO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9ICQodXJsKS5sYXp5UnVsZSgodGl0bGUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvbGlzdHM/cnVsZT3nmb7luqbnvZHnm5hcXFwiKS5zdG9yZUhpc3RvcnlWaWV3KGlucHV0LCB0aXRsZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9saXN0cz9ydWxlPeeZvuW6pue9keebmFxcXCIpLmNvZGVQYXJzZVVybChpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGl0bGVQYWdlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gJ2hpa2VyOi8vZW1wdHknO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChpdGVtLCAnYSYmaHJlZicpID8gc21hbGwocGRmaChpdGVtLCAnYm9keSYmVGV4dCcpLCA1NTU1NTUpIDogc21hbGwocGRmaChpdGVtLCAnYm9keSYmVGV4dCcpLCAnMDdhN2UxJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzEnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2JpZ19iaWdfYmxhbmtfYmxvY2snLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnYmlnX2JpZ19ibGFua19ibG9jaycsXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KGQpO1xcbiAgICAgICAgICAgICAgICAgICAgfSwgYzApLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgZGVmYXVsdDpcXG4gICAgICAgIHtcXG4gICAgICAgICAgICAvL3RyeSB7XFxuICAgICAgICAgICAgZnVuY3Rpb24gY29udmVydFRvVGVtcGxhdGVTdHJpbmcoY29kZSkge1xcbiAgICAgICAgICAgICAgICBsZXQgdGVtcGxhdGVTdHJpbmcgPSBjb2RlXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFxcXFxcXFwiL2csICdcXFwiJylcXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXFxcXFxcXFwuL2csICdcXFxcLicpXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFxcXFxcXFxcXFxcXFxcXFwvL2csICdcXFxcXFxcXC8nKVxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcXFxcbi9nLCAnXFxcXG4nKVxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL15cXFwifFxcXCIkL2csICcnKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlU3RyaW5nO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBmdW5jdGlvbiBwYXJzZUZpbmQoanNvbmRhdGEpIHtcXG4gICAgICAgICAgICAgICAganNvbmRhdGEgPSBgXFxuICAgICAgICAgICAgICAgIHZhciBiYXNpY1VybCA9ICR7SlNPTi5zdHJpbmdpZnkoYmFzaWNVcmwpfTtcXG4gICAgICAgICAgICAgICAgbGV0IHMgPSAke0pTT04uc3RyaW5naWZ5KHMpfTtcXG4gICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSAke0pTT04uc3RyaW5naWZ5KHBhZ2UpfTtcXG4gICAgICAgICAgICAgICAgJHtqc29uZGF0YX1cXG4gICAgICAgICAgICBgO1xcbiAgICAgICAgICAgICAgICAvL2xvZyhqc29uZGF0YSk7XFxuICAgICAgICAgICAgICAgIGxldCBldmFsRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYFxcbiAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uKCkge1xcbiAgICAgICAgICAgICAgICAgICAgJHtqc29uZGF0YX1cXG4gICAgICAgICAgICAgICAgfSkoKTtcXG4gICAgICAgICAgICBgKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV2YWxGdW5jdGlvbigpOztcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gZGVhbFJ1bGVGb3JIdG1sKGh0bWwsIHJ1bGUsIGJhc2ljVXJsKSB7XFxuICAgICAgICAgICAgICAgIGlmICghcnVsZSkgcmV0dXJuO1xcbiAgICAgICAgICAgICAgICBydWxlID0gcnVsZS5zcGxpdChcXFwiQGpzPVxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZTAgPSBydWxlLmF0KDApO1xcbiAgICAgICAgICAgICAgICBsZXQgdCA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICBpZiAocnVsZTApIHtcXG4gICAgICAgICAgICAgICAgICAgIHQgPSBwZGZoKGh0bWwsIHJ1bGUwKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHQgPSBodG1sO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChydWxlLmxlbmd0aCA+IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oXFxcImlucHV0XFxcIiwgXFxcIiQkXFxcIiwgXFxcImJhc2ljVXJsXFxcIiwgJ1xcXCJ1c2Ugc3RyaWN0XFxcIjtyZXR1cm4gJyArIHJ1bGUuYXQoMSkpKHQsIGh0bWwsIGJhc2ljVXJsKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4gdDtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gcGFyc2VTZWFyY2hIdG1sKHVybCwgcnVsZSkge1xcbiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IGZldGNoKHVybCk7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHJ1bGUuc3BsaXQoXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBsaXN0ID0gcGRmYShodG1sLCBydWxlcy5hdCgwKSk7XFxuICAgICAgICAgICAgICAgIGlmICghbGlzdCB8fCAhQXJyYXkuaXNBcnJheShsaXN0KSkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCJIVE1MOuWIl+ihqOino+aekOS4uuepulxcXCIpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gW107XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJsID0gZGVhbFJ1bGVGb3JIdG1sKGl0LCBydWxlcy5hdCgyKSwgdXJsKTtcXG4gICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGRlYWxSdWxlRm9ySHRtbChpdCwgcnVsZXMuYXQoMSksIHVybCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBjdXJsLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSA/IGN1cmwgOiAoZ2V0SG9tZSh1cmwpICsgY3VybCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogZGVhbFJ1bGVGb3JIdG1sKGl0LCBydWxlcy5hdCgzKSwgdXJsKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBkZWFsUnVsZUZvckh0bWwoaXQsIHJ1bGVzLmF0KDQpLCB1cmwpLFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIC8vdHJ5IHtcXG5cXG4gICAgICAgICAgICB2YXIganNvbmRhdGEgPSBqc29uU2VhcmNoW2luZGV4IC0gbG9jYWxTZWFyY2gudGl0bGUuc3BsaXQoJyYnKS5sZW5ndGhdO1xcbiAgICAgICAgICAgIGJhc2ljVXJsID0ganNvbmRhdGEuYmFzaWNVcmw7XFxuICAgICAgICAgICAgbGV0IGRhdGFGaW5kQWxpVXJsO1xcbiAgICAgICAgICAgIGxldCBkYXRhRmluZCA9IFtdO1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBiYXNpY1VybC5yZXBsYWNlKCcqKicsIHMpLnJlcGxhY2UoJ2Z5cGFnZScsIHBhZ2UpO1xcbiAgICAgICAgICAgIGxvZyh1cmwpO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGlmIChqc29uZGF0YS5ydWxlVHlwZSA9PSAnSFRNTCcpIHtcXG4gICAgICAgICAgICAgICAgICAgIGRhdGFGaW5kID0gcGFyc2VTZWFyY2hIdG1sKHVybCwganNvbmRhdGEuZmluZCk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBkYXRhRmluZCA9IHBhcnNlRmluZChqc29uZGF0YS5maW5kKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBcXG4gICAgICAgICAgICAgICAgZGF0YUZpbmQgPSBkYXRhRmluZC5maWx0ZXIoeCA9PiAvaHR0cHxtYWduZXQvLnRlc3QoeC51cmwpKTtcXG4gICAgICAgICAgICAgICAgZGF0YUZpbmQuZm9yRWFjaChpdCA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdHh0TGF6eVJ1bGUgPSBcXFwiQGxhenlSdWxlPS5qczooXFxcXG4oKSA9PiB7XFxcXG5sZXQgdGl0bGU9aW5wdXQuc3BsaXQoJ0BAJylbMV07aW5wdXQ9aW5wdXQuc3BsaXQoJ0BAJylbMF07XFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0eHRIaXN0b3J5VmlldyA9IFxcXCI7bGV0IGhpc3RvcnlWaWV3ID0gc3RvcmFnZTAuZ2V0SXRlbSgnaGlzdG9yeVZpZXcnLCBbXSk7XFxcXG5pZiAoIWhpc3RvcnlWaWV3LmluY2x1ZGVzKHRpdGxlKydAQCcraW5wdXQpKSB7XFxcXG5oaXN0b3J5Vmlldy5wdXNoKHRpdGxlKydAQCcraW5wdXQpO1xcXFxufVxcXFxuc3RvcmFnZTAuc2V0SXRlbSgnaGlzdG9yeVZpZXcnLCBoaXN0b3J5Vmlldyk7XFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0eHRQYXJzZVVybCA9ICdpZiAoL2JhaWR1Ly50ZXN0KGlucHV0KSkge3B1dFZhcihcXFwidXJsQmFpZHVcXFwiLCBpbnB1dCk7cmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvbGlzdD9ydWxlPeeZvuW6pue9keebmCZyZWFsdXJsPVxcXCIgKyBpbnB1dDt9IGVsc2Uge2lmICgvYWxpeXVuZHJpdmV8YWxpcGFufHF1YXJrfHVjXFxcXFxcXFwuLy50ZXN0KGlucHV0KSkge2NvbnN0IGNvbmZpZyA9IHvkvp3otZY6IFxcXCJodHRwczovL2NvZGViZXJnLm9yZy9zcmM0ODU5Nzk2Mi9oay9yYXcvYnJhbmNoL0p1L1NyY1BhcnNlUy5qc1xcXCJ9O3JlcXVpcmUoY29uZmlnLuS+nei1li5tYXRjaCgvaHR0cChzKT86XFxcXFxcXFwvXFxcXFxcXFwvLipcXFxcXFxcXC8vKVswXSArIFxcXCJTcmNQYXJzZVMuanNcXFwiKTtyZXR1cm4gU3JjUGFyc2VTLuiBmumYhShpbnB1dCk7fSBlbHNlIGlmKC8oeHVubGVpfGVkMms6fGJ0OnxmdHA6fFxcXFxcXFxcLnRvcnJlbnR8bWFnbmV0KS8udGVzdChpbnB1dCkpe3JldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2RpYW95b25nP3J1bGU96L+F6Zu3JnBhZ2U9ZnlwYWdlI1xcXCIraW5wdXQ7fSBlbHNlIGlmKC9tYWduZXQvLnRlc3QoaW5wdXQpKXtyZXR1cm4gaW5wdXQ7fWVsc2Uge3ZhciBodG1sPWZldGNoUEMoaW5wdXQpO2lmKC9yIHBsYXllcl8vLnRlc3QoaHRtbCkpe3ZhciBqc29uPUpTT04ucGFyc2UoaHRtbC5tYXRjaCgvciBwbGF5ZXJfLio/PSguKj8pPC8pWzFdKTt2YXIgdXJsX3Q9anNvbi51cmw7aWYoanNvbi5lbmNyeXB0PT1cXFwiMVxcXCIpe3VybF90PXVuZXNjYXBlKHVybF90KTt9ZWxzZSBpZihqc29uLmVuY3J5cHQ9PVxcXCIyXFxcIil7dXJsX3Q9dW5lc2NhcGUoYmFzZTY0RGVjb2RlKHVybF90KSk7fXJldHVybiBcXFwidmlkZW86Ly9cXFwiK3VybF90O31lbHNle3JldHVybiBcXFwidmlkZW86Ly9cXFwiK2lucHV0O319fX0pKCknO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR4dElucHV0RGVhbCA9ICc7aWYodHlwZW9mKGlucHV0KT09XFxcXFxcXCJvYmplY3RcXFxcXFxcIil7aW5wdXQ9aW5wdXRbMF07fSc7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0LmltZyAmJiAhaXQucGljX3VybCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LmNvbF90eXBlID0gJ3RleHRfMSc7ICB9ICAgICAgICAgICAgICBcXG4gICAgICAgICAgICAgICAgICAgIGl0LnVybCA9IGl0LnVybCArICdAQCcgKyBpdC50aXRsZTtcXG4gICAgICAgICAgICAgICAgICAgIGl0LnVybCA9IGl0LnVybCArIHR4dExhenlSdWxlO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFqc29uZGF0YS5maW5kQWxpVXJsKSB7XFxuXFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpzb25kYXRhLnJ1bGVUeXBlICE9ICdIVE1MJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LnVybCA9IGl0LnVybCArIGpzb25kYXRhLmZpbmRBbGlVcmwucmVwbGFjZSgvcmV0dXJuLywgJ2lucHV0PScpICsgdHh0SW5wdXREZWFsO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqc29uZGF0YS5maW5kQWxpVXJsLnN0YXJ0c1dpdGgoXFxcIkBqcz1cXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LnVybCA9IGl0LnVybCArICdpbnB1dD0nICsganNvbmRhdGEuZmluZEFsaVVybC5yZXBsYWNlKC9AanM9LywgJycpICsgdHh0SW5wdXREZWFsO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoL1xcXFwuanMvLnRlc3QoanNvbmRhdGEuZmluZEFsaVVybCkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpzID0ganNvbmRhdGEuZmluZEFsaVVybC5zcGxpdCgnLmpzOicpWzFdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzID0gJ2lucHV0JztcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgaXQudXJsID0gaXQudXJsICsgJ2lucHV0PXBkZmgoZmV0Y2goaW5wdXQpLFxcXCInICsganNvbmRhdGEuZmluZEFsaVVybC5zcGxpdCgnLmpzJylbMF0gKyAnXFxcIik7JyArICdpbnB1dD0nICsganMgKyB0eHRJbnB1dERlYWw7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBpdC51cmwgPSBpdC51cmwgKyB0eHRIaXN0b3J5VmlldyArIHR4dFBhcnNlVXJsO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgaWYgKGRhdGFGaW5kLmxlbmd0aCAhPSAwKSB7XFxuICAgICAgICAgICAgICAgICAgICBkID0gZC5jb25jYXQoZGF0YUZpbmQpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ35+fuayoeacieS6hn5+ficsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ35+fuayoeacieS6hn5+ficsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbn1cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLor7TmmI5cIixcInBhdGhcIjpcIuivtOaYjlwiLFwicnVsZVwiOlwianM6XFxubGV0IHRpbWUgPSBnZXRJdGVtKFxcXCJmaXJzdFxcXCIsIFxcXCJcXFwiKSA/IDYgOiAyMDtcXG5sZXQgaWQgPSBEYXRlLm5vdygpO1xcbmxldCBjb250ZW50ID0gYFxcbiAgICAxLiDmnKzlsI/nqIvluo/miYDmnInku6PnoIHlhajpg6jlvIDmupDvvIzkuJTmnKzop4TliJnkuLrlrabkuaDnm67nmoTvvIzor7fkuo7lr7zlhaUyNOWwj+aXtuWGheWIoOmZpO+8ge+8ge+8gVxcbiAgICAyLiDmnKzlsI/nqIvluo88Yj7lrozlhajlhY3otLk8L2I+77yM5aaC5p6c5L2g5piv5LuY6LS56LSt5Lmw55qE5oGt5Zac5L2g6KKr6aqX5LqG44CCXFxuICAgIDMuIOacrOWwj+eoi+W6j+eahOaguOW/g+S7o+eggeaYr+WcqGpvZeeJiOOAjOeZvuW6pue9keebmOOAjeeahOWfuuehgOS4iuaVtOWQiOS6hnpoYW/lpKfkvaznmoTniYjmnKzvvIzmhJ/osKLkuKTkvY3lpKfkvazjgIJcXG4gICAgNC4g5pCc57Si5rqQ6LCD55So5LqG44CM5LqR55uY5ZCbLueugOOAjeeahOaQnOe0ouinhOWIme+8jOaEn+iwokBMb3lEZ0lr5aSn5L2s44CCXFxuICAgIDUuIOeZvuW6pue9keebmOiwg+eUqOaWueazlTogcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvbGlzdD9ydWxlPeeZvuW6pue9keebmCZyZWFsdXJsPVxcXCIgKyB1cmw7XFxuICAgIDxiPuW8gOWni+S9v+eUqOacrOinhOWImeWNs+S7o+ihqOmBteWuiOinhOWImeadoeS+izwvYj5cXG4gICAg5b2T5YmN54mI5pys77yaJHtNWV9SVUxFLnZlcnNpb259XFxuICAgICAgICBgO1xcbmxldCB1cGRhdGVJbmZvID0gYOS/ruWkjeS+nei1llxcbueZvuW6pue9keebmOiwg+eUqOaWueazlTogcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvbGlzdD9ydWxlPeeZvuW6pue9keebmCZyZWFsdXJsPVxcXCIgKyB1cmw7YDtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxzdHJvbmc+5L2/55So5YmN6aG755+lPC9zdHJvbmc+XFxcIi5iaWcoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBjb250ZW50LnRyaW0oKS5yZXBsYWNlKC9cXFxcblxcXFxzKj8vZywgXFxcIjxicj5cXFwiKSxcXG4gICAgXFxcImNvbF90eXBlXFxcIjogXFxcInJpY2hfdGV4dFxcXCJcXG59LCB7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG59LCB7XFxuICAgIHRpdGxlOiB0aW1lICsgXFxcIuenkuWQjue7p+e7rVxcXCIsXFxuICAgIHVybDogXFxcInRvYXN0Oi8v6K+36K6k55yf6ZiF6K+75Lul5LiK5YaF5a65XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBpZCArIFxcXCJ0aW1lclxcXCJcXG4gICAgfVxcbn0pO1xcbmlmICh1cGRhdGVJbmZvKSB7XFxuICAgIGNvbmZpcm0oe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmm7TmlrDlhoXlrrlcXFwiLFxcbiAgICAgICAgY29udGVudDogdXBkYXRlSW5mbyxcXG4gICAgICAgIGNvbmZpcm0oKSB7fSxcXG4gICAgICAgIGNhbmNlbCgpIHt9XFxuICAgIH0pO1xcbn1cXG5zZXRSZXN1bHQoZCk7XFxud2hpbGUgKHRpbWUgIT0gMCkge1xcbiAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDEwMDApO1xcbiAgICB0aW1lIC09IDE7XFxuICAgIHVwZGF0ZUl0ZW0oaWQgKyBcXFwidGltZXJcXFwiLCB7XFxuICAgICAgICB0aXRsZTogdGltZSArIFxcXCLnp5LlkI7nu6fnu61cXFwiXFxuICAgIH0pO1xcbn1cXG51cGRhdGVJdGVtKGlkICsgXFxcInRpbWVyXFxcIiwge1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOaIkeWQjOaEj+S7peS4iuimgeaxguKAneKAnVxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodikgPT4ge1xcbiAgICAgICAgc2V0SXRlbShcXFwiZmlyc3RcXFwiLCBTdHJpbmcodikpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mhJ/osKLmgqjnmoTnkIbop6NcXFwiO1xcbiAgICB9LCBNWV9SVUxFLnZlcnNpb24pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxufSk7XCJ9XSIsImljb24iOiJodHRwczovL2FwaS54aW5hYy5uZXQvaWNvbi8/dXJsPWh0dHBzOi8vcGFuLmJhaWR1LmNvbS8iLCJwcm94eSI6IiJ9
Add Comment
Please, Sign In to add comment