xiaomianao666

小程序:云盘君.简

May 22nd, 2024
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@云盘君.简@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoi5LqR55uY5ZCbLueugCIsImF1dGhvciI6IuWwj+ajieiihPCfjJ4mQExveURnSWsiLCJ1cmwiOiJoaWtlcjovL2VtcHR5IyNmeXBhZ2UiLCJ2ZXJzaW9uIjoxNTksImNvbF90eXBlIjoibW92aWVfMyIsImNsYXNzX25hbWUiOiIiLCJ0eXBlIjoiYWxsIiwiY2xhc3NfdXJsIjoiIiwiYXJlYV9uYW1lIjoiIiwiYXJlYV91cmwiOiIiLCJzb3J0X25hbWUiOiIiLCJ5ZWFyX25hbWUiOiIiLCJzb3J0X3VybCI6IiIsInllYXJfdXJsIjoiIiwiZmluZF9ydWxlIjoianM6JC5yZXF1aXJlKFwiTWFpblwiKTsiLCJzZWFyY2hfdXJsIjoiaGlrZXI6Ly9lbXB0eT9zZWFyY2hUZXJtcz0qKiIsImdyb3VwIjoi4p6K4pOR6ZuG5ZCIIiwic2VhcmNoRmluZCI6ImpzOlxubGV0IGlzZERlbGVnYXRlID0gISFnZXRJdGVtKFwiaXNkRGVsZWdhdGVcIiwgXCJcIik7XG5pZiAoaXNkRGVsZWdhdGUpIHtcbiAgICBzZXRSZXN1bHQoW3tcbiAgICAgICAgdGl0bGU6IFwi54K55oiR5byA5aeL6IGa5ZCI5pCc57SiXCIgKyBNWV9LRVlXT1JELFxuICAgICAgICB1cmw6IFwiaGlrZXI6Ly9zZWFyY2g/cz1cIiArIE1ZX0tFWVdPUkQsXG4gICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICBkZWxlZ2F0ZU9ubHlTZWFyY2g6IHRydWUsXG4gICAgICAgICAgICBydWxlczogJC50b1N0cmluZygoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVHcm91cCA9IGdldEl0ZW0oXCJydWxlR3JvdXBcIiwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gJC5yZXF1aXJlKFwiZGF0YVwiKS5nZXRBbGxEYXRhKHJ1bGVHcm91cCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfdXJsOiBcImhpa2VyOi8vZW1wdHk/cGFnZT1meXBhZ2Umc2VhcmNoVGVybXM9KipcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hGaW5kOiBcImpzOlwiICsgJC50b1N0cmluZygocnVsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQoJC5yZXF1aXJlKFwiZGF0YVwiKS5jYXJyeVNSdWxlKHJ1bGUsIE1ZX0tFWVdPUkQsIE1ZX1BBR0UsIGdldFNlYXJjaE1vZGUoKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGl0KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJ1bGVzKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XSk7XG59IGVsc2Uge1xuICAgIHNldFJlc3VsdChbe1xuICAgICAgICB0aXRsZTogXCLngrnmiJHlvIDlp4vogZrlkIjmkJzntKJcIiArIE1ZX0tFWVdPUkQsXG4gICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2Uvc291I25vSGlzdG9yeSM/cD1meXBhZ2VcIixcbiAgICAgICAgZXh0cmE6IHtcbiAgICAgICAgICAgIHBhZ2VUaXRsZTogXCLmkJzntKJcIiArIE1ZX0tFWVdPUkQsXG4gICAgICAgICAgICBzZWFyY2hUZXJtczogTVlfS0VZV09SRCxcbiAgICAgICAgICAgIGhpZGVTZXR0aW5nOiB0cnVlXG4gICAgICAgIH1cbiAgICB9XSk7XG59IiwiZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsImRldGFpbF9maW5kX3J1bGUiOiIiLCJzZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsInNkZXRhaWxfZmluZF9ydWxlIjoiIiwidWEiOiJtb2JpbGUiLCJwcmVSdWxlIjoiIiwicGFnZXMiOiJbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhOWImeWkhOeQhlwiLFwicGF0aFwiOlwiZGF0YVwiLFwicnVsZVwiOlwianM6XFxubGV0IFBhcnNlUmx1ZSA9ICQucmVxdWlyZShcXFwiUGFyc2VSbHVlXFxcIik7XFxuXFxuZnVuY3Rpb24gdG9SZWRpcmVjdFRyZWF0aW5nKGNvbmZpZykge1xcbiAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJyZWRpcmVjdFxcXCIpLmRvdWJsZVRyZWF0aW5nKGNvbmZpZyk7XFxufVxcblxcbmZ1bmN0aW9uIHRvUmVkaXJlY3QoYWxpVXJsLCBzaGFyZVB3ZCkge1xcbiAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJyZWRpcmVjdFxcXCIpLmdldE1vZGVVcmwoYWxpVXJsLCBzaGFyZVB3ZCk7XFxufVxcblxcbmZ1bmN0aW9uIGdldENvbXBsZXRlUnVsZShydWxlKSB7XFxuICAgIGlmIChydWxlLnJ1bGVUeXBlID09PSBcXFwiSlNPTlxcXCIpIHtcXG4gICAgICAgIGxldCBmaW5kID0gcnVsZS5maW5kO1xcbiAgICAgICAgcnVsZS5maW5kID0gKHMsIHBhZ2UpID0+IHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gU3RyaW5nKHJ1bGUuYmFzaWNVcmwpLnJlcGxhY2UoXFxcIioqXFxcIiwgZW5jb2RlVVJJQ29tcG9uZW50KHMpKS5yZXBsYWNlKFxcXCJmeXBhZ2VcXFwiLCBwYWdlICsgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBQYXJzZVJsdWUucGFyc2VTZWFyY2hKc29uKHVybCwgZmluZCk7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAocnVsZS5ydWxlVHlwZSA9PT0gXFxcIkhUTUxcXFwiKSB7XFxuICAgICAgICBsZXQgZmluZCA9IHJ1bGUuZmluZDtcXG4gICAgICAgIHJ1bGUuZmluZCA9IChzLCBwYWdlKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IFN0cmluZyhydWxlLmJhc2ljVXJsKS5yZXBsYWNlKFxcXCIqKlxcXCIsIGVuY29kZVVSSUNvbXBvbmVudChzKSkucmVwbGFjZShcXFwiZnlwYWdlXFxcIiwgcGFnZSArIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gUGFyc2VSbHVlLnBhcnNlU2VhcmNoSHRtbCh1cmwsIGZpbmQpO1xcbiAgICAgICAgfVxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgbGV0IGZpbmQgPSBuZXcgRnVuY3Rpb24oXFxcInNcXFwiLCBcXFwicGFnZVxcXCIsIFxcXCJ1c2VyXFxcIiwgXFxcImJhc2ljVXJsXFxcIiwgcnVsZS5maW5kKTtcXG4gICAgICAgIHJ1bGUuZmluZCA9IChzLCBwYWdlKSA9PiBmaW5kKHMsIHBhZ2UsIHJ1bGUudXNlciB8fCB7fSwgcnVsZS5iYXNpY1VybCB8fCBcXFwiXFxcIik7XFxuICAgICAgICAvKmlmIChydWxlLmZpbmRBbGlVcmwpIHtcXG4gICAgICAgICAgICBydWxlLmZpbmRBbGlVcmwgPSBuZXcgRnVuY3Rpb24oXFxcImlucHV0XFxcIiwgXFxcImJhc2ljVXJsXFxcIiwgcnVsZS5maW5kQWxpVXJsKTtcXG4gICAgICAgIH0qL1xcbiAgICB9XFxuICAgIHJldHVybiBydWxlO1xcbn1cXG4kLmV4cG9ydHMuY2FycnlSdWxlID0gZnVuY3Rpb24ocnVsZSwgcywgcGFnZSwgc2VhcmNoTW9kZSkge1xcbiAgICBydWxlID0gZ2V0Q29tcGxldGVSdWxlKHJ1bGUpO1xcbiAgICBsZXQgbGlzdCA9IHJ1bGUuZmluZChzLCBwYWdlKTtcXG4gICAgaWYgKCFsaXN0KSByZXR1cm4gW107XFxuXFxuICAgIGxldCBkZXNjVGlwcyA9IFxcXCLigJzigJzigJ3igJ1cXFwiICsgcnVsZS5uYW1lLmZvbnRjb2xvcihcXFwiI2YxM2I2NmFcXFwiKSArIFxcXCImbmJzcDtcXFwiO1xcbiAgICBsZXQgcmVzTGlzdCA9IFtdO1xcblxcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxuICAgICAgICBpZiAoaXQuc2tpcCkge1xcbiAgICAgICAgICAgIHJlc0xpc3QucHVzaChpdCk7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoc2VhcmNoTW9kZSAmJiAhc2VhcmNoQ29udGFpbnMoaXQudGl0bGUsIHMsIHRydWUpKSBjb250aW51ZTtcXG4gICAgICAgIGlmIChydWxlLmZpbmRBbGlVcmwpIHtcXG4gICAgICAgICAgICBpdC51cmwgPSAkKGl0LnVybCkubGF6eVJ1bGUodG9SZWRpcmVjdFRyZWF0aW5nLCB7XFxuICAgICAgICAgICAgICAgIGZpbmRBbGlVcmw6IHJ1bGUuZmluZEFsaVVybCxcXG4gICAgICAgICAgICAgICAgYmFzaWNVcmw6IHJ1bGUuYmFzaWNVcmwsXFxuICAgICAgICAgICAgICAgIG5hbWU6IHJ1bGUubmFtZSxcXG4gICAgICAgICAgICAgICAgYXV0aG9yOiBydWxlLmF1dGhvcixcXG4gICAgICAgICAgICAgICAgYWxpVXJsOiBpdC51cmwsXFxuICAgICAgICAgICAgICAgIHJ1bGVUeXBlOiBydWxlLnJ1bGVUeXBlXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGl0LnVybCA9ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUodG9SZWRpcmVjdCwgaXQudXJsLCBpdC5zaGFyZVB3ZCB8fCBcXFwiXFxcIik7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgdGl0bGUgPSBpdC50aXRsZSB8fCBcXFwiXFxcIjtcXG4gICAgICAgIHJlc0xpc3QucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLmluY2x1ZGVzKFxcXCLigJzigJzigJ3igJ1cXFwiKSA/IHRpdGxlIDogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyB0aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAoXFxcIjxlbT58PC9lbT5cXFwiLCBcXFwiZ1xcXCIpLCBcXFwiXFxcIikucmVwbGFjZShuZXcgUmVnRXhwKFxcXCIoXFxcIiArIHMgKyBcXFwiKVxcXCIsIFxcXCJnaVxcXCIpLCBcXFwiPHN0cm9uZz48c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjMUU5MEZGXFxcXFxcXCI+JDE8L3NwYW4+PC9zdHJvbmc+XFxcIiksXFxuICAgICAgICAgICAgZGVzYzogZGVzY1RpcHMgKyAoaXQuZGVzYyB8fCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgdXJsOiBpdC51cmwsXFxuICAgICAgICAgICAgcGljX3VybDogaXQucGljX3VybCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogaXQucGljX3VybCA/IFxcXCJtb3ZpZV8xX3ZlcnRpY2FsX3BpY1xcXCIgOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih7XFxuICAgICAgICAgICAgICAgIGluaGVyaXRUaXRsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgIG5vUGljOiB0cnVlXFxuICAgICAgICAgICAgfSwgaXQuZXh0cmEpXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICByZXR1cm4gcmVzTGlzdDtcXG59XFxuJC5leHBvcnRzLmNhcnJ5U1J1bGUgPSBmdW5jdGlvbihydWxlLCBzLCBwYWdlLCBzZWFyY2hNb2RlKSB7XFxuICAgIHJ1bGUgPSBnZXRDb21wbGV0ZVJ1bGUocnVsZSk7XFxuICAgIGxldCBsaXN0ID0gcnVsZS5maW5kKHMsIHBhZ2UpO1xcbiAgICBpZiAoIWxpc3QpIHJldHVybiBbXTtcXG4gICAgbGV0IHJlc0xpc3QgPSBbXTtcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgaWYgKGl0LnNraXApIHtcXG4gICAgICAgICAgICByZXNMaXN0LnB1c2goaXQpO1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHNlYXJjaE1vZGUgJiYgIXNlYXJjaENvbnRhaW5zKGl0LnRpdGxlLCBzLCB0cnVlKSkgY29udGludWU7XFxuICAgICAgICBpZiAocnVsZS5maW5kQWxpVXJsKSB7XFxuICAgICAgICAgICAgaXQudXJsID0gJChpdC51cmwpLmxhenlSdWxlKHRvUmVkaXJlY3RUcmVhdGluZywge1xcbiAgICAgICAgICAgICAgICBmaW5kQWxpVXJsOiBydWxlLmZpbmRBbGlVcmwsXFxuICAgICAgICAgICAgICAgIGJhc2ljVXJsOiBydWxlLmJhc2ljVXJsLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBydWxlLm5hbWUsXFxuICAgICAgICAgICAgICAgIGF1dGhvcjogcnVsZS5hdXRob3IsXFxuICAgICAgICAgICAgICAgIGFsaVVybDogaXQudXJsLFxcbiAgICAgICAgICAgICAgICBydWxlVHlwZTogcnVsZS5ydWxlVHlwZVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBpdC51cmwgPSAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKHRvUmVkaXJlY3QsIGl0LnVybCwgaXQuc2hhcmVQd2QgfHwgXFxcIlxcXCIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmVzTGlzdC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXQudGl0bGUsXFxuICAgICAgICAgICAgZGVzYzogaXQuZGVzYyB8fCBcXFwiXFxcIixcXG4gICAgICAgICAgICB1cmw6IGl0LnVybCxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdC5waWNfdXJsLFxcbiAgICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHtcXG4gICAgICAgICAgICAgICAgaW5oZXJpdFRpdGxlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgbm9QaWM6IHRydWVcXG4gICAgICAgICAgICB9LCBpdC5leHRyYSlcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIHJldHVybiByZXNMaXN0O1xcbn1cXG5sZXQgc2l6ZSA9IDEwO1xcblxcbmxldCBydWxlcztcXG5cXG5mdW5jdGlvbiBnZXRSdWxlcyhncm91cCkge1xcbiAgICBsZXQgcnVsZXNUbXA7XFxuICAgIGlmICghcnVsZXMpIHtcXG4gICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0VXNlZnVsSnNvbigpO1xcbiAgICB9XFxuICAgIGlmIChncm91cCkge1xcbiAgICAgICAgcnVsZXNUbXAgPSBydWxlcy5maWx0ZXIodiA9PiB2Lmdyb3VwID09PSBncm91cCk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBydWxlc1RtcCA9IHJ1bGVzO1xcbiAgICB9XFxuICAgIHJldHVybiBydWxlc1RtcDtcXG59XFxuJC5leHBvcnRzLmdldEFsbERhdGEgPSBmdW5jdGlvbihncm91cCkge1xcbiAgICByZXR1cm4gZ2V0UnVsZXMoZ3JvdXApO1xcbn07XFxuJC5leHBvcnRzLmdldERhdGEgPSBmdW5jdGlvbihwYWdlLCBydWxlLCBncm91cCkge1xcbiAgICBpZiAocnVsZSkge1xcbiAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCAmJiBwYWdlID4gMSkge1xcbiAgICAgICAgICAgIHJldHVybiBnZXRSdWxlcygpLmZpbHRlcihpID0+IGkubmFtZSA9PSBydWxlICYmIGkucGFnZSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gZ2V0UnVsZXMoKS5maWx0ZXIoaSA9PiBpLm5hbWUgPT0gcnVsZSk7XFxuICAgIH1cXG4gICAgbGV0IHJ1bGVzVG1wID0gZ2V0UnVsZXMoZ3JvdXApO1xcbiAgICBsZXQgc3RhcnQgPSAocGFnZSAtIDEpICogc2l6ZTtcXG4gICAgaWYgKHJ1bGVzVG1wLmxlbmd0aCA8IHN0YXJ0ICsgMSkge1xcbiAgICAgICAgcmV0dXJuIFtdO1xcbiAgICB9XFxuICAgIGxldCBsZW4gPSBzaXplO1xcbiAgICBpZiAocnVsZXNUbXAubGVuZ3RoIDwgcGFnZSAqIHNpemUpIHtcXG4gICAgICAgIGxlbiA9IHJ1bGVzVG1wLmxlbmd0aCAtIHN0YXJ0O1xcbiAgICB9XFxuICAgIHJldHVybiBydWxlc1RtcC5zbGljZShzdGFydCwgc3RhcnQgKyBsZW4pO1xcbn07XFxuJC5leHBvcnRzLmdldE5hbWVzID0gZnVuY3Rpb24oZ3JvdXApIHtcXG4gICAgcmV0dXJuIGdldFJ1bGVzKGdyb3VwKS5tYXAoaXQgPT4gW2l0Lm5hbWUsIGl0LmJhc2ljVXJsXSk7XFxufTtcXG5cXG4kLmV4cG9ydHMuZ2V0R3JvdXBOYW1lcyA9IGZ1bmN0aW9uKCkge1xcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGdldFJ1bGVzKCkubWFwKHYgPT4gdi5ncm91cCkpKS5maWx0ZXIodiA9PiB2KTtcXG59O1xcbiQuZXhwb3J0cy5maW5kTW9kdWxvID0gZnVuY3Rpb24oaW5wdXQpIHtcXG4gICAgbGV0IG9yaU1vZHMgPSBbMiwgM107XFxuICAgIGxldCBtb2RzID0gb3JpTW9kcy5tYXAodiA9PiBpbnB1dCAlIHYpO1xcbiAgICBsZXQgemVyb01vZHMgPSBtb2RzLmluZGV4T2YoMCk7XFxuXFxuICAgIGlmICh6ZXJvTW9kcyA+IC0xKSB7XFxuICAgICAgICByZXR1cm4gb3JpTW9kc1t6ZXJvTW9kc107XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gb3JpTW9kc1ttb2RzLmluZGV4T2YoTWF0aC5tYXguYXBwbHkobnVsbCwgbW9kcykpXTtcXG4gICAgfVxcbn07XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmkJzntKLpobXpnaJcIixcInBhdGhcIjpcInNvdVwiLFwicnVsZVwiOlwianM6XFxuY29uc3QgYWxpdGVzdCA9ICQucmVxdWlyZShcXFwiYWxpdGVzdFxcXCIpO1xcblxcbmZ1bmN0aW9uIHNldENsaXAoKSB7XFxuICAgIGZ1bmN0aW9uIGdldENvcHkoKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGNvbnN0IENvbnRleHQgPSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDtcXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q3VycmVudEFjdGl2aXR5KCk7XFxuICAgICAgICAgICAgLy8g6I635Y+W57O757uf5Ymq6LS05p2/XFxuICAgICAgICAgICAgbGV0IGNsaXBib2FyZCA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTtcXG4gICAgICAgICAgICAvLyDov5Tlm57mlbDmja5cXG4gICAgICAgICAgICBsZXQgY2xpcERhdGEgPSBjbGlwYm9hcmQuZ2V0UHJpbWFyeUNsaXAoKTtcXG4gICAgICAgICAgICBpZiAoY2xpcERhdGEgIT0gbnVsbCAmJiBjbGlwRGF0YS5nZXRJdGVtQ291bnQoKSA+IDApIHtcXG4gICAgICAgICAgICAgICAgLy8g5LuO5pWw5o2u6ZuG5Lit6I635Y+W77yI57KY6LS077yJ56ys5LiA5p2h5paH5pys5pWw5o2uXFxuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gY2xpcERhdGEuZ2V0SXRlbUF0KDApLmdldFRleHQoKTtcXG4gICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh0ZXh0LnRvU3RyaW5nKCkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxldCB0ZXh0ID0gZ2V0Q29weSgpIHx8IFxcXCJcXFwiO1xcbiAgICBsZXQgdXJsID0gYWxpdGVzdC5tYXRjaEFsaVVybCh0ZXh0KTtcXG4gICAgaWYgKHVybCkge1xcbiAgICAgICAgbGV0IGNhY2hlID0gZ2V0SXRlbShcXFwiY2xpcGJvYXJkQ2FjaGVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAodXJsICE9PSBjYWNoZSkge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGZvbnQgY29sb3I9XFxcIiMxM0I2MUJcXFwiPuKWkCA8L2ZvbnQ+PGI+5rip6aao5o+Q56S6PGI+JyxcXG4gICAgICAgICAgICAgICAgZGVzYzogXFxcIuajgOa1i+WIsOWJqui0tOadv+WQq+aciemYv+mHjOmTvuaOpeaYr+WQpuaJk+W8gD9cXFxcblxcXCIgKyB1cmwsXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaW5wdXQsIGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVJdGVtKGlkICsgXFxcImNsaXBib2FyZFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvYWxpeXVuP3BhZ2U9ZnlwYWdlJnJlYWx1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCkgKyBcXFwiJnNoYXJlUHdkPVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIHVybCwgaWQpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogaWQgKyBcXFwiY2xpcGJvYXJkXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogXFxcIuaJk+W8gOmTvuaOpVxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcImNsaXBib2FyZENhY2hlXFxcIiwgdXJsKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBzZXRQcmVwb3NlKCkge1xcbiAgICBpZiAob3Blbk1vZGUgPT0gXFxcIuacrOWcsOino+aekFxcXCIpIHtcXG4gICAgICAgIGxldCBhbGlUb2tlbnNGaWxlcGF0aCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3Rva2VuUGF0aFxcXCIpLmFsaVRva2Vuc0ZpbGVwYXRoO1xcbiAgICAgICAgbGV0IGEgPSBmZXRjaChhbGlUb2tlbnNGaWxlcGF0aCk7XFxuICAgICAgICBpZiAoIWEgfHwgYSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnPGZvbnQgY29sb3I9XFxcIiMxM0I2MUJcXFwiPuKWkCA8L2ZvbnQ+PGI+5rip6aao5o+Q56S6PGI+JyxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiAkLnJlcXVpcmUoXFxcImxvZ2luTW9kZVxcXCIpKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuacquajgOa1i+WIsOeZu+W9leS/oeaBr++8jOeCueaIkei3s+i9rOeZu+W9lei0puWPt+mhtemdou+8jOeZu+W9lemYv+mHjOS6keebmOi0puWPt+WQjuaWueWPr+S9v+eUqOacrOWcsOino+aekOaooeW8j1xcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IFxcXCLnmbvlvZXpmL/ph4zkupHnm5hcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwic1xcXCIpO1xcbiAgICB9KSk7XFxuICAgIGFkZExpc3RlbmVyKFxcXCJvblJlZnJlc2hcXFwiLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIGlmICghZ2V0TXlWYXIoXFxcInJlZnNcXFwiLCBcXFwiXFxcIikpIHtcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXCJzXFxcIik7XFxuICAgICAgICB9XFxuICAgIH0pKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0SGVhZCgpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5pCc57Si77yaXFxcIiArIFtcXFwi6buY6K6kXFxcIiwgXFxcIueyvuWHhlxcXCJdW3NlYXJjaE1vZGVdLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBzZXRTZWFyY2hNb2RlKGdldFNlYXJjaE1vZGUoKSA/IDAgOiAxKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fMl9yb3VuZFxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9zZWFyY2g2XFxcIlxcbiAgICB9KTtcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6K6+572ufFxcXCIgKyBvcGVuTW9kZSxcXG4gICAgICAgIHVybDogJChbXFxcIuaooeW8j++8muacrOWcsOino+aekFxcXCIsIFxcXCLmqKHlvI/vvJrlrpjmlrlBUFBcXFwiLCBcXFwi55m75b2V6Zi/6YeM6LSm5Y+3XFxcIiwgXFxcIueZu+W9leS/oeaBr1xcXCIsIFxcXCLop4TliJnnrqHnkIZcXFwiLCBcXFwi5pSv5oyB5L2c6ICFXFxcIiwgXFxcIuS9v+eUqOS7o+eQhuaQnOe0olxcXCJdLCAxLCBcXFwi5LqR566A6K6+572uXFxcIikuc2VsZWN0KChpZHMpID0+IHtcXG4gICAgICAgICAgICBpZiAoXFxcIuinhOWImeeuoeeQhlxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcnVsZU1hbmFnZSNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoXFxcIuaUr+aMgeS9nOiAhVxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvRG9uYXRlLnYjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKFxcXCLnmbvlvZXpmL/ph4zotKblj7dcXFwiID09IGlucHV0KSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImxvZ2luTW9kZVxcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoXFxcIuS9v+eUqOS7o+eQhuaQnOe0olxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgbGV0IGlzZERlbGVnYXRlID0gISFnZXRJdGVtKFxcXCJpc2REZWxlZ2F0ZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIuW8gOWQr+WQjuWwj+eoi+W6j+W6lemDqOaQnOe0ouahhuWwhuS9v+eUqOS7o+eQhuaQnOe0olxcXFxu5b2T5YmNOlxcXCIgKyBpc2REZWxlZ2F0ZSArIFxcXCJcXFxcbueCueWHu+ehruWumuWNs+WPr1xcXCIgKyAoaXNkRGVsZWdhdGUgPyBcXFwi5YWz6ZetXFxcIiA6IFxcXCLlvIDlkK9cXFwiKSkuY29uZmlybSgoaXNkRGVsZWdhdGUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImlzZERlbGVnYXRlXFxcIiwgaXNkRGVsZWdhdGUgPyBcXFwiXFxcIiA6IFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIChpc2REZWxlZ2F0ZSA/IFxcXCLlt7LlhbPpl61cXFwiIDogXFxcIuW3suW8gOWQr1xcXCIpO1xcbiAgICAgICAgICAgICAgICB9LCBpc2REZWxlZ2F0ZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChcXFwi55m75b2V5L+h5oGvXFxcIiA9PSBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICBjb25zdCB7XFxuICAgICAgICAgICAgICAgICAgICBvcGVuVG9rZW5zRmlsZXBhdGgsXFxuICAgICAgICAgICAgICAgICAgICBhbGlUb2tlbnNGaWxlcGF0aFxcbiAgICAgICAgICAgICAgICB9ID0gJC5yZXF1aXJlKFxcXCJ0b2tlblBhdGhcXFwiKTtcXG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlRXhpc3QoYWxpVG9rZW5zRmlsZXBhdGgpKSByZXR1cm4gXFxcInRvYXN0Oi8v6L+Y5pyq55m76ZmGXFxcIjtcXG4gICAgICAgICAgICAgICAgbGV0IGFsaSA9IHJlcXVlc3QoYWxpVG9rZW5zRmlsZXBhdGgpO1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgYWxpID0gSlNPTi5wYXJzZShhbGkpO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKGFsaVRva2Vuc0ZpbGVwYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ojrflj5blpLHotKVcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGNvbmZpcm0oe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfnmbvlvZXkv6Hmga8nLFxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogXFxcIueUqOaItzpcXFwiICsgKGFsaS5uaWNrX25hbWUgfHwgYWxpLnVzZXJfbmFtZSB8fCBcXFwiVG9rZW7nmbvlvZVcXFwiKSArIFxcXCJcXFxcblRva2VuOlxcXCIgKyBhbGkucmVmcmVzaF90b2tlbiArIFxcXCJcXFxcbijlj5bmtojvvJrms6jplIDnmbvlvZXvvJvnoa7lrprvvJrlpI3liLZUb2tlbilcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybTogJC50b1N0cmluZygodG9rZW4pID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgdG9rZW47XFxuICAgICAgICAgICAgICAgICAgICB9LCBhbGkucmVmcmVzaF90b2tlbiksXFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWw6ICQudG9TdHJpbmcoKHBhdGgxLCBwYXRoMikgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLnoa7orqTms6jplIDnmbvlvZVcXFwiKS5jb25maXJtKChwYXRoMSwgcGF0aDIpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlRmlsZShwYXRoMSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUocGF0aDIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5oiQ5Yqf6YCA5Ye655m76ZmGXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBwYXRoMSwgcGF0aDIpO1xcbiAgICAgICAgICAgICAgICAgICAgfSwgYWxpVG9rZW5zRmlsZXBhdGgsIG9wZW5Ub2tlbnNGaWxlcGF0aClcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKFxcXCLmqKHlvI/vvJpcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwib3Blbk1vZGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbShpZHMsIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLorr7nva58XFxcIiArIGlucHV0XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgaWYgKGlucHV0ID09IFxcXCLlrpjmlrlBUFBcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip/vvIzor7fnoa7kv53miYvmnLrmnInlronoo4XpmL/ph4zkupHnm5jnrYnlrpjmlrlBUFBcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGlkICsgXFxcIm1vZGVcXFwiKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl8yX3JvdW5kXFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX21lbnU2XFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IGlkICsgXFxcIm1vZGVcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfmkJzntKInLFxcbiAgICAgICAgZGVzYzogJ+ivt+i+k+WFpeWFs+mUruivjS/pk77mjqUnLFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIGlucHV0ID0gaW5wdXQudHJpbSgpO1xcbiAgICAgICAgICAgIGlmICgkLnJlcXVpcmUoXFxcImFsaXRlc3RcXFwiKS50ZXN0KGlucHV0KSkge1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJzXFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1bj9wYWdlPWZ5cGFnZSZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoaW5wdXQpICsgXFxcIiZzaGFyZVB3ZD1cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwic1xcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgb25DaGFuZ2U6IFxcXCJwdXRNeVZhcigncmVmcycsaW5wdXQpXFxcIixcXG4gICAgICAgICAgICBpZDogaWQgKyBcXFwic3NcXFwiLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogcyxcXG4gICAgICAgICAgICBwYWdlVGl0bGU6IFxcXCLmiZPlvIDpk77mjqVcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRSdWxlSXRlbSgpIHtcXG4gICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJkYXRhXFxcIikuZ2V0TmFtZXMocnVsZUdyb3VwKTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+Mn1xcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2NvbGxlY3Rpb24/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+TjFxcXCIgKyBydWxlR3JvdXAsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBncm91cCA9ICQucmVxdWlyZShcXFwiZGF0YVxcXCIpLmdldEdyb3VwTmFtZXMoKTtcXG4gICAgICAgICAgICBsZXQgcnVsZUdyb3VwID0gZ2V0SXRlbShcXFwicnVsZUdyb3VwXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGdyb3VwLmluZGV4T2YocnVsZUdyb3VwKSsxO1xcbiAgICAgICAgICAgIGdyb3VwLnVuc2hpZnQoXFxcIvCfkqHlhajpg6jwn5KhXFxcIik7XFxuICAgICAgICAgICAgbGV0IHNlbGVjdE51bSA9ICQucmVxdWlyZShcXFwiZGF0YVxcXCIpLmZpbmRNb2R1bG8oZ3JvdXAubGVuZ3RoKTtcXG4gICAgICAgICAgICByZXR1cm4gJChncm91cCwgc2VsZWN0TnVtLCBcXFwi6K+36YCJ5oup5YiG57uEXFxcIiwgaW5kZXgpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGlmICghTVlfSU5ERVgpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInJ1bGVHcm91cFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInJ1bGVHcm91cFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcInJ1bGVcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICB9LCB7XFxuICAgICAgICB0aXRsZTogXFxcIlxcXCIgPT0gciA/IFxcXCLigJzigJzlhajpg6jigJ3igJ1cXFwiIDogXFxcIuWFqOmDqFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHMsIGlkKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHFyID0gZ2V0SXRlbShcXFwicnVsZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBjbGVhckl0ZW0oXFxcInJ1bGVcXFwiKTtcXG4gICAgICAgICAgICBpZiAocykge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcIuWFqOmDqFxcXCIgKyBpZCwge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzlhajpg6jigJ3igJ1cXFwiXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBpZiAocXIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaWQgKyBxciwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBxclxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sIHMsIGlkKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBcXFwi5YWo6YOoXFxcIiArIGlkXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBmb3IgKGxldCBbaXQsIGJhc2ljVXJsXSBvZiBydWxlcykge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXQgPT0gciA/IFxcXCLigJzigJxcXFwiICsgaXQgKyBcXFwi4oCd4oCdXFxcIiA6IGl0LFxcbiAgICAgICAgICAgIHVybDogJCgoZ2V0SG9tZShiYXNpY1VybCkgfHwgXFxcIlxcXCIpICsgXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHIsIHMsIGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBxciA9IGdldEl0ZW0oXFxcInJ1bGVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInJ1bGVcXFwiLCByKTtcXG4gICAgICAgICAgICAgICAgaWYgKHMpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHFyID8gKGlkICsgcXIpIDogKFxcXCLlhajpg6hcXFwiICsgaWQpLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHFyIHx8IFxcXCLlhajpg6hcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oaWQgKyByLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJxcXFwiICsgciArIFxcXCLigJ3igJ1cXFwiXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIH0sIGl0LCBzLCBpZCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogaWQgKyBpdFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxuXFxufVxcblxcbmZ1bmN0aW9uIHJlY29yZCgpIHtcXG4gICAgbGV0IGhpc3RvcnkgPSBzdG9yYWdlMC5nZXRJdGVtKFxcXCJzZWFyY2hIaXN0b3J5XFxcIiwgW10pO1xcbiAgICBsZXQgaWkgPSBoaXN0b3J5LmluZGV4T2Yocyk7XFxuICAgIGlmIChpaSA+IC0xKSB7XFxuICAgICAgICBoaXN0b3J5LnNwbGljZShpaSwgMSk7XFxuICAgIH1cXG4gICAgaWYgKGhpc3RvcnkubGVuZ3RoID4gMjApIHtcXG4gICAgICAgIGhpc3Rvcnkuc3BsaWNlKGhpc3RvcnkubGVuZ3RoIC0gMSwgMSk7XFxuICAgIH1cXG4gICAgaGlzdG9yeS51bnNoaWZ0KHMpO1xcbiAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJzZWFyY2hIaXN0b3J5XFxcIiwgaGlzdG9yeSk7XFxufVxcblxcbmZ1bmN0aW9uIHNlYXJjaEVuZCgpIHtcXG4gICAgbGV0IHAgPSBNWV9QQUdFO1xcbiAgICBsZXQgZGF0YSA9ICQucmVxdWlyZShcXFwiZGF0YVxcXCIpLmdldERhdGEocCwgciwgcnVsZUdyb3VwKTtcXG4gICAgbGV0IHBhZ2VpZCA9IGlkICsgXFxcInlwai1wYWdlXFxcIiArIHA7XFxuICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLliqDovb3nrKxcXFwiICsgcCArIFxcXCLpobXkuK3vvIzov5vluqbvvJoxL1xcXCIgKyBkYXRhLmxlbmd0aCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGlkOiBwYWdlaWRcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBzZXRSZXN1bHQoZCk7XFxuICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcXG4gICAgICAgIC8v5aSa57q/56iL5Yqg6L29ICAgICAgICBcXG4gICAgICAgIGxldCByZWFsUGFnZSA9IFxcXCJcXFwiID09IHIgPyAxIDogcDtcXG4gICAgICAgIGxldCB0YXNrcyA9IGRhdGEubWFwKGl0ID0+IHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbihydWxlKSB7XFxuICAgICAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImRhdGFcXFwiKS5jYXJyeVJ1bGUocnVsZSwgcywgcmVhbFBhZ2UsIHNlYXJjaE1vZGUpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhydWxlLm5hbWUgKyBcXFwiOlxcXCIgKyBlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qaWYoZGF0YS5sZW5ndGg9PT0xJiZwPT09MSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6XFxcIuKAnOKAnFxcXCIrcnVsZS5uYW1lK1xcXCIgRVJST1LigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogZS50b1N0cmluZygpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6XFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOlxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSovXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBydWxlLmZpbmQocywgcmVhbFBhZ2UpO1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBwYXJhbTogaXQsXFxuICAgICAgICAgICAgICAgIGlkOiBcXFwicnVsZUBcXFwiICsgaXQubmFtZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcblxcbiAgICAgICAgYmF0Y2hFeGVjdXRlKHRhc2tzLCB7XFxuICAgICAgICAgICAgZnVuYzogZnVuY3Rpb24ocGFyYW0sIGlkLCBlcnJvciwgcmVzdWx0KSB7XFxuICAgICAgICAgICAgICAgIHBhcmFtLmkgKz0gMTtcXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbShcXFwiX25vdGhhdmVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGFkZEl0ZW1CZWZvcmUocGFnZWlkLCByZXN1bHQpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChwYXJhbS5pID09PSBwYXJhbS5hbGwpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbShcXFwiX25vdGhhdmVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJdGVtQmVmb3JlKHBhZ2VpZCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIn5+fuS7gOS5iOi1hOa6kOmDveayoeacieWTpn5+flxcXCIuZm9udGNvbG9yKFxcXCJHcmF5XFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogXFxcIl9ub3RoYXZlXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVJdGVtKHBhZ2VpZCk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHBhZ2VpZCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5Yqg6L2956ysXFxcIiArIE1ZX1BBR0UgKyBcXFwi6aG15Lit77yM6L+b5bqm77yaXFxcIiArIChwYXJhbS5pICsgMSkgKyBcXFwiL1xcXCIgKyBwYXJhbS5hbGwsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBhcmFtOiB7XFxuICAgICAgICAgICAgICAgIGFsbDogZGF0YS5sZW5ndGgsXFxuICAgICAgICAgICAgICAgIGk6IDAsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBzZXRIaXN0b3J5KCkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICc8c3BhbiBzdHlsZT1cXFwiY29sb3I6I2ZmNjYwMVxcXCI+PGI+5Y6G5Y+y6K6w5b2VPC9iPjwvc3Bhbj4nLFxcbiAgICAgICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fY2xvY2tcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgdXJsOiAkKFtcXFwi5riF6Zmk5pCc57Si6K6w5b2VXFxcIiwgXFxcIuaJk+W8gOingueci+iusOW9lVxcXCJdKS5zZWxlY3QoKGlkKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi5riF6Zmk5pCc57Si6K6w5b2VXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwi56Gu5a6a5riF6Zmk5YWo6YOo5pCc57Si6K6w5b2V77yfXFxcIikuY29uZmlybSgoaWQpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGNsZWFySXRlbShcXFwic2VhcmNoSGlzdG9yeVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKGlkICsgXFxcIjprZXlcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGFkZEl0ZW1BZnRlcihpZCArIFxcXCI6c2VhcmNoSGlzdG9yeVxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCJ+fn7ku4DkuYjpg73msqHmnInlk6Z+fn5cXFwiLmZvbnRjb2xvcihcXFwiR3JheVxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFwiOmtleVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9LCBpZCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2hpc3Rvcnk/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBpZCksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBpZCArIFxcXCI6c2VhcmNoSGlzdG9yeVxcXCIsXFxuICAgICAgICB9XFxuICAgIH0pO1xcblxcbiAgICBsZXQgaGlzdG9yeSA9IHN0b3JhZ2UwLmdldEl0ZW0oXFxcInNlYXJjaEhpc3RvcnlcXFwiLCBbXSk7XFxuICAgIGxldCBpID0gMDtcXG4gICAgZm9yIChsZXQga2V5IG9mIGhpc3RvcnkpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGtleSxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGlkLCBrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGV4dHJhID0gZmluZEl0ZW0oaWQgKyBcXFwic3NcXFwiKS5leHRyYTtcXG4gICAgICAgICAgICAgICAgZXh0cmEuZGVmYXVsdFZhbHVlID0ga2V5O1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiBleHRyYVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICB9LCBpZCwga2V5KSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImZsZXhfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogaWQgKyBcXFwiOmtleTpcXFwiICsga2V5LFxcbiAgICAgICAgICAgICAgICBjbHM6IGlkICsgXFxcIjprZXlcXFwiLFxcbiAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuWIoOmZpOWFs+mUruivjTpcXFwiICsga2V5LFxcbiAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGlkLCBrZXksIGkpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGlzdG9yeSA9IHN0b3JhZ2UwLmdldEl0ZW0oXFxcInNlYXJjaEhpc3RvcnlcXFwiLCBbXSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5zcGxpY2UoaSwgMSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwic2VhcmNoSGlzdG9yeVxcXCIsIGhpc3RvcnkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0oaWQgKyBcXFwiOmtleTpcXFwiICsga2V5KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3RvYXN0KCk7XFxuICAgICAgICAgICAgICAgICAgICB9LCBpZCwga2V5LCBpKVxcbiAgICAgICAgICAgICAgICB9XVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgICAgaSsrO1xcbiAgICB9XFxuICAgIGlmIChoaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCJ+fn7ku4DkuYjpg73msqHmnInlk6Z+fn5cXFwiLmZvbnRjb2xvcihcXFwiR3JheVxcXCIpLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGNsczogaWQgKyBcXFwiOmtleVxcXCIsXFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIHNldFRyZW5kaW5nVGFiRW5kKCkge1xcbiAgICBsZXQgaG90Q2xhc3MgPSB7XFxuICAgICAgICBcXFwi55m+5bqmXFxcIjoge1xcbiAgICAgICAgICAgIFxcXCLnlLXop4bliadcXFwiOiBcXFwidGVsZXBsYXlcXFwiLFxcbiAgICAgICAgICAgIFxcXCLnlLXlvbFcXFwiOiBcXFwibW92aWVcXFwiXFxuICAgICAgICB9LFxcbiAgICAgICAgXFxcIuWkuOWFi1xcXCI6IHtcXG4gICAgICAgICAgICBcXFwi55S16KeG5YmnXFxcIjogXFxcIueUteinhuWJp1xcXCIsXFxuICAgICAgICAgICAgXFxcIueUteW9sVxcXCI6IFxcXCLnlLXlvbFcXFwiLFxcbiAgICAgICAgICAgIFxcXCLliqjmvKtcXFwiOiBcXFwi5Yqo5ryrXFxcIixcXG4gICAgICAgICAgICBcXFwi57u86Im6XFxcIjogXFxcIue7vOiJulxcXCJcXG4gICAgICAgIH1cXG4gICAgfTtcXG4gICAgbGV0IGRhdGFTb3VyY2UgPSBPYmplY3Qua2V5cyhob3RDbGFzcyk7XFxuICAgIGxldCBzZWxlY3Rzb3VyY2UgPSBnZXRJdGVtKFxcXCJkYXRhU291cmNlXFxcIiwgZGF0YVNvdXJjZVswXSk7XFxuICAgIGxldCBob3RrZXlzID0gT2JqZWN0LmtleXMoaG90Q2xhc3Nbc2VsZWN0c291cmNlXSk7XFxuICAgIGxldCBzZWxlY3RrZXkgPSBnZXRJdGVtKFxcXCJob3RrZXlcXFwiLCBob3RrZXlzWzBdKTtcXG4gICAgbGV0IHRhYmtleSA9IGhvdENsYXNzW3NlbGVjdHNvdXJjZV1bc2VsZWN0a2V5XTtcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiNmZjY2MDFcXFwiPjxiPicgKyBzZWxlY3Rzb3VyY2UgKyBzZWxlY3RrZXkgKyAn54Ot5pCcPC9iPjwvc3Bhbj4nLFxcbiAgICAgICAgdXJsOiAkKGhvdGtleXMsIDEsIFxcXCLliIfmjaLng63mkJxcXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcImhvdGtleVxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suWIh+aNouS4ulxcXCIgKyBpbnB1dDtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fZmlyZVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLliIfmjaLmlbDmja7mupBcXFwiLFxcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoZGF0YVNvdXJjZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoZGF0YVNvdXJjZSwgMSwgXFxcIuWIh+aNouaVsOaNrua6kFxcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwiZGF0YVNvdXJjZVxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcImhvdGtleVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5YiH5o2i5Li6XFxcIiArIGlucHV0O1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0sIGRhdGFTb3VyY2UpXFxuICAgICAgICAgICAgfV1cXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuato+WcqOWKoOi9vS4uLlxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBpZCArIFxcXCI6aG90a2V5XFxcIixcXG4gICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIHNldFJlc3VsdChkKTtcXG4gICAgbGV0IHNkID0gW107XFxuICAgIGxldCBzZXRTZWFyY2hLZXkgPSBuYW1lID0+IHtcXG4gICAgICAgIHB1dE15VmFyKCdzJywgbmFtZSk7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICB9O1xcblxcbiAgICBsZXQgZ2V0VGl0bGUgPSAoaSwgbmFtZSkgPT4ge1xcbiAgICAgICAgbGV0IGNvbG9yO1xcbiAgICAgICAgc3dpdGNoIChpKSB7XFxuICAgICAgICAgICAgY2FzZSAwOlxcbiAgICAgICAgICAgICAgICBjb2xvciA9IFxcXCIjZmYzMzAwXFxcIjtcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgY2FzZSAxOlxcbiAgICAgICAgICAgICAgICBjb2xvciA9IFxcXCIjZmY2NjAwXFxcIjtcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgY2FzZSAyOlxcbiAgICAgICAgICAgICAgICBjb2xvciA9IFxcXCIjZmY5OTAwXFxcIlxcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICBkZWZhdWx0OlxcbiAgICAgICAgICAgICAgICBjb2xvciA9IFxcXCJibGFja1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBTdHJpbmcoaSArIDEpLmZvbnRjb2xvcihjb2xvcikgKyBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIG5hbWU7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIHN3aXRjaCAoc2VsZWN0c291cmNlKSB7XFxuICAgICAgICAgICAgY2FzZSBcXFwi55m+5bqmXFxcIjpcXG4gICAgICAgICAgICAgICAgdmFyIGpzb24gPSByZXF1ZXN0KCdodHRwczovL3RvcC5iYWlkdS5jb20vYXBpL2JvYXJkP3BsYXRmb3JtPXdpc2UmdGFiPScgKyB0YWJrZXkgKyAnJnRhZz0lN0IlMjJjYXRlZ29yeSUyMjolMjIlRTUlODUlQTglRTklODMlQTglRTclQjElQkIlRTUlOUUlOEIlMjIlN0QnLCB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMDsgTmV4dXMgNSBCdWlsZC9NUkE1OE4pIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS85OS4wLjQ4NDQuNTEgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdIb3N0JzogJ3RvcC5iYWlkdS5jb20nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzogJ3poLUNOLHpoO3E9MC45LGVuLVVTO3E9MC44LGVuO3E9MC43JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnQWNjZXB0LUVuY29kaW5nJzogJ2d6aXAsIGRlZmxhdGUsIGJyJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3RvcC5iYWlkdS5jb20vYm9hcmQ/dGFiPW5vdmVsJyxcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIC8vdmFyIHMgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IEpTT04ucGFyc2UoanNvbikuZGF0YS5jYXJkc1swXS5jb250ZW50O1xcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gbGlzdFtpXTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaXRlbS53b3JkICsgJyAoJyArIGl0ZW0uc2hvd1syXSArICcpJztcXG4gICAgICAgICAgICAgICAgICAgIGxldCBkZXMgPSBpdGVtLmRlc2M7XFxuICAgICAgICAgICAgICAgICAgICBzZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZ2V0VGl0bGUoaSwgbmFtZSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKHNldFNlYXJjaEtleSwgaXRlbS53b3JkKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBkZXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiBpdGVtLmltZyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcIm1vdmllXzFfdmVydGljYWxfcGljXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgY2FzZSBcXFwi5aS45YWLXFxcIjpcXG4gICAgICAgICAgICAgICAgdmFyIGpzb24gPSByZXF1ZXN0KFxcXCJodHRwczovL25ld3MubXlxdWFyay5jbi92Mi90b3BsaXN0L21vdmllPyZjaGFubmVsPVxcXCIgKyB0YWJrZXkgKyBcXFwiJnJhbmtfdHlwZT0lRTYlOUMlODAlRTclODMlQURcXFwiKTtcXG4gICAgICAgICAgICAgICAgdmFyIHhtbERhdGEgPSAoSlNPTi5wYXJzZShqc29uKS5kYXRhIHx8IFxcXCJcXFwiKS5yZXBsYWNlKC90aXRsZT4vZywgXFxcImhfdGl0bGU+XFxcIikucmVwbGFjZSgvc3JjPi9nLCBcXFwiaF9zcmM+XFxcIikucmVwbGFjZSgvYXJlYT4vZywgXFxcImhfYXJlYVxcXCIpO1xcbiAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IHBkZmEoeG1sRGF0YSwgXFxcImJvZHkmJml0ZW1cXFwiKTtcXG4gICAgICAgICAgICAgICAgdmFyIGdldFRleHQgPSB0ID0+IHQ7XFxuICAgICAgICAgICAgICAgIHZhciB0cmVuZCA9IFtcXFwi44SnXFxcIiwgXFxcIuKGkVxcXCIsIFxcXCLihpNcXFwiXTtcXG4gICAgICAgICAgICAgICAgLy92YXIgcyA9IERhdGUubm93KCk7XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBsaXN0W2ldO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBwZGZoKGl0ZW0sIFxcXCJoX3RpdGxlJiZUZXh0XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGVzID0gXFxcIueDreW6pu+8mlxcXCIgKyBwZGZoKGl0ZW0sIFxcXCJob3Rfc2NvcmUmJlRleHRcXFwiKSArIFxcXCIgXFxcIiArIHRyZW5kLmF0KHBkZmgoaXRlbSwgXFxcImhvdF90cmVuZCYmVGV4dFxcXCIpKSArXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlxcXFxu6K+E5YiG77yaXFxcIiArIHBkZmgoaXRlbSwgXFxcInNjb3JlX2F2ZyYmVGV4dFxcXCIpLnJlcGxhY2UoL14wJC8sIFxcXCLmmoLml6Dor4TliIZcXFwiKSArXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlxcXFxuXFxcIiArIHBkZmgoaXRlbSwgXFxcInllYXImJlRleHRcXFwiKSArIFxcXCLCt1xcXCIgKyBwZGZoKGl0ZW0sIFxcXCJoX2FyZWEmJlRleHRcXFwiKSArIFxcXCLCt1xcXCIgKyBwZGZoKGl0ZW0sIFxcXCJjYXRlZ29yeSYmVGV4dFxcXCIpLnJlcGxhY2UoXFxcIixcXFwiLCBcXFwiwrdcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIHNkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBnZXRUaXRsZShpLCBuYW1lKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoc2V0U2VhcmNoS2V5LCBuYW1lKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBkZXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiBwZGZoKGl0ZW0sIFxcXCJoX3NyYyYmVGV4dFxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibW92aWVfMV92ZXJ0aWNhbF9waWNcXFwiXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgICAgIGFkZEl0ZW1BZnRlcihpZCArIFxcXCI6aG90a2V5XFxcIiwgc2QpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgfSBmaW5hbGx5IHtcXG4gICAgICAgIGRlbGV0ZUl0ZW0oaWQgKyBcXFwiOmhvdGtleVxcXCIpO1xcbiAgICB9XFxufVxcbmxldCByID0gZ2V0SXRlbShcXFwicnVsZVxcXCIsIFxcXCJcXFwiKTtcXG5sZXQgaGlkZVNldHRpbmcgPSBNWV9QQVJBTVMuaGlkZVNldHRpbmcgfHwgZ2V0UGFyYW0oXFxcImhpZGVTZXR0aW5nXFxcIiwgXFxcIlxcXCIpID09PSBcXFwidHJ1ZVxcXCI7XFxubGV0IHMgPSBnZXRNeVZhcigncycsICcnKSB8fCBNWV9QQVJBTVMuc2VhcmNoVGVybXMgfHwgZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJzZWFyY2hUZXJtc1xcXCIsIFxcXCJcXFwiKSk7XFxubGV0IHNlYXJjaE1vZGUgPSBnZXRTZWFyY2hNb2RlKCk7XFxubGV0IG9wZW5Nb2RlID0gZ2V0SXRlbShcXFwib3Blbk1vZGVcXFwiLCBcXFwi5pys5Zyw6Kej5p6QXFxcIik7XFxubGV0IGlkID0gRGF0ZS5ub3coKSArIE1ZX1JVTEUudGl0bGU7XFxubGV0IHJ1bGVHcm91cCA9IGdldEl0ZW0oXFxcInJ1bGVHcm91cFxcXCIsIFxcXCJcXFwiKTtcXG5sZXQgZCA9IFtdO1xcbmlmIChNWV9QQUdFID09PSAxKSB7XFxuICAgIHNldFByZXBvc2UoKTtcXG4gICAgaWYgKCFoaWRlU2V0dGluZykge1xcbiAgICAgICAgc2V0Q2xpcCgpO1xcbiAgICAgICAgc2V0SGVhZCgpO1xcbiAgICB9XFxuICAgIHNldFJ1bGVJdGVtKCk7XFxuICAgIGlmICghcykge1xcbiAgICAgICAgc2V0SGlzdG9yeSgpO1xcbiAgICB9XFxufVxcbmlmIChzKSB7XFxuICAgIHJlY29yZCgpO1xcbiAgICBzZWFyY2hFbmQoKTtcXG59IGVsc2UgaWYgKE1ZX1BBR0UgPT09IDEpIHtcXG4gICAgc2V0VHJlbmRpbmdUYWJFbmQoKTtcXG59IGVsc2Uge1xcbiAgICBzZXRSZXN1bHQoW10pO1xcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIue9kemhtea1j+iniFwiLFwicGF0aFwiOlwieXNmeFwiLFwicnVsZVwiOlwianM6XFxudmFyIGQgPSBbXTtcXG5cXG5sZXQgb3Blbk1vZGUgPSBnZXRJdGVtKFxcXCJvcGVuTW9kZVxcXCIpO1xcbmxldCBydWxlID0gTVlfUlVMRS50aXRsZTtcXG5sZXQgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJ3ZWJVcmxcXFwiLFxcXCJcXFwiKSk7XFxuXFxuZnVuY3Rpb24gaW50ZXJjZXB0KHJ1bGUsIG9yaWdpbiwgb3Blbk1vZGUpIHtcXG4gICAgbGV0IGhvc3QgPSBvcmlnaW4ucmVwbGFjZShuZXcgUmVnRXhwKFxcXCJodHRwOi8vfGh0dHBzOi8vXFxcIiksIFxcXCJcXFwiKS5zcGxpdChcXFwiL1xcXCIpWzBdO1xcbiAgICBsZXQgaG9zdHMgPSBob3N0LnNwbGl0KFxcXCIuXFxcIik7XFxuICAgIGlmIChob3N0cy5sZW5ndGggPiAyKSB7XFxuICAgICAgICBob3N0ID0gaG9zdHNbaG9zdHMubGVuZ3RoIC0gMl0gKyBcXFwiLlxcXCIgKyBob3N0c1tob3N0cy5sZW5ndGggLSAxXTtcXG4gICAgfVxcbiAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFwibWFnbmV0XFxcIikpIHtcXG4gICAgICAgIGNvbmZpcm0oe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5rip6aao5o+Q56S6XFxcIixcXG4gICAgICAgICAgICBjb250ZW50OiBcXFwi5qOA5rWL5Yiw5paw55qE56OB6ZO+5Zyw5Z2A77yM54K55Ye756Gu5a6a5oyJ6ZKu5Y2z5Y+v5pKt5pS+77yM54K55Ye75Y+W5raI5oyJ6ZKu5Y+v5Lul5aSN5Yi26ZO+5o6lXFxcIixcXG4gICAgICAgICAgICBjb25maXJtOiAkLnRvU3RyaW5nKChtYWcpID0+IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hZztcXG4gICAgICAgICAgICB9LCBpbnB1dCksXFxuICAgICAgICAgICAgY2FuY2VsOiAkLnRvU3RyaW5nKChtYWcpID0+IHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIG1hZ1xcbiAgICAgICAgICAgIH0sIGlucHV0KVxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgfSBlbHNlIGlmICgkLnJlcXVpcmUoXFxcImFsaXRlc3Q/cnVsZT1cXFwiK3J1bGUpLnRlc3QoaW5wdXQpICYmIG9wZW5Nb2RlICE9IFxcXCLlrpjmlrlBUFBcXFwiKSB7XFxuICAgICAgICBsb2coaW5wdXQpO1xcbiAgICAgICAgaWYgKGlucHV0LmluY2x1ZGVzKCdjaGVja3VybD91cmw9JykgJiYgaW5wdXQuaW5jbHVkZXMoJyZ1cmxyZWZlcicpKSB7XFxuICAgICAgICAgICAgaW5wdXQgPSBkZWNvZGVVUklDb21wb25lbnQoaW5wdXQuc3BsaXQoJyZ1cmxyZWZlcicpWzBdLnNwbGl0KCdjaGVja3VybD91cmw9JylbMV0pO1xcbiAgICAgICAgICAgIC8vbG9nKCfotLTlkKcnK2lucHV0KTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiAkLnRvU3RyaW5nKCh1cmwsIHJ1bGUpID0+IHtcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLm9wZW4oSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIumYv+mHjOS6keebmFxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9hbGl5dW4/cGFnZT1meXBhZ2UmcmVhbHVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVybCkgKyBcXFwiJnJ1bGU9XFxcIiArIHJ1bGUsXFxuICAgICAgICAgICAgfSkpXFxuICAgICAgICB9LCBpbnB1dCwgcnVsZSk7XFxuICAgIH0gZWxzZSBpZiAoL1xcXFwuKG1wM3xmbGFjfG00YSkkLy50ZXN0KGlucHV0KSkge1xcbiAgICAgICAgbG9nKGlucHV0KTtcXG4gICAgICAgIHJldHVybiAkLnRvU3RyaW5nKCh1cmwsIHJ1bGUpID0+IHtcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLnBsYXlWaWRlbyh1cmwpO1xcbiAgICAgICAgfSwgaW5wdXQsIHJ1bGUpO1xcbiAgICB9IGVsc2UgaWYgKCFpbnB1dC5pbmNsdWRlcyhob3N0KSAmJiBpbnB1dC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgIGxvZyhpbnB1dCk7XFxuICAgICAgICByZXR1cm4gJC50b1N0cmluZygodXJsLCBydWxlKSA9PiB7XFxuICAgICAgICAgICAgZnlfYnJpZGdlX2FwcC5vcGVuKEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLor6bmg4VcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UveXNmeD93ZWJVcmw9XFxcIitlbmNvZGVVUklDb21wb25lbnQodXJsKStcXFwiJnJ1bGU9XFxcIitydWxlLFxcbiAgICAgICAgICAgIH0pKVxcbiAgICAgICAgfSwgaW5wdXQsIHJ1bGUpO1xcbiAgICB9IGVsc2UgaWYgKCFpbnB1dC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgIGxvZyhpbnB1dCk7XFxuICAgICAgICAvL+iDveWUpOi1t0FQUOeahOeZveWQjeWNlVxcbiAgICAgICAgbGV0IHdoaXRlID0gW1xcbiAgICAgICAgICAgIFxcXCJxa2xpbmtcXFwiLFxcbiAgICAgICAgICAgIFxcXCJiZG5ldGRpc2tcXFwiLFxcbiAgICAgICAgICAgIFxcXCJ4dW5sZWlhcHBcXFwiLFxcbiAgICAgICAgICAgIFxcXCJzbWFydGRyaXZlXFxcIlxcbiAgICAgICAgXTtcXG4gICAgICAgIGxldCBpbldoaXRlID0gd2hpdGUuZmlsdGVyKGl0ID0+IGlucHV0LnN0YXJ0c1dpdGgoaXQpKS5sZW5ndGggPiAwO1xcbiAgICAgICAgaWYgKCFpbldoaXRlKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuICQudG9TdHJpbmcoKHVybCwgcnVsZSkgPT4ge1xcbiAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAub3BlblRoaXJkQXBwICYmIGZ5X2JyaWRnZV9hcHAub3BlblRoaXJkQXBwKHVybCk7XFxuICAgICAgICB9LCBpbnB1dCwgcnVsZSk7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gbG9hZEpzKCkge1xcbiAgICB0cnkge1xcbiAgICAgICAgaWYgKGRvY3VtZW50LnRpdGxlICYmIGRvY3VtZW50LnRpdGxlLmxlbmd0aCkge1xcbiAgICAgICAgICAgIGxldCByID0gJCQkKCkubGF6eVJ1bGUoKHQpID0+IHtcXG4gICAgICAgICAgICAgICAgc2V0UGFnZVRpdGxlKHQpO1xcbiAgICAgICAgICAgIH0sIGRvY3VtZW50LnRpdGxlKTtcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLnBhcnNlTGF6eVJ1bGUocik7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGZ5X2JyaWRnZV9hcHAubG9nKGUudG9TdHJpbmcoKSk7XFxuICAgIH1cXG59XFxuXFxuZC5wdXNoKHtcXG4gICAgdXJsOiB1cmwsXFxuICAgIGNvbF90eXBlOiBcXFwieDVfd2Vidmlld19zaW5nbGVcXFwiLFxcbiAgICBkZXNjOiBcXFwiMTAwJSYmZmxvYXRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdXJsSW50ZXJjZXB0b3I6ICQudG9TdHJpbmcoaW50ZXJjZXB0LCBydWxlLCBnZXRIb21lKHVybCksIG9wZW5Nb2RlKSxcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKGxvYWRKcyksXFxuICAgICAgICBjYW5CYWNrOiB0cnVlLFxcbiAgICAgICAganNMb2FkaW5nSW5qZWN0OiB0cnVlLFxcbiAgICAgICAgZmxvYXRWaWRlbzogdHJ1ZVxcbiAgICB9XFxufSk7XFxuXFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Zi/6YeMTGF6eVwiLFwicGF0aFwiOlwiYWxpbGF6eVwiLFwicnVsZVwiOlwiY29uc3QgQWxpQWNjZXNzQXBpID0gJC5yZXF1aXJlKFxcXCJhbGlQbGF5QXBpXFxcIik7XFxuY29uc3Qge1xcbiAgICBvcGVuVG9rZW5zRmlsZXBhdGgsXFxuICAgIGFsaVRva2Vuc0ZpbGVwYXRoXFxufSA9ICQucmVxdWlyZShcXFwidG9rZW5QYXRoXFxcIik7XFxuXFxuZnVuY3Rpb24gYWxpTTN1OFByb3h5KGZpbGVJZCwgc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGFsaVRva2VuLCB0aXRsZSkge1xcbiAgICAvL+i/h+acn+iOt+WPluaSreaUvuWOn+Wni+mTvuaOpVxcbiAgICBmdW5jdGlvbiBnZXRBbGlQbGF5VXJsKGZpbGVJZCwgbGluZSkge1xcbiAgICAgICAgbGV0IGFsaXVybDtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgY29uc3QgQWxpQWNjZXNzQXBpID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvYWxpUGxheUFwaT9ydWxlPVxcXCIgKyB0aXRsZSk7XFxuICAgICAgICAgICAgbGV0IGFsaUFjY2Vzc0FwaSA9IEFsaUFjY2Vzc0FwaS5jcmVhdGVEZWZhdWx0KHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBhbGlUb2tlbiwgbnVsbCwgdGl0bGUpO1xcbiAgICAgICAgICAgIGxldCBwbGF5VXJsTGlzdCA9IGFsaUFjY2Vzc0FwaS5nZXRTaGFyZVZpZGVvUHJldmlldyhmaWxlSWQpIHx8IFtdO1xcbiAgICAgICAgICAgIGFsaXVybCA9IHBsYXlVcmxMaXN0LmZpbmQodiA9PiB2LnRlbXBsYXRlX2lkID09IGxpbmUpLnVybDtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGFsaXVybDtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBnZXRNM3U4Q29udGVudChwbGF5dXJsKSB7XFxuXFxuICAgICAgICAvL2xvZyhcXFwi5oiR5Zyo5Luj55CGXFxcIiArIHBsYXl1cmwpO1xcbiAgICAgICAgbGV0IGhvbWUgPSBwbGF5dXJsLnNwbGl0KFxcXCJtZWRpYS5tM3U4XFxcIilbMF07XFxuICAgICAgICBsZXQgZiA9IGZldGNoKHBsYXl1cmwsIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogUENfVUEsXFxuICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9cXFwiXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB0aW1lb3V0OiAzMDAwXFxuICAgICAgICB9KS5zcGxpdChcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIGxldCBmZiA9IGYubWFwKGl0ID0+IHtcXG4gICAgICAgICAgICBpZiAoaXQuc3RhcnRzV2l0aChcXFwibWVkaWEtXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCIvcHJveHk/dXJsPVxcXCIgKyBiYXNlNjRFbmNvZGUoaG9tZSArIGl0KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGl0O1xcbiAgICAgICAgfSkuam9pbihcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIC8vbG9nKCd1ZmlkLScgKyBmaWxlaWQpO1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9cXFwiICsgZmlsZUlkICsgXFxcIi5tM3U4XFxcIiwgZmYpO1xcbiAgICAgICAgcmV0dXJuIGZmO1xcbiAgICB9XFxuXFxuICAgIGZ1bmN0aW9uIHVwZGF0ZVRzVXJsKHVybCkge1xcbiAgICAgICAgbGV0IGZpZCA9IHVybC5zcGxpdCgnJmY9JylbMV0uc3BsaXQoJyYnKVswXTtcXG4gICAgICAgIC8vbG9nKCdzZmlkLScgKyBmaWQpO1xcbiAgICAgICAgbGV0IGYgPSBmZXRjaCgnaGlrZXI6Ly9maWxlcy9fY2FjaGUvJyArIGZpZCArICcubTN1OCcpLnNwbGl0KFxcXCJcXFxcblxcXCIpO1xcbiAgICAgICAgZi5mb3JFYWNoKGl0ID0+IHtcXG4gICAgICAgICAgICBpZiAoaXQgJiYgaXQuc3RhcnRzV2l0aCgnL3Byb3h5P3VybD0nKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgZnVybCA9IGJhc2U2NERlY29kZShpdC5yZXBsYWNlKCcvcHJveHk/dXJsPScsICcnKSk7XFxuICAgICAgICAgICAgICAgIGlmICh1cmwuc3Vic3RyKHVybC5pbmRleE9mKCcvbWVkaWEtJyksIHVybC5pbmRleE9mKCcudHMnKSkgPT0gZnVybC5zdWJzdHIoZnVybC5pbmRleE9mKCcvbWVkaWEtJyksIGZ1cmwuaW5kZXhPZignLnRzJykpKSB7XFxuICAgICAgICAgICAgICAgICAgICB1cmwgPSBmdXJsO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgICAgIGxldCBleHBpcmVzID0gdXJsLnNwbGl0KCd4LW9zcy1leHBpcmVzPScpWzFdLnNwbGl0KCcmJylbMF07XFxuICAgICAgICBjb25zdCBsYXN0dGltZSA9IHBhcnNlSW50KGV4cGlyZXMpIC0gRGF0ZS5ub3coKSAvIDEwMDA7XFxuICAgICAgICBpZiAobGFzdHRpbWUgPCA2MCkge1xcbiAgICAgICAgICAgIC8vbG9nKCfov4fmnJ/mm7TmlrAnKVxcbiAgICAgICAgICAgIGxldCBsaW5lID0gdXJsLnNwbGl0KCcvbWVkaWEnKVswXTsgLy/lj5bkuYvliY3mkq3mlL7nmoR0c+autee6v+i3r1xcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZyhsaW5lLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcXG4gICAgICAgICAgICBsZXQgZiA9IGdldE0zdThDb250ZW50KGdldEFsaVBsYXlVcmwoZmlkLCBsaW5lKSkuc3BsaXQoXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICAgICAgZi5mb3JFYWNoKGl0ID0+IHtcXG4gICAgICAgICAgICAgICAgaWYgKGl0ICYmIGl0LnN0YXJ0c1dpdGgoJy9wcm94eT91cmw9JykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBmdXJsID0gYmFzZTY0RGVjb2RlKGl0LnJlcGxhY2UoJy9wcm94eT91cmw9JywgJycpKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh1cmwuc3Vic3RyKHVybC5pbmRleE9mKCcvbWVkaWEtJyksIHVybC5pbmRleE9mKCcudHMnKSkgPT0gZnVybC5zdWJzdHIoZnVybC5pbmRleE9mKCcvbWVkaWEtJyksIGZ1cmwuaW5kZXhPZignLnRzJykpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gZnVybDtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuXFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gdXJsO1xcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgdXJsID0gYmFzZTY0RGVjb2RlKE1ZX1BBUkFNUy51cmxbMF0pO1xcbiAgICAgICAgaWYgKHVybC5pbmNsdWRlcyhcXFwiLnRzXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAzMDIsXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJMb2NhdGlvblxcXCI6IHVwZGF0ZVRzVXJsKHVybCksXFxuICAgICAgICAgICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFBDX1VBLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL1xcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQgdGVtcGxhdGVJZCA9IE1ZX1BBUkFNUy50ZW1wbGF0ZUlkWzBdO1xcbiAgICAgICAgICAgIGxldCBmZiA9IGdldE0zdThDb250ZW50KGdldEFsaVBsYXlVcmwoZmlsZUlkLCB0ZW1wbGF0ZUlkKSk7XFxuICAgICAgICAgICAgcmV0dXJuIGZmO1xcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coXFxcIuS7o+eQhuaSreaUvuWksei0pSNcXFxcbumUmeivr+S/oeaBrz5cXFwiICsgZS50b1N0cmluZygpICsgXFxcIlxcXFxu6ZSZ6K+v6KGMPlxcXCIgKyBlLmxpbmVOdW1iZXIpO1xcbiAgICB9XFxufVxcblxcblxcbmZ1bmN0aW9uIGdldFZpZGVvKGFsaUFjY2Vzc0FwaSwgZmlsZUlkKSB7XFxuXFxuICAgIGxldCBwbGF5VXJsTGlzdCA9IGFsaUFjY2Vzc0FwaS5nZXRTaGFyZVZpZGVvUHJldmlldyhmaWxlSWQpIHx8IFtdO1xcblxcbiAgICBsZXQgc2VydmVyQWRkcmVzcyA9IHN0YXJ0UHJveHlTZXJ2ZXIoJC50b1N0cmluZyhhbGlNM3U4UHJveHksIGZpbGVJZCwgYWxpQWNjZXNzQXBpLnNoYXJlSWQsIGFsaUFjY2Vzc0FwaS5zaGFyZVB3ZCwgYWxpQWNjZXNzQXBpLnNoYXJlVG9rZW4sIGFsaUFjY2Vzc0FwaS5hbGlUb2tlbiwgTVlfUlVMRS50aXRsZSkpO1xcbiAgICBsZXQgdHJhbnNjb2RpbmcgPSB7XFxuICAgICAgICBVSEQ6IFxcXCI0SyDotoXmuIVcXFwiLFxcbiAgICAgICAgUUhEOiBcXFwiMksg6LaF5riFXFxcIixcXG4gICAgICAgIEZIRDogXFxcIjEwODAg5YWo6auY5riFXFxcIixcXG4gICAgICAgIEhEOiBcXFwiNzIwIOmrmOa4hVxcXCIsXFxuICAgICAgICBTRDogXFxcIjU0MCDmoIfmuIVcXFwiLFxcbiAgICAgICAgTEQ6IFxcXCIzNjAg5rWB55WFXFxcIlxcbiAgICB9O1xcblxcbiAgICBpZiAocGxheVVybExpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgICAgbGV0IHVybHMgPSBbXSxcXG4gICAgICAgICAgICBuYW1lcyA9IFtdO1xcbiAgICAgICAgcGxheVVybExpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgIHVybHMucHVzaChzZXJ2ZXJBZGRyZXNzICsgXFxcIj91cmw9XFxcIiArIGJhc2U2NEVuY29kZShpdGVtLnVybCkgKyBcXFwiJnRlbXBsYXRlSWQ9XFxcIiArIGl0ZW0udGVtcGxhdGVfaWQgKyBcXFwiIy5tM3U4XFxcIik7XFxuICAgICAgICAgICAgbmFtZXMucHVzaCh0cmFuc2NvZGluZ1tpdGVtLnRlbXBsYXRlX2lkXSA/IHRyYW5zY29kaW5nW2l0ZW0udGVtcGxhdGVfaWRdIDogaXRlbS50ZW1wbGF0ZV9oZWlnaHQpO1xcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgaGVhZHMgPSBuZXcgQXJyYXkocGxheVVybExpc3QubGVuZ3RoKS5maWxsKHtcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgIHVybHM6IHVybHMsXFxuICAgICAgICAgICAgbmFtZXM6IG5hbWVzLFxcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRzLFxcbiAgICAgICAgfTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiB7fTtcXG4gICAgfVxcblxcbn07XFxuXFxuZnVuY3Rpb24gZ2V0UGxheUZvcm1hdChwbGF5VXJsLCB0aXRsZSkge1xcbiAgICByZXR1cm4ge1xcbiAgICAgICAgbmFtZXM6IFt0aXRsZV0sXFxuICAgICAgICB1cmxzOiBbcGxheVVybCArIFxcXCIjaXNWaWRlbz10cnVlIyNpZ25vcmVNdXNpYz10cnVlI1xcXCJdLFxcbiAgICAgICAgaGVhZGVyczogW3tcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJyxcXG4gICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFxcXCJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTE3LjAuMC4wIFNhZmFyaS81MzcuMzZcXFwiXFxuICAgICAgICB9XVxcbiAgICB9O1xcbn1cXG5cXG5cXG4kLmV4cG9ydHMgPSBmdW5jdGlvbihzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgZmlsZUlkLCBjYXRlLCB6aW11KSB7XFxuICAgIGlmICghZmlsZUV4aXN0KGFsaVRva2Vuc0ZpbGVwYXRoKSkge1xcbiAgICAgICAgdG9hc3QoXFxcIuivt+WFiOeZu+mZhueZu+W9lei0puWPt1xcXCIpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP25vUmVmcmVzaD0xXFxcIjtcXG4gICAgfVxcbiAgICBsZXQgYWxpVG9rZW4gPSAkLnJlcXVpcmUoYWxpVG9rZW5zRmlsZXBhdGgpO1xcbiAgICBpZiAoY2F0ZSA9PT0gXFxcInZpZGVvXFxcIikge1xcbiAgICAgICAgbGV0IHBsYXlMaXN0ID0gW107XFxuICAgICAgICBsZXQgYWxpQWNjZXNzQXBpO1xcbiAgICAgICAgbGV0IHBsYXlNb2RlID0gZ2V0SXRlbShcXFwiYWxpeXVuX3BsYXlNb2RlXFxcIiwgXFxcIui9rOeggVxcXCIpO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBhbGlBY2Nlc3NBcGkgPSBBbGlBY2Nlc3NBcGkuY3JlYXRlRGVmYXVsdChzaGFyZUlkLCBzaGFyZVB3ZCwgc2hhcmVUb2tlbiwgYWxpVG9rZW4pO1xcbiAgICAgICAgICAgIGlmIChwbGF5TW9kZSA9PT0gXFxcIui9rOeggVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcGxheUxpc3QgPSBnZXRWaWRlbyhhbGlBY2Nlc3NBcGksIGZpbGVJZCkgfHwge307XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChwbGF5TW9kZSA9PT0gXFxcIuWOn+eUu1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgcGxheUxpc3QgPSBnZXRQbGF5Rm9ybWF0KGFsaUFjY2Vzc0FwaS5nZXRWaWRlb1RlbVBsYXlVcmwoZmlsZUlkKSwgcGxheU1vZGUpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGxheU1vZGUgPT09IFxcXCLmnoHpgJ/ljp/nlLtcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHBsYXlMaXN0ID0gZ2V0UGxheUZvcm1hdChhbGlBY2Nlc3NBcGkuZ2V0RmlsZVRvRG93blVybChmaWxlSWQpICsgXFxcIiNmYXN0UGxheU1vZGUjI3RocmVhZHM9XFxcIiArIGdldEl0ZW0oXFxcInNwZWVkVGhyZWFkXFxcIiwgXFxcIjIwXFxcIikgKyBcXFwiI1xcXCIsIHBsYXlNb2RlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKFxcXCIjXFxcIiArIHBsYXlNb2RlICsgXFxcIuaSreaUvuWksei0pSNcXFxcbumUmeivr+S/oeaBrz5cXFwiICsgZS50b1N0cmluZygpICsgXFxcIlxcXFxu6ZSZ6K+v6KGMPlxcXCIgKyBlLmxpbmVOdW1iZXIpO1xcbiAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IFxcXCJJbnZhbGlkUGFyYW1ldGVyLlJlZnJlc2hUb2tlblxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdG9hc3QoXFxcIueZu+mZhui/h+acn++8jOivt+mHjeaWsOeZu+mZhlxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/bm9SZWZyZXNoPTFcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5jb2RlID09PSBcXFwiUXVvdGFFeGhhdXN0ZWQuRHJpdmVcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/nvZHnm5jnqbrpl7TkuI3otrPvvIzml6Dms5Xmkq3mlL7or7fmuIXnkIbjgIJcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pKt5pS+5aSx6LSl77yM6ZSZ6K+v5L+h5oGv5bey5omT5Y2w44CCXFxcXG7or7fmn6XnnIvml6Xlv5coTE9HKVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgbW91bnRzdWIgPSBzdG9yYWdlMC5nZXRNeVZhcignbW91bnR6aW11Jywge30pO1xcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1vdW50c3ViKS5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgemltdSA9IG1vdW50c3ViO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHN1YnRpdGxlO1xcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHppbXUgfHwge30pLmxlbmd0aCA+IDAgJiYgcGxheUxpc3QgJiYgcGxheUxpc3QudXJscyAmJiBwbGF5TGlzdC51cmxzLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDEwMCk7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgdmFyIHptdXJsID0gYWxpQWNjZXNzQXBpLmdldFZpZGVvVGVtUGxheVVybCh6aW11LmZpbGVfaWQpO1xcbiAgICAgICAgICAgICAgICBsZXQgcGF0aCA9ICdoaWtlcjovL2ZpbGVzL2NhY2hlL+S6keebmOWQmy9zdWIuJyArIHppbXUuZXh0O1xcbiAgICAgICAgICAgICAgICBkb3dubG9hZEZpbGUoem11cmwsIHBhdGgsIHtcXG4gICAgICAgICAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS8nXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IGdldFBhdGgocGF0aCk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwi5a2X5bmV5Yqg6L295aSx6LSlXFxcIik7XFxuICAgICAgICAgICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZG1saXN0XFxcIiwgW10pO1xcbiAgICAgICAgbGV0IGRtbGlzdF9jYWNoZSA9IGdldE15VmFyKFxcXCJkbWxpc3RfY2FjaGVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoZG1saXN0X2NhY2hlICYmIGRtbGlzdF9jYWNoZS5zdGFydHNXaXRoKGZpbGVJZCArIFxcXCIjXFxcIikpIHtcXG4gICAgICAgICAgICBwbGF5TGlzdC5kYW5tdSA9IGRtbGlzdF9jYWNoZS5yZXBsYWNlKGZpbGVJZCArIFxcXCIjXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgfSBlbHNlIGlmIChkbWxpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgIHBsYXlMaXN0LmRhbm11ID0gXFxcImhpa2VyOi8vZmlsZXMvY2FjaGUvZGFubXUvXFxcIiArIGRtbGlzdC5zcGxpY2UoMCwgMSlbMF07XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcImRtbGlzdF9jYWNoZVxcXCIsIGZpbGVJZCArIFxcXCIjXFxcIiArIHBsYXlMaXN0LmRhbm11KTtcXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiZG1saXN0XFxcIiwgZG1saXN0KTtcXG4gICAgICAgICAgICBpZiAoZG1saXN0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICB0b2FzdChcXFwi5by55bmV5YiX6KGo5bey5YWo6YOo5oyC6L29XFxcIik7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBwbGF5TGlzdC5kYW5tdSA9IGdldFZhcihcXFwiZG1fc2hhcmVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICB9XFxuICAgICAgICBwbGF5TGlzdC5zdWJ0aXRsZSA9IHN1YnRpdGxlO1xcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlMaXN0KTtcXG4gICAgfVxcblxcbiAgICBsZXQgYWxpQWNjZXNzQXBpID0gQWxpQWNjZXNzQXBpLmNyZWF0ZURlZmF1bHQoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGFsaVRva2VuLCBudWxsKTtcXG4gICAgbGV0IHVybCA9IGFsaUFjY2Vzc0FwaS5nZXRWaWRlb1RlbVBsYXlVcmwoZmlsZUlkKTtcXG5cXG4gICAgaWYgKGNhdGUgPT09IFxcXCJpbWFnZVxcXCIpIHtcXG4gICAgICAgIHJldHVybiB1cmwgKyBcXFwiIy5qcGdcXFwiO1xcbiAgICB9IGVsc2UgaWYgKGNhdGUgPT09IFxcXCJhdWRpb1xcXCIpIHtcXG4gICAgICAgIHJldHVybiB1cmwgKyBcXFwiI2lzTXVzaWM9dHJ1ZSNcXFwiO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIFxcXCJkb3dubG9hZDovL1xcXCIgKyB1cmw7XFxuICAgIH1cXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLpmL/ph4zliJfooahcIixcInBhdGhcIjpcImFsaXl1blwiLFwicnVsZVwiOlwianM6XFxuLy9AYXV0aG9yIExveURnSWtcXG5jb25zdCBBbGlTaGFyZUFwaSA9ICQucmVxdWlyZShcXFwiQWxpQXBpXFxcIik7XFxuXFxuXFxubGV0IG9wZW5BUElMaXN0ID0gW1xcXCJhbGlzdFxcXCIsIFxcXCJkcml2ZVxcXCIsIFxcXCJ0dmJveFxcXCIsIFxcXCJYQllcXFwiXTtcXG5cXG5sZXQgcmVhbHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicmVhbHVybFxcXCIsIFxcXCJcXFwiKSkuc3BsaXQoXFxcIj9cXFwiKVswXTtcXG5sZXQgdXJsRGF0YSA9IHJlYWx1cmwuc3BsaXQoXFxcIi9cXFwiKTtcXG4vL2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zL3tzaGFyZUlkfS9mb2xkZXIve2ZpbGVJZH0/O1xcblxcbmxldCBzaGFyZUlkID0gTVlfUEFSQU1TLnNoYXJlSWQgfHwgdXJsRGF0YVs0XTtcXG5sZXQgc2hhcmVQd2QgPSBnZXRQYXJhbShcXFwic2hhcmVQd2RcXFwiLCBNWV9QQVJBTVMuc2hhcmVQd2QgfHwgXFxcIlxcXCIpO1xcbmxldCBzaGFyZVRva2VuID0gZ2V0UGFyYW0oXFxcInNoYXJlVG9rZW5cXFwiLCBNWV9QQVJBTVMuc2hhcmVUb2tlbik7XFxuXFxubGV0IGZpbGVJZCA9ICh1cmxEYXRhWzVdID09PSBcXFwiZm9sZGVyXFxcIiA/IHVybERhdGFbNl0gOiB2b2lkIDApIHx8IE1ZX1BBUkFNUy5maWxlSWQ7XFxubGV0IHNlYXJjaEtleSA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwic2VhcmNoS2V5XFxcIiwgXFxcIlxcXCIpKSB8fCB1bmRlZmluZWQ7XFxubGV0IGlzU2VhcmNoID0gISFzZWFyY2hLZXk7XFxuXFxubGV0IHBhZ2VJZCA9IFN0cmluZyhEYXRlLm5vdygpKS5zbGljZSg2KTtcXG5cXG5sZXQgc2tpcEZpbGUgPSBpc1NlYXJjaCAmJiBnZXRJdGVtKFxcXCJza2lwRmlsZVxcXCIsIFxcXCIwXFxcIikgPT09IFxcXCIxXFxcIjtcXG5cXG5mdW5jdGlvbiBmb3JtYXREYXRlKF9kYXRlLCBmbXQpIHtcXG4gICAgbGV0IGRhdGUgPSAhaXNOYU4oX2RhdGUpID8gbmV3IERhdGUoX2RhdGUgKiAxMDAwKSA6IG5ldyBEYXRlKF9kYXRlKTtcXG4gICAgcmV0dXJuICQuZGF0ZUZvcm1hdChkYXRlLCBmbXQgfHwgXFxcInl5eXktTU0tZGQgSEg6bW06c3NcXFwiKVxcbn1cXG5cXG5mdW5jdGlvbiBmb3JtYXRTaXplKHNpemUpIHtcXG4gICAgaWYgKCFzaXplKSB7XFxuICAgICAgICByZXR1cm4gJyc7XFxuICAgIH1cXG4gICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcXG4gICAgbGV0IGkgPSAwO1xcbiAgICB3aGlsZSAoc2l6ZSA+PSAxMDI0KSB7XFxuICAgICAgICBzaXplIC89IDEwMjQ7XFxuICAgICAgICBpKys7XFxuICAgIH1cXG4gICAgc2l6ZSA9IGkgPyBOdW1iZXIoc2l6ZS50b0ZpeGVkKDIpKSA6IHNpemU7XFxuICAgIHJldHVybiBgJHtzaXplfSAke3VuaXRzW2ldfWA7XFxufVxcblxcbmZ1bmN0aW9uIHNldE15UGFDYWNoZShrZXksIHZhbHVlKSB7XFxuICAgIE1ZX1BBUkFNU1trZXldID0gdmFsdWU7XFxufVxcblxcbmZ1bmN0aW9uIHNhdmVNeVBhQ2FjaGUoKSB7XFxuICAgIHNldFBhZ2VQYXJhbXMoTVlfUEFSQU1TKTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0TWFya2VyKG1hcmtlcikge1xcbiAgICBzZXRNeVBhQ2FjaGUoXFxcIm1hcmtlclxcXCIsIG1hcmtlcik7XFxufVxcblxcbmZ1bmN0aW9uIHNldFRva2VuKHNoYXJlVG9rZW4pIHtcXG4gICAgc2V0TXlQYUNhY2hlKFxcXCJzaGFyZVRva2VuXFxcIiwgc2hhcmVUb2tlbik7XFxufVxcbmlmIChNWV9QQVJBTVMubm9QaWMpIHtcXG4gICAgc2V0UGFnZVBpY1VybCgpO1xcbiAgICBzZXRNeVBhQ2FjaGUoXFxcIm5vUGljXFxcIiwgZmFsc2UpO1xcbn1cXG4vKlxcbmZ1bmN0aW9uIHNldFZpZGVvSXRlbUNhY2hlKHZpZGVvSXRlbUNhY2hlKSB7XFxuICAgIHNldE15UGFDYWNoZShcXFwidmlkZW9JdGVtQ2FjaGVcXFwiLCB2aWRlb0l0ZW1DYWNoZSk7XFxufVxcblxcbmZ1bmN0aW9uIHNldFN1YnRpdGxlQ2FjaGUoc3VidGl0bGVDYWNoZSkge1xcbiAgICBzZXRNeVBhQ2FjaGUoXFxcInN1YnRpdGxlQ2FjaGVcXFwiLCBzdWJ0aXRsZUNhY2hlKTtcXG59Ki9cXG5cXG5sZXQgaWNvblR5cGUgPSBcXFwiYWl8YXBrfGF2aXxjc3N8ZG1nfGV4ZXxmbHZ8Z2lmfGhpa2VyfGh0bWx8aXNvfGpwZ3xqc3xqc29ufGxvZ3xtb3Z8bXAzfG1wNHxvdGZ8cGhwfHBuZ3xwcHR8cHNkfHRhYmxlfHR4dHx3YXZ8eGxzfHppcHxjc3N8ZG9jfGVwdWJ8ZXhjfGh0bXx4bHN4XFxcIi5zcGxpdCgnfCcpO1xcblxcbmZ1bmN0aW9uIGdldEljb24oZXh0LCB0eXBlKSB7XFxuICAgIGxldCByb290ID0gXFxcImh0dHBzOi8vZ2l0Y29kZS5uZXQvcXFfMzIzOTQzNTEvZHIvLS9yYXcvbWFzdGVyL2ltZy/mlofku7bnsbvlnosyL1xcXCI7XFxuICAgIGlmICh0eXBlID09PSBcXFwiZm9sZGVyXFxcIikge1xcbiAgICAgICAgcmV0dXJuIHJvb3QgKyBcXFwi5paH5Lu25aS5LnN2Z1xcXCI7XFxuICAgIH1cXG4gICAgaWYgKGljb25UeXBlLmluY2x1ZGVzKChleHQgfHwgXFxcIlxcXCIpLnRvTG93ZXJDYXNlKCkpKSB7XFxuICAgICAgICByZXR1cm4gcm9vdCArIGV4dCArIFxcXCIuc3ZnXFxcIjtcXG4gICAgfVxcbiAgICByZXR1cm4gcm9vdCArIFxcXCLmlofku7Yuc3ZnXFxcIjtcXG5cXG59XFxuXFxuZnVuY3Rpb24gbG9hZChpdGVtcykge1xcbiAgICBsZXQgYWxpU2hhcmVBcGkgPSBuZXcgQWxpU2hhcmVBcGkoc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIChzaGFyZVRva2VuKSA9PiB7XFxuICAgICAgICBzZXRUb2tlbihzaGFyZVRva2VuKTtcXG4gICAgICAgIE1ZX1BBUkFNUy5zaGFyZVRva2VuID0gc2hhcmVUb2tlbjtcXG4gICAgfSk7XFxuICAgIGxldCBvcmRlcnMgPSB7XFxuICAgICAgICBcXFwi5ZCN56ew5q2j5bqPXFxcIjogXFxcIm5hbWUjQVNDXFxcIixcXG4gICAgICAgIFxcXCLlkI3np7DlgJLluo9cXFwiOiBcXFwibmFtZSNERVNDXFxcIixcXG4gICAgICAgIFxcXCLml7bpl7TmraPluo9cXFwiOiBcXFwidXBkYXRlZF9hdCNBU0NcXFwiLFxcbiAgICAgICAgXFxcIuaXtumXtOWAkuW6j1xcXCI6IFxcXCJ1cGRhdGVkX2F0I0RFU0NcXFwiLFxcbiAgICAgICAgXFxcIuWkp+Wwj+ato+W6j1xcXCI6IFxcXCJzaXplI0FTQ1xcXCIsXFxuICAgICAgICBcXFwi5aSn5bCP5YCS5bqPXFxcIjogXFxcInNpemUjREVTQ1xcXCJcXG4gICAgfTtcXG4gICAgbGV0IHBsYXlNb2RlID0gZ2V0SXRlbShcXFwiYWxpeXVuX3BsYXlNb2RlXFxcIiwgXFxcIui9rOeggVxcXCIpO1xcbiAgICBsZXQgb3JkZXJzS2V5cyA9IE9iamVjdC5rZXlzKG9yZGVycyk7XFxuICAgIGxldCBvcmRlck5hbWUgPSBnZXRJdGVtKFxcXCJhbGl5dW5fb3JkZXJcXFwiLCBvcmRlcnNLZXlzWzBdKTtcXG4gICAgbGV0IG9yZGVyID0gb3JkZXJzW29yZGVyTmFtZV0uc3BsaXQoXFxcIiNcXFwiKTtcXG4gICAgbGV0IHN0eWxlcyA9IFtcXFwidGV4dF8xXFxcIiwgXFxcIm1vdmllXzJcXFwiLCBcXFwiY2FyZF9waWNfM1xcXCIsIFxcXCJhdmF0YXJcXFwiLCBcXFwi6L+95YmnXFxcIiwgXFxcIueci+WbvlxcXCJdO1xcbiAgICBsZXQgc3R5bGUgPSBnZXRJdGVtKFxcXCJhbGl5dW5fc3R5bGVcXFwiLCBzdHlsZXNbMF0pO1xcbiAgICBpZiAoTVlfUEFHRSA9PT0gMSkge1xcbiAgICAgICAgaWYgKCFnZXRNeVZhcihcXFwibW91bnR6aW11XFxcIiwgXFxcIlxcXCIpKSB7XFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcIm1vdW50emltdVxcXCIsIHt9KTtcXG4gICAgICAgICAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJtb3VudHppbXVcXFwiKTtcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwiYWxpU2hhcmVUb2tlblxcXCIpO1xcbiAgICAgICAgICAgICAgICBjbGVhclZhcihcXFwiZG1fc2hhcmVcXFwiKTtcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwiZG1saXN0XFxcIik7XFxuICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcImxpc3RTZWFyY2hLZXlcXFwiKTtcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwiZG1fbGlzdFVybExpc3RcXFwiKTtcXG4gICAgICAgICAgICB9KSk7XFxuICAgICAgICB9XFxuICAgICAgICBzZXRNYXJrZXIoKTtcXG4gICAgICAgIGlmIChyZWFsdXJsICYmICFpc1NlYXJjaCkge1xcbiAgICAgICAgICAgIGxldCBzaGFyZUluZm8gPSBhbGlTaGFyZUFwaS5nZXRTaGFyZUluZm8oKTtcXG4gICAgICAgICAgICBsZXQgZmlsZUluZm8gPSBzaGFyZUluZm8uZmlsZV9pbmZvcyB8fCBbXTtcXG4gICAgICAgICAgICBpZiAoZmlsZUluZm8ubGVuZ3RoID09PSAxICYmIGZpbGVJbmZvWzBdLnR5cGUgPT09IFxcXCJmb2xkZXJcXFwiICYmICFmaWxlSWQpIHtcXG4gICAgICAgICAgICAgICAgZmlsZUlkID0gZmlsZUluZm9bMF0uZmlsZV9pZDtcXG4gICAgICAgICAgICAgICAgc2V0UGFnZVRpdGxlKGZpbGVJbmZvWzBdLmZpbGVfbmFtZSk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgc2V0UGFnZVRpdGxlKHNoYXJlSW5mby5zaGFyZV9uYW1lKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGRlYWRsaW5lID0gXFxcIuawuOS5heacieaViFxcXCI7XFxuXFxuICAgICAgICAgICAgaWYgKHNoYXJlSW5mby5leHBpcmF0aW9uKSB7XFxuICAgICAgICAgICAgICAgIGRlYWRsaW5lID0gXFxcIuacieaViOiHs++8mlxcXCIgKyBmb3JtYXREYXRlKHNoYXJlSW5mby5leHBpcmF0aW9uKTtcXG4gICAgICAgICAgICAgICAgLy9zaGFyZUluZm8udXBkYXRlZF9hdFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IChzaGFyZUluZm8uY3JlYXRvcl9uYW1lIHx8IHNoYXJlSW5mby5jcmVhdG9yX3Bob25lKSArIFxcXCImbmJzcDsmbmJzcDtcXFwiICsgZGVhZGxpbmUuc21hbGwoKSxcXG4gICAgICAgICAgICAgICAgdXJsOiByZWFsdXJsICsgXFxcIiNub0hpc3RvcnkjXFxcIixcXG4gICAgICAgICAgICAgICAgaW1nOiBzaGFyZUluZm8uYXZhdGFyIHx8IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX3Vua25vd25cXFwiLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghaXNTZWFyY2gpIHtcXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLmkJzntKJcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC50cmltKCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWl5YWz6ZSu6K+NXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1biNub0hpc3RvcnkjI2Z1bGxUaGVtZSM/cGFnZT1meXBhZ2Umc2VhcmNoS2V5PVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZTogXFxcInB1dE15VmFyKCdsaXN0U2VhcmNoS2V5JyxpbnB1dClcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZDogc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IHNoYXJlVG9rZW5cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJxcXFwiICsgc2VhcmNoS2V5ICsgXFxcIuKAneKAneeahOaQnOe0oue7k+aenFxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBmdW5jSXRlbXMgPSBbXTtcXG4gICAgICAgIGZ1bmNJdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogc3R5bGUsXFxuICAgICAgICAgICAgdXJsOiAkKHN0eWxlcywgMSwgXFxcIuaOkuW4g+agt+W8j1xcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcImFsaXl1bl9zdHlsZVxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suWIh+aNolxcXCI7XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvYWxpX2ljb24uc3ZnXFxcIlxcbiAgICAgICAgfSwge1xcbiAgICAgICAgICAgIHRpdGxlOiBvcmRlck5hbWUsXFxuICAgICAgICAgICAgdXJsOiAkKG9yZGVyc0tleXMsIDIsIFxcXCLmjpLluo/mlrnlvI9cXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJhbGl5dW5fb3JkZXJcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liIfmjaLmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9zb3J0LnN2Z1xcXCJcXG4gICAgICAgIH0sIHtcXG4gICAgICAgICAgICB0aXRsZTogcGxheU1vZGUsXFxuICAgICAgICAgICAgdXJsOiAkKFtcXFwi6L2s56CBXFxcIiwgXFxcIuWOn+eUu1xcXCIvKiwgXFxcIuaegemAn+WOn+eUu1xcXCIqL10sIDEsIFxcXCLmkq3mlL7mqKHlvI9cXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJhbGl5dW5fcGxheU1vZGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liIfmjaLmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9wbGF5LnN2Z1xcXCIsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGlmIChwbGF5TW9kZSA9PT0gXFxcIuWOn+eUu1xcXCIpIHtcXG4gICAgICAgICAgICBmdW5jSXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBvcGVuQVBJTGlzdFtnZXRJdGVtKFxcXCJvcGVuQXBpTW9kZVxcXCIsIFxcXCIwXFxcIildLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQob3BlbkFQSUxpc3QsIDEsIFxcXCLljp/nlLtBUEko5LiN6KaB6aKR57mB5YiH5o2iKVxcXCIpLnNlbGVjdCgob3BlbkFQSUxpc3QpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcIm9wZW5BcGlNb2RlXFxcIiwgU3RyaW5nKG9wZW5BUElMaXN0LmluZGV4T2YoaW5wdXQpKSk7XFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGaWxlKCQucmVxdWlyZShcXFwidG9rZW5QYXRoXFxcIikub3BlblRva2Vuc0ZpbGVwYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LliIfmjaLkuLpcXFwiICsgaW5wdXQ7XFxuICAgICAgICAgICAgICAgIH0sIG9wZW5BUElMaXN0KSxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS9pbWcvYWxpX2FwaS5zdmdcXFwiLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCFpc1NlYXJjaCkge1xcbiAgICAgICAgICAgIGZ1bmNJdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLlip/og71cXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoW1xcXCLovazlrZjkupHnm5hcXFwiLCBcXFwi55m76ZmG6LSm5Y+3XFxcIiwgXFxcIuWkjeWItuWIhuS6q+mTvuaOpVxcXCIsIFxcXCLmn6XnnIvmiYvliqjmjILovb3lrZfluZVcXFwiLCBcXFwi6I635Y+W5by55bmV5pCc57Si6KeE5YiZXFxcIiwgXFxcIuaJuemHj+aMgui9veacrOWcsOW8ueW5lVxcXCIsIFxcXCLmjqjpgIHliLBUVkJveFxcXCIsIFxcXCLorr7nva7mlLbol4/lsIHpnaJcXFwiLCBcXFwi6I635Y+W5oqV5bGPSVBcXFwiLyosIFxcXCLmnoHpgJ/ljp/nlLvkuIvovb3nur/nqItcXFwiKi9dLCAyLCBcXFwi5pu05aSa5Yqf6IO9XFxcIikuc2VsZWN0KChzaGFyZUlkLCBzaGFyZVB3ZCwgZmlsZUlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGlucHV0KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi6L2s5a2Y5LqR55uYXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBzbWFydGRyaXZlOi8vc2hhcmUvYnJvd3NlP3NoYXJlSWQ9JHtzaGFyZUlkfSZzaGFyZVB3ZD0ke3NoYXJlUHdkfHxcXFwiXFxcIn1gO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIueZu+mZhui0puWPt1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoW1xcXCLlpI3liLbpk77mjqVcXFwiLCBcXFwi5aSN5Yi25rW36ZiU5Y+j5LukXFxcIl0sIDEsIFxcXCLliIbkuqvmlrnlvI9cXFwiKS5zZWxlY3QoKHVybCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi5aSN5Yi26ZO+5o6lXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyB1cmw7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL+mYv+mHjOS6keebmOWIhuS6q+WPo+S7pOOAjFxcXCIgKyBnZXRQYWdlVGl0bGUoKSArIFxcXCLjgI1cXFxcblxcXCIgKyB1cmwgKyBcXFwiIEBpbXBvcnQ9anM6YGhpa2VyOi8vcGFnZS9hbGl5dW4/cmVhbHVybD0ke2lucHV0LnRyaW0oKX0mcnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXCJgO1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFxcXCJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy9cXFwiICsgc2hhcmVJZCArIChmaWxlSWQgPyBcXFwiL2ZvbGRlci9cXFwiICsgZmlsZUlkIDogXFxcIlxcXCIpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCLmibnph4/mjILovb3mnKzlnLDlvLnluZVcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9kbU1vdW50I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi5p+l55yL5omL5Yqo5oyC6L295a2X5bmVXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHptID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcIm1vdW50emltdVxcXCIsIHt9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpcCA9IHptLm5hbWUgPyBcXFwi5b2T5YmN5a2X5bmV5paH5Lu2XFxcXG5cXFwiICsgem0ubmFtZSArIFxcXCIuXFxcIiArIHptLmV4dCA6IFxcXCLov5jmnKrmiYvliqjmjILovb3lrZfluZVcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5omL5Yqo5oyC6L295a2X5bmVJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRpcCArIFxcXCJcXFxcbijngrnlh7vlj5bmtojlj6/ku6XmuIXpmaTmjILovb3lrZfluZUpXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbDogKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoXFxcIm1vdW50emltdVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LmuIXpmaTmiYvliqjmjILovb3lrZfluZVcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIuiOt+WPluW8ueW5leaQnOe0ouinhOWImVxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImpzXFxcIjogSlNPTi5zdHJpbmdpZnkoXFxcImhpa2VyOi8vcGFnZS9sb2FkRG0/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXCImdGl0bGU9XFxcIikgKyBcXFwiK2VuY29kZVVSSUNvbXBvbmVudChwbGF5ZGF0YS50aXRsZS5zcGxpdCgnLScpWzBdKTtcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiBNWV9SVUxFLnRpdGxlICsgXFxcIuW8ueW5leaQnOe0olxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJydWxlOi8vXFxcIiArIGJhc2U2NEVuY29kZShcXFwi77+lcHJvamVjdGlvbl9zY3JlZW7vv6VcXFwiICsgSlNPTi5zdHJpbmdpZnkocnVsZSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIuaOqOmAgeWIsFRWQm94XFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvdHZib3hQdXNoI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwi6K6+572u5pS26JeP5bCB6Z2iXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoW1xcXCLorr7nva7lsIHpnaLlnLDlnYBcXFwiLCBcXFwi5pCc57Si5bCB6Z2iXFxcIl0sIDEpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCLorr7nva7lsIHpnaLlnLDlnYBcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIsIFxcXCLor7fovpPlhaXlm77niYflnLDlnYBcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQudHJpbSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWl5Zyw5Z2AXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFnZVBpY1VybChpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9mcm9udENvdmVyI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcIuiOt+WPluaKleWxj0lQXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlwID0gJC5yZXF1aXJlKFxcXCJhbGlVdGlsXFxcIikuZ2V0SVB2NEFkZHJlc3MoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlwLnN0YXJ0c1dpdGgoXFxcIjE5Mi4xNjguXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKGlwICsgXFxcIlxcXFxu6K+lSVDpgILnlKjkuo7mtYHph48r54Ot54K555qE5oqV5bGPXFxcXG7or7fmm7/mjaLpk77mjqXkuK3nmoQwLjAuMC4wXFxcIikuY29uZmlybSgoaXApID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgaXA7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpcCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChpcCArIFxcXCJcXFxcbuiOt+WPluWksei0pemdnueos+WumklQLOivt+W8gOWQr+eDreeCueWGjeS9v+eUqCzor6VJUOWPr+iDveS8muWPmCzkuI3og73mipXlsY9cXFwiKS5jb25maXJtKCgpPT57fSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCLmnoHpgJ/ljp/nlLvkuIvovb3nur/nqItcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChnZXRJdGVtKFxcXCJzcGVlZFRocmVhZFxcXCIsIFxcXCIyMFxcXCIpLCBcXFwi6K+36L6T5YWlMy0zMuS5i+mXtOeahOaVtOaVsFxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzcGVlZFRocmVhZCA9IHBhcnNlSW50KGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGVlZFRocmVhZCA8IDMgfHwgc3BlZWRUaHJlYWQgPiAzMikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7kuI3lkIjms5VcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwic3BlZWRUaHJlYWRcXFwiLCBTdHJpbmcoc3BlZWRUaHJlYWQpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSwgc2hhcmVJZCwgc2hhcmVQd2QsIGZpbGVJZCksXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IFxcXCJodHRwczovL2hpa2VyZmFucy5jb20vaW1nL2FsaV9maWxlaW50by5zdmdcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgcGFnZUlkOiBwYWdlSWQsXFxuICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IGZpbGVJZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlSWQ6IHNoYXJlSWQsXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVRva2VuOiBzaGFyZVRva2VuLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkLFxcbiAgICAgICAgICAgICAgICAgICAgZm9sZGVyTmFtZTogZ2V0UGFnZVRpdGxlKClcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBmdW5jSXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBbXFxcIkFMTFxcXCIsIFxcXCLot7Pov4fmlofku7ZcXFwiXVtOdW1iZXIoc2tpcEZpbGUpXSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChza2lwRmlsZSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwic2tpcEZpbGVcXFwiLCBTdHJpbmcoc2tpcEZpbGUgPyBcXFwiMFxcXCIgOiBcXFwiMVxcXCIpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgIH0sIHNraXBGaWxlKSxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fc2VhcmNoNlxcXCIsXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgZnVuU3R5bGUgPSBbXFxcIlxcXCIsIFxcXCJcXFwiLCBcXFwiXFxcIiwgXFxcImljb25fc21hbGxfM1xcXCIsIFxcXCJpY29uX3JvdW5kX3NtYWxsXzRcXFwiLCBcXFwiaWNvbl81XFxcIl1bZnVuY0l0ZW1zLmxlbmd0aF07XFxuICAgICAgICBpdGVtcy5wdXNoLmFwcGx5KGl0ZW1zLCBmdW5jSXRlbXMubWFwKHYgPT4gKHYuY29sX3R5cGUgPSBmdW5TdHlsZSkgJiYgdikpO1xcbiAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgbGV0IHJlc2NvZCA9IHt9O1xcbiAgICBsZXQgbWFya2VyID0gTVlfUEFSQU1TLm1hcmtlcjtcXG4gICAgaWYgKGlzU2VhcmNoKSB7XFxuICAgICAgICByZXNjb2QgPSBhbGlTaGFyZUFwaS5nZXRTZWFyY2hMaXN0RmlsZShzZWFyY2hLZXksIG1hcmtlciwgb3JkZXJbMF0sIG9yZGVyWzFdKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJlc2NvZCA9IGFsaVNoYXJlQXBpLmdldExpc3RGaWxlKGZpbGVJZCwgbWFya2VyLCBvcmRlclswXSwgb3JkZXJbMV0pO1xcbiAgICB9XFxuICAgIGlmIChyZXNjb2QubmV4dF9tYXJrZXIpIHtcXG4gICAgICAgIHNldE1hcmtlcihyZXNjb2QubmV4dF9tYXJrZXIpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgc2V0TWFya2VyKCk7XFxuICAgIH1cXG5cXG4gICAgdmFyIGNvbnRzID0gcmVzY29kLml0ZW1zO1xcbiAgICAvL+Wtl+W5leWMuemFjeWHhuWkh1xcbiAgICBsZXQgc3ViRXh0cyA9IFtcXFwidnR0XFxcIiwgXFxcInNydFxcXCIsIFxcXCJhc3NcXFwiXTtcXG4gICAgdmFyIHppbXVsaXN0ID0gW107XFxuICAgIGNvbnRzLmZvckVhY2goKGl0ZW0pID0+IHtcXG4gICAgICAgIGlmIChzdWJFeHRzLmluY2x1ZGVzKGl0ZW0uZmlsZV9leHRlbnNpb24gJiYgaXRlbS5maWxlX2V4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSkge1xcbiAgICAgICAgICAgIGxldCBuYW1lID0gaXRlbS5uYW1lLnJlcGxhY2UoJy4nICsgaXRlbS5maWxlX2V4dGVuc2lvbiwgJycpO1xcbiAgICAgICAgICAgIHppbXVsaXN0LnB1c2goe1xcbiAgICAgICAgICAgICAgICBleHQ6IGl0ZW0uZmlsZV9leHRlbnNpb24sXFxuICAgICAgICAgICAgICAgIGZpbGVfaWQ6IGl0ZW0uZmlsZV9pZCxcXG4gICAgICAgICAgICAgICAgbmFtZTogbmFtZVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgLy/lpITnkIblpLjpobXljLnphY3lrZfluZVcXG4gICAgLypcXG4gICAgbGV0IGhhc1N1YiA9IHppbXVsaXN0Lmxlbmd0aCA+IDA7XFxuICAgIGlmIChoYXNTdWImJnJlc2NvZC5uZXh0X21hcmtlcikge1xcbiAgICAgICAgaWYgKHppbXVsaXN0Lmxlbmd0aCA+IDQpIHtcXG4gICAgICAgICAgICBzZXRTdWJ0aXRsZUNhY2hlKHppbXVsaXN0LnNsaWNlKC00KSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHNldFN1YnRpdGxlQ2FjaGUoemltdWxpc3QpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxldCBsYXN0SXRlbSA9IGNvbnRzLmF0KC0xKTtcXG4gICAgaWYgKGhhc1N1YiYmbGFzdEl0ZW0mJmxhc3RJdGVtLmNhdGVnb3J5ID09PSBcXFwidmlkZW9cXFwiKSB7XFxuICAgICAgICBzZXRWaWRlb0l0ZW1DYWNoZShjb250cy5zcGxpY2UoY29udHMubGVuZ3RoLTEsMSkpO1xcbiAgICB9XFxuICAgIGlmIChNWV9QQUdFID4gMSkge1xcbiAgICAgICAgbGV0IHN1YnRpdGxlQ2FjaGUgPSBNWV9QQVJBTVMuc3VidGl0bGVDYWNoZSB8fCBbXTtcXG4gICAgICAgIHppbXVsaXN0ID0gemltdWxpc3QuY29uY2F0KHN1YnRpdGxlQ2FjaGUpO1xcbiAgICAgICAgbGV0IHZpZGVvSXRlbUNhY2hlID0gTVlfUEFSQU1TLnZpZGVvSXRlbUNhY2hlIHx8IFtdO1xcbiAgICAgICAgY29udHMgPSB2aWRlb0l0ZW1DYWNoZS5jb25jYXQoY29udHMpO1xcbiAgICAgICAgc2V0U3VidGl0bGVDYWNoZSgpO1xcbiAgICAgICAgc2V0VmlkZW9JdGVtQ2FjaGUoKTtcXG4gICAgfSovXFxuICAgIC8v566A5L2T5LyY5YWIXFxuICAgIHppbXVsaXN0LnNvcnQoKGEsIGIpID0+IChiLm5hbWUuZW5kc1dpdGgoXFxcIi5zY1xcXCIpIHx8IGIubmFtZS5lbmRzV2l0aChcXFwiLmNoc1xcXCIpKSAtIChhLm5hbWUuZW5kc1dpdGgoXFxcIi5zY1xcXCIpIHx8IGEubmFtZS5lbmRzV2l0aChcXFwiLmNoc1xcXCIpKSk7XFxuICAgIC8vZW5kXFxuICAgIGxldCB0aXRsZUhlYWQgPSB7XFxuICAgICAgICB2aWRlbzogXFxcIvCfjqxcXFwiLFxcbiAgICAgICAgYXVkaW86IFxcXCLwn461XFxcIixcXG4gICAgICAgIGRvYzogXFxcIvCfk5FcXFwiLFxcbiAgICAgICAgaW1hZ2U6IFxcXCLwn5a8XFxcIixcXG4gICAgICAgIHppcDogXFxcIvCfk6ZcXFwiLFxcbiAgICAgICAgZm9sZGVyOiBcXFwi8J+TglxcXCJcXG4gICAgfTtcXG5cXG4gICAgZnVuY3Rpb24gZ2V0SGVhZCh0eXBlLCBleHQpIHtcXG4gICAgICAgIGxldCBoZWFkID0gdGl0bGVIZWFkW3R5cGVdO1xcbiAgICAgICAgaWYgKHN1YkV4dHMuaW5jbHVkZXMoZXh0KSkge1xcbiAgICAgICAgICAgIGhlYWQgPSBcXFwi8J+VuFxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gaGVhZCB8fCBcXFwi4p2TXFxcIjtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBnZXRQcmV2aWV3UGljKGZpbGVJdGVtKSB7XFxuICAgICAgICBpZiAoZmlsZUl0ZW0udGh1bWJuYWlsKSB7XFxuICAgICAgICAgICAgcmV0dXJuICQoXFxcImh0dHBzOi8vZW1wdHk/XFxcIiArIGZpbGVJdGVtLmZpbGVfaWQpLmltYWdlKChwaWMpID0+IHtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaChwaWMsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbTogdHJ1ZVxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSwgZmlsZUl0ZW0udGh1bWJuYWlsKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBsZXQgZm9sZGVyU3R5bGUsIGZpbGVTdHlsZTtcXG4gICAgbGV0IGZpbHRlclR5cGUgPSBbXTtcXG4gICAgaWYgKHN0eWxlID09PSBcXFwi6L+95YmnXFxcIikge1xcbiAgICAgICAgZm9sZGVyU3R5bGUgPSBcXFwiYXZhdGFyXFxcIjtcXG4gICAgICAgIGZpbGVTdHlsZSA9IFxcXCJtb3ZpZV8yXFxcIjtcXG4gICAgICAgIGZpbHRlclR5cGUucHVzaChcXFwidmlkZW9cXFwiKTtcXG4gICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLov73liafmqKHlvI/lj6rmmL7npLrmlofku7blpLnlkozop4bpopFcXFwiLnNtYWxsKCkuZm9udGNvbG9yKFxcXCJncmV5XFxcIiksXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfSBlbHNlIGlmIChzdHlsZSA9PT0gXFxcIueci+WbvlxcXCIpIHtcXG4gICAgICAgIGZvbGRlclN0eWxlID0gXFxcImF2YXRhclxcXCI7XFxuICAgICAgICBmaWxlU3R5bGUgPSBcXFwiY2FyZF9waWNfM1xcXCI7XFxuICAgICAgICBmaWx0ZXJUeXBlLnB1c2goXFxcImltYWdlXFxcIik7XFxuICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi55yL5Zu+5qih5byP5Y+q5pi+56S65paH5Lu25aS55ZKM5Zu+54mHXFxcIi5zbWFsbCgpLmZvbnRjb2xvcihcXFwiZ3JleVxcXCIpLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBmb2xkZXJTdHlsZSA9IGZpbGVTdHlsZSA9IHN0eWxlO1xcbiAgICB9XFxuICAgIGxldCBub1NraXBGaWxlID0gIXNraXBGaWxlO1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRzLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICBsZXQgZmlsZUl0ZW0gPSBjb250c1tpXTtcXG4gICAgICAgIGxldCBjYXRlID0gZmlsZUl0ZW0uY2F0ZWdvcnk7XFxuICAgICAgICBsZXQgZGVzYyA9IGZvcm1hdERhdGUoZmlsZUl0ZW0udXBkYXRlZF9hdCk7XFxuICAgICAgICBsZXQgcGljX3VybCA9IGdldEljb24oZmlsZUl0ZW0uZmlsZV9leHRlbnNpb24sIGZpbGVJdGVtLnR5cGUpO1xcblxcbiAgICAgICAgaWYgKGZpbGVJdGVtLnR5cGUgPT09IFxcXCJmb2xkZXJcXFwiKSB7XFxuICAgICAgICAgICAgbGV0IHRpdGxlID0gKGZvbGRlclN0eWxlID09PSBcXFwidGV4dF8xXFxcIiA/IHRpdGxlSGVhZC5mb2xkZXIgOiBcXFwiXFxcIikgKyBmaWxlSXRlbS5uYW1lO1xcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vcGFnZS9hbGl5dW4/cGFnZT1meXBhZ2UnLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogZm9sZGVyU3R5bGUsXFxuICAgICAgICAgICAgICAgIGRlc2M6IGZvcm1hdERhdGUoZmlsZUl0ZW0udXBkYXRlZF9hdCksXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IHBpY191cmwsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBzaGFyZUlkOiBzaGFyZUlkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogTVlfUEFSQU1TLnNoYXJlVG9rZW4sXFxuICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IGZpbGVJdGVtLmZpbGVfaWQsXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2QsXFxuICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IGZpbGVJdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBub1BpYzogdHJ1ZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2UgaWYgKG5vU2tpcEZpbGUpIHtcXG4gICAgICAgICAgICBpZiAoZmlsdGVyVHlwZS5sZW5ndGggPiAwICYmICFmaWx0ZXJUeXBlLmluY2x1ZGVzKGNhdGUpKSB7XFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgc3VidGl0bGUsIGxvbmdjLCBjbHM7XFxuICAgICAgICAgICAgbGV0IHRpdGxlID0gZmlsZUl0ZW0ubmFtZTtcXG4gICAgICAgICAgICBsZXQgbmFtZU5vdEV4dCA9IGZpbGVJdGVtLm5hbWUucmVwbGFjZSgnLicgKyBmaWxlSXRlbS5maWxlX2V4dGVuc2lvbiwgJycpO1xcbiAgICAgICAgICAgIGlmIChzdWJFeHRzLmluY2x1ZGVzKGZpbGVJdGVtLmZpbGVfZXh0ZW5zaW9uKSkge1xcbiAgICAgICAgICAgICAgICBsb25nYyA9IFt7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuaMgui9veWtl+W5lVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoem0pID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcignbW91bnR6aW11Jywgem0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mjILovb3lrozmiJDvvIzlvZPliY3lrZfluZXmlofku7Y6ICcgKyB6bS5uYW1lICsgJy4nICsgem0uZXh0O1xcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dDogZmlsZUl0ZW0uZmlsZV9leHRlbnNpb24sXFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9pZDogZmlsZUl0ZW0uZmlsZV9pZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lTm90RXh0XFxuICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgfV07XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChjYXRlID09PSBcXFwidmlkZW9cXFwiKSB7XFxuICAgICAgICAgICAgICAgIGlmICh6aW11bGlzdC5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gemltdWxpc3QuZmluZCh2ID0+IHYubmFtZS5pbmNsdWRlcyhuYW1lTm90RXh0KSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgY2xzID0gXFxcInBsYXlsaXN0IHZcXFwiICsgcGFnZUlkO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoZmlsZVN0eWxlID09PSBcXFwidGV4dF8xXFxcIikge1xcbiAgICAgICAgICAgICAgICBkZXNjICs9IFxcXCJcXFxcdFxcXFx0XFxcIiArIGZvcm1hdFNpemUoZmlsZUl0ZW0uc2l6ZSk7XFxuICAgICAgICAgICAgICAgIHRpdGxlID0gZ2V0SGVhZChjYXRlLCBmaWxlSXRlbS5maWxlX2V4dGVuc2lvbikgKyB0aXRsZTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFtcXFwidmlkZW9cXFwiLCBcXFwiaW1hZ2VcXFwiXS5pbmNsdWRlcyhjYXRlKSkge1xcbiAgICAgICAgICAgICAgICBwaWNfdXJsID0gZ2V0UHJldmlld1BpYyhmaWxlSXRlbSkgfHwgcGljX3VybDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9QcmUjXFxcIikubGF6eVJ1bGUoKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBmaWxlSWQsIGNhdGUsIHN1YnRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvYWxpbGF6eVxcXCIpKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCBmaWxlSWQsIGNhdGUsIHN1YnRpdGxlKTtcXG4gICAgICAgICAgICAgICAgfSwgc2hhcmVJZCwgc2hhcmVQd2QsIE1ZX1BBUkFNUy5zaGFyZVRva2VuLCBmaWxlSXRlbS5maWxlX2lkLCBjYXRlLCBzdWJ0aXRsZSksXFxuICAgICAgICAgICAgICAgIGRlc2M6IGRlc2MsXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IHBpY191cmwsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogZmlsZUl0ZW0uZmlsZV9pZCxcXG4gICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogbG9uZ2MsXFxuICAgICAgICAgICAgICAgICAgICBjbHM6IGNscyxcXG4gICAgICAgICAgICAgICAgICAgIC8vaW5oZXJpdFRpdGxlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogZmlsZUl0ZW0ubmFtZVxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogZmlsZVN0eWxlXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgaWYgKGNvbnRzLmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwifn5+5LuA5LmI6YO95rKh5pyJ5LqG5ZOmfn5+XFxcIi5mb250Y29sb3IoXFxcIkdyYXlcXFwiKSxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuXFxubGV0IGl0ZW1zID0gW107XFxudHJ5IHtcXG4gICAgaWYgKE1ZX1BBR0UgPiAxICYmICFNWV9QQVJBTVMubWFya2VyKSB7XFxuICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCJ+fn7ku4DkuYjpg73msqHmnInkuoblk6Z+fn5cXFwiLmZvbnRjb2xvcihcXFwiR3JheVxcXCIpLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGxvYWQoaXRlbXMpO1xcbiAgICB9XFxufSBjYXRjaCAoZSkge1xcbiAgICBpZiAoZS5uYW1lID09PSBcXFwiQWxpRXJyb3JcXFwiKSB7XFxuICAgICAgICBpZiAoZS5jb2RlID09PSBcXFwiSW52YWxpZFJlc291cmNlLlNoYXJlUHdkXFxcIikge1xcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuivt+i+k+WFpeaPkOWPlueggVxcXCIsXFxuICAgICAgICAgICAgICAgIGRlc2M6IHNoYXJlUHdkID8gXFxcIuKAnOKAnOaPkOWPlueggemUmeivr+KAneKAnVxcXCIgOiBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiAkKCkuaW5wdXQoKE1ZX1BBUkFNUykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgc2V0UGFnZVBhcmFtcyhPYmplY3QuYXNzaWduKHt9LCBNWV9QQVJBTVMsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogaW5wdXRcXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIH0sIE1ZX1BBUkFNUyksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaWYgKGUuc2lnbmlmaWNhbmNlID09PSAxKSB7XFxuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgZS5tZXNzYWdlLmJpZygpLmJpZygpLmZvbnRjb2xvcihcXFwicmVkXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5zaWduaWZpY2FuY2UgPT09IDMpIHtcXG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBlLm1lc3NhZ2UuYmlnKCkuZm9udGNvbG9yKFxcXCJncmVlblxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG5cXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGxvZyhcXFwi5YiX6KGo5Yqg6L295aSx6LSlI1xcXFxu6ZSZ6K+v5L+h5oGvPlxcXCIgKyBlLnRvU3RyaW5nKCkgKyBcXFwiXFxcXG7plJnor6/ooYw+XFxcIiArIGUubGluZU51bWJlcik7XFxuICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+asp+asp++8jOaKpemUmeS6huOAguWcqOWIt+aWsOWHoOasoe+8n+aIluiAheabtOaNouaWh+S7tuWkueOAgicsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgZGVzYzogZS50b1N0cmluZygpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgLy90aHJvdyBlO1xcbiAgICB9XFxufVxcbnNhdmVNeVBhQ2FjaGUoKTtcXG5zZXRSZXN1bHQoaXRlbXMpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi55m75b2V6LSm5Y+3XCIsXCJwYXRoXCI6XCJsb2dpblwiLFwicnVsZVwiOlwianM6XFxudmFyIGQgPSBbXTtcXG5zZXRQYWdlVGl0bGUoXFxcIueZu+W9lemYv+mHjOS6keebmFxcXCIpO1xcbmxldCBpbmRleCA9IE51bWJlcihnZXRQYXJhbShcXFwiaW5kZXhcXFwiLCBcXFwiMVxcXCIpKTtcXG5pZiAoTnVtYmVyLmlzTmFOKGluZGV4KSkge1xcbiAgICBpbmRleCA9IDE7XFxufVxcblxcblxcbmZ1bmN0aW9uIGdldFFSQ29kZSgpIHtcXG4gICAgbGV0IGpzb24gPSBmZXRjaChcXFwiaHR0cHM6Ly9wYXNzcG9ydC5hbGl5dW5kcml2ZS5jb20vbmV3bG9naW4vcXJjb2RlL2dlbmVyYXRlLmRvP2FwcE5hbWU9YWxpeXVuX2RyaXZlJmZyb21TaXRlPTUyJmFwcE5hbWU9YWxpeXVuX2RyaXZlJmFwcEVudHJhbmNlPXdlYiZpc01vYmlsZT1mYWxzZSZsYW5nPXpoX0NOJnJldHVyblVybD0mYml6UGFyYW1zPSZfYngtdj0yLjIuM1xcXCIpO1xcbiAgICBsZXQgcXIgPSBKU09OLnBhcnNlKGpzb24pO1xcbiAgICBpZiAoIW9wZW5BcHBJbnRlbnQoJ2NvbS5hbGljbG91ZC5kYXRhYm94JywgJ2NvbS50YW9iYW8ubG9naW40YW5kcm9pZC5zY2FuLlFyU2NhbkFjdGl2aXR5Jywge1xcbiAgICAgICAgICAgIFxcXCJrZXlfc2NhblBhcmFtXFxcIjoganNvblxcbiAgICAgICAgfSkpIHtcXG4gICAgICAgIGNyZWF0ZVFSQ29kZShxci5jb250ZW50LmRhdGEuY29kZUNvbnRlbnQsIGZhbHNlKTtcXG4gICAgfVxcbiAgICByZXR1cm4gcXI7XFxufVxcblxcbmZ1bmN0aW9uIGJhY2tIb21lKHQsIGkpIHtcXG4gICAgYmFjayhpKTtcXG4gICAgdG9hc3QodCk7XFxufVxcblxcbmZ1bmN0aW9uIGZyb21BcHBHZXRUb2tlbihxcikge1xcbiAgICBsZXQgcXIgPSBnZXRRUkNvZGUoKTtcXG4gICAgaWYgKCFxcikgcmV0dXJuIGJhY2tIb21lKFxcXCLojrflj5blpLHotKVcXFwiKTtcXG4gICAgbGV0IGNrayA9IHFyLmNvbnRlbnQuZGF0YTtcXG4gICAgbGV0IGJvZHkgPSB7XFxuICAgICAgICBjazogY2trLmNrLFxcbiAgICAgICAgdDogY2trLnQgKyBcXFwiXFxcIixcXG4gICAgICAgIGFwcE5hbWU6IFxcXCJhbGl5dW5fZHJpdmVcXFwiLFxcbiAgICAgICAgYXBwRW50cmFuY2U6IFxcXCJ3ZWJcXFwiLFxcbiAgICAgICAgaXNNb2JpbGU6IGZhbHNlLFxcbiAgICAgICAgbGFuZzogXFxcInpoX0NOXFxcIixcXG4gICAgICAgIG5hdlBsYXRmb3JtOiBcXFwiTWFjSW50ZWxcXFwiLFxcbiAgICAgICAgcmV0dXJuVXJsOiBcXFwiXFxcIixcXG4gICAgICAgIG5hdmxhbmd1YWdlOiBcXFwiemgtQ05cXFwiLFxcbiAgICAgICAgZnJvbVNpdGU6IDUyLFxcbiAgICAgICAgYml6UGFyYW1zOiBcXFwiXFxcIlxcblxcbiAgICB9O1xcbiAgICAvKlxcbiAgICAge1xcbiAgICAgICAgTkVXOiBcXFwi5b6F5omr5o+PXFxcIixcXG4gICAgICAgIENBTkNFTEVEOiBcXFwi5Y+W5raIXFxcIixcXG4gICAgICAgIFNDQU5FRDpcXFwi5bey5omr5o+PXFxcIixcXG4gICAgICAgIENBTkNFTEVEOiBcXFwi5a6M5oiQXFxcIlxcbiAgICB9Ki9cXG4gICAgbGV0IGVycm9yQ291bnQgPSAwO1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMwOyBpKyspIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UocG9zdChcXFwiaHR0cHM6Ly9wYXNzcG9ydC5hbGl5dW5kcml2ZS5jb20vbmV3bG9naW4vcXJjb2RlL3F1ZXJ5LmRvP2FwcE5hbWU9YWxpeXVuX2RyaXZlJmZyb21TaXRlPTUyJl9ieC12PTIuMi4zXFxcIiwge1xcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgIGxldCBxckNvZGVTdGF0dXMgPSByZXN1bHQuY29udGVudC5kYXRhLnFyQ29kZVN0YXR1cztcXG5cXG4gICAgICAgICAgICBpZiAocXJDb2RlU3RhdHVzID09PSBcXFwiQ09ORklSTUVEXFxcIikge1xcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNvbnRlbnQuZGF0YS5iaXpFeHQpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmZvID0gSlNPTi5wYXJzZShiYXNlNjREZWNvZGUocmVzdWx0LmNvbnRlbnQuZGF0YS5iaXpFeHQpKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBhbGlUb2tlbnNGaWxlcGF0aCA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3Rva2VuUGF0aFxcXCIpLmFsaVRva2Vuc0ZpbGVwYXRoO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaVRva2VuID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IGluZm8ucGRzX2xvZ2luX3Jlc3VsdC5yZWZyZXNoVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGUoYWxpVG9rZW5zRmlsZXBhdGgsIEpTT04uc3RyaW5naWZ5KGFsaVRva2VuKSk7XFxuICAgICAgICAgICAgICAgICAgICBhZGRJdGVtQWZ0ZXIoXFxcImxvZ2lueVxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIueZu+W9leaIkOWKnyjngrnlh7vov5Tlm54pXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICBiYWNrSG9tZShcXFwi55m75b2V5oiQ5YqfXFxcIiwgdHJ1ZSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBiYWNrSG9tZShcXFwi55m75b2V5aSx6LSlLOivt+WwneivleWFtuS7lueahOaWueazlVxcXCIpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHFyQ29kZVN0YXR1cyA9PT0gXFxcIkNBTkNFTEVEXFxcIikge1xcbiAgICAgICAgICAgICAgICBiYWNrSG9tZShcXFwi5Y+W5raI55m75b2V5o6I5p2DXFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKFtcXFwiTkVXXFxcIiwgXFxcIlNDQU5FRFxcXCJdLmluY2x1ZGVzKHFyQ29kZVN0YXR1cykpIHtcXG4gICAgICAgICAgICAgICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCgyNTAwKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBiYWNrSG9tZShcXFwi6LaF5pe2XFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgZXJyb3JDb3VudCsrO1xcbiAgICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gNCkge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcblxcbn1cXG5pZiAoaW5kZXggPiAtMSkge1xcbiAgICBsZXQgbG9naW5VcmxzID0gW1xcXCJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vc2lnblxcXCIsIFxcXCJodHRwczovL2F1dGguYWxpeXVuZHJpdmUuY29tL3YyL29hdXRoL2F1dGhvcml6ZT9sb2dpbl90eXBlPWN1c3RvbSZyZXNwb25zZV90eXBlPWNvZGUmcmVkaXJlY3RfdXJpPWh0dHBzJTNBJTJGJTJGd3d3LmFsaXl1bmRyaXZlLmNvbSUyRnNpZ24lMkZjYWxsYmFjayZjbGllbnRfaWQ9MjVkelgzdmJZcWt0Vnh5WCZzdGF0ZT0lN0IlMjJvcmlnaW4lMjIlM0ElMjIqJTIyJTdEIy9sb2dpblxcXCJdO1xcbiAgICBsZXQgdXJsID0gbG9naW5VcmxzW2luZGV4XTtcXG4gICAgbGV0IGlzUmVmcmVzaCA9ICFnZXRQYXJhbShcXFwibm9SZWZyZXNoXFxcIik7XFxuICAgIGxldCBhbGlUb2tlbnNGaWxlcGF0aCA9ICQucmVxdWlyZShcXFwidG9rZW5QYXRoXFxcIikuYWxpVG9rZW5zRmlsZXBhdGg7XFxuXFxuICAgIHZhciBqcyA9ICQudG9TdHJpbmcoKGlzUmVmcmVzaCwgYWxpVG9rZW5zRmlsZXBhdGgpID0+IHtcXG4gICAgICAgIHNldEludGVydmFsKCgpID0+IHtcXG4gICAgICAgICAgICB2YXIgdG9rZW4gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2tlbicpKTtcXG4gICAgICAgICAgICBpZiAodG9rZW4gJiYgdG9rZW4udXNlcl9pZCkge1xcbiAgICAgICAgICAgICAgICBsZXQgdG9rZW5fdXJsID0gYWxpVG9rZW5zRmlsZXBhdGg7XFxuICAgICAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAud3JpdGVGaWxlKHRva2VuX3VybCwgSlNPTi5zdHJpbmdpZnkodG9rZW4pKTtcXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XFxuICAgICAgICAgICAgICAgIGZ5X2JyaWRnZV9hcHAuYmFjayhpc1JlZnJlc2gpO1xcbiAgICAgICAgICAgICAgICBmeV9icmlkZ2VfYXBwLnRvYXN0KCdUT0tFTuiOt+WPluaIkOWKn++8jOivt+WLv+azhOa8j+S4quS6uumakOenge+8ge+8ge+8gScpO1xcbiAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgMzAwKTtcXG4gICAgfSwgaXNSZWZyZXNoLCBhbGlUb2tlbnNGaWxlcGF0aCk7XFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB1cmw6IHVybCxcXG4gICAgICAgIGNvbF90eXBlOiAneDVfd2Vidmlld19zaW5nbGUnLFxcbiAgICAgICAgZGVzYzogJzEwMCUmJmZsb2F0JyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgY2FuQmFjazogZmFsc2UsXFxuICAgICAgICAgICAganM6IGpzLFxcbiAgICAgICAgICAgIHVybEludGVyY2VwdG9yOiAkLnRvU3RyaW5nKCgpID0+IHRydWUpXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBzZXRSZXN1bHQoZCk7XFxufSBlbHNlIHtcXG4gICAgXFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIuetieW+heaOiOadgy4uLlxcXCIuYmlnKCkuYmlnKCksXFxuICAgICAgICBkZXNjOiBcXFwi5aaC5p6c5Y2H57qn5LqG5a6Y5pa5QXBw77yM5peg5rOV6Ieq5Yqo6LCD6LW35o6I5p2D77yM6K+35omr56CB55m75b2VXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogXFxcImxvZ2lueVxcXCIsXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBzZXRSZXN1bHQoZCk7XFxuICAgIHRyeSB7XFxuICAgICAgICBmcm9tQXBwR2V0VG9rZW4oKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgYmFja0hvbWUoXFxcIuWGhemDqOmUmeivrzpcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgfVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIumYv+mHjOWIl+ihqEFQSVwiLFwicGF0aFwiOlwiQWxpQXBpXCIsXCJydWxlXCI6XCJqczpcXG4vL0BhdXRob3IgTG95RGdJa1xcbmZ1bmN0aW9uIEFsaUVycm9yKGVycm9yQ29kZSwgbWVzc2FnZSwgc2lnbmlmaWNhbmNlKSB7XFxuICAgIGxldCBlcnJvclR5cGUgPSBBbGlFcnJvci5lcnJvckNvZGVNYXAuZ2V0KGVycm9yQ29kZSkgfHwgW107XFxuICAgIHRoaXMuY29kZSA9IGVycm9yQ29kZTtcXG4gICAgdGhpcy5tZXNzYWdlID0gZXJyb3JUeXBlWzBdIHx8IG1lc3NhZ2UgfHwgXFxcIlxcXCI7XFxuICAgIHRoaXMubmFtZSA9IFxcXCJBbGlFcnJvclxcXCI7XFxuICAgIHRoaXMuc2lnbmlmaWNhbmNlID0gZXJyb3JUeXBlWzFdIHx8IHNpZ25pZmljYW5jZSB8fCAxO1xcbn1cXG5BbGlFcnJvci5lcnJvckNvZGVNYXAgPSBuZXcgTWFwKFtcXG4gICAgW1xcXCJTaGFyZUxpbmsuQ2FuY2VsbGVkXFxcIiwgW1xcXCLliIbkuqvpk77mjqXlt7LlpLHmlYhcXFwiXV0sXFxuICAgIFtcXFwiU2hhcmVMaW5rLkZvcmJpZGRlblxcXCIsIFtcXFwi6L+d6KeE6LWE5rqQ5bey6KKr5bCB56aBXFxcIl1dLFxcbiAgICBbXFxcIk5vdEZvdW5kLlNoYXJlTGlua1xcXCIsIFtcXFwi5LiN5a2Y5Zyo6K+l6ZO+5o6l6K+35qC45a+5XFxcIl1dLFxcbiAgICBbXFxcIkFjY2Vzc1Rva2VuSW52YWxpZFxcXCIsIFtcXFwi6K6/6Zeu5Luk54mM5aSx5pWI77yM6K+36YeN5paw55m76ZmGXFxcIl1dLFxcbiAgICBbXFxcIlNoYXJlTGlua1Rva2VuSW52YWxpZFxcXCIsIFtcXFwi5YiG5Lqr5Luk54mM5aSx5pWIXFxcIl1dLFxcbiAgICBbXFxcIlBhcmFtRmxvd0V4Y2VwdGlvblxcXCIsIFtcXFwi6K6/6Zeu6L+H5LqO6aKR57mB77yM6K+356iN5ZCO5YaN6K+VXFxcIiwgM11dXFxuXSk7XFxuXFxuQWxpRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoKSwge1xcbiAgICBjb25zdHJ1Y3RvcjogQWxpRXJyb3JcXG59KTtcXG5cXG5mdW5jdGlvbiBwb3N0QXBpKGFwaSwgYm9keSwgaGVhZGVycykge1xcbiAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdCgnaHR0cHM6Ly9hcGkuYWxpeXVuZHJpdmUuY29tJyArIGFwaSwge1xcbiAgICAgICAgaGVhZGVyczogT2JqZWN0LmFzc2lnbih7XFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcXG4gICAgICAgIH0sIGhlYWRlcnMpLFxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXFxuICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICB9KTtcXG4gICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcbiAgICBpZiAocmVzdWx0LmNvZGUpIHtcXG4gICAgICAgIHRocm93IG5ldyBBbGlFcnJvcihyZXN1bHQuY29kZSwgcmVzdWx0Lm1lc3NhZ2UpO1xcbiAgICB9XFxuICAgIHJldHVybiByZXN1bHQ7XFxufVxcblxcbmZ1bmN0aW9uIEFsaVNoYXJlQXBpKHNoYXJlSWQsIHNoYXJlUHdkLCBzaGFyZVRva2VuLCByZWZyZXNoQ2FsbEJhY2spIHtcXG4gICAgdGhpcy5zaGFyZUlkID0gc2hhcmVJZDtcXG4gICAgdGhpcy5zaGFyZVB3ZCA9IHNoYXJlUHdkO1xcbiAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayA9IHJlZnJlc2hDYWxsQmFjayB8fCAoKCkgPT4gdm9pZCAwKTtcXG4gICAgdGhpcy5zaGFyZVRva2VuID0gc2hhcmVUb2tlbiB8fCB0aGlzLmdldFNoYXJlVG9rZW4oKTtcXG59XFxuT2JqZWN0LmFzc2lnbihBbGlTaGFyZUFwaS5wcm90b3R5cGUsIHtcXG4gICAgZ2V0U2hhcmVUb2tlbigpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSBwb3N0QXBpKFxcXCIvdjIvc2hhcmVfbGluay9nZXRfc2hhcmVfdG9rZW5cXFwiLCB7XFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkLFxcbiAgICAgICAgICAgIFxcXCJzaGFyZV9wd2RcXFwiOiB0aGlzLnNoYXJlUHdkLFxcbiAgICAgICAgfSk7XFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSByZXN1bHQuc2hhcmVfdG9rZW47XFxuICAgICAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayhyZXN1bHQuc2hhcmVfdG9rZW4sIHRoaXMpO1xcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zaGFyZV90b2tlbjtcXG4gICAgfSxcXG4gICAgcG9zdFRva2VuQXBpKGFwaSwgYm9keSwgaGVhZGVycywgaXNSZXRyeSkge1xcbiAgICAgICAgbGV0IHJlc3VsdDtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgcmVzdWx0ID0gcG9zdEFwaShhcGksIGJvZHksIE9iamVjdC5hc3NpZ24oe1xcbiAgICAgICAgICAgICAgICBcXFwiWC1TaGFyZS1Ub2tlblxcXCI6IHRoaXMuc2hhcmVUb2tlbiB8fCB0aGlzLmdldFNoYXJlVG9rZW4oKVxcbiAgICAgICAgICAgIH0sIGhlYWRlcnMpKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBpZiAoKGUuY29kZSA9PT0gXFxcIkFjY2Vzc1Rva2VuSW52YWxpZFxcXCIgfHwgZS5jb2RlID09PSBcXFwiU2hhcmVMaW5rVG9rZW5JbnZhbGlkXFxcIikgJiYgIWlzUmV0cnkpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTaGFyZVRva2VuKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc3RUb2tlbkFwaShhcGksIGJvZHksIGhlYWRlcnMsIHRydWUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgZ2V0TGlzdEZpbGUoZmlsZUlkLCBtYXJrZXIsIG9yZGVyQnksIG9yZGVyRGlyZWN0aW9uKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5wb3N0VG9rZW5BcGkoXFxcIi9hZHJpdmUvdjMvZmlsZS9saXN0XFxcIiwge1xcbiAgICAgICAgICAgIFxcXCJzaGFyZV9pZFxcXCI6IHRoaXMuc2hhcmVJZCxcXG4gICAgICAgICAgICBcXFwicGFyZW50X2ZpbGVfaWRcXFwiOiBmaWxlSWQgfHwgXFxcInJvb3RcXFwiLFxcbiAgICAgICAgICAgIFxcXCJsaW1pdFxcXCI6IDEwMCxcXG4gICAgICAgICAgICBcXFwiaW1hZ2VfdGh1bWJuYWlsX3Byb2Nlc3NcXFwiOiBcXFwiaW1hZ2UvcmVzaXplLHdfMTYwL2Zvcm1hdCxqcGVnXFxcIixcXG4gICAgICAgICAgICBcXFwiaW1hZ2VfdXJsX3Byb2Nlc3NcXFwiOiBcXFwiaW1hZ2VcXFxcL3Jlc2l6ZSx3XzE5MjAvZm9ybWF0LGpwZWdcXFwiLFxcbiAgICAgICAgICAgIFxcXCJ2aWRlb190aHVtYm5haWxfcHJvY2Vzc1xcXCI6IFxcXCJ2aWRlby9zbmFwc2hvdCx0XzEwMDAsZl9qcGcsYXJfYXV0byx3XzMwMFxcXCIsXFxuICAgICAgICAgICAgXFxcIm9yZGVyX2J5XFxcIjogb3JkZXJCeSB8fCBcXFwibmFtZVxcXCIsXFxuICAgICAgICAgICAgXFxcIm9yZGVyX2RpcmVjdGlvblxcXCI6IG9yZGVyRGlyZWN0aW9uIHx8IFxcXCJBU0NcXFwiLFxcbiAgICAgICAgICAgIFxcXCJtYXJrZXJcXFwiOiBtYXJrZXJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgZ2V0U2hhcmVJbmZvKCkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHBvc3RBcGkoXFxcIi9hZHJpdmUvdjMvc2hhcmVfbGluay9nZXRfc2hhcmVfYnlfYW5vbnltb3VzP3NoYXJlX2lkPVxcXCIgKyB0aGlzLnNoYXJlSWQsIHtcXG4gICAgICAgICAgICBcXFwic2hhcmVfaWRcXFwiOiB0aGlzLnNoYXJlSWQsXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIGdldFNlYXJjaExpc3RGaWxlKGtleSwgbWFya2VyLCBvcmRlckJ5LCBvcmRlckRpcmVjdGlvbikge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucG9zdFRva2VuQXBpKFxcXCIvcmVjb21tZW5kL3YxL3NoYXJlTGluay9zZWFyY2hcXFwiLCB7XFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkLFxcbiAgICAgICAgICAgIFxcXCJrZXl3b3JkXFxcIjoga2V5LFxcbiAgICAgICAgICAgIFxcXCJsaW1pdFxcXCI6IDEwMCxcXG4gICAgICAgICAgICBcXFwib3JkZXJfYnlcXFwiOiBvcmRlckJ5ICsgXFxcIiBcXFwiICsgb3JkZXJEaXJlY3Rpb24sXFxuICAgICAgICAgICAgXFxcIm1hcmtlclxcXCI6IG1hcmtlciB8fCB1bmRlZmluZWRcXG4gICAgICAgIH0pO1xcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID09PSAwKSB7XFxuICAgICAgICAgICAgcmVzdWx0Lml0ZW1zID0gW107XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9XFxufSk7XFxuJC5leHBvcnRzID0gQWxpU2hhcmVBcGk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLpmL/ph4zmkq3mlL5BUElcIixcInBhdGhcIjpcImFsaVBsYXlBcGlcIixcInJ1bGVcIjpcIi8vQGF1dGhvciBMb3lEZ0lrXFxuXFxuZnVuY3Rpb24gQWxpQWNjZXNzQXBpKHtcXG4gICAgc2hhcmVJZCxcXG4gICAgc2hhcmVQd2QsXFxuICAgIHNoYXJlVG9rZW4sXFxuICAgIGFsaVRva2VucyxcXG4gICAgb3BlblRva2Vuc1xcbn0pIHtcXG4gICAgdGhpcy5zaGFyZUlkID0gc2hhcmVJZDtcXG4gICAgdGhpcy5zaGFyZVB3ZCA9IHNoYXJlUHdkO1xcbiAgICB0aGlzLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuO1xcbiAgICB0aGlzLnJlZnJlc2hTaGFyZUNhbGxCYWNrID0gKCgpID0+IHZvaWQgMCk7XFxuICAgIHRoaXMucmVmcmVzaEFjY2Vzc0NhbGxCYWNrID0gKCgpID0+IHZvaWQgMCk7XFxuICAgIHRoaXMucmVmcmVzaE9wZW5DYWxsQmFjayA9ICgoKSA9PiB2b2lkIDApO1xcbiAgICB0aGlzLmFsaVRva2VucyA9IGFsaVRva2VucyB8fCB7fTtcXG4gICAgaWYgKCF0aGlzLmFsaVRva2Vucy5yZWZyZXNoX3Rva2VuKSB7XFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuacqueZu+mZhlxcXCIpO1xcbiAgICB9XFxuICAgIGlmICghdGhpcy5hbGlUb2tlbnMuYWNjZXNzX3Rva2VuKSB7XFxuICAgICAgICB0aGlzLnJlZnJlc2hBY2Nlc3NUb2tlbigpO1xcbiAgICB9XFxuICAgIHRoaXMuZGVmRHJpdmVJZCA9IHRoaXMuYWxpVG9rZW5zLnJlc291cmNlX2RyaXZlX2lkIHx8IHRoaXMuYWxpVG9rZW5zLmRlZmF1bHRfZHJpdmVfaWQ7XFxuICAgIHRoaXMucmVhY2Nlc3NUayA9ICh0aGlzLmFsaVRva2Vucy50b2tlbl90eXBlIHx8IFxcXCJCZWFyZXJcXFwiKSArICcgJyArIHRoaXMuYWxpVG9rZW5zLmFjY2Vzc190b2tlbjtcXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFxcXCJzaGFyZVRva2VuXFxcIiwge1xcbiAgICAgICAgZ2V0KCl7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NoYXJlVG9rZW58fCB0aGlzLmdldFNoYXJlVG9rZW4oKTtcXG4gICAgICAgIH0sXFxuICAgICAgICBzZXQodil7XFxuICAgICAgICAgICAgdGhpcy5fc2hhcmVUb2tlbj12O1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFxcXCJvcGVuVG9vbHNcXFwiLCB7XFxuICAgICAgICBnZXQoKXtcXG4gICAgICAgICAgICBpZiAodGhpcy5fb3BlblRvb2xzKSByZXR1cm4gX29wZW5Ub29scztcXG4gICAgICAgICAgICBsZXQgT3BlbkFwaVRvb2xzO1xcbiAgICAgICAgICAgIHN3aXRjaCAoZ2V0SXRlbShcXFwib3BlbkFwaU1vZGVcXFwiLCBcXFwiMFxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIGNhc2UgXFxcIjFcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgT3BlbkFwaVRvb2xzID0gJC5yZXF1aXJlKFxcXCJvcGVuQXBpX2FsaXl1bmRyaXZlXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgY2FzZSBcXFwiMlxcXCI6XFxuICAgICAgICAgICAgICAgICAgICBPcGVuQXBpVG9vbHMgPSAkLnJlcXVpcmUoXFxcIm9wZW5BcGlfdHZib3hcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICBjYXNlIFxcXCIzXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgIE9wZW5BcGlUb29scyA9ICQucmVxdWlyZShcXFwib3BlbkFwaV9YQllcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICBjYXNlIFxcXCIwXFxcIjpcXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcXG4gICAgICAgICAgICAgICAgICAgIE9wZW5BcGlUb29scyA9ICQucmVxdWlyZShcXFwib3BlbkFwaV9hbGlzdFxcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLl9vcGVuVG9vbHMgPSBuZXcgT3BlbkFwaVRvb2xzKHRoaXMpO1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcGVuVG9vbHM7XFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXFxcIm9wZW5Ub2tlbnNcXFwiLCB7XFxuICAgICAgICBnZXQoKXtcXG4gICAgICAgICAgICBpZiAodGhpcy5fb3BlblRva2VucykgcmV0dXJuIHRoaXMuX29wZW5Ub2tlbnM7XFxuICAgICAgICAgICAgdGhpcy5fb3BlblRva2VucyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICAgICAgICAgICAgICAnUmVmcmVzaFRva2VuT3Blbic6ICcnLFxcbiAgICAgICAgICAgICAgICAnQWNjZXNzVG9rZW5PcGVuJzogJycsXFxuICAgICAgICAgICAgICAgICdCaW5kUmVmcmVzaFRva2VuJzogJycsXFxuICAgICAgICAgICAgfSwgb3BlblRva2Vucyk7XFxuICAgICAgICAgICAgaWYgKG9wZW5Ub2tlbnMgIT09IG51bGwgJiYgIXRoaXMuX29wZW5Ub2tlbnMuQWNjZXNzVG9rZW5PcGVuKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaE9wZW5Ub2tlbigpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb3BlblRva2VucztcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufVxcbk9iamVjdC5hc3NpZ24oQWxpQWNjZXNzQXBpLnByb3RvdHlwZSwge1xcbiAgICBfb3BlblRvb2xzOnZvaWQgMCxcXG4gICAgX29wZW5Ub2tlbnM6dm9pZCAwLFxcbiAgICBfc2hhcmVUb2tlbjp2b2lkIDAsXFxuICAgIHJlZnJlc2hTaGFyZUxpc3RlbmVyKHJlZnJlc2hTaGFyZUNhbGxCYWNrKSB7XFxuICAgICAgICB0aGlzLnJlZnJlc2hTaGFyZUNhbGxCYWNrID0gcmVmcmVzaFNoYXJlQ2FsbEJhY2s7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgcmVmcmVzaEFjY2Vzc0xpc3RlbmVyKHJlZnJlc2hBY2Nlc3NDYWxsQmFjaykge1xcbiAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzQ2FsbEJhY2sgPSByZWZyZXNoQWNjZXNzQ2FsbEJhY2s7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgcmVmcmVzaE9wZW5MaXN0ZW5lcihyZWZyZXNoT3BlbkNhbGxCYWNrKSB7XFxuICAgICAgICB0aGlzLnJlZnJlc2hPcGVuQ2FsbEJhY2sgPSByZWZyZXNoT3BlbkNhbGxCYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHdhaXRTbGVlcCh0aW1lKSB7XFxuICAgICAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKHRpbWUgfHwgNjAwKTtcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBwb3N0QXBpKGFwaSkge1xcbiAgICAgICAgcmV0dXJuIGh0dHBSZXF1ZXN0LnBvc3QoYXBpLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSA/IGFwaSA6ICdodHRwczovL2FwaS5hbGl5dW5kcml2ZS5jb20nICsgYXBpKS5ib2R5VG9TdHJpbmcodHJ1ZSkuZXJyb3IoKGVycikgPT4ge1xcbiAgICAgICAgICAgIHRocm93IGVycjtcXG4gICAgICAgIH0pLmVycm9yVHlwZSgoZXJyLCByZXMpID0+IHtcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0ge307XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXMuYm9keSk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcmJvZHkgPSAocmVzdWx0LmNvZGUgPyByZXN1bHQgOiAocmVzdWx0ICYmIHJlc3VsdC5yZXNwb25zZXMgJiYgcmVzdWx0LnJlc3BvbnNlc1swXSAmJiByZXN1bHQucmVzcG9uc2VzWzBdLmJvZHkpKSB8fCB7fTtcXG4gICAgICAgICAgICBpZiAocmJvZHkuY29kZSkge1xcbiAgICAgICAgICAgICAgICBsZXQgbXNnID0gcmJvZHkuZGlzcGxheV9tZXNzYWdlIHx8IHJib2R5Lm1lc3NhZ2U7XFxuICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihhcGkgKyBcXFwiPT5cXFwiICsgcmJvZHkuY29kZSArIFxcXCI6XFxcIiArIG1zZyk7XFxuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSByYm9keS5jb2RlO1xcbiAgICAgICAgICAgICAgICBlcnJvci5qdWRnZU1zZyA9IG1zZztcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZXJyO1xcbiAgICAgICAgfSk7XFxuICAgIH0sXFxuXFxuICAgIHRyeVNvbHZlKGUpIHtcXG4gICAgICAgIGlmIChlLmNvZGUgPT09IFxcXCJTaGFyZUxpbmtUb2tlbkludmFsaWRcXFwiIHx8IGUuY29kZSA9PT0gXFxcIkludmFsaWRQYXJhbWV0ZXJOb3RNYXRjaC5TaGFyZUlkXFxcIikge1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5nZXRTaGFyZVRva2VuKCk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9IGVsc2UgaWYgKGUuY29kZSA9PT0gXFxcIkFjY2Vzc1Rva2VuSW52YWxpZFxcXCIgfHwgZS5jb2RlID09PSBcXFwiQWNjZXNzVG9rZW5FeHBpcmVkXFxcIikge1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0gZWxzZSBpZiAoZS5jb2RlID09PSBcXFwiRm9yYmlkZGVuTm9QZXJtaXNzaW9uLkZpbGVcXFwiIHx8IChlLmNvZGUgPT09IFxcXCJCYWRSZXF1ZXN0XFxcIiAmJiBlLmp1ZGdlTXNnID09PSBcXFwi5LuF5Y+v5L+d5a2Y5Yiw6L2s5a2Y56m66Ze0XFxcIikpIHtcXG4gICAgICAgICAgICB0aGlzLmFsaVRva2Vucy5yZXNvdXJjZV9kcml2ZV9pZCA9IHVuZGVmaW5lZDtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkucmVmcmVzaEFjY2Vzc1Rva2VuKCk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH0sXFxuICAgIHRyeU9wZW5BcGlTb2x2ZShlKSB7XFxuICAgICAgICBpZiAoZS5jb2RlID09PSBcXFwiQWNjZXNzVG9rZW5JbnZhbGlkXFxcIiB8fCBlLmNvZGUgPT09IFxcXCJBY2Nlc3NUb2tlbkV4cGlyZWRcXFwiKSB7XFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLnJlZnJlc2hPcGVuVG9rZW4oKTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLnJlZnJlc2hBY2Nlc3NUb2tlbigpO1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoT3BlblRva2VuKCk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH0sXFxuICAgIGdldFNoYXJlVG9rZW4oKSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5wb3N0QXBpKFxcXCIvdjIvc2hhcmVfbGluay9nZXRfc2hhcmVfdG9rZW5cXFwiKS5ib2R5KHtcXG4gICAgICAgICAgICBcXFwic2hhcmVfaWRcXFwiOiB0aGlzLnNoYXJlSWQsXFxuICAgICAgICAgICAgXFxcInNoYXJlX3B3ZFxcXCI6IHRoaXMuc2hhcmVQd2QsXFxuICAgICAgICB9KS5zdGFydCh0cnVlKTtcXG4gICAgICAgIHRoaXMuc2hhcmVUb2tlbiA9IHJlc3VsdC5zaGFyZV90b2tlbjtcXG4gICAgICAgIHRoaXMucmVmcmVzaFNoYXJlQ2FsbEJhY2socmVzdWx0LnNoYXJlX3Rva2VuLCB0aGlzKTtcXG4gICAgICAgIHJldHVybiByZXN1bHQuc2hhcmVfdG9rZW47XFxuICAgIH0sXFxuICAgIHJlZnJlc2hBY2Nlc3NUb2tlbigpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnBvc3RBcGkoXFxcImh0dHBzOi8vYXV0aC5hbGl5dW5kcml2ZS5jb20vdjIvYWNjb3VudC90b2tlblxcXCIpXFxuICAgICAgICAgICAgLmJvZHkoe1xcbiAgICAgICAgICAgICAgICBcXFwiZ3JhbnRfdHlwZVxcXCI6IFxcXCJyZWZyZXNoX3Rva2VuXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcInJlZnJlc2hfdG9rZW5cXFwiOiB0aGlzLmFsaVRva2Vucy5yZWZyZXNoX3Rva2VuLFxcbiAgICAgICAgICAgIH0pLmhlYWRlcnMoe1xcbiAgICAgICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFBDX1VBLFxcbiAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vXFxcIlxcbiAgICAgICAgICAgIH0pLmVycm9yKChlKSA9PiB7XFxuICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IFxcXCJJbnZhbGlkUGFyYW1ldGVyLlJlZnJlc2hUb2tlblxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIGUubWVzc2FnZSA9IFxcXCIj55m76ZmG6L+H5pyf6K+36YeN5paw55m76ZmGI1xcXFxuXFxcIiArIGUubWVzc2FnZTtcXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KS5zdGFydCh0cnVlKTtcXG4gICAgICAgIGRlbGV0ZSByZXN1bHQudXNlcl9kYXRhO1xcbiAgICAgICAgbGV0IG9yaWdpbkRlZmREcml2ZUlkID0gdGhpcy5hbGlUb2tlbnMuZGVmYXVsdF9kcml2ZV9pZDtcXG4gICAgICAgIHRoaXMuYWxpVG9rZW5zID0gT2JqZWN0LmFzc2lnbih0aGlzLmFsaVRva2VucywgcmVzdWx0KTtcXG4gICAgICAgIHRoaXMucmVhY2Nlc3NUayA9IHRoaXMuYWxpVG9rZW5zLnRva2VuX3R5cGUgKyAnICcgKyB0aGlzLmFsaVRva2Vucy5hY2Nlc3NfdG9rZW47XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmICgob3JpZ2luRGVmZERyaXZlSWQgIT09IHRoaXMuYWxpVG9rZW5zLmRlZmF1bHRfZHJpdmVfaWQpIHx8IHRoaXMuYWxpVG9rZW5zLnJlc291cmNlX2RyaXZlX2lkID09PSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlc291cmNlX2RyaXZlX2lkID0gdGhpcy5nZXRVc2VySW5mbygpLnJlc291cmNlX2RyaXZlX2lkO1xcbiAgICAgICAgICAgICAgICB0aGlzLmFsaVRva2Vucy5yZXNvdXJjZV9kcml2ZV9pZCA9IHJlc291cmNlX2RyaXZlX2lkO1xcbiAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VfZHJpdmVfaWQpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmRHJpdmVJZCA9IHJlc291cmNlX2RyaXZlX2lkO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZEcml2ZUlkID0gdGhpcy5hbGlUb2tlbnMuZGVmYXVsdF9kcml2ZV9pZDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coXFxcIueUqOaIt+S/oeaBr+iOt+WPluWksei0pe+8mlxcXCIgKyBlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzQ2FsbEJhY2socmVzdWx0LCB0aGlzKTtcXG4gICAgICAgIHJldHVybiB0aGlzLmFsaVRva2VucztcXG4gICAgfSxcXG4gICAgZ2V0VXNlckluZm8oKSB7XFxuICAgICAgICBsZXQgaW5mbyA9IHRoaXMucG9zdEFwaShcXFwiaHR0cHM6Ly91c2VyLmFsaXl1bmRyaXZlLmNvbS92Mi91c2VyL2dldFxcXCIpLmhlYWRlcnMoe1xcbiAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogUENfVUEsXFxuICAgICAgICAgICAgXFxcImF1dGhvcml6YXRpb25cXFwiOiB0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL1xcXCJcXG4gICAgICAgIH0pLmVycm9yV2l0aFJldHJ5KChlLCBfLCBodHRwKSA9PiB7XFxuICAgICAgICAgICAgdGhpcy50cnlTb2x2ZShlKTtcXG4gICAgICAgICAgICBodHRwLm1lcmdlSGVhZEFuZEJvZHkoe1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUa1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KS5zdGFydCh0cnVlKTtcXG4gICAgICAgIHJldHVybiBpbmZvO1xcbiAgICB9LFxcbiAgICBjYWNoZU9wZW5Ub2tlbihvcGVuUmVzdWx0KSB7XFxuICAgICAgICB0aGlzLm9wZW5Ub2tlbnMuUmVmcmVzaFRva2VuT3BlbiA9IG9wZW5SZXN1bHQucmVmcmVzaF90b2tlbjtcXG4gICAgICAgIHRoaXMub3BlblRva2Vucy5BY2Nlc3NUb2tlbk9wZW4gPSBvcGVuUmVzdWx0LnRva2VuX3R5cGUgKyBcXFwiIFxcXCIgKyBvcGVuUmVzdWx0LmFjY2Vzc190b2tlbjtcXG4gICAgICAgIHRoaXMub3BlblRva2Vucy5CaW5kUmVmcmVzaFRva2VuID0gdGhpcy5hbGlUb2tlbnMucmVmcmVzaF90b2tlbjtcXG4gICAgICAgIHRoaXMucmVmcmVzaE9wZW5DYWxsQmFjayhvcGVuUmVzdWx0LCB0aGlzKTtcXG4gICAgfSxcXG4gICAgcmVmcmVzaE9wZW5Ub2tlbigpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IG9wZW5SZXN1bHQ7XFxuICAgICAgICAgICAgaWYgKHRoaXMub3BlblRva2Vucy5SZWZyZXNoVG9rZW5PcGVuICYmIHRoaXMub3BlblRva2Vucy5CaW5kUmVmcmVzaFRva2VuID09PSB0aGlzLmFsaVRva2Vucy5yZWZyZXNoX3Rva2VuKSB7XFxuICAgICAgICAgICAgICAgIG9wZW5SZXN1bHQgPSB0aGlzLm9wZW5Ub29scy5yZWZyZXNoT3BlblRva2VuKCkgfHwge307XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgb3BlblJlc3VsdCA9IHRoaXMub3BlblRvb2xzLmdldE9wZW5Ub2tlbigpIHx8IHt9O1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAob3BlblJlc3VsdC5yZWZyZXNoX3Rva2VuKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVPcGVuVG9rZW4ob3BlblJlc3VsdCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5Ub2tlbnM7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLov5Tlm57nu5Pmnpzml6BUb2tlblxcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIk9wZW5Ub2tlbuiOt+WPluWksei0pTpcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgX2Nsb3VkRmlsZU9wZXJhdGUoYm9keSwgY2xvdWRGaWxlSWQsIG9wZXJhdGVVcmwpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnBvc3RBcGkoJ2h0dHBzOi8vYXBpLmFsaXl1bmRyaXZlLmNvbS9hZHJpdmUvdjIvYmF0Y2gnKS5ib2R5KHtcXG4gICAgICAgICAgICBcXFwicmVxdWVzdHNcXFwiOiBbe1xcbiAgICAgICAgICAgICAgICBcXFwiYm9keVxcXCI6IGJvZHksXFxuICAgICAgICAgICAgICAgIFxcXCJoZWFkZXJzXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIkNvbnRlbnQtVHlwZVxcXCI6IFxcXCJhcHBsaWNhdGlvbi9qc29uXFxcIlxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBcXFwiaWRcXFwiOiBjbG91ZEZpbGVJZCB8fCBcXFwiMFxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJtZXRob2RcXFwiOiBcXFwiUE9TVFxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJ1cmxcXFwiOiBvcGVyYXRlVXJsXFxuICAgICAgICAgICAgfV0sXFxuICAgICAgICAgICAgXFxcInJlc291cmNlXFxcIjogXFxcImZpbGVcXFwiXFxuICAgICAgICB9KS5oZWFkZXJzKHtcXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6IFBDX1VBLFxcbiAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS8nLFxcbiAgICAgICAgICAgICdhdXRob3JpemF0aW9uJzogdGhpcy5yZWFjY2Vzc1RrLFxcbiAgICAgICAgICAgIC8vZ2V0QWNjZXNzVG9rZW5cXG4gICAgICAgICAgICAneC1jYW5hcnknOiAnY2xpZW50PXdlYixhcHA9c2hhcmUsdmVyc2lvbj12Mi4zLjEnLFxcbiAgICAgICAgICAgICd4LXNoYXJlLXRva2VuJzogdGhpcy5zaGFyZVRva2VuXFxuICAgICAgICB9KS5lcnJvcldpdGhSZXRyeSgoZSwgXywgaHR0cCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IFxcXCJRdW90YUV4aGF1c3RlZC5Ecml2ZVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgaWYgKCF0aGlzLnRyeVNvbHZlKGUpKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGJvZHkgPSBodHRwLm9wdGlvbnMuYm9keS5yZXF1ZXN0c1swXS5ib2R5O1xcbiAgICAgICAgICAgIGlmIChib2R5LmRyaXZlX2lkKSB7XFxuICAgICAgICAgICAgICAgIGJvZHkuZHJpdmVfaWQgPSB0aGlzLmRlZkRyaXZlSWRcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKGJvZHkudG9fZHJpdmVfaWQpIHtcXG4gICAgICAgICAgICAgICAgYm9keS50b19kcml2ZV9pZCA9IHRoaXMuZGVmRHJpdmVJZFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBodHRwLm1lcmdlSGVhZEFuZEJvZHkoe1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXG4gICAgICAgICAgICAgICAgICAgICd4LXNoYXJlLXRva2VuJzogdGhpcy5zaGFyZVRva2VuXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgY29weUZpbGVUb0Nsb3VkRmlsZShmaWxlSWQsIHJldHJ5KSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fY2xvdWRGaWxlT3BlcmF0ZSh7XFxuICAgICAgICAgICAgXFxcImZpbGVfaWRcXFwiOiBmaWxlSWQsXFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogdGhpcy5zaGFyZUlkLFxcbiAgICAgICAgICAgIFxcXCJhdXRvX3JlbmFtZVxcXCI6IHRydWUsXFxuICAgICAgICAgICAgXFxcInRvX3BhcmVudF9maWxlX2lkXFxcIjogXFxcInJvb3RcXFwiLFxcbiAgICAgICAgICAgIFxcXCJ0b19kcml2ZV9pZFxcXCI6IHRoaXMuZGVmRHJpdmVJZFxcbiAgICAgICAgfSwgXFxcIjBcXFwiLCBcXFwiL2ZpbGUvY29weVxcXCIpO1xcbiAgICAgICAgbGV0IGJvZHkgPSByZXN1bHQgJiYgcmVzdWx0LnJlc3BvbnNlcyAmJiByZXN1bHQucmVzcG9uc2VzWzBdICYmIHJlc3VsdC5yZXNwb25zZXNbMF0uYm9keSB8fCB7fTtcXG4gICAgICAgIGlmICghYm9keS5maWxlX2lkICYmICFyZXRyeSkge1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDIwKS5nZXRTaGFyZVRva2VuKCk7XFxuICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLnJlZnJlc2hBY2Nlc3NUb2tlbigpO1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndhaXRTbGVlcCgyMCkuY29weUZpbGVUb0Nsb3VkRmlsZShmaWxlSWQsIHRydWUpO1xcbiAgICAgICAgfSBlbHNlIGlmICghYm9keS5maWxlX2lkKSB7XFxuICAgICAgICAgICAgbGV0IGUgPSBuZXcgRXJyb3IoXFxcIuaWh+S7tuWkjeWItuWksei0pTpcXFxcblxcXCIgKyBKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcXG4gICAgICAgICAgICBlLmNvZGUgPSBib2R5LmNvZGU7XFxuICAgICAgICAgICAgdGhyb3cgZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiByZXN1bHQucmVzcG9uc2VzWzBdLmJvZHkuZmlsZV9pZDtcXG4gICAgfSxcXG4gICAgb3BlbkNsb3VkRmlsZVRvRG93blVybChjbG91ZEZpbGVJZCkge1xcbiAgICAgICAgbGV0IGZpbGVJbmZvID0gdGhpcy5wb3N0QXBpKCdodHRwczovL29wZW4uYWxpeXVuZHJpdmUuY29tL2Fkcml2ZS92MS4wL29wZW5GaWxlL2dldERvd25sb2FkVXJsJykuYm9keSh7XFxuICAgICAgICAgICAgJ2ZpbGVfaWQnOiBjbG91ZEZpbGVJZCxcXG4gICAgICAgICAgICAnZHJpdmVfaWQnOiB0aGlzLmRlZkRyaXZlSWRcXG4gICAgICAgIH0pLmhlYWRlcnMoe1xcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogUENfVUEsXFxuICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tLycsXFxuICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLm9wZW5Ub2tlbnMuQWNjZXNzVG9rZW5PcGVuXFxuICAgICAgICB9KS5lcnJvcldpdGhSZXRyeSgyLCAoZSwgXywgaHR0cCkgPT4ge1xcbiAgICAgICAgICAgIC8vdGhpcy53YWl0U2xlZXAoMzApLnRyeVNvbHZlKGUpO1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDMwKS50cnlPcGVuQXBpU29sdmUoZSk7XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgJ2RyaXZlX2lkJzogdGhpcy5kZWZEcml2ZUlkLFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMub3BlblRva2Vucy5BY2Nlc3NUb2tlbk9wZW5cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICBpZiAoIWZpbGVJbmZvLnVybCB8fCBmaWxlSW5mby5jb2RlKSB0aHJvdyBuZXcgRXJyb3IoXFxcIuS4i+i9vemTvuaOpeiOt+WPluWksei0pVxcXFxuXFxcIiArIGZpbGVJbmZvLmNvZGUgKyBcXFwiOlxcXCIgKyBmaWxlSW5mby5tZXNzYWdlKTtcXG4gICAgICAgIHJldHVybiBmaWxlSW5mby51cmw7XFxuICAgIH0sXFxuICAgIGRlbGV0ZWVDbG91ZEZpbGUoY2xvdWRGaWxlSWQpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9jbG91ZEZpbGVPcGVyYXRlKHtcXG4gICAgICAgICAgICBcXFwiZHJpdmVfaWRcXFwiOiB0aGlzLmRlZkRyaXZlSWQsXFxuICAgICAgICAgICAgXFxcImZpbGVfaWRcXFwiOiBjbG91ZEZpbGVJZFxcbiAgICAgICAgfSwgY2xvdWRGaWxlSWQsIFxcXCIvZmlsZS9kZWxldGVcXFwiKTtcXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIGdldFZpZGVvVGVtUGxheVVybChmaWxlSWQpIHtcXG4gICAgICAgIGxldCBjbG91ZEZpbGVJZCA9IHRoaXMuY29weUZpbGVUb0Nsb3VkRmlsZShmaWxlSWQpO1xcbiAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApO1xcbiAgICAgICAgbGV0IHBsYXlVcmwgPSB0aGlzLm9wZW5DbG91ZEZpbGVUb0Rvd25VcmwoY2xvdWRGaWxlSWQpO1xcbiAgICAgICAgdGhpcy53YWl0U2xlZXAoNTApO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICB0aGlzLmRlbGV0ZWVDbG91ZEZpbGUoY2xvdWRGaWxlSWQpO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhcXFwiI+aWh+S7tuWIoOmZpOWksei0pSNcXFxcbumUmeivr+S/oeaBrz5cXFwiICsgZS50b1N0cmluZygpICsgXFxcIlxcXFxu6ZSZ6K+v6KGMPlxcXCIgKyBlLmxpbmVOdW1iZXIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHBsYXlVcmw7XFxuICAgIH0sXFxuICAgIGdldEZpbGVUb0Rvd25VcmwoZmlsZUlkKSB7XFxuICAgICAgICBsZXQgZG93bmxvYWRJbmZvID0gdGhpcy5wb3N0QXBpKFxcXCIvdjIvZmlsZS9nZXRfc2hhcmVfbGlua19kb3dubG9hZF91cmxcXFwiKS5ib2R5KHtcXG4gICAgICAgICAgICBcXFwiZXhwaXJlX3NlY1xcXCI6IDYwMCxcXG4gICAgICAgICAgICBcXFwiZmlsZV9pZFxcXCI6IGZpbGVJZCxcXG4gICAgICAgICAgICBcXFwic2hhcmVfaWRcXFwiOiB0aGlzLnNoYXJlSWRcXG4gICAgICAgIH0pLmhlYWRlcnMoe1xcbiAgICAgICAgICAgIFxcXCJYLVNoYXJlLVRva2VuXFxcIjogdGhpcy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgIFxcXCJhdXRob3JpemF0aW9uXFxcIjogdGhpcy5hbGlUb2tlbnMuYWNjZXNzX3Rva2VuXFxuICAgICAgICB9KS5lcnJvcldpdGhSZXRyeSgoZSwgXywgaHR0cCkgPT4ge1xcbiAgICAgICAgICAgIHRoaXMudHJ5U29sdmUoZSk7XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlgtU2hhcmUtVG9rZW5cXFwiOiB0aGlzLnNoYXJlVG9rZW4sXFxuICAgICAgICAgICAgICAgICAgICBcXFwiYXV0aG9yaXphdGlvblxcXCI6IHRoaXMuYWxpVG9rZW5zLmFjY2Vzc190b2tlblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KS5zdGFydCh0cnVlKTtcXG4gICAgICAgIHJldHVybiBkb3dubG9hZEluZm8uZG93bmxvYWRfdXJsO1xcbiAgICB9LFxcbiAgICBnZXRTaWduKCkge1xcbiAgICAgICAgaWYgKCF0aGlzLmFsaVRva2Vucy5kZXZpY2VfaWQpIHtcXG4gICAgICAgICAgICB0aGlzLndhaXRTbGVlcCgyMCkucmVmcmVzaEFjY2Vzc1Rva2VuKCk7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgY2FsY3VsYXRlTmV3U2lnbiA9ICgpID0+IHtcXG4gICAgICAgICAgICBsZXQgc2lnbiA9IGp1c3RUZXN0U2lnbihcXFwiNWRkZTRlMWJkZjllNDk2NmIzODdiYTU4ZjRiM2ZkYzNcXFwiLCB0aGlzLmFsaVRva2Vucy5kZXZpY2VfaWQsIHRoaXMuYWxpVG9rZW5zLnVzZXJfaWQpLnNwbGl0KFxcXCIjI1xcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZTogc2lnbi5hdCgwKSxcXG4gICAgICAgICAgICAgICAgcHViS2V5OiBzaWduLmF0KC0xKVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICB9O1xcbiAgICAgICAgbGV0IG5ld1NpZ24gPSBjYWxjdWxhdGVOZXdTaWduKCk7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5wb3N0QXBpKCcvdXNlcnMvdjEvdXNlcnMvZGV2aWNlL2NyZWF0ZV9zZXNzaW9uJykuYm9keSh7XFxuICAgICAgICAgICAgXFxcImRldmljZU5hbWVcXFwiOiBcXFwiRWRnZea1j+iniOWZqFxcXCIsXFxuICAgICAgICAgICAgXFxcIm1vZGVsTmFtZVxcXCI6IFxcXCJXaW5kb3dz572R6aG154mIXFxcIixcXG4gICAgICAgICAgICBcXFwicHViS2V5XFxcIjogbmV3U2lnbi5wdWJLZXksXFxuICAgICAgICB9KS5oZWFkZXJzKHtcXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6IFBDX1VBLFxcbiAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbScsXFxuICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiB0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgJ1gtU2hhcmUtVG9rZW4nOiB0aGlzLnNoYXJlVG9rZW4sXFxuICAgICAgICAgICAgJ3gtZGV2aWNlLWlkJzogdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkLFxcbiAgICAgICAgICAgICd4LXNpZ25hdHVyZSc6IG5ld1NpZ24uc2lnbmF0dXJlXFxuICAgICAgICB9KS5lcnJvcldpdGhSZXRyeSgzLCAoZSwgXywgaHR0cCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChlLm1lc3NhZ2UgPT09IFxcXCJ4LWRldmljZS1pZCBlbXB0eVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy53YWl0U2xlZXAoMjApLnJlZnJlc2hBY2Nlc3NUb2tlbigpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLnRyeVNvbHZlKGUpO1xcbiAgICAgICAgICAgIHRoaXMud2FpdFNsZWVwKDUwKTtcXG4gICAgICAgICAgICBuZXdTaWduID0gY2FsY3VsYXRlTmV3U2lnbigpO1xcbiAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwdWJLZXlcXFwiOiBuZXdTaWduLnB1YktleVxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IHRoaXMucmVhY2Nlc3NUayxcXG4gICAgICAgICAgICAgICAgICAgICdYLVNoYXJlLVRva2VuJzogdGhpcy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgICAgICAgICAgJ3gtZGV2aWNlLWlkJzogdGhpcy5hbGlUb2tlbnMuZGV2aWNlX2lkLFxcbiAgICAgICAgICAgICAgICAgICAgJ3gtc2lnbmF0dXJlJzogbmV3U2lnbi5zaWduYXR1cmVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgICAgfSkuZXJyb3IoKGVyciwgcmVzKSA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuIHt9O1xcbiAgICAgICAgfSkuc3VjY2VzcygoYm9keSkgPT4ge1xcbiAgICAgICAgICAgIHJldHVybiBib2R5O1xcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcXG4gICAgICAgICAgICByZXR1cm4gbmV3U2lnbjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCJTaWdu6I635Y+W5aSx6LSl77yM6K+36YeN6K+V44CCXFxcXG5jb2RlOlxcXCIgKyAocmVzdWx0LmNvZGUgfHwgXFxcIlxcXCIpICsgXFxcIlxcXFxubWVzc2FnZTpcXFwiICsgKHJlc3VsdC5tZXNzYWdlIHx8IFxcXCJcXFwiKSk7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIGdldFNoYXJlVmlkZW9QcmV2aWV3KGZpbGVJZCkge1xcbiAgICAgICAgbGV0IHNpZ24gPSB0aGlzLmdldFNpZ24oKTtcXG4gICAgICAgIGxldCBqc29uID0gdGhpcy5wb3N0QXBpKCdodHRwczovL2FwaS5hbGl5dW5kcml2ZS5jb20vdjIvZmlsZS9nZXRfc2hhcmVfbGlua192aWRlb19wcmV2aWV3X3BsYXlfaW5mbycpLmJvZHkoe1xcbiAgICAgICAgICAgIFxcXCJjYXRlZ29yeVxcXCI6IFxcXCJsaXZlX3RyYW5zY29kaW5nXFxcIixcXG4gICAgICAgICAgICBcXFwiZmlsZV9pZFxcXCI6IGZpbGVJZCxcXG4gICAgICAgICAgICBcXFwiZ2V0X3ByZXZpZXdfdXJsXFxcIjogdHJ1ZSxcXG4gICAgICAgICAgICBcXFwic2hhcmVfaWRcXFwiOiB0aGlzLnNoYXJlSWQsXFxuICAgICAgICAgICAgXFxcInRlbXBsYXRlX2lkXFxcIjogXFxcIlxcXCIsXFxuICAgICAgICAgICAgXFxcImdldF9zdWJ0aXRsZV9pbmZvXFxcIjogdHJ1ZVxcbiAgICAgICAgfSkuaGVhZGVycyh7XFxuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLFxcbiAgICAgICAgICAgIFxcXCJvcmlnaW5cXFwiOiBcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tXFxcIixcXG4gICAgICAgICAgICBcXFwicmVmZXJlclxcXCI6IFxcXCJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vXFxcIixcXG4gICAgICAgICAgICBcXFwidXNlci1hZ2VudFxcXCI6IFxcXCJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTEwLjAuMC4wIFNhZmFyaS81MzcuMzYgRWRnLzExMC4wLjE1ODcuNDFcXFwiLFxcbiAgICAgICAgICAgIFxcXCJ4LWNhbmFyeVxcXCI6IFxcXCJjbGllbnQ9d2ViLGFwcD1hZHJpdmUsdmVyc2lvbj12My4xLjBcXFwiLFxcbiAgICAgICAgICAgIFxcXCJ4LXNoYXJlLXRva2VuXFxcIjogdGhpcy5zaGFyZVRva2VuLFxcbiAgICAgICAgICAgIFxcXCJmaWxlaWRcXFwiOiB0aGlzLmFsaVRva2Vucy51c2VyX2lkLFxcbiAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogdGhpcy5yZWFjY2Vzc1RrLFxcbiAgICAgICAgICAgICd4LWRldmljZS1pZCc6IHRoaXMuYWxpVG9rZW5zLmRldmljZV9pZCxcXG4gICAgICAgICAgICAneC1zaWduYXR1cmUnOiBzaWduLnNpZ25hdHVyZVxcbiAgICAgICAgfSkuZXJyb3JXaXRoUmV0cnkoKGUsIF8sIGh0dHApID0+IHtcXG4gICAgICAgICAgICB0aGlzLnRyeVNvbHZlKGUpO1xcbiAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogdGhpcy5yZWFjY2Vzc1RrLFxcbiAgICAgICAgICAgICAgICAgICAgJ1gtc2hhcmUtdG9rZW4nOiB0aGlzLnNoYXJlVG9rZW4sXFxuICAgICAgICAgICAgICAgICAgICAneC1kZXZpY2UtaWQnOiB0aGlzLmFsaVRva2Vucy5kZXZpY2VfaWQsXFxuICAgICAgICAgICAgICAgICAgICAneC1zaWduYXR1cmUnOiBzaWduLnNpZ25hdHVyZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KS5zdGFydCh0cnVlKTtcXG4gICAgICAgIHJldHVybiBqc29uLnZpZGVvX3ByZXZpZXdfcGxheV9pbmZvLmxpdmVfdHJhbnNjb2RpbmdfdGFza19saXN0LnJldmVyc2UoKTtcXG4gICAgfVxcbn0pO1xcblxcbkFsaUFjY2Vzc0FwaS5jcmVhdGVEZWZhdWx0ID0gZnVuY3Rpb24oc2hhcmVJZCwgc2hhcmVQd2QsIHNoYXJlVG9rZW4sIGFsaVRva2VuLCBvcGVuVG9rZW4sIE1ZX1RJVExFKSB7XFxuICAgIGNvbnN0IHtcXG4gICAgICAgIG9wZW5Ub2tlbnNGaWxlcGF0aCxcXG4gICAgICAgIGFsaVRva2Vuc0ZpbGVwYXRoXFxuICAgIH0gPSAkLnJlcXVpcmUoXFxcInRva2VuUGF0aFxcXCIgKyAoTVlfVElUTEUgPyBcXFwiP3J1bGU9XFxcIiArIE1ZX1RJVExFIDogXFxcIlxcXCIpKTtcXG4gICAgaWYgKCFvcGVuVG9rZW4gJiYgb3BlblRva2VuICE9PSBudWxsICYmIGZpbGVFeGlzdChvcGVuVG9rZW5zRmlsZXBhdGgpKSB7XFxuICAgICAgICBvcGVuVG9rZW4gPSAkLnJlcXVpcmUob3BlblRva2Vuc0ZpbGVwYXRoKTtcXG4gICAgfVxcbiAgICBpZiAoIWFsaVRva2VuICYmIGZpbGVFeGlzdChhbGlUb2tlbnNGaWxlcGF0aCkpIHtcXG4gICAgICAgIGFsaVRva2VuID0gJC5yZXF1aXJlKGFsaVRva2Vuc0ZpbGVwYXRoKTtcXG4gICAgfVxcbiAgICBpZiAoTVlfVElUTEUpIHtcXG4gICAgICAgIHNoYXJlVG9rZW4gPSBnZXRWYXIoTVlfVElUTEUgKyBcXFwiQGFsaVNoYXJlVG9rZW5cXFwiLCBzaGFyZVRva2VuKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHNoYXJlVG9rZW4gPSBnZXRNeVZhcihcXFwiYWxpU2hhcmVUb2tlblxcXCIsIHNoYXJlVG9rZW4pO1xcbiAgICB9XFxuICAgIHJldHVybiBuZXcgQWxpQWNjZXNzQXBpKHtcXG4gICAgICAgIHNoYXJlSWQsXFxuICAgICAgICBzaGFyZVB3ZCxcXG4gICAgICAgIHNoYXJlVG9rZW4sXFxuICAgICAgICBhbGlUb2tlbnM6IGFsaVRva2VuLFxcbiAgICAgICAgb3BlblRva2Vuczogb3BlblRva2VuXFxuICAgIH0pLnJlZnJlc2hTaGFyZUxpc3RlbmVyKChyZXN1bHQpID0+IHtcXG4gICAgICAgIGlmIChNWV9USVRMRSkge1xcbiAgICAgICAgICAgIHNoYXJlVG9rZW4gPSBwdXRWYXIoTVlfVElUTEUgKyBcXFwiQFxcXCIgKyBcXFwiYWxpU2hhcmVUb2tlblxcXCIsIHJlc3VsdCk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHNoYXJlVG9rZW4gPSBwdXRNeVZhcihcXFwiYWxpU2hhcmVUb2tlblxcXCIsIHJlc3VsdCk7XFxuICAgICAgICB9XFxuICAgIH0pLnJlZnJlc2hBY2Nlc3NMaXN0ZW5lcigocmVzdWx0LCBhcGkpPT57XFxuICAgICAgICB3cml0ZUZpbGUoYWxpVG9rZW5zRmlsZXBhdGgsIEpTT04uc3RyaW5naWZ5KGFwaS5hbGlUb2tlbnMpKTtcXG4gICAgfSkucmVmcmVzaE9wZW5MaXN0ZW5lcigocmVzdWx0LCBhcGkpID0+IHtcXG4gICAgICAgIHdyaXRlRmlsZShvcGVuVG9rZW5zRmlsZXBhdGgsIEpTT04uc3RyaW5naWZ5KGFwaS5vcGVuVG9rZW5zKSk7XFxuICAgIH0pO1xcbn1cXG4kLmV4cG9ydHMgPSBBbGlBY2Nlc3NBcGk7XFxuXFxuZnVuY3Rpb24gaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKSB7XFxuICAgIHRoaXMucmV0cnlDb3VudCA9IDA7XFxuICAgIHRoaXMudXJsID0gdXJsO1xcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XFxuICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcbiAgICB9KTtcXG4gICAgdGhpcy5lcnJvckNhbGxiYWNrID0gKGVyciwgcmVzKSA9PiB7XFxuICAgICAgICB0aHJvdyBlcnJcXG4gICAgfTtcXG4gICAgdGhpcy5lcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gKGVyciwgcmVzLCB0cnlSZXN0YXJ0KSA9PiBmYWxzZTtcXG4gICAgdGhpcy5zdWNjZXNzQ2FsbGJhY2sgPSAoYm9keSwgcmVzKSA9PiBib2R5O1xcbiAgICB0aGlzLmVycm9yVHlwZUNhbGxiYWNrID0gKGVyciwgcmVzKSA9PiBlcnI7XFxuICAgIHRoaXMuc3RhcnRSZXF1ZXN0ID0gZmV0Y2g7XFxuICAgIHRoaXMuX2JvZHlUb1N0cmluZyA9IGZhbHNlO1xcbn1cXG5cXG5PYmplY3QuYXNzaWduKGh0dHBSZXF1ZXN0LnByb3RvdHlwZSwge1xcbiAgICBib2R5VG9TdHJpbmcoZmxhZykge1xcbiAgICAgICAgdGhpcy5fYm9keVRvU3RyaW5nID0gISFmbGFnO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGJvZHkoYm9keSkge1xcbiAgICAgICAgdGhpcy5vcHRpb25zLmJvZHkgPSBib2R5IHx8IHZvaWQgMDtcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBzZXRTdGFydFJlcXVlc3RGdW5jKGZ1bmMpIHtcXG4gICAgICAgIHRoaXMuc3RhcnRSZXF1ZXN0ID0gZnVuYztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBoZWFkZXJzKGhlYWRlcnMpIHtcXG4gICAgICAgIHRoaXMub3B0aW9ucy5oZWFkZXJzID0gaGVhZGVycyB8fCB2b2lkIDA7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgc3VjY2VzcyhzdWNjZXNzQ2FsbGJhY2spIHtcXG4gICAgICAgIGlmICh0eXBlb2Ygc3VjY2Vzc0NhbGxiYWNrICE9PSBcXFwiZnVuY3Rpb25cXFwiKSByZXR1cm4gdGhpcztcXG4gICAgICAgIHRoaXMuc3VjY2Vzc0NhbGxiYWNrID0gc3VjY2Vzc0NhbGxiYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGVycm9yKGVycm9yQ2FsbGJhY2spIHtcXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JDYWxsYmFjayAhPT0gXFxcImZ1bmN0aW9uXFxcIikgcmV0dXJuIHRoaXM7XFxuICAgICAgICB0aGlzLmVycm9yQ2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGVycm9yVHlwZShlcnJvclR5cGVDYWxsYmFjaykge1xcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvclR5cGVDYWxsYmFjayAhPT0gXFxcImZ1bmN0aW9uXFxcIikgcmV0dXJuIHRoaXM7XFxuICAgICAgICB0aGlzLmVycm9yVHlwZUNhbGxiYWNrID0gZXJyb3JUeXBlQ2FsbGJhY2s7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgZXJyb3JXaXRoUmV0cnkocmV0cnlDb3VudCwgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSkge1xcbiAgICAgICAgaWYgKHR5cGVvZiByZXRyeUNvdW50ID09PSBcXFwiZnVuY3Rpb25cXFwiICYmIHR5cGVvZiBlcnJvckNhbGxiYWNrV2l0aFJldHJ5ID09PSBcXFwidW5kZWZpbmVkXFxcIikge1xcbiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkgPSByZXRyeUNvdW50O1xcbiAgICAgICAgICAgIHJldHJ5Q291bnQgPSAxO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvckNhbGxiYWNrV2l0aFJldHJ5ICE9PSBcXFwiZnVuY3Rpb25cXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICB9XFxuICAgICAgICB0aGlzLnJldHJ5Q291bnQgPSBOdW1iZXIocmV0cnlDb3VudCk7XFxuICAgICAgICB0aGlzLmVycm9yQ2FsbGJhY2tXaXRoUmV0cnkgPSBlcnJvckNhbGxiYWNrV2l0aFJldHJ5O1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHN0YXJ0KHRvSnNvbikge1xcbiAgICAgICAgbGV0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMpO1xcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiICYmIHRoaXMuX2JvZHlUb1N0cmluZykge1xcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuYm9keSk7XFxuICAgICAgICB9XFxuICAgICAgICB2YXIgcmVzID0gSlNPTi5wYXJzZSh0aGlzLnN0YXJ0UmVxdWVzdCh0aGlzLnVybCwgb3B0aW9ucykpO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlcy5zdGF0dXNDb2RlIDw9IDMwMCkge1xcbiAgICAgICAgICAgICAgICBsZXQgYm9keSA9IHJlcy5ib2R5O1xcbiAgICAgICAgICAgICAgICBpZiAodG9Kc29uKSB7XFxuICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdWNjZXNzQ2FsbGJhY2soYm9keSwgcmVzKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoU3RyaW5nKHJlcy5zdGF0dXNDb2RlKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgZXJyID0gdGhpcy5lcnJvclR5cGVDYWxsYmFjayhlcnIsIHJlcyk7XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAodGhpcy5yZXRyeUNvdW50KSB7XFxuXFxuICAgICAgICAgICAgICAgIGxldCB0cnlSZXN1bHQgPSB0aGlzLmVycm9yQ2FsbGJhY2tXaXRoUmV0cnkoZXJyLCByZXMsIHRoaXMpO1xcbiAgICAgICAgICAgICAgICBpZiAodHJ5UmVzdWx0KSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldHJ5Q291bnQtLTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0KHRvSnNvbik7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldHJ5Q291bnQgPSAwO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JDYWxsYmFjayhlcnIsIHJlcyk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckNhbGxiYWNrKGVyciwgcmVzKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHNldE9wdGlvbnMob3B0aW9ucykge1xcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xcbiAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBtZXJnZUhlYWRBbmRCb2R5KG9wdGlvbnMpIHtcXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xcbiAgICAgICAgdGhpcy5vcHRpb25zLmhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucy5oZWFkZXJzLCBvcHRpb25zLmhlYWRlcnMpO1xcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuYm9keSA9PT0gXFxcIm9iamVjdFxcXCIgJiYgdHlwZW9mIG9wdGlvbnMuYm9keSA9PT0gXFxcIm9iamVjdFxcXCIpIHtcXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYm9keSA9IE9iamVjdC5hc3NpZ24odGhpcy5vcHRpb25zLmJvZHksIG9wdGlvbnMuYm9keSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfVxcbn0pO1xcblxcbk9iamVjdC5hc3NpZ24oaHR0cFJlcXVlc3QsIHtcXG4gICAgZmV0Y2godXJsLCBvcHRpb25zKSB7XFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucyk7XFxuICAgIH0sXFxuICAgIHBvc3QodXJsLCBvcHRpb25zKSB7XFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KTtcXG4gICAgfSxcXG4gICAgcmVxdWVzdCh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKHJlcXVlc3QpO1xcbiAgICB9LFxcbiAgICBwb3N0UmVxdWVzdCh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3RSZXF1ZXN0KTtcXG4gICAgfSxcXG4gICAgZmV0Y2hDb29raWUodXJsLCBvcHRpb25zKSB7XFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykuc2V0U3RhcnRSZXF1ZXN0RnVuYyhmZXRjaENvb2tpZSk7XFxuICAgIH1cXG59KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIlRva2Vu6Lev5b6EXCIsXCJwYXRoXCI6XCJ0b2tlblBhdGhcIixcInJ1bGVcIjpcIiQuZXhwb3J0cz17XFxuICAgIFxcXCJvcGVuVG9rZW5zRmlsZXBhdGhcXFwiOiBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9Mb3lEZ0lrL2FsaU9wZW5Ub2tlbi5qc29uXFxcIixcXG4gICAgXFxcImFsaVRva2Vuc0ZpbGVwYXRoXFxcIjogXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvTG95RGdJay9hbGlUb2tlbi5qc29uXFxcIlxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW8ueW8uXBsYXnlt6XlhbdcIixcInBhdGhcIjpcImRhbm11XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgYmFzaWNVcmwgPSBcXFwiaHR0cHM6Ly9hcGkuZGFuZGFucGxheS5uZXQvXFxcIjtcXG5sZXQgc2V2ZVBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9jYWNoZS9kYW5tdS9cXFwiO1xcblxcbmZ1bmN0aW9uIGdldFJlZnJlc2hSYXRlKCkge1xcbiAgICBjb25zdCBDb250ZXh0ID0gYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7XFxuICAgIGNvbnN0IERpc3BsYXkgPSBhbmRyb2lkLnZpZXcuRGlzcGxheTtcXG4gICAgY29uc3QgV2luZG93TWFuYWdlciA9IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyO1xcbiAgICBjb25zdCBjb250ZXh0ID0gY29tLmV4YW1wbGUuaGlrZXJ2aWV3LnVpLkFwcGxpY2F0aW9uKCkuZ2V0Q29udGV4dCgpO1xcblxcbiAgICBsZXQgd2luZG93TWFuYWdlciA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTtcXG5cXG4gICAgbGV0IGRpc3BsYXkgPSB3aW5kb3dNYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCk7XFxuXFxuICAgIGxldCByZWZyZXNoUmF0ZSA9IGRpc3BsYXkuZ2V0UmVmcmVzaFJhdGUoKTtcXG4gICAgcmV0dXJuIHJlZnJlc2hSYXRlO1xcbn1cXG4kLmV4cG9ydHMuZ2V0RGFuTXUgPSBmdW5jdGlvbihrZXkpIHtcXG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVxdWVzdChiYXNpY1VybCArIFxcXCJhcGkvdjIvc2VhcmNoL2VwaXNvZGVzP2FuaW1lPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoZGVjb2RlVVJJQ29tcG9uZW50KGtleSkpKSk7XFxufVxcblxcbmZ1bmN0aW9uIGVuY29kZUh0bWwocykge1xcbiAgICBsZXQgUkVHWF9IVE1MX0VOQ09ERSA9IC/igJx8JnzigJl8XFxcXHUwMDNDfD58W1xcXFx4MDAtXFxcXHgyMF18W1xcXFx4N0YtXFxcXHhGRl18W1xcXFx1MDEwMC1cXFxcdTI3MDBdL2c7XFxuICAgcmV0dXJuIHMucmVwbGFjZShSRUdYX0hUTUxfRU5DT0RFLCBmdW5jdGlvbigkMCkge1xcbiAgICAgICAgdmFyIGMgPSAkMC5jaGFyQ29kZUF0KDApLFxcbiAgICAgICAgICAgIHIgPSBbXFxcIiYjXFxcIl07XFxuICAgICAgICBjID0gKGMgPT0gMHgyMCkgPyAweEEwIDogYztcXG4gICAgICAgIHIucHVzaChjKTtcXG4gICAgICAgIHIucHVzaChcXFwiO1xcXCIpO1xcbiAgICAgICAgcmV0dXJuIHIuam9pbihcXFwiXFxcIik7XFxuICAgIH0pO1xcbn1cXG5cXG5cXG5cXG4vLzDpu5jorqQgMeeugOS9kyAy57mB5L2TXFxuJC5leHBvcnRzLmRvd25sb2FkRGFuTXUgPSBmdW5jdGlvbihlcGlzb2RlSWQsIG5hbWUpIHtcXG4gICAgbGV0IGRhbk11RGF0YSA9IEpTT04ucGFyc2UocmVxdWVzdChidWlsZFVybChiYXNpY1VybCArIFxcXCJhcGkvdjIvY29tbWVudC9cXFwiICsgZXBpc29kZUlkLCB7XFxuICAgICAgICB3aXRoUmVsYXRlZDogdHJ1ZSxcXG4gICAgICAgIGNoQ29udmVydDogMVxcbiAgICB9KSkpO1xcbiAgICBsZXQgZE1jb250ZXh0ID0gXFxcIlxcXCI7XFxuICAgIC8vbGV0IGZwc20gPSBnZXRSZWZyZXNoUmF0ZSgpLzYwKjAuOTU7XFxuICAgIC8vZGFuTXVEYXRhLmNvbW1lbnRzLnNvcnQoKHYseCk9PnYucC5zcGxpdChcXFwiLFxcXCIpWzBdLXgucC5zcGxpdChcXFwiLFxcXCIpWzBdKTtcXG4gICAgZm9yIChsZXQgY29tbWVudCBvZiBkYW5NdURhdGEuY29tbWVudHMpIHtcXG4gICAgICAgIC8vZE1jb250ZXh0ICs9IGA8ZCBwPVxcXCIke01hdGgucm91bmQodGltZXBvaW50KX0sJHtjdH0sJHtzaXplfSwke2NvbG9yfSwwXFxcIj4ke2NvbnRlbnR9PC9kPlxcXFxuYDtcXG4gICAgICAgIGxldCBwYXJhbVRleHQgPSBjb21tZW50LnA7XFxuICAgICAgICBsZXQgY29tbWVudFRleHQgPSBjb21tZW50Lm07XFxuICAgICAgICBpZiAocGFyYW1UZXh0ID09IG51bGwgfHwgY29tbWVudFRleHQgPT0gbnVsbCkgY29udGludWU7XFxuICAgICAgICBsZXQgcGFyYW1zID0gcGFyYW1UZXh0LnNwbGl0KFxcXCIsXFxcIik7XFxuICAgICAgICBsZXQgcGFyYW1zVCA9IFtdO1xcbiAgICAgICAgZm9yIChsZXQgaSBpbiBwYXJhbXMpIHtcXG4gICAgICAgICAgICAvKmlmIChpID09IDApIHtcXG4gICAgICAgICAgICAgICAgcGFyYW1zVC5wdXNoKHBhcnNlSW50KHBhcmFtc1tpXSkpO1xcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICB9Ki9cXG4gICAgICAgICAgICBpZiAoaSA9PSAyKSB7XFxuICAgICAgICAgICAgICAgIHBhcmFtc1QucHVzaChcXFwiMjVcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKGkgPT0gMykge1xcbiAgICAgICAgICAgICAgICAvL+minOiJsuWAvOS4ujDml7bvvIzpu5jorqTorr7nva7kuLrnmb3oibJcXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtc1tpXSA9PSBcXFwiMFxcXCIgfHwgcGFyYW1zW2ldID09IFxcXCItMVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1QucHVzaChcXFwiMTY3NzcyMTVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHBhcmFtc1QucHVzaChwYXJhbXNbaV0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgcGFyYW1zVC5wdXNoKFxcXCIwXFxcIik7XFxuICAgICAgICBsZXQgdGltZXM9cGFyc2VJbnQocGFyYW1zWzBdLzYwKStcXFwiOlxcXCIrcGFyc2VJbnQocGFyYW1zWzBdJTYwKTtcXG4gICAgICAgIGRNY29udGV4dCArPSBgPGQgcD1cXFwiJHtwYXJhbXNULmpvaW4oJywnKX1cXFwiPiR7ZW5jb2RlSHRtbChjb21tZW50VGV4dCkrXFxcIiNcXFwiK3RpbWVzfTwvZD5cXFxcbmA7XFxuICAgIH1cXG4gICAgaWYgKCFkTWNvbnRleHQpIHJldHVybjtcXG4gICAgZE1jb250ZXh0ID0gYDw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCIgZW5jb2Rpbmc9XFxcIlVURi04XFxcIj8+PGk+XFxcXG4ke2RNY29udGV4dH08L2k+YDtcXG4gICAgbGV0IHBhdGggPSBzZXZlUGF0aCArIG5hbWUucmVwbGFjZSgvXFxcXC8vZywgXFxcIl9cXFwiKSArIFxcXCJfXFxcIiArIGVwaXNvZGVJZCArIFxcXCIueG1sXFxcIjtcXG4gICAgd3JpdGVGaWxlKHBhdGgsIGRNY29udGV4dCk7XFxuICAgIHJldHVybiBwYXRoO1xcbn1cXG4kLmV4cG9ydHMuZ2V0TG9jYWxEYW5NdSA9IGZ1bmN0aW9uKGVwaXNvZGVJZCwgbmFtZSkge1xcbiAgICBsZXQgcGF0aCA9IHNldmVQYXRoICsgbmFtZS5yZXBsYWNlKC9cXFxcLy9nLCBcXFwiX1xcXCIpICsgXFxcIl9cXFwiICsgZXBpc29kZUlkICsgXFxcIi54bWxcXFwiO1xcbiAgICBpZiAoZmlsZUV4aXN0KHBhdGgpKSB7XFxuICAgICAgICByZXR1cm4gcGF0aDtcXG4gICAgfVxcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW8ueW5leaQnOe0oibliqDovb1cIixcInBhdGhcIjpcImxvYWREbVwiLFwicnVsZVwiOlwianM6XFxubGV0IGQgPSBbXTtcXG5sZXQgb25seURvd25sb2FkID0gISFNWV9QQVJBTVMub25seURvd25sb2FkO1xcbmlmIChvbmx5RG93bmxvYWQpIHtcXG4gICAgYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgIH0pO1xcbn1cXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxuICAgIHRpdGxlOiBcXFwiPGZvbnQgY29sb3I9J0dyYXknPuKdl+WFs+S6jjxicj48c21hbGw+IOWGhee9ruaQnOe0olDmlbDmja7mnaXmupDkuo5b5by55by5cGxheV08L3NtYWxsPjwvZm9udD5cXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbn0pO1xcbmxldCBrZXkgPSBNWV9QQVJBTVMubmFtZSB8fCBnZXRNeVZhcihcXFwic1xcXCIpIHx8IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwidGl0bGVcXFwiLCBcXFwiXFxcIikpIHx8IFxcXCJcXFwiO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5YaF572u5pCc57SiUFxcXCIsXFxuICAgIHVybDogJChrZXksIFxcXCLor7fmkJzntKLnlarliaflkI3np7BcXFwiKS5pbnB1dCgoTVlfUEFSQU1TKSA9PiB7XFxuICAgICAgICBzZXRQYWdlUGFyYW1zKE9iamVjdC5hc3NpZ24oTVlfUEFSQU1TLCB7XFxuICAgICAgICAgICAgbmFtZTogaW5wdXQsXFxuICAgICAgICB9KSk7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICB9LCBNWV9QQVJBTVMpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWGhee9ruaQnOe0olRcXFwiLFxcbiAgICB1cmw6ICQoa2V5LCBcXFwi5qC85byP77ya5pCc57Si5YWz6ZSu6K+NW+Wbnui9pl3pm4bmlbBcXFwiKS5pbnB1dCgob25seURvd25sb2FkKSA9PiB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHNob3dMb2FkaW5nKFxcXCLmraPlnKjmkJzntKLlubbkuIvovb0uLi5cXFwiKTtcXG4gICAgICAgICAgICBsZXQgW25hbWUsIHBvc10gPSBpbnB1dC5zcGxpdChcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgICAgICBpZiAoIW5hbWUgfHwgIXBvcykge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBcXFwi5qC85byP6ZSZ6K+vXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHVybEluZm8gPSBmZXRjaChidWlsZFVybChcXFwiaHR0cHM6Ly9henVyZS5sZXVzZS50b3Avc2VhcmNoZG1cXFwiLCB7XFxuICAgICAgICAgICAgICAgIHBhcmFtczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiBuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBvc1xcXCI6IHBvc1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgIHVybEluZm8gPSBKU09OLnBhcnNlKHVybEluZm8pO1xcbiAgICAgICAgICAgIGlmICghdXJsSW5mby51cmwpIHRocm93IFxcXCLmmoLml7bmsqHmnInmib7liLDor6Xop4bpopHnmoTlvLnluZVcXFwiO1xcbiAgICAgICAgICAgIGxldCB4bWwgPSBmZXRjaChidWlsZFVybChcXFwiaHR0cHM6Ly9henVyZS5sZXVzZS50b3AvZGFubXVcXFwiLCB7XFxuICAgICAgICAgICAgICAgIHBhcmFtczogdXJsSW5mb1xcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgIGlmICgheG1sKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IFxcXCLov5jmsqHmnInlvLnluZXlk59+XFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9jYWNoZS9kYW5tdS9cXFwiICsgdXJsSW5mby5wbGF0Zm9ybSArIFxcXCJfXFxcIiArIG5hbWUgKyBcXFwiX1xcXCIgKyBwb3MgKyBcXFwiLnhtbFxcXCI7XFxuICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGgsICc8P3htbCB2ZXJzaW9uPVxcXCIxLjBcXFwiIGVuY29kaW5nPVxcXCJVVEYtOFxcXCI/PlxcXFxuJyArIHhtbCk7XFxuICAgICAgICAgICAgaWYgKG9ubHlEb3dubG9hZCkgcmV0dXJuIFxcXCJ0b2FzdDovL+S4i+i9veWujOaIkFxcXCI7XFxuICAgICAgICAgICAgcmVmcmVzaFZpZGVvVXJsKHtcXG4gICAgICAgICAgICAgICAgZGFubXU6IHBhdGhcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yqg6L295a6M5oiQXFxcIjtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgZS50b1N0cmluZygpO1xcbiAgICAgICAgfVxcbiAgICB9LCBvbmx5RG93bmxvYWQpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcImRt55uS5a2Q5pCc57SiXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChrZXksIG9ubHlEb3dubG9hZCkgPT4ge1xcbiAgICAgICAgbGV0IGRtID0gZ2V0VmFyKFxcXCJkbV9zaGFyZVxcXCIpO1xcbiAgICAgICAgaWYgKGRtICYmICFvbmx5RG93bmxvYWQpIHtcXG4gICAgICAgICAgICBjbGVhclZhcihcXFwiZG1fc2hhcmVcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoVmlkZW9Vcmwoe1xcbiAgICAgICAgICAgICAgICBkYW5tdTogZG1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yqg6L295a6M5oiQXFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuICQoa2V5LCBcXFwiZG3nm5LlrZDmkJzntKJcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLkuIvovb3lrozmiJDlvLnluZXlkI7or7fph43mlrDngrnlh7vmkJzntKJcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3NlYXJjaD9ydWxlPWRt55uS5a2QJnM9XFxcIiArIGlucHV0O1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICB9LCBrZXksIG9ubHlEb3dubG9hZCksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbn0pO1xcblxcbmZ1bmN0aW9uIHNlYXJjaChkLCBuYW1lKSB7XFxuICAgIGNvbnN0IGRhbm11ID0gJC5yZXF1aXJlKFxcXCJkYW5tdVxcXCIpO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIlxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiXFxuICAgIH0pO1xcbiAgICBsZXQgZG1MaXN0ID0gZGFubXUuZ2V0RGFuTXUobmFtZSk7XFxuXFxuICAgIGZvciAobGV0IGFuaW1lIG9mIGRtTGlzdC5hbmltZXMpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGFuaW1lLmFuaW1lVGl0bGUsXFxuICAgICAgICAgICAgZGVzYzogYW5pbWUudHlwZURlc2NyaXB0aW9uLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIlxcXCIsIFxcXCLor7fovpPlhaXkuIvovb3ojIPlm7QoMSxcXFwiICsgYW5pbWUuZXBpc29kZXMubGVuZ3RoICsgXFxcIilcXFwiKS5pbnB1dCgoYW5pbWVUaXRsZSwgZXBpc29kZXMpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IFthLCBiXSA9IGlucHV0LnNwbGl0KC8sfO+8jC8pO1xcbiAgICAgICAgICAgICAgICBhID0gTnVtYmVyKGEpLCBiID0gTnVtYmVyKGIpO1xcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGEpIHx8IE51bWJlci5pc05hTihiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+aMieagvOW8j+i+k+WFpeaVsOWtl1xcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKGEgPCAxIHx8IGIgPiBlcGlzb2Rlcy5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/or7fovpPlhaXop4TlrprojIPlm7TlhoXnmoTmlbDlrZdcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGNvbnN0IGRhbm11ID0gJC5yZXF1aXJlKFxcXCJkYW5tdVxcXCIpO1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGEgLSAxLCBqID0gMTsgaSA8IGI7IGkrKywgaisrKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVwaXNvZGUgPSBlcGlzb2Rlc1tpXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG1UaXRsZSA9IGFuaW1lVGl0bGUgKyBcXFwiX1xcXCIgKyBlcGlzb2RlLmVwaXNvZGVUaXRsZTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo5LiL6L2977yaXFxcIiArIGVwaXNvZGUuZXBpc29kZVRpdGxlICsgXFxcIlxcXFx0KFxcXCIgKyBqICsgXFxcIi9cXFwiICsgKGIgLSBhICsgMSkgKyBcXFwiKVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhbm11LmRvd25sb2FkRGFuTXUoZXBpc29kZS5lcGlzb2RlSWQsIGRtVGl0bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5ZOm5ZOm5LiL6L295aSx6LSlLi4uXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiL6L295a6M5oiQXFxcIjtcXG4gICAgICAgICAgICB9LCBhbmltZS5hbmltZVRpdGxlLCBhbmltZS5lcGlzb2RlcyksXFxuICAgICAgICAgICAgcGljX3VybDogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vbW92aWUvMTQuc3ZnXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZm9yIChsZXQgZXBpc29kZSBvZiBhbmltZS5lcGlzb2Rlcykge1xcbiAgICAgICAgICAgIGxldCBkbVRpdGxlID0gYW5pbWUuYW5pbWVUaXRsZSArIFxcXCJfXFxcIiArIGVwaXNvZGUuZXBpc29kZVRpdGxlO1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBlcGlzb2RlLmVwaXNvZGVUaXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKGVwaXNvZGUuZXBpc29kZUlkKS5sYXp5UnVsZSgodXJsLCB0aXRsZSwgb25seURvd25sb2FkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYW5tdSA9ICQucmVxdWlyZShcXFwiZGFubXVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gZGFubXUuZ2V0TG9jYWxEYW5NdShpbnB1dCwgdGl0bGUpIHx8IGRhbm11LmRvd25sb2FkRGFuTXUoaW5wdXQsIHRpdGxlKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbmx5RG93bmxvYWQpIHJldHVybiBcXFwidG9hc3Q6Ly/kuIvovb3lrozmiJBcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhbm11VGV4dCA9IGZldGNoKHBhdGgpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYW5tdVRleHQpIHJldHVybiBcXFwidG9hc3Q6Ly/ov5jmsqHmnInlvLnluZXlk59+XFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hWaWRlb1VybCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZGFubXU6IHBhdGhcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yqg6L295a6M5oiQXFxcIjtcXG4gICAgICAgICAgICAgICAgfSwgTVlfUEFSQU1TLmR1cmwsIGRtVGl0bGUsIG9ubHlEb3dubG9hZCksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIuW8uuWItuS4i+i9vVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGVwaXNvZGVUaXRsZSwgZXBpc29kZUlkKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dMb2FkaW5nKFxcXCLor7fnrYnlvoVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGFubXUgPSAkLnJlcXVpcmUoXFxcImRhbm11XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbm11LmRvd25sb2FkRGFuTXUoZXBpc29kZUlkLCBlcGlzb2RlVGl0bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6YeN5paw5LiL6L295a6M5oiQ77yM5Y2V5Ye75oyC6L2944CCXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBkbVRpdGxlLCBlcGlzb2RlLmVwaXNvZGVJZClcXG4gICAgICAgICAgICAgICAgICAgIH1dXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgaWYgKCFkbUxpc3QuYW5pbWVzLmxlbmd0aCkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuayoeacieaJvuWIsOS4jltcXFwiICsgbmFtZSArIFxcXCJd55u45YWz55qE5by55bmVXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBkZXNjOiBcXFwi5pCc5LiN5Yiw5oCO5LmI5Yqe77yfXFxcXG7mo4Dmn6XlkI3np7DmmK/lkKbmraPnoa7vvJvlj6/ku6XlsJ3or5XliKDpmaTpg6jliIbpmZDlrpror43vvIzlpoLnrKzkuIDlraPnrYnvvJvogIzkuJTlj6rog73mkJzntKLnlarliaflk6bvvIHlhbbku5blvLnluZXlj6/nlKhkbeebkuWtkOOAglxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxubGV0IG5hbWUgPSBnZXRQYXJhbShcXFwibmFtZVxcXCIsIE1ZX1BBUkFNUy5uYW1lKTtcXG5pZiAobmFtZSkge1xcbiAgICB0cnkge1xcbiAgICAgICAgc2VhcmNoKGQsIG5hbWUpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCc4oCcRVJST1LigJ3igJ1cXFwiLFxcbiAgICAgICAgICAgIGRlc2M6IGUudG9TdHJpbmcoKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWFrOW8gOW3peWFt1wiLFwicGF0aFwiOlwiYWxpVXRpbFwiLFwicnVsZVwiOlwiLy/mj5Dkvpvnu5nop4TliJnkvb/nlKjnmoTluLjnlKjlh73mlbBcXG4kLmV4cG9ydHMgPSB7XFxuICAgIGNoZWNrYWxpKHJlYWx1cmwpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgaWYgKHJlYWx1cmwuaW5jbHVkZXMoXFxcImNvbS9zL1xcXCIpICYmIHJlYWx1cmwgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHNoYXJlSWQgPSByZWFsdXJsLnNwbGl0KFxcXCI/XFxcIilbMF0uc3BsaXQoXFxcIi9cXFwiKVs0XTtcXG4gICAgICAgICAgICAgICAgbGV0IHNoYXJlID0gZmV0Y2goXFxcImh0dHBzOi8vYXBpLmFsaXl1bmRyaXZlLmNvbS9hZHJpdmUvdjMvc2hhcmVfbGluay9nZXRfc2hhcmVfYnlfYW5vbnltb3VzXFxcIiwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBQQ19VQSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwic2hhcmVfaWRcXFwiOiBzaGFyZUlkXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIGlmIChzaGFyZS5pbmNsdWRlcyhcXFwic2hhcmVfbGluayBpc1xcXCIpIHx8IHNoYXJlLmluY2x1ZGVzKFxcXCJzaGFyZV9saW5rIGNhbm5vdFxcXCIpKSByZXR1cm4gZmFsc2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICB9LFxcbiAgICBieXRlc1RvU2l6ZShzaXplKSB7XFxuICAgICAgICBpZiAoIXNpemUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJzAnO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcXG4gICAgICAgIGxldCBpID0gMDtcXG4gICAgICAgIHdoaWxlIChzaXplID49IDEwMjQpIHtcXG4gICAgICAgICAgICBzaXplIC89IDEwMjQ7XFxuICAgICAgICAgICAgaSsrO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2l6ZSA9IGkgPyBOdW1iZXIoc2l6ZS50b0ZpeGVkKDIpKSA6IHNpemU7XFxuICAgICAgICByZXR1cm4gYCR7c2l6ZX0gJHt1bml0c1tpXX1gO1xcbiAgICB9LFxcbiAgICBnZXRDcnlwdG9KUygpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgQ3J5cHRvSlMgPT09IFxcXCJ1bmRlZmluZWRcXFwiKSB7XFxuICAgICAgICAgICAgZXZhbChnZXRDcnlwdG9KUygpKTtcXG4gICAgICAgICAgICByZXR1cm4gQ3J5cHRvSlM7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gQ3J5cHRvSlM7XFxuICAgIH0sXFxuICAgIG1hdGNoQWxpVXJsKHRleHQsIGlzRykge1xcbiAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiYWxpdGVzdFxcXCIpLm1hdGNoQWxpVXJsKHRleHQsIGlzRyk7XFxuICAgIH0sXFxuICAgIGdldElQdjRBZGRyZXNzKCkge1xcbiAgICAgICAgY29uc3QgTmV0d29ya0ludGVyZmFjZSA9IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGZvciAobGV0IGVuID0gTmV0d29ya0ludGVyZmFjZS5nZXROZXR3b3JrSW50ZXJmYWNlcygpOyBlbi5oYXNNb3JlRWxlbWVudHMoKTspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGludGYgPSBlbi5uZXh0RWxlbWVudCgpO1xcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBlbnVtSXBBZGRyID0gaW50Zi5nZXRJbmV0QWRkcmVzc2VzKCk7IGVudW1JcEFkZHIuaGFzTW9yZUVsZW1lbnRzKCk7KSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5ldEFkZHJlc3MgPSBlbnVtSXBBZGRyLm5leHRFbGVtZW50KCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWluZXRBZGRyZXNzLmlzTG9vcGJhY2tBZGRyZXNzKCkgJiYgaW5ldEFkZHJlc3MgaW5zdGFuY2VvZiBqYXZhLm5ldC5JbmV0NEFkZHJlc3MpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGluZXRBZGRyZXNzLmdldEhvc3RBZGRyZXNzKCkpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcXG4gICAgICAgICAgICBsb2coZXgudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcIjAuMC4wLjBcXFwiO1xcbiAgICB9XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5by55bmV5om56YeP5oyC6L29XCIsXCJwYXRoXCI6XCJkbU1vdW50XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZCA9IFtdO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4gY2xlYXJNeVZhcihcXFwiZGxsYXN0VGltZVxcXCIpKTtcXG5zZXRQYWdlVGl0bGUoXFxcIuW8ueW5leaMgui9vTpcXFwiKyhNWV9QQVJBTVMuZm9sZGVyTmFtZXx8XFxcIj9cXFwiKSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmuIXnqbrmjILovb3liJfooahcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwiZG1saXN0XFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbn0pO1xcbmlmKCFNWV9QQVJBTVMuYXV0b21hdGljYWRkKXtcXG4gICAgTVlfUEFSQU1TLmF1dG9tYXRpY2FkZCA9IGdldEl0ZW0oXFxcImF1dG9tYXRpY2FkZFxcXCIsXFxcIjFcXFwiKTtcXG4gICAgc2V0UGFnZVBhcmFtcyhNWV9QQVJBTVMpO1xcbn1cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuajgOa1i+aWsOWinjpcXFwiK1tcXFwi5YWz6ZetXFxcIixcXFwi5byA5ZCvXFxcIl1bTVlfUEFSQU1TLmF1dG9tYXRpY2FkZHx8XFxcIjBcXFwiXSxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCh2KSA9PiB7XFxuICAgICAgIHNldEl0ZW0oXFxcImF1dG9tYXRpY2FkZFxcXCIsIHYuYXV0b21hdGljYWRkPT09XFxcIjFcXFwiP1xcXCIwXFxcIjpcXFwiMVxcXCIpO1xcbiAgICAgICB2LmF1dG9tYXRpY2FkZCA9IHVuZGVmaW5lZDtcXG4gICAgICAgc2V0UGFnZVBhcmFtcyh2KTtcXG4gICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCBNWV9QQVJBTVMpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLkuIvovb3lvLnluZVcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9sb2FkRG0jbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9ubHlEb3dubG9hZDogdHJ1ZSxcXG4gICAgICAgIG5hbWU6IE1ZX1BBUkFNUy5uYW1lfHxkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcIm5hbWVcXFwiLFxcXCJcXFwiKSlcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi5bey5oyC6L29XFxcIi5iaWcoKSxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIGxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZG1saXN0XFxcIiwgW10pO1xcbiAgICAgICAgbGV0IEZpbGVTb3J0aW5nID0gJC5yZXF1aXJlKFxcXCJGaWxlU29ydGluZ1xcXCIpO1xcbiAgICAgICAgZG1saXN0LnNvcnQoKGEsIGIpID0+IEZpbGVTb3J0aW5nLm5hbWVDb21wYXJlKGEsIGIpKTtcXG4gICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJkbWxpc3RcXFwiLCBkbWxpc3QpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aOkuW6j+WujOaIkFxcXCI7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxufSk7XFxubGV0IGZpbGUgPSAkLnJlcXVpcmUoXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS93ZWlzeXIvanMvZmlsZS5qcz92PTFcXFwiKTtcXG5sZXQgZG1saXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImRtbGlzdFxcXCIsIFtdKTtcXG5cXG5mb3IgKGxldCBpID0gMDsgaSA8IGRtbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICBsZXQgZG1uYW1lID0gZG1saXN0W2ldO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCJbXFxcIiArIChpICsgMSkgKyBcXFwiXVxcXFx0XFxcIiArIGRtbmFtZSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBkbWxpc3QgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiZG1saXN0XFxcIiwgW10pO1xcbiAgICAgICAgICAgIGRtbGlzdC5zcGxpY2UoaSwgMSk7XFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImRtbGlzdFxcXCIsIGRtbGlzdCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBpKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbiAgICB9KTtcXG59XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCLmnKzlnLDmnKrmjILovb1cXFwiLmJpZygpLFxcbiAgICB1cmw6ICQoXFxcIuaYr+WQpua4hemZpOaJgOacieacrOWcsOW8ueW5leaWh+S7tj9cXFxcbijlvLnluZXmlofku7bmr4/kuInlpKnkvJroh6rliqjmuIXpmaQpXFxcIikuY29uZmlybSgoKSA9PiB7XFxuICAgICAgICBsZXQgZmlsZSA9ICQucmVxdWlyZShcXFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3dlaXN5ci9qcy9maWxlLmpzP3Y9MVxcXCIpO1xcbiAgICAgICAgZmlsZS5kZWxldGVGaWxlcyhnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL2Rhbm11L1xcXCIpLnNsaWNlKDcpKTtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcImRtbGlzdFxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suWIoOmZpFxcXCI7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxufSk7XFxubGV0IGRtTGlzdFBhdGggPSBnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL2Rhbm11L1xcXCIpLnNsaWNlKDcpO1xcbmxldCBmaWxlTGlzdCA9IGZpbGUuZ2V0RmlsZVBhdGgoZG1MaXN0UGF0aCwgXFxcImZpbGVcXFwiLCBcXFwiLnhtbFxcXCIpO1xcbmxldCBsYXN0VGltZSA9IDA7XFxuXFxuZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlTGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICBsZXQgZG1maWxlID0gZmlsZUxpc3RbaV07XFxuICAgIGxhc3RUaW1lID0gTWF0aC5tYXgobGFzdFRpbWUsIGRtZmlsZS5sYXN0TW9kaWZpZWQpO1xcbiAgICBpZiAoZG1saXN0LmluY2x1ZGVzKGRtZmlsZS5uYW1lKSkgY29udGludWU7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogZG1maWxlLm5hbWUsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKG5hbWUpID0+IHtcXG4gICAgICAgICAgICBsZXQgZG1saXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImRtbGlzdFxcXCIsIFtdKTtcXG4gICAgICAgICAgICBpZiAoIWRtbGlzdC5pbmNsdWRlcyhuYW1lKSkge1xcbiAgICAgICAgICAgICAgICBkbWxpc3QucHVzaChuYW1lKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImRtbGlzdFxcXCIsIGRtbGlzdCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBkbWZpbGUubmFtZSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCJcXG4gICAgfSk7XFxufVxcbmxldCBsYXN0UmVjb3JkID0gTnVtYmVyKGdldE15VmFyKFxcXCJkbGxhc3RUaW1lXFxcIiwgXFxcIi0xXFxcIikpO1xcblxcbmlmIChNWV9QQVJBTVMuYXV0b21hdGljYWRkPT09XFxcIjFcXFwiJiZsYXN0UmVjb3JkIT0tMSYmbGFzdFJlY29yZCA8IGxhc3RUaW1lKSB7XFxuICAgIGNvbmZpcm0oe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmlrDlvLnluZXmlofku7ZcXFwiLFxcbiAgICAgICAgY29udGVudDogXFxcIuajgOafpeWIsOaWsOS4i+i9veeahOW8ueW5leaYr+WQpuWFqOmDqOaMgui9ve+8n1xcXCIsXFxuICAgICAgICBjb25maXJtOiAkLnRvU3RyaW5nKChsYXN0UmVjb3JkLCBkbUxpc3RQYXRoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGZpbGUgPSAkLnJlcXVpcmUoXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS93ZWlzeXIvanMvZmlsZS5qcz92PTFcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZmlsZUxpc3QgPSBmaWxlLmdldEZpbGVQYXRoKGRtTGlzdFBhdGgsIFxcXCJmaWxlXFxcIiwgXFxcIi54bWxcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZG1saXN0ID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImRtbGlzdFxcXCIsIFtdKTtcXG4gICAgICAgICAgICBmaWxlTGlzdC5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgICAgICBpZiAoIWRtbGlzdC5pbmNsdWRlcyh2Lm5hbWUpJiZ2Lmxhc3RNb2RpZmllZCA+IGxhc3RSZWNvcmQpIHtcXG4gICAgICAgICAgICAgICAgICAgIGRtbGlzdC5wdXNoKHYubmFtZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwiZG1saXN0XFxcIiwgZG1saXN0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aMgui9veaIkOWKn+OAglxcXCI7XFxuICAgICAgICB9LCBsYXN0UmVjb3JkLCBkbUxpc3RQYXRoKSxcXG4gICAgfSk7XFxufVxcbmlmKGxhc3RUaW1lPj0wKXtcXG4gICAgcHV0TXlWYXIoXFxcImRsbGFzdFRpbWVcXFwiLCBcXFwiXFxcIiArIGxhc3RUaW1lKTtcXG59XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Li76aG15aSE55CGXCIsXCJwYXRoXCI6XCJNYWluXCIsXCJydWxlXCI6XCJpZiAoZ2V0SXRlbShcXFwiZmlyc3RcXFwiKSA9PSBNWV9SVUxFLnZlcnNpb24pIHtcXG4gICAgJC5yZXF1aXJlKFxcXCJzb3VcXFwiKTtcXG59IGVsc2UgaWYgKE1ZX1BBR0UgPT09IDEpIHtcXG4gICAgbGV0IGQgPSBbXVxcbiAgICBsZXQgdGltZSA9IGdldEl0ZW0oXFxcImZpcnN0XFxcIiwgXFxcIlxcXCIpID8gNiA6IDIwO1xcbiAgICBsZXQgaWQgPSBEYXRlLm5vdygpO1xcbiAgICBsZXQgc3ViUGFzcyA9IFxcXCLmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrlkIjpm4bop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/peS6keebmOWQmy7nroBAQGh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY1OTEmZGVidWc9dHJ1ZVxcXCI7XFxuICAgIGxldCBjb250ZW50ID0gYFxcbiAgICAxLiDmnKzlsI/nqIvluo/miYDmnInku6PnoIHlhajpg6jlvIDmupDvvIzkuJTmnKzop4TliJnkuLrlrabkuaDnm67nmoTvvIzor7fkuo7lr7zlhaUyNOWwj+aXtuWGheWIoOmZpO+8ge+8ge+8gVxcbiAgICAyLiDmnKzlsI/nqIvluo88Yj7lrozlhajlhY3otLk8L2I+77yM5aaC5p6c5L2g5piv5LuY6LS56LSt5Lmw55qE5oGt5Zac5L2g6KKr6aqX5LqG44CCXFxuICAgIOW9k+eEtuWmguaenOacieiDveWKm+aDs+m8k+WKseS9nOiAheeahOWPr+S7pSR7XFxcIuaUr+aMgeS4gOS4i1xcXCIubGluayhcXFwiaGlrZXI6Ly9wYWdlL0RvbmF0ZS52I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIpfTwvYT4oPHNtYWxsPueCueWHu+WPr+i/m+WFpeaNkOi1oO+8jOWPr+WcqOS4u+mhteiPnOWNlei/m+WFpTwvc21hbGw+KeOAglxcbiAgICAzLiDmnKzlsI/nqIvluo/mmK/lnKjljp/niYjjgIzkupHnm5jlkJvjgI3nmoTln7rnoYDov5vooYznmoTkuozmrKHkv67mlLnvvIzor7fmlK/mjIHljp/niYjjgIJcXG4gICAgNC4g6K+344CM5LqR55uY5ZCbLueugOOAjeeahOS6jOasoeS/ruaUueWwiumHjeS4gOS4i+WOn+eJiO+8jOiwouiwouOAglxcbiAgICBcXG4gICAgPGI+5byA5aeL5L2/55So5pys6KeE5YiZ5Y2z5Luj6KGo6YG15a6I6KeE5YiZ5p2h5L6LPC9iPlxcbiAgICDlvZPliY3niYjmnKzvvJoke01ZX1JVTEUudmVyc2lvbn1cXG4gICAg5aaC5p6c5L2g5oOz5L+d5oyB5pyA5paw54mI6K+3JHtcXFwi6K6i6ZiF5q2k6KeE5YiZXFxcIi5saW5rKFxcXCJydWxlOi8vXFxcIiArIGJhc2U2NEVuY29kZShzdWJQYXNzKSl9XFxuICAgIGA7XFxuICAgIGxldCB1cGRhdGVJbmZvID0gXFxcIuS8mOWMlumDqOWIhuaTjeS9nFxcXCI7XFxuICAgIFxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ08c3Ryb25nPuS9v+eUqOWJjemhu+efpTwvc3Ryb25nPlxcXCIuYmlnKCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBjb250ZW50LnRyaW0oKS5yZXBsYWNlKC9cXFxcblxcXFxzKj8vZywgXFxcIjxicj5cXFwiKSxcXG4gICAgICAgIFxcXCJjb2xfdHlwZVxcXCI6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0sIHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG4gICAgfSwge1xcbiAgICAgICAgdGl0bGU6IHRpbWUgKyBcXFwi56eS5ZCO57un57utXFxcIixcXG4gICAgICAgIHVybDogXFxcInRvYXN0Oi8v6K+36K6k55yf6ZiF6K+75Lul5LiK5YaF5a65XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGlkOiBpZCArIFxcXCJ0aW1lclxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGlmICh1cGRhdGVJbmZvKSB7XFxuICAgICAgICBjb25maXJtKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuabtOaWsOWGheWuuVxcXCIsXFxuICAgICAgICAgICAgY29udGVudDogdXBkYXRlSW5mbyxcXG4gICAgICAgICAgICBjb25maXJtKCl7fSxcXG4gICAgICAgICAgICBjYW5jZWwoKXt9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBzZXRSZXN1bHQoZCk7XFxuICAgIHdoaWxlICh0aW1lICE9IDApIHtcXG4gICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoMTAwMCk7XFxuICAgICAgICB0aW1lIC09IDE7XFxuICAgICAgICB1cGRhdGVJdGVtKGlkICsgXFxcInRpbWVyXFxcIiwge1xcbiAgICAgICAgICAgIHRpdGxlOiB0aW1lICsgXFxcIuenkuWQjue7p+e7rVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIHVwZGF0ZUl0ZW0oaWQgKyBcXFwidGltZXJcXFwiLCB7XFxuICAgICAgICB0aXRsZTogXFxcIuKAnOKAnOaIkeWQjOaEj+S7peS4iuimgeaxguKAneKAnVxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHYpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJmaXJzdFxcXCIsIFN0cmluZyh2KSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oSf6LCi5oKo55qE55CG6KejXFxcIjtcXG4gICAgICAgIH0sIE1ZX1JVTEUudmVyc2lvbiksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxuICAgIH0pO1xcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuaNkOi1oFwiLFwicGF0aFwiOlwiRG9uYXRlLnZcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkID0gW107XFxuc2V0UGFnZVRpdGxlKFxcXCLmjZDotaAv5pSv5oyBXFxcIik7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmjZDotaAv5pSv5oyBXFxcIixcXG4gICAgZGVzYzogXFxcIui/meS4quaNkOi1oOS4jeiDveS4uuS9oOW4puadpeeJueadg++8jOS9huaCqOeahOaUr+aMgeaYr+aIkeabtOaWsOWIm+S9nOeahOWKqOWKm+OAglxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogXFxcInRvYXN0Oi8v5oSf6LCi5oKo55qE5pSv5oyBXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwicGljXzFfZnVsbFxcXCIsXFxuICAgIHVybDogXFxcImh0dHBzOi8vZ2l0ZWUuY29tL0xveURnSWsvTG95RGdJa19SdWxlL3Jhdy9tYXN0ZXIvNjdkOGYwMTg3ZjAxODZjMS5wbmdcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9naXRlZS5jb20vTG95RGdJay9Mb3lEZ0lrX1J1bGUvcmF3L21hc3Rlci82N2Q4ZjAxODdmMDE4NmMxLnBuZ1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwi5Zu+54mH5Yqg6L2957yT5oWi6K+356iN562JXFxcIi5zbWFsbCgpLmZvbnRjb2xvcihcXFwiR3JheVxcXCIpLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiVFZCT1jmjqjpgIFcIixcInBhdGhcIjpcInR2Ym94UHVzaFwiLFwicnVsZVwiOlwianM6XFxuKGZ1bmN0aW9uKCkge1xcbiAgICBsZXQgZCA9IFtdO1xcbiAgICBjb25zdCB7XFxuICAgICAgICBwYWdlSWQsXFxuICAgICAgICBzaGFyZUlkLFxcbiAgICAgICAgZm9sZGVyTmFtZSxcXG4gICAgICAgIGZpbGVJZFxcbiAgICB9ID0gTVlfUEFSQU1TO1xcbiAgICBzZXRQYWdlVGl0bGUoXFxcIlRWQk9Y5o6o6YCBOlxcXCIgKyBmb2xkZXJOYW1lKTtcXG4gICAgY29uc3Qge1xcbiAgICAgICAgYWxpVG9rZW5zRmlsZXBhdGhcXG4gICAgfSA9ICQucmVxdWlyZShcXFwidG9rZW5QYXRoXFxcIik7XFxuICAgIGxldCByZWZyZXNoVG9rZW4gPSBcXFwiXFxcIjtcXG4gICAgaWYgKCFmaWxlRXhpc3QoYWxpVG9rZW5zRmlsZXBhdGgpKSB7XFxuICAgICAgICB0b2FzdChcXFwi6K+35YWI55m76ZmG55m75b2V6LSm5Y+3XFxcIik7XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIHJldHVybjtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJlZnJlc2hUb2tlbiA9ICQucmVxdWlyZShhbGlUb2tlbnNGaWxlcGF0aCkucmVmcmVzaF90b2tlbjtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBnZXRQdXNoKG5hbWUsIHVybCkge1xcbiAgICAgICAgbGV0IHB1c2ggPSB7XFxuICAgICAgICAgICAgXFxcInNoYXJlX2lkXFxcIjogc2hhcmVJZCxcXG4gICAgICAgICAgICBcXFwicmVmcmVzaF90b2tlblxcXCI6IHJlZnJlc2hUb2tlbixcXG4gICAgICAgICAgICBcXFwibmFtZVxcXCI6IG5hbWUsXFxuICAgICAgICAgICAgXFxcInVybFxcXCI6IHVybFxcbiAgICAgICAgfTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3B1c2gjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP3J1bGU9WFlR5o6o6YCBJnB1c2h1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShwdXNoKSk7XFxuICAgIH1cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5o6o6YCB6Zi/6YeM5YiG5Lqr6ZO+5o6lXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9wdXNoI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9ydWxlPVhZUeaOqOmAgSZwdXNodXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoXFxcImh0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zL1xcXCIgKyBzaGFyZUlkICsgKGZpbGVJZCA/IFxcXCIvZm9sZGVyL1xcXCIgKyBmaWxlSWQgOiBcXFwiXFxcIikpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpbmhlcml0VGl0bGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsZXQgYWxsID0ge1xcbiAgICAgICAgdGl0bGU6IFxcXCLmjqjpgIHlhajpg6jlt7LliqDovb3op4bpopFcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGluaGVyaXRUaXRsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBkLnB1c2goYWxsKTtcXG4gICAgbGV0IGFsbFVybHMgPSBbXTtcXG4gICAgbGV0IGxpc3QgPSBmaW5kSXRlbXNCeUNscyhcXFwidlxcXCIgKyBwYWdlSWQpO1xcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkgfHwgbGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIC8qdG9hc3QoXFxcIui/mOayoeacieWKoOi9veWujOaIkOeahOinhumikVxcXCIpO1xcbiAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICByZXR1cm47Ki9cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgXFxcIn5+fui/mOacqOacieinhumikeWTpn5+flxcXCIuZm9udGNvbG9yKFxcXCJncmV5XFxcIiksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGFsbC51cmwgPSBcXFwidG9hc3Q6Ly/msqHmnInop4bpopHml6Dms5XmjqjpgIFcXFwiO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgbGlzdC5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgIHYuY29sX3R5cGUgPSB2LnR5cGU7XFxuICAgICAgICAgICAgbGV0IG5hbWUgPSB2LmV4dHJhLnBhZ2VUaXRsZTtcXG4gICAgICAgICAgICBsZXQgdXJsID0gbmFtZS5yZXBsYWNlKC9cXFxcIy9nLCAnXycpLnJlcGxhY2UoL1xcXFwkL2csICdfJykgKyBcXFwiJHZpZGVvfFxcXCIgKyB2LmV4dHJhLmlkO1xcbiAgICAgICAgICAgIGFsbFVybHMucHVzaCh1cmwpO1xcbiAgICAgICAgICAgIHYudXJsID0gZ2V0UHVzaChuYW1lLCB1cmwpO1xcbiAgICAgICAgICAgIHYuZXh0cmEuY2xzID0gdi5leHRyYS5pZCA9IHVuZGVmaW5lZDtcXG4gICAgICAgICAgICBkLnB1c2godik7XFxuICAgICAgICB9KTtcXG4gICAgICAgIGFsbC51cmwgPSBnZXRQdXNoKGZvbGRlck5hbWUsIGFsbFVybHMuam9pbihcXFwiI1xcXCIpKTtcXG4gICAgfVxcbiAgICBzZXRSZXN1bHQoZCk7XFxufSkoKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWwgemdouaQnOe0olwiLFwicGF0aFwiOlwiZnJvbnRDb3ZlclwiLFwicnVsZVwiOlwianM6XFxubGV0IGQgPSBbXTtcXG5sZXQga2V5ID0gZ2V0TXlWYXIoXFxcImZyb250Y292ZXJrZXlcXFwiLCBcXFwiXFxcIik7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmkJzntKJcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgdXJsOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJmcm9udGNvdmVya2V5XFxcIiwgaW5wdXQudHJpbSgpKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgfSksXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGtleSB8fCBnZXRNeVZhcihcXFwic1xcXCIsIFxcXCJcXFwiKVxcbiAgICB9XFxufSk7XFxuaWYgKGtleSkge1xcbiAgICBsZXQgciA9IHJlcXVlc3QoJ2h0dHBzOi8vbS5kb3ViYW4uY29tL3NlYXJjaC8/cXVlcnk9JyArIGVuY29kZVVSSUNvbXBvbmVudChrZXkpKVxcbiAgICBsZXQgbGlzdCA9IHBkZmEociwgXFxcIi5zZWFyY2gtcmVzdWx0cyYmaW1nXFxcIik7XFxuICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXG4gICAgICAgIGxldCBwaWMgPSBwZGZoKGl0LCBcXFwiaW1nJiZzcmNcXFwiKTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgcGljX3VybDogcGljLFxcbiAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgocGljKSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJmcm9udGNvdmVycGljXFxcIiwgcGljKTtcXG4gICAgICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0sIHBpYyksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJwaWNfMl9jYXJkXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG5cXG59XFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICAgIGxldCBwaWMgPSBnZXRNeVZhcihcXFwiZnJvbnRjb3ZlcnBpY1xcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJmcm9udGNvdmVycGljXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcImZyb250Y292ZXJrZXlcXFwiKTtcXG4gICAgc2V0UGFnZVBpY1VybChwaWMpO1xcbn0pO1xcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhOWImeaWh+S7tlwiLFwicGF0aFwiOlwiY29uZmlnc1wiLFwicnVsZVwiOlwiY29uc3QgcGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0xveURnSWsvYWxpU2ltcGxlUnVsZXMuanNvblxcXCI7XFxubGV0IGRhdGE7XFxuXFxuZnVuY3Rpb24gZ2V0SnNvbigpIHtcXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcXG4gICAgICAgIHJldHVybiBkYXRhO1xcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShyZWFkRmlsZShwYXRoKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgZGVsZXRlRmlsZShwYXRoKTtcXG4gICAgICAgIGRhdGEgPSBbXTtcXG4gICAgfVxcbiAgICByZXR1cm4gZGF0YTtcXG59XFxuXFxuZnVuY3Rpb24gc2F2ZUpzb24oanNvbikge1xcbiAgICBzYXZlRmlsZShwYXRoLCBKU09OLnN0cmluZ2lmeShqc29uKSk7XFxufVxcblxcbmZ1bmN0aW9uIGdldFVzZWZ1bEpzb24oKSB7XFxuICAgIHJldHVybiBnZXRKc29uKCkuZmlsdGVyKHYgPT4gIXYuZm9yYmlkZGVuKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0Rm9yYmlkZGVuSnNvbigpIHtcXG4gICAgcmV0dXJuIGdldEpzb24oKS5maWx0ZXIodiA9PiB2LmZvcmJpZGRlbik7XFxufVxcblxcbmZ1bmN0aW9uIGdldEdyb3VwSnNvbihncm91cCkge1xcbiAgICByZXR1cm4gZ2V0SnNvbigpLmZpbHRlcih2ID0+IHYuZ3JvdXAgPT09IGdyb3VwKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0R3JvdXBOYW1lcygpIHtcXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChnZXRKc29uKCkubWFwKHYgPT4gdi5ncm91cCkpKS5maWx0ZXIodiA9PiB2KTtcXG59XFxuXFxuaWYgKCFmaWxlRXhpc3QocGF0aCkgJiYgTVlfUlVMRSkge1xcbiAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoXFxcInJ1bGVzXFxcIik7XFxuICAgICQuaGlrZXIud2luZG93ID0ge307XFxuICAgIGV2YWwuY2FsbChudWxsLCBmZXRjaCgnaGlrZXI6Ly9hc3NldHMvYmVhdXRpZnkuanMnKSk7XFxuICAgIHJ1bGVzID0gcnVsZXMubWFwKCh2KSA9PiB7XFxuICAgICAgICB2LmZpbmQgPSB3aW5kb3cuanNfYmVhdXRpZnkodi5maW5kLnRvU3RyaW5nKCkucmVwbGFjZSgvZnVuY3Rpb24uKj9cXFxcKHMuKj9wYWdlXFxcXCkuKj9cXFxcey8sIFxcXCJcXFwiKS5yZXBsYWNlKC8oXFxcXH1bXFxcXHNcXFxcU10uKj8pJC8sIFxcXCJcXFwiKSk7XFxuICAgICAgICBpZiAodi5maW5kQWxpVXJsKSB7XFxuICAgICAgICAgICAgdi5maW5kQWxpVXJsID0gd2luZG93LmpzX2JlYXV0aWZ5KHYuZmluZEFsaVVybC50b1N0cmluZygpLnJlcGxhY2UoL2Z1bmN0aW9uLio/XFxcXChpbnB1dFxcXFwpLio/XFxcXHsvLCBcXFwiXFxcIikucmVwbGFjZSgvKFxcXFx9W1xcXFxzXFxcXFNdLio/KSQvLCBcXFwiXFxcIikpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHY7XFxuICAgIH0pO1xcbiAgICBzYXZlSnNvbihydWxlcyk7XFxuICAgIHRvYXN0KFxcXCLlt7LliJ3lp4vljJZcXFwiKTtcXG59XFxuJC5leHBvcnRzID0ge1xcbiAgICBnZXRKc29uLFxcbiAgICBzYXZlSnNvbixcXG4gICAgZ2V0VXNlZnVsSnNvbixcXG4gICAgZ2V0Rm9yYmlkZGVuSnNvbixcXG4gICAgcGF0aCxcXG4gICAgZ2V0R3JvdXBOYW1lcyxcXG4gICAgZ2V0R3JvdXBKc29uXFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuinhOWImeeuoeeQhlwiLFwicGF0aFwiOlwicnVsZU1hbmFnZVwiLFwicnVsZVwiOlwianM6XFxudmFyIGQgPSBbXTtcXG5zZXRQYWdlVGl0bGUoXFxcIuinhOWImeeuoeeQhlxcXCIpO1xcbmxldCBjb25maWdzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIik7XFxubGV0IGFyciA9IGNvbmZpZ3MuZ2V0SnNvbigpO1xcbmxldCBsZW5ndGggPSBhcnIubGVuZ3RoO1xcbmxldCBncm91cHMgPSBjb25maWdzLmdldEdyb3VwTmFtZXMoKTtcXG5sZXQgZ3JvdXAgPSBnZXRJdGVtKFxcXCJydWxlTWFuYWdlX2dyb3VwXFxcIiwgXFxcIlxcXCIpO1xcbmlmICghZ3JvdXBzLmluY2x1ZGVzKGdyb3VwKSkge1xcbiAgICBjbGVhckl0ZW0oXFxcInJ1bGVNYW5hZ2VfZ3JvdXBcXFwiKTtcXG4gICAgZ3JvdXAgPSBcXFwiXFxcIjtcXG59XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmlrDlop5cXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCNcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2RvbWFpbl9jb25maWdcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgcGFnZVRpdGxlOiBcXFwi5paw5aKe6KeE5YiZXFxcIlxcbiAgICB9XFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLliIbkuqtcXFwiLFxcbiAgICB1cmw6ICQoXFxcIi0xXFxcIiwgXFxcIui+k+WFpeS9oOimgeWIhuS6q+inhOWImeeahOW6j+WPt1xcXFxuLTHlhajpg6jvvIwtMuW3suWQr+eUqOeahO+8jC0z5bey56aB55So55qE77yMLTQs57uE5ZCN5YiG5Lqr57uE77yM5aSa5Liq55SoJ++8jCfpmpTlvIBcXFwiKS5pbnB1dCgobGVuZ3RoKSA9PiB7XFxuICAgICAgICBsZXQgaW5kZXhjID0gaW5wdXQuc3BsaXQoLyx877yMLyk7XFxuICAgICAgICBsZXQgaW5kZXhzID0gW107XFxuICAgICAgICBsZXQgbW8gPSBwYXJzZUludChpbmRleGNbMF0pO1xcbiAgICAgICAgaWYgKCEoaW5kZXhjLmxlbmd0aCAhPT0gMCAmJiBtbyA8IDAgJiYgbW8gPiAtNSkpIHtcXG4gICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBpbmRleGMpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG51bSA9IHBhcnNlSW50KGl0KTtcXG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihudW0pIHx8IG51bSA+PSBsZW5ndGggfHwgbnVtIDwgMCkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aVsOWtl+S4jeWQiOazlVxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaW5kZXhzLnB1c2gobnVtKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gJChbXFxcIkhJS0VSXFxcIiwgXFxcIlRYVFxcXCJdLmNvbmNhdChnZXRQYXN0ZXMoKSksIDIsIFxcXCLliIbkuqvmlrnlvI9cXFwiKS5zZWxlY3QoKG1vLCBpbmRleHMsIGV4dCkgPT4ge1xcbiAgICAgICAgICAgIGZ1bmN0aW9uIHVwKHJ1bGVzKSB7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlYjY0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHJ1bGVzKSk7XFxuICAgICAgICAgICAgICAgIGxldCBnZXRQYXNzID0gKGxlbmd0aCwgcnVsZSwgdHlwZSkgPT4gXFxcIua1t+mYlOinhueVjOS6keeugOaQnOe0ouW8leaTju+8jOWFseOAjFxcXCIgKyBsZW5ndGggKyBcXFwi44CN5p2h77yM5aSN5Yi25pW05p2h5Y+j5Luk5omT5byA6L2v5Lu25bCx5Lya6Ieq5Yqo5a+85YWlJFxcXCIgKyBydWxlICsgXFxcIiRcXFwiICsgdHlwZSArIFxcXCJAaW1wb3J0PWpzOiQucmVxdWlyZSgnaW1wb3J0P3J1bGU9JytcXFwiICsgSlNPTi5zdHJpbmdpZnkoTVlfUlVMRS50aXRsZSkgKyBcXFwiKShpbnB1dClcXFwiO1xcbiAgICAgICAgICAgICAgICBpZiAoZ2V0UGFzdGVzKCkuaW5jbHVkZXMoaW5wdXQpKSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IHNoYXJlUGFzdGUocnVsZWI2NCwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGdldFBhc3MocnVsZXMubGVuZ3RoLCB1LCBcXFwiYlxcXCIpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9Mb3lEZ0lrL3NoYXJlL+S6keeugOaQnOe0ouW8leaTjuinhOWImeOAjFxcXCIgKyBydWxlcy5sZW5ndGggKyBcXFwi44CN5p2hLlxcXCIgKyAoaW5wdXQgPT09IFxcXCJISUtFUlxcXCIgPyBcXFwiaGlrZXJcXFwiIDogXFxcInR4dFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGgsIGdldFBhc3MocnVsZXMubGVuZ3RoLCBydWxlYjY0LCBcXFwiYVxcXCIpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwic2hhcmU6Ly9cXFwiICsgcGF0aDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcnVsZXM7XFxuICAgICAgICAgICAgaWYgKG1vID09PSAtMSkge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vID09PSAtMikge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldFVzZWZ1bEpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vID09PSAtMykge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEZvcmJpZGRlbkpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vID09PSAtNCkge1xcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXAgPSBleHQ7XFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0R3JvdXBKc29uKGV4dCk7XFxuICAgICAgICAgICAgICAgIGlmICghcnVsZXMubGVuZ3RoKSByZXR1cm4gXFxcInRvYXN0Oi8v5LiN5a2Y5Zyo6K+l57uEXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKS5maWx0ZXIoKHYsIGkpID0+IGluZGV4cy5pbmNsdWRlcyhpKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJ1bGVzID0gcnVsZXMubWFwKCh2KSA9PiB7XFxuICAgICAgICAgICAgICAgIHYudXNlciA9IHVuZGVmaW5lZDtcXG4gICAgICAgICAgICAgICAgdi5mb3JiaWRkZW4gPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgICAgIHJldHVybiB2O1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiB1cChydWxlcyk7XFxuICAgICAgICB9LCBtbywgaW5kZXhzLCBpbmRleGNbMV0pO1xcblxcbiAgICB9LCBsZW5ndGgpLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX3NoYXJlX2dyZWVuXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YeN572uXFxcIixcXG4gICAgdXJsOiAkKFxcXCLkvaDnoa7lrprph43nva7vvJ9cXFxcbuivpeaTjeS9nOS8muWIoOmZpOeOsOacieinhOWIme+8jOaBouWkjeiHquW4puinhOWImeOAglxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgIGRlbGV0ZUZpbGUocGF0aCk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5wYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9yZWZyZXNoXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5riF56m6XFxcIixcXG4gICAgdXJsOiAkKFxcXCLkvaDnoa7lrprlhajpg6jliKDpmaTvvJ9cXFxcbuivpeaTjeS9nOS8muWIoOmZpOeOsOacieinhOWImeOAglxcXCIpLmNvbmZpcm0oKHBhdGgpID0+IHtcXG4gICAgICAgIHdyaXRlRmlsZShwYXRoLCBcXFwiW11cXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnBhdGgpLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2NvZGVfdmlld1xcXCJcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICAvL3RpdGxlOiAnPGZvbnQgY29sb3I9XFxcIiMxM0I2MUJcXFwiPuKWkCA8L2ZvbnQ+PGI+6KeE5YiZ5YiX6KGoPGI+ICgnICsgU3RyaW5nKGxlbmd0aCkuZm9udGNvbG9yKFxcXCIjZmY2NjAxXFxcIikgKyBcXFwiKVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG59KTtcXG5sZXQgY291bnRUaXRsZSA9IGQuYXQoLTEpO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBncm91cCA/IFxcXCLlhajpg6hcXFwiIDogXFxcIuKAnOKAnOWFqOmDqOKAneKAnVxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoZ3JvdXAsIGxlbmd0aCkgPT4ge1xcbiAgICAgICAgaWYgKGdyb3VwKSB7XFxuICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJydWxlTWFuYWdlX2dyb3VwXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi5om56YeP5Yig6ZmkXFxcXG7moLzlvI865byA5aeL5L2N572u77yM57uT5p2f5L2N572uKOWMuumXtFswLFxcXCIgKyAobGVuZ3RoIC0gMSkgKyBcXFwiXSlcXFwiKS5pbnB1dCgobGVuZ3RoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSBpbnB1dC5zcGxpdCgvLHzvvIwvKTtcXG4gICAgICAgICAgICAgICAgc3RhcnQgPSBwYXJzZUludChzdGFydCksIGVuZCA9IHBhcnNlSW50KGVuZCk7XFxuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4oc3RhcnQpIHx8IE51bWJlci5pc05hTihlbmQpIHx8IHN0YXJ0IDwgMCB8fCBlbmQgPiBsZW5ndGggLSAxIHx8IHN0YXJ0ID4gZW5kKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pWw5a2X5LiN5ZCI5rOVXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgbnVtYmVyID0gZW5kIC0gc3RhcnQgKyAxO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwi56Gu6K6k5Yig6Zmk77yaW1xcXCIgKyBzdGFydCArIFxcXCIsXFxcIiArIGVuZCArIFxcXCJdXFxcXG7lhbFcXFwiICsgbnVtYmVyICsgXFxcIuadoeaQnOe0ouW8leaTjlxcXCIpLmNvbmZpcm0oKHN0YXJ0LCBudW1iZXIpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZShzdGFydCwgbnVtYmVyKTtcXG4gICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgfSwgc3RhcnQsIG51bWJlcik7XFxuICAgICAgICAgICAgfSwgbGVuZ3RoKTtcXG4gICAgICAgIH1cXG4gICAgfSwgZ3JvdXAsIGxlbmd0aCksXFxuICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG59KTtcXG5mb3IgKGxldCBpdCBvZiBncm91cHMpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBpdCA9PT0gZ3JvdXAgPyBcXFwi4oCc4oCcXFxcIiArIGl0ICsgXFxcIuKAneKAnVxcXCIgOiBpdCxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaXQsIGdyb3VwKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGdyb3VwICE9PSBpdCkge1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJydWxlTWFuYWdlX2dyb3VwXFxcIiwgaXQpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFtcXFwi572u6aG2XFxcIiwgXFxcIue9ruW6lVxcXCIsIFxcXCLmlLnlkI1cXFwiLCBcXFwi5Yig6ZmkXFxcIl0pLnNlbGVjdCgoaXQpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChcXFwi5pS55ZCNXFxcIiA9PT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChpdCwgXFxcIuivt+i+k+WFpeaWsOWQjeensFxcXCIpLmlucHV0KChpdCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzLmZvckVhY2godiA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgPT09IHYuZ3JvdXApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lmdyb3VwID0gaW5wdXQ7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihydWxlcyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySXRlbShcXFwicnVsZU1hbmFnZV9ncm91cFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgaXQpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcXFwi5Yig6ZmkXFxcIiA9PT0gaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChcXFwi5piv5ZCm5Yig6Zmk6K+l57uE5pCc57Si5byV5pOO77yaXFxcIiArIGl0KS5jb25maXJtKChpdCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzID0gcnVsZXMuZmlsdGVyKHYgPT4gdi5ncm91cCAhPT0gaXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihydWxlcyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySXRlbShcXFwicnVsZU1hbmFnZV9ncm91cFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgaXQpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRnUnVsZXMgPSBbXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0eFJ1bGVzID0gW107XFxuICAgICAgICAgICAgICAgICAgICBydWxlcy5mb3JFYWNoKCh2KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ID09PSB2Lmdyb3VwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRnUnVsZXMucHVzaCh2KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eFJ1bGVzLnB1c2godik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCLnva7pobZcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGdSdWxlcyA9IHRnUnVsZXMuY29uY2F0KHR4UnVsZXMpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0Z1J1bGVzID0gdHhSdWxlcy5jb25jYXQodGdSdWxlcyk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbih0Z1J1bGVzKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgfSwgaXQpO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgIH0sIGl0LCBncm91cCksXFxuICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgIH0pO1xcbn1cXG5cXG5sZXQgY291bnQgPSBkLmxlbmd0aDtcXG5cXG5mb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XFxuICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgaWYgKGdyb3VwICYmIGdyb3VwICE9PSBpdC5ncm91cCkgY29udGludWU7XFxuICAgIGxldCB1c2VyID0gaXQudXNlciB8fCB7fTtcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdWycgKyBpICsgJ108Yj4gICcgKyBpdC5uYW1lICsgKGl0Lmdyb3VwID8gXFxcInxcXFwiICsgaXQuZ3JvdXAuc21hbGwoKSA6IFxcXCJcXFwiKSArICc8Yj4nICsgKGl0LmZvcmJpZGRlbiA/IFxcXCIgI+KAnOKAnOemgeeUqOKAneKAnVxcXCIuc21hbGwoKSA6IFxcXCJcXFwiKSArIChpdC5yZWdpc3RlclVybCAmJiAhKHVzZXIucGFzc3dvcmQgfHwgdXNlci5hY2NvdW50IHx8IHVzZXIuZXh0cmEpID8gXFxcIiAj6ZyA6KaB55m75b2VXFxcIi5zbWFsbCgpIDogXFxcIlxcXCIpLFxcbiAgICAgICAgdXJsOiAkKFtcXFwi57yW6L6RXFxcIiwgXFxcIui0puWPt1xcXCIsIFxcXCLliIbkuqtcXFwiLCBcXFwi56aB55SoL+WQr+eUqFxcXCIsIFxcXCLnp7vliqhcXFwiLCBcXFwi572u6aG2XFxcIiwgXFxcIuWIoOmZpFxcXCJdLCAxLCBcXFwi5pON5L2c77yaXFxcIiArIGl0Lm5hbWUpLnNlbGVjdCgoaW5kZXgsIGxlbmd0aCwgZ3JvdXApID0+IHtcXG4gICAgICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCLnvJbovpFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5IyNub1JlZnJlc2gjXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi6LSm5Y+3XFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9wYXNzd29yZCNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMjbm9SZWZyZXNoI1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuWIhuS6q1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG9wcyA9IGdldFBhc3RlcygpO1xcbiAgICAgICAgICAgICAgICBvcHMudW5zaGlmdChcXFwi5a6M5pW05Y+j5LukXFxcIik7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKG9wcywgMiwgXFxcIuWIhuS6q+aWueW8j1xcXCIpLnNlbGVjdCgoaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpW2luZGV4XTtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGUudXNlciA9IHVuZGVmaW5lZDtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGUuZm9yYmlkZGVuID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGViNjQgPSBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkocnVsZSkpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdldFBhc3MgPSAobmFtZSwgcnVsZSwgdHlwZSkgPT4gXFxcIua1t+mYlOinhueVjO+8jOOAjFxcXCIgKyBuYW1lICsgXFxcIuOAjeS6keeugOaQnOe0ouW8leaTju+8jOWkjeWItuaVtOadoeWPo+S7pOaJk+W8gOi9r+S7tuWwseS8muiHquWKqOWvvOWFpSRcXFwiICsgcnVsZSArIFxcXCIkXFxcIiArIHR5cGUgKyBcXFwiQGltcG9ydD1qczokLnJlcXVpcmUoJ2ltcG9ydD9ydWxlPScrXFxcIiArIEpTT04uc3RyaW5naWZ5KE1ZX1JVTEUudGl0bGUpICsgXFxcIikoaW5wdXQpXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBcXFwi5a6M5pW05Y+j5LukXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBnZXRQYXNzKHJ1bGUubmFtZSwgcnVsZWI2NCwgXFxcImFcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBzaGFyZVBhc3RlKHJ1bGViNjQsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgZ2V0UGFzcyhydWxlLm5hbWUsIHUsIFxcXCJiXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0sIGluZGV4KTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi56e75YqoXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChpbmRleCArIFxcXCJcXFwiLCBcXFwi6L6T5YWl5L2N572uXFxcIikuaW5wdXQoKGluZGV4LCBsZW5ndGgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdJbmRleCA9IE51bWJlcihpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG5ld0luZGV4KSB8fCBuZXdJbmRleCA+PSBsZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiN5ZKM6KeE55qE5L2N572uXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gcnVsZXMuc3BsaWNlKGluZGV4LCAxKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZShuZXdJbmRleCwgMCwgcnVsZSk7XFxuICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihydWxlcyk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIH0sIGluZGV4LCBsZW5ndGgpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLnva7pobZcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGxldCBuZXdJbmRleCA9IDA7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwKSB7XFxuICAgICAgICAgICAgICAgICAgICBuZXdJbmRleCA9IHJ1bGVzLmZpbmRJbmRleCh2ID0+IHYuZ3JvdXAgPT09IGdyb3VwKTtcXG4gICAgICAgICAgICAgICAgICAgIG5ld0luZGV4ID0gbmV3SW5kZXggPT09IC0xID8gMCA6IG5ld0luZGV4O1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGxldCBydWxlID0gcnVsZXMuc3BsaWNlKGluZGV4LCAxKVswXTtcXG4gICAgICAgICAgICAgICAgcnVsZXMuc3BsaWNlKG5ld0luZGV4LCAwLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24ocnVsZXMpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuWIoOmZpFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIuehruiupOWIoOmZpO+8n1xcXCIpLmNvbmZpcm0oKGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHJ1bGVzLnNwbGljZShpbmRleCwgMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihydWxlcyk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5Yig6ZmkXFxcIiArIHJ1bGUubmFtZTtcXG4gICAgICAgICAgICAgICAgfSwgaW5kZXgpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlID0gYXJyW2luZGV4XTtcXG4gICAgICAgICAgICAgICAgcnVsZS5mb3JiaWRkZW4gPSAhcnVsZS5mb3JiaWRkZW47XFxuICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKGFycik7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIChydWxlLmZvcmJpZGRlbiA/IFxcXCLnpoHnlKhcXFwiIDogXFxcIuWQr+eUqFxcXCIpICsgcnVsZS5uYW1lO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGksIGxlbmd0aCwgZ3JvdXApLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpOiBpLFxcbiAgICAgICAgICAgIHBhZ2VUaXRsZTogaXQubmFtZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuY291bnRUaXRsZS50aXRsZSA9ICc8Zm9udCBjb2xvcj1cXFwiIzEzQjYxQlxcXCI+4paQIDwvZm9udD48Yj7op4TliJnliJfooag8Yj4gKCcgKyAoKGQubGVuZ3RoIC0gY291bnQpICsgXFxcIi9cXFwiICsgbGVuZ3RoKS5mb250Y29sb3IoXFxcIiNmZjY2MDFcXFwiKSArIFxcXCIpXFxcIjtcXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4TliJnnvJbovpFcIixcInBhdGhcIjpcInJ1bGVFZGl0XCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcblxcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX25hbWVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfZmluZFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19maW5kQWxpVXJsXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX3BhZ2VcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfcmVnaXN0ZXJVcmxcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfYmFzaWNVcmxcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfZ3JvdXBcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfYXV0aG9yXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX3J1bGVUeXBlXFxcIik7XFxufSkpO1xcbmxldCB1cmxJbmRleCA9IHBhcnNlSW50KGdldFBhcmFtKFxcXCJpbmRleFxcXCIsIFxcXCJcXFwiKSk7XFxudXJsSW5kZXggPSBOdW1iZXIuaXNOYU4odXJsSW5kZXgpID8gdm9pZCgwKSA6IHVybEluZGV4O1xcbmxldCBpbmRleCA9IHZvaWQoMCkgPT09IHVybEluZGV4ID8gTVlfUEFSQU1TLmkgOiB1cmxJbmRleDtcXG5sZXQgaXNJbXBvcnQgPSAhIWdldFBhcmFtKFxcXCJpc0ltcG9ydFxcXCIsIFxcXCJcXFwiKTtcXG5sZXQgYXJyID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbmxldCBvYmo7XFxuaWYgKGlzSW1wb3J0KSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBvYmogPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vZmlsZXMvX2NhY2hlL3l1blNpbXBsZUltcG9ydC5qc29uXFxcIik7XFxuICAgICAgICBsZXQgdGlwID0gaW5kZXggIT09IHZvaWQoMCkgPyBcXFwi5pu05paw6KeE5YiZXFxcIiA6IFxcXCLlr7zlhaXop4TliJlcXFwiO1xcbiAgICAgICAgc2V0UGFnZVRpdGxlKHRpcCArIFxcXCI6XFxcIiArIG9iai5uYW1lKTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJjigJhcXFwiICsgdGlwICsgXFxcIuKAmeKAmVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgb2JqID0ge307XFxuICAgICAgICBiYWNrKCk7XFxuICAgICAgICB0b2FzdChcXFwi5a+85YWl6ZSZ6K+vXFxcIik7XFxuICAgIH1cXG59IGVsc2UgaWYgKGluZGV4ICE9PSB2b2lkKDApKSB7XFxuICAgIG9iaiA9IGFycltpbmRleF07XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi57yW6L6R6KeE5YiZOlxcXCIgKyBvYmoubmFtZSk7XFxuICAgIGlmIChvYmoubGFzdE1vZGlmeSkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuS4iuasoeS/ruaUue+8mlxcXCIgKyAkLmRhdGVGb3JtYXQob2JqLmxhc3RNb2RpZnksIFxcXCJ5eXl5LU1NLWRkwqBISDptbTpzc1xcXCIpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59IGVsc2Uge1xcbiAgICBvYmogPSB7XFxuICAgICAgICBwYWdlOiB0cnVlLFxcbiAgICAgICAgYXV0aG9yOiBjb20uZXhhbXBsZS5oaWtlcnZpZXcudXRpbHMuUHJlZmVyZW5jZU1nci5nZXRTdHJpbmcoZ2V0Q3VycmVudEFjdGl2aXR5KCksIFxcXCJteU5hbWVcXFwiLCBcXFwiXFxcIilcXG4gICAgfTtcXG4gICAgc2V0UGFnZVRpdGxlKFxcXCLmlrDlu7rop4TliJlcXFwiKTtcXG59XFxuXFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLlkI3lrZco5b+F5aGrKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX25hbWVcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLm5hbWUsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuetvuWQjVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5L2c6ICFKOmAieWhqylcXFwiLFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgbGV0IGF1dGhvciA9IGdldE15VmFyKFxcXCJwc19hdXRob3JcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBsZXQgbXkgPSBTdHJpbmcoY29tLmV4YW1wbGUuaGlrZXJ2aWV3LnV0aWxzLlByZWZlcmVuY2VNZ3IuZ2V0U3RyaW5nKGdldEN1cnJlbnRBY3Rpdml0eSgpLCBcXFwibXlOYW1lXFxcIiwgXFxcIlxcXCIpKTtcXG4gICAgICAgIGxldCBuZXdBdXRob3IgPSBcXFwiXFxcIjtcXG4gICAgICAgIGlmIChhdXRob3IgJiYgIWF1dGhvci5pbmNsdWRlcyhteSkpIHtcXG4gICAgICAgICAgICBuZXdBdXRob3IgPSBhdXRob3IgKyBcXFwiJlxcXCIgKyBteTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbmV3QXV0aG9yID0gbXk7XFxuICAgICAgICB9XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJpZEBwc19hdXRob3JcXFwiLCB7XFxuICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24oZmluZEl0ZW0oXFxcImlkQHBzX2F1dGhvclxcXCIpLmV4dHJhLCB7XFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogbmV3QXV0aG9yXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH0pO1xcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfYXV0aG9yXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5hdXRob3IsXFxuICAgICAgICBpZDogXFxcImlkQHBzX2F1dGhvclxcXCJcXG4gICAgICAgIC8vdGl0bGVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpgInmi6lcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuWIhue7hCjpgInloaspXFxcIixcXG4gICAgdXJsOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIGxldCBncm91cCA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEdyb3VwTmFtZXMoKTtcXG4gICAgICAgIGlmICghZ3JvdXAubGVuZ3RoKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuICQoZ3JvdXApLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGV4dHJhID0gZmluZEl0ZW0oXFxcInJ1bGVFZGl0R3JvdXBcXFwiKS5leHRyYTtcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKFxcXCJydWxlRWRpdEdyb3VwXFxcIiwge1xcbiAgICAgICAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbihleHRyYSwge1xcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBpbnB1dFxcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSk7XFxuICAgIH0pLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19ncm91cFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgaWQ6IFxcXCJydWxlRWRpdEdyb3VwXFxcIixcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmdyb3VwLFxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLmkJzntKLop4TliJko5b+F5aGrKVxcXFxu5YaF572u5Y+Y6YeP77yac+aQnOe0ouWFs+mUruivje+8jHBhZ2XpobXmlbDvvIxiYXNpY1VybOWfuuacrOmTvuaOpe+8jHVzZXLnlKjmiLfotKblj7fkv6Hmga8odXNlci5hY2NvdW50LHVzZXIucGFzc3dvcmQpXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IDMsXFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX2ZpbmRcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmZpbmQsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCJVUkzop4TliJko6YCJ5aGrKVxcXFxu5YaF572u5Y+Y6YeP77yaaW5wdXTpk77mjqXvvIxiYXNpY1VybOWfuuacrOmTvuaOpVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OiAzLFxcbiAgICAgICAgaGlnaGxpZ2h0OiB0cnVlLFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19maW5kQWxpVXJsXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5maW5kQWxpVXJsLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5Z+65pys6ZO+5o6lKOmAieWhqykg5Luj56CB5Lit55SoYmFzaWNVcmzlvJXnlKhcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19iYXNpY1VybFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmouYmFzaWNVcmwsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLms6jlhozlnLDlnYAo6YCJ5aGrKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX3JlZ2lzdGVyVXJsXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5yZWdpc3RlclVybCxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaYr+WQpuWPr+S7pee/u+mhte+8mlxcXCIgKyBvYmoucGFnZSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKHBhZ2UpID0+IHtcXG4gICAgICAgIGxldCBpc1BhZ2UgPSAhIWdldE15VmFyKFxcXCJwc19wYWdlXFxcIiwgcGFnZSA/IFxcXCIxXFxcIiA6IFxcXCJcXFwiKTtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJwc19wYWdlXFxcIiwgaXNQYWdlID8gXFxcIlxcXCIgOiBcXFwiMVxcXCIpO1xcbiAgICAgICAgdXBkYXRlSXRlbShcXFwicnVsZWVkcHNfcGFnZVxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuaYr+WQpuWPr+S7pee/u+mhte+8mlxcXCIgKyAhaXNQYWdlXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0sIG9iai5wYWdlKSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBcXFwicnVsZWVkcHNfcGFnZVxcXCJcXG4gICAgfVxcbn0pO1xcbnB1dE15VmFyKFxcXCJwc19ydWxlVHlwZVxcXCIsIChvYmoucnVsZVR5cGV8fFxcXCJcXFwiKSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLop6PmnpDmqKHlvI/vvJpcXFwiICsgKG9iai5ydWxlVHlwZSB8fCBcXFwiSlNcXFwiKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcbiAgICB1cmw6ICQoW1xcXCJKU1xcXCIsIFxcXCJKU09OXFxcIiwgXFxcIkhUTUxcXFwiXSkuc2VsZWN0KCgpID0+IHtcXG5cXG4gICAgICAgIHB1dE15VmFyKFxcXCJwc19ydWxlVHlwZVxcXCIsIGlucHV0ID09PSBcXFwiSlNcXFwiID8gXFxcIlxcXCIgOiBpbnB1dCk7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJwc19ydWxlVHlwZVxcXCIsIHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIuino+aekOaooeW8j++8mlxcXCIgKyBpbnB1dFxcbiAgICAgICAgfSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBcXFwicHNfcnVsZVR5cGVcXFwiXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaW5kZXgsIHVybEluZGV4KSA9PiB7XFxuICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQoMCkpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5q2k6aG55peg5rOV5Yig6ZmkXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh1cmxJbmRleCAhPT0gdm9pZCgwKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjmm7TmlrDop4TliJnvvIzliKDpmaTor7fku47op4TliJnnrqHnkIbov5vlhaVcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmuKnppqjmj5DnpLpcXFwiLFxcbiAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLnoa7lrpropoHliKDpmaTmraTop4TliJnlkJfvvJ/ms6jmhI/liKDpmaTlkI7ml6Dms5XmgaLlpI1cXFwiLFxcbiAgICAgICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEpO1xcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgICAgICBiYWNrKHRydWUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9LCBpbmRleClcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBpbmRleCwgdXJsSW5kZXgpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmtYvor5VcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUocGFnZSA9PiB7XFxuICAgICAgICBsZXQgdGVzdEtleXdvcmQgPSBnZXRJdGVtKFxcXCJ0ZXN0S2V5d29yZFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIHJldHVybiAkKHRlc3RLZXl3b3JkLCBcXFwi6K+36L6T5YWl5YWz6ZSu6K+NXFxcIikuaW5wdXQoKHBhZ2UpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJ0ZXN0S2V5d29yZFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXCJwc19uYW1lXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGxldCBmaW5kID0gZ2V0TXlWYXIoXFxcInBzX2ZpbmRcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgaWYgKCFmaW5kKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mkJzntKLop4TliJnkuI3og73kuLrnqbpcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgYXJyID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgIGxldCB0ZXN0UnVsZSA9IHtcXG4gICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcXG4gICAgICAgICAgICAgICAgZmluZDogZmluZCxcXG4gICAgICAgICAgICAgICAgYmFzaWNVcmw6IGdldE15VmFyKFxcXCJwc19iYXNpY1VybFxcXCIsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICAgICAgZmluZEFsaVVybDogZ2V0TXlWYXIoXFxcInBzX2ZpbmRBbGlVcmxcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgICAgIHBhZ2U6ICEhZ2V0TXlWYXIoXFxcInBzX3BhZ2VcXFwiLCBwYWdlID8gXFxcIjFcXFwiIDogXFxcIlxcXCIpLFxcbiAgICAgICAgICAgICAgICBydWxlVHlwZTogZ2V0TXlWYXIoXFxcInBzX3J1bGVUeXBlXFxcIiwgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgcmV0dXJuICQoXFxcImhpa2VyOi8vZW1wdHkjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP2Z5cGFnZVxcXCIpLnJ1bGUoKHRlc3RSdWxlLCBrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgaWYgKE1ZX1BBR0UgPiAxICYmICF0ZXN0UnVsZS5wYWdlKSBzZXRSZXN1bHQoW10pO1xcbiAgICAgICAgICAgICAgICBzZXRSZXN1bHQoJC5yZXF1aXJlKFxcXCJkYXRhXFxcIikuY2FycnlSdWxlKHRlc3RSdWxlLCBrZXksIE1ZX1BBR0UsIDApKTtcXG4gICAgICAgICAgICB9LCB0ZXN0UnVsZSwgaW5wdXQpO1xcbiAgICAgICAgfSwgcGFnZSk7XFxuICAgIH0sIG9iai5wYWdlKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzNcXFwiLFxcbn0pO1xcblxcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5L+d5a2YXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpbmRleCwgcGFnZSwgaXNJbXBvcnQpID0+IHtcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0TXlWYXIoXFxcInBzX25hbWVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoIW5hbWUpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5ZCN5a2X5b6X5pyJ5LiA5Liq5ZCnXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBmaW5kID0gZ2V0TXlWYXIoXFxcInBzX2ZpbmRcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoIWZpbmQpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pCc57Si6KeE5YiZ5LiN6IO95Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICBsZXQgb2JqMSA9IHtcXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxcbiAgICAgICAgICAgIGF1dGhvcjogZ2V0TXlWYXIoXFxcInBzX2F1dGhvclxcXCIsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBmaW5kOiBmaW5kLFxcbiAgICAgICAgICAgIGJhc2ljVXJsOiBnZXRNeVZhcihcXFwicHNfYmFzaWNVcmxcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgZmluZEFsaVVybDogZ2V0TXlWYXIoXFxcInBzX2ZpbmRBbGlVcmxcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgcGFnZTogISFnZXRNeVZhcihcXFwicHNfcGFnZVxcXCIsIHBhZ2UgPyBcXFwiMVxcXCIgOiBcXFwiXFxcIiksXFxuICAgICAgICAgICAgcmVnaXN0ZXJVcmw6IGdldE15VmFyKFxcXCJwc19yZWdpc3RlclVybFxcXCIsIFxcXCJcXFwiKSB8fCB1bmRlZmluZWQsXFxuICAgICAgICAgICAgbGFzdE1vZGlmeTogRGF0ZS5ub3coKSxcXG4gICAgICAgICAgICBncm91cDogZ2V0TXlWYXIoXFxcInBzX2dyb3VwXFxcIiwgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIHJ1bGVUeXBlOiBnZXRNeVZhcihcXFwicHNfcnVsZVR5cGVcXFwiLCBcXFwiXFxcIiksXFxuICAgICAgICB9O1xcbiAgICAgICAgaWYgKGluZGV4ID09PSB2b2lkKDApKSB7XFxuICAgICAgICAgICAgaWYgKGFyci5zb21lKHYgPT4gdi5uYW1lID09PSBuYW1lKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5a2Y5Zyo6K+l6KeE5YiZXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKG9iajEuZ3JvdXApIHtcXG4gICAgICAgICAgICAgICAgbGV0IGdyb3VwID0gb2JqMS5ncm91cDtcXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gYXJyLmZpbmRJbmRleCh2ID0+IHYuZ3JvdXAgPT09IGdyb3VwKTtcXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgYXJyLnVuc2hpZnQob2JqMSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAwLCBvYmoxKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGlmIChpc0ltcG9ydCkge1xcbiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2gob2JqMSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBhcnIudW5zaGlmdChvYmoxKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IG5hbWV5ID0gYXJyW2luZGV4XS5uYW1lO1xcbiAgICAgICAgICAgIGlmIChuYW1lICE9PSBuYW1leSkge1xcbiAgICAgICAgICAgICAgICBpZiAoYXJyLnNvbWUodiA9PiB2Lm5hbWUgPT09IG5hbWUpKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey57uP5a2Y5Zyo6K+l6KeE5YiZXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBvYmoxID0gT2JqZWN0LmFzc2lnbihhcnJbaW5kZXhdLCBvYmoxKTtcXG4gICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxLCBvYmoxKTtcXG4gICAgICAgIH1cXG4gICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKGFycik7XFxuICAgICAgICBiYWNrKHRydWUpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/neWtmOaIkOWKn1xcXCI7XFxuICAgIH0sIGluZGV4LCBvYmoucGFnZSwgaXNJbXBvcnQpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuXFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ6LSm5Y+3XCIsXCJwYXRoXCI6XCJwYXNzd29yZFwiLFwicnVsZVwiOlwianM6XFxuKGZ1bmN0aW9uKCkge1xcbiAgICB2YXIgZCA9IFtdO1xcbiAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwicHNfYWNjb3VudFxcXCIpO1xcbiAgICAgICAgY2xlYXJNeVZhcihcXFwicHNfcGFzc3dvcmRcXFwiKTtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcInBzX2V4dHJhXFxcIik7XFxuICAgIH0pKTtcXG4gICAgbGV0IGluZGV4ID0gTVlfUEFSQU1TLmk7XFxuICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgIGxldCBvYmogPSBhcnJbaW5kZXhdIHx8IHt9O1xcbiAgICBzZXRQYWdlVGl0bGUoXFxcIuiuvue9rui0puWPtzpcXFwiICsgb2JqLm5hbWUpO1xcbiAgICBsZXQgcmVnaXN0ZXJVcmwgPSBvYmoucmVnaXN0ZXJVcmw7XFxuICAgIGlmIChyZWdpc3RlclVybCkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5YmN5b6A5rOo5YaMXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoXFxcImhpa2VyOi8vZW1wdHkjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXFxcIikucnVsZSgocmVnaXN0ZXJVcmwpPT57XFxuICAgICAgICAgICAgICAgIHNldFJlc3VsdChbe1xcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6XFxcIng1X3dlYnZpZXdfc2luZ2xlXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIHVybDpyZWdpc3RlclVybCxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6XFxcImZsb2F0JiYxMDAlXFxcIlxcbiAgICAgICAgICAgICAgICB9XSk7XFxuICAgICAgICAgICAgfSwgcmVnaXN0ZXJVcmwpLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBcXFwi5rOo5YaM6LSm5Y+3OlxcXCIgKyBvYmoubmFtZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIG9iaiA9IG9iai51c2VyIHx8IHt9O1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi55So5oi35ZCNXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfYWNjb3VudFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5hY2NvdW50LFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2VcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgIGRlc2M6IFxcXCLlr4bnoIFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0eXBlOiBcXFwicGFzc3dvcmRcXFwiLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX3Bhc3N3b3JkXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLnBhc3N3b3JkLFxcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi6aKd5aSWXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19leHRyYVxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5leHRyYSxcXG4gICAgICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIGhlaWdodDogLTFcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgbGV0IGFjY291bnQgPSBnZXRNeVZhcihcXFwicHNfYWNjb3VudFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgcGFzc3dvcmQgPSBnZXRNeVZhcihcXFwicHNfcGFzc3dvcmRcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgbGV0IGV4dHJhID0gZ2V0TXlWYXIoXFxcInBzX2V4dHJhXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIC8qaWYgKCEoYWNjb3VudHx8cGFzc3dvcmR8fGV4dHJhKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiN6IO95YWo6YOo5Li656m6XFxcIjtcXG4gICAgICAgICAgICB9Ki9cXG4gICAgICAgICAgICBsZXQgYXJyID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgIGxldCBpdGVtID0gYXJyW2luZGV4XTtcXG4gICAgICAgICAgICBpdGVtLnVzZXIgPSB7fTtcXG4gICAgICAgICAgICBpdGVtLnVzZXIuYWNjb3VudCA9IGFjY291bnRcXG4gICAgICAgICAgICBpdGVtLnVzZXIucGFzc3dvcmQgPSBwYXNzd29yZDtcXG4gICAgICAgICAgICBpdGVtLnVzZXIuZXh0cmEgPSBleHRyYTtcXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQoMCkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL2lk6ZSZ6K+vXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxLCBpdGVtKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgICAgICBiYWNrKHRydWUpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv53lrZjmiJDlip9cXFwiO1xcbiAgICAgICAgfSwgaW5kZXgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgfSk7XFxuICAgIHNldFJlc3VsdChkKTtcXG59KSgpXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4TliJnlr7zlhaVcIixcInBhdGhcIjpcImltcG9ydFwiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gc2F2ZUNhY2hlKGpzb24pIHtcXG4gICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS95dW5TaW1wbGVJbXBvcnQuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG59XFxuJC5leHBvcnRzID0gZnVuY3Rpb24ocGFzcykge1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IFtfLCBydWxlLCB0eXBlXSA9IHBhc3Muc3BsaXQoXFxcIiRcXFwiKTtcXG4gICAgICAgIGlmICh0eXBlID09PSBcXFwiYlxcXCIpIHtcXG4gICAgICAgICAgICBydWxlID0gcGFyc2VQYXN0ZShydWxlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBydWxlcyA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKHJ1bGUpKTtcXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShydWxlcykpIHtcXG4gICAgICAgICAgICBydWxlcyA9IFtydWxlc107XFxuICAgICAgICB9XFxuICAgICAgICAvL3J1bGVzLnJldmVyc2UoKTtcXG4gICAgICAgIE1ZX1VSTCA9IG1vZHVsZS5pZDtcXG4gICAgICAgIGxldCBydWxlVGl0bGUgPSBnZXRQYXJhbShcXFwicnVsZVxcXCIpO1xcbiAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlncz9ydWxlPVxcXCIgKyBydWxlVGl0bGUpLmdldEpzb24oKTtcXG4gICAgICAgIGxldCBuZXdJID0gMDtcXG4gICAgICAgIGZvciAobGV0IHJ1bGUgb2YgcnVsZXMpIHtcXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBhcnIuZmluZEluZGV4KHYgPT4gdi5uYW1lID09PSBydWxlLm5hbWUpO1xcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGUgPSBPYmplY3QuYXNzaWduKGFycltpbmRleF0sIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUNhY2hlKHJ1bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP2lzSW1wb3J0PXRydWUmaW5kZXg9XFxcIiArIGluZGV4ICsgXFxcIiZydWxlPVxcXCIgKyBydWxlVGl0bGU7XFxuICAgICAgICAgICAgICAgICAgICAvL3RvYXN0KFxcXCLlt7Lmm7TmlrDop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhcXFwi5bey5pu05paw6KeE5YiZ77yaXFxcIiArIHJ1bGUubmFtZSlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIG5ld0krKztcXG4gICAgICAgICAgICAgICAgYXJyLnB1c2gocnVsZSk7XFxuICAgICAgICAgICAgICAgIGlmIChydWxlcy5sZW5ndGggPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNhdmVDYWNoZShydWxlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9pc0ltcG9ydD10cnVlJnJ1bGU9XFxcIiArIHJ1bGVUaXRsZTtcXG4gICAgICAgICAgICAgICAgICAgIC8vdG9hc3QoXFxcIuW3suWvvOWFpeinhOWIme+8mlxcXCIgKyBydWxlLm5hbWUpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKFxcXCLlt7Llr7zlhaXop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHJ1bGVzLmxlbmd0aCA+IDEpIHtcXG4gICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3M/cnVsZT1cXFwiICsgcnVsZVRpdGxlKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLmlrDlop7vvJpcXFwiICsgbmV3SSArIFxcXCIg6KaG55uW5pu05paw77yaXFxcIiArIChydWxlcy5sZW5ndGggLSBuZXdJKSk7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgdG9hc3QoXFxcIuWvvOWFpeWksei0pVxcXCIpO1xcbiAgICB9XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ5YiX6KGoXCIsXCJwYXRoXCI6XCJydWxlc1wiLFwicnVsZVwiOlwianM6XFxuJC5leHBvcnRzID0gW3tcXG4gICAgICAgIG5hbWU6IFxcXCLlsI/kupFcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBiYXNpY1VybCA9IFxcXCJodHRwczovL3d3dy55dW5zby5uZXRcXFwiO1xcbiAgICAgICAgICAgIGxldCBhcGkgPSBcXFwiL2FwaS92YWxpZGF0ZS9zZWFyY2g/d2Q9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChzKSArIFxcXCImbW9kZT05MDAwMSZzdHlwZT0yMDEwMCZ1az0mcGFnZT1cXFwiICsgcGFnZSArIFxcXCImbGltaXQ9MjAmc2NyZWVuX2ZpbGV0eXBlPXVuZGVmaW5lZFxcXCI7XFxuICAgICAgICAgICAgbGV0IGpzb24gPSBwb3N0KGJhc2ljVXJsICsgYXBpLCB7XFxuICAgICAgICAgICAgICAgIGJvZHk6IFxcXCJkYXRhPVxcXCIgKyBhcGksXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFJlZmVyZXI6IFxcXCJodHRwczovL3d3dy55dW5zby5uZXQvaW5kZXgvdXNlci9zP3dkPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQocylcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gSlNPTi5wYXJzZShqc29uKS5kYXRhO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gcGRmYShodG1sLCBcXFwiYm9keSYmLmxheXVpLWNhcmQ6aGFzKGEpXFxcIik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGxpc3QpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcGRmaChpdGVtLCBcXFwiYSYmVGV4dFxcXCIpLnJlcGxhY2UoXFxcIiPmlofku7blpLkgXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICAvL2xldCB0aW1lID0gL1xcXFxkezR9KC1cXFxcZHsyfSl7Mn0gXFxcXGR7Mn0oXFxcXDpcXFxcZHsyfSl7Mn0vLmV4ZWMocGRmaChpdGVtLCBcXFwiLmxheXVpLWNhcmQtYm9keSYmVGV4dFxcXCIpKSB8fCBbXTtcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIC8vZGVzYzogdGltZVswXSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogYmFzZTY0RGVjb2RlKHBkZmgoaXRlbSwgXFxcImEmJnVybFxcXCIpKVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH0sIHtcXG4gICAgICAgIG5hbWU6IFxcXCLmt7flkIjnm5hcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFwiaHR0cHM6Ly9hcGkuaHVuaGVwYW4uY29tL3YxL3NlYXJjaFxcXCI7XFxuICAgICAgICAgICAgbGV0IGpzb24gPSBwb3N0KHVybCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBSZWZlcmVyOiBcXFwiaHR0cHM6Ly9odW5oZXBhbi5jb20vXFxcIlxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicVxcXCI6IHMsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFnZVxcXCI6IHBhZ2UsXFxuICAgICAgICAgICAgICAgICAgICBcXFwic2l6ZVxcXCI6IDE1XFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UoanNvbik7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBqc29uLmRhdGEubGlzdDtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBsaXN0W2ldO1xcbiAgICAgICAgICAgICAgICBpZiAoaXQuZGlza190eXBlICE9PSBcXFwiQUxZXFxcIiB8fCBpdC5zaGFyZV91c2VyID09PSBcXFwi5Li2Kioq5Li2XFxcIikgY29udGludWU7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQuZGlza19uYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogcGQoaXQsIFxcXCJpbWcmJnNyY1xcXCIsIHVybCksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGl0LmxpbmssXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBpdC51cGRhdGVfdGltZSArIFxcXCJcXFxcblxcXCIgKyBpdC5saW5rLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH0sIHtcXG4gICAgICAgIG5hbWU6IFxcXCLotYTmupDluK5cXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQocywgcGFnZSkge1xcbiAgICAgICAgICAgIGZ1bmN0aW9uIHNlYXJjaCgpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJ0bkxpc3QgPSBbXTtcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3AgPSByZXF1ZXN0KFxcXCJodHRwczovL3p5Yi51cHl1bnNvLmNvbS92MTUvc2VhcmNoP2tleXdvcmQ9XFxcIiArIGVuX2FlcyhzKSArIFxcXCImc190eXBlPTImcGFnZT1cXFwiICsgcGFnZSArIFxcXCImYXRrPSZkaWQ9XFxcIiArIGdlbmVyYXRlUmFuZG9tSGV4U3RyaW5nKDY0KSwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VyLWFnZW50XFxcIjogXFxcIk1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMDsgUmVkbWkgTm90ZSA3IEJ1aWxkL1FLUTEuMTkwOTEwLjAwMjsgd3YpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS84MS4wLjQwNDQuMTM4IE1vYmlsZSBTYWZhcmkvNTM3LjM2IHVuaS1hcHAgSHRtbDVQbHVzLzEuMCAoSW1tZXJzZWQvMjkuMDkwOTEpXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzcERhdGEgPSBkZV9hZXMocmVzcCk7XFxuICAgICAgICAgICAgICAgIGxldCBqc29uRGF0YSA9IEpTT04ucGFyc2UocmVzcERhdGEpIHx8IHt9O1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0ganNvbkRhdGEucmVzdWx0IHx8IHt9O1xcbiAgICAgICAgICAgICAgICBsZXQgaXRlbXMgPSByZXN1bHQuaXRlbXMgfHwgW107XFxuXFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gaXRlbXNbaV07XFxuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGl0ZW0uY29udGVudCB8fCBbXTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PSAwIHx8ICFpdGVtLnBhZ2VfdXJsKSBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBkZV9hZXMoaXRlbS5wYWdlX3VybCkgfHwgXFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXVybCkgY29udGludWU7XFxuICAgICAgICAgICAgICAgICAgICBydG5MaXN0LnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAoaXRlbS50aXRsZS5sZW5ndGggPiAzMCA/IGl0ZW0udGl0bGUuc2xpY2UoMCwgMjcpICsgXFxcIi4uLlxcXCIgOiBpdGVtLnRpdGxlKSB8fCBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFwi5YiG5Lqr5pe26Ze077yaXFxcIiArIGl0ZW0uaW5zZXJ0X3RpbWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICAgIHJldHVybiBydG5MaXN0O1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbUhleFN0cmluZyhsZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJzID0gXFxcIjAxMjM0NTY3ODlhYmNkZWZcXFwiO1xcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJzTGVuZ3RoID0gY2hhcmFjdGVycy5sZW5ndGg7XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjaGFyYWN0ZXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyYWN0ZXJzTGVuZ3RoKSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGFsaVV0aWwgPSAkLnJlcXVpcmUoXFxcImFsaVV0aWxcXFwiKTtcXG4gICAgICAgICAgICBsZXQgQ3J5cHRvSlMgPSBhbGlVdGlsLmdldENyeXB0b0pTKCk7XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gZW5fYWVzKGUpIHtcXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBcXFwicXExOTIwNTIwNDYwcXF6elxcXCI7XFxuICAgICAgICAgICAgICAgIC8vIGVuX2Flc1xcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoaSk7XFxuICAgICAgICAgICAgICAgIHZhciB0ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoZSksXFxuICAgICAgICAgICAgICAgICAgICByID0gQ3J5cHRvSlMuQUVTLmVuY3J5cHQodCwga2V5LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaXY6IGtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gci5jaXBoZXJ0ZXh0LnRvU3RyaW5nKCk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGRlX2Flcyh2dikge1xcbiAgICAgICAgICAgICAgICBsZXQgaSA9IFxcXCJxcTE5MjA1MjA0NjBxcXp6XFxcIjtcXG4gICAgICAgICAgICAgICAgLy8gZGVfYWVzXFxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShpKTtcXG4gICAgICAgICAgICAgICAgbGV0IGhleFZhbCA9IENyeXB0b0pTLmVuYy5IZXgucGFyc2UodnYpLFxcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gQ3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkoaGV4VmFsKSxcXG4gICAgICAgICAgICAgICAgICAgIGRlY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHZhbCwga2V5LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaXY6IGtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVjcnlwdGVkLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIHNlYXJjaCgpO1xcbiAgICAgICAgfVxcbiAgICB9LCB7XFxuICAgICAgICBuYW1lOiBcXFwi5LqR55uY6LWE5rqQXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IFxcXCJodHRwczovL3Jlcy55dW5wYW4ud2luLz9QYWdlSW5kZXg9XFxcIiArIHBhZ2UgKyBcXFwiJlBhZ2VTaXplPTEyJktleXdvcmQ9XFxcIiArIHMgKyBcXFwiJlR5cGU9JlRhZz1cXFwiO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly9yZXMueXVucGFuLndpbi9cXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICBsZXQgYXJyID0gcGRmYShodG1sLCBcXFwibWFpbiYmLmNhcmRcXFwiKTtcXG4gICAgICAgICAgICAvL2xvZyhhcnIpO1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBkZmgoaXQsIFxcXCIuY2FyZC1saW5rLDEmJm9uY2xpY2tcXFwiKS5tYXRjaCgvaHR0cHM6XFxcXC9cXFxcLyh3d3dcXFxcLmFsaXl1bmRyaXZlXFxcXC5jb21cXFxcL3N8YWx5d3BcXFxcLm5ldClcXFxcL1xcXFx3Ki9nKSB8fCBbXTtcXG4gICAgICAgICAgICAgICAgdSA9IHUubGVuZ3RoID4gMCA/IHVbMF0gOiB1cmw7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChpdCwgXFxcIi5jYXJkLXRpdGxlJiZUZXh0XFxcIiksXFxuICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiBwZChpdCwgXFxcImltZyYmc3JjXFxcIiwgdXJsKSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHBkZmgoaXQsIFxcXCIuY2FyZC10ZXh0LC0xJiZUZXh0XFxcIikgKyBcXFwiXFxcXG5cXFwiICsgdSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwiVVDkupHmkJxcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcImh0dHBzOi8vYXBpLnVweXVuc28yLmNvbS9zZWFyY2g/a2V5d29yZD1cXFwiICsgcyArIFxcXCImcGFnZT1cXFwiICsgcGFnZSArIFxcXCImc190eXBlPTFcXFwiO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly93d3cudXB5dW5zby5jb21cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIkNvb2tpZVxcXCI6IFxcXCJjb2RlPTE5MTlcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAvL2xvZyhiYXNlNjREZWNvZGUoaHRtbCkpO1xcbiAgICAgICAgICAgIGxldCBhcnIgPSBKU09OLnBhcnNlKGJhc2U2NERlY29kZShodG1sKSkucmVzdWx0Lml0ZW1zO1xcbiAgICAgICAgICAgIC8vbG9nKGFycik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBpZiAoIWFycikgcmV0dXJuIFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBpdC5wYWdlX3VybDtcXG4gICAgICAgICAgICAgICAgLy91ID0gdS5sZW5ndGggPiAwID8gdVswXSA6IHVybDtcXG4gICAgICAgICAgICAgICAgaWYgKCF1LmluY2x1ZGVzKFxcXCJhbGl5dW5kcml2ZVxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0LnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcIlxcXFxuXFxcIiArICh1KSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi54yr54u455uY5pCcXFxcIixcXG4gICAgICAgIHBhZ2U6IGZhbHNlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChcXFwiaHR0cHM6Ly93d3cuYWxpcGFuc291LmNvbS9zZWFyY2g/az1cXFwiICsgcywge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3d3dy5hbGlwYW5zb3UuY29tL3NlYXJjaD9rPVxcXCIgKyBzXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBsZXQgYXJyID0gcGRmYShodG1sLCBcXFwiI2FwcCYmYVxcXCIpO1xcbiAgICAgICAgICAgIC8vbG9nKGFycik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBcXFwiPGRpdj5cXFwiICsgYXJyW2ldICsgXFxcIjwvZGl2PlxcXCI7XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGRmaChpdCwgXFxcImEmJmhyZWZcXFwiKTtcXG4gICAgICAgICAgICAgICAgLy9sb2codSk7XFxuICAgICAgICAgICAgICAgIGlmICghdS5pbmNsdWRlcyhcXFwiL3MvXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHUgPSBcXFwiaHR0cHM6Ly93d3cuYWxpcGFuc291LmNvbVxcXCIgKyB1LnJlcGxhY2UoXFxcIi9zL1xcXCIsIFxcXCIvY3YvXFxcIik7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChpdCwgXFxcInRlbXBsYXRlJiZUZXh0XFxcIiksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBwZGZoKGl0LCBcXFwidGVtcGxhdGUsMSYmVGV4dFxcXCIpLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9LFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChpbnB1dCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiQ29va2llXFxcIjogXFxcIm5vX3Nob3dfZG9uYXRlPTFcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBpbnB1dC5yZXBsYWNlKFxcXCIvY3YvXFxcIiwgXFxcIi9zL1xcXCIpXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OiBmYWxzZVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGh0bWwgPSBwYXJzZURvbUZvckh0bWwoaHRtbCwgJ2EmJmhyZWYnKTtcXG4gICAgICAgICAgICBpZiAoaHRtbC5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBodG1sO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLmmJPmkJxcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIHJlZ2lzdGVyVXJsOiBcXFwiaHR0cHM6Ly95aXNvLmZ1blxcXCIsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IGFsaVV0aWwgPSAkLnJlcXVpcmUoXFxcImFsaVV0aWxcXFwiKTtcXG4gICAgICAgICAgICBsZXQgQ3J5cHRvSlMgPSBhbGlVdGlsLmdldENyeXB0b0pTKCk7XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24ga2V5ZW4oc3RyKSB7XFxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShcXFwiNE9Ub1NjVUZPYWVWVHJIRVxcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgaXYgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShcXFwiOUNMR2FvMXZIS3FtMTdPelxcXCIpO1xcbiAgICAgICAgICAgICAgICB2YXIgZW5jcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoe1xcbiAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dDogQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShzdHIpXFxuICAgICAgICAgICAgICAgIH0sIGtleSwge1xcbiAgICAgICAgICAgICAgICAgICAgaXY6IGl2LFxcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5DQkMsXFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczdcXG4gICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jcnlwdGVkO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoXFxcImh0dHBzOi8veWlzby5mdW4vYXBpL3NlYXJjaD9uYW1lPVxcXCIgKyBzICsgXFxcIiZwYWdlTm89XFxcIiArIHBhZ2UsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly95aXNvLmZ1bi9pbmZvP3NlYXJjaEtleT1cXFwiICsgcyxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJDb29raWVcXFwiOiBnZXRJdGVtKCd5aXNvdWNvb2tlJywgJycpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAvL2xvZyhodG1sKTtcXG4gICAgICAgICAgICBpZiAoaHRtbC5pbmNsdWRlcygn55m75b2V55So5oi35peg6ZmQ5Yi2JykpIHtcXG4gICAgICAgICAgICAgICAgdmFyIGkgPSAwO1xcbiAgICAgICAgICAgICAgICBkbyB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgdHlpbWdsaW4gPSAnaHR0cHM6Ly95aXNvLmZ1bi9hcGkvdXNlci9sb2dpbi9jYXB0Y2hhP3Q9JyArIHBhcnNlSW50KG5ldyBEYXRlKCkuZ2V0VGltZSgpKSArICcnO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGltZyA9IGNvbnZlcnRCYXNlNjRJbWFnZSh0eWltZ2xpbikuc3BsaXQoJywnKVsxXTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2QgPSByZXF1ZXN0KCdodHRwczovL2FwaS54aG9mZS50b3Avb2NyL2I2NC90ZXh0Jywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogaW1nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ZXIgPSBKU09OLnBhcnNlKHJlcXVlc3QoJ2h0dHBzOi8veWlzby5mdW4vYXBpL3VzZXIvbG9naW4nLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVmZXJlcic6ICdodHRwczovL3lpc28uZnVuL2xvZ2luJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Nvb2tpZSc6IGdldENvb2tpZSh0eWltZ2xpbilcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInVzZXJOYW1lXFxcIjogdXNlci5hY2NvdW50LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiB1c2VyLnBhc3N3b3JkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiY29kZVxcXCI6IGNvZFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh2ZXIuY29kZSA9PSAyMDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ+aYk+aQnOeZu+WFpemqjOivgeaIkOWKnycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oJ3lpc291Y29va2UnLCBnZXRDb29raWUoJ2h0dHBzOi8veWlzby5mdW4nKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCA9IHJlcXVlc3QoXFxcImh0dHBzOi8veWlzby5mdW4vYXBpL3NlYXJjaD9uYW1lPVxcXCIgKyBzICsgXFxcIiZwYWdlTm89XFxcIiArIHBhZ2UsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcIlJlZmVyZXJcXFwiOiBcXFwiaHR0cHM6Ly95aXNvLmZ1bi9pbmZvP3NlYXJjaEtleT1cXFwiICsgcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJDb29raWVcXFwiOiBnZXRJdGVtKCd5aXNvdWNvb2tlJywgJycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGkrKztcXG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoaSA8IDQpO1xcblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgYXJyID0gSlNPTi5wYXJzZShodG1sKS5kYXRhLmxpc3Q7XFxuICAgICAgICAgICAgLy9sb2coYXJyKTtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGFycltpXTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBrZXllbihpdC51cmwpO1xcbiAgICAgICAgICAgICAgICAvL2xvZyh1KTtcXG4gICAgICAgICAgICAgICAgaWYgKHUgPT0gbnVsbCB8fCAhdS5pbmNsdWRlcyhcXFwiYWxpeXVuXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQubmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IChpdC5nbXRTaGFyZSB8fCBpdC5nbXRDcmVhdGUpICsgXFxcIlxcXFxuXFxcIiArICh1KSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi5bCP57q45p2hXFxcIixcXG4gICAgICAgIHBhZ2U6IGZhbHNlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBhbGlVdGlsID0gJC5yZXF1aXJlKFxcXCJhbGlVdGlsXFxcIik7XFxuXFxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0dG9rZW4oKSB7XFxuICAgICAgICAgICAgICAgIGlmIChnZXRNeVZhcigneHp5dG9rZW4nLCAnJykubGVuZ3RoID09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0b2tlbiA9IEpTT04ucGFyc2UocG9zdCgnaHR0cHM6Ly9naXRjYWZlLm5ldC90b29sL2FsaXBhcGVyLycsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vdS5naXRjYWZlLmluay8nXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2dldF90b2tlbidcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KSkuZGF0YTtcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCd4enR0b2tlbicsIHRva2VuKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TXlWYXIoJ3h6dHRva2VuJywgJycpO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBmdW5jdGlvbiBjYXRfY29kZShhKSB7XFxuICAgICAgICAgICAgICAgIHZhciBkLCBlLCBiID0gW1xcXCLljY7or63nlLXop4ZcXFwiLCBcXFwi5pel6Z+p55S16KeGXFxcIiwgXFxcIuasp+e+jueUteinhlxcXCIsIFxcXCLlhbbku5bnlLXop4ZcXFwiLCBcXFwi5Y2O6K+t55S15b2xXFxcIiwgXFxcIuaXpemfqeeUteW9sVxcXCIsIFxcXCLmrKfnvo7nlLXlvbFcXFwiLCBcXFwi5YW25LuW55S15b2xXFxcIiwgXFxcIuWNjuivreWKqOa8q1xcXCIsIFxcXCLml6Xpn6nliqjmvKtcXFwiLCBcXFwi5qyn576O5Yqo5ryrXFxcIiwgXFxcIue6quW9leeJh1xcXCIsIFxcXCLnu7zoibrniYdcXFwiLCBcXFwi5pWZ6IKy5Z+56K6tXFxcIiwgXFxcIuWFtuS7luinhumikVxcXCIsIFxcXCLljY7or63pn7PkuZBcXFwiLCBcXFwi5pel6Z+p6Z+z5LmQXFxcIiwgXFxcIuasp+e+jumfs+S5kFxcXCIsIFxcXCLlhbbku5bpn7PkuZBcXFwiLCBcXFwi5aix5LmQ6L2v5Lu2XFxcIiwgXFxcIuezu+e7n+i9r+S7tlxcXCIsIFxcXCLnvZHnu5zova/ku7ZcXFwiLCBcXFwi5Yqe5YWs6L2v5Lu2XFxcIiwgXFxcIuWFtuS7lui9r+S7tlxcXCIsIFxcXCLmvKvnlLtcXFwiLCBcXFwi5bCP6K+0XFxcIiwgXFxcIuWHuueJiOS5plxcXCIsIFxcXCLnn6Xor4bln7norq1cXFwiLCBcXFwi5YW25LuW5paH5qGjXFxcIiwgXFxcIuWjgee6uFxcXCIsIFxcXCLkurrnialcXFwiLCBcXFwi6aOO5pmvXFxcIiwgXFxcIuWFtuS7luWbvueJh1xcXCIsIFxcXCLlhbbku5ZcXFwiXSxcXG4gICAgICAgICAgICAgICAgICAgIGMgPSBbXFxcImh5ZHNcXFwiLCBcXFwicmhkc1xcXCIsIFxcXCJvbWRzXFxcIiwgXFxcInF0ZHNcXFwiLCBcXFwiaHlkeVxcXCIsIFxcXCJyaGR5XFxcIiwgXFxcIm9tZHlcXFwiLCBcXFwicXRkeVxcXCIsIFxcXCJoeWRtXFxcIiwgXFxcInJoZG1cXFwiLCBcXFwib21kbVxcXCIsIFxcXCJqbHBcXFwiLCBcXFwienlwXFxcIiwgXFxcImp5cHhcXFwiLCBcXFwicXRzcFxcXCIsIFxcXCJoeXl5XFxcIiwgXFxcInJoeXlcXFwiLCBcXFwib215eVxcXCIsIFxcXCJxdHl5XFxcIiwgXFxcImtmcmpcXFwiLCBcXFwieHRyalxcXCIsIFxcXCJ3bHJqXFxcIiwgXFxcImJncmpcXFwiLCBcXFwicXRyalxcXCIsIFxcXCJtaFxcXCIsIFxcXCJ4c1xcXCIsIFxcXCJjYnNcXFwiLCBcXFwienNweFxcXCIsIFxcXCJxdHdkXFxcIiwgXFxcImJ6XFxcIiwgXFxcInJ3XFxcIiwgXFxcImZqXFxcIiwgXFxcInF0dHBcXFwiLCBcXFwicXRcXFwiXTtcXG4gICAgICAgICAgICAgICAgZm9yIChkID0gMCwgZSA9IGMubGVuZ3RoOyBlID4gZDsgZCsrKVxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNbZF0gPT0gYSkgcmV0dXJuIGJbZF07XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSBwb3N0KFxcXCJodHRwczovL2dpdGNhZmUubmV0L3Rvb2wvYWxpcGFwZXIvXFxcIiwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3UuZ2l0Y2FmZS5pbmsvJ1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFxcXCJzZWFyY2hcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogXFxcIndlYlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICB0b2tlbjogZ2V0dG9rZW4oKSxcXG4gICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6IHNcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBKU09OLnBhcnNlKGh0bWwpO1xcbiAgICAgICAgICAgIGlmIChsaXN0LmRhdGEpIHtcXG4gICAgICAgICAgICAgICAgbGlzdCA9IGxpc3QuZGF0YTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGxpc3RbaV1cXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXQudGl0bGU7XFxuICAgICAgICAgICAgICAgIGxldCBtdXJsID0gJ2h0dHBzOi8vd3d3LmFsaXl1bmRyaXZlLmNvbS9zLycgKyBpdC5hbGlrZXlcXG4gICAgICAgICAgICAgICAgaWYgKCFhbGlVdGlsLmNoZWNrYWxpKG11cmwpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUuaW5jbHVkZXMocykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLiiJogXFxcIiArIHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IGNhdF9jb2RlKGl0LmNhdCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzOiBpdC5kZXNcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbXVybFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLnjqnlgbblk6Xlk6VcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGJhc2ljVXJsOiBcXFwiaHR0cDovL3dvZ2cueHl6XFxcIixcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gYmFzaWNVcmwgKyBcXFwiL2luZGV4LnBocC92b2RzZWFyY2gvXFxcIiArIHMgKyBcXFwiLS0tLS0tLS0tLVxcXCIgKyBwYWdlICsgXFxcIi0tLS5odG1sXFxcIjtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsKTtcXG4gICAgICAgICAgICBsZXQgYXJyID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCBcXFwiLm1vZHVsZS1pdGVtcyYmLm1vZHVsZS1zZWFyY2gtaXRlbVxcXCIpO1xcblxcbiAgICAgICAgICAgIGxldCBiZXQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1dGl0bGUgPSBwZGZoKGl0LCBcXFwiaDMmJmEmJlRleHRcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVzZXJpYWwgPSBwZGZoKGl0LCBcXFwiLnZpZGVvLXNlcmlhbCYmVGV4dFxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgdWltYWdlID0gcGRmaChpdCwgXFxcImltZyYmZGF0YS1zcmNcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwZChpdCwgXFxcImgzJiZhJiZocmVmXFxcIiwgYmFzaWNVcmwpO1xcbiAgICAgICAgICAgICAgICBiZXQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdXRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogdWltYWdlLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogdXNlcmlhbFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgcmV0dXJuIGJldDtcXG4gICAgICAgIH0sXFxuICAgICAgICBmaW5kQWxpVXJsKGlucHV0KSB7XFxuICAgICAgICAgICAgcmV0dXJuIHBkZmEocmVxdWVzdChpbnB1dCksIFxcXCJib2R5JiYubW9kdWxlLXJvdy10ZXh0LmNvcHlcXFwiKS5tYXAodiA9PiBwZGZoKHYsIFxcXCJhJiZkYXRhLWNsaXBib2FyZC10ZXh0XFxcIikpO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi6Zi/6YeM5LqR55uY572RXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBiYXNpY1VybDogXFxcImh0dHBzOi8vd3d3LmFseXB3LmNuXFxcIixcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gYmFzaWNVcmwgKyBcXFwiL3NlYXJjaC5waHA/cT1cXFwiICsgcyArIFxcXCImcGFnZT1cXFwiICsgcGFnZTtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsLCB7fSk7XFxuICAgICAgICAgICAgbGV0IGFyciA9IHBkZmEoaHRtbCwgXFxcIi5saXN0JiZsaVxcXCIpO1xcbiAgICAgICAgICAgIGxldCBiZXQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1dGl0bGUgPSBwZGZoKGl0LCBcXFwiYSYmdGl0bGVcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVzZXJpYWwgPSBwZGZoKGl0LCBcXFwiLmZhLWNsb2NrLW8mJlRleHRcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVpbWFnZSA9IHBkZmgoaXQsIFxcXCJpbWcmJnNyY1xcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBkKGl0LCBcXFwiYSYmaHJlZlxcXCIsIGJhc2ljVXJsKTtcXG4gICAgICAgICAgICAgICAgaWYgKCF1dGl0bGUuaW5jbHVkZXMocykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGJldC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB1dGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBwaWNfdXJsOiB1aW1hZ2UsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiB1c2VyaWFsXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICByZXR1cm4gYmV0O1xcbiAgICAgICAgfSxcXG4gICAgICAgIGZpbmRBbGlVcmwoaW5wdXQpIHtcXG4gICAgICAgICAgICByZXR1cm4gcGRmYShyZXF1ZXN0KGlucHV0KSwgXFxcImJvZHkmJmFbaHJlZl49aHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvXVxcXCIpLm1hcCh2ID0+IHBkZmgodiwgXFxcImEmJmhyZWZcXFwiKSk7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLlnJ/mi6jpvKBcXFwiLFxcbiAgICAgICAgcGFnZTogZmFsc2UsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSBmZXRjaCgnaHR0cHM6Ly93d3cudGJzZHkuY29tL3NlYXJjaC5odG1sP2tleXdvcmQ9JyArIHMgKyAnJmNhdGVnb3J5PTk4MzkyMCZkYXRhX3R5cGU9OTg3OTEwJywge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IFBDX1VBXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICBsZXQgYXJyID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCAnLnNlYXJjaF9yZXN1bHRfbmV0ZGlza19saXN0JiZhJyk7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIC8vbG9nKGl0KTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwYXJzZURvbUZvckh0bWwoaXQsICdhJiZocmVmJyk7XFxuICAgICAgICAgICAgICAgIGxldCB0aXQgPSBwYXJzZURvbUZvckh0bWwoaXQsICcubmV0ZGlza19pdGVtX2RldGFpbF9uYW1lJiZUZXh0Jyk7XFxuICAgICAgICAgICAgICAgIGlmICghdGl0LmluY2x1ZGVzKHMpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAvL2xvZyh1KTtcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXQsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFwiXFxcXG5cXFwiICsgdSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi6Zi/6YeM5pCcXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoJ2h0dHBzOi8vYWxpc28uY2Mvcy8nICsgcyArICctJyArIHBhZ2UgKyAnLTAuaHRtbCcsIHt9KTtcXG5cXG4gICAgICAgICAgICBsZXQgbGlzdCA9IHBhcnNlRG9tRm9yQXJyYXkoaHRtbCwgJy5zZWFyY2gtcmVzdWx0JiYucmVzb3VyY2UtaXRlbScpO1xcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGlzdC5sZW5ndGg7IGorKykge1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IGxpc3Rbal07XFxuICAgICAgICAgICAgICAgIGxldCB0aXQgPSBwYXJzZURvbUZvckh0bWwodSwgJ2gzJiZUZXh0Jyk7XFxuICAgICAgICAgICAgICAgIGlmICghdGl0LmluY2x1ZGVzKHMpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdCxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogcGFyc2VEb20odSwgJ2gzJiZhJiZocmVmJywgJ2h0dHBzOi8vYWxpc28uY2MvJyksXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBwYXJzZURvbUZvckh0bWwodSwgJy50aW1lJiZUZXh0JyksXFxuICAgICAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZDtcXG4gICAgICAgIH0sXFxuICAgICAgICBmaW5kQWxpVXJsKGlucHV0KSB7XFxuICAgICAgICAgICAgZXZhbChnZXRDcnlwdG9KUygpKTtcXG5cXG4gICAgICAgICAgICBmdW5jdGlvbiBkZWNyeShzdHIpIHtcXG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKFxcXCI5RUIyMERERkQ2QUZCRDY4XFxcIik7XFxuICAgICAgICAgICAgICAgIHZhciBlbmNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdChzdHIsIGtleSwge1xcbiAgICAgICAgICAgICAgICAgICAgaXY6IGtleSxcXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLFxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3XFxuICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3J5cHRlZDtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgICAgICBsZXQgYnV0ID0gcGFyc2VEb20oaHRtbCwgJy5idXR0b24mJmhyZWYnLCAnaHR0cHM6Ly9hbGlzby5jYy8nKTtcXG4gICAgICAgICAgICAvL2xvZyhidXQpO1xcbiAgICAgICAgICAgIGxldCBnb3QgPSByZXF1ZXN0KGJ1dCk7XFxuICAgICAgICAgICAgLy9sb2coZ290KTtcXG4gICAgICAgICAgICBldmFsKHBhcnNlRG9tRm9ySHRtbChnb3QsICdoZWFkJiZzY3JpcHQsMSYmSHRtbCcpKTtcXG4gICAgICAgICAgICByZXR1cm4gZGVjcnkoYmFzZTY0LnNwbGl0KCchJylbMF0pO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi5LqR55uY5YiG5Lqr56S+XFxcIixcXG4gICAgICAgIHBhZ2U6IGZhbHNlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBhbGlVdGlsID0gJC5yZXF1aXJlKFxcXCJhbGlVdGlsXFxcIik7XFxuICAgICAgICAgICAgbGV0IENyeXB0b0pTID0gYWxpVXRpbC5nZXRDcnlwdG9KUygpO1xcblxcbiAgICAgICAgICAgIGZ1bmN0aW9uIGRlY3J5KHN0cikge1xcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoXFxcIjVGNkIyQUszM0RBU0QxMjNcXFwiKTtcXG4gICAgICAgICAgICAgICAgdmFyIGVuY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHN0ciwga2V5LCB7XFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkVDQixcXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzN1xcbiAgICAgICAgICAgICAgICB9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBlbmNyeXB0ZWQ7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChcXFwiaHR0cHM6Ly93d3cueXVucGFuZmVueGlhbmcuY24vYXBpL2Jicy9hcGkvZ2V0ZGF0YT9rZXk9XFxcIiArIHMgKyBcXFwiJnR5cGU9dmlkZW9cXFwiLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vd3d3Lnl1bnBhbmZlbnhpYW5nLmNuL1xcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxldCBqc29uID0gZGVjcnkoSlNPTi5wYXJzZShodG1sKS5kYXRhKTtcXG4gICAgICAgICAgICBsZXQgYXJyID0gSlNPTi5wYXJzZShqc29uKTtcXG5cXG4gICAgICAgICAgICBsZXQgYmV0ID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdXJsID0gaXQucGlkO1xcbiAgICAgICAgICAgICAgICBiZXQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJodHRwczovL3d3dy55dW5wYW5mZW54aWFuZy5jbi9hcGkvYmJzL2FwaS9nZXRhcnRpY2xlP2lkPVxcXCIgKyB1cmwsXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXQudGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBpdC5jcmVhdGV0aW1lXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICByZXR1cm4gYmV0O1xcbiAgICAgICAgfSxcXG4gICAgICAgIGZpbmRBbGlVcmwoaW5wdXQpIHtcXG4gICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UocmVxdWVzdChpbnB1dCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3d3dy55dW5wYW5mZW54aWFuZy5jbi9cXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KSkuZGF0YTtcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IGpzb24uZG93bmxvYWQuc3BsaXQoXFxcIkBcXFwiKTtcXG4gICAgICAgICAgICBsZXQgYWxpc3QgPSBuZXcgU2V0KCk7XFxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7XFxuICAgICAgICAgICAgICAgIGFsaXN0LmFkZChcXFwiaHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvXFxcIiArIGxpc3Rbal0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShhbGlzdCk7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLnm5jmkJxcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBwYWdlID0gKHBhZ2UgLSAxKSAqIDEwO1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFwiaHR0cHM6Ly93d3cucGFuc2VhcmNoLm1lL3NlYXJjaD9rZXl3b3JkPVxcXCIgKyBzICsgXFxcIiZvZmZzZXQ9XFxcIiArIHBhZ2UgKyBcXFwiJnBhbj1hbGl5dW5kcml2ZVxcXCI7XFxuICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KHVybCwge30pO1xcblxcbiAgICAgICAgICAgIGxldCBhcnIgPSBwYXJzZURvbUZvckFycmF5KGh0bWwsICcuZ3JpZCYmLnNoYWRvdzpoYXMoYVtocmVmXj1odHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy9dKScpO1xcbiAgICAgICAgICAgIC8vbG9nKGFycik7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gcGFyc2VEb21Gb3JIdG1sKGl0LCAnYVtocmVmXj1odHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy9dJiZocmVmJyk7XFxuICAgICAgICAgICAgICAgIGxldCBwaWNfdXJsID0gcGFyc2VEb21Gb3JIdG1sKGl0LCAnaW1nJiZzcmMnKTtcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwYXJzZURvbUZvckh0bWwoaXQsICcuYnJlYWstYWxsJiZUZXh0Jykuc3BsaXQoJ2h0dHAnKVswXSxcXG4gICAgICAgICAgICAgICAgICAgIHBpY191cmw6IHBpY191cmwgPT09IFxcXCIvZmF2aWNvbi5wbmdcXFwiID8gXFxcImh0dHBzOi8vd3d3LnBhbnNlYXJjaC5tZS9cXFwiICsgcGljX3VybCA6IHBpY191cmwsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBwYXJzZURvbUZvckh0bWwoaXQsICdwJiZUZXh0JykgKyBcXFwiXFxcXG5cXFwiICsgdSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwiRE9WWOaQnFxcXCIsXFxuICAgICAgICBwYWdlOiBmYWxzZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcImh0dHBzOi8vYXBpLmRvdngudGsvYWxpL3NlYXJjaD93ZD1cXFwiICsgcztcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsKTtcXG4gICAgICAgICAgICBsZXQgYXJyID0gSlNPTi5wYXJzZShodG1sKS5saXN0O1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgbGV0IGFsaVV0aWwgPSAkLnJlcXVpcmUoXFxcImFsaVV0aWxcXFwiKTtcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXQgPSBhcnJbaV07XFxuICAgICAgICAgICAgICAgIGxldCB1ID0gaXQudm9kX2NvbnRlbnQ7XFxuICAgICAgICAgICAgICAgIGlmICghdS5pbmNsdWRlcyhcXFwiYWxpeXVuZHJpdmVcXFwiKSB8fCAhYWxpVXRpbC5jaGVja2FsaSh1KSkge1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi4oiaIFxcXCIgKyBpdC52b2RfbmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIHBpY191cmw6IGl0LnZvZF9waWMsXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBcXFwiXFxcXG5cXFwiICsgdSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiBcXFwi5b+F5bqUXFxcIixcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IFxcXCJodHRwczovL2NuLmJpbmcuY29tL3NlYXJjaD9xPVxcXCIgKyBzICsgXFxcIithbGl5dW5kcml2ZSZxcz1kcyZmb3JtPVFCUkVcXFwiO1xcbiAgICAgICAgICAgIGlmIChwYWdlICE9IDEpIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gZ2V0TXlWYXIoXFxcImJpbmdcXFwiLCB1cmwpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QodXJsLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vY24uYmluZy5jb20vXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIC8vXFxcIlgtUmVxdWVzdGVkLVdpdGhcXFwiOiBcXFwiY29tLmV4YW1wbGUuaGlrZXJ2aWV3XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJBY2NlcHRcXFwiOiBcXFwidGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksaW1hZ2UvYXZpZixpbWFnZS93ZWJwLGltYWdlL2FwbmcsKi8qO3E9MC44LGFwcGxpY2F0aW9uL3NpZ25lZC1leGNoYW5nZTt2PWIzO3E9MC45XFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGV0IGFyciA9IHBkZmEoaHRtbCwgXFxcImJvZHkmJmFcXFwiKTtcXG4gICAgICAgICAgICAvL2xvZyhhcnIpO1xcbiAgICAgICAgICAgIGxldCBkID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdSA9IHBkKGl0LCBcXFwiYSYmaHJlZlxcXCIsIHVybCk7XFxuICAgICAgICAgICAgICAgIGxldCB0ID0gcGRmaChpdCwgXFxcImEmJlRleHRcXFwiKTtcXG4gICAgICAgICAgICAgICAgaWYgKGl0LmluY2x1ZGVzKFxcXCJOZXh0IHBhZ2VcXFwiKSB8fCBpdC5pbmNsdWRlcyhcXFwi5LiL5LiA6aG1XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1MiA9IHBkKGl0LCBcXFwiYSYmaHJlZlxcXCIsIHVybCk7XFxuICAgICAgICAgICAgICAgICAgICAvL2xvZyhcXFwibmV4dCBwYWdlXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAvL2xvZyh1Mik7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiYmluZ1xcXCIsIHUyKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAodSA9PSBudWxsIHx8IHQgPT0gbnVsbCB8fCAhaXQuaW5jbHVkZXMocykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmICghaXQuaW5jbHVkZXMoXFxcIue9keebmFxcXCIpICYmICFpdC5pbmNsdWRlcyhcXFwi5LqR55uYXFxcIikgJiZcXG4gICAgICAgICAgICAgICAgICAgICFpdC5pbmNsdWRlcyhcXFwiYWxpeXVuZHJpdmVcXFwiKSAmJiAhaXQuaW5jbHVkZXMoXFxcInl1bnBhblxcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAodS5zdGFydHNXaXRoKFxcXCJodHRwczovL2NuLmJpbmcuY29tL1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgZG9tID0gZ2V0SG9tZSh1KS5yZXBsYWNlKFxcXCJodHRwOi8vXFxcIiwgXFxcIlxcXCIpLnJlcGxhY2UoXFxcImh0dHBzOi8vXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgX2xpbmtzID0gdC5tYXRjaCgvaHR0cHM6XFxcXC9cXFxcLyh3d3dcXFxcLmFsaXl1bmRyaXZlXFxcXC5jb21cXFxcL3N8YWx5d3BcXFxcLm5ldClcXFxcL1xcXFx3Ki9nKSB8fCBbXTtcXG4gICAgICAgICAgICAgICAgbGV0IGMgPSBudWxsO1xcbiAgICAgICAgICAgICAgICBpZiAoX2xpbmtzLmxlbmd0aCA+IDEgJiYgX2xpbmtzWzFdLnJlcGxhY2UoX2xpbmtzWzBdLCBcXFwiXFxcIikucmVwbGFjZSgvW2EtekEtWjAtOV0rL2csIFxcXCJcXFwiKSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgYyA9IF9saW5rc1sxXTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfbGlua3MubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgYyA9IF9saW5rc1swXTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHQsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBkb20sXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGMgIT0gbnVsbCA/IGMgOiB1LFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi6L+b5YWl572R56uZXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganM6IEpTT04uc3RyaW5naWZ5KFxcXCJoaWtlcjovL3BhZ2UveXNmeD93ZWJVcmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudCh1KSlcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9LFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcbiAgICAgICAgICAgIGlmIChpbnB1dC5pbmNsdWRlcyhcXFwiYWxpeXVuZHJpdmVcXFwiKSkgcmV0dXJuIGlucHV0O1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICAgICAgdmFyIF9saW5rcyA9IGh0bWwubWF0Y2goL2h0dHBzOlxcXFwvXFxcXC8od3d3XFxcXC5hbGl5dW5kcml2ZVxcXFwuY29tXFxcXC9zfGFseXdwXFxcXC5uZXQpXFxcXC9cXFxcdyovZykgfHwgW107XFxuICAgICAgICAgICAgaWYgKF9saW5rcy5sZW5ndGggPiAxICYmIF9saW5rc1sxXS5yZXBsYWNlKF9saW5rc1swXSwgXFxcIlxcXCIpLnJlcGxhY2UoL1thLXpBLVowLTldKy9nLCBcXFwiXFxcIikgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rc1sxXTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKF9saW5rcy5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBfbGlua3NbMF07XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UveXNmeD93ZWJVcmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiAnQ0NPRicsXFxuICAgICAgICBwYWdlOiB0cnVlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBkID0gW11cXG4gICAgICAgICAgICBsZXQgYWxpVXRpbCA9ICQucmVxdWlyZShcXFwiYWxpVXRpbFxcXCIpO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gZmV0Y2goJ2h0dHBzOi8vcGFuLmNjb2YuY2MvYXBpL3NlYXJjaCcsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcImNvbnRlbnQtdHlwZVxcXCI6ICdhcHBsaWNhdGlvbi9qc29uJyxcXG4gICAgICAgICAgICAgICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vcGFuLmNjb2YuY2Mvc2VhcmNoP2tleXdvcmQ9JyArIHNcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhZ2VTaXplXFxcIjogMjAsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFnZU51bVxcXCI6IHBhZ2UsXFxuICAgICAgICAgICAgICAgICAgICBcXFwia2V5d29yZFxcXCI6IHMsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiZnJvbU1vYmlsZVxcXCI6IHRydWVcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIGxldCBsaXN0ID0gSlNPTi5wYXJzZShodG1sKVxcbiAgICAgICAgICAgICAgICAuZGF0YS5yb3dzXFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdCA9IGxpc3RbaV07XFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0LmZpbGVOYW1lXFxuICAgICAgICAgICAgICAgIGxldCBtdXJsID0gaXQudXJsXFxuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gaXQudHlwZS5yZXBsYWNlKC9mb2xkZXIvLCAn5paH5Lu25aS5JykucmVwbGFjZSgvZmlsZS8sICfmlofku7YnKVxcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUuaW5jbHVkZXMocykpIHtcXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6ICfmlofku7bnsbvlnovvvJonICsgdHlwZSArICfvvIzmlofku7blpKflsI/vvJonICsgYWxpVXRpbC5ieXRlc1RvU2l6ZShpdC5zaXplKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG11cmxcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGRcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAge1xcbiAgICAgICAgbmFtZTogJ+mYv+mHjOWwj+ermScsXFxuICAgICAgICBwYWdlOiB0cnVlLFxcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCBob21lID0gXFxcImh0dHBzOi8vcGFuNjY2Lm5ldFxcXCI7XFxuICAgICAgICAgICAgbGV0IGQgPSBbXTtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoYnVpbGRVcmwoaG9tZSArIFxcXCIvYXBpL2Rpc2N1c3Npb25zXFxcIiwge1xcbiAgICAgICAgICAgICAgICBcXFwiaW5jbHVkZVxcXCI6IFxcXCJ1c2VyLGxhc3RQb3N0ZWRVc2VyLG1vc3RSZWxldmFudFBvc3QsbW9zdFJlbGV2YW50UG9zdC51c2VyLHRhZ3MsdGFncy5wYXJlbnQsZmlyc3RQb3N0XFxcIixcXG4gICAgICAgICAgICAgICAgXFxcImZpbHRlcltxXVxcXCI6IHMgLyogKyBcXFwiIHRhZzp2aWRlbyxjb21pY1xcXCIqLyAsXFxuICAgICAgICAgICAgICAgIC8vXFxcImZpbHRlclt0YWddXFxcIjogXFxcInZpZGVvLGNvbWljXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcInBhZ2Vbb2Zmc2V0XVxcXCI6IDIwICogKHBhZ2UgLSAxKVxcbiAgICAgICAgICAgIH0pLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJjb250ZW50LXR5cGVcXFwiOiBcXFwiYXBwbGljYXRpb24vanNvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IFxcXCJodHRwczovL3BhbjY2Ni5uZXQvP3E9XFxcIiArIHNcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gSlNPTi5wYXJzZShodG1sKS5kYXRhO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IGxpc3RbaV0uYXR0cmlidXRlcztcXG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGhvbWUgKyBcXFwiL2QvXFxcIiArIGl0ZW0uc2x1ZztcXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogJ+WPkeW4g+aXtumXtO+8micgKyAkLmRhdGVGb3JtYXQobmV3IERhdGUoaXRlbS5jcmVhdGVkQXQpLCBcXFwieXl5eS1NTS1kZCBISDptbTpzc1xcXCIpLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLov5vlhaXluJblrZBcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqczogSlNPTi5zdHJpbmdpZnkoXFxcImhpa2VyOi8vcGFnZS95c2Z4P3dlYlVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVybCkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBkO1xcbiAgICAgICAgfSxcXG4gICAgICAgIGZpbmRBbGlVcmwoaW5wdXQpIHtcXG4gICAgICAgICAgICBsZXQgaHRtbCA9IHBkZmgocmVxdWVzdChpbnB1dCksIFxcXCJUZXh0XFxcIik7XFxuICAgICAgICAgICAgbGV0IF9saW5rcyA9IGh0bWwubWF0Y2goL2h0dHBzOlxcXFwvXFxcXC8od3d3XFxcXC5hbGl5dW5kcml2ZVxcXFwuY29tXFxcXC9zfGFseXdwXFxcXC5uZXQpXFxcXC9cXFxcdyovZykgfHwgW107XFxuICAgICAgICAgICAgbGV0IHNoYXJlUHdkID0gaHRtbC5tYXRjaCgv5o+Q5Y+W56CBWzrvvJpdXFxcXHMqPyhcXFxcd3s0fSkvKTtcXG4gICAgICAgICAgICBzaGFyZVB3ZCA9IEFycmF5LmlzQXJyYXkoc2hhcmVQd2QpICYmIHNoYXJlUHdkLmxlbmd0aCA+IDAgPyBzaGFyZVB3ZFsxXSA6IFxcXCJcXFwiO1xcbiAgICAgICAgICAgIGlmIChfbGlua3MubGVuZ3RoID4gMSAmJiBfbGlua3NbMV0ucmVwbGFjZShfbGlua3NbMF0sIFxcXCJcXFwiKS5yZXBsYWNlKC9bYS16QS1aMC05XSsvZywgXFxcIlxcXCIpID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgICAgICBhbGlVcmw6IF9saW5rc1sxXSxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBzaGFyZVB3ZFxcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoX2xpbmtzLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgICAgIGFsaVVybDogX2xpbmtzWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxuICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UveXNmeD93ZWJVcmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChpbnB1dCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB7XFxuICAgICAgICBuYW1lOiAn5LqR55uY5YiG5Lqr56S+5Yy6JyxcXG4gICAgICAgIHBhZ2U6IHRydWUsXFxuICAgICAgICBmaW5kOiBmdW5jdGlvbihzLCBwYWdlKSB7XFxuICAgICAgICAgICAgbGV0IGhvbWUgPSBcXFwiaHR0cHM6Ly95dW5wYW4xLmNjXFxcIjtcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChidWlsZFVybChob21lICsgXFxcIi9hcGkvZGlzY3Vzc2lvbnNcXFwiLCB7XFxuICAgICAgICAgICAgICAgIFxcXCJpbmNsdWRlXFxcIjogXFxcInVzZXIsbGFzdFBvc3RlZFVzZXIsbW9zdFJlbGV2YW50UG9zdCxtb3N0UmVsZXZhbnRQb3N0LnVzZXIsdGFncyx0YWdzLnBhcmVudCxmaXJzdFBvc3RcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiZmlsdGVyW3FdXFxcIjogcyAvKiArIFxcXCIgdGFnOnZpZGVvLGNvbWljXFxcIiovICxcXG4gICAgICAgICAgICAgICAgLy9cXFwiZmlsdGVyW3RhZ11cXFwiOiBcXFwidmlkZW8sY29taWNcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwicGFnZVtvZmZzZXRdXFxcIjogMjAgKiAocGFnZSAtIDEpXFxuICAgICAgICAgICAgfSksIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcImNvbnRlbnQtdHlwZVxcXCI6IFxcXCJhcHBsaWNhdGlvbi9qc29uXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJSZWZlcmVyXFxcIjogXFxcImh0dHBzOi8vcGFuNjY2Lm5ldC8/cT1cXFwiICsgc1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBKU09OLnBhcnNlKGh0bWwpLmRhdGE7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGxldCBpdGVtID0gbGlzdFtpXS5hdHRyaWJ1dGVzO1xcbiAgICAgICAgICAgICAgICBsZXQgdXJsID0gaG9tZSArIFxcXCIvZC9cXFwiICsgaXRlbS5zbHVnO1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0ZW0udGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiAn5Y+R5biD5pe26Ze077yaJyArICQuZGF0ZUZvcm1hdChuZXcgRGF0ZShpdGVtLmNyZWF0ZWRBdCksIFxcXCJ5eXl5LU1NLWRkIEhIOm1tOnNzXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXFxcIui/m+WFpeW4luWtkFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzOiBKU09OLnN0cmluZ2lmeShcXFwiaGlrZXI6Ly9wYWdlL3lzZng/d2ViVXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQodXJsKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9LFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcGRmaChyZXF1ZXN0KGlucHV0KSwgXFxcIlRleHRcXFwiKTtcXG4gICAgICAgICAgICBsZXQgX2xpbmtzID0gaHRtbC5tYXRjaCgvaHR0cHM6XFxcXC9cXFxcLyh3d3dcXFxcLmFsaXl1bmRyaXZlXFxcXC5jb21cXFxcL3N8YWx5d3BcXFxcLm5ldClcXFxcL1xcXFx3Ki9nKSB8fCBbXTtcXG4gICAgICAgICAgICBsZXQgc2hhcmVQd2QgPSBodG1sLm1hdGNoKC/mj5Dlj5bnoIFbOu+8ml1cXFxccyo/KFxcXFx3ezR9KS8pO1xcbiAgICAgICAgICAgIHNoYXJlUHdkID0gQXJyYXkuaXNBcnJheShzaGFyZVB3ZCkgJiYgc2hhcmVQd2QubGVuZ3RoID4gMCA/IHNoYXJlUHdkWzFdIDogXFxcIlxcXCI7XFxuICAgICAgICAgICAgaWYgKF9saW5rcy5sZW5ndGggPiAxICYmIF9saW5rc1sxXS5yZXBsYWNlKF9saW5rc1swXSwgXFxcIlxcXCIpLnJlcGxhY2UoL1thLXpBLVowLTldKy9nLCBcXFwiXFxcIikgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgICAgIGFsaVVybDogX2xpbmtzWzFdLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxuICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChfbGlua3MubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICAgICAgYWxpVXJsOiBfbGlua3NbMF0sXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2RcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS95c2Z4P3dlYlVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGlucHV0KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH0sIHtcXG4gICAgICAgIG5hbWU6IFxcXCLniLHnnIvnvo7liadcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHMsIHBhZ2UpIHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gXFxcImh0dHBzOi8vd3d3LjJrbWouY24vc2VhcmNoLnBocD9xPVxcXCIgKyBzICsgXFxcIiZwYWdlL1xcXCIgKyBwYWdlICsgXFxcIi9cXFwiO1xcbiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdCh1cmwpO1xcbiAgICAgICAgICAgIGxldCBhcnIgPSBwYXJzZURvbUZvckFycmF5KGh0bWwsIFxcXCIubGlzdC1pdCYmbGlcXFwiKTtcXG5cXG4gICAgICAgICAgICBsZXQgYmV0ID0gW107XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gYXJyW2ldO1xcbiAgICAgICAgICAgICAgICBsZXQgdXRpdGxlID0gcGFyc2VEb21Gb3JIdG1sKGl0LCBcXFwiYSYmdGl0bGVcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVzZXJpYWwgPSBwYXJzZURvbUZvckh0bWwoaXQsIFxcXCIuaW5mbyYmc3Bhbjpub3QoOmhhcyhhKSktLWkmJlRleHRcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHVpbWFnZSA9IHBhcnNlRG9tKGl0LCBcXFwiaW1nJiZzcmNcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IHUgPSBwYXJzZURvbShpdCwgXFxcImEmJmhyZWZcXFwiKTtcXG4gICAgICAgICAgICAgICAgYmV0LnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHV0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogdSxcXG4gICAgICAgICAgICAgICAgICAgIHBpY191cmw6IHVpbWFnZSxcXG4gICAgICAgICAgICAgICAgICAgIGRlc2M6IHVzZXJpYWxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIHJldHVybiBiZXQ7XFxuXFxuICAgICAgICB9LFxcbiAgICAgICAgZmluZEFsaVVybChpbnB1dCkge1xcbiAgICAgICAgICAgIHJldHVybiBwZGZhKHJlcXVlc3QoaW5wdXQpLCBcXFwiYm9keSYmI2Rvd25sb2FkXFxcIikubWFwKHYgPT4gcGRmaCh2LCBcXFwiLmRvd24mJmhyZWZcXFwiKSk7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIHtcXG4gICAgICAgIG5hbWU6IFxcXCLlpYflppnmkJzntKJcXFwiLFxcbiAgICAgICAgcGFnZTogdHJ1ZSxcXG4gICAgICAgIGZpbmQocywgcGFnZSkge1xcbiAgICAgICAgICAgIGxldCB1cmw7XFxuICAgICAgICAgICAgaWYgKHBhZ2UgPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gYnVpbGRVcmwoXFxcImh0dHBzOi8vd3d3Lm1hZ2ljYWxzZWFyY2gudG9wL2FwaS9wc2hvdS9nZXREYXRhXFxcIiwge1xcbiAgICAgICAgICAgICAgICAgICAgd29yZDogcyxcXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFxcXCLpmL/ph4znvZHnm5hcXFwiXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IGJ1aWxkVXJsKFxcXCJodHRwczovL3d3dy5tYWdpY2Fsc2VhcmNoLnRvcC9hcGkvcHNob3UvZ2V0TmV4dFBhZ2VcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICB1cmw6IFxcXCJodHRwczovL2FwaS51cHl1bnNvMi5jb20vc2VhcmNoP3NfdHlwZT0yQHBhZ2U9XFxcIiArIHBhZ2UgKyBcXFwiQGtleXdvcmQ9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChzKSxcXG4gICAgICAgICAgICAgICAgICAgIHdlYnNpdGU6IFxcXCLpmL/ph4znvZHnm5hcXFwiXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdCh1cmwsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgUmVmZXJlcjogYnVpbGRVcmwoXFxcImh0dHBzOi8vd3d3Lm1hZ2ljYWxzZWFyY2gudG9wL3NlYXJjaFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JkOiBzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNwYWdlOiAwXFxuICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3VsdCkpO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gcmVzdWx0LnJlc3VsdC5pdGVtcztcXG4gICAgICAgICAgICBsZXQgZCA9IFtdO1xcbiAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGl0LmlkID09IC0xKSB7XFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGl0LnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcIuaXpeacn++8mlxcXCIgKyBpdC5pbnNlcnRfdGltZSArIFxcXCJcXFxcbui3r+W+hO+8mlxcXCIgKyBpdC5wYXRoLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBpdC5wYWdlX3VybFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIGQ7XFxuICAgICAgICB9XFxuICAgIH1cXG5dO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5paH5Lu25o6S5bqPXCIsXCJwYXRoXCI6XCJGaWxlU29ydGluZ1wiLFwicnVsZVwiOlwibGV0IGNobk51bUNoYXIgPSB7XFxuICAgIOmbtjogMCxcXG4gICAg5LiAOiAxLFxcbiAgICDkuow6IDIsXFxuICAgIOS4iTogMyxcXG4gICAg5ZubOiA0LFxcbiAgICDkupQ6IDUsXFxuICAgIOWFrTogNixcXG4gICAg5LiDOiA3LFxcbiAgICDlhas6IDgsXFxuICAgIOS5nTogOVxcbn07XFxuXFxubGV0IGNobk5hbWVWYWx1ZSA9IHtcXG4gICAg5Y2BOiB7XFxuICAgICAgICB2YWx1ZTogMTAsXFxuICAgICAgICBzZWNVbml0OiBmYWxzZVxcbiAgICB9LFxcbiAgICDnmb46IHtcXG4gICAgICAgIHZhbHVlOiAxMDAsXFxuICAgICAgICBzZWNVbml0OiBmYWxzZVxcbiAgICB9LFxcbiAgICDljYM6IHtcXG4gICAgICAgIHZhbHVlOiAxMDAwLFxcbiAgICAgICAgc2VjVW5pdDogZmFsc2VcXG4gICAgfSxcXG4gICAg5LiHOiB7XFxuICAgICAgICB2YWx1ZTogMTAwMDAsXFxuICAgICAgICBzZWNVbml0OiB0cnVlXFxuICAgIH0sXFxuICAgIOS6vzoge1xcbiAgICAgICAgdmFsdWU6IDEwMDAwMDAwMCxcXG4gICAgICAgIHNlY1VuaXQ6IHRydWVcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBDaGluZXNlVG9OdW1iZXIoY2huU3RyKSB7XFxuICAgIGxldCBydG4gPSAwO1xcbiAgICBsZXQgc2VjdGlvbiA9IDA7XFxuICAgIGxldCBudW1iZXIgPSAwO1xcbiAgICBsZXQgc2VjVW5pdCA9IGZhbHNlO1xcbiAgICBsZXQgc3RyID0gY2huU3RyLnNwbGl0KCcnKTtcXG5cXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgIGxldCBudW0gPSBjaG5OdW1DaGFyW3N0cltpXV07XFxuICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gJ3VuZGVmaW5lZCcpIHtcXG4gICAgICAgICAgICBudW1iZXIgPSBudW07XFxuICAgICAgICAgICAgaWYgKGkgPT09IHN0ci5sZW5ndGggLSAxKSB7XFxuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gbnVtYmVyO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IHVuaXQgPSBjaG5OYW1lVmFsdWVbc3RyW2ldXS52YWx1ZTtcXG4gICAgICAgICAgICBzZWNVbml0ID0gY2huTmFtZVZhbHVlW3N0cltpXV0uc2VjVW5pdDtcXG4gICAgICAgICAgICBpZiAoc2VjVW5pdCkge1xcbiAgICAgICAgICAgICAgICBzZWN0aW9uID0gKHNlY3Rpb24gKyBudW1iZXIpICogdW5pdDtcXG4gICAgICAgICAgICAgICAgcnRuICs9IHNlY3Rpb247XFxuICAgICAgICAgICAgICAgIHNlY3Rpb24gPSAwO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gKG51bWJlciAqIHVuaXQpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBudW1iZXIgPSAwO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiBydG4gKyBzZWN0aW9uO1xcbn1cXG5cXG5mdW5jdGlvbiBuYW1lQ29tcGFyZShhLCBiKSB7XFxuICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKVxcbiAgICAgICAgcmV0dXJuIGEgPT0gbnVsbCA/IGIgPT0gbnVsbCA/IDAgOiAtMSA6IDE7XFxuXFxuICAgIGEgPSBhLnJlcGxhY2UoLyhb6Zu25LiA5LqM5LiJ5Zub5LqU5YWt5LiD5YWr5Lmd5Y2B55m+5Y2D5LiH5Lq/XSkvZywgZnVuY3Rpb24obWF0Y2gsIHAxLCBwMiwgcDMsIG9mZnNldCwgc3RyaW5nKSB7XFxuICAgICAgICAvLyBwMSBpcyBub25kaWdpdHMsIHAyIGRpZ2l0cywgYW5kIHAzIG5vbi1hbHBoYW51bWVyaWNzXFxuICAgICAgICByZXR1cm4gQ2hpbmVzZVRvTnVtYmVyKHAxKTtcXG4gICAgfSlcXG4gICAgYiA9IGIucmVwbGFjZSgvKFvpm7bkuIDkuozkuInlm5vkupTlha3kuIPlhavkuZ3ljYHnmb7ljYPkuIfkur9dKS9nLCBmdW5jdGlvbihtYXRjaCwgcDEsIHAyLCBwMywgb2Zmc2V0LCBzdHJpbmcpIHtcXG4gICAgICAgIC8vIHAxIGlzIG5vbmRpZ2l0cywgcDIgZGlnaXRzLCBhbmQgcDMgbm9uLWFscGhhbnVtZXJpY3NcXG4gICAgICAgIHJldHVybiBDaGluZXNlVG9OdW1iZXIocDEpO1xcbiAgICB9KVxcblxcbiAgICBsZXQgTlVNQkVSUyA9IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuLmNvbXBpbGUoXFxcIig/PD1cXFxcXFxcXEQpKD89XFxcXFxcXFxkKXwoPzw9XFxcXFxcXFxkKSg/PVxcXFxcXFxcRClcXFwiKVxcbiAgICBsZXQgc3BsaXQxID0gTlVNQkVSUy5zcGxpdChuZXcgamF2YS5sYW5nLlN0cmluZyhhKSk7XFxuICAgIGxldCBzcGxpdDIgPSBOVU1CRVJTLnNwbGl0KG5ldyBqYXZhLmxhbmcuU3RyaW5nKGIpKTtcXG5cXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihzcGxpdDEubGVuZ3RoLCBzcGxpdDIubGVuZ3RoKTsgaSsrKSB7XFxuICAgICAgICBsZXQgYzEgPSBzcGxpdDFbaV0uY2hhckNvZGVBdCgwKTtcXG4gICAgICAgIGxldCBjMiA9IHNwbGl0MltpXS5jaGFyQ29kZUF0KDApO1xcbiAgICAgICAgbGV0IGNtcCA9IDA7XFxuICAgICAgICBsZXQgemVyb0NoYXJDb2RlID0gJzAnLmNoYXJDb2RlQXQoMCk7XFxuICAgICAgICBsZXQgbmluZUNoYXJDb2RlID0gJzknLmNoYXJDb2RlQXQoMCk7XFxuXFxuICAgICAgICBpZiAoYzEgPj0gemVyb0NoYXJDb2RlICYmIGMxIDw9IG5pbmVDaGFyQ29kZSAmJiBjMiA+PSB6ZXJvQ2hhckNvZGUgJiYgYzIgPD0gbmluZUNoYXJDb2RlKSB7XFxuICAgICAgICAgICAgY21wID0gbmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKHNwbGl0MVtpXSkuY29tcGFyZVRvKG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcihzcGxpdDJbaV0pKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGlmIChjbXAgPT09IDApIHtcXG4gICAgICAgICAgICBsZXQgcmVnZXggPSAvW2EtekEtWjAtOV0vXFxuICAgICAgICAgICAgbGV0IHMxID0gU3RyaW5nKHNwbGl0MVtpXSlcXG4gICAgICAgICAgICBsZXQgczIgPSBTdHJpbmcoc3BsaXQyW2ldKVxcbiAgICAgICAgICAgIGlmIChyZWdleC50ZXN0KHMxKSB8fCByZWdleC50ZXN0KHMyKSkge1xcbiAgICAgICAgICAgICAgICBjbXAgPSBuZXcgamF2YS5sYW5nLlN0cmluZyhzcGxpdDFbaV0pLmNvbXBhcmVUbyhuZXcgamF2YS5sYW5nLlN0cmluZyhzcGxpdDJbaV0pKTtcXG4gICAgICAgICAgICAgICAgLy8gY21wID0gczEubG9jYWxlQ29tcGFyZShzMiwgJ2VuJylcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBjbXAgPSBzMS5sb2NhbGVDb21wYXJlKHMyLCAnemgnKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGlmIChjbXAgIT09IDApIHtcXG4gICAgICAgICAgICByZXR1cm4gY21wO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxldCBsZW5ndGhDbXAgPSBzcGxpdDEubGVuZ3RoIC0gc3BsaXQyLmxlbmd0aDtcXG4gICAgLy8gaWYgKGxlbmd0aENtcCAhPT0gMCkgbGVuZ3RoQ21wID0gbGVuZ3RoQ21wID4gMCA/IC0xIDogMTtcXG4gICAgcmV0dXJuIGxlbmd0aENtcDtcXG59XFxuJC5leHBvcnRzLm5hbWVDb21wYXJlID0gbmFtZUNvbXBhcmU7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnmbvlvZXmlrnlvI9cIixcInBhdGhcIjpcImxvZ2luTW9kZVwiLFwicnVsZVwiOlwiJC5leHBvcnRzID0gJChbXFxcIkFQUOaOiOadg+eZu+W9lVxcXCIsIFxcXCLnvZHpobXnmbvlvZXikaBcXFwiLCBcXFwi572R6aG155m75b2V4pGhXFxcIiwgXFxcIlRPS0VO55m75b2VXFxcIl0sIDEsIFxcXCLnmbvlvZXmlrnlvI9cXFwiKS5zZWxlY3QoKCkgPT4ge1xcbiAgICBpZiAoXFxcIue9kemhteeZu+W9leKRoFxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9wYWdlVGl0bGU955m75b2V6Zi/6YeM5LqR55uYXFxcIlxcbiAgICB9XFxuICAgIGlmIChcXFwi572R6aG155m75b2V4pGhXFxcIiA9PSBpbnB1dCkge1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP2luZGV4PTAmcGFnZVRpdGxlPeeZu+W9lemYv+mHjOS6keebmFxcXCJcXG4gICAgfVxcbiAgICBpZiAoXFxcIkFQUOaOiOadg+eZu+W9lVxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVmcmVzaCMjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP2luZGV4PS0xJnBhZ2VUaXRsZT3nmbvlvZXpmL/ph4zkupHnm5hcXFwiXFxuICAgIH1cXG4gICAgaWYgKFxcXCJUT0tFTueZu+W9lVxcXCIgPT0gaW5wdXQpIHtcXG4gICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi6L6T5YWlVE9LRU5cXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGFsaVRva2Vuc0ZpbGVwYXRoID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdG9rZW5QYXRoXFxcIikuYWxpVG9rZW5zRmlsZXBhdGg7XFxuICAgICAgICAgICAgbGV0IGFsaVRva2VuID0ge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuOiBpbnB1dC50cmltKClcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShhbGlUb2tlbnNGaWxlcGF0aCwgSlNPTi5zdHJpbmdpZnkoYWxpVG9rZW4pKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgaWYgKFxcXCLljp/nlLvnmbvlvZVcXFwiID09IGlucHV0KSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9vcGVuQXBpTG9naW4jbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICB9XFxufSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLpmL/ph4zpk77mjqXljLnphY1cIixcInBhdGhcIjpcImFsaXRlc3RcIixcInJ1bGVcIjpcImpzOlxcbmxldCBtYXRjaFJlZyA9IC9odHRwcz86XFxcXC9cXFxcL3d3dy5hbGkocGFufHl1bmRyaXZlKS5jb21cXFxcL3NcXFxcL1thLXpBLVowLTldezExfShcXFxcL2ZvbGRlclxcXFwvW2EtejAtOV17NDB9KT8vO1xcbmxldCBtYXRjaFJlZ0cgPSAvaHR0cHM/OlxcXFwvXFxcXC93d3cuYWxpKHBhbnx5dW5kcml2ZSkuY29tXFxcXC9zXFxcXC9bYS16QS1aMC05XXsxMX0oXFxcXC9mb2xkZXJcXFxcL1thLXowLTldezQwfSk/L2c7XFxubGV0IHRlc3RSZWcgPSAvd3d3LmFsaShwYW58eXVuZHJpdmUpLmNvbVxcXFwvc1xcXFwvLztcXG4kLmV4cG9ydHMgPSB7XFxuICAgIG1hdGNoQWxpVXJsKHRleHQsIGlzRykge1xcbiAgICAgICAgaWYgKGlzRykge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSB0ZXh0Lm1hdGNoKG1hdGNoUmVnRyk7XFxuICAgICAgICAgICAgaWYgKHVybCkgcmV0dXJuIHVybDtcXG4gICAgICAgICAgICBlbHNlIHJldHVybiBbXTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IHRleHQubWF0Y2gobWF0Y2hSZWcpO1xcbiAgICAgICAgICAgIHJldHVybiB1cmwgPSB1cmwgJiYgdXJsWzBdIHx8IFxcXCJcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICB0ZXN0KHRleHQpe1xcbiAgICAgICAgcmV0dXJuIHRlc3RSZWcudGVzdCh0ZXh0KTtcXG4gICAgfVxcbn1cXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIm9wZW5BcGnnmbvlvZUt5bqf5byDXCIsXCJwYXRoXCI6XCJvcGVuQXBpTG9naW5cIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwib3BlbkFwaeeZu+W9lVxcXCIpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4gY2xlYXJNeVZhcihcXFwiTG9nZ2luZ2luXFxcIikpO1xcblxcbmxldCBkID0gW107XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLngrnlh7vojrflj5bmiavnoIHnmbvlvZXkuoznu7TnoIFcXFwiLFxcbiAgICBkZXNjOiBcXFwi54K55Ye75Zu+54mH5Y+v5Lul5L+d5a2YXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGNsczogXFxcImxvZ2luXFxcIixcXG4gICAgICAgIGlkOlxcXCJnZXRRQ1xcXCJcXG4gICAgfSxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJMb2dnaW5naW5cXFwiLCBcXFwidHJ1ZVxcXCIpO1xcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOiOt+WPluS6jOe7tOeggVxcXCIpO1xcblxcbiAgICAgICAgZnVuY3Rpb24gZ2V0X3FyY29kZV9zdGF0dXMoc2lkKSB7XFxuICAgICAgICAgICAgbGV0IHJlcyA9IGZldGNoKFxcXCJodHRwczovL29wZW5hcGkuYWxpeXVuZHJpdmUuY29tL29hdXRoL3FyY29kZS9cXFwiICsgc2lkICsgXFxcIi9zdGF0dXNcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXMpO1xcbiAgICAgICAgfVxcblxcbiAgICAgICAgZnVuY3Rpb24gZ2V0X3JlZnJlc2hfdG9rZW4oY29kZSkge1xcbiAgICAgICAgICAgIGxldCByZXMgPSBwb3N0KFxcXCJodHRwczovL2FsaXl1bmRyaXZlLW9hdXRoLm1lc3NlbnNlLm1lL29hdXRoL2FjY2Vzc190b2tlblxcXCIsIHtcXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgXFxcImdyYW50X3R5cGVcXFwiOiBcXFwiYXV0aG9yaXphdGlvbl9jb2RlXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJjb2RlXFxcIjogY29kZSxcXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlcyk7XFxuICAgICAgICAgICAgcmV0dXJuIGRhdGFbXFxcInJlZnJlc2hfdG9rZW5cXFwiXTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCByZXMgPSBwb3N0KFxcXCJodHRwczovL2FsaXl1bmRyaXZlLW9hdXRoLm1lc3NlbnNlLm1lL29hdXRoL2F1dGhvcml6ZS9xcmNvZGVcXFwiLCB7XFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICBcXFwic2NvcGVzXFxcIjogW1xcXCJ1c2VyOmJhc2VcXFwiLCBcXFwiZmlsZTphbGw6cmVhZFxcXCIsIFxcXCJmaWxlOmFsbDp3cml0ZVxcXCJdLFxcbiAgICAgICAgICAgICAgICBcXFwid2lkdGhcXFwiOiAzMDAsXFxuICAgICAgICAgICAgICAgIFxcXCJoZWlnaHRcXFwiOiAzMDAsXFxuICAgICAgICAgICAgfSksXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXMpO1xcbiAgICAgICAgbGV0IHNpZCA9IGRhdGFbXFxcInNpZFxcXCJdO1xcbiAgICAgICAgbGV0IHFyY29kZV91cmwgPSBkYXRhW1xcXCJxckNvZGVVcmxcXFwiXTtcXG4gICAgICAgIHVwZGF0ZUl0ZW0oXFxcImluZm9PdXRwdXRcXFwiLCB7XFxuICAgICAgICAgICAgcGljX3VybDogcXJjb2RlX3VybCxcXG4gICAgICAgICAgICB1cmw6IHFyY29kZV91cmwgKyBcXFwiIy5qcGdcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwicGljXzFfZnVsbFxcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgYWRkSXRlbUFmdGVyKFxcXCJpbmZvT3V0cHV0XFxcIiwge1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi4oCY4oCY4oCZ4oCZXFxcIiArIFxcXCLkvb/nlKjpmL/ph4zkupHnm5ggQXBwIOaJq+eggVxcXCIuZm9udGNvbG9yKFxcXCJncmV5XFxcIiksXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBjbHM6IFxcXCJsb2dpblxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGRlbGV0ZUl0ZW0oXFxcImdldFFDXFxcIik7XFxuICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgbGV0IHJlZnJlc2hfdG9rZW47XFxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xcbiAgICAgICAgICAgIGxldCBkYXRhO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGRhdGEgPSBnZXRfcXJjb2RlX3N0YXR1cyhzaWQpO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+afpeivouaJq+eggee7k+aenOi2heaXtiwg5Y+v6IO95piv6Kem5Y+R5LqG6Zi/6YeM5LqR55uY5o6l5Y+j6ZmQ5Yi2LCDor7fnqI3lkI7lho3or5UuXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGRhdGFbXFxcInN0YXR1c1xcXCJdO1xcbiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gXFxcIkxvZ2luU3VjY2Vzc1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbiA9IGdldF9yZWZyZXNoX3Rva2VuKGRhdGFbXFxcImF1dGhDb2RlXFxcIl0pO1xcbiAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IFxcXCJRUkNvZGVFeHBpcmVkXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LqM57u056CB5bey6L+H5pyfLCDor7fliLfmlrDpobXpnaLlkI7ph43or5VcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoIWdldE15VmFyKFxcXCJMb2dnaW5naW5cXFwiLCBcXFwiXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL2NhbmNlbFxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoMTUwMCk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAocmVmcmVzaF90b2tlbikge1xcbiAgICAgICAgICAgIGNvbnN0IHtcXG4gICAgICAgICAgICAgICAgb3BlblRva2Vuc0ZpbGVwYXRoLFxcbiAgICAgICAgICAgIH0gPSAkLnJlcXVpcmUoXFxcInRva2VuUGF0aFxcXCIpO1xcbiAgICAgICAgICAgIGxldCBvcGVuID0ge1xcbiAgICAgICAgICAgICAgICBSZWZyZXNoVG9rZW5PcGVuOiByZWZyZXNoX3Rva2VuLFxcbiAgICAgICAgICAgICAgICBpc1YyOiB0cnVlXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUob3BlblRva2Vuc0ZpbGVwYXRoLCBKU09OLnN0cmluZ2lmeShvcGVuKSk7XFxuICAgICAgICAgICAgYWRkSXRlbUFmdGVyKFxcXCJpbmZvT3V0cHV0XFxcIiwge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIueZu+W9leaIkOWKnyjngrnlh7vov5Tlm54pXFxcIixcXG4gICAgICAgICAgICAgICAgdXJsOiQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgICAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXCJsb2dpblxcXCIpO1xcblxcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9zdWNjZXNzXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9mYWlsXFxcIjtcXG4gICAgfSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBcXFwiaW5mb091dHB1dFxcXCIsXFxuICAgICAgICBjbHM6IFxcXCJsb2dpblxcXCJcXG4gICAgfVxcbn0pO1xcblxcbnNldFJlc3VsdChkKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIm9wZW5BcGk6YWxpc3RcIixcInBhdGhcIjpcIm9wZW5BcGlfYWxpc3RcIixcInJ1bGVcIjpcIlxcbmZ1bmN0aW9uIE9wZW5BcGlBbGlzdCgkdGhpcykge1xcbiAgICB0aGlzLiR0aGlzID0gJHRoaXM7XFxufVxcbk9iamVjdC5hc3NpZ24oT3BlbkFwaUFsaXN0LnByb3RvdHlwZSwge1xcbiAgICBnZXRPcGVuVG9rZW5Db2RlKCkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuJHRoaXMucG9zdEFwaSgnaHR0cHM6Ly9vcGVuLmFsaXl1bmRyaXZlLmNvbS9vYXV0aC91c2Vycy9hdXRob3JpemU/Y2xpZW50X2lkPScgKyAnNzY5MTdjY2NjZDQ0NDFjMzk0NTdhMDRmNjA4NGZiMmYnICsgJyZyZWRpcmVjdF91cmk9aHR0cHM6Ly9hbGlzdC5ubi5jaS90b29sL2FsaXl1bmRyaXZlL2NhbGxiYWNrJyArICcmc2NvcGU9dXNlcjpiYXNlLGZpbGU6YWxsOnJlYWQsZmlsZTphbGw6d3JpdGUmc3RhdGU9JykuYm9keSh7XFxuICAgICAgICAgICAgXFxcImF1dGhvcml6ZVxcXCI6IDEsXFxuICAgICAgICAgICAgXFxcInNjb3BlXFxcIjogXFxcInVzZXI6YmFzZSxmaWxlOmFsbDpyZWFkLGZpbGU6YWxsOndyaXRlXFxcIlxcbiAgICAgICAgfSkuaGVhZGVycyh7XFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQSxcXG4gICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJyxcXG4gICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMuJHRoaXMucmVhY2Nlc3NUaywgLy9nZXRBY2Nlc3NUb2tlblxcbiAgICAgICAgICAgICd4LWNhbmFyeSc6ICdjbGllbnQ9d2ViLGFwcD1zaGFyZSx2ZXJzaW9uPXYyLjMuMScsXFxuICAgICAgICAgICAgJ3gtc2hhcmUtdG9rZW4nOiB0aGlzLiR0aGlzLnNoYXJlVG9rZW5cXG4gICAgICAgIH0pLmVycm9yV2l0aFJldHJ5KChlLF8saHR0cCkgPT4ge1xcbiAgICAgICAgICAgIHRoaXMuJHRoaXMudHJ5U29sdmUoZSk7XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLiR0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgICAgICAneC1zaGFyZS10b2tlbic6IHRoaXMuJHRoaXMuc2hhcmVUb2tlblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICB9KS5zdGFydCh0cnVlKTtcXG4gICAgICAgIGxldCBjb2RlID0gcmVzdWx0LnJlZGlyZWN0VXJpLnNwbGl0KFxcXCJjb2RlPVxcXCIpWzFdO1xcbiAgICAgICAgcmV0dXJuIGNvZGU7XFxuICAgIH0sXFxuICAgIGdldFRva2VuKGJvZHkpIHtcXG4gICAgICAgIGxldCBqc29uID0gcG9zdCgnaHR0cHM6Ly9hcGkueGhvZmUudG9wL2FsaXN0L2FsaV9vcGVuL2NvZGUnLCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IFBDX1VBLFxcbiAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vJ1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXFxuICAgICAgICB9KTtcXG4gICAgICAgIGlmICghanNvbikge1xcbiAgICAgICAgICAgIGpzb24gPSBwb3N0KCdodHRwczovL2FwaS1jZi5ubi5jaS9hbGlzdC9hbGlfb3Blbi9jb2RlJywge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChqc29uLmluY2x1ZGVzKCdUb28gTWFueSBSZXF1ZXN0cycpIHx8IGpzb24uaW5jbHVkZXMoXFxcIjUwMiBCYWQgR2F0ZXdheVxcXCIpKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLpopHnuYHor7fmsYLmmoLml7booqvlsIHnpoFcXFxcblxcXCIgKyBqc29uKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IG9wZW5SZXN1bHQgPSBKU09OLnBhcnNlKGpzb24pO1xcbiAgICAgICAgICAgIHJldHVybiBvcGVuUmVzdWx0O1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICBnZXRPcGVuVG9rZW4oKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbih7XFxuICAgICAgICAgICAgY29kZTogdGhpcy5nZXRPcGVuVG9rZW5Db2RlKCksXFxuICAgICAgICAgICAgZ3JhbnRfdHlwZTogXFxcImF1dGhvcml6YXRpb25fY29kZVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9LFxcbiAgICByZWZyZXNoT3BlblRva2VuKCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW4oe1xcbiAgICAgICAgICAgIGdyYW50X3R5cGU6IFxcXCJyZWZyZXNoX3Rva2VuXFxcIixcXG4gICAgICAgICAgICByZWZyZXNoX3Rva2VuOiB0aGlzLiR0aGlzLm9wZW5Ub2tlbnMuUmVmcmVzaFRva2VuT3BlbixcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufSk7XFxuJC5leHBvcnRzID0gT3BlbkFwaUFsaXN0O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwib3BlbkFwaTphbGl5dW5kcml2ZVwiLFwicGF0aFwiOlwib3BlbkFwaV9hbGl5dW5kcml2ZVwiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gT3BlbkFwaSgkdGhpcywgcG9zdEFwaSkge1xcbiAgICB0aGlzLiR0aGlzID0gJHRoaXM7XFxufVxcblxcbk9iamVjdC5hc3NpZ24oT3BlbkFwaS5wcm90b3R5cGUsIHtcXG4gICAgZ2V0T3BlblRva2VuQ29kZSgpIHtcXG4gICAgICAgIGZ1bmN0aW9uIGdldF9xcmNvZGVfY29kZShzaWQpIHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gZmV0Y2goXFxcImh0dHBzOi8vb3BlbmFwaS5hbGl5dW5kcml2ZS5jb20vb2F1dGgvcXJjb2RlL1xcXCIgKyBzaWQgKyBcXFwiL3N0YXR1c1xcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcykuYXV0aENvZGU7XFxuICAgICAgICB9XFxuXFxuICAgICAgICBsZXQgcmVzID0gcG9zdChcXFwiaHR0cHM6Ly9hbGl5dW5kcml2ZS1vYXV0aC5tZXNzZW5zZS5tZS9vYXV0aC9hdXRob3JpemUvcXJjb2RlXFxcIiwge1xcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgXFxcInNjb3Blc1xcXCI6IFtcXFwidXNlcjpiYXNlXFxcIiwgXFxcImZpbGU6YWxsOnJlYWRcXFwiLCBcXFwiZmlsZTphbGw6d3JpdGVcXFwiXSxcXG4gICAgICAgICAgICAgICAgXFxcIndpZHRoXFxcIjogMzAwLFxcbiAgICAgICAgICAgICAgICBcXFwiaGVpZ2h0XFxcIjogMzAwLFxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzKTtcXG4gICAgICAgIGxldCBzaWQgPSBkYXRhW1xcXCJzaWRcXFwiXTtcXG4gICAgICAgIGxldCBib2R5ID0ge1xcbiAgICAgICAgICAgIFxcXCJhdXRob3JpemVcXFwiOiAxLFxcbiAgICAgICAgICAgIFxcXCJzY29wZVxcXCI6IFxcXCJ1c2VyOmJhc2UsZmlsZTphbGw6cmVhZCxmaWxlOmFsbDp3cml0ZVxcXCIsXFxuICAgICAgICAgICAgXFxcImRyaXZlc1xcXCI6IFtcXFwiYmFja3VwXFxcIiwgXFxcInJlc291cmNlXFxcIl0sXFxuICAgICAgICAgICAgXFxcInNjb3Blc1xcXCI6IFtcXFwidXNlcjpiYXNlXFxcIiwgXFxcImZpbGU6YWxsOnJlYWRcXFwiLCBcXFwiZmlsZTphbGw6d3JpdGVcXFwiXSxcXG4gICAgICAgICAgICBcXFwic2lkXFxcIjogc2lkXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgaGVhZGVycyA9IHtcXG4gICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMuJHRoaXMucmVhY2Nlc3NUa1xcbiAgICAgICAgfTtcXG4gICAgICAgIGxldCByZXMyID0gdGhpcy4kdGhpcy5wb3N0QXBpKFxcXCJodHRwczovL29wZW4uYWxpeXVuZHJpdmUuY29tL29hdXRoL3VzZXJzL3FyY29kZS9hdXRob3JpemU/c2lkPVxcXCIgKyBzaWQpLmJvZHkoYm9keSkuaGVhZGVycyhoZWFkZXJzKS5lcnJvcldpdGhSZXRyeSgoZSwgXywgaHR0cCkgPT4ge1xcbiAgICAgICAgICAgIHRoaXMuJHRoaXMudHJ5U29sdmUoZSk7XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLiR0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgcmV0dXJuIGdldF9xcmNvZGVfY29kZShzaWQpO1xcbiAgICB9LFxcbiAgICBnZXRUb2tlbihib2R5KSB7XFxuICAgICAgICBsZXQgcmVzID0gcG9zdChcXFwiaHR0cHM6Ly9hbGl5dW5kcml2ZS1vYXV0aC5tZXNzZW5zZS5tZS9vYXV0aC9hY2Nlc3NfdG9rZW5cXFwiLCB7XFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXMpO1xcblxcbiAgICAgICAgcmV0dXJuIGRhdGE7XFxuICAgIH0sXFxuICAgIGdldE9wZW5Ub2tlbigpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuKHtcXG4gICAgICAgICAgICBjb2RlOiB0aGlzLmdldE9wZW5Ub2tlbkNvZGUoKSxcXG4gICAgICAgICAgICBncmFudF90eXBlOiBcXFwiYXV0aG9yaXphdGlvbl9jb2RlXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH0sXFxuICAgIHJlZnJlc2hPcGVuVG9rZW4oKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbih7XFxuICAgICAgICAgICAgZ3JhbnRfdHlwZTogXFxcInJlZnJlc2hfdG9rZW5cXFwiLFxcbiAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHRoaXMuJHRoaXMub3BlblRva2Vucy5SZWZyZXNoVG9rZW5PcGVuLFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59KTtcXG4kLmV4cG9ydHMgPSBPcGVuQXBpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwib3BlbkFwaTp0dmJveFwiLFwicGF0aFwiOlwib3BlbkFwaV90dmJveFwiLFwicnVsZVwiOlwiZnVuY3Rpb24gT3BlbkFwaSgkdGhpcykge1xcbiAgICB0aGlzLiR0aGlzID0gJHRoaXM7XFxufVxcblxcbk9iamVjdC5hc3NpZ24oT3BlbkFwaS5wcm90b3R5cGUsIHtcXG4gICAgZ2V0T3BlblRva2VuQ29kZSgpIHtcXG4gICAgICAgIGZ1bmN0aW9uIGdldF9xcmNvZGVfY29kZShzaWQpIHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gZmV0Y2goXFxcImh0dHBzOi8vb3BlbmFwaS5hbGl5dW5kcml2ZS5jb20vb2F1dGgvcXJjb2RlL1xcXCIgKyBzaWQgKyBcXFwiL3N0YXR1c1xcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcykuYXV0aENvZGU7XFxuICAgICAgICB9XFxuXFxuICAgICAgICBsZXQgcmVzID0gZmV0Y2goXFxcImh0dHA6Ly8xNTkuNzUuMjA4LjQ3L2Nsb3VkaXNrL2FwaS9vYXV0aC9hdXRob3JpemUvcXJjb2RlXFxcIik7XFxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzKTtcXG4gICAgICAgIGxldCBzaWQgPSBkYXRhW1xcXCJzaWRcXFwiXTtcXG4gICAgICAgIGxldCBib2R5ID0ge1xcbiAgICAgICAgICAgIFxcXCJhdXRob3JpemVcXFwiOiAxLFxcbiAgICAgICAgICAgIFxcXCJzY29wZVxcXCI6IFxcXCJ1c2VyOmJhc2UsZmlsZTphbGw6cmVhZCxmaWxlOmFsbDp3cml0ZVxcXCIsXFxuICAgICAgICAgICAgXFxcImRyaXZlc1xcXCI6IFtcXFwiYmFja3VwXFxcIiwgXFxcInJlc291cmNlXFxcIl0sXFxuICAgICAgICAgICAgXFxcInNjb3Blc1xcXCI6IFtcXFwidXNlcjpiYXNlXFxcIiwgXFxcImZpbGU6YWxsOnJlYWRcXFwiLCBcXFwiZmlsZTphbGw6d3JpdGVcXFwiXSxcXG4gICAgICAgICAgICBcXFwic2lkXFxcIjogc2lkXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgaGVhZGVycyA9IHtcXG4gICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMuJHRoaXMucmVhY2Nlc3NUa1xcbiAgICAgICAgfTtcXG4gICAgICAgIGxldCByZXMyID0gdGhpcy4kdGhpcy5wb3N0QXBpKFxcXCJodHRwczovL29wZW4uYWxpeXVuZHJpdmUuY29tL29hdXRoL3VzZXJzL3FyY29kZS9hdXRob3JpemU/c2lkPVxcXCIgKyBzaWQpLmJvZHkoYm9keSkuaGVhZGVycyhoZWFkZXJzKS5lcnJvcldpdGhSZXRyeSgoZSwgXywgaHR0cCkgPT4ge1xcbiAgICAgICAgICAgIHRoaXMuJHRoaXMudHJ5U29sdmUoZSk7XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLiR0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgcmV0dXJuIGdldF9xcmNvZGVfY29kZShzaWQpO1xcbiAgICB9LFxcbiAgICBnZXRUb2tlbihib2R5KSB7XFxuICAgICAgICBsZXQgdXJsID0gXFxcIlxcXCI7XFxuICAgICAgICBpZiAoYm9keS5jb2RlKSB7XFxuICAgICAgICAgICAgdXJsID0gYnVpbGRVcmwoXFxcImh0dHA6Ly8xNTkuNzUuMjA4LjQ3L2Nsb3VkaXNrL2FwaS9vYXV0aC9hY2Nlc3NUb2tlblxcXCIsIHtcXG4gICAgICAgICAgICAgICAgYXV0aENvZGU6IGJvZHkuY29kZVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB1cmwgPSBidWlsZFVybChcXFwiaHR0cDovLzE1OS43NS4yMDguNDcvY2xvdWRpc2svYXBpL29hdXRoL2FjY2Vzc1Rva2VuXFxcIiwge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW46IGJvZHkucmVmcmVzaF90b2tlblxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJlcyA9IGZldGNoKHVybCk7XFxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzKTtcXG4gICAgICAgIGxldCByZXQgPSB7XFxuICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogZGF0YS5yZWZyZXNoVG9rZW4sXFxuICAgICAgICAgICAgdG9rZW5fdHlwZTogZGF0YS50b2tlblR5cGUsXFxuICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiBkYXRhLmFjY2Vzc1Rva2VuXFxuICAgICAgICB9O1xcbiAgICAgICAgcmV0dXJuIHJldDtcXG4gICAgfSxcXG4gICAgZ2V0T3BlblRva2VuKCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW4oe1xcbiAgICAgICAgICAgIGNvZGU6IHRoaXMuZ2V0T3BlblRva2VuQ29kZSgpLFxcbiAgICAgICAgICAgIGdyYW50X3R5cGU6IFxcXCJhdXRob3JpemF0aW9uX2NvZGVcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfSxcXG4gICAgcmVmcmVzaE9wZW5Ub2tlbigpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuKHtcXG4gICAgICAgICAgICBncmFudF90eXBlOiBcXFwicmVmcmVzaF90b2tlblxcXCIsXFxuICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogdGhpcy4kdGhpcy5vcGVuVG9rZW5zLlJlZnJlc2hUb2tlbk9wZW4sXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IE9wZW5BcGk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJvcGVuQXBpOlhCWVwiLFwicGF0aFwiOlwib3BlbkFwaV9YQllcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIE9wZW5BcGkoJHRoaXMsIHBvc3RBcGkpIHtcXG4gICAgdGhpcy4kdGhpcyA9ICR0aGlzO1xcbn1cXG5cXG5PYmplY3QuYXNzaWduKE9wZW5BcGkucHJvdG90eXBlLCB7XFxuICAgIGNsaWVudF9zZWNyZXQ6IFxcXCI2M2YwNmMzYzVjNWQ0ZTExOTZlMmMxM2U4NTg4YWUyOVxcXCIsXFxuICAgIGNsaWVudF9pZDogXFxcImRmNDNlMjJmMDIyZDRjMDRiNmUyOTk2NGYzYjhiNDZkXFxcIixcXG4gICAgZ2V0T3BlblRva2VuQ29kZSgpIHtcXG4gICAgICAgIGZ1bmN0aW9uIGdldF9xcmNvZGVfY29kZShzaWQpIHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gZmV0Y2goXFxcImh0dHBzOi8vb3BlbmFwaS5hbGl5dW5kcml2ZS5jb20vb2F1dGgvcXJjb2RlL1xcXCIgKyBzaWQgKyBcXFwiL3N0YXR1c1xcXCIpO1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcykuYXV0aENvZGU7XFxuICAgICAgICB9XFxuXFxuICAgICAgICBsZXQgcmVzID0gcG9zdChcXFwiaHR0cHM6Ly9vcGVuYXBpLmFsaXl1bmRyaXZlLmNvbS9vYXV0aC9hdXRob3JpemUvcXJjb2RlXFxcIiwge1xcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgXFxcInNjb3Blc1xcXCI6IFtcXFwidXNlcjpiYXNlXFxcIiwgXFxcImZpbGU6YWxsOnJlYWRcXFwiLCBcXFwiZmlsZTphbGw6d3JpdGVcXFwiXSxcXG4gICAgICAgICAgICAgICAgXFxcImNsaWVudF9zZWNyZXRcXFwiOiB0aGlzLmNsaWVudF9zZWNyZXQsXFxuICAgICAgICAgICAgICAgIFxcXCJjbGllbnRfaWRcXFwiOiB0aGlzLmNsaWVudF9pZCxcXG4gICAgICAgICAgICAgICAgXFxcIndpZHRoXFxcIjogMzUwLFxcbiAgICAgICAgICAgICAgICBcXFwiaGVpZ2h0XFxcIjogMzUwLFxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgfSk7XFxuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzKTtcXG4gICAgICAgIGxldCBzaWQgPSBkYXRhW1xcXCJzaWRcXFwiXTtcXG4gICAgICAgIGxldCBib2R5ID0ge1xcbiAgICAgICAgICAgIFxcXCJhdXRob3JpemVcXFwiOiAxLFxcbiAgICAgICAgICAgIFxcXCJzY29wZVxcXCI6IFxcXCJ1c2VyOmJhc2UsZmlsZTphbGw6cmVhZCxmaWxlOmFsbDp3cml0ZVxcXCIsXFxuICAgICAgICAgICAgXFxcImRyaXZlc1xcXCI6IFtcXFwiYmFja3VwXFxcIiwgXFxcInJlc291cmNlXFxcIl0sXFxuICAgICAgICAgICAgXFxcInNjb3Blc1xcXCI6IFtcXFwidXNlcjpiYXNlXFxcIiwgXFxcImZpbGU6YWxsOnJlYWRcXFwiLCBcXFwiZmlsZTphbGw6d3JpdGVcXFwiXSxcXG4gICAgICAgICAgICBcXFwic2lkXFxcIjogc2lkXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgaGVhZGVycyA9IHtcXG4gICAgICAgICAgICAnYXV0aG9yaXphdGlvbic6IHRoaXMuJHRoaXMucmVhY2Nlc3NUa1xcbiAgICAgICAgfTtcXG4gICAgICAgIGxldCByZXMyID0gdGhpcy4kdGhpcy5wb3N0QXBpKFxcXCJodHRwczovL29wZW4uYWxpeXVuZHJpdmUuY29tL29hdXRoL3VzZXJzL3FyY29kZS9hdXRob3JpemU/c2lkPVxcXCIgKyBzaWQpLmJvZHkoYm9keSkuaGVhZGVycyhoZWFkZXJzKS5lcnJvcldpdGhSZXRyeSgoZSwgXywgaHR0cCkgPT4ge1xcbiAgICAgICAgICAgIHRoaXMuJHRoaXMudHJ5U29sdmUoZSk7XFxuICAgICAgICAgICAgaHR0cC5tZXJnZUhlYWRBbmRCb2R5KHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nOiB0aGlzLiR0aGlzLnJlYWNjZXNzVGssXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgcmV0dXJuIGdldF9xcmNvZGVfY29kZShzaWQpO1xcbiAgICB9LFxcbiAgICBnZXRUb2tlbihib2R5KSB7XFxuICAgICAgICBsZXQgcmVzID0gcG9zdChcXFwiaHR0cHM6Ly9vcGVuYXBpLmFsaXl1bmRyaXZlLmNvbS9vYXV0aC9hY2Nlc3NfdG9rZW5cXFwiLCB7XFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXFxuICAgICAgICB9KTtcXG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXMpO1xcblxcbiAgICAgICAgcmV0dXJuIGRhdGE7XFxuICAgIH0sXFxuICAgIGdldE9wZW5Ub2tlbigpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuKHtcXG4gICAgICAgICAgICBjb2RlOiB0aGlzLmdldE9wZW5Ub2tlbkNvZGUoKSxcXG4gICAgICAgICAgICBncmFudF90eXBlOiBcXFwiYXV0aG9yaXphdGlvbl9jb2RlXFxcIixcXG4gICAgICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLmNsaWVudF9zZWNyZXQsXFxuICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudF9pZCxcXG4gICAgICAgIH0pO1xcbiAgICB9LFxcbiAgICByZWZyZXNoT3BlblRva2VuKCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW4oe1xcbiAgICAgICAgICAgIGdyYW50X3R5cGU6IFxcXCJyZWZyZXNoX3Rva2VuXFxcIixcXG4gICAgICAgICAgICByZWZyZXNoX3Rva2VuOiB0aGlzLiR0aGlzLm9wZW5Ub2tlbnMuUmVmcmVzaFRva2VuT3BlbixcXG4gICAgICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLmNsaWVudF9zZWNyZXQsXFxuICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudF9pZCxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufSk7XFxuJC5leHBvcnRzID0gT3BlbkFwaTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIumTvuaOpeWumuWQkVwiLFwicGF0aFwiOlwicmVkaXJlY3RcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IG9wZW5Nb2RlID0gZ2V0SXRlbShcXFwib3Blbk1vZGVcXFwiLCBcXFwi5pys5Zyw6Kej5p6QXFxcIik7XFxuaWYgKG9wZW5Nb2RlID09PSBcXFwi5pys5Zyw6L2s56CBXFxcIikge1xcbiAgICBzZXRJdGVtKFxcXCJvcGVuTW9kZVxcXCIsIFxcXCLmnKzlnLDop6PmnpBcXFwiKTtcXG4gICAgb3Blbk1vZGUgPSBcXFwi5pys5Zyw6Kej5p6QXFxcIjtcXG59XFxuXFxuZnVuY3Rpb24gZGVhbEFycmF5KGFycmF5KSB7XFxuICAgIGxldCBpc1N0cmluZyA9IHR5cGVvZiBhcnJheVswXSA9PT0gXFxcInN0cmluZ1xcXCI7XFxuICAgIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcXG4gICAgICAgIHJldHVybiBkZWFsUmVzdWx0KGFycmF5WzBdKTtcXG4gICAgfSBlbHNlIGlmIChpc1N0cmluZykge1xcbiAgICAgICAgYXJyYXkgPSBhcnJheS5tYXAoYWxpVXJsID0+ICh7XFxuICAgICAgICAgICAgYWxpVXJsXFxuICAgICAgICB9KSk7XFxuICAgIH1cXG4gICAgbGV0IHNlbGVjdCA9IGFycmF5Lm1hcCgodiwgaSkgPT4gdi50aXRsZSB8fCB2LmFsaVVybC5yZXBsYWNlKC9odHRwLio/XFxcXC9zXFxcXC8vLCBcXFwiXFxcIikpO1xcbiAgICByZXR1cm4gJChzZWxlY3QpLnNlbGVjdCgocmVzdWx0KSA9PiB7XFxuICAgICAgICBsZXQgaW5kZXggPSBNWV9JTkRFWDtcXG4gICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcInJlZGlyZWN0XFxcIikuZGVhbFJlc3VsdChyZXN1bHRbaW5kZXhdKTtcXG4gICAgfSwgYXJyYXkpO1xcbn1cXG5cXG5mdW5jdGlvbiBkZWFsUmVzdWx0KHJlc3VsdCkge1xcbiAgICBsZXQgcmVzdWx0VHlwZSA9IHR5cGVvZiByZXN1bHQ7XFxuICAgIGlmIChyZXN1bHRUeXBlID09PSBcXFwic3RyaW5nXFxcIikge1xcbiAgICAgICAgcmV0dXJuIGdldE1vZGVVcmwocmVzdWx0KTtcXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcXG4gICAgICAgIHJldHVybiBkZWFsQXJyYXkocmVzdWx0KTtcXG4gICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFYXN5TmV4dFBhZ2UpIHtcXG4gICAgICAgIHJldHVybiByZXN1bHQudG9OZXh0UGFnZSgpO1xcbiAgICB9IGVsc2UgaWYgKHJlc3VsdFR5cGUgPT09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICByZXR1cm4gZ2V0TW9kZVVybChyZXN1bHQuYWxpVXJsLCByZXN1bHQuc2hhcmVQd2QpO1xcbiAgICB9XFxuICAgIHJldHVybiBcXFwidG9hc3Q6Ly/plJnor6/nsbvlnovvvJpcXFwiICsgcmVzdWx0VHlwZTtcXG59XFxuXFxuZnVuY3Rpb24gRWFzeU5leHRQYWdlKGxpc3QsIGNvbCkge1xcbiAgICAvL3RoaXMubGlzdCA9IGxpc3Q7XFxuICAgIGNvbCA9IGNvbCB8fCBcXFwidGV4dF8zXFxcIjtcXG4gICAgdGhpcy50b05leHRQYWdlID0gZnVuY3Rpb24oKSB7XFxuICAgICAgICByZXR1cm4gJCgpLnJ1bGUoKGxpc3QsIGNvbF90eXBlKSA9PiB7XFxuICAgICAgICAgICAgc2V0UmVzdWx0KGxpc3QubWFwKHYgPT4gKHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGUsXFxuICAgICAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKHYgPT4gJC5yZXF1aXJlKFxcXCJyZWRpcmVjdFxcXCIpLmRlYWxSZXN1bHQodiksIHYpLFxcbiAgICAgICAgICAgICAgICB0aXRsZTogdi50aXRsZSB8fCB2LmFsaVVybC5yZXBsYWNlKC9odHRwLio/XFxcXC9zXFxcXC8vLCBcXFwiXFxcIilcXG4gICAgICAgICAgICB9KSkpO1xcbiAgICAgICAgfSwgbGlzdCwgY29sKTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBzZXRFcnJvclBvcChuYW1lLCBhdXRob3IpIHtcXG4gICAgcmV0dXJuICQoXFxcIuaQnOe0ouW8leaTjuOAjFxcXCIgKyBuYW1lICsgXFxcIuOAjeWkseaViOivt+iBlOezu+aQnOe0ouW8leaTjuS9nOiAhVxcXCIgKyAoYXV0aG9yID8gXFxcIltcXFwiICsgYXV0aG9yICsgXFxcIl1cXFwiIDogXFxcIlxcXCIpICsgXFxcIuS/ruWkjeaIluWIoOmZpFxcXFxuXFxcXG7lvJXmk47kvZzogIXlj6/ku6XljrvlrpjmlrnpopHpgZPor6Lpl65cXFxcbueCueWHu+ehruWumuW/q+mAn+WIoOmZpFxcXCIpLmNvbmZpcm0oKG5hbWUpID0+IHtcXG4gICAgICAgIGNvbmZpcm0oe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5rip6aao5o+Q56S6XFxcIixcXG4gICAgICAgICAgICBjb250ZW50OiBcXFwi56Gu5a6a6KaB5Yig6ZmkXFxcIiArIG5hbWUgKyBcXFwi5ZCX77yf5rOo5oSP5Yig6Zmk5ZCO5peg5rOV5oGi5aSNXFxcIixcXG4gICAgICAgICAgICBjb25maXJtOiAkLnRvU3RyaW5nKChuYW1lKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGFyci5maW5kSW5kZXgodiA9PiB2Lm5hbWUgPT09IG5hbWUpO1xcbiAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcXG4gICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24oYXJyKTtcXG4gICAgICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJydWxlXFxcIik7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9LCBuYW1lKVxcbiAgICAgICAgfSk7XFxuICAgIH0sIG5hbWUpO1xcbn1cXG5cXG5mdW5jdGlvbiBkb3VibGVUcmVhdGluZyh7XFxuICAgIGZpbmRBbGlVcmwsXFxuICAgIGJhc2ljVXJsLFxcbiAgICBuYW1lLFxcbiAgICBhdXRob3IsXFxuICAgIGFsaVVybCxcXG4gICAgcnVsZVR5cGVcXG59KSB7XFxuICAgIGlmICghZmluZEFsaVVybCkgcmV0dXJuIGdldE1vZGVVcmwoYWxpVXJsKTtcXG4gICAgaWYgKHJ1bGVUeXBlID09PSBcXFwiSlNPTlxcXCIpIHtcXG4gICAgICAgIGxldCBQYXJzZVJsdWUgPSAkLnJlcXVpcmUoXFxcIlBhcnNlUmx1ZVxcXCIpO1xcbiAgICAgICAgbGV0IGZpbmQgPSBmaW5kQWxpVXJsO1xcbiAgICAgICAgZmluZEFsaVVybCA9ICh1cmwsIGJhc2ljVXJsKSA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmx1ZS5wYXJzZVVybEpzb24odXJsLCBmaW5kLCBiYXNpY1VybCk7XFxuICAgICAgICB9XFxuICAgIH1lbHNlIGlmIChydWxlVHlwZSA9PT0gXFxcIkhUTUxcXFwiKSB7XFxuICAgICAgICBsZXQgUGFyc2VSbHVlID0gJC5yZXF1aXJlKFxcXCJQYXJzZVJsdWVcXFwiKTtcXG4gICAgICAgIGxldCBmaW5kID0gZmluZEFsaVVybDtcXG4gICAgICAgIGZpbmRBbGlVcmwgPSAodXJsLCBiYXNpY1VybCkgPT4ge1xcbiAgICAgICAgICAgIHJldHVybiBQYXJzZVJsdWUucGFyc2VVcmxIdG1sKHVybCwgZmluZCwgYmFzaWNVcmwpO1xcbiAgICAgICAgfVxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgZmluZEFsaVVybCA9IG5ldyBGdW5jdGlvbihcXFwiaW5wdXRcXFwiLCBcXFwiYmFzaWNVcmxcXFwiLCBcXFwiRWFzeU5leHRQYWdlXFxcIiwgZmluZEFsaVVybCk7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCByZXN1bHQgPSBmaW5kQWxpVXJsKGFsaVVybCwgYmFzaWNVcmwsIEVhc3lOZXh0UGFnZSk7XFxuICAgICAgICByZXR1cm4gZGVhbFJlc3VsdChyZXN1bHQpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgICAgIHJldHVybiBzZXRFcnJvclBvcChuYW1lLCBhdXRob3IpO1xcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGdldE1vZGVVcmwoYWxpVXJsLCBzaGFyZVB3ZCkge1xcbiAgICBpZiAoJC5yZXF1aXJlKFxcXCJhbGl0ZXN0XFxcIikudGVzdChhbGlVcmwpKSB7XFxuICAgICAgICBpZiAob3Blbk1vZGUgPT09IFxcXCLmnKzlnLDop6PmnpBcXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvYWxpeXVuP3BhZ2U9ZnlwYWdlJnJlYWx1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChhbGlVcmwpICsgXFxcIiZzaGFyZVB3ZD1cXFwiICsgKHNoYXJlUHdkIHx8IFxcXCJcXFwiKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgc2hhcmVJZCA9IGFsaVVybC5zcGxpdChcXFwiL1xcXCIpWzRdO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwic21hcnRkcml2ZTovL3NoYXJlL2Jyb3dzZT9zaGFyZUlkPVxcXCIgKyBzaGFyZUlkICsgXFxcIiZzaGFyZVB3ZD1cXFwiICsgKHNoYXJlUHdkIHx8IFxcXCJcXFwiKTtcXG4gICAgICAgIH1cXG4gICAgfSBlbHNlIGlmIChhbGlVcmwuaW5jbHVkZXMoXFxcInBhbi5xdWFyay5jbi9zL1xcXCIpKSB7XFxuICAgICAgICBpZiAob3Blbk1vZGUgPT09IFxcXCLmnKzlnLDop6PmnpBcXFwiKSB7XFxuICAgICAgICAgICAgbGV0IGhhcyA9IGZldGNoKFxcXCJoaWtlcjovL2hvbWVAUXVhcmsu566AXFxcIikgIT0gXFxcIm51bGxcXFwiO1xcbiAgICAgICAgICAgIGlmIChoYXMpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3J1bGU9UXVhcmsu566AJnJlYWx1cmw9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChhbGlVcmwpICsgXFxcIiZzaGFyZVB3ZD1cXFwiICsgKHNoYXJlUHdkIHx8IFxcXCJcXFwiKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gYWxpVXJsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJxa2xpbms6Ly93d3cudWMuY24vYjIwYjg0ZmQ3MzVhOGRkM2Y3NTQxMTI5YmFjYzRlOWE/YWN0aW9uPW9wZW5fdXJsJnVybD1cXFwiICsgYWxpVXJsO1xcbiAgICAgICAgfVxcbiAgICB9IGVsc2UgaWYgKGFsaVVybC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgIHJldHVybiBhbGlVcmw7XFxuICAgIH0gZWxzZSBpZiAoYWxpVXJsLnN0YXJ0c1dpdGgoXFxcIm1hZ25ldFxcXCIpKSB7XFxuICAgICAgICBpZiAob3Blbk1vZGUgPT09IFxcXCLmnKzlnLDop6PmnpBcXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGFsaVVybDtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJkb3dubG9hZDovL1xcXCIgKyBhbGlVcmw7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gYWxpVXJsO1xcbiAgICB9XFxufVxcbiQuZXhwb3J0cy5nZXRNb2RlVXJsID0gZ2V0TW9kZVVybDtcXG4kLmV4cG9ydHMuZG91YmxlVHJlYXRpbmcgPSBkb3VibGVUcmVhdGluZztcXG4kLmV4cG9ydHMuZGVhbFJlc3VsdCA9IGRlYWxSZXN1bHQ7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4TliJnop6PmnpBcIixcInBhdGhcIjpcIlBhcnNlUmx1ZVwiLFwicnVsZVwiOlwiZnVuY3Rpb24gdG9QYXRoKHZhbHVlKSB7XFxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XFxuICAgICAgICByZXR1cm4gW107XFxuICAgIH1cXG5cXG4gICAgbGV0IHBhdGggPSBbXTtcXG4gICAgbGV0IGN1cnJlbnQgPSAnJztcXG4gICAgbGV0IGluQnJhY2tldHMgPSBmYWxzZTtcXG4gICAgbGV0IGVzY2FwZSA9IGZhbHNlO1xcblxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICBsZXQgY2hhciA9IHZhbHVlW2ldO1xcblxcbiAgICAgICAgaWYgKGVzY2FwZSkge1xcbiAgICAgICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcXG4gICAgICAgICAgICBlc2NhcGUgPSBmYWxzZTtcXG4gICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1xcXFxcXFxcJykge1xcbiAgICAgICAgICAgIGVzY2FwZSA9IHRydWU7XFxuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICcuJyAmJiAhaW5CcmFja2V0cykge1xcbiAgICAgICAgICAgIHBhdGgucHVzaChjdXJyZW50KTtcXG4gICAgICAgICAgICBjdXJyZW50ID0gJyc7XFxuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICdbJykge1xcbiAgICAgICAgICAgIGluQnJhY2tldHMgPSB0cnVlO1xcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnXScpIHtcXG4gICAgICAgICAgICBpbkJyYWNrZXRzID0gZmFsc2U7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICBpZiAoY3VycmVudCkge1xcbiAgICAgICAgcGF0aC5wdXNoKGN1cnJlbnQpO1xcbiAgICB9XFxuXFxuICAgIHJldHVybiBwYXRoO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRKc29uKG9iaiwgcGF0aCkge1xcbiAgICBpZiAoIW9iaiB8fCAhQXJyYXkuaXNBcnJheShwYXRoKSkge1xcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcXG4gICAgfVxcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIHJldHVybiBvYmo7XFxuICAgIH1cXG5cXG4gICAgbGV0IGN1cnJlbnQgPSBvYmo7XFxuXFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgbGV0IGtleSA9IHBhdGhbaV07XFxuXFxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XFxuICAgIH1cXG5cXG4gICAgcmV0dXJuIGN1cnJlbnQ7XFxufVxcblxcbmZ1bmN0aW9uIGRlYWxSdWxlKGpzb24sIHJ1bGUsIGJhc2ljVXJsKSB7XFxuICAgIGlmICghcnVsZSkgcmV0dXJuO1xcbiAgICBydWxlID0gcnVsZS5zcGxpdChcXFwiQGpzPVxcXCIpO1xcbiAgICBsZXQgcnVsZTAgPSBydWxlLmF0KDApO1xcbiAgICBsZXQgdCA9IFxcXCJcXFwiO1xcbiAgICBpZiAocnVsZTApIHtcXG4gICAgICAgIHQgPSBnZXRKc29uKGpzb24sIHRvUGF0aChydWxlMCkpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdCA9IGpzb247XFxuICAgIH1cXG4gICAgaWYgKHJ1bGUubGVuZ3RoID4gMSkge1xcbiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbihcXFwiaW5wdXRcXFwiLCBcXFwiJCRcXFwiLCBcXFwiYmFzaWNVcmxcXFwiLCAnXFxcInVzZSBzdHJpY3RcXFwiO3JldHVybiAnICsgcnVsZS5hdCgxKSkodCwganNvbiwgYmFzaWNVcmwpO1xcbiAgICB9XFxuICAgIHJldHVybiB0O1xcbn1cXG5cXG5mdW5jdGlvbiBwYXJzZVNlYXJjaEpzb24odXJsLCBydWxlKSB7XFxuICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShmZXRjaCh1cmwpKTtcXG4gICAgbGV0IHJ1bGVzID0gcnVsZS5zcGxpdChcXFwiXFxcXG5cXFwiKTtcXG4gICAgbGV0IGxpc3QgPSBnZXRKc29uKGpzb24sIHRvUGF0aChydWxlcy5hdCgwKSkpO1xcbiAgICBpZiAoIWxpc3QgfHwgIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwiSlNPTjrliJfooajop6PmnpDkuLrnqbpcXFwiKTtcXG4gICAgfVxcbiAgICBsZXQgZGF0YSA9IFtdO1xcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBkZWFsUnVsZShpdCwgcnVsZXMuYXQoMSksIHVybCksXFxuICAgICAgICAgICAgdXJsOiBkZWFsUnVsZShpdCwgcnVsZXMuYXQoMiksIHVybCksXFxuICAgICAgICAgICAgZGVzYzogZGVhbFJ1bGUoaXQsIHJ1bGVzLmF0KDMpLCB1cmwpLFxcbiAgICAgICAgICAgIHBpY191cmw6IGRlYWxSdWxlKGl0LCBydWxlcy5hdCg0KSwgdXJsKSxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIHJldHVybiBkYXRhO1xcbn1cXG5cXG5mdW5jdGlvbiBwYXJzZVVybEpzb24odXJsLCBydWxlLCBiYXNpY1VybCkge1xcbiAgICBpZiAocnVsZS5zdGFydHNXaXRoKFxcXCJAanM9XFxcIikpIHtcXG4gICAgICAgIHJldHVybiBkZWFsUnVsZSh1cmwsIHJ1bGUsIGJhc2ljVXJsKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShmZXRjaCh1cmwpKTtcXG4gICAgICAgIHJldHVybiBkZWFsUnVsZShqc29uLCBydWxlLCBiYXNpY1VybCk7XFxuICAgIH1cXG5cXG59XFxuXFxuZnVuY3Rpb24gZGVhbFJ1bGVGb3JIdG1sKGh0bWwsIHJ1bGUsIGJhc2ljVXJsKSB7XFxuICAgIGlmICghcnVsZSkgcmV0dXJuO1xcbiAgICBydWxlID0gcnVsZS5zcGxpdChcXFwiQGpzPVxcXCIpO1xcbiAgICBsZXQgcnVsZTAgPSBydWxlLmF0KDApO1xcbiAgICBsZXQgdCA9IFxcXCJcXFwiO1xcbiAgICBpZiAocnVsZTApIHtcXG4gICAgICAgIHQgPSBwZGZoKGh0bWwsIHJ1bGUwKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHQgPSBodG1sXFxuICAgIH1cXG4gICAgaWYgKHJ1bGUubGVuZ3RoID4gMSkge1xcbiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbihcXFwiaW5wdXRcXFwiLCBcXFwiJCRcXFwiLCBcXFwiYmFzaWNVcmxcXFwiLCAnXFxcInVzZSBzdHJpY3RcXFwiO3JldHVybiAnICsgcnVsZS5hdCgxKSkodCwgaHRtbCwgYmFzaWNVcmwpO1xcbiAgICB9XFxuICAgIHJldHVybiB0O1xcbn1cXG5cXG5mdW5jdGlvbiBwYXJzZVNlYXJjaEh0bWwodXJsLCBydWxlKSB7XFxuICAgIGxldCBodG1sID0gZmV0Y2godXJsKTtcXG4gICAgbGV0IHJ1bGVzID0gcnVsZS5zcGxpdChcXFwiXFxcXG5cXFwiKTtcXG4gICAgbGV0IGxpc3QgPSBwZGZhKGh0bWwsIHJ1bGVzLmF0KDApKTtcXG4gICAgaWYgKCFsaXN0IHx8ICFBcnJheS5pc0FycmF5KGxpc3QpKSB7XFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIkhUTUw65YiX6KGo6Kej5p6Q5Li656m6XFxcIik7XFxuICAgIH1cXG4gICAgbGV0IGRhdGEgPSBbXTtcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgbGV0IGN1cmwgPSBkZWFsUnVsZUZvckh0bWwoaXQsIHJ1bGVzLmF0KDIpLCB1cmwpO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogZGVhbFJ1bGVGb3JIdG1sKGl0LCBydWxlcy5hdCgxKSwgdXJsKSxcXG4gICAgICAgICAgICB1cmw6IGN1cmwuc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpID8gY3VybCA6IChnZXRIb21lKHVybCkgKyBjdXJsKSxcXG4gICAgICAgICAgICBkZXNjOiBkZWFsUnVsZUZvckh0bWwoaXQsIHJ1bGVzLmF0KDMpLCB1cmwpLFxcbiAgICAgICAgICAgIHBpY191cmw6IGRlYWxSdWxlRm9ySHRtbChpdCwgcnVsZXMuYXQoNCksIHVybCksXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICByZXR1cm4gZGF0YTtcXG59XFxuXFxuZnVuY3Rpb24gcGFyc2VVcmxIdG1sKHVybCwgcnVsZSwgYmFzaWNVcmwpIHtcXG4gICAgaWYgKHJ1bGUuc3RhcnRzV2l0aChcXFwiQGpzPVxcXCIpKSB7XFxuICAgICAgICByZXR1cm4gZGVhbFJ1bGVGb3JIdG1sKHVybCwgcnVsZSwgYmFzaWNVcmwpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgbGV0IGh0bWwgPSBmZXRjaCh1cmwpO1xcbiAgICAgICAgcmV0dXJuIGRlYWxSdWxlRm9ySHRtbChodG1sLCBydWxlLCBiYXNpY1VybCk7XFxuICAgIH1cXG59XFxuJC5leHBvcnRzID0ge1xcbiAgICBwYXJzZVNlYXJjaEpzb24sXFxuICAgIHBhcnNlVXJsSnNvbixcXG4gICAgcGFyc2VTZWFyY2hIdG1sLFxcbiAgICBwYXJzZVVybEh0bWxcXG59O1wifV0iLCJpY29uIjoiaHR0cHM6Ly9pbWcuYWxpY2RuLmNvbS9pbWdleHRyYS9pMi9PMUNOMDFET1ljczcxdjNCNmJPZW1WTV8hITYwMDAwMDAwMDYxMTYtMi10cHMtNTEyLTUxMi5wbmciLCJwcm94eSI6IiJ9
Add Comment
Please, Sign In to add comment