xiaomianao666

ε°η¨‹εΊοΌšπ‰πšπ―πƒπ

Apr 29th, 2025
1,156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ζ΅·ι˜”θ§†η•Œθ§„εˆ™εˆ†δΊ«οΌŒε½“ε‰εˆ†δΊ«ηš„ζ˜―οΌšε°η¨‹εΊοΏ₯home_rule_v2οΏ₯base64://@π‰πšπ―πƒπ@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoi8J2QifCdkJrwnZCv8J2Qg/CdkIEiLCJhdXRob3IiOiIiLCJ1cmwiOiJoaWtlcjovL2VtcHR5IyNodHRwczovL2phdmRiNDU3LmNvbS8jI2Z5cGFnZSIsInZlcnNpb24iOjIwMjUwNDI5LCJjb2xfdHlwZSI6Im1vdmllXzMiLCJjbGFzc19uYW1lIjoiIiwidHlwZSI6Im90aGVyIiwiY2xhc3NfdXJsIjoiIiwiYXJlYV9uYW1lIjoiIiwiYXJlYV91cmwiOiIiLCJzb3J0X25hbWUiOiIiLCJ5ZWFyX25hbWUiOiIiLCJzb3J0X3VybCI6IiIsInllYXJfdXJsIjoiIiwiZmluZF9ydWxlIjoianM6XG4gICAgdmFyIGQgPSBbXTtcbmFkZExpc3RlbmVyKFwib25DbG9zZVwiLCAkLnRvU3RyaW5nKCgpID0+IHtcbiAgICBsZXQga2V5cyA9IGxpc3RNeVZhcktleXMoKTtcbiAgICBmb3IgKGxldCBpdCBvZiBrZXlzKSB7XG4gICAgICAgIGNsZWFyTXlWYXIoaXQpO1xuICAgIH1cbn0pKTtcblxuY29uc3Qg5LiL5LiA6aG1ID0gXCJwZChodG1sLCAnLnBhZ2luYXRpb24mJmFbcmVsPW5leHRdJiZocmVmJylcIjtcbmNvbnN0IHBhZ2UgPSBNWV9QQUdFO1xuZXZhbChKU09OLnBhcnNlKHJlcXVlc3QoJ2hpa2VyOi8vcGFnZS95aScpKS5ydWxlKVxuXG52YXIg5a6a5L2N5L+h5oGvID0gW3tcbiAgICDlpKfnsbvlrprkvY06ICcubmF2YmFyLXN0YXJ0JiYubmF2YmFyLWxpbmsnLFxuICAgIOWinuWKoDogWyc8YSBocmVmPVwiJyArIE1ZX0hPTUUgKyAnL1wiPummlumhtTwvQT4nLCAnPGEgaHJlZj1cIi9hYm91dFwiPuaUtuiXjzwvQT4nXSxcbiAgICDlsI/nsbs6ICdib2R5JiZhOm5vdCg6bWF0Y2hlcyjwn5SlKSknLFxuICAgIOmTvuaOpeWkhOeQhjogKHUpID0+IHtcbiAgICAgICAgbGV0IHVybCA9IHUucmVwbGFjZSgvdHlwZShcXC9cXGQrKVxcLmh0bWwvLCAnc2hvdyQxLS0tLS0tLS0tLS0uaHRtbCcpO1xuICAgICAgICByZXR1cm4gdXJsXG4gICAgfVxufSwge1xuICAgIOS4gOe6p+WumuS9jTogJy5uYXZiYXItaXRlbVtocmVmPS9sb2dpbl0nLFxufSwge1xuICAgIOS4gOe6p+WumuS9jTogXCJAanM6XCIgKyAkLnRvU3RyaW5nKCgpID0+IHtcbiAgICAgICAgaWYgKCEvYWJvdXR8cmFua2luZ3N8dGFnc3xzZXJpZXN8bWFrZXJzfGxvZ2lufGFjdG9ycy8udGVzdCh0cnVlX3VybCkpIHtcbiAgICAgICAgICAgIHZhciBsaXN0ID0gcGRmYShodG1sLCAnYm9keSYmLm5hdmJhci1kcm9wZG93bjpoYXMoaHIpJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgbGlzdCA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpc3RcbiAgICB9KSxcbiAgICDlsI/nsbs6ICdib2R5JiZhOm5vdCg6bWF0Y2hlcyjmlK/ku5joqJjpjIR85YCL5Lq65L+h5oGvKSknLFxufSwge1xuICAgIOS4gOe6p+WumuS9jTogXCJAanM6XCIgKyAkLnRvU3RyaW5nKCgpID0+IHtcbiAgICAgICAgaWYgKC9zZWFyY2gvLnRlc3QodHJ1ZV91cmwpKSB7XG4gICAgICAgICAgICB2YXIgbGlzdCA9IHBkZmEoaHRtbCxcIi50b29sYmFyXCIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgbGlzdCA9IHBkZmEoaHRtbCwgJ2JvZHkmJi50YWJzfHwuYnV0dG9ucy5oYXMtYWRkb25zJyk7XG4gICAgICAgICAgICBpZiAoIS9hYm91dHxyYW5raW5nc3x0YWdzfHNlcmllc3xtYWtlcnN8dXNlcnN8bG9naW58YWN0b3JzLy50ZXN0KHRydWVfdXJsKSkge1xuICAgICAgICAgICAgICAgIGxpc3RmID0gcGRmYShsaXN0WzBdLCBcImJvZHkmJmFcIilcbiAgICAgICAgICAgICAgICBsaXN0YiA9IGxpc3RmLmNvbmNhdChbJzxhIGhyZWY9XCIvdXNlcnMvcmVjZW50X3ZpZGVvc1wiPvCdkIXwnZCC8J2fkDwvQT4nXSlcbiAgICAgICAgICAgICAgICBsaXN0WzBdID0gbGlzdGIuam9pbihcIixcIik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHNpID0gMlxuICAgICAgICAgICAgbGlzdGEgPSBwZGZhKGxpc3Rbc2ldLCBcImJvZHkmJmFcIilcbiAgICAgICAgICAgIGVsZW1lbnQgPSBsaXN0YS5zcGxpY2UoMiwgMSlbMF1cbiAgICAgICAgICAgIGxpc3RhLnVuc2hpZnQoZWxlbWVudCk7XG4gICAgICAgICAgICBsaXN0W3NpXSA9IGxpc3RhLmpvaW4oXCIsXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaXN0XG4gICAgfSksXG4gICAg5bCP57G7OiAnYm9keSYmYTpub3QoOm1hdGNoZXMo54Ot5pKtfDI1MHzlsIHpnaJ854yc5L2gfEZDMikpJyxcbiAgICDmoIfpopg6ICdUZXh0LmpzOmlucHV0LnJlcGxhY2UoXCLlkKtcIixcIlwiKS5yZXBsYWNlKFwi5Lit5a2X5Y+v5pKt5pS+XCIsXCLkuK3lrZdcIikucmVwbGFjZShcIuWPr+aSreaUvlwiLFwi5Y+v5pKtXCIpJyxcbn0sIHtcbiAgICAvL+S4gOe6p+WumuS9jTogJyN0YWdzJiZkdCcsXG4gICAg5LiA57qn5a6a5L2NOiBcIkBqczpcIiArICQudG9TdHJpbmcoKCkgPT4ge1xuICAgICAgICB2YXIgbGlzdCA9IHBkZmEoaHRtbCwgJyN0YWdzJiZkdCcpO1xuICAgICAgICBmb3IgKHZhciBpIGluIGxpc3QpIHtcbiAgICAgICAgICAgIHZhciBsaXN0YSA9IHBkZmEobGlzdFtpXSwgJ2JvZHkmJi50YWcnKTtcbiAgICAgICAgICAgIHRpdGxlID0gcGRmaChsaXN0W2ldLCAnc3Ryb25nJiZUZXh0JylcbiAgICAgICAgICAgIGxpc3RhWzBdID0gbGlzdGFbMF0ucmVwbGFjZShcIj7lhajpg6g8XCIsIFwiPlwiICsgdGl0bGUgKyBcIjxcIilcblxuICAgICAgICAgICAgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBsaXN0YS5zcGxpY2UoMywgMSlbMF1cbiAgICAgICAgICAgICAgICBsaXN0YS51bnNoaWZ0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBsaXN0YS5qb2luKFwiLFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaiBpbiBsaXN0YSkge1xuICAgICAgICAgICAgICAgIGxpc3RhW2pdID0gbGlzdGFbal0ucmVwbGFjZSgvYnV0dG9uL2csICdhJykucmVwbGFjZShcIm9uY2xpY2tcIiwgXCJocmVmXCIpLnJlcGxhY2UoXCJ3aW5kb3cubG9jYXRpb24uaHJlZj1cIiwgXCJcIikucmVwbGFjZSgvXFwnL2csIFwiXCIpLnJlcGxhY2UoLyg8YS4qPykoPzpjbGFzcz1cImRlbGV0ZSBpcy1zbWFsbFwiICkoLio/PikvLCBgJDEkMuKZiO+4j2ApLnJlcGxhY2UoXCJqYXZhc2NyaXB0OjtcIiwgdHJ1ZV91cmwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaXN0W2ldID0gbGlzdGEuam9pbihcIixcIilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGlzdFxuICAgIH0pLFxuICAgIOWwj+exuzogJ2JvZHkmJi50YWc6bm90KDptYXRjaGVzKOabtOWkmikpJyxcbiAgICDmoIfpopg6ICdUZXh0Jyxcbn0sIHtcbiAgICDkuIDnuqflrprkvY06IFwiQGpzOlwiICsgJC50b1N0cmluZygoKSA9PiB7XG4gICAgICAgIGlmICh0cnVlX3VybC5pbmNsdWRlcyhcIi9hY3RvcnMvY2Vuc29yZWRcIikpIHtcbiAgICAgICAgICAgIHZhciBsaXN0ID0gW3tcbiAgICAgICAgICAgICAgICBhZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAg5qCH6aKYOiBbXCLlubTpvoRcIiwgXCIxOS0zMFwiLCBcIjMxLTQwXCIsIFwiNDEtNTBcIiwgXCI1MC02NVwiXSxcbiAgICAgICAgICAgICAgICAgICAg6ZO+5o6lOiBbXCIxOSUyQzY1XCIsIFwiMTklMkMzMFwiLCBcIjMxJTJDNDBcIiwgXCI0MSUyQzUwXCIsIFwiNTAlMkM2NVwiXSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB7XG4gICAgICAgICAgICAgICAgICAgIOagh+mimDogW1wi6Lqr6auYXCIsIFwiMTMwLTE0NlwiLCBcIjE0Ny0xNTNcIiwgXCIxNTQtMTU5XCIsIFwiMTYwLTE2NVwiLCBcIjE2Ni0xNzBcIiwgXCIxNzEtMTc1XCIsIFwiMTc2LTE4MFwiLCBcIjE4MC0xODVcIl0sXG4gICAgICAgICAgICAgICAgICAgIOmTvuaOpTogW1wiMTMwJTJDMTg1XCIsIFwiMTMwJTJDMTQ2XCIsIFwiMTQ3JTJDMTUzXCIsIFwiMTU0JTJDMTU5XCIsIFwiMTYwJTJDMTY1XCIsIFwiMTY2JTJDMTcwXCIsIFwiMTcxJTJDMTc1XCIsIFwiMTc2JTJDMTgwXCIsIFwiMTgwJTJDMTg1XCJdLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBjdXA6IHtcbiAgICAgICAgICAgICAgICAgICAg5qCH6aKYOiBbXCLnvanmna9cIiwgXCJBXCIsIFwiQkNcIiwgXCJEXCIsIFwiRUZcIiwgXCJHSFwiLCBcIklKXCIsIFwiS1wiXSxcbiAgICAgICAgICAgICAgICAgICAg6ZO+5o6lOiBbXCIwJTJDMTVcIiwgXCIwJTJDMVwiLCBcIjElMkMzXCIsIFwiMyUyQzRcIiwgXCI0JTJDNlwiLCBcIjYlMkM4XCIsIFwiOCUyQzEwXCIsIFwiMTAlMkMxNVwiXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB2YXIgbmV3bGlzdCA9IFtdXG4gICAgICAgICAgICBsaXN0LmZvckVhY2goKGxpc3RhLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBPYmplY3Qua2V5cyhsaXN0YSk7XG4gICAgICAgICAgICAgICAgdmFyIHRpdGxlID0gbGlzdGFba2V5XS7moIfpophcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBsaXN0YVtrZXldLumTvuaOpVxuICAgICAgICAgICAgICAgIHZhciBsaXN0YiA9IHRpdGxlLm1hcCgoaXRlbSwgYml4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnPGEgaHJlZj1cIicgKyAnJicgKyBrZXkgKyAnPScgKyB2YWx1ZVtiaXhdICsgJ1wiPicgKyBpdGVtICsgJzwvYT4nO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgbGlzdGEgPSBsaXN0Yi5qb2luKFwiLFwiKVxuICAgICAgICAgICAgICAgIG5ld2xpc3QucHVzaChsaXN0YSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdsaXN0ID0gW11cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3bGlzdFxuICAgIH0pLFxuICAgIOWwj+exuzogXCJib2R5JiZhXCIsXG4gICAg6ZO+5o6l5aSE55CGOiAodSkgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSB1LnJlcGxhY2UoLy4qPyhcXCYuKikvLCBcIiQxXCIpXG4gICAgICAgIHZhciByZWdleCA9IHZhbHVlLm1hdGNoKC8mLio9LylbMF1cbiAgICAgICAgaWYgKHRydWVfdXJsLmluY2x1ZGVzKFwiYWdlPVwiKSkge1xuICAgICAgICAgICAgYnVybCA9IHRydWVfdXJsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBidXJsID0gZ2V0UHVibGljSXRlbShcImphdmRiMFwiLCBcImh0dHBzOi8vamF2ZGIuY29tXCIpICsgXCIvYWN0b3JzL2NlbnNvcmVkP3Q9ZmlsdGVyJmFnZT0xOSUyQzY1JmhlaWdodD0xMzAlMkMxODUmY3VwPTAlMkMxNSZidXN0PTcwJTJDMTIwJndhaXN0PTUwJTJDOTAmaGlwcz03MCUyQzEyMFwiXG4gICAgICAgIH1cbiAgICAgICAgdXJsID0gYnVybC5yZXBsYWNlKG5ldyBSZWdFeHAocmVnZXggKyBcIlteJl0rXCIpLCB2YWx1ZSlcbiAgICAgICAgcmV0dXJuIHVybFxuICAgIH0sXG4gICAg5qCH6aKYOiBcIlwiLFxuICAgIOmTvuaOpTogXCJcIlxufV1cblxuTVlfVVJMID0gTVlfVVJMLnNwbGl0KCcjIycpWzFdXG5sZXQgdHJ1ZV91cmwgPSBnZXRUcnVlbGluayhNWV9SVUxFLnVybCwgTVlfVVJMLCBwYWdlKTtcblxubG9nKHRydWVfdXJsKVxuXG52YXIgaHRtbCA9IGZldGNoKHRydWVfdXJsLCB7XG4gICAgaGVhZGVyczoge1xuICAgICAgICBjb29raWU6IGZldGNoUEMoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvQXBvbGxvL0Nvb2tpZS9qYXZkYl9jb29raWUudHh0JykgfHwgJycsXG4gICAgICAgIFwiVXNlci1BZ2VudFwiOiBcIk1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMjsgU00tRzk3NTAgQnVpbGQvU1AxQS4yMTA4MTIuMDE2OyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzg5LjAuNDM4OS43MiBNUVFCcm93c2VyLzYuMiBUQlMvMDQ2Mjc5IE1vYmlsZSBTYWZhcmkvNTM3LjM2XCIsXG4gICAgfSxcbiAgICByZWRpcmVjdDogZmFsc2Vcbn0pO1xuXG4vL2xvZyhodG1sKVxuXG4vKlxuaWYgKC9yZWRpcmVjdGVkLy50ZXN0KGh0bWwpJiYhL1xcL2ZjMi8udGVzdCh0cnVlX3VybCkpIHtcbiB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvQXBvbGxvL0Nvb2tpZS9qYXZkYl9jb29raWUudHh0JywgJycpO1xuICAgIGh0bWwgPSBmZXRjaCh0cnVlX3VybCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBjb29raWU6IGZldGNoUEMoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvQXBvbGxvL0Nvb2tpZS9qYXZkYl9jb29raWUudHh0JykgfHwgJycsICAgICAgICBcbiAgICAgICAgfSxcbiAgICAgICAgcmVkaXJlY3Q6IGZhbHNlXG4gICAgfSlcbn1cbiovXG5ldmFsKEpTT04ucGFyc2UocmVxdWVzdCgnaGlrZXI6Ly9wYWdlL3NlYXJjaCcpKS5ydWxlKVxuXG5jb25zdCBkYyA9IGR5bmFtaWNDbGFzcyh7XG4gICAg5YiG57G76aKc6ImyOiBcIlwiIC8vZ2V0UmFuZ2VDb2xvcnMoKVxufSk7XG5kYy7lvIDlkK/mipjlj6AoZmFsc2UpXG5kYy7lvIDlkK/mkJzntKIoZmFsc2UpXG5kYy7liJvlu7rliqjmgIHliIbnsbso5a6a5L2N5L+h5oGvKVxuXG5pZiAoL0p1c3RcXHNhXFxzbW9tZW50Ly50ZXN0KGh0bWwpKSB7XG4gICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgJ+iOt+WPlmNvb2tpZScuZm9udGNvbG9yKCcjRkYwMEZGJykuYmlnKCksXG4gICAgICAgIHVybDogdHJ1ZV91cmwgKyAkKCcnKS5ydWxlKCgpID0+IHtcbiAgICAgICAgICAgIHZhciBkID0gW107XG4gICAgICAgICAgICBkLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAneDVfd2Vidmlld19zaW5nbGUnLFxuICAgICAgICAgICAgICAgIHVybDogTVlfVVJMLFxuICAgICAgICAgICAgICAgIGRlc2M6ICdsaXN0JiZzY3JlZW4nLFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBcIk1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMjsgU00tRzk3NTAgQnVpbGQvU1AxQS4yMTA4MTIuMDE2OyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzg5LjAuNDM4OS43MiBNUVFCcm93c2VyLzYuMiBUQlMvMDQ2Mjc5IE1vYmlsZSBTYWZhcmkvNTM3LjM2XCIsIC8vUENfVUEsICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygodSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2soKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgbm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjdGFncycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbyA9IGZiYS5nZXRDb29raWUodSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXIgdWEgPSBmYmEuZ2V0VWEoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmJhLmxvZygnY286Ojo6OjonICsgdWEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coJ2NvOjo6Ojo6JyArIGNvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbENvbnRlbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC/msLjkuYXln5/lkI0vLnRlc3QoaHRtbENvbnRlbnQpKSB7XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEucGFyc2VMYXp5UnVsZSgkJCQoKS5sYXp5UnVsZSgoY28pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9BcG9sbG8vQ29va2llL2phdmRiX2Nvb2tpZS50eHQnLCBjbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2FzdCgn5bey6I635Y+WY29va2ll77yM5YiH5o2i5Yiw6aaW6aG1Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjbykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2ssIDUwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgTVlfVVJMKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHNldFJlc3VsdChkKTtcbiAgICAgICAgfSksXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcbiAgICB9KTtcbn1cblxudmFyIHBhcnNlUnVsZSA9IHtcbiAgICBsaXN0OiAnYm9keSYmLml0ZW0nLFxuICAgIHRpdGxlOiAnLnZpZGVvLXRpdGxlJiZUZXh0JyxcbiAgICBkZXNjMTogJy50YWdzJiZUZXh0JyxcbiAgICBkZXNjOiAnLm1ldGEmJlRleHQnLFxuICAgIGltZzogJ2ltZ3x8YSYmc3JjfHxkYXRhLW9yaWdpbmFsJyxcbiAgICB1cmw6ICdhJiZocmVmJyxcbiAgICByZWY6ICdAUmVmZXJlcj0nLFxuICAgIGNvbF90eXBlOiAnbW92aWVfMicsXG4gICAgaW10OiBmYWxzZSxcbiAgICAvL2JhY2tpbWc6IHRydWUsXG59XG5cbnZhciBwYXJzZVJ1bGUxID0ge1xuICAgIGxpc3Q6ICdib2R5JiYuYWN0b3ItYm94JyxcbiAgICB0aXRsZTogJ2EmJnRpdGxlJyxcbiAgICBkZXNjOiAnLm1ldGEmJlRleHQnLFxuICAgIGltZzogJ2ltZ3x8YSYmc3JjfHxkYXRhLW9yaWdpbmFsJyxcbiAgICB1cmw6ICdhJiZocmVmJyxcbiAgICByZWY6ICdAUmVmZXJlcj0nLFxuICAgIGNvbF90eXBlOiAnY2FyZF9waWNfMycsXG4gICAgaW10OiBmYWxzZSxcbiAgICAvL2JhY2tpbWc6IHRydWUsXG59XG5cbnZhciBwYXJzZVJ1bGUyID0ge1xuICAgIGxpc3Q6ICcjc2VyaWVzJiYuYm94JyxcbiAgICB0aXRsZTogJ3N0cm9uZyYmVGV4dCcsXG4gICAgZGVzYzogJ3NwYW4mJlRleHQnLFxuICAgIGltZzogJ2EmJmhyZWYuanM6aW5wdXQucmVwbGFjZShpbnB1dCxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vbW92aWUvMzAuc3ZnXCIpJyxcbiAgICB1cmw6ICdhJiZocmVmJyxcbiAgICByZWY6ICdAUmVmZXJlcj0nLFxuICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcbiAgICBpbXQ6IGZhbHNlLFxuICAgIC8vYmFja2ltZzogdHJ1ZSxcbn1cblxudmFyIHBhcnNlUnVsZTMgPSB7XG4gICAgbGlzdDogJyNtYWtlcnMmJi5ib3gnLFxuICAgIHRpdGxlOiAnc3Ryb25nJiZUZXh0JyxcbiAgICBkZXNjOiAnc3BhbiYmVGV4dCcsXG4gICAgaW1nOiAnYSYmaHJlZi5qczppbnB1dC5yZXBsYWNlKGlucHV0LFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9tb3ZpZS8zMC5zdmdcIiknLFxuICAgIHVybDogJ2EmJmhyZWYnLFxuICAgIHJlZjogJ0BSZWZlcmVyPScsXG4gICAgY29sX3R5cGU6ICdhdmF0YXInLFxuICAgIGltdDogZmFsc2UsXG4gICAgLy9iYWNraW1nOiB0cnVlLFxufVxuXG52YXIgcGFyc2VSdWxlNCA9IHtcbiAgICBsaXN0OiAnI2RpcmVjdG9ycyYmLmJveCcsXG4gICAgdGl0bGU6ICdzdHJvbmcmJlRleHQnLFxuICAgIGRlc2M6ICdzcGFuJiZUZXh0JyxcbiAgICBpbWc6ICdhJiZocmVmLmpzOmlucHV0LnJlcGxhY2UoaW5wdXQsXCJodHRwczovL2ltZy52aW51YS5jbi9pbWFnZXMvWGEyaEQucG5nXCIpJyxcbiAgICB1cmw6ICdhJiZocmVmJyxcbiAgICByZWY6ICdAUmVmZXJlcj0nLFxuICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcbiAgICBpbXQ6IGZhbHNlLFxuICAgIC8vYmFja2ltZzogdHJ1ZSxcbn1cblxudmFyIHBhcnNlUnVsZTUgPSB7XG4gICAgbGlzdDogJyNjb2RlcyYmLmJveCcsXG4gICAgdGl0bGU6ICdzdHJvbmcmJlRleHQnLFxuICAgIGRlc2M6ICdzcGFuJiZUZXh0JyxcbiAgICBpbWc6ICdhJiZocmVmLmpzOmlucHV0LnJlcGxhY2UoaW5wdXQsXCJodHRwczovL2ltZy52aW51YS5jbi9pbWFnZXMvT1RNNGsucG5nXCIpJyxcbiAgICB1cmw6ICdhJiZocmVmJyxcbiAgICByZWY6ICdAUmVmZXJlcj0nLFxuICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcbiAgICBpbXQ6IGZhbHNlLFxuICAgIC8vYmFja2ltZzogdHJ1ZSxcbn1cblxudmFyIHBhcnNlUnVsZTYgPSB7XG4gICAgbGlzdDogJyNsaXN0cyYmYScsXG4gICAgdGl0bGU6ICdzdHJvbmcmJlRleHQnLFxuICAgIGRlc2M6ICdhJiZ0aXRsZScsXG4gICAgaW1nOiAnYSYmaHJlZi5qczppbnB1dC5yZXBsYWNlKGlucHV0LFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9tb3ZpZS8zMC5zdmdcIiknLFxuICAgIHVybDogJ2EmJmhyZWYnLFxuICAgIHJlZjogJ0BSZWZlcmVyPScsXG4gICAgY29sX3R5cGU6ICdhdmF0YXInLFxuICAgIGltdDogZmFsc2UsXG4gICAgLy9iYWNraW1nOiB0cnVlLFxufVxuXG5pZiAodHJ1ZV91cmwuaW5jbHVkZXMoJy9hYm91dCcpKSB7XG4gICAgZXZhbChKU09OLnBhcnNlKHJlcXVlc3QoJ2hpa2VyOi8vcGFnZS/mlLbol48nKSkucnVsZSlcbn1cblxuaWYgKHRydWVfdXJsLmluY2x1ZGVzKCcvbG9nb3V0JykpIHtcbiAgICB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvQXBvbGxvL0Nvb2tpZS9qYXZkYl9jb29raWUudHh0JywgJycpO1xuICAgIHRvYXN0KCfotKblj7flt7Lnmbvlh7onKTtcbn1cblxuaWYgKHRydWVfdXJsLmluY2x1ZGVzKCcvbG9naW4nKSkge1xuICAgIGV2YWwoSlNPTi5wYXJzZShyZXF1ZXN0KCdoaWtlcjovL3BhZ2Uv55m75b2VJykpLnJ1bGUpXG59XG5cbkNyZWF0ZS5ydWxlTGlzdChkLCBodG1sLCBwYXJzZVJ1bGUpO1xuXG5DcmVhdGUuTGlzdChkLCBodG1sLCBwYXJzZVJ1bGUxKTtcblxuQ3JlYXRlLkxpc3QoZCwgaHRtbCwgcGFyc2VSdWxlMik7XG5cbkNyZWF0ZS5MaXN0KGQsIGh0bWwsIHBhcnNlUnVsZTMpO1xuXG5pZiAoL3NlYXJjaHxjb2xsZWN0aW9uX2RpcmVjdG9ycy8udGVzdCh0cnVlX3VybCkpIHtcbiAgICBDcmVhdGUuTGlzdChkLCBodG1sLCBwYXJzZVJ1bGU0KTtcbn1cblxuaWYgKHRydWVfdXJsLmluY2x1ZGVzKCdjb2xsZWN0aW9uX2NvZGVzJykpIHtcbiAgICBDcmVhdGUuTGlzdChkLCBodG1sLCBwYXJzZVJ1bGU1KTtcbn1cblxuaWYgKHRydWVfdXJsLmluY2x1ZGVzKCdzZWFyY2g/Zj1saXN0JykpIHtcbiAgICBDcmVhdGUuTGlzdChkLCBodG1sLCBwYXJzZVJ1bGU2KTtcbn1cblxuYXV0b1BhZ2UoKTtcblxuc2V0UmVzdWx0KGQpIiwic2VhcmNoX3VybCI6IiIsImdyb3VwIjoi4pGgQSIsInNlYXJjaEZpbmQiOiIiLCJkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwiZGV0YWlsX2ZpbmRfcnVsZSI6IiIsInNkZXRhaWxfY29sX3R5cGUiOiJtb3ZpZV8xIiwic2RldGFpbF9maW5kX3J1bGUiOiIiLCJ1YSI6Im1vYmlsZSIsInByZVJ1bGUiOiJ2YXIg5byA5ZCv57+76K+RID0gXCLlvankupHlsI/or5FcIjsvL3RydWUsXCLlvankupHlsI/or5FcIu+8jFwi5bCP54mb57+76K+RXCLvvIxcIkFJ57+76K+RXCJcblxuLy/lsI/niZvnv7vor5FBUEnvvJpodHRwczovL25pdXRyYW5zLmNvbS90ZXh0X3RyYW5zXG4vL+S4iumdoue9keWdgOazqOWGjOiOt+WPluWFjei0uWFwaVxudmFyIGFwaSA9IFwiYWUzMzdiNjExMTNiZDgxZGI5MTEyMGRjNGVmOWIwNVwiO1xuLy/kuIrpnaLlj4zlvJXlj7fph4zloavlhaXlhY3otLlhcGk7XG5cbnNldEl0ZW0oJ2FwaScsYXBpKTtcbnNldEl0ZW0oJ3N3aXRjaHRyYW5zJyzlvIDlkK/nv7vor5EpO1xuXG52YXIg5pu05paw6Ze06ZqUID0gMVxubGV0IHRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKS50b1N0cmluZygpXG5mdW5jdGlvbiBjb3VudENyb3NzZWREYXlzKGRhdGUxLCBkYXRlMikge1xuICAgIHZhciBkMSA9IG5ldyBEYXRlKE51bWJlcihkYXRlMSkpO1xuICAgIHZhciBkMiA9IG5ldyBEYXRlKE51bWJlcihkYXRlMikpO1xuICAgIC8vIOiOt+WPluWujOaVtOaXpeacn+mDqOWIhlxuICAgIHZhciBzdGFydCA9IG5ldyBEYXRlKGQxLmdldEZ1bGxZZWFyKCksIGQxLmdldE1vbnRoKCksIGQxLmdldERhdGUoKSk7XG4gICAgdmFyIGVuZCA9IG5ldyBEYXRlKGQyLmdldEZ1bGxZZWFyKCksIGQyLmdldE1vbnRoKCksIGQyLmdldERhdGUoKSk7ICAgIFxuICAgIC8vIOWIpOaWreW8gOWni+WSjOe7k+adn+aXpeacn1xuICAgICB2YXIgdGltZURpZmZlcmVuY2UgPSBNYXRoLmFicyhlbmQgLSBzdGFydCk7XG4gICAgIC8vIOiuoeeul+i3qOi2iueahOWkqeaVsFxuICAgICB2YXIgY3Jvc3NlZERheXMgPSBNYXRoLmNlaWwodGltZURpZmZlcmVuY2UgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpO1xuICAgICByZXR1cm4gY3Jvc3NlZERheXM7IC8vIOi/lOWbnui3qOi2iueahOWkqeaVsFxufVxudmFyIOi3qOi2iuWkqeaVsCA9IGNvdW50Q3Jvc3NlZERheXModGltZSxnZXRJdGVtKCd0aW1lJywgbmV3IERhdGUoKS5nZXRUaW1lKCkpKVxuXG5pZiAo6Leo6LaK5aSp5pWwID49IOabtOaWsOmXtOmalCkge1xuICAgICAgICAgICAgc2V0SXRlbSgndGltZScsIHRpbWUpO1xuICAgICAgICAgICAgbGV0IEhPTUUgPSBNWV9SVUxFLnVybC5tYXRjaCgvaHR0cHM/OlxcL1xcL1teIy8/Jl0rXFwvLylbMF07XG4gICAgICAgICAgICB2YXIgaHRtbCA9IGZldGNoKEhPTUUgKyAnYWJvdXQnLHtkbnM6J2h0dHBzOi8vMS4xLjEuMS9kbnMtcXVlcnknfSk7XG4gICAgICAgICAgICB2YXIgdXJsID0gcGRmaChodG1sLCcuc3ViLWhlYWRlciYmLmNvbnRlbnQmJmFbaHJlZn49Y29tXSYmaHJlZicpXG4vL2xvZygn5YWN57+75Zyw5Z2A77yaJyt1cmwpXG5pZiAoSE9NRSAhPT0gdXJsKSB7XG4gICAgY29uZmlybSh7XG4gICAgICAgIHRpdGxlOiBcIuabtOaWsOaPkOekulwiLFxuICAgICAgICBjb250ZW50OiBcIuacieacgOaWsOWFjee/u+WcsOWdgCzmmK/lkKbmm7TmlrBcIixcbiAgICAgICAgY29uZmlybTogJC50b1N0cmluZygodXJsKSA9PiB7XG4gICAgICAgICAgICB2YXIgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgdmFyIHllYXIgPSBjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgdmFyIG1vbnRoID0gU3RyaW5nKGN1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICAgICAgdmFyIGRheSA9IFN0cmluZyhjdXJyZW50RGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgICAgICBNWV9SVUxFLnZlcnNpb24gPSBgJHt5ZWFyfSR7bW9udGh9JHtkYXl9YDtcbiAgICAgICAgICAgIC8oaHR0cHM/OlxcL1xcL1teIy8/Jl0rXFwvKS8udGVzdChNWV9SVUxFLnVybCk7XG4gICAgICAgICAgICBNWV9SVUxFLnVybCA9IE1ZX1JVTEUudXJsLnJlcGxhY2UoUmVnRXhwLiQxLCB1cmwpO1xuICAgICAgICAgICAgcmV0dXJuIFwicnVsZTovL1wiICsgYmFzZTY0RW5jb2RlKFwi5rW36ZiU6KeG55WM77+laG9tZV9ydWxl77+lXCIgKyBKU09OLnN0cmluZ2lmeShNWV9SVUxFKSk7ICAgICAgICAgICAgXG4gICAgICAgIH0sdXJsKSxcbiAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gXCJ0b2FzdDovL/CfmIdcIjtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgfVxufVxuXG5wdXRNeVZhcigneW9uZ2ppdScsJ2h0dHBzOi8vamF2ZGIuY29tJylcbnB1dE15VmFyKCdmYzInLFwiaGlrZXI6Ly9lbXB0eVwiKVxuaG9zdCA9IE1ZX1JVTEUudXJsLm1hdGNoKC9odHRwcz86XFwvXFwvW14jLz8mXSsvKVswXTtcbnNldFB1YmxpY0l0ZW0oJ2phdmRiMCcsaG9zdCk7XG5cbnJlZ2lzdGVyRE5TKHtcbiAgICBcImphdmRiLmNvbVwiOiBcImh0dHBzOi8vMjIzLjUuNS41L2Rucy1xdWVyeVwiLFxuICAgICBob3N0OiBcImh0dHBzOi8vMjIzLjUuNS41L2Rucy1xdWVyeVwiLFxufSk7IiwicGFnZXMiOiJbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuKRoOS4gOe6p+WIhuexu+WIl+ihqFwiLFwicGF0aFwiOlwieWlcIixcInJ1bGVcIjpcImpzOlxcbi8qXFxuYnkgzrEoemV0YWxwaGEpXFxu5LiA57qn5bCB6KOFXFxu5Yqo5oCB5YiG57G7IOWIl+ihqOWIm+W7uiDoh6rliqjkuIvkuIDpobVcXG52ZXIgMjAyMzEwMTcgMS4wXFxuKi9cXG5cXG4vL+maj+acuuminOiJslxcbnZhciBnZXRSYW5nZUNvbG9ycyA9IGZ1bmN0aW9uKCkge1xcbiAgICByZXR1cm4gJyMnICsgKCcwMDAwMCcgKyAoTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMCA8PCAwKS50b1N0cmluZygxNikpLnN1YnN0cigtNik7XFxufVxcblxcbi8v5Yqo5oCB5YiG57G7XFxuZnVuY3Rpb24gZHluYW1pY0NsYXNzKG9wdGlvbnMpIHtcXG4gICAgY29uc3Qgb2JqID0ge1xcbiAgICAgICAgLy/pu5jorqTlgLxcXG4gICAgICAgIGxheW91dDogXFxcInVuZGVmaW5lZFxcXCIsXFxuICAgICAgICBodG1sOiBcXFwiZW1wdHlcXFwiLFxcbiAgICAgICAgcGFnZTogMCxcXG4gICAgICAgIOWIhuexu+minOiJsjogXFxcIiNGQTcyOThcXFwiLFxcbiAgICAgICAg5oqY5Y+gOiBcXFwi4oCc4oCc4oCd4oCdPGI+XFxcIiArIFxcXCLiiKdcXFwiLmZvbnRjb2xvcihcXFwiIzFhYWQxOVxcXCIpICsgXFxcIjwvYj5cXFwiLFxcbiAgICAgICAg5bGV5byAOiBcXFwi4oCc4oCc4oCd4oCdPGI+XFxcIiArIFxcXCLiiKhcXFwiLmZvbnRjb2xvcihcXFwiI0ZGMDAwMFxcXCIpICsgXFxcIjwvYj5cXFwiLFxcbiAgICAgICAgb3BlbjogdHJ1ZSxcXG4gICAgICAgIHN0YXRlOiBNWV9SVUxFLnVybCxcXG4gICAgICAgIHNlYXJjaDogZmFsc2UsXFxuICAgICAgICBjbGVhcnM6IFtdLFxcbiAgICAgICAgY2xlYXJhbGw6IFtcXFwieWlfZmlyc3RwYWdlXFxcIl0sXFxuICAgICAgICBkZWJ1ZzogZmFsc2UsXFxuXFxuICAgICAgICDpooTorr4ocGFyYW0pIHtcXG4gICAgICAgICAgICBpZiAocGFyYW0gPT0gdW5kZWZpbmVkKSB7XFxuICAgICAgICAgICAgICAgIHBhcmFtID0gW107XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcmFtKS5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xcbiAgICAgICAgICAgICAgICAvLyDlr7nmr4/kuKrlsZ7mgKflkI3miafooYzmk43kvZxcXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbVtwcm9wZXJ0eV07IC8vIOiOt+WPluWxnuaAp+WAvFxcbiAgICAgICAgICAgICAgICAvLyDlnKjov5nph4zmiafooYzmgqjnmoTmk43kvZxcXG4gICAgICAgICAgICAgICAgdGhpc1twcm9wZXJ0eV0gPSB2YWx1ZTtcXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHByb3BlcnR5ICsgXFxcIjpcXFwiICsgdmFsdWUpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9LFxcbiAgICAgICAgZXZhbEpTUnVsZShpdGVtLFxcbiAgICAgICAgICAgIGpzUnVsZSkge1xcbiAgICAgICAgICAgIGxldCBydWxlID0ganNSdWxlLnJlcGxhY2UoXFxcIkBqczpcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiXFxcIik7XFxuICAgICAgICAgICAgcnVsZSA9IHJ1bGUudHJpbSgpO1xcbiAgICAgICAgICAgIC8vbG9nKCQuc3RyaW5naWZ5KHJ1bGUpKVxcbiAgICAgICAgICAgIGxldCBpbnB1dCA9IGl0ZW07XFxuICAgICAgICAgICAgaWYgKHJ1bGUuc3RhcnRzV2l0aChcXFwiKFxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIGV2YWwoXFxcInJlc3VsdCA9IFxcXCIgKyBydWxlKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgICAgICog6L+Y5Y6f5oiQICQudG9TdHJpbmcoLi4uKSDnmoTmnIDnu4jnu5PmnpzvvIzovr7liLDmnIDnu4jlpITnkIbmlrnlvI/ot5/kuIrpnaLnmoQgaWYg5LiA6Ie055qE55uu55qEXFxuICAgICAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgICAgICBldmFsKFxcXCJyZXN1bHQgPSBcXFwiICsgXFxcIigoKSA9PiB7XFxcIiArIHJ1bGUgKyBcXFwifSkoKVxcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0IHx8IFxcXCJcXFwiO1xcbiAgICAgICAgfSxcXG4gICAgICAgIGdldFRpdGxlKHNyYywgY2F0ZWdvcnkpIHtcXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICBsZXQgdGl0bGVSdWxlID0gY2F0ZWdvcnkgfHwgXFxcImEmJlRleHRcXFwiO1xcbiAgICAgICAgICAgIGlmICh0aXRsZVJ1bGUuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIHRpdGxlID0gdGhpcy5ldmFsSlNSdWxlKHNyYywgdGl0bGVSdWxlKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB0aXRsZSA9IHBhcnNlRG9tRm9ySHRtbChzcmMsIHRpdGxlUnVsZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiB0aXRsZSB8fCBcXFwiXFxcIjtcXG4gICAgICAgIH0sXFxuICAgICAgICBnZXRVcmwoc3JjLCBjYXRlZ29yeSkge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICBsZXQgdXJsUnVsZSA9IGNhdGVnb3J5LumTvuaOpSB8fCBcXFwiYSYmaHJlZlxcXCI7XFxuICAgICAgICAgICAgaWYgKHVybFJ1bGUuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHRoaXMuZXZhbEpTUnVsZShzcmMsIHVybFJ1bGUpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHBkKHNyYywgdXJsUnVsZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2F0ZWdvcnku6ZO+5o6l5aSE55CGID09IFxcXCJmdW5jdGlvblxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gY2F0ZWdvcnku6ZO+5o6l5aSE55CGKHVybCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiB1cmwgfHwgXFxcIlxcXCI7XFxuICAgICAgICB9LFxcbiAgICAgICAgaXNOdWxsKHBhcmFtKSB7XFxuICAgICAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgICAgIH0sXFxuICAgICAgICBpc0Jvb2xlYW4odmFyaWFibGUpIHtcXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhcmlhYmxlICE9PSBcXFwiYm9vbGVhblxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLlvIDlkK/mipjlj6Dor7fkvKDlhaXluIPlsJTlgLxcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICAgICAg5riF6ZmkKGxpc3QpIHtcXG4gICAgICAgICAgICBpZiAodGhpcy5pc051bGwobGlzdCkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChsaXN0LmNvbnN0cnVjdG9yID09IFN0cmluZykge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIua4hemZpOaKpemUmTror7fkvKDliJfooahcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgdGhpcy5jbGVhcnMgPSBsaXN0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOWFqOa4hShsaXN0KSB7XFxuICAgICAgICAgICAgaWYgKHRoaXMuaXNOdWxsKGxpc3QpKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB2YXIgYyA9IHRoaXMuY2xlYXJhbGw7XFxuICAgICAgICAgICAgbGlzdCA9IGMuY29uY2F0KGxpc3QpO1xcbiAgICAgICAgICAgIHRoaXMuY2xlYXJhbGwgPSBsaXN0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOa6kOeggShpbnB1dCkge1xcbiAgICAgICAgICAgIHRoaXMuaHRtbCA9IGlucHV0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOeVjOmdoihpbnB1dCkge1xcbiAgICAgICAgICAgIHRoaXMubGF5b3V0ID0gaW5wdXQ7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICB9LFxcbiAgICAgICAg6aG156CBKGlucHV0KSB7XFxuICAgICAgICAgICAgdGhpcy5wYWdlID0gaW5wdXQ7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICB9LFxcbiAgICAgICAg54q25oCBKGlucHV0KSB7XFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IGlucHV0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOW8gOWQr+aQnOe0oihpbnB1dCkge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICAgICAgaW5wdXQgPSB0cnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLnNlYXJjaCA9IGlucHV0O1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfSxcXG4gICAgICAgIOW8gOWQr+aKmOWPoChpbnB1dCkge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICAgICAgaW5wdXQgPSB0cnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB0aGlzLmlzQm9vbGVhbihpbnB1dCk7XFxuICAgICAgICAgICAgdGhpcy5vcGVuID0gaW5wdXQ7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgICAgICB9LFxcbiAgICAgICAgc2V0VGl0bGUoaywgaSwgdCkge1xcbiAgICAgICAgICAgIHJldHVybiBrID09IGkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIHQuZm9udGNvbG9yKHRoaXMu5YiG57G76aKc6ImyKSA6IHQ7XFxuICAgICAgICB9LFxcbiAgICAgICAgc2V0Ymdjb2xvcihrLGksdCl7XFxuICAgICAgICAgICAgcmV0dXJuICggayA9PSBpIHx8IHQuaW5jbHVkZXMoXFxcIuKZiO+4j1xcXCIpKSA/IGdldFJhbmdlQ29sb3JzKCkgOiBcXFwiXFxcIjtcXG4gICAgICAgIH0sXFxuICAgICAgICBhY3Rpb24ob2JqKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFt7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi5riF6Zmk54q25oCBXFxcIixcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKG9iaikgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKG9iaik7XFxuICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKG9iai5zdGF0ZSk7XFxuICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKFxcXCJoZWFkLmNhdGVcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoJ2NhdGVfYnV0dG9uJyk7XFxuICAgICAgICAgICAgICAgICAgICBvYmouYWxsLmZvckVhY2goKGl0ZW0pID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICBvYmouY2wuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoaXRlbSk7XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIH0sIG9iaiksXFxuICAgICAgICAgICAgfSwgXTtcXG4gICAgICAgIH0sXFxuICAgICAgICBjaGVja1BhcmFtKCkge1xcbiAgICAgICAgICAgIHZhciBvYmogPSB7fTtcXG4gICAgICAgICAgICBpZiAodGhpcy5wYWdlID09IDAgJiYgdHlwZW9mIHBhZ2UgPT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7fkvKDlhaXpobXnoIFcXFwiKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhZ2UgPT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIG9ialtcXFwi6aG156CBXFxcIl0gPSB0aGlzLnBhZ2U7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBvYmpbXFxcIumhteeggVxcXCJdID0gcGFnZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAodGhpcy5odG1sID09IFxcXCJlbXB0eVxcXCIgJiYgdHlwZW9mIGh0bWwgPT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7fkvKDlhaXmupDnoIFcXFwiKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGh0bWwgPT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIG9ialtcXFwi5rqQ56CBXFxcIl0gPSB0aGlzLmh0bWw7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBvYmpbXFxcIua6kOeggVxcXCJdID0gaHRtbDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXQgPT0gXFxcInVuZGVmaW5lZFxcXCIgJiYgdHlwZW9mIGQgPT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7fkvKDlhaXnlYzpnaJcXFwiKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGQgPT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIG9ialtcXFwi55WM6Z2iXFxcIl0gPSB0aGlzLmxheW91dDtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIG9ialtcXFwi55WM6Z2iXFxcIl0gPSBkO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBvYmo7XFxuICAgICAgICB9LFxcbiAgICAgICAg5Yib5bu65Yqo5oCB5YiG57G7KHJ1bGVPYmopIHtcXG4gICAgICAgICAgICBsZXQgaXRlbXMgPSBbXTtcXG4gICAgICAgICAgICBsZXQgY2F0ZXMgPSBbXTtcXG4gICAgICAgICAgICBpZiAocnVsZU9iaiA9PSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICAgICAgcnVsZU9iaiA9IFtdO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvL+WIneWni+WMluWPmOmHj+W8gOWni1xcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtID0gdGhpcy5jaGVja1BhcmFtKCk7XFxuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHBhcmFtLumhteeggTtcXG4gICAgICAgICAgICBjb25zdCBodG1sID0gcGFyYW0u5rqQ56CBO1xcbiAgICAgICAgICAgIGNvbnN0IGQgPSBwYXJhbS7nlYzpnaI7XFxuICAgICAgICAgICAgY29uc3Qg54q25oCBID0gdGhpcy5zdGF0ZTtcXG4gICAgICAgICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLnNlYXJjaDtcXG4gICAgICAgICAgICBjb25zdCBlbXB0eSA9IFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICBjb25zdCDmipjlj6DnirbmgIEgPSB0aGlzLm9wZW47XFxuICAgICAgICAgICAgdmFyIOWxleW8gCA9IHRoaXMu5bGV5byAO1xcbiAgICAgICAgICAgIHZhciDmipjlj6AgPSB0aGlzLuaKmOWPoDtcXG4gICAgICAgICAgICB2YXIg5YWo5riFID0gdGhpcy5jbGVhcmFsbDtcXG4gICAgICAgICAgICB2YXIg5riF6ZmkID0gdGhpcy5jbGVhcnM7XFxuICAgICAgICAgICAgLy/liJ3lp4vljJblj5jph4/nu5PmnZ9cXG4gICAgICAgICAgICBsZXQgaW5pdF9jYXRlID0gbmV3IEFycmF5KDIwKS5maWxsKFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgY29uc3QgZm9sZCA9IGdldE15VmFyKE1ZX1JVTEUuZ3JvdXAsIFxcXCIwXFxcIik7XFxuICAgICAgICAgICAgY29uc3QgY2F0ZV90ZW1wID0gSlNPTi5wYXJzZShcXG4gICAgICAgICAgICAgICAgZ2V0TXlWYXIoXFxcImhlYWQuY2F0ZVxcXCIsIEpTT04uc3RyaW5naWZ5KGluaXRfY2F0ZSkpXFxuICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICBpZiAoc2VhcmNoICYmIHBhZ2UgPT0gMSkge1xcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIHVybDogXFxcIidoaWtlcjovL3NlYXJjaD9ydWxlPVxcXCIgKyBNWV9SVUxFLnRpdGxlICsgXFxcIiZzPScraW5wdXRcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogXFxcIuaQnOe0ouWFs+mUruivjVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcihcXFwia2V5d29yZFxcXCIsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJrZXl3b3JkXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbXTtcXG4gICAgICAgICAgICBydWxlT2JqLmZvckVhY2goKHgpID0+IHtcXG4gICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBbXTtcXG4gICAgICAgICAgICAgICAgLy9sb2coeClcXG4gICAgICAgICAgICAgICAgaWYgKHguanNvbiAhPSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICAgICAgICAgIHguanNvbi5tYXAoayA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKEpTT04uc3RyaW5naWZ5KGspLnJlcGxhY2UoL15cXFxcW3xcXFxcXSQvZywgJycpKVxcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIC8vY2F0ZWdvcmllcy5wdXNoKHguanNvbilcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoeC7kuIDnuqflrprkvY0pIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh4LuS4gOe6p+WumuS9jS5zdGFydHNXaXRoKFxcXCJAanM6XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ID0gdGhpcy5ldmFsSlNSdWxlKGh0bWwsIHgu5LiA57qn5a6a5L2NKTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCA9IHBkZmEoaHRtbCwgeC7kuIDnuqflrprkvY0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmICh4LuWkp+exu+WumuS9jSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHgu5aSn57G75a6a5L2NLnN0YXJ0c1dpdGgoXFxcIkBqczpcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgPSB0aGlzLmV2YWxKU1J1bGUoaHRtbCwgeC7lpKfnsbvlrprkvY0pO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ID0gW3BkZmEoaHRtbCwgeC7lpKfnsbvlrprkvY0pLmpvaW4oJ1xcXFxuJyldO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuXFxuXFxuICAgICAgICB2YXIg5LiA57qnID0gbGlzdC5tYXAoKHMpID0+IHtcXG4gICAgICAgICAgdmFyIHNsaXN0ID0gW107XFxuICAgICAgICAgIGlmICghKFxcXCLlsI/nsbtcXFwiIGluIHgpKSB7XFxuICAgICAgICAgICAgeC7lsI/nsbsgPSBcXFwiYm9keSYmYTpub3QoOm1hdGNoZXMo6aaW6aG1KSk6bm90KGE6bm90KFtocmVmXSkpXFxcIjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZiAoeC7lsI/nsbsuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgc2xpc3QgPSB0aGlzLmV2YWxKU1J1bGUocywgeC7lsI/nsbspO1xcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHNsaXN0ID0gcGRmYShzLCB4LuWwj+exuyk7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgLy8tLemineWkluWkhOeQhi0tXFxuICAgICAgICAgIGlmICgoJ+WinuWKoCcgaW4geCkpIHtcXG4gICAgICAgICAgICBpZiAoeC7lop7liqAuY29uc3RydWN0b3IgPT0gU3RyaW5nKSB7XFxuICAgICAgICAgICAgICB4LuWinuWKoCA9IGV2YWwoeC7lop7liqApO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBzbGlzdCA9IHgu5aKe5YqgLmNvbmNhdChzbGlzdCk7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKCgn6KGl5YWFJyBpbiB4KSkge1xcbiAgICAgICAgICAgIGlmICh4LuihpeWFhS5jb25zdHJ1Y3RvciA9PSBTdHJpbmcpIHtcXG4gICAgICAgICAgICAgIHgu6KGl5YWFID0gZXZhbCh4LuihpeWFhSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHNsaXN0ID0gc2xpc3QuY29uY2F0KHgu6KGl5YWFKTtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICAvLy0t6aKd5aSW5aSE55CGLS1cXG4gICAgICAgICAgdmFyIOWumuS9jSA9IHNsaXN0Lm1hcCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgIHZhciB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoaXRlbSwgeC7moIfpopgpO1xcbiAgICAgICAgICAgIHZhciB1cmwgPSB0aGlzLmdldFVybChpdGVtLCB4KTtcXG4gICAgICAgICAgICB2YXIgb2JqID0ge1xcbiAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLCB1cmw6IHVybFxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgaWYgKCgnZXh0JyBpbiB4KSkge1xcbiAgICAgICAgICAgICAgb2JqWydleHQnXSA9IHguZXh0O1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKTtcXG4gICAgICAgICAgfSk7XFxuICAgICAgICAgIHJldHVybiDlrprkvY07XFxuICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgLy9sb2co5LiA57qnKVxcbiAgICAgICAgICAgICAgICAvL2xvZyjkuIDnuqcubGVuZ3RoKVxcbiAgICAgICAgICAgICAgICBpZiAo5LiA57qnLmxlbmd0aCA9PSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yaWVzLnB1c2go5LiA57qnLmpvaW4oXFxcIlxcXFxuXFxcIikpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAg5LiA57qnLmZvckVhY2goKGl0ZW0pID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yaWVzLnB1c2goaXRlbS5qb2luKFxcXCIsXFxcIikpO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgLy9sb2coY2F0ZWdvcmllcylcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBpZiAo5oqY5Y+g54q25oCBKSB7XFxuICAgICAgICAgICAgICAgIGlmIChwYWdlID09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBmb2xkID09PSBcXFwiMVxcXCIgPyDmipjlj6AgOiDlsZXlvIAsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGl0bGUsIGZvbGQsIHUsIGFsbCwgZXhwcykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvbGQgPSBnZXRNeVZhcihNWV9SVUxFLmdyb3VwLCBmb2xkKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBb5bGV5byALCDmipjlj6BdID0gZXhwcztcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2xkID09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3ggPSBmaW5kSXRlbXNCeUNscyh0aXRsZSArICdjYXRlX2J1dHRvbicpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKCdjYXRlX2J1dHRvbicsIGN4KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVJdGVtQnlDbHModGl0bGUgKyAnY2F0ZV9idXR0b24nKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN4ID0gc3RvcmFnZTAuZ2V0TXlWYXIoJ2NhdGVfYnV0dG9uJywgW10pLm1hcCh4ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFsnY29sX3R5cGUnXSA9IHhbJ2NvbF90eXBlJ10gPyB4Wydjb2xfdHlwZSddIDogeFsndHlwZSddO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRJdGVtQWZ0ZXIodGl0bGUgKyAnY2F0ZV9saW5lJywgY3gpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmFsbC5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoaXRlbSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsqL1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh0aXRsZSArICdjYXRlX2V4cCcsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZm9sZCA9PSAxID8g5bGV5byAIDog5oqY5Y+gLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKE1ZX1JVTEUuZ3JvdXAsIGZvbGQgPT09IFxcXCIxXFxcIiA/IFxcXCIwXFxcIiA6IFxcXCIxXFxcIik7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ZX1JVTEUudGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIOeKtuaAgSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAg5YWo5riFLCBb5bGV5byALFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5oqY5Y+gXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBNWV9SVUxFLnRpdGxlICsgJ2NhdGVfZXhwJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiB0aGlzLmFjdGlvbih7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTog54q25oCBLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsOiDlhajmuIUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDog5riF6ZmkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5LCBpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgLy9sb2coY2F0ZWdvcnkpXFxuICAgICAgICAgICAgICAgICAgICBsZXQgc3ViX2NhdGVnb3JpZXMgPSBbXTtcXG4gICAgICAgICAgICAgICAgICAgIC8qaWYgKOWwj+exu+WumuS9jS5pbmNsdWRlcyhcXFwiO1xcXCIpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzID0gcGRmYShjYXRlZ29yeSwg5bCP57G75a6a5L2NLnNwbGl0KFxcXCI7XFxcIilbMF0pO1xcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViX2NhdGVnb3JpZXMubGVuZ3RoID09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcyA9IHBkZmEoY2F0ZWdvcnksIOWwj+exu+WumuS9jS5zcGxpdChcXFwiO1xcXCIpWzFdKTtcXG4gICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsqL1xcbiAgICAgICAgICAgICAgICAgICAgLy9sb2coaW5kZXgpXFxuICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcyA9IEpTT04ucGFyc2UoYFske2NhdGVnb3J5fV1gKTtcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKHN1Yl9jYXRlZ29yaWVzKVxcbiAgICAgICAgICAgICAgICAgICAgLy8gc3ViX2NhdGVnb3JpZXMgPSBwZGZhKGNhdGVnb3J5LCDlsI/nsbvlrprkvY0pO1xcbiAgICAgICAgICAgICAgICAgICAgLy99XFxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL+Wkp+exu1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCB0aXRsZSA9IHBkZmgoaXRlbSwgX+Wkp+exu+agh+mimCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0ZW0udGl0bGU7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yg5o6S6ZmkICE9IFxcXCJ1bmRlZmluZWRcXFwiICYmIOaOkumZpCAhPSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKG5ld1JlZ0V4cCjmjpLpmaQsIFxcXCJnXFxcIiksIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQganNvbiA9ICcnXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSBpdGVtLnVybDtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVfdGVtcDogY2F0ZV90ZW1wLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBwYWdlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJzOiDmuIXpmaQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uOiBqc29uLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IOeKtuaAgSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbGNsZWFyczog5YWo5riFLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCB1cmwgPSBwZChpdGVtLCBf5aSn57G76ZO+5o6lKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGl0ZW0udXJsO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlmICjlpKfnsbvlpITnkIYpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSDkuIDnuqfliIbnsbvlpITnkIYodXJsKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSovXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbG9nKHVybClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5zZXRUaXRsZShrZXkudG9TdHJpbmcoKSwgY2F0ZV90ZW1wW2luZGV4XSwgdGl0bGUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7ICdiYWNrZ3JvdW5kQ29sb3InOiB0aGlzLnNldGJnY29sb3Ioa2V5LnRvU3RyaW5nKCksIGNhdGVfdGVtcFtpbmRleF0sIHRpdGxlKX0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQoXFxcImhpa2VyOi8vZW1wdHkjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld19jYXRlID0gW107XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jbGVhcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihpdGVtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5hbGxjbGVhcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcihpdGVtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoJ2NhdGVfYnV0dG9uJyk7XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYXRlX3RlbXAuZm9yRWFjaCgoY2F0ZSwgaW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jYXRlLnB1c2goaW5kZXggPT09IDAgPyBwYXJhbXMua2V5LnRvU3RyaW5nKCkgOiBcXFwiMFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImhlYWQuY2F0ZVxcXCIsIEpTT04uc3RyaW5naWZ5KG5ld19jYXRlKSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuanNvbi5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiZHRfXFxcIiArIHBhcmFtcy5qc29uLnR5cGUsIHBhcmFtcy5qc29uLnZhbHVlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhcmFtcy5zdGF0ZSwgcGFyYW1zLmpzb24pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX1JVTEUudGl0bGUgKyAnY2F0ZV9saW5lJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvL+Wwj+exu1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXh0cmFwb3MgPSBmYWxzZTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppZiAoaXRlbS5pbmNsdWRlcygndHlwZT1cXFwiQGV4dHJhXFxcIicpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFwb3MgPSB0cnVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbG9nKCfpmYTliqDlrprkvY0nKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ki9cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhcG9zKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGl0bGUgPSBwZGZoKGl0ZW0sIFxcXCJhJiZUZXh0XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIOaOkumZpCAhPSBcXFwidW5kZWZpbmVkXFxcIiAmJiDmjpLpmaQgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cCjmjpLpmaQsIFxcXCJnXFxcIiksIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqc29uID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHBkZmgoaXRlbSwgXFxcImEmJnN0YXRlXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBkZmgoaXRlbSwgXFxcImEmJnZhbHVlXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXIgdGl0bGUgPSBwZGZoKGl0ZW0sIOWIhuexu+agh+mimCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGl0bGUgPSBpdGVtLnRpdGxlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiDmjpLpmaQgIT0gXFxcInVuZGVmaW5lZFxcXCIgJiYg5o6S6ZmkICE9IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAo5o6S6ZmkLCBcXFwiZ1xcXCIpLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIganNvbiA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzd2l0Y2ggKHRydWUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSDliIbnsbvpk77mjqUuaW5jbHVkZXMoXFxcIkBAQFxcXCIpOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBwZGZoKGl0ZW0sIOWIhuexu+mTvuaOpS5zcGxpdChcXFwiQEBAXFxcIilbMF0pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBkZmgoaXRlbSwg5YiG57G76ZO+5o6lLnNwbGl0KFxcXCJAQEBcXFwiKVsxXSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSDliIbnsbvpk77mjqUuaW5jbHVkZXMoXFxcIkBAXFxcIik6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbiA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IOWIhuexu+mTvuaOpS5zcGxpdChcXFwiQEBcXFwiKVswXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwZGZoKGl0ZW0sIOWIhuexu+mTvuaOpS5zcGxpdChcXFwiQEBcXFwiKVsxXSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uID0gaXRlbS51cmw7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganNvbiA9IHBkKGl0ZW0sIOWIhuexu+mTvuaOpSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ki9cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSBpdGVtLnVybDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdmFyIGpzb2495YiG57G76ZO+5o6lLmluY2x1ZGVzKCdAQEAnKT97XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOnBkZmgoaXRlbSzliIbnsbvpk77mjqUuc3BsaXQoJ0BAQCcpWzBdKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOnBkZmgoaXRlbSzliIbnsbvpk77mjqUuc3BsaXQoJ0BAQCcpWzFdKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTpwZChpdGVtLOWIhuexu+mTvuaOpSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb2495YiG57G76ZO+5o6lLmluY2x1ZGVzKCdAQCcpP3tcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU65YiG57G76ZO+5o6lLnNwbGl0KCdAQCcpWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6cGRmaChpdGVtLOWIhuexu+mTvuaOpS5zcGxpdCgnQEAnKVsxXSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH06cGQoaXRlbSzliIbnsbvpk77mjqUpOyovXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVfdGVtcDogY2F0ZV90ZW1wLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBwYWdlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbjoganNvbixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiDnirbmgIEsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxjbGVhcnM6IOWFqOa4hSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5zZXRUaXRsZShrZXkudG9TdHJpbmcoKSwgY2F0ZV90ZW1wW2luZGV4XSwgdGl0bGUpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0aXRsZSA9PSBcXFwi8J2QhfCdkILwnZ+QXFxcIiA/IFxcXCJoaWtlcjovL3BhZ2UvZmMyP3VybD1cXFwiICsgZ2V0TXlWYXIoXFxcImZjMlxcXCIpICsgXFxcIiNmeXBhZ2Ujbm9IaXN0b3J5I1xcXCIgOiAkKFxcXCJoaWtlcjovL2VtcHR5XFxcIiArIFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmFsbGNsZWFycy5mb3JFYWNoKChpdGVtKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhck15VmFyKGl0ZW0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNeVZhcignY2F0ZV9idXR0b24nKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNhdGVfdGVtcFtwYXJhbXMuaW5kZXhdID0gcGFyYW1zLmtleS50b1N0cmluZygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiaGVhZC5jYXRlXFxcIiwgSlNPTi5zdHJpbmdpZnkocGFyYW1zLmNhdGVfdGVtcCkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmpzb24uY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImR0X1xcXCIgKyBwYXJhbXMuanNvbi50eXBlLCBwYXJhbXMuanNvbi52YWx1ZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMuc3RhdGUsIHBhcmFtcy5qc29uKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsczogTVlfUlVMRS50aXRsZSArICdjYXRlX2J1dHRvbicsIFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InOiB0aGlzLnNldGJnY29sb3Ioa2V5LnRvU3RyaW5nKCksIGNhdGVfdGVtcFtpbmRleF0sIHRpdGxlKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZXMucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBNWV9SVUxFLnRpdGxlICsgJ2NhdGVfYnV0dG9uJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKGZvbGQgPT09IFxcXCIxXFxcIiB8fCDmipjlj6DnirbmgIEgPT0gZmFsc2UpIHtcXG4gICAgICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoY2F0ZXMpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoZm9sZCA9PT0gXFxcIjBcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKCdjYXRlX2J1dHRvbicsIGNhdGVzKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAodHlwZW9mIHNldFByZVJlc3VsdCAhPSAndW5kZWZpbmVkJykge1xcbiAgICAgICAgICAgICAgICBpdGVtcyA9IGQuY29uY2F0KGl0ZW1zKTtcXG4gICAgICAgICAgICAgICAgLy/muIXnqbrnu6fmib/mlbDnu4RcXG4gICAgICAgICAgICAgICAgZC5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgICBzZXRQcmVSZXN1bHQoaXRlbXMpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBkLnB1c2goaXRlbSk7XFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgfTtcXG4gICAgb2JqLumihOiuvihvcHRpb25zKTtcXG4gICAgcmV0dXJuIG9iajtcXG59XFxuXFxudmFyIOeKtuaAgSA9XFxuICAgIHR5cGVvZiDnirbmgIHmoIforrAgIT0gXFxcInVuZGVmaW5lZFxcXCIgJiYg54q25oCB5qCH6K6wICE9IFxcXCJcXFwiID8g54q25oCB5qCH6K6wIDogTVlfUlVMRS51cmw7XFxuXFxubGV0IGR0X2RlYnVnID0gZmFsc2U7XFxuXFxuYWRkTGlzdGVuZXIoXFxuICAgIFxcXCJvbkNsb3NlXFxcIixcXG4gICAgJC50b1N0cmluZygoKSA9PiB7fSlcXG4pO1xcblxcbnZhciBDcmVhdGUgPSB7XFxuICAgIG5leHRQYWdlOiBmdW5jdGlvbigpIHtcXG4gICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgdmFyIG5leHQgPSBldmFsKOS4i+S4gOmhtSk7XFxuICAgICAgICAgICAgLy9sb2coJ246JytuZXh0KVxcbiAgICAgICAgICAgIGlmIChuZXh0ID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcign5LiL5LiA6aG16ZO+5o6l5Li656m6JylcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcXG4gICAgICAgICAgICBpZiAodHJ1ZV91cmwgPT0gbmV4dCkge1xcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgLy9sb2coXFxcIuWPr+iDveS4jeWtmOWcqOS4i+S4gOmhteaIluiAheS4i+S4gOmhteWumuS9jeaciemXrumimFxcXCIpO1xcbiAgICAgICAgICAgIC8vbG9nKFxcXCLplJnor6/kv6Hmga86XFxcIiArIGUubWVzc2FnZSk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoKG5leHQgPT0gXFxcIlxcXCIgfHwgbmV4dCA9PSB1bmRlZmluZWQpICYmIHBhZ2UgPT0gMSkge1xcbiAgICAgICAgICAgIG5leHQgPSB0cnVlX3VybDtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgLy9yZXN1bHQ9ZmFsc2U7XFxuICAgICAgICAgICAgbmV4dCA9IGdldE15VmFyKOeKtuaAgSk7XFxuICAgICAgICB9XFxuICAgICAgICAvL2xvZygnbCcrdHJ1ZV91cmwpXFxuICAgICAgICAvL2xvZygnbicrbmV4dClcXG4gICAgICAgIGlmIChwYWdlICE9IDEpIHtcXG4gICAgICAgICAgICBpZiAodHJ1ZV91cmwgPT0gbmV4dCAmJiAhcmVzdWx0KSB7XFxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgICAgIC8vcHV0TXlWYXIo54q25oCBLCBuZXh0KTtcXG4gICAgfSxcXG4gICAgZ2V0QmFja0ltYWdlOiBmdW5jdGlvbihpbWd1cmwpIHtcXG4gICAgICAgIHZhciByZXN1bHQgPSBpbWd1cmw7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHJlc3VsdCA9IC91cmwoPzpcXFxccyspP1xcXFwoKC4qPylcXFxcKS9nXFxuICAgICAgICAgICAgICAgIC5leGVjKGltZ3VybClbMV1cXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLygnfFxcXCJ8JnF1b3Q7KS9nbSwgXFxcIlxcXCIpO1xcbiAgICAgICAgfSBjYXRjaCB7fVxcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgaHR0cEhhbmRsZTogZnVuY3Rpb24oaW5wdXQpIHtcXG4gICAgICAgIGlmIChpbnB1dC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XFxuICAgICAgICB9IGVsc2UgaWYgKGlucHV0LnN0YXJ0c1dpdGgoXFxcIi8vXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImh0dHBzOlxcXCIgKyBpbnB1dDtcXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuc3RhcnRzV2l0aChcXFwiL1xcXCIpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIE1ZX0hPTUUgKyBpbnB1dDtcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgaW1nSGFuZGxlOiBmdW5jdGlvbihpdGVtLCBydWxlKSB7XFxuICAgICAgICB2YXIgaW1nID0gXFxcIlxcXCI7XFxuICAgICAgICBpZiAocnVsZS5pbWcuc3RhcnRzV2l0aChcXFwicGRcXFwiKSkge1xcbiAgICAgICAgICAgIGltZyA9IGV2YWwocnVsZS5pbWcpO1xcbiAgICAgICAgfSBlbHNlIGlmIChydWxlLmJhY2tpbWcpIHtcXG4gICAgICAgICAgICBpbWcgPSBwZGZoKGl0ZW0sIHJ1bGUuaW1nKTtcXG4gICAgICAgICAgICBpbWcgPSB0aGlzLmdldEJhY2tJbWFnZShpbWcpO1xcbiAgICAgICAgICAgIGltZyA9IHRoaXMuaHR0cEhhbmRsZShpbWcpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBpbWcgPSBwZGZoKGl0ZW0sIHJ1bGUuaW1nKTtcXG4gICAgICAgICAgICBpZiAoIWltZy5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgaW1nID0gcGQoaXRlbSwgcnVsZS5pbWcpO1xcbiAgICAgICAgICAgICAgICBpbWcgPSB0aGlzLmh0dHBIYW5kbGUoaW1nKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gaW1nICsgcnVsZS5yZWY7XFxuICAgIH0sXFxuICAgIHVybEhhbmRsZTogZnVuY3Rpb24oaXRlbSwgcnVsZSkge1xcbiAgICAgICAgdmFyIGhyZWYgPSBcXFwiXFxcIjtcXG4gICAgICAgIGlmIChydWxlLnVybC5zdGFydHNXaXRoKFxcXCJwZFxcXCIpKSB7XFxuICAgICAgICAgICAgaHJlZiA9IGV2YWwocnVsZS51cmwpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBocmVmID0gcGQoaXRlbSwgcnVsZS51cmwpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaHJlZiA9IHJ1bGUuaW10ID8gaHJlZiArIFxcXCIjaW1tZXJzaXZlVGhlbWUjXFxcIiA6IGhyZWY7XFxuICAgICAgICByZXR1cm4gaHJlZjtcXG4gICAgfSxcXG4gICAgc2V0Q29udGVudDogZnVuY3Rpb24oaXRlbSwgaW5wdXQpIHtcXG4gICAgICAgIGxldCBvdXRwdXQgPSBcXFwiXFxcIjtcXG4gICAgICAgIGlmIChpbnB1dCA9PSB1bmRlZmluZWQpIHtcXG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoXFxcInBkXFxcIikpIHtcXG4gICAgICAgICAgICBvdXRwdXQgPSBldmFsKGlucHV0KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgb3V0cHV0ID0gcGRmaChpdGVtLCBpbnB1dCk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gb3V0cHV0O1xcbiAgICB9LFxcbiAgICByZWZyZXNoOiBmdW5jdGlvbigpIHtcXG4gICAgICAgIGFkZExpc3RlbmVyKFxcbiAgICAgICAgICAgIFxcXCJvblJlZnJlc2hcXFwiLFxcbiAgICAgICAgICAgICQudG9TdHJpbmcoKHUpID0+IHtcXG4gICAgICAgICAgICAgICAgY2xlYXJNeVZhcihcXFwieWlsaXN0XFxcIik7XFxuICAgICAgICAgICAgICAgIC8vdmFyIHAgPSBzdG9yYWdlMC5nZXRNeVZhcignc3BhZ2UnLCAnJyk7XFxuICAgICAgICAgICAgICAgIC8vcHV0TXlWYXIodSwgcCk7XFxuICAgICAgICAgICAgfSwg54q25oCBKVxcbiAgICAgICAgKTtcXG4gICAgfSxcXG4gICAgZ2V0Qm9vbGVhblZhbHVlOiBmdW5jdGlvbih2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XFxuICAgICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IEJvb2xlYW4odmFsdWUpIDogKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogdHJ1ZSk7XFxuICAgIH0sXFxuICAgIGRlYnVnbG9nOiBmdW5jdGlvbihpLCBpdGVtLCBydWxlLCBvYmopIHtcXG4gICAgICAgIGxvZygnLS0tLS0tLS0tLScgKyAoaSArIDEpICsgJzrosIPor5XlvIDlp4stLS0tLS0tLS0tJyk7XFxuICAgICAgICBpZiAoaXRlbS5jb25zdHJ1Y3RvciA9PSBPYmplY3QpIHtcXG4gICAgICAgICAgICBpdGVtID0gSlNPTi5zdHJpbmdpZnkoaXRlbSk7XFxuICAgICAgICB9XFxuICAgICAgICBsb2coJ2l0ZW3lhoXlrrk6XFxcXHJcXFxcbicgKyBpdGVtICsgJ1xcXFxyXFxcXG4nICtcXG4gICAgICAgICAgICBgXFxcXG5cXFxcdHRpdGxl5a6a5L2NOiAgJHtydWxlLnRpdGxlfSAgLS0tPiDnu5Pmnpw6ICAke29iai50aXRsZX1gICtcXG4gICAgICAgICAgICBgXFxcXG5cXFxcdGRlc2PlrprkvY06ICAke3J1bGUuZGVzY30gIC0tLT4g57uT5p6cOiAgJHtvYmouZGVzY31gICtcXG4gICAgICAgICAgICBgXFxcXG5cXFxcdGltZ+WumuS9jTogICR7cnVsZS5pbWd9ICAtLS0+IOe7k+aenDogICR7b2JqLmltZ31gICtcXG4gICAgICAgICAgICAocnVsZS5jb250ZW50ICE9IHVuZGVmaW5lZCA/IGBcXFxcblxcXFx0Y29udGVudOWumuS9jTogICR7cnVsZS5jb250ZW50fSAgLS0tPiDnu5Pmnpw6ICAke29iai5jb250ZW50fWAgOiAnJykgK1xcbiAgICAgICAgICAgIGBcXFxcblxcXFx0dXJs5a6a5L2NOiAgJHtydWxlLnVybH0gIC0tLT4g57uT5p6cOiAgJHtvYmoudXJsfWBcXG4gICAgICAgICk7XFxuICAgICAgICBsb2coJy0tLS0tLS0tLS0nICsgKGkgKyAxKSArICc66LCD6K+V57uT5p2fLS0tLS0tLS0tLScpO1xcbiAgICB9LFxcbiAgICBqc29uTGlzdDogZnVuY3Rpb24oYXJyLCBqc29uLCBydWxlKSB7XFxuICAgICAgICBpZiAoanNvbi5jb25zdHJ1Y3RvciAhPSBPYmplY3QpIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBqc29uID0gSlNPTi5wYXJzZShqc29uKTtcXG4gICAgICAgICAgICB9IGNhdGNoIHt9XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoanNvbltydWxlLmxpc3RdID09IHVuZGVmaW5lZCkge1xcbiAgICAgICAgICAgIGFyci5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08Zm9udCBjb2xvcj1cXFwiZ3JleVxcXCI+PHNtYWxsPuaXoOWGheWuuTwvc21hbGw+PC9mb250PicsXFxuICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge30sXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIGRlYnVnID0gdGhpcy5nZXRCb29sZWFuVmFsdWUocnVsZS5kZWJ1ZywgZmFsc2UpO1xcbiAgICAgICAgdmFyIGVtcHR5ID0gdGhpcy5nZXRCb29sZWFuVmFsdWUocnVsZS5lbXB0eSk7XFxuICAgICAgICBpZiAoZGVidWcpIHtcXG4gICAgICAgICAgICBsb2coJ+WumuS9jeWIl+ihqDonICsgcnVsZS5saXN0KTtcXG4gICAgICAgIH1cXG4gICAgICAgIGpzb25bcnVsZS5saXN0XS5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XFxuICAgICAgICAgICAgdmFyIHRpdGxlID0gZXZhbChydWxlLnRpdGxlKTtcXG4gICAgICAgICAgICB2YXIgZGVzYyA9IGV2YWwocnVsZS5kZXNjKTtcXG4gICAgICAgICAgICB2YXIgY29udGVudCA9IGV2YWwocnVsZS5jb250ZW50KTtcXG4gICAgICAgICAgICB2YXIgaW1nID0gZXZhbChydWxlLmltZykgKyBydWxlLnJlZjtcXG4gICAgICAgICAgICB2YXIgaHJlZiA9IGV2YWwocnVsZS51cmwpO1xcbiAgICAgICAgICAgIHZhciB1cmwgPSBydWxlLmltdCA/IGhyZWYgKyBcXFwiI2ltbWVyc2l2ZVRoZW1lI1xcXCIgOiBocmVmO1xcbiAgICAgICAgICAgIHZhciBsYXp5ID0gcnVsZS5sYXp5ID8gcnVsZS5sYXp5IDogXFxcIlxcXCI7XFxuXFxuICAgICAgICAgICAgdmFyIGRkID0ge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgIGRlc2M6IGRlc2MsXFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IGltZyxcXG4gICAgICAgICAgICAgICAgdXJsOiAoZW1wdHkgPyBcXFwiaGlrZXI6Ly9lbXB0eSMjXFxcIiA6ICcnKSArIHVybCxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IHJ1bGUuY29sX3R5cGUsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgaW1nOiBpbWcsXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgfTtcXG5cXG4gICAgICAgICAgICBpZiAoZGVidWcpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHJ4ID0ge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjLFxcbiAgICAgICAgICAgICAgICAgICAgaW1nLFxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCxcXG4gICAgICAgICAgICAgICAgICAgIHVybFxcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnbG9nKGksIGl0ZW0sIHJ1bGUsIHJ4KTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgaWYgKGxhenkgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgZGRbXFxcInVybFxcXCJdID0gaHJlZiArIGxhenk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGFyci5wdXNoKGRkKTtcXG4gICAgICAgIH0pO1xcbiAgICB9LFxcbiAgICBydWxlTGlzdDogZnVuY3Rpb24oYXJyLCBodG1sLCBydWxlKSB7XFxuICAgICAgICB2YXIgbGlzdCA9IHBkZmEoaHRtbCxcXG4gICAgICAgICAgICBydWxlLmxpc3QpO1xcbiAgICAgICAgdmFyIGRlYnVnID0gdGhpcy5nZXRCb29sZWFuVmFsdWUocnVsZS5kZWJ1ZyxcXG4gICAgICAgICAgICBmYWxzZSk7XFxuICAgICAgICB2YXIgZW1wdHkgPSB0aGlzLmdldEJvb2xlYW5WYWx1ZShydWxlLmVtcHR5KTtcXG4gICAgICAgIGlmIChkZWJ1Zykge1xcbiAgICAgICAgICAgIGxvZygn5a6a5L2N5YiX6KGoOicgKyBydWxlLmxpc3QpO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGlzdC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XFxuICAgICAgICAgICAgdmFyIHRpdGxlID0gdGhpcy5zZXRDb250ZW50KGl0ZW0sIHJ1bGUudGl0bGUpO1xcbiAgICAgICAgICAgIHZhciBkZXNjID0gdGhpcy5zZXRDb250ZW50KGl0ZW0sIHJ1bGUuZGVzYyk7XFxuICAgICAgICAgICAgdmFyIGRlc2MxID0gdGhpcy5zZXRDb250ZW50KGl0ZW0sIHJ1bGUuZGVzYzEpO1xcbiAgICAgICAgICAgIHZhciBkZXNjMiA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLmRlc2MyKTtcXG4gICAgICAgICAgICB2YXIgaW1nID0gdGhpcy5pbWdIYW5kbGUoaXRlbSwgcnVsZSk7XFxuICAgICAgICAgICAgdmFyIHVybCA9IHRoaXMudXJsSGFuZGxlKGl0ZW0sIHJ1bGUpO1xcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gdGhpcy5zZXRDb250ZW50KGl0ZW0sIHJ1bGUuY29udGVudCk7XFxuXFxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XFxuICAgICAgICAgICAgICAgIHZhciByeCA9IHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgZGVzYyxcXG4gICAgICAgICAgICAgICAgICAgIGltZyxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXFxuICAgICAgICAgICAgICAgICAgICB1cmxcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z2xvZyhpLCBpdGVtLCBydWxlLCByeCk7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIHZhciBsYXp5ID0gcnVsZS5sYXp5ID8gcnVsZS5sYXp5IDogXFxcIlxcXCI7XFxuICAgICAgICAgICAgdmFyIGRkID0ge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgIGRlc2M6IGRlc2MxLnJlcGxhY2UoXFxcIuWQq+S4reWtl+ejgemPiFxcXCIsXFxcIuWQq+S4reWtl1xcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFwiICsgZGVzYyxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogaW1nLFxcbiAgICAgICAgICAgICAgICB1cmw6IChlbXB0eSA/ICdoaWtlcjovL2VtcHR5IyMnIDogJycpICsgdXJsICsgJyNub0hpc3RvcnkjQHJ1bGU9anM6JC5yZXF1aXJlKFxcXCJlalxcXCIpJyxcXG4gICAgICAgICAgICAgICAgY29udGVudDogY29udGVudCxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IHJ1bGUuY29sX3R5cGUsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgaW1nOiBpbWcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+OAkOi3s+mhteOAkScsXFxuICAgICAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHRydWVfdXJsKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKCcnLCAnMeWIsDgx5LmL6Ze055qE55qE6aG156CBJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnB1dCgodHJ1ZV91cmwpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUludChpbnB1dCkgPiAxICYmIHBhcnNlSW50KGlucHV0KSA8IDgxICYmIHBhcnNlSW50KGlucHV0KSAlIDEgPT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqdW1wdSA9IHRydWVfdXJsLnJlcGxhY2UoLyhcXFxcP3BhZ2U9XFxcXGQrfFxcXFwmcGFnZT1cXFxcZCt8JCkvLCAobWF0Y2gpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLnN0YXJ0c1dpdGgoJz9wYWdlPScpIHx8IG1hdGNoLnN0YXJ0c1dpdGgoJyZwYWdlPScpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2guY2hhckF0KDApICsgJ3BhZ2U9JyArIGlucHV0O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlX3VybC5pbmNsdWRlcygnPycpID8gJyZwYWdlPScgOiAnP3BhZ2U9JykgKyBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dFZhcihNWV9SVUxFLnVybCwganVtcHUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCd5aV9maXJzdHBhZ2UnLCBqdW1wdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/kvaDlt7Lnu4/nqb/otorliLDkuoYnICsgaW5wdXQgKyAn6aG1J1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWl5q2j56Gu55qE6aG156CBXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0cnVlX3VybClcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRydWVfdXJsKVxcbiAgICAgICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgaWYgKGxhenkgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgZGRbXFxcInVybFxcXCJdID0gdXJsICsgbGF6eTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgYXJyLnB1c2goZGQpO1xcbiAgICAgICAgfSk7XFxuICAgIH0sXFxuICAgIExpc3Q6IGZ1bmN0aW9uKGFyciwgaHRtbCwgcnVsZSwgcGFyYW0pIHtcXG4gICAgICAgIHBhcmFtID0gcGFyYW0gPyBwYXJhbSA6IHt9O1xcbiAgICAgICAgdmFyIGF1dG8gPSBwYXJhbS5hdXRvID8gcGFyYW0uYXV0byA6IGZhbHNlO1xcbiAgICAgICAgdmFyIHNob3cgPSBwYXJhbS5zaG93ID8gcGFyYW0uc2hvdyA6IGZhbHNlO1xcbiAgICAgICAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICAgICAgICAgIC8vdGhpcy5zcGFnZS5zZXQodHJ1ZV91cmwpO1xcbiAgICAgICAgfVxcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XFxuICAgICAgICB2YXIgZGVidWcgPSB0aGlzLmdldEJvb2xlYW5WYWx1ZShydWxlLmRlYnVnLCBmYWxzZSk7XFxuICAgICAgICB2YXIgZW1wdHkgPSB0aGlzLmdldEJvb2xlYW5WYWx1ZShydWxlLmVtcHR5KTtcXG4gICAgICAgIHZhciBsaXN0ID0gcGRmYShodG1sLCBydWxlLmxpc3QpO1xcbiAgICAgICAgaWYgKGRlYnVnKSB7XFxuICAgICAgICAgICAgbG9nKCflrprkvY3liJfooag6JyArIHJ1bGUubGlzdCk7XFxuICAgICAgICB9XFxuICAgICAgICAvL2xvZyh0aGlzLm5leHRQYWdlKCkpXFxuICAgICAgICBpZiAoKHN0b3JhZ2UwLmdldE15VmFyKCd5aV9pc25leHQnLCAndCcpID09ICd0JyAmJiBsaXN0Lmxlbmd0aCA+IDApIHx8IHBhZ2UgPT0gMSkge1xcbiAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcbiAgICAgICAgICAgICAgICBkZWxldGVJdGVtKFxcXCJwYWdlbnVtXFxcIik7XFxuICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0oXFxcInBhZ2VsaW5lXFxcIik7XFxuICAgICAgICAgICAgICAgIHZhciBpZCA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgICAgICB2YXIgY2xzID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IHRoaXMuc2V0Q29udGVudChpdGVtLCBydWxlLnRpdGxlKTtcXG4gICAgICAgICAgICAgICAgdmFyIGRlc2MgPSB0aGlzLnNldENvbnRlbnQoaXRlbSwgcnVsZS5kZXNjKTtcXG4gICAgICAgICAgICAgICAgdmFyIGltZyA9IHRoaXMuaW1nSGFuZGxlKGl0ZW0sIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICB2YXIgdXJsID0gdGhpcy51cmxIYW5kbGUoaXRlbSwgcnVsZSk7XFxuICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gdGhpcy5zZXRDb250ZW50KGl0ZW0sIHJ1bGUuY29udGVudCk7XFxuXFxuICAgICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJ4ID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsXFxuICAgICAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z2xvZyhpLCBpdGVtLCBydWxlLCByeCk7XFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gbGlzdC5sZW5ndGggLSAxKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZCA9IFxcXCJsYXN0aWRfXFxcIiArIHBhZ2U7XFxuICAgICAgICAgICAgICAgICAgICBjbHMgPSBcXFwibGFzdG1hcmtcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICBkZXNjOiBkZXNjLFxcbiAgICAgICAgICAgICAgICAgICAgcGljX3VybDogaW1nLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAoZW1wdHkgPyBcXFwiaGlrZXI6Ly9lbXB0eSMjXFxcIiA6ICcnKSArIHVybCArICc/cGFnZT1meXBhZ2Ujbm9IaXN0b3J5I0BydWxlPWpzOiQucmVxdWlyZShcXFwieWpcXFwiKScsXFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IHJ1bGUuY29sX3R5cGUsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogdGl0bGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiBpbWcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogY2xzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+OAkOi3s+mhteOAkScsXFxuICAgICAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHRydWVfdXJsKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKCcnLCAnMeWIsDMx5LmL6Ze055qE55qE6aG156CBJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnB1dCgodHJ1ZV91cmwpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUludChpbnB1dCkgPiAxICYmIHBhcnNlSW50KGlucHV0KSA8IDgxICYmIHBhcnNlSW50KGlucHV0KSAlIDEgPT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqdW1wdSA9IHRydWVfdXJsLnJlcGxhY2UoLyhcXFxcP3BhZ2U9XFxcXGQrfFxcXFwmcGFnZT1cXFxcZCt8JCkvLCAobWF0Y2gpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLnN0YXJ0c1dpdGgoJz9wYWdlPScpIHx8IG1hdGNoLnN0YXJ0c1dpdGgoJyZwYWdlPScpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2guY2hhckF0KDApICsgJ3BhZ2U9JyArIGlucHV0O1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlX3VybC5pbmNsdWRlcygnPycpID8gJyZwYWdlPScgOiAnP3BhZ2U9JykgKyBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dFZhcihNWV9SVUxFLnVybCwganVtcHUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCd5aV9maXJzdHBhZ2UnLCBqdW1wdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/kvaDlt7Lnu4/nqb/otorliLDkuoYnICsgaW5wdXQgKyAn6aG1J1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K+36L6T5YWl5q2j56Gu55qE6aG156CBXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0cnVlX3VybClcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRydWVfdXJsKVxcbiAgICAgICAgICAgICAgICAgICAgfV1cXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBsaXN0Lmxlbmd0aCAtIDEgJiYgc2hvdykge1xcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcXFwicGFnZWxpbmVcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ08c21hbGw+5Yqg6L295LitLi4uPC9zbWFsbD5cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFxcXCJwYWdlbnVtXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbShcXFwicGFnZW51bVxcXCIsIHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08Zm9udCBjb2xvcj1cXFwiZ3JleVxcXCI+PHNtYWxsPuWIsOW6leS6hjwvc21hbGw+PC9mb250PicsXFxuICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFxcXCJsYXN0XFxcIixcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4vKlxcbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09IDAgJiYgcGFnZSA9PSAxKSB7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lXFxcIixcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxmb250IGNvbG9yPVxcXCJncmV5XFxcIj48c21hbGw+5peg5YaF5a65PC9zbWFsbD48L2ZvbnQ+JyxcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7fSxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0qL1xcbiAgICAgICAgaWYgKHRoaXMubmV4dFBhZ2UoKSkge1xcbiAgICAgICAgICAgIC8vbG9nKCd0Jyk7XFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoJ3lpX2lzbmV4dCcsICd0Jyk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIC8vbG9nKCdmJyk7XFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoJ3lpX2lzbmV4dCcsICdmJyk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAoYXV0bykge1xcbiAgICAgICAgICAgIC8vY3JlYXRlTmV4dFBhZ2UoKTtcXG4gICAgICAgICAgICBhdXRvUGFnZSgpO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbn07XFxuXFxudmFyIGV4dE1ldGhvZCA9IHtcXG4gICAgVG9QYXJhbXM6IGZ1bmN0aW9uKCkge1xcbiAgICAgICAgdmFyIGpzb24gPSBhcmd1bWVudHNbMF07XFxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoanNvbilcXG4gICAgICAgICAgICAubWFwKChrZXkpID0+IGtleSArIFxcXCI9XFxcIiArIGpzb25ba2V5XSlcXG4gICAgICAgICAgICAuam9pbihcXFwiJlxcXCIpO1xcbiAgICB9LFxcbiAgICB1cmxQYXJzZTogZnVuY3Rpb24odSkge1xcbiAgICAgICAgdmFyIGRpY3QgPSB7fTtcXG4gICAgICAgIGRpY3QuU291cmNlID0gdTtcXG4gICAgICAgIGxldCBwYXJhbXMgPSAodXJsKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHF1ZXJ5UGFyYW1zID0ge307XFxuICAgICAgICAgICAgbGV0IHJlZyA9IC8oW14/PSZdKyk9KFtePz0mXSspL2c7XFxuICAgICAgICAgICAgdXJsLnJlcGxhY2UocmVnLCBmdW5jdGlvbigpIHtcXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNbYXJndW1lbnRzWzFdXSA9IGFyZ3VtZW50c1syXTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gcXVlcnlQYXJhbXM7XFxuICAgICAgICB9O1xcbiAgICAgICAgdmFyIGphdmFVcmwgPSBKYXZhSW1wb3J0ZXIoamF2YS5uZXQuVVJMKTtcXG4gICAgICAgIHdpdGgoamF2YVVybCkge1xcbiAgICAgICAgICAgIHZhciB1cmwgPSBuZXcgVVJMKHUpO1xcbiAgICAgICAgICAgIGRpY3QuUHJvdG9jb2wgPSB1cmwuZ2V0UHJvdG9jb2woKTtcXG4gICAgICAgICAgICBkaWN0Lkhvc3QgPSB1cmwuZ2V0SG9zdCgpO1xcbiAgICAgICAgICAgIGRpY3QuUG9ydCA9IHVybC5nZXRQb3J0KCk7XFxuICAgICAgICAgICAgZGljdC5GaWxlID0gdXJsLmdldEZpbGUoKTtcXG4gICAgICAgICAgICBkaWN0LlBhdGggPSB1cmwuZ2V0UGF0aCgpO1xcbiAgICAgICAgICAgIGRpY3QuUmVmID0gdXJsLmdldFJlZigpO1xcbiAgICAgICAgICAgIGRpY3QuSG9zdHMgPSBgJHtkaWN0LlByb3RvY29sfTovLyR7dXJsLmdldEhvc3QoKX1gO1xcbiAgICAgICAgfVxcbiAgICAgICAgZGljdC5QYXJhbXMgPSBwYXJhbXModSk7XFxuICAgICAgICByZXR1cm4gZGljdDtcXG4gICAgfSxcXG4gICAgaXNFcXVhbDogZnVuY3Rpb24oeCwgeSkge1xcbiAgICAgICAgY29uc3Qgb2sgPSBPYmplY3Qua2V5cyxcXG4gICAgICAgICAgICB0eCA9IHR5cGVvZiB4LFxcbiAgICAgICAgICAgIHR5ID0gdHlwZW9mIHk7XFxuICAgICAgICByZXR1cm4geCAmJiB5ICYmIHR4ID09PSBcXFwib2JqZWN0XFxcIiAmJiB0eCA9PT0gdHkgP1xcbiAgICAgICAgICAgIG9rKHgpLmxlbmd0aCA9PT0gb2soeSkubGVuZ3RoICYmXFxuICAgICAgICAgICAgb2soeCkuZXZlcnkoKGtleSkgPT4gdGhpcy5pc0VxdWFsKHhba2V5XSwgeVtrZXldKSkgOiB4ID09PSB5O1xcbiAgICB9LFxcbiAgICBmaW5kRGlmZmVyZW50SW5kZXg6IGZ1bmN0aW9uKHN0cjEsIHN0cjIpIHtcXG4gICAgICAgIGNvbnN0IGRpZmZDaGFycyA9IFtdO1xcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIyLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgaWYgKHN0cjFbaV0gIT09IHN0cjJbaV0pIHtcXG4gICAgICAgICAgICAgICAgZGlmZkNoYXJzLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGksXFxuICAgICAgICAgICAgICAgICAgICBzMTogc3RyMVtpXSxcXG4gICAgICAgICAgICAgICAgICAgIHMyOiBzdHIyW2ldLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gZGlmZkNoYXJzO1xcbiAgICB9LFxcbiAgICByZXBsYWNlQ2hhckF0OiBmdW5jdGlvbihzdHIsIGluZGV4LCByZXBsYWNlbWVudCkge1xcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzdHIubGVuZ3RoKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHN0cjtcXG4gICAgICAgIH1cXG4gICAgICAgIC8vbG9nKGluZGV4KVxcbiAgICAgICAgY29uc3QgYXJyID0gc3RyLnNwbGl0KFxcXCJcXFwiKTtcXG4gICAgICAgIGFycltpbmRleF0gPSByZXBsYWNlbWVudDtcXG4gICAgICAgIHJldHVybiBhcnIuam9pbihcXFwiXFxcIik7XFxuICAgIH0sXFxuICAgIGdldE9iamVjdEtleXNEaWZmOiBmdW5jdGlvbihvYmoxLCBvYmoyKSB7XFxuICAgICAgICBjb25zdCBkaWZmZXJlbnRLZXlzID0gW107XFxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gb2JqMSkge1xcbiAgICAgICAgICAgIGlmICghb2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpIHx8IG9iajFba2V5XSAhPT0gb2JqMltrZXldKSB7XFxuICAgICAgICAgICAgICAgIGRpZmZlcmVudEtleXMucHVzaChrZXkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBvYmoyKSB7XFxuICAgICAgICAgICAgaWYgKCFvYmoxLmhhc093blByb3BlcnR5KGtleSkpIHtcXG4gICAgICAgICAgICAgICAgZGlmZmVyZW50S2V5cy5wdXNoKGtleSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGRpZmZlcmVudEtleXM7XFxuICAgIH0sXFxuICAgIGdldE5leHRVcmw6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0LCBwYXJhbXMpIHtcXG4gICAgICAgIHZhciB1MSA9IHRoaXMudXJsUGFyc2Uoc291cmNlKTtcXG4gICAgICAgIHZhciB1MiA9IHRoaXMudXJsUGFyc2UodGFyZ2V0KTtcXG4gICAgICAgIHZhciBwYSA9IHVuZGVmaW5lZDtcXG4gICAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICAgICAgcGEgPSBwYXJhbXMuaGFzT3duUHJvcGVydHkoXFxcIueJueW+gVxcXCIpID8gcGFyYW1zLueJueW+gSA6IHVuZGVmaW5lZDtcXG4gICAgICAgIH1cXG4gICAgICAgIHZhciBuZXh0dXJsID0gc291cmNlO1xcbiAgICAgICAgdmFyIGNhID0gT2JqZWN0LmtleXModTIuUGFyYW1zKS5sZW5ndGggPT0gMCA/IFxcXCJcXFwiIDogXFxcIj9cXFwiO1xcbiAgICAgICAgaWYgKHBhICE9IHVuZGVmaW5lZCkge1xcbiAgICAgICAgICAgIHZhciBycyA9IFN0cmluZyh1Mi5QYXRoKS5yZXBsYWNlKG5ldyBSZWdFeHAocGEpLCBcXFwiJDFmeXBhZ2VcXFwiKTtcXG4gICAgICAgICAgICBuZXh0dXJsID0gdTIuSG9zdHMgKyBycyArIGNhICsgdGhpcy5Ub1BhcmFtcyh1Mi5QYXJhbXMpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBpZiAodGhpcy5pc0VxdWFsKHUxLlBhcmFtcywgdTIuUGFyYW1zKSkge1xcbiAgICAgICAgICAgICAgICBpZiAoZHRfZGVidWcpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyh1MS5QYXRoKTtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyh1Mi5QYXRoKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB2YXIgZGYgPSB0aGlzLmZpbmREaWZmZXJlbnRJbmRleChTdHJpbmcodTEuUGF0aCksIFN0cmluZyh1Mi5QYXRoKSk7XFxuICAgICAgICAgICAgICAgIGlmIChkdF9kZWJ1Zykge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKGRmKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoZGYubGVuZ3RoID09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciByZSA9IGRmWzBdLmluZGV4O1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBkZi5maWx0ZXIoKHgpID0+IC9cXFxcZCsvLnRlc3QoeC5zMikpO1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gZlswXS5pbmRleDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB2YXIgZXEgPSB0aGlzLnJlcGxhY2VDaGFyQXQoU3RyaW5nKHUyLlBhdGgpLCByZSwgXFxcImZ5cGFnZVxcXCIpO1xcbiAgICAgICAgICAgICAgICBuZXh0dXJsID0gdTIuSG9zdHMgKyBlcSArIGNhICsgdGhpcy5Ub1BhcmFtcyh1Mi5QYXJhbXMpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHZhciBlcCA9IHRoaXMuZ2V0T2JqZWN0S2V5c0RpZmYodTEuUGFyYW1zLCB1Mi5QYXJhbXMpXFxuICAgICAgICAgICAgICAgIGlmIChlcC5sZW5ndGggPT0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgdTEuUGFyYW1zW2VwWzBdXSA9ICdmeXBhZ2UnXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBsb2coZXApO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHZhciBlcSA9IFN0cmluZyh1MS5QYXRoKS5yZXBsYWNlKC9cXFxcZCsvLCBcXFwiZnlwYWdlXFxcIik7XFxuICAgICAgICAgICAgICAgIG5leHR1cmwgPSB1MS5Ib3N0cyArIGVxICsgY2EgKyB0aGlzLlRvUGFyYW1zKHUxLlBhcmFtcyk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgLy9sb2coJ25leHQ6JytuZXh0dXJsKVxcbiAgICAgICAgcmV0dXJuIG5leHR1cmw7XFxuICAgIH0sXFxufTtcXG5cXG5mdW5jdGlvbiBnZXRUcnVlbGluayhtYXJrLCB1cmwsIHBhZ2UpIHtcXG4gICAgdmFyIHAgPSBnZXRNeVZhcihtYXJrLCB1cmwpLnJlcGxhY2UoXFxcImZ5cGFnZVxcXCIsIHBhZ2UpO1xcbiAgICBpZiAocGFnZSA9PSAxKSB7XFxuICAgICAgICByZXR1cm4gZ2V0TXlWYXIoXFxcInlpX2ZpcnN0cGFnZVxcXCIsIHApO1xcbiAgICB9IGVsc2UgaWYgKHAgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgIHJldHVybiBwO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIHVybDtcXG4gICAgfVxcbn1cXG4vL+aehOW7ulxcbmZ1bmN0aW9uIGNyZWF0ZU5leHRQYWdlKCkge1xcbiAgICBsZXQgc3RhcnRudW0gPSAxO1xcbiAgICB2YXIgb2JqID0gYXJndW1lbnRzWzBdO1xcbiAgICBpZiAodHJ1ZV91cmwgIT0gZ2V0TXlWYXIoXFxcInlpX3BhZ2V1cmxcXFwiLCBcXFwiXFxcIikpIHtcXG4gICAgICAgIGNsZWFyTXlWYXIoXFxcInlpX3BhZ2V1cmxcXFwiKTtcXG4gICAgfVxcbiAgICBpZiAocGFnZSA9PSBzdGFydG51bSAmJiBnZXRNeVZhcihcXFwieWlfcGFnZXVybFxcXCIpID09IFxcXCJcXFwiKSB7XFxuICAgICAgICBwdXRNeVZhcihcXFwieWlfZmlyc3RwYWdlXFxcIiwgdHJ1ZV91cmwpO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICB2YXIgbmV4dCA9IGV2YWwo5LiL5LiA6aG1KTtcXG4gICAgICAgICAgICAvL2xvZyhcXFwibmV4dFxcXCIpO1xcbiAgICAgICAgICAgIC8vbG9nKG5leHQpO1xcbiAgICAgICAgfSBjYXRjaCB7XFxuICAgICAgICAgICAgbG9nKFxcXCLlj6/og73kuI3lrZjlnKjkuIvkuIDpobXmiJbogIXkuIvkuIDpobXlrprkvY3mnInpl67pophcXFwiKTtcXG4gICAgICAgICAgICBuZXh0ID0gXFxcIlxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAobmV4dCAhPSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHZhciBueHVybCA9IGV4dE1ldGhvZC5nZXROZXh0VXJsKHRydWVfdXJsLCBuZXh0LCBvYmopO1xcbiAgICAgICAgICAgIC8vbG9nKFxcXCJueHVybDpcXFwiICsgbnh1cmwpO1xcbiAgICAgICAgICAgIHB1dE15VmFyKOeKtuaAgSwgbnh1cmwpO1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJ5aV9wYWdldXJsXFxcIiwgbnh1cmwpO1xcbiAgICAgICAgfVxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIGF1dG9QYWdlKCkge1xcbiAgICBpZiAocGFnZSA9PSAxKSB7XFxuICAgICAgICBwdXRNeVZhcihcXFwieWlfZmlyc3RwYWdlXFxcIiwgdHJ1ZV91cmwpO1xcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAgICB2YXIgbmV4dCA9IGV2YWwo5LiL5LiA6aG1KTtcXG4gICAgICAgIC8vbG9nKFxcXCJuZXh0XFxcIik7XFxuICAgICAgICAvL2xvZygnbmV4dDonK25leHQpO1xcbiAgICB9IGNhdGNoIHtcXG4gICAgICAvLyAgbG9nKFxcXCLlj6/og73kuI3lrZjlnKjkuIvkuIDpobXmiJbogIXkuIvkuIDpobXlrprkvY3mnInpl67pophcXFwiKTtcXG4gICAgICAgIG5leHQgPSBcXFwi5rKh5pyJ5LiL5LiA6aG15ZOm8J+YkFxcXCI7XFxuICAgIH1cXG4gICAgaWYgKG5leHQgIT0gXFxcIlxcXCIpIHtcXG4gICAgICAgIHB1dE15VmFyKOeKtuaAgSwgbmV4dCk7XFxuICAgIH1cXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLikaLkuoznuqflpJbpg6jop6PmnpBcIixcInBhdGhcIjpcInRvb2xcIixcInJ1bGVcIjpcIlxcbiAgIHZhciBjb2RlbGF6eSA9IGZldGNoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL0Fwb2xsby/wnZCC8J2QqPCdkJ3wnZCe8J2Qi/CdkJrwnZCz8J2Qsi5qcycpIHx8IFxcXCJcXFwiO1xcblxcbiAgIGZ1bmN0aW9uIGRvd25jb2RlKCkge1xcbiAgICAgICB2YXIganMgPSBmZXRjaChcXFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0Fwb2xsb1Jpb28vUi9tYXN0ZXIv8J2QgvCdkKjwnZCd8J2QnvCdkIvwnZCa8J2Qs/CdkLJcXFwiKTtcXG4gICAgICAgd3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL3J1bGVzL0Fwb2xsby/wnZCC8J2QqPCdkJ3wnZCe8J2Qi/CdkJrwnZCz8J2Qsi5qcycsIGpzKTtcXG4gICAgICAgdG9hc3QoXFxcIui/nOeoi+aVsOaNruW3suabtOaWsOWIsOacrOWcsFxcXCIpXFxuICAgICAgIGNvZGVsYXp5ID0gZmV0Y2goJ2hpa2VyOi8vZmlsZXMvcnVsZXMvQXBvbGxvL/CdkILwnZCo8J2QnfCdkJ7wnZCL8J2QmvCdkLPwnZCyLmpzJylcXG4gICB9XFxuICAgaWYgKCFjb2RlbGF6eSkge1xcbiAgICAgICBkb3duY29kZSgpXFxuICAgfVxcbiAgIHRyeSB7XFxuICAgICAgIGV2YWwoY29kZWxhenkpXFxuICAgfSBjYXRjaCB7XFxuICAgICAgIGRvd25jb2RlKClcXG4gICAgICAgZXZhbChjb2RlbGF6eSlcXG4gICAgICAgbG9nKFxcXCLor7vlj5blpLHotKXmm7TmlrDov5znqIvmlbDmja5cXFwiKVxcbiAgIH1cXG4gICBDb2RlTGF6eSjor4bliKvnoIEpXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpBcIixcInBhdGhcIjpcImxhenlcIixcInJ1bGVcIjpcInZhciBsYXp5ID0gJCgnJykubGF6eVJ1bGUoKE1ZX0hPTUUpID0+IHtcXG4gICAgdmFyIGlucCA9IGZldGNoKGlucHV0LHt9KTsgXFxuICAgIHJldHVybiBcXFwicGljczovL1xcXCIrcGRmYShpbnAsICcucHJldmlldy1pbWFnZXMmJmEsMTonKS5tYXAoaW1nID0+cGQoaW1nLCAnYSYmaHJlZicpK1xcXCJAUmVmZXJlcj1cXFwiLCkuam9pbihcXFwiJiZcXFwiKSAgXFxufSxNWV9IT01FKVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi4pGg5LiA57qn6aG16Z2i5YaF5a65XCIsXCJwYXRoXCI6XCJ5alwiLFwicnVsZVwiOlwianM6XFxuICAgIHZhciBkID0gW107XFxuXFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcInVybFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJuZXh0UGFnZVxcXCIpO1xcbiAgICBjbGVhckl0ZW0oJ3BhZ2VzJylcXG59KTtcXG5hZGRMaXN0ZW5lcihcXFwib25SZWZyZXNoXFxcIiwgKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCJ1cmxcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwibmV4dFBhZ2VcXFwiKTtcXG4gICAgY2xlYXJJdGVtKCdwYWdlcycpXFxufSk7XFxuXFxuTVlfVVJMID0gTVlfVVJMLnJlcGxhY2UoJ2hpa2VyOi8vZW1wdHkjIycsICcnKTtcXG5sZXQgdHJ1ZV91cmwgPSBnZXRNeVZhcihcXFwidXJsXFxcIiwgTVlfVVJMKTtcXG4vL+iOt+WPluS4iuasoee8k+WtmOeahOS4i+mhtemTvuaOpVxcbmxldCBuZXh0UGFnZSA9IGdldE15VmFyKFxcXCJuZXh0UGFnZVxcXCIsIFxcXCJcXFwiKTtcXG4vL+WmguaenOacieS4i+S4gOmhteS4lOS4jeaYr+esrOS4gOmhteWwseS9v+eUqOS4i+S4gOmhtemTvuaOpVxcbmlmIChuZXh0UGFnZSAmJiBNWV9QQUdFID4gMSkge1xcbiAgICB0cnVlX3VybCA9IG5leHRQYWdlO1xcbn1cXG5sb2codHJ1ZV91cmwpO1xcbi8vdmFyIGh0bWwgPSByZXF1ZXN0KHRydWVfdXJsKTtcXG52YXIgaHRtbCA9IGZldGNoKHRydWVfdXJsLCB7XFxuICAgIGhlYWRlcnM6IHtcXG4gICAgICAgIGNvb2tpZTogZmV0Y2hQQygnaGlrZXI6Ly9maWxlcy9ydWxlcy9BcG9sbG8vQ29va2llL2phdmRiX2Nvb2tpZS50eHQnKSB8fCAnJyxcXG4gICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogXFxcIk1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMjsgU00tRzk3NTAgQnVpbGQvU1AxQS4yMTA4MTIuMDE2OyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzg5LjAuNDM4OS43MiBNUVFCcm93c2VyLzYuMiBUQlMvMDQ2Mjc5IE1vYmlsZSBTYWZhcmkvNTM3LjM2XFxcIixcXG4gICAgfSxcXG4gICAgcmVkaXJlY3Q6IGZhbHNlXFxufSk7XFxuaWYgKC9KdXN0XFxcXHNhXFxcXHNtb21lbnQvLnRlc3QoaHRtbCkpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArICfojrflj5Zjb29raWUnLmZvbnRjb2xvcignI0ZGMDBGRicpLmJpZygpLFxcbiAgICAgICAgdXJsOiB0cnVlX3VybCArICQoJycpLnJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHZhciBkID0gW107XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICd4NV93ZWJ2aWV3X3NpbmdsZScsXFxuICAgICAgICAgICAgICAgIHVybDogTVlfVVJMLFxcbiAgICAgICAgICAgICAgICBkZXNjOiAnbGlzdCYmc2NyZWVuJyxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogXFxcIk1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMjsgU00tRzk3NTAgQnVpbGQvU1AxQS4yMTA4MTIuMDE2OyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzg5LjAuNDM4OS43MiBNUVFCcm93c2VyLzYuMiBUQlMvMDQ2Mjc5IE1vYmlsZSBTYWZhcmkvNTM3LjM2XFxcIiwgLy9QQ19VQSwgICAgICAgICAgICAgXFxuICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3M6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjaGVjaygpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgbm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjdGFncycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY28gPSBmYmEuZ2V0Q29va2llKHUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ZhciB1YSA9IGZiYS5nZXRVYSgpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmJhLmxvZygnY286Ojo6OjonICsgdWEpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgZmJhLmxvZygnY286Ojo6OjonICsgY28pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbENvbnRlbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoL+awuOS5heWfn+WQjS8udGVzdChodG1sQ29udGVudCkpIHtcXG5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5wYXJzZUxhenlSdWxlKCQkJCgpLmxhenlSdWxlKChjbykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9BcG9sbG8vQ29va2llL2phdmRiX2Nvb2tpZS50eHQnLCBjbyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoJ+W3suiOt+WPlmNvb2tpZe+8jOWIh+aNouWIsOmmlumhtScpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2sodHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjbykpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChjaGVjaywgNTAwKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVjaygpO1xcbiAgICAgICAgICAgICAgICAgICAgfSwgTVlfVVJMKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHNldFJlc3VsdChkKTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbiAgICB9KTtcXG59XFxudHJ5IHtcXG4gICAgLy/nvJPlrZjkuIvkuIDpobVcXG4gICAgbGV0IG5leHRVcmwgPSBwZChodG1sLCBcXFwiYTpjb250YWlucyjkuIvkuIApJiZocmVmXFxcIik7XFxuICAgIHB1dE15VmFyKFxcXCJuZXh0UGFnZVxcXCIsIG5leHRVcmwgfHwgXFxcIuayoeacieS4i+S4gOmhteWTpvCfmK9cXFwiKTtcXG4gICAgLy9sb2coXFxcIuS4i+S4gOmhte+8mlxcXCIgKyBuZXh0VXJsKVxcbn0gY2F0Y2ggKGUpIHtcXG4gICAgLy9jbGVhck15VmFyKFxcXCJuZXh0UGFnZVxcXCIpO1xcbiAgICBsZXQgbmV4dFVybCA9IFxcXCLmsqHmnInkuIvkuIDpobXlk6bwn5ivXFxcIjtcXG4gICAgdG9hc3QoXFxcIuWlveWDj+ayoeacieS4i+S4gOmhteS6hu+8gVxcXCIpO1xcbn1cXG5cXG52YXIgcGFnZXM7XFxuaWYgKE1ZX1BBR0UgPT0gMSAmJiAhdHJ1ZV91cmwuaW5jbHVkZXMoXFxcInNlYXJjaFxcXCIpKSB7XFxuICAgIC8v5ryU5ZGY5Zu+XFxuICAgIHRyeSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHZhciBpbWcgPSBwZGZoKGh0bWwsIFxcXCIuc2VjdGlvbi1jb2x1bW5zJiYuaW1hZ2UmJi5hdmF0YXImJnN0eWxlXFxcIik7XFxuICAgICAgICB9IGNhdGNoIHtcXG4gICAgICAgICAgICB2YXIgaW1nID0gXFxcImh0dHBzOi8vdGh1bWJzbmFwLmNvbS9pL3N5U01RN01nLmpwZ1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICB2YXIg5o+P6L+wMSA9IHBkZmgoaHRtbCwgXFxcIi5zZWN0aW9uLWNvbHVtbnMmJmgyLS0uc2VjdGlvbi1tZXRhLC0xJiZUZXh0XFxcIik7XFxuICAgICAgICB2YXIg5o+P6L+wMiA9IHBkZmgoaHRtbCwgXFxcIi5zZWN0aW9uLWNvbHVtbnMmJmgyJiYuc2VjdGlvbi1tZXRhLC0xJiZUZXh0XFxcIik7XFxuICAgICAgICB2YXIgbnVtID0g5o+P6L+wMi5tYXRjaCgvXFxcXGQrLylbMF0gfHwgJzEnXFxuICAgICAgICB2YXIgcGFnZXMgPSBNYXRoLmZsb29yKG51bSAvIDQwKTtcXG4gICAgICAgIGlmIChudW0gJSA0MCAhPT0gMCkge1xcbiAgICAgICAgICAgIHBhZ2VzICs9IDE7XFxuICAgICAgICB9XFxuXFxuICAgICAgICB2YXIgbGlzdEFjdG9ycyA9IEpTT04ucGFyc2UoZmV0Y2hQQygnaGlrZXI6Ly9maWxlcy9ydWxlcy9hcG9sbG8vamF2ZGIvamF2ZGJfYWN0b3IudHh0JykgfHwgJ1tdJyk7XFxuICAgICAgICB2YXIgc3RyID0g5o+P6L+wMSArICdAQCcgKyBpbWcgKyAnQEAnICsgcGRmaChodG1sLCAnbGlua1tyZWw9Y2Fub25pY2FsXSYmaHJlZicpICsgJz9wYWdlPWZ5cGFnZSc7XFxuICAgICAgICBpZiAobGlzdEFjdG9ycy5pbmRleE9mKHN0cikgPT0gJy0xJykge1xcbiAgICAgICAgICAgIHZhciB0ID0gJzxiPjxzbWFsbD48Zm9udCBjb2xvcj0jMUU5MEZGPvCfpI3mnKrmlLbol4/wn6SNPC9mb250Pjwvc21hbGw+J1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB2YXIgdCA9ICc8Yj48c21hbGw+PGZvbnQgY29sb3I9I0ZGMDBGRj7wn5Kd5bey5pS26JeP8J+SnTwvZm9udD48L3NtYWxsPidcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCJKYXZEQlxcXCIsXFxuICAgICAgICAgICAgZGVzYzogXFxcIjBcXFwiLFxcbiAgICAgICAgICAgIGltZzogaW1nLFxcbiAgICAgICAgICAgIHVybDogJ2NvcHk6Ly8nICsg5o+P6L+wMSArICcsaGlrZXI6Ly9wYWdlL3lqP3VybD0nICsgTVlfVVJMLnJlcGxhY2UoL1xcXFwvXFxcXC9cXFxcdytcXFxcLi8sICcvL2phdmRiLicpLnJlcGxhY2UoJ3BhZ2U9MScsICdwYWdlPWZ5cGFnZScpICsgJyZydWxlPfCdkInwnZCa8J2Qr/CdkIPwnZCBLCcgKyBpbWcsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJjYXJkX3BpY18yXFxcIixcXG4gICAgICAgIH0pXFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PHNtYWxsPjxmb250IGNvbG9yPVxcXCIjZmU1YzRiXFxcIj7nprvmgJ3kupTpppbCt+WFtuWbm8K35ZSQwrflhYPnqLlcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx05pu+57uP5rKn5rW36Zq+5Li65rC077yMXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdOmZpOWNtOW3q+WxseS4jeaYr+S6keOAglxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHTlj5bmrKHoirHkuJvmh5Llm57pob7vvIxcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx05Y2K57yY5L+u6YGT5Y2K57yY5ZCb44CCXFxcXG48L2ZvbnQ+PC9zbWFsbD48Yj48c21hbGw+PGZvbnQgY29sb3I9XFxcImN5YW5cXFwiPiAnICsg5o+P6L+wMS5zbGljZSgwLCAxMykgKyAnPC9mb250Pjwvc21hbGw+PGI+PHNtYWxsPjxmb250IGNvbG9yPVxcXCIjMUU5MEZGXFxcIj5cXFxcbiAnICsg5o+P6L+wMiArICdcXFxcdDwvZm9udD48L3NtYWxsPicgKyB0ICsgJzxiPjxzbWFsbD48Zm9udCBjb2xvcj1cXFwiI0ZGRTEwMFxcXCI+XFxcXG7kuZ/orrjmnIknICsgcGFnZXMgKyAn6aG177yM5rKh6aqX5L2g5ZCnPC9mb250Pjwvc21hbGw+JyxcXG4gICAgICAgICAgICBkZXNjOiAnMCcsXFxuICAgICAgICAgICAgLy9pbWc6ICdoaWtlcjovL2VtcHR5JyxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImNhcmRfcGljXzJcXFwiLFxcbiAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgobmFtZSkgPT4ge1xcbiAgICAgICAgICAgICAgICB2YXIgc3RyID0gZmV0Y2hQQygnaGlrZXI6Ly9maWxlcy9ydWxlcy9hcG9sbG8vamF2ZGIvamF2ZGJfYWN0b3IudHh0Jyk7XFxuICAgICAgICAgICAgICAgIGlmICghc3RyKSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IFtuYW1lXTtcXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9hcG9sbG8vamF2ZGIvamF2ZGJfYWN0b3IudHh0JywgSlNPTi5zdHJpbmdpZnkobGlzdCkpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBKU09OLnBhcnNlKHN0cik7XFxuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdC5pbmRleE9mKG5hbWUpID09ICctMScpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0LnB1c2gobmFtZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC51bnNoaWZ0KG5hbWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9hcG9sbG8vamF2ZGIvamF2ZGJfYWN0b3IudHh0JywgSlNPTi5zdHJpbmdpZnkobGlzdCkpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBsaXN0LmluZGV4T2YobmFtZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9hcG9sbG8vamF2ZGIvamF2ZGJfYWN0b3IudHh0JywgSlNPTi5zdHJpbmdpZnkobGlzdCkpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5JztcXG4gICAgICAgICAgICB9LCBzdHIpLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJncmFkaWVudFxcXCI6IHRydWVcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfSBjYXRjaCB7fVxcbiAgICBpZiAodHlwZW9mIHBhZ2VzICE9PSAndW5kZWZpbmVkJyAmJiBwYWdlcyAhPT0gbnVsbCkge1xcbiAgICAgICAgc2V0SXRlbSgncGFnZXMnLCBwYWdlcy50b1N0cmluZygpKTtcXG4gICAgfVxcblxcbiAgICAvL+a8lOWRmOWIhuexu1xcbiAgICB0cnkge1xcbiAgICAgICAgdmFyIGNhdGVnb3J5ID0gcGRmYShodG1sLCBcXFwiLmFjdG9yLXRhZ3MmJi50YWdcXFwiKVxcbiAgICAgICAgZm9yICh2YXIgaiBpbiBjYXRlZ29yeSkge1xcbiAgICAgICAgICAgIGNhdGVnb3J5W2pdID0gY2F0ZWdvcnlbal0ucmVwbGFjZSgvYnV0dG9uL2csICdhJykucmVwbGFjZShcXFwib25jbGlja1xcXCIsIFxcXCJocmVmXFxcIikucmVwbGFjZShcXFwid2luZG93LmxvY2F0aW9uLmhyZWY9XFxcIiwgXFxcIlxcXCIpLnJlcGxhY2UoL1xcXFwnL2csIFxcXCJcXFwiKS5yZXBsYWNlKFxcXCJqYXZhc2NyaXB0OjtcXFwiLCB0cnVlX3VybClcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGNhdGVnb3J5LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgdmFyIHRpdGxlID0gcGRmaChpdGVtLCBcXFwiVGV4dFxcXCIpO1xcbiAgICAgICAgICAgIHZhciB1cmwgPSBwZChpdGVtLCBcXFwiYSYmaHJlZlxcXCIpO1xcbiAgICAgICAgICAgIHVybCA9IHVybC5pbmNsdWRlcygnP3BhZ2UnKSA/IHVybCA6ICh1cmwuaW5jbHVkZXMoJz8nKSA/IHVybCArIFxcXCImcGFnZT0xXFxcIiA6IHVybCArIFxcXCI/cGFnZT0xXFxcIilcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS5pbmNsdWRlcyhcXFwiaXMtbGlua1xcXCIpID8gJ+KAnOKAnOKAneKAnScgKyB0aXRsZS5mb250Y29sb3IoJ2N5YW4nKSArIFxcXCLimYjvuI9cXFwiIDogdGl0bGUsXFxuICAgICAgICAgICAgICAgIHVybDogdXJsICsgJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgodGl0bGUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJ1cmxcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5JztcXG4gICAgICAgICAgICAgICAgfSwgdGl0bGUpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcic6ICcjNjY2NjY2J1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gNCkge1xcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICB9IGNhdGNoIHt9XFxuICAgIC8v5YiG5YmyXFxuICAgIGQucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIlxcbiAgICB9KVxcbn1cXG5cXG5pZiAoIXRydWVfdXJsLmluY2x1ZGVzKFxcXCJzZWFyY2hcXFwiKSkge1xcbiAgICB2YXIgcGFnZXMgPSBnZXRJdGVtKCdwYWdlcycpO1xcbn1cXG52YXIgcGFnZTtcXG50cnkge1xcbiAgICBwYWdlID0gdHJ1ZV91cmwubWF0Y2goL3BhZ2U9KFxcXFxkKykvKVsxXVxcbn0gY2F0Y2gge1xcbiAgICBwYWdlID09IDFcXG59XFxudHJ5IHtcXG4gICAgaWYgKHBhZ2VzID4gMSAmJiBwYWdlcyA8IDM3KSB7XFxuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8PSBwYWdlczsgaisrKSB7XFxuICAgICAgICAgICAgdmFyIHVybCA9IHRydWVfdXJsLnJlcGxhY2UoL3BhZ2U9XFxcXGQrLywgJ3BhZ2U9JyArIGopO1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBqID09IHBhZ2UgPyAn4oCc4oCc4oCd4oCdJyArIChqICsgJ+mhtScpLmZvbnRjb2xvcigncmVkJykgOiAoaiArICfpobUnKSxcXG4gICAgICAgICAgICAgICAgdXJsOiAkKHVybCtcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaikgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcInVybFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknO1xcbiAgICAgICAgICAgICAgICB9LCBqKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgfVxcbiAgICB9IGVsc2UgaWYgKHBhZ2VzID4gMzcpIHtcXG4gICAgICAgIGZvciAodmFyIGogPSAxOyBqIDw9IDYxOyBqICs9IDEpIHtcXG4gICAgICAgICAgICB2YXIgdXJsID0gdHJ1ZV91cmwucmVwbGFjZSgvcGFnZT1cXFxcZCsvLCAncGFnZT0nICsgaik7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IGogPT0gcGFnZSA/ICfigJzigJzigJ3igJ0nICsgKGogKyAn6aG1JykuZm9udGNvbG9yKCdyZWQnKSA6IChqICsgJ+mhtScpLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQodXJsK1xcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChqKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwidXJsXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSc7XFxuICAgICAgICAgICAgICAgIH0sIGopLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9XFxuICAgIH1cXG59IGNhdGNoIHt9XFxuXFxuXFxubGV0IGxpc3QgPSBwZGZhKGh0bWwsICdib2R5JiYuaXRlbScpO1xcbmlmIChsaXN0Lmxlbmd0aCA+IDApIHtcXG4gICAgbGlzdC5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgbGV0IGltZyA9ICF0cnVlX3VybC5pbmNsdWRlcyhcXFwic2VhcmNoXFxcIikgPyBwZCh4LCAnaW1nfHxhJiZzcmN8fGRhdGEtb3JpZ2luYWwnKSA6IHBkKHgsICdpbWd8fGEmJnNyY3x8ZGF0YS1vcmlnaW5hbCcpLnJlcGxhY2UoXFxcImNvdmVyc1xcXCIsIFxcXCJ0aHVtYnNcXFwiKTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IHBkZmgoeCwgJy52aWRlby10aXRsZSYmVGV4dCcpLFxcbiAgICAgICAgICAgIGRlc2M6IHBkZmgoeCwgJy5tZXRhJiZUZXh0JyksXFxuICAgICAgICAgICAgaW1nOiBpbWcsXFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2VqP3VybD0nICsgcGQoeCwgJ2EmJmhyZWYnKSArICcjbm9IaXN0b3J5IycsXFxuICAgICAgICAgICAgY29sX3R5cGU6IGltZy5pbmNsdWRlcyhcXFwiL3RodW1icy9cXFwiKSA/ICdtb3ZpZV8zJyA6ICdtb3ZpZV8yJyxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IHBkZmgoeCwgJy52aWRlby10aXRsZSYmVGV4dCcpLFxcbiAgICAgICAgICAgICAgICBpbWc6IGltZyxcXG4gICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfjgJDot7PpobXjgJEnLFxcbiAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHRydWVfdXJsKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKCcnLCAnMeWIsDgx5LmL6Ze055qE55qE6aG156CBJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnB1dCgodHJ1ZV91cmwpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQoaW5wdXQpID4gMSAmJiBwYXJzZUludChpbnB1dCkgPCA4MSAmJiBwYXJzZUludChpbnB1dCkgJSAxID09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGp1bXB1ID0gdHJ1ZV91cmwucmVwbGFjZSgvKFxcXFw/cGFnZT1cXFxcZCt8XFxcXCZwYWdlPVxcXFxkK3wkKS8sIChtYXRjaCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLnN0YXJ0c1dpdGgoJz9wYWdlPScpIHx8IG1hdGNoLnN0YXJ0c1dpdGgoJyZwYWdlPScpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoLmNoYXJBdCgwKSArICdwYWdlPScgKyBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlX3VybC5pbmNsdWRlcygnPycpID8gJyZwYWdlPScgOiAnP3BhZ2U9JykgKyBpbnB1dDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJ1cmxcXFwiLCBqdW1wdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOW3sue7j+epv+i2iuWIsOS6hicgKyBpbnB1dCArICfpobUnXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpeato+ehrueahOmhteeggVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0cnVlX3VybClcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRydWVfdXJsKVxcbiAgICAgICAgICAgICAgICB9XVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICB9KVxcbn0gZWxzZSB7XFxuICAgIC8qXFxuICAgICAgZnVuY3Rpb24gZ2V0QmlnVGV4dCh0ZXh0LCBjb3VudCkge1xcbiAgICAgICAgaWYgKGNvdW50ID4gMCkge1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5iaWcoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgLWNvdW50OyBpKyspIHtcXG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc21hbGwoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gdGV4dDtcXG4gICAgICAgIH1cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi4oCc4oCc4oCd4oCdXFxcIitnZXRCaWdUZXh0KFxcXCI8YmlnPjxmb250IGNvbG9yPScjRkVCRDZGJz7lt7Lnu4/otoXov4fkuobmnIDnu4jpobXnoIE8L2ZvbnQ+PC9iaWc+PGJyPjxzbWFsbD48Zm9udCBjb2xvcj0nI0ZCNkM3Myc+5LiN5L+h54K55Ye75omT5byA572R6aG1PC9mb250Pjwvc21hbGw+XFxcIiwgNSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCh0cnVlX3VybCkgPT4ge1xcbiAgICByZXR1cm4gdHJ1ZV91cmxcXG4gICAgICAgICB9LHRydWVfdXJsKSxcXG4gICAgICAgIGV4dHJhOntsaW5lVmlzaWJsZTpmYWxzZX1cXG4gICAgICAgIH0pXFxuICAgICovXFxufVxcblxcbnNldFJlc3VsdChkKVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi4pGh5LqM57qn6aG16Z2i5YaF5a65XCIsXCJwYXRoXCI6XCJlalwiLFwicnVsZVwiOlwianM6XFxuICAgICAgICBhZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IHtcXG4gICAgICAgICAgICBjbGVhck15VmFyKFxcXCJwaWNsaXN0XFxcIik7ICAgICAgICAgIFxcbiAgICAgICAgfSk7XFxudmFyIGdldFJhbmdlQ29sb3JzID0gZnVuY3Rpb24oKSB7XFxuICAgIHJldHVybiAnIycgKyAoJzAwMDAwJyArIChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwIDw8IDApLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC02KTtcXG59XFxuXFxudmFyIGQgPSBbXVxcbk1ZX1VSTD1NWV9VUkwucmVwbGFjZSgnaGlrZXI6Ly9lbXB0eSMjJywnJyk7XFxubG9nKE1ZX1VSTClcXG4vL3ZhciBodG1sID0gZmV0Y2goTVlfVVJMKTtcXG52YXIgaHRtbCA9IGZldGNoKE1ZX1VSTCwge1xcbiAgICBoZWFkZXJzOiB7XFxuICAgICAgICBjb29raWU6IGZldGNoUEMoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvQXBvbGxvL0Nvb2tpZS9qYXZkYl9jb29raWUudHh0JykgfHwgJycsXFxuICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFxcXCJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTI7IFNNLUc5NzUwIEJ1aWxkL1NQMUEuMjEwODEyLjAxNjsgd3YpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS84OS4wLjQzODkuNzIgTVFRQnJvd3Nlci82LjIgVEJTLzA0NjI3OSBNb2JpbGUgU2FmYXJpLzUzNy4zNlxcXCIsICAgICAgXFxuICAgIH0sXFxuICAgIHJlZGlyZWN0OiBmYWxzZVxcbn0pO1xcblxcbmlmICgvSnVzdFxcXFxzYVxcXFxzbW9tZW50Ly50ZXN0KGh0bWwpKSB7XFxuZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArICfojrflj5Zjb29raWUnLmZvbnRjb2xvcignI0ZGMDBGRicpLmJpZygpLFxcbiAgICAgICAgdXJsOiBNWV9VUkwgKyAkKCcnKS5ydWxlKCgpID0+IHtcXG4gICAgICAgICAgICB2YXIgZCA9IFtdO1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAneDVfd2Vidmlld19zaW5nbGUnLFxcbiAgICAgICAgICAgICAgICB1cmw6IE1ZX1VSTCxcXG4gICAgICAgICAgICAgICAgZGVzYzogJ2xpc3QmJnNjcmVlbicsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFxcXCJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTI7IFNNLUc5NzUwIEJ1aWxkL1NQMUEuMjEwODEyLjAxNjsgd3YpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS84OS4wLjQzODkuNzIgTVFRQnJvd3Nlci82LjIgVEJTLzA0NjI3OSBNb2JpbGUgU2FmYXJpLzUzNy4zNlxcXCIsLy9QQ19VQSwgICAgICAgICAgICAgXFxuICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3M6IGZhbHNlLFxcbiAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjaGVjaygpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgbm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjdGFncycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY28gPSBmYmEuZ2V0Q29va2llKHUpO1xcbi8vdmFyIHVhID0gZmJhLmdldFVhKClcXG4vL2ZiYS5sb2coJ2NvOjo6Ojo6JyArIHVhKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mYmEubG9nKCdjbzo6Ojo6OicgKyBjbyk7XFxudmFyIGh0bWxDb250ZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTDtcXG5cXG5pZigv5rC45LmF5Z+f5ZCNLy50ZXN0KGh0bWxDb250ZW50KSkge1xcbiAgXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEucGFyc2VMYXp5UnVsZSgkJCQoKS5sYXp5UnVsZSgoY28pID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvQXBvbGxvL0Nvb2tpZS9qYXZkYl9jb29raWUudHh0JywgY28pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0KCflt7Lojrflj5Zjb29raWXvvIzliIfmjaLliLDpppbpobUnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrKHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgY28pKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2ssIDUwMCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2soKTtcXG4gICAgICAgICAgICAgICAgICAgIH0sIE1ZX1VSTClcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiBzZXRSZXN1bHQoZCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgfSk7XFxufVxcblxcbnRyeXtcXG52YXIgdGl0bGUgPSBwZGZoKGh0bWwsJ2gyJiZzdHJvbmcmJlRleHQnKSArICcgJyArIHBkZmgoaHRtbCwnaDImJi5jdXJyZW50LXRpdGxlJiZUZXh0Jyk7XFxudmFyIGRlc2N0ID0gcGRmaChodG1sLCdoMiYmLmN1cnJlbnQtdGl0bGUmJlRleHQnKTtcXG4gICBpZih0aXRsZSAhPT1udWxsICYmICF0aXRsZS5pbmNsdWRlcyhcXFwi6ZaL6YCaVklQIFxcXCIpKXtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNtYWxsPjxmb250IGNvbG9yPSNFNTdBMUE+Jyt0aXRsZSsnPC9mb250Pjwvc21hbGw+JyxcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiICsgJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoZGVzY3QpID0+IHtcXG4vL+WKqOaAgeWIt+aWsFxcbnZhciBkZXNjID0gZmluZEl0ZW0oJ3RyYW5zZGVzYycpLmRlc2NcXG4gICAgICAgICAgaWYoIWRlc2Mpe1xcbiAgICB2YXIgdHJhbnNsYXRlcyA9ICQucmVxdWlyZShcXFwidHJhbnNcXFwiKS50cmFuc2xhdGUoZGVzY3QpXFxuICAgICAgdXBkYXRlSXRlbShcXFwidHJhbnNkZXNjXFxcIix7XFxuICAgICAgICAgIGRlc2M6ICfigJzigJzigJ3igJ0nK3RyYW5zbGF0ZXMuZm9udGNvbG9yKFxcXCJyZWRcXFwiKSxcXG59KVxcbn1lbHNle1xcbnVwZGF0ZUl0ZW0oXFxcInRyYW5zZGVzY1xcXCIse1xcbiAgICAgICAgICBkZXNjOiAnJyxcXG59KVxcbn0gICAgICAgXFxuICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIgICAgICBcXG4vKiAgICAgICBcXG4gICAgICAgICAgdmFyIHRyYW5zbGF0ZXMgPSAkLnJlcXVpcmUoXFxcInRyYW5zXFxcIikudHJhbnNsYXRlKGRlc2N0KSAgIFxcbiAgICAgICAgICByZXR1cm4gXFxcImNvbmZpcm06Ly9cXFwiICsgdHJhbnNsYXRlcyArIFxcXCIuanM6J2hpa2VyOi8vZW1wdHknIFxcXCIgICAqL1xcbiAgICAgICAgICAgICAgICB9LGRlc2N0KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF8xJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgaWQ6ICd0cmFuc2Rlc2MnLFxcbiAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7dGl0bGU6ICfnvZHpobUnLCBqczogJC50b1N0cmluZygoKT0+eyBcXG4gICAgICAgIHJldHVybiBcXFwid2ViOi8vXFxcIiArIE1ZX1VSTFxcbiAgICAgICAgICAgICAgICAgICAgICAgfSl9LHt0aXRsZTogJ+WkjeWIticsIGpzOiAkLnRvU3RyaW5nKCh0aXRsZSk9PnsgXFxuICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgdGl0bGU7XFxuICAgICAgICAgICAgICAgICAgICAgICB9LHRpdGxlKX0se3RpdGxlOiAn55m+5bqm57+76K+RJywganM6ICQudG9TdHJpbmcoKHRpdGxlKT0+eyBcXG4gICAgICAgIHJldHVybiBcXFwieDU6Ly9odHRwczovL2ZhbnlpLmJhaWR1LmNvbS8janAvemgvXFxcIiArIHRpdGxlXFxuICAgICAgICAgICAgICAgICAgICAgICB9LHRpdGxlKX0se3RpdGxlOiAnRGVlcGznv7vor5EnLCBqczogJC50b1N0cmluZygodGl0bGUpPT57IFxcbiAgICAgICAgcmV0dXJuIFxcXCJ4NTovL2h0dHBzOi8vd3d3LmRlZXBsLmNvbS96aC90cmFuc2xhdG9yLW1vYmlsZSNqYS96aC9cXFwiICsgdGl0bGVcXG4gICAgICAgICAgICAgICAgICAgICAgIH0sdGl0bGUpfSx7dGl0bGU6ICfosLfmrYznv7vor5EnLCBqczogJC50b1N0cmluZygodGl0bGUpPT57IFxcbiAgICAgICAgcmV0dXJuIFxcXCJ4NTovL2h0dHBzOi8vdHJhbnNsYXRlLmdvb2dsZS5jb20vP2hsPXpoLUNOJnNsPWphJnRsPXpoLUNOJnRleHQ9XFxcIiArIHRpdGxlXFxuICAgICAgICAgICAgICAgICAgICAgICB9LHRpdGxlKX1dXFxufVxcbiAgICB9KVxcbn1cXG5cXG4vL3NldFBhZ2VUaXRsZSh0aXRsZSkgLy9mY+mhtemdouiOt+WPluagh+mimFxcblxcbnZhciDor4bliKvnoIEgPSBwZGZoKGh0bWwsICdib2R5JiYuZmlyc3QtYmxvY2smJi52YWx1ZSYmVGV4dCcpLnRvTG93ZXJDYXNlKCk7XFxudmFyIHBhZ2VVcmwgPSBwZGZoKGh0bWwsJ2xpbmtbcmVsPWNhbm9uaWNhbF0mJmhyZWYnKTtcXG52YXIgaW1nID0gcGQoaHRtbCwnLmNvbHVtbi12aWRlby1jb3ZlciYmaW1nJiZzcmMnKTtcXG52YXIgcGljcyA9IHBkZmEoaHRtbCxcXFwiLnByZXZpZXctaW1hZ2VzJiYudGlsZS1pdGVtLDE6blxcXCIpLm1hcChpdGVtPT5wZGZoKGl0ZW0sXFxcImEmJmhyZWZcXFwiKSlcXG4vL3ZhciBpbWcgPSBNWV9QQVJBTVMuaW1nO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgaW1nOiBpbWcsXFxuICAgICAgICAgICAgIHVybDogXFxcImNvcHk6Ly9cXFwiICsgaW1nLFxcbiAgICAgICAgICAgICBjb2xfdHlwZTogJ3BpY18xX2Z1bGwnLFxcbiAgICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOmZhbHNlLFxcbiAgICAgICAgICAgICAgICBsb25nQ2xpY2s6IFt7dGl0bGU6ICdETU0nLCBqczogJC50b1N0cmluZygo6K+G5Yir56CBKT0+e1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaHR0cHM6Ly9waWNzLmRtbS5jby5qcC9tb25vL21vdmllL2FkdWx0L1xcXCIgKyDor4bliKvnoIEucmVwbGFjZSgvLXxfLywnJykgKyAnLycgKyDor4bliKvnoIEucmVwbGFjZSgvLXxfLywnJykgKyBcXFwicGwuanBnXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgfSzor4bliKvnoIEpfSx7dGl0bGU6ICflm77niYfpooTop4gnLCBqczogJC50b1N0cmluZygocGljcyk9PnsgICAgICAgICAgICAgICAgICAgIFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBpY3MgIT1cXFwiXFxcIiA/IFxcXCJwaWNzOi8vXFxcIitwaWNzLmpvaW4oXFxcIiYmXFxcIikgOiBcXFwidG9hc3Q6Ly/msqHmnInlm77niYfpooTop4jlk6bwn5iQXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgfSxwaWNzKX0se3RpdGxlOiAn5omT5byA5Zu+54mHJywganM6ICQudG9TdHJpbmcoKGltZyk9PnsgXFxuICAgICAgICByZXR1cm4gaW1nXFxuICAgICAgICAgICAgICAgICAgICAgICB9LGltZyl9LHt0aXRsZTogJ+WkjeWItumhtemdoicsIGpzOiAkLnRvU3RyaW5nKChpbWcsdGl0bGUscGFnZVVybCk9PnsgXFxuICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiKyB0aXRsZSArIFxcXCIsaGlrZXI6Ly9wYWdlL2VqP3VybD1cXFwiICsgcGFnZVVybCArXFxcIiZydWxlPfCdkInwnZCa8J2Qr/CdkIPwnZCBLFxcXCIgKyBpbWdcXG4gICAgICAgICAgICAgICAgICAgICAgIH0saW1nLHRpdGxlLHBhZ2VVcmwpfV1cXG4gICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgIH0pO1xcblxcbmV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL3lpeWFuJywge30pKS5ydWxlKTtcXG5cXG52YXIgc2NvcmUgPSBwZGZoKGh0bWwsXFxcIi5wYW5lbCYmLnBhbmVsLWJsb2NrOm1hdGNoZXMo6KmV5YiGOikmJlRleHRcXFwiKVxcbnZhciBzdGFyID0gcGRmYShodG1sLFxcXCIucGFuZWwmJi5wYW5lbC1ibG9jazptYXRjaGVzKOipleWIhjopJiZpOm5vdCguZ3JheSlcXFwiKVxcbnZhciBhcnIgPSBbXVxcbmZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XFxuaWYoaTxzdGFyLmxlbmd0aCl7XFxuICAgIGFyci5wdXNoKCfwn5SlJyk7XFxuICB9IGVsc2Uge1xcbiAgICBhcnIucHVzaCgn8J+lticpO1xcbiAgfVxcbn1cXG52YXIgc2NvcmVzID0gc2NvcmUubWF0Y2goL+eUsShcXFxcZCsp5Lq66KmV5YO5LykgPyBzY29yZS5tYXRjaCgv55SxKFxcXFxkKynkurroqZXlg7kvKVsxXS50b1N0cmluZygpIDogXFxcIjIyM1xcXCJcXG5kLnB1c2goe1xcbnRpdGxlOiBzY29yZXMgPCAzMDAgPyAn4oCc4oCc4oCd4oCdJyArIGRheV9zYXkuc3BsaXQoXFxcIlxcXCIpLm1hcChiPT5iLmZvbnRjb2xvcihnZXRSYW5nZUNvbG9ycygpKS5zbWFsbCgpKS5qb2luKFxcXCJcXFwiKSA6IFxcXCLigJzigJzigJ3igJ3oqZXliIbvvJpcXFwiICsgYXJyLmpvaW4oXFxcIlxcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFwiICsgIHNjb3JlLnJlcGxhY2UoXFxcIuipleWIhjpcXFwiLFxcXCJcXFwiKS5mb250Y29sb3IoXFxcIiNEQkRCREJcXFwiKSxcXG51cmw6ICQoJycpLmxhenlSdWxlKChwaWNzKSA9PiB7ICAgICAgICAgICAgICAgICAgIFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBpY3MgIT1cXFwiXFxcIiA/IFxcXCJwaWNzOi8vXFxcIitwaWNzLmpvaW4oXFxcIiYmXFxcIikgOiBcXFwiY29uZmlybTovL+ayoeacieWbvueJh+mihOiniOWTpvCfmJAuanM6J2hpa2VyOi8vZW1wdHknIFxcXCIgICAgICAgICAgIFxcbiAgICAgICAgICAgICAgICB9LHBpY3MpLFxcbmNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG5leHRyYTp7bGluZVZpc2libGU6ZmFsc2V9XFxufSlcXG5cXG4vL+WklumDqOi1hOa6kOiwg+eUqFxcbmV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL3Rvb2wnLCB7fSkpLnJ1bGUpO1xcblxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiAnYmxhbmtfYmxvY2snXFxufSlcXG5cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBwZGZhKGh0bWwsIFxcXCIucHJldmlldy1pbWFnZXMmJi50aWxlLWl0ZW0sMTpcXFwiKVxcbiAgICAgICAgICAvLyAgaWYgKGxpc3QubGVuZ3RoPDEpIHtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogJ2JpZ19ibGFua19ibG9jaydcXG59LHtcXG4gICAgY29sX3R5cGU6ICdiaWdfYmxhbmtfYmxvY2snXFxufSlcXG4vL31cXG4gICAgICAgICAgICBpZiAobGlzdC5sZW5ndGg+MCkge1xcbiAgICAgICAgICAgICAgICB2YXIgcGljbnVtID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyAocGljbnVtICsgbGlzdC5sZW5ndGggK1xcXCIgUFxcXCIpLmZvbnRjb2xvcihcXFwiIzFFOTBGRlxcXCIpLmJvbGQoKS5iaWcoKSxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSwgICAgICAgICAgICAgICAgICAgICAgXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIgKyAkKFxcXCJcXFwiKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC5sYXp5UnVsZSgobGlzdCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRNeVZhcihcXFwicGljbGlzdFxcXCIsIFxcXCLmlLbotbdcXFwiKSA9PSBcXFwi5pS26LW3XFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSXRlbUFmdGVyKCdwaWNudW0nLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgXFxcIuOAkOaUtui1t+WbvueJh+OAkVxcXCIuZm9udGNvbG9yKFxcXCIjRkYwMEZGXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIgKyAkKFxcXCJcXFwiKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGF6eVJ1bGUoKGxpc3QpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0oJ3ByZXZpZXdwaWMnICsgaSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbSgnbm9waWNsaXN0Jyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwaWNsaXN0XFxcIiwgXFxcIuaUtui1t1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbGlzdCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcXFwibm9waWNsaXN0XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEl0ZW1BZnRlcigncGljbnVtJywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiBwZGZoKGxpc3RbaV0sIFxcXCJhJiZocmVmXFxcIiksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwicGljXzFfZnVsbFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ3ByZXZpZXdwaWMnICsgaVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwicGljbGlzdFxcXCIsIFxcXCLlsZXlvIBcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlSXRlbSgncHJldmlld3BpYycgKyBpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUl0ZW0oJ25vcGljbGlzdCcpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBpY2xpc3RcXFwiLCBcXFwi5pS26LW3XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSwgbGlzdCksICAgICAgICAgICAgICAgICAgIFxcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2gge31cXG5cXG52YXIgbGlzdFZpZGVvcyA9IEpTT04ucGFyc2UoZmV0Y2hQQygnaGlrZXI6Ly9maWxlcy9ydWxlcy9hcG9sbG8vamF2ZGIvamF2ZGJfdmlkZW8udHh0JykgfHwgJ1tdJyk7XFxudmFyIHN0ciA9IHRpdGxlICsgJ0BAJyArIGltZyArICdAQCcgKyBwYWdlVXJsO1xcbmlmIChsaXN0VmlkZW9zLmluZGV4T2Yoc3RyKSA9PSAnLTEnKSB7XFxuICAgIHZhciB0ID0gJ+KAnOKAnOKAneKAnTxiPjxmb250IGNvbG9yPSNGRkUxMDA+8J+Sm+acquaUtuiXj/CfkpsnXFxufSBlbHNlIHtcXG4gICAgdmFyIHQgPSAn4oCc4oCc4oCd4oCdPGI+PGZvbnQgY29sb3I9I0ZGMDBGRj7wn5KW5bey5pS26JeP8J+SlidcXG59XFxuXFxubGV0IGluZm8gPSBwZGZhKGh0bWwsICcucGFuZWwmJi5wYW5lbC1ibG9jazptYXRjaGVzKOeVquiZn3zml6XmnJ985pmC6ZW3KScpO1xcbmluZm8uZm9yRWFjaCgobGlzdCwgaW5kZXgpID0+IHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBpbmRleCA9PSAwID8gJ+KAnOKAnOKAneKAnScgKyBwZGZoKGxpc3QsICdzdHJvbmcmJlRleHQnKS5mb250Y29sb3IoJyNGRkUxMDAnKSA6IHBkZmgobGlzdCwgJ3N0cm9uZyYmVGV4dCcpLFxcbiAgICAgICAgdXJsOiBpbmRleCA9PSAwID8gXFxcImNvcHk6Ly9cXFwiICsg6K+G5Yir56CBLnRvVXBwZXJDYXNlKCkgOiAnaGlrZXI6Ly9lbXB0eScsXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBpbmRleCA9PSAwID8gKHBkZmEobGlzdCwgJy52YWx1ZSYmYScpLmxlbmd0aCA+IDAgPyAoICfigJzigJzigJ3igJ08Zm9udCBjb2xvcj0jRkZFMTAwPicgKyBwZGZoKGxpc3QsICcudmFsdWUmJmEmJlRleHQnKSArICc8L2ZvbnQ+JyArICfigJzigJzigJ3igJ08Zm9udCBjb2xvcj1ncmVlbj4nICsgcGRmaChsaXN0LCAnLnZhbHVlLS1hJiZUZXh0JykgKyAnPC9mb250PicgKSA6ICfigJzigJzigJ3igJ08Zm9udCBjb2xvcj0jRkZFMTAwPicgKyBwZGZoKGxpc3QsICcudmFsdWUmJlRleHQnKSArICc8L2ZvbnQ+JykgOiBwZGZoKGxpc3QsICcudmFsdWUmJlRleHQnKSxcXG4gICAgICAgIHVybDogaW5kZXggPT0gMCA/IChwZChodG1sLCAnLnZpZGVvLWRldGFpbCYmLmZpcnN0LWJsb2NrJiZhJiZocmVmJykgPyBwZChodG1sLCAnLnZpZGVvLWRldGFpbCYmLmZpcnN0LWJsb2NrJiZhJiZocmVmJykgKyAnP3BhZ2U9ZnlwYWdlJnNvcnRfdHlwZT01QHJ1bGU9anM6JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UveWpcXFwiKScgOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIgKTogJ2hpa2VyOi8vZW1wdHknLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgIGV4dHJhOiBpbmRleCA9PSAwID8ge1xcbiAgICAgICAgICAgIHBhZ2VUaXRsZTogXFxcIueVquWPt+ezu+WIl++8mlxcXCIgKyBwZGZoKGh0bWwsICcudmlkZW8tZGV0YWlsJiYuZmlyc3QtYmxvY2smJmEmJlRleHQnKSxcXG4gICAgICAgICAgICBsb25nQ2xpY2s6IFt7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiAn6LC35q2M5pCc57SiJyxcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKOivhuWIq+eggSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPVxcXCIgKyDor4bliKvnoIE7XFxuICAgICAgICAgICAgICAgIH0sIOivhuWIq+eggSlcXG4gICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiAn56OB5Yqb5pCc5qCH6aKYJyxcXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9zb3U/cnVsZT3no4HlipvlkJsu566AJnA9ZnlwYWdlJnNlYXJjaFRlcm1zPVxcXCIgKyB0aXRsZVxcbiAgICAgICAgICAgICAgICB9LCB0aXRsZSlcXG4gICAgICAgICAgICB9XVxcbiAgICAgICAgfSA6ICcnXFxuICAgIH0pO1xcbiAgICBpZiAoaW5kZXggPT0gMCkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogdCxcXG4gICAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKG5hbWUpID0+IHtcXG4gICAgICAgICAgICAgICAgdmFyIHN0ciA9IGZldGNoUEMoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvYXBvbGxvL2phdmRiL2phdmRiX3ZpZGVvLnR4dCcpO1xcbiAgICAgICAgICAgICAgICBpZiAoIXN0cikge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBbbmFtZV07XFxuICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvYXBvbGxvL2phdmRiL2phdmRiX3ZpZGVvLnR4dCcsIEpTT04uc3RyaW5naWZ5KGxpc3QpKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gSlNPTi5wYXJzZShzdHIpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3QuaW5kZXhPZihuYW1lKSA9PSAnLTEnKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0LnB1c2gobmFtZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC51bnNoaWZ0KG5hbWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9hcG9sbG8vamF2ZGIvamF2ZGJfdmlkZW8udHh0JywgSlNPTi5zdHJpbmdpZnkobGlzdCkpO1xcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGxpc3QuaW5kZXhPZihuYW1lKTtcXG4gICAgICAgICAgICAgICAgICAgICAgbGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xcbiAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvYXBvbGxvL2phdmRiL2phdmRiX3ZpZGVvLnR4dCcsIEpTT04uc3RyaW5naWZ5KGxpc3QpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5JztcXG4gICAgICAgICAgICB9LCBzdHIpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgICAgZXh0cmE6IHtpZDogXFxcInBpY251bVxcXCJ9XFxuICAgICAgICB9KTtcXG5kLnB1c2goe1xcbmNvbF90eXBlOlxcXCJibGFua19ibG9ja1xcXCJcXG59KVxcbiAgICB9XFxufSk7XFxuXFxuLy/niYfllYZcXG50cnkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLniYfllYY6XFxcIixcXG4gICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHknLFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgfSlcXG4gICAgdmFyIG1ha2VycyA9IHBkZmgoaHRtbCwgJy5wYW5lbCYmLnBhbmVsLWJsb2NrOm1hdGNoZXMo54mH5ZWGKSYmLnZhbHVlJiZUZXh0Jyk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmTxiPjxtaWRkbGU+PGZvbnQgY29sb3I9XFxcIiMxRTkwRkZcXFwiPicgKyBtYWtlcnMgKyAnPC9mb250PjwvbWlkZGxlPjwvYj4nLFxcbiAgICAgICAgdXJsOiBwZChodG1sLCAnLnBhbmVsJiYucGFuZWwtYmxvY2s6bWF0Y2hlcyjniYfllYYpJiZhJiZocmVmJykgKyAnJnBhZ2U9ZnlwYWdlQHJ1bGU9anM6JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UveWpcXFwiKScsIC8v6ZO+5o6lXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBwYWdlVGl0bGU6IG1ha2Vyc1xcbiAgICAgICAgfVxcbiAgICB9KVxcbn0gY2F0Y2gge31cXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiLFxcbiAgICB9KVxcbi8v5ryU5ZGYXFxudmFyIGFydHMgPSBwYXJzZURvbUZvckFycmF5KGh0bWwsICdib2R5JiYucGFuZWwtYmxvY2s6Y29udGFpbnMo5ryU5ZOhOikmJmEnKTtcXG5pZihhcnRzLmxlbmd0aD4wKXtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgICAgIHRpdGxlOiBcXFwi5ryU5ZOhOlxcXCIsXFxuICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXG4gICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxufSlcXG5mb3IgKHZhciBpIGluIGFydHMpIHtcXG4gICAgdmFyIHRpdGxlID0gcGFyc2VEb21Gb3JIdG1sKGFydHNbaV0sICdUZXh0Jyk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmTxiPjxtaWRkbGU+PGZvbnQgY29sb3I9XFxcIiNjMTMxNDFcXFwiPicrdGl0bGUrJzwvZm9udD48L21pZGRsZT48L2I+JyxcXG4gICAgICAgIHVybDogcGFyc2VEb20oYXJ0c1tpXSwgJ2EmJmhyZWYnKSArICc/cGFnZT1meXBhZ2VAcnVsZT1qczokLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS95alxcXCIpJyxcXG4gICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHBhZ2VUaXRsZTogdGl0bGUsXFxuICAgICAgICAgIGxvbmdDbGljazogW3t0aXRsZTogJ+WkjeWItua8lOWRmCcsIGpzOiAkLnRvU3RyaW5nKCh0aXRsZSk9PnsgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIHRpdGxlO30sdGl0bGUpfSx7dGl0bGU6ICfosLfmrYzmkJzntKInLCBqczogJC50b1N0cmluZygodGl0bGUpPT57IHJldHVybiBcXFwiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT1cXFwiICsgdGl0bGUgK1xcXCIg6Lqr6auYXFxcIjt9LHRpdGxlKX0se3RpdGxlOiAn55m+5bqm5pCc57SiJywganM6ICQudG9TdHJpbmcoKHRpdGxlKT0+eyByZXR1cm4gXFxcImh0dHBzOi8vd3d3LmJhaWR1LmNvbS9zP3dkPVxcXCIgKyB0aXRsZTt9LHRpdGxlKX0se3RpdGxlOiAn56OB5Yqb5pCc5ryU5ZGYJywganM6ICQudG9TdHJpbmcoKHRpdGxlKT0+eyBcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3NvdT9ydWxlPeejgeWKm+WQmy7nroAmcD1meXBhZ2Umc2VhcmNoVGVybXM9XFxcIiArIHRpdGxlXFxuICAgICAgICAgICAgICAgICAgICAgICB9LHRpdGxlKX1dXFxuICAgICAgICB9XFxufSlcXG59XFxufVxcblxcbi8v5a+85ryUXFxudHJ5IHtcXG4gICAgdmFyIGRpcmVjdG9yID0gcGRmaChodG1sLCAnLnBhbmVsJiYucGFuZWwtYmxvY2s6bWF0Y2hlcyjlsI7mvJQpJiYudmFsdWUmJlRleHQnKTtcXG4gICAgaWYgKGRpcmVjdG9yKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi5bCO5ryUOlxcXCIsXFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eScsXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIH0pXFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFwiIzFFOTBGRlxcXCI+JyArIGRpcmVjdG9yICsgJzwvZm9udD48L21pZGRsZT48L2I+JyxcXG4gICAgICAgICAgICB1cmw6IHBkKGh0bWwsICcucGFuZWwmJi5wYW5lbC1ibG9jazptYXRjaGVzKOWwjua8lCkmJmEmJmhyZWYnKSArICc/cGFnZT1meXBhZ2VAcnVsZT1qczokLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS95alxcXCIpJywgLy/pk77mjqVcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLCAvL+e7hOS7tuagt+W8j1xcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogZGlyZWN0b3JcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfVxcbn0gY2F0Y2gge31cXG5cXG4vL+exu+WIq1xcbnZhciBhcnRzID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCAnYm9keSYmLnBhbmVsLWJsb2NrOmNvbnRhaW5zKOmhnuWIpSkmJmEnKTtcXG5pZihhcnRzLmxlbmd0aD4wKXtcXG5kLnB1c2goe1xcbmNvbF90eXBlOlxcXCJibGFua19ibG9ja1xcXCJcXG59KVxcbiAgICBkLnB1c2goe1xcbiAgICAgICB0aXRsZTogXFxcIumhnuWIpTpcXFwiLFxcbiAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXG4gICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJywgICAgICBcXG59KTtcXG5mb3IgKHZhciBpIGluIGFydHMpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFwiIzFFODg4NFxcXCI+JytwYXJzZURvbUZvckh0bWwoYXJ0c1tpXSwgJ1RleHQnKSsnPC9mb250PjwvbWlkZGxlPjwvYj4nLFxcbiAgICAgICAgdXJsOiBwYXJzZURvbShhcnRzW2ldLCAnYSYmaHJlZicpICsgJyZwYWdlPWZ5cGFnZUBydWxlPWpzOiQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3lqXFxcIiknLC8v6ZO+5o6lXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLC8v57uE5Lu25qC35byPXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHBhZ2VUaXRsZTogcGFyc2VEb21Gb3JIdG1sKGFydHNbaV0sICdUZXh0JylcXG4gICAgICAgIH1cXG59KVxcbn1cXG5kLnB1c2goe1xcbmNvbF90eXBlOlxcXCJibGFua19ibG9ja1xcXCJcXG59KVxcbn1cXG5cXG4vL+ezu+WIl1xcbnZhciBhcnRzID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCAnYm9keSYmLnBhbmVsLWJsb2NrOmNvbnRhaW5zKOezu+WIlykmJmEnKTtcXG5pZihhcnRzLmxlbmd0aD4wKXtcXG5kLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCIsXFxuICAgIH0pXFxuICAgIGQucHVzaCh7XFxuICAgICAgIHRpdGxlOiBcXFwi57O75YiXOlxcXCIsXFxuICAgICAgIHVybDogXFxcInRvYXN0Oi8v54K55LqG5Lmf5LmI5pyJ55So8J+lslxcXCIsXFxuICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxufSlcXG5mb3IgKHZhciBpIGluIGFydHMpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPGI+PG1pZGRsZT48Zm9udCBjb2xvcj1cXFwiIzAwZDBmNFxcXCI+JytwYXJzZURvbUZvckh0bWwoYXJ0c1tpXSwgJ1RleHQnKS5zbGljZSgwLDE4KSsnPC9mb250PjwvbWlkZGxlPjwvYj4nLFxcbiAgICAgICAgdXJsOiBwYXJzZURvbShhcnRzW2ldLCAnYSYmaHJlZicpICsgJz9wYWdlPWZ5cGFnZUBydWxlPWpzOiQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3lqXFxcIiknLC8v6ZO+5o6lXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLC8v57uE5Lu25qC35byPXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHBhZ2VUaXRsZTogcGFyc2VEb21Gb3JIdG1sKGFydHNbaV0sICdUZXh0JylcXG4gICAgICAgIH1cXG59KVxcbn1cXG5kLnB1c2goe1xcbmNvbF90eXBlOlxcXCJibGFua19ibG9ja1xcXCJcXG59KVxcbn1cXG5cXG4vL+mihOiniOinhumikVxcbiAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxtaWRkbGU+PGZvbnQgY29sb3I9IzEzQjY2QT7wn5O66aCQ6Ka94pGgPC9mb250PjwvbWlkZGxlPicsXFxuICAgICAgICB1cmw6IE1ZX1VSTCArICQoJycpLmxhenlSdWxlKCjor4bliKvnoIEpID0+IHtcXG4gICAgICAgICAgICAgdHJ5e1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGh0bWwgPSByZXF1ZXN0KGlucHV0KVxcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVybCA9IHBkZmgoaHRtbCxcXFwiLm1lc3NhZ2UtYm9keSYmc291cmNlJiZzcmNcXFwiKVxcbiAgICAgICAgICAgICAgICAgICBpZiggIXVybC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikmJnVybCE9PVxcXCJcXFwiKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBcXFwiaHR0cHM6XFxcIiArIHVybFxcbiAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih1cmw9PVxcXCJcXFwiKXtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mspLmnInpoJDopr3lkq9cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybFxcbiAgICAgICAgICAgICB9Y2F0Y2h7cmV0dXJuIFxcXCJ0b2FzdDovL+aykuaciemgkOimveWSr1xcXCJ9XFxuICAgICAgICAgICAgICAgICAgfSzor4bliKvnoIEpLFxcbiAgICAgICAgY29sX3R5cGU6ICdmbGV4X2J1dHRvbicsICAgICAgICBcXG4gICAgICAgICAgICAgICAgIH0pXFxuICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPG1pZGRsZT48Zm9udCBjb2xvcj0jMTNCNjZBPvCfk7rpoJDopr3ikaE8L2ZvbnQ+PC9taWRkbGU+JyxcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiICsgJCgnJykubGF6eVJ1bGUoKOivhuWIq+eggSkgPT4ge1xcbiAgICAgICAgICAgICB0cnl7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoID0gXFxcImh0dHBzOi8vamF2c3VidGl0bGVkLmNvbS96aC9zZWFyY2g/a2V5d29yZHM9XFxcIiArIOivhuWIq+eggVxcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvZGV1cmwgPSBcXFwiaHR0cHM6Ly9qYXZzdWJ0aXRsZWQuY29tL1xcXCIgKyBwZGZoKHJlcXVlc3Qoc2VhcmNoKSxcXFwiYm9keSYmLnZpZGVvYm94JiZhJiZocmVmXFxcIilcXG4gICAgICAgICAgICAgICAgICAgIHZhciBwbGF5bGlzdCA9IGZldGNoKGNvZGV1cmwpLm1hdGNoKC9odHRwcz86XFxcXC9cXFxcL1xcXFxTK1xcXFwubTN1OC8pWzBdXFxuICAgICAgICAgICAgICAgICAgICB2YXIgcGxheWhkID0gZmV0Y2gocGxheWxpc3QpLm1hdGNoKC9bXlxcXCJcXFxcbl0rXFxcXC5tM3U4L2cpLnBvcCgpXFxuICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gcGxheWxpc3QucmVwbGFjZShcXFwicGxheWxpc3QubTN1OFxcXCIscGxheWhkKVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybFxcbiAgICAgICAgICAgICB9Y2F0Y2h7cmV0dXJuIFxcXCJ0b2FzdDovL+aMguair+aIluaykuaciemgkOimveWSr1xcXCJ9XFxuICAgICAgICAgICAgICAgICAgfSzor4bliKvnoIEpLFxcbiAgICAgICAgY29sX3R5cGU6ICdmbGV4X2J1dHRvbicsICAgICAgIFxcbiAgICAgICAgICAgICAgICAgfSlcXG52YXIg55+t6KmVID0gcGRmaChodG1sLFxcXCIudGFicyYmbGlbZGF0YS1tb3ZpZS10YWItdGFyZ2V0PXJldmlld1RhYl0mJlRleHRcXFwiKVxcbnZhciBjaWxpID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCAnYm9keSYmLml0ZW0uY29sdW1ucy5pcy1kZXNrdG9wJyk7XFxudmFyIHRhYnMgPSBbXFxcIuejgemPiChcXFwiICsgY2lsaS5sZW5ndGggKyBcXFwiKVxcXCIs55+t6KmVXTtcXG5cXG5mdW5jdGlvbiBzZXRUYWJzKHRhYnMsIHRhYnVybCkge1xcbiAgICB2YXIgQ29sb3IxID0gXFxcIiMxM0I2NkFcXFwiO1xcbiAgICBmdW5jdGlvbiBnZXRIZWFkKHRpdGxlKSB7XFxuICAgICAgICByZXR1cm4gJ+KAmOKAmOKAmeKAmTxzdHJvbmc+PGZvbnQgY29sb3I9XFxcIicgKyBDb2xvcjEgKyAnXFxcIj4nICsgdGl0bGUgKyAnPC9mcm9udD48L3N0cm9uZz4nO1xcbiAgICAgICAgIH1cXG4gICAgdmFyIENvbG9yMiA9IFxcXCIjRkYwMEZGXFxcIjtcXG4gICAgZnVuY3Rpb24gZ2V0SGVhcih0aXRsZSkge1xcbiAgICAgICAgcmV0dXJuICfigJjigJjigJnigJk8c3Ryb25nPjxmb250IGNvbG9yPVxcXCInICsgQ29sb3IyICsgJ1xcXCI+JyArIHRpdGxlICsgJzwvZnJvbnQ+PC9zdHJvbmc+JztcXG4gICAgICAgIH1cXG5cXG4gICAgZm9yICh2YXIgaSBpbiB0YWJzKSB7XFxuICAgICAgICB2YXIgdGFibmFtZSA9IHRhYnNbaV07XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBnZXRNeVZhcih0YWJ1cmwsICcwJykgPT0gaSA/IGdldEhlYXIodGFibmFtZSkgOiBnZXRIZWFkKHRhYm5hbWUpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnZmxleF9idXR0b24nLFxcbiAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgodGFibmFtZSwgdGFidXJsLCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dE15VmFyKHRhYnVybCwgaSlcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICAgICAgIH0sIHRhYm5hbWUsIHRhYnVybCwgaSlcXG4gICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH1cXG4gICAgfVxcblxcbnZhciBsaXN0cyA9IFtdO1xcbmZ1bmN0aW9uIHNldExpc3RzKGxpc3RzLCBpbmRleCkge1xcbiAgICBmdW5jdGlvbiBwbGF5TGlzdHMoKSB7XFxuICAgICAgIGlmIChpbmRleCA9PSAwKSB7XFxuLy/no4HlipvlhoXlrrlcXG50cnl7XFxuY2lsaS5mb3JFYWNoKHZpZGVvID0+IHtcXG4vL3ZhciB0aXRsZSA9IHBhcnNlRG9tRm9ySHRtbCh2aWRlbywgJ2EmJlRleHQnKTtcXG50cnl7XFxudmFyIHNpemUgPSBwYXJzZURvbUZvckh0bWwodmlkZW8sICcubWV0YSYmVGV4dCcpLm1hdGNoKC9cXFxcZCsoPzpcXFxcLlxcXFxkKyk/W2dtXShiKT8vaSlbMF1cXG59Y2F0Y2h7XFxudmFyIHNpemUgPSAnMC4wMEdCJ1xcbn1cXG52YXIgdGFnID0gcGFyc2VEb21Gb3JIdG1sKHZpZGVvLCAnLnRhZ3MmJlRleHQnKVxcbnZhciB1cmwgPSBwZGZoKHZpZGVvLCAnYSYmaHJlZicpLnNwbGl0KFxcXCImXFxcIilbMF1cXG52YXIgdGl0bGUgPSBwZGZoKHZpZGVvLFxcXCIubmFtZSYmVGV4dFxcXCIpXFxudmFyIG1hdGNoID0g6K+G5Yir56CBLm1hdGNoKC8oLio/KS0oLiopLyk7XFxuaWYgKG1hdGNoKSB7XFxuICAgIG1hdGNoMSA9IG1hdGNoWzFdO1xcbiAgICBtYXRjaDIgPSBtYXRjaFsyXTtcXG4gICAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cCgnLio/KCcgKyBtYXRjaDEgKyAnWy18X3xcXFxcc10/JyArIG1hdGNoMiArICcuKiknLCAnaScpO1xcbiAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UocmVnZXgsICckMScpO1xcbn1cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0aXRsZVxcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFxcXCIudG9ycmVudFxcXCIsXFxcIlxcXCIpXFxuICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXFxcIi5tcDRcXFwiLFxcXCJcXFwiKVxcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9AL2csXFxcIlxcXFx0XFxcXHRcXFwiKVxcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9tcDQvZ2ksXFxcIlxcXCIpLFxcbiAgICAgICAgZGVzYzogdGFnLnJlcGxhY2UoL1xcXFxzLyxcXFwiXFxcIikgKyAnXFxcXHTwn5OAJyArIHNpemUgKyAnXFxcXHRcXFxcdPCfl5MnICtwYXJzZURvbUZvckh0bWwodmlkZW8sICcudGltZSYmVGV4dCcpLFxcbiAgICAgICAgcGljX3VybDogJ2h0dHBzOi8vaW1nLnZpbnVhLmNuL2ltYWdlcy9PY3Fwai5wbmcnLFxcbiAgICAgICAgdXJsOiB1cmwsXFxuICAgICAgICBjb2xfdHlwZTogJ2F2YXRhcicsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgbG9uZ0NsaWNrOiBbe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5p+a5a2QJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygodXJsKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5BcHBJbnRlbnQoJ2NvbS55dXp1eXV6dS5kb3dubG9hZCcsICdjb20uZTRhLnJ1bnRpbWUuYW5kcm9pZC5tYWluQWN0aXZpdHknLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnREYXRhOiB1cmxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB1cmwpXFxuICAgICAgICAgICAgICAgICAgICB9LHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ/CdkI/wnZ+Q8J2QjycsXFxuICAgICAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHVybCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuQXBwSW50ZW50KCdjb20uaHNlLnAycGRvd25sb2FkJywgJ2NvbS5zYXVzYWdlLmRvd25sb2FkLnVpLnYxLmFjdGl2aXR5Lk1haW5BY3Rpdml0eScsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudERhdGE6IHVybFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHVybClcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+mXquWtmOS6kScsXFxuICAgICAgICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKHVybCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuQXBwSW50ZW50KCdjb20uc2hhbnhpYXphaWRvd24nLCAnY29tLmU0YS5ydW50aW1lLmFuZHJvaWQubWFpbkFjdGl2aXR5Jywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50RGF0YTogdXJsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdXJsKVxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5LqM6am0JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygodXJsKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5BcHBJbnRlbnQoJ2NvbS5xaWtjbG91ZC5xaWsnLCAnY29tLmU0YS5ydW50aW1lLmFuZHJvaWQubWFpbkFjdGl2aXR5Jywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50RGF0YTogdXJsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdXJsKVxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5oKf56m6JyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygodXJsKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5BcHBJbnRlbnQoJ2NvbS55Zm9vLndrRG93bmxvYWRlcicsICdjb20ueWZvby53a0Rvd25sb2FkZXIuTWFpbkFjdGl2aXR5Jywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50RGF0YTogdXJsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdXJsKVxcbiAgICAgICAgICAgICAgICAgICAgfSx7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfov4Xpm7cnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCh1cmwpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbkFwcEludGVudCgnY29tLnh1bmxlaS5kb3dubG9hZHByb3ZpZGVyLmxpdGUnLCAnY29tLnh1bmxlaS5kb3dubG9hZHByb3ZpZGVyLmxhdW5jaC5MYXVuY2hBY3Rpdml0eScsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudERhdGE6IHVybFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHVybClcXG4gICAgICAgICAgICAgICAgICAgIH0se1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnUGlrcGFrJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygodXJsKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwicGlrcGFrYXBwOi8vbXlwaWtwYWsuY29tL3hwYW4vbWFpbl90YWI/dGFiPTEmYWRkX3VybD1cXFwiICsgdXJsO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHVybClcXG4gICAgICAgICAgICAgICAgICAgIH1dXFxufVxcbiAgICB9KTtcXG59KVxcbn1jYXRjaHt9XFxuICAgICAgIH1lbHNlIGlmIChpbmRleCA9PSAxKSB7XFxudHJ5e1xcbiAgICAgICB2YXIgdXJsID0gcGQoaHRtbCxcXFwiLnRhYnMmJmxpW2RhdGEtbW92aWUtdGFiLXRhcmdldD1yZXZpZXdUYWJdJiZhJiZkYXRhLXVybFxcXCIpXFxuICAgICAgIHZhciBoID0gZmV0Y2godXJsLCB7XFxuICAgIGhlYWRlcnM6IHtcXG4gICAgICAgIGNvb2tpZTogZmV0Y2hQQygnaGlrZXI6Ly9maWxlcy9ydWxlcy9BcG9sbG8vQ29va2llL2phdmRiX2Nvb2tpZS50eHQnKSB8fCAnJyxcXG4gICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogXFxcIk1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMjsgU00tRzk3NTAgQnVpbGQvU1AxQS4yMTA4MTIuMDE2OyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzg5LjAuNDM4OS43MiBNUVFCcm93c2VyLzYuMiBUQlMvMDQ2Mjc5IE1vYmlsZSBTYWZhcmkvNTM3LjM2XFxcIiwgICAgICBcXG4gICAgfSxcXG4gICAgcmVkaXJlY3Q6IGZhbHNlXFxufSk7XFxuICAgICAgIHZhciBsaXN0ID0gcGRmYShoLFxcXCIubWVzc2FnZS1ib2R5JiYucmV2aWV3LWl0ZW06aGFzKC5yZXZpZXctdGl0bGUpXFxcIilcXG4gICAgICAgbGlzdC5mb3JFYWNoKGl0ZW09PntcXG4gICAgICAgICB2YXIgZGVzYyA9ICc8bWlkZGxlPjxmb250IGNvbG9yPSNGRjhDMDA+JyArIHBkZmgoaXRlbSxcXFwiLnJldmlldy10aXRsZS0tLmxpa2VzLS0ucmVwb3J0JiZUZXh0XFxcIikgKyAnPC9mb250PjwvbWlkZGxlPic7ICAgICAgICAgICAgICBcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogZGVzYyArICc8YnI+JyArICc8c21hbGw+PGZvbnQgY29sb3I9I2ZmNjg3Nz5cXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0JyArIHBkZmgoaXRlbSxcXFwiLmNvbnRlbnQmJlRleHRcXFwiKSArICc8L2ZvbnQ+PC9zbWFsbD4nLCAgICAgICAgICAgICAgICBcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtsaW5lVmlzaWJsZTpmYWxzZX1cXG4gICAgICAgICAgICAgICB9KVxcbiAgICAgICAgIH0pXFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08c21hbGw+PGZvbnQgY29sb3I9IzEzQjY2QT7mm7TlpJrnn63oqZXlj6/miJDkuLpWSVDmiJboh7PlrpjmlrlBcHDkuK3mn6XnnIs8L2ZvbnQ+PC9zbWFsbD4nLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoJycpLmxhenlSdWxlKCjor4bliKvnoIEpID0+IHsgICAgICAgICAgICAgICBcXG4gICAgICAgICBvcGVuQXBwSW50ZW50KCd4eHgucG9ybmh1Yi5mdWNrJywgJ3h4eC5wb3JuaHViLmZ1Y2suTWFpbkFjdGl2aXR5Jywge2ludGVudERhdGE6IOivhuWIq+eggX0pXFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIOivhuWIq+eggVxcbiAgICAgICAgICAgICAgICAgIH0s6K+G5Yir56CBKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtsaW5lVmlzaWJsZTpmYWxzZX1cXG4gICAgICAgICAgICAgICB9KVxcbn1jYXRjaHt9XFxuICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgcGxheUxpc3RzKCkgICAgICAgIFxcbiAgICAgICAgICAgIH1cXG5cXG5zZXRUYWJzKHRhYnMsIE1ZX1VSTCk7XFxuc2V0TGlzdHMobGlzdHMsIGdldE15VmFyKE1ZX1VSTCwgJzAnKSk7XFxuXFxuXFxuXFxudHJ5e1xcbnZhciBsaXN0ID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCAnYm9keSYmLm1lc3NhZ2U6bWF0Y2hlcyjpgoTlh7rmvJTpgY4pJiYudGlsZS1zbWFsbCYmYScpO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjRkYwMEZGO1xcXCI+VEEo5YCRKemChOWHuua8lOmBjjwvc3Bhbj4nLFxcbiAgICBwaWNfdXJsOiBcXFwiaHR0cHM6Ly9sYW5tZWlndW9qaWFuZy5jb20vdHViaWFvL2tlLzEwMC5wbmdcXFwiLFxcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCdcXG59KTtcXG5saXN0LmZvckVhY2goKHZpZGVvLGluZGV4KSA9PiB7XFxuICAgIHZhciB0aXRsZSA9IHBhcnNlRG9tRm9ySHRtbCh2aWRlbywgJy52aWRlby1udW1iZXImJlRleHQnKSArICcgJyArIHBhcnNlRG9tRm9ySHRtbCh2aWRlbywgJ2EmJnRpdGxlJyk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogIHRpdGxlLFxcbiAgICAgICAgLy9kZXNjOiBwYXJzZURvbUZvckh0bWwodmlkZW8sICcudmlkZW8tbnVtYmVyJiZUZXh0JyksXFxuICAgICAgICBpbWc6IHBhcnNlRG9tKHZpZGVvLCAnaW1nJiZzcmMnKS5yZXBsYWNlKFxcXCJ0aHVtYnNcXFwiLFxcXCJjb3ZlcnNcXFwiKSArIFxcXCJAUmVmZXJlcj1cXFwiLFxcbiAgICAgICAgdXJsOiBwYXJzZURvbSh2aWRlbywgJ2EmJmhyZWYnKSArICdAcnVsZT1qczokLnJlcXVpcmUoXFxcImVqXFxcIiknLFxcbiAgICAgICAgY29sX3R5cGU6ICdtb3ZpZV8yJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgcGFnZVRpdGxlOiB0aXRsZSxcXG5pbWc6IHBhcnNlRG9tKHZpZGVvLCAnaW1nJiZzcmMnKS5yZXBsYWNlKFxcXCJ0aHVtYnNcXFwiLFxcXCJjb3ZlcnNcXFwiKSBcXG4gICAgICAgIH1cXG4gIH0pO1xcbn0pICAgXFxuICAgICBpZiAobGlzdC5sZW5ndGggJSAyICE9IDApIHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIvCfl69SYW5kb23wn5evXFxcIixcXG5pbWc6ICdodHRwczovL3RodW1ic25hcC5jb20vaS8zdXFqYzFxcS5naWYnLFxcbiAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2phdmRiLmNvbS92L3dLYjRuQHJ1bGU9anM6JC5yZXF1aXJlKFxcXCJlalxcXCIpJywgICAgICAgICAgICAgICBcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJtb3ZpZV8yXFxcIixcXG4gICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBcXFwiSVBYLTE0OSDliJ3mrKHlh4zovrEg57SU5r2U5aWz5aSn55Sf6YGt6Lef6Lmk54uC6IKP57+7IOaru+epuuahg1xcXCIsXFxuICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9XFxufSBjYXRjaCAoZXJyKSB7XFxuICAvL2NvbnNvbGUubG9nKCfmsqHmnInlh7rmvJTliJfooagnLCBlcnIpO1xcbn07XFxuXFxudHJ5e1xcbnZhciBsaXN0ID0gcGFyc2VEb21Gb3JBcnJheShodG1sLCAnYm9keSYmLm1lc3NhZ2U6bWF0Y2hlcyjkvaDlj6/og73kuZ/llpzmraEpJiYudGlsZS1zbWFsbCYmYScpO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjRkYwMEZGO1xcXCI+5L2g5Y+v6IO95Lmf5Zac5q2hPC9zcGFuPicsXFxuICAgIHBpY191cmw6IFxcXCJodHRwczovL2xhbm1laWd1b2ppYW5nLmNvbS90dWJpYW8va2UvMTAwLnBuZ1xcXCIsXFxuICAgIGNvbF90eXBlOiAncmljaF90ZXh0J1xcbn0pO1xcbmxpc3QuZm9yRWFjaCh2aWRlbyA9PiB7XFxuICAgIHZhciB0aXRsZSA9IHBhcnNlRG9tRm9ySHRtbCh2aWRlbywgJy52aWRlby1udW1iZXImJlRleHQnKSArICcgJyArIHBhcnNlRG9tRm9ySHRtbCh2aWRlbywgJ2EmJnRpdGxlJyk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogIHRpdGxlLFxcbiAgICAgICAgLy9kZXNjOiBwYXJzZURvbUZvckh0bWwodmlkZW8sICcudmlkZW8tbnVtYmVyJiZUZXh0JyksXFxuICAgICAgICBpbWc6IHBhcnNlRG9tKHZpZGVvLCAnaW1nJiZzcmMnKS5yZXBsYWNlKFxcXCJ0aHVtYnNcXFwiLFxcXCJjb3ZlcnNcXFwiKSArIFxcXCJAUmVmZXJlcj1cXFwiLFxcbiAgICAgICAgdXJsOiBwYXJzZURvbSh2aWRlbywgJ2EmJmhyZWYnKSArICdAcnVsZT1qczokLnJlcXVpcmUoXFxcImVqXFxcIiknLFxcbiAgICAgICAgY29sX3R5cGU6ICdtb3ZpZV8yJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgcGFnZVRpdGxlOiB0aXRsZSxcXG5pbWc6IHBhcnNlRG9tKHZpZGVvLCAnaW1nJiZzcmMnKS5yZXBsYWNlKFxcXCJ0aHVtYnNcXFwiLFxcXCJjb3ZlcnNcXFwiKVxcbiAgICAgICAgfVxcbiAgfSk7XFxufSkgICBcXG4gICAgIGlmIChsaXN0Lmxlbmd0aCAlIDIgIT0gMCkge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi8J+Xr1JhbmRvbfCfl69cXFwiLFxcbmltZzogJ2h0dHBzOi8vdGh1bWJzbmFwLmNvbS9pL01VNVVhQjRZLmdpZicsXFxuICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHlcXFwiLCAgICAgICAgICAgICAgIFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcIm1vdmllXzJcXFwiXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH1cXG59IGNhdGNoIChlcnIpIHtcXG4gIC8vY29uc29sZS5sb2coJ+ayoeacieaOqOiNkOWIl+ihqCcsIGVycik7XFxufTtcXG5cXG59Y2F0Y2h7XFxudmFyIOivhuWIq+eggSA9IGdldFBhZ2VUaXRsZSgpLnNwbGl0KFxcXCIgXFxcIilbMF0ucmVwbGFjZShcXFwiRkMyXFxcIixcXFwiRkMyLVBQVlxcXCIpO1xcbnZhciBpbWcgPSBNWV9QQVJBTVMuaW1nO1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgaW1nOiBpbWcsXFxuICAgICAgICAgICAgIHVybDogXFxcImNvcHk6Ly9cXFwiICsgaW1nLFxcbiAgICAgICAgICAgICBjb2xfdHlwZTogJ3BpY18xX2Z1bGwnLFxcbn0pXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogIFxcXCJmYzLpnIDopoFWSVDnmbvlvZVcXFwiLFxcbiAgICAgICAgZGVzYzogXFxcIjMwMOWkp+a0i++8jOaJjeaYvuekuumhtemdou+8jOiwt+atjOaQnOe0ouS4gOS4i+aIluaIs+S4i+mdouWbvuagh1xcXCIsXFxuICAgICAgICB1cmw6IFxcXCJodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPVxcXCIgKyDor4bliKvnoIEsXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICAgICAgZXh0cmE6e2xpbmVWaXNpYmxlOmZhbHNlfVxcbiAgICAgICAgfSk7XFxuZXZhbChKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL3BhZ2UvdG9vbCcsIHt9KSkucnVsZSk7XFxuXFxufVxcbi8qXFxuZm9yICh2YXIgYiA9IDA7IGIgPCAyOyBiKyspIHtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogJ2JpZ19ibGFua19ibG9jaydcXG59KVxcbn0qL1xcbmQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgXFxcIuaIkeaYr+acieW6lee6v+eahFxcXCIuZm9udGNvbG9yKFxcXCJncmV5XFxcIilcXG4gICAgICAgICAgICAgICAgLnNtYWxsKCksXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KVxcbnNldFJlc3VsdChkKVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi4pGj5LiA57qn5pS26JeP6aG16Z2iXCIsXCJwYXRoXCI6XCLmlLbol49cIixcInJ1bGVcIjpcImZ1bmN0aW9uIGdldEhlYWQodGl0bGUsY29sb3IpIHtcXG4gICAgcmV0dXJuICfigJjigJjigJnigJk8c3Ryb25nPjxiaWc+PGZvbnQgY29sb3I9XFxcIicrY29sb3IrJ1xcXCI+JyArIHRpdGxlICsgJzwvZnJvbnQ+PC9iaWc+PC9zdHJvbmc+JztcXG59XFxuXFxudmFyIGxhYmVsID0gZ2V0VmFyKFxcXCJsYWJlbFxcXCIpID8gZ2V0VmFyKFxcXCJsYWJlbFxcXCIpIDogXFxcIuW9seeJh1xcXCI7XFxuaWYgKE1ZX1BBR0UgPT0gMSkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGxhYmVsID09IFxcXCLlvbHniYdcXFwiID8gZ2V0SGVhZChcXFwiPeKLmeW9seeJh+KLmD1cXFwiLFxcXCIjRkYwMEZGXFxcIikgOiBnZXRIZWFkKFxcXCI94ouZ5b2x54mH4ouYPVxcXCIsXFxcIiNEM0QzRDNcXFwiKSxcXG4gICAgICAgaW1nOiBcXFwiaHR0cHM6Ly9jZG4xLmljb25maW5kZXIuY29tL2RhdGEvaWNvbnMvdWktdXNlci1pbnRlcmZhY2UtOS8xMDAwL1ZpZGVvX0NhbWVyYS0xMjgucG5nXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHkjbm9Mb2FkaW5nI0BsYXp5UnVsZT0uanM6cHV0VmFyKCdsYWJlbCcsJ+W9seeJhycpO3JlZnJlc2hQYWdlKGZhbHNlKTsndG9hc3Q6Ly/liIfmjaLmiJDlip8nXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiAnaWNvbl8yX3JvdW5kJ1xcbiAgICB9KTtcXG59XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogbGFiZWwgPT0gXFxcIua8lOWToVxcXCIgPyBnZXRIZWFkKFxcXCI94ouZ5ryU5ZOh4ouYPVxcXCIsXFxcIiNGRjAwRkZcXFwiKSA6IGdldEhlYWQoXFxcIj3ii5nmvJTlk6Hii5g9XFxcIixcXFwiI0QzRDNEM1xcXCIpLFxcbiAgICAgICAgaW1nOiBcXFwiaHR0cHM6Ly9jZG4yLmljb25maW5kZXIuY29tL2RhdGEvaWNvbnMvdmFsZW50aW5lLWRheS0xNi81MTIvNzA2X3Blbl9sb3ZlX2hlYXJ0X3dlZGRpbmdfdmFsZW50aW5lX3ZhbGVudGluZXNfZGF5X2xvdmUtMTI4LnBuZ1xcXCIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5I25vTG9hZGluZyNAbGF6eVJ1bGU9LmpzOnB1dFZhcignbGFiZWwnLCfmvJTlk6EnKTtyZWZyZXNoUGFnZShmYWxzZSk7J3RvYXN0Oi8v5YiH5o2i5oiQ5YqfJ1xcXCIsXFxuICAgICAgICBjb2xfdHlwZTogJ2ljb25fMl9yb3VuZCdcXG4gICAgfSk7XFxuXFxuXFxudmFyIHUgPSBsYWJlbCA9PSBcXFwi5b2x54mHXFxcIiA/ICdoaWtlcjovL2ZpbGVzL3J1bGVzL2Fwb2xsby9qYXZkYi9qYXZkYl92aWRlby50eHQnIDogJ2hpa2VyOi8vZmlsZXMvcnVsZXMvYXBvbGxvL2phdmRiL2phdmRiX2FjdG9yLnR4dCc7XFxudmFyIHN0ciA9IHJlYWRGaWxlKHUsIDApO1xcbmlmIChzdHIpIHtcXG4gICAgdmFyIGxpc3QgPSBKU09OLnBhcnNlKHN0cik7XFxuICAgIGxpc3QuZm9yRWFjaCgobGlzdCkgPT4ge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogbGlzdC5zcGxpdCgnQEAnKVswXSxcXG4gICAgICAgICAgICBpbWc6IGxpc3Quc3BsaXQoJ0BAJylbMV0sXFxuICAgICAgICAgICAgdXJsOiBsYWJlbCA9PSBcXFwi5ryU5ZOhXFxcIj8naGlrZXI6Ly9wYWdlL3lqJzonaGlrZXI6Ly9wYWdlL2VqJyxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbGFiZWwgPT0gXFxcIua8lOWToVxcXCIgPyAnY2FyZF9waWNfMycgOiAnbW92aWVfMicsXFxuICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgdXJsOiBsaXN0LnNwbGl0KCdAQCcpWzJdLnJlcGxhY2UoZ2V0TXlWYXIoJ3lvbmdqaXUnKSxNWV9IT01FKSxcXG4gICAgICAgICAgICAgIHBhZ2VUaXRsZTogbGlzdC5zcGxpdCgnQEAnKVswXSxcXG4gICAgICAgICAgICAgIGxvbmdDbGljazogW3tcXG4gICAgICAgICAgICAgICAgICB0aXRsZTogJ+WPlua2iOaUtuiXjycsXFxuICAgICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKGxpc3QsIHUpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKGZldGNoUEModSkgfHwgJ1tdJyk7XFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcih4ID0+IHggIT0gbGlzdCk7XFxuICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZSh1LCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XFxuICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgICAgICAgfSwgbGlzdCwgdSlcXG4gICAgICAgICAgICAgIH1dLFxcbiAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgfSk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi4pGj5LiA57qn6aG16Z2i55m75b2VXCIsXCJwYXRoXCI6XCLnmbvlvZVcIixcInJ1bGVcIjpcIlxcbi8vaWYoZmV0Y2goJ2hpa2VyOi8vZmlsZXMvcnVsZXMvQXBvbGxvL0Nvb2tpZS9qYXZkYl9jb29raWUudHh0Jykpe1xcblxcblxcbmlmKGh0bWwuaW5jbHVkZXMoXFxcIueZu+WHulxcXCIpKXtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08YmlnPjxmb250IGNvbG9yPSNGRjAwRkY+6LSm5Y+35bey55m75b2VPC9mb250PjwvYmlnPicsXFxuICAgICAgICAgICAgZGVzYzogJ+KAnOKAnOKAneKAnScgKyAn5YiH5o2i5YiG57G75Yi35paw6aG16Z2i5YaF5a65Jy5mb250Y29sb3IoJyNGRjAwRkYnKS5iaWcoKSxcXG4gICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICAgICAgfSk7XFxuICAgIH1lbHNle1xcblxcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgJ+eCueWHu+eZu+W9lei0puWPtycuZm9udGNvbG9yKCcjRkYwMEZGJykuYmlnKCksXFxuICAgICAgICB1cmw6IHRydWVfdXJsICsgJCgnJykucnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgdmFyIGQgPSBbXTtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3g1X3dlYnZpZXdfc2luZ2xlJyxcXG4gICAgICAgICAgICAgICAgdXJsOiBNWV9VUkwsXFxuICAgICAgICAgICAgICAgIGRlc2M6ICdsaXN0JiZzY3JlZW4nLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDEyOyBTTS1HOTc1MCBCdWlsZC9TUDFBLjIxMDgxMi4wMTY7IHd2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvODkuMC40Mzg5LjcyIE1RUUJyb3dzZXIvNi4yIFRCUy8wNDYyNzkgTW9iaWxlIFNhZmFyaS81MzcuMzZcXFwiLC8vUENfVUEsICAgICAgICAgICAgIFxcbiAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCh1KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2soKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3RhZ3MnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvID0gZmJhLmdldENvb2tpZSh1KTtcXG4vL3ZhciB1YSA9IGZiYS5nZXRVYSgpXFxuLy9mYmEubG9nKCdjbzo6Ojo6OicgKyB1YSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZmJhLmxvZygnY286Ojo6OjonICsgY28pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY28uaW5jbHVkZXMoJ3JlbWVtYmVyX21lX3Rva2VuJykpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5wYXJzZUxhenlSdWxlKCQkJCgpLmxhenlSdWxlKChjbykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9BcG9sbG8vQ29va2llL2phdmRiX2Nvb2tpZS50eHQnLCBjbyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3QoJ+i0puWPt+W3sueZu+W9lScpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2sodHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjbykpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChjaGVjaywgNTAwKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVjaygpO1xcbiAgICAgICAgICAgICAgICAgICAgfSwgTVlfVVJMKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHNldFJlc3VsdChkKTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbiAgICB9KTtcXG5cXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmkJzntKJcIixcInBhdGhcIjpcInNlYXJjaFwiLFwicnVsZVwiOlwidmFyIHRhYnMgPSBbXFxcIuW9seeJh1xcXCIsIFxcXCLmvJTlkZhcXFwiLCBcXFwi5Y+v5pKtXFxcIiwgXFxcIuS4reWtl1xcXCIsIFxcXCLno4Hpk75cXFwiLCBcXFwi5riF5Y2VXFxcIl1cXG52YXIgbGlzdHMgPSBbXFxcImFsbFxcXCIsIFxcXCJhY3RvclxcXCIsIFxcXCJwbGF5YWJsZVxcXCIsIFxcXCJjbnN1YlxcXCIsIFxcXCJkb3dubG9hZFxcXCIsIFxcXCJsaXN0XFxcIl1cXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCJsaXN0c1xcXCIpO1xcbn0pKTtcXG5zdG9yYWdlMC5wdXRNeVZhcihcXFwibGlzdHNcXFwiLCBsaXN0cyk7XFxudmFyIGxpc3QgPSBsaXN0c1tnZXRNeVZhcihcXFwi5Yqo5oCB5pCc57SiXFxcIiwgJzAnKV07XFxuXFxudGFicy5mb3JFYWNoKChkYXRhLCBpZCkgPT4ge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGdldE15VmFyKFxcXCLliqjmgIHmkJzntKJcXFwiLCAnMCcpID09IGlkID8gJ+KAnOKAnOKAneKAnScgKyBkYXRhLmZvbnRjb2xvcihcXFwiI0ZGRkZGRlxcXCIpIDogZGF0YSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgo57q/6LevLCBpZCwgZ2V0UmFuZ2VDb2xvcnMpID0+IHtcXG4gICAgICAgICAgICB2YXIgbGlzdHMgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwibGlzdHNcXFwiKTtcXG4gICAgICAgICAgICDnur/ot68uZm9yRWFjaCgoZGF0YSwgeGxpZCkgPT4ge1xcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpZCA9PSB4bGlkID8gJ+KAnOKAnOKAneKAnScgKyBkYXRhLmZvbnRjb2xvcihcXFwiI0ZGRkZGRlxcXCIpIDogZGF0YSxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBpZCA9PSB4bGlkID8gZ2V0UmFuZ2VDb2xvcnMoKSA6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBcXFwi5Yqo5oCB5pCc57SiXFxcIiArIFxcXCJf57q/6LevXFxcIiArIHhsaWRcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcIuWKqOaAgeaQnOe0olxcXCIsIGlkKVxcbiAgICAgICAgICAgIHZhciDnq6DoioIgPSBsaXN0c1tnZXRNeVZhcihcXFwi5Yqo5oCB5pCc57SiXFxcIiwgJzAnKV07XFxuICAgICAgICAgICAgbGV0IGNwID0ge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogXFxcIvCfkqDmkJxcXFwiICsg57q/6LevW2lkXSArIFxcXCLwn5KgXFxcIixcXG4gICAgICAgICAgICAgICAgZGVzYzogXFxcIuaQnOe0ouS9oOaDs+imgeeahFxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJC50b1N0cmluZygo57G75Z6LKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcigna2V5JywgaW5wdXQpXFxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5cyA9IGxpc3RNeVZhcktleXMoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBrZXlzKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTXlWYXIoaXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ3lpX2ZpcnN0cGFnZScsIGdldFB1YmxpY0l0ZW0oJ2phdmRiMCcpICsgXFxcIi9zZWFyY2g/Zj1cXFwiICsg57G75Z6LICsgXFxcIiZxPVxcXCIgKyBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICAgICAgICAgICAgfSwgbGlzdHNbZ2V0TXlWYXIoXFxcIuWKqOaAgeaQnOe0olxcXCIsICcwJyldKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGdldE15VmFyKFxcXCLliqjmgIHmkJzntKJcXFwiLCAnMCcpID09IGlkID8gXFxcIiMyNTY4YzRcXFwiIDogXFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBjbHM6IFxcXCLliqjmgIHmkJzntKJcXFwiICsgXFxcIl/moIfnrb5cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IOeroOiKgixcXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoJ2tleScsICcnKSxcXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiBcXFwicHV0TXlWYXIoJ2tleScsIGlucHV0KVxcXCJcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXCLliqjmgIHmkJzntKJcXFwiICsgXFxcIl/moIfnrb5cXFwiKTtcXG4gICAgICAgICAgICBhZGRJdGVtQmVmb3JlKFxcXCLliqjmgIHmkJzntKJcXFwiICsgXFxcImZvb3RlclxcXCIsIGNwKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCB0YWJzLCBpZCwgZ2V0UmFuZ2VDb2xvcnMpLFxcbiAgICAgICAgY29sX3R5cGU6ICdmbGV4X2J1dHRvbicsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogZ2V0TXlWYXIoXFxcIuWKqOaAgeaQnOe0olxcXCIsICcwJykgPT0gaWQgPyBnZXRSYW5nZUNvbG9ycygpIDogXFxcIlxcXCIsXFxuICAgICAgICAgICAgaWQ6IFxcXCLliqjmgIHmkJzntKJcXFwiICsgXFxcIl/nur/ot69cXFwiICsgaWRcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufSlcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIvCfkqDmkJxcXFwiICsgdGFic1tnZXRNeVZhcihcXFwi5Yqo5oCB5pCc57SiXFxcIiwgJzAnKV0gKyBcXFwi8J+SoFxcXCIsXFxuICAgIGRlc2M6IFxcXCLmkJzntKLkvaDmg7PopoHnmoRcXFwiLFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKOexu+WeiykgPT4ge1xcbiAgICAgICAgcHV0TXlWYXIoJ2tleScsIGlucHV0KVxcbiAgICAgICAgaWYgKGlucHV0ID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgbGV0IGtleXMgPSBsaXN0TXlWYXJLZXlzKCk7XFxuICAgICAgICAgICAgZm9yIChsZXQgaXQgb2Yga2V5cykge1xcbiAgICAgICAgICAgICAgICBjbGVhck15VmFyKGl0KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHB1dE15VmFyKCd5aV9maXJzdHBhZ2UnLCBnZXRQdWJsaWNJdGVtKCdqYXZkYjAnKSArIFxcXCIvc2VhcmNoP2Y9XFxcIiArIOexu+WeiyArIFxcXCImcT1cXFwiICsgaW5wdXQpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgIH0sIGxpc3RzW2dldE15VmFyKFxcXCLliqjmgIHmkJzntKJcXFwiLCAnMCcpXSksXFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgY2xzOiBcXFwi5Yqo5oCB5pCc57SiXFxcIiArIFxcXCJf5qCH562+XFxcIixcXG4gICAgICAgIGlkOiBsaXN0c1tnZXRNeVZhcihcXFwi5Yqo5oCB5pCc57SiXFxcIiwgJzAnKV0sXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKCdrZXknLCAnJyksXFxuICAgICAgICBvbkNoYW5nZTogXFxcInB1dE15VmFyKCdrZXknLCBpbnB1dClcXFwiXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImJpZ19ibGFua19ibG9ja1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogXFxcIuWKqOaAgeaQnOe0olxcXCIgKyBcXFwiZm9vdGVyXFxcIlxcbiAgICB9XFxufSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLikaDkuIDnuqflpJbpg6hGYzJcIixcInBhdGhcIjpcImZjMlwiLFwicnVsZVwiOlwianM6IFxcbi8vc2V4ODA4NkBnbWFpbC5jb21cXG4vL2h0dHBzOi8vamF2bGlzdC5tZS9wb3N0LnBocFxcblxcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4ge1xcbiAgICAgICAvLyBjbGVhck15VmFyKFxcXCJmY3VybFxcXCIpO1xcbn0pO1xcblxcbiAgICB2YXIgZCA9IFtdXFxuXFxuICAgIFxcbiAgICBzZXRSZXN1bHQoZClcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuavj+aXpeS4gOiogFwiLFwicGF0aFwiOlwieWl5YW5cIixcInJ1bGVcIjpcIi8vYXV0aG9yOueyieWmuVxcbmZ1bmN0aW9uIHNhdmVfZGF5X3NheV9jYWNoZSgpIHtcXG4gICAgbGV0IGRheV9zYXlfY2FjaGUgPSB7fVxcbiAgICBsZXQgZGF5X3NheV9odG1sID0gZmV0Y2goJ2h0dHBzOi8vdjEuaGl0b2tvdG8uY24nLCB7XFxuICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOlxcbiAgICAgICAgICAgICAgICAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEyMi4wLjAuMCBTYWZhcmkvNTM3LjM2JyxcXG4gICAgICAgIH0sXFxuICAgIH0pXFxuICAgIGRheV9zYXlfaHRtbCA9IEpTT04ucGFyc2UoZGF5X3NheV9odG1sKVxcbiAgICBkYXlfc2F5X2NhY2hlWydjb250ZW50J10gPSBkYXlfc2F5X2h0bWxbJ2hpdG9rb3RvJ11cXG4gICAgZGF5X3NheV9jYWNoZVsndGltZSddID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMClcXG4gICAgc3RvcmFnZTAucHV0TXlWYXIoJ2RheXNheScsIGRheV9zYXlfY2FjaGUpXFxuICAgIHJldHVybiBkYXlfc2F5X2h0bWxbJ2hpdG9rb3RvJ11cXG59XFxuXFxuICAgIGxldCBkYXlfc2F5ID0gJydcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCBkYXlfc2F5X2NhY2hlID0ge31cXG4gICAgICAgIGxldCBkYXlfdGltZSA9IDBcXG4gICAgICAgIGlmIChzdG9yYWdlMC5nZXRNeVZhcignZGF5c2F5JykpIHtcXG4gICAgICAgICAgICBkYXlfc2F5X2NhY2hlID0gc3RvcmFnZTAuZ2V0TXlWYXIoJ2RheXNheScsIHt9KVxcbiAgICAgICAgICAgIGRheV90aW1lID0gZGF5X3NheV9jYWNoZVsndGltZSddXFxuICAgICAgICAgICAgaWYgKE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApIC0gZGF5X3RpbWUgPj0gNjAwKSB7XFxuICAgICAgICAgICAgICAgIGRheV9zYXkgPSBzYXZlX2RheV9zYXlfY2FjaGUoKVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGRheV9zYXkgPSBkYXlfc2F5X2NhY2hlWydjb250ZW50J11cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGRheV9zYXkgPSBzYXZlX2RheV9zYXlfY2FjaGUoKVxcbiAgICAgICAgfVxcbiAgICB9IGNhdGNoIHtcXG4gICAgICAgIGRheV9zYXkgPSAnJ1xcbiAgICB9XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnv7vor5FcIixcInBhdGhcIjpcInRyYW5zXCIsXCJydWxlXCI6XCIgICAgLy/nv7vor5FcXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKHRleHQpIHtcXG4gICAgICAgIHZhciBzd2l0Y2h0cmFucyA9IGdldEl0ZW0oJ3N3aXRjaHRyYW5zJywgJ+W9qeS6keWwj+ivkScpO1xcbiAgICAgICAgaWYgKHN3aXRjaHRyYW5zID09IHRydWUgfHwgc3dpdGNodHJhbnMgPT0gXFxcIuW9qeS6keWwj+ivkVxcXCIpIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICB2YXIgdG8gPSAnemgnXFxuICAgICAgICAgICAgICAgIHZhciBmcm9tID0gJ2F1dG8nXFxuXFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRfZGF0YShzb3VyY2VfbGFuZywgdGFyZ2V0X2xhbmcpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Q6IHRydWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgb3NfdHlwZTogJ2lvcycsXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2lkOiAnRjFGOTAyRjctMTc4MC00Qzg4LTg0OEQtNzFGMzVEODhBNjAyJyxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc190eXBlOiBzb3VyY2VfbGFuZyArICcyJyArIHRhcmdldF9sYW5nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOiAndGV4dCcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9pZDogNDI0MjM4MzM1LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfaWQ6ICcnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Q6IHRydWUsXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UmFuZG9tTnVtYmVyKCkge1xcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDk5OTk5KSArIDEwMDAwMFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmQgKiAxMDAwXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zdF9kYXRhID0gaW5pdF9kYXRhKGZyb20sIHRvKVxcbiAgICAgICAgICAgICAgICBwb3N0X2RhdGEuc291cmNlID0gdGV4dFxcbiAgICAgICAgICAgICAgICBwb3N0X2RhdGEucmVxdWVzdF9pZCA9IGdldFJhbmRvbU51bWJlcigpXFxuICAgICAgICAgICAgICAgIGxldCByZXMgPSBmZXRjaCgnaHR0cHM6Ly9pbnRlcnByZXRlci5jeWFwaS5jbi92MS90cmFuc2xhdG9yJywge1xcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd4LWF1dGhvcml6YXRpb24nOiAndG9rZW4gc3NkajI3M2tzZGl3aTkyM2JzZDknLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyLWFnZW50JzogJ2NhaXl1bkludGVycHJldGVyLzUgQ0ZOZXR3b3JrLzE0MDQuMC41IERhcndpbi8yMi4zLjAnLFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHBvc3RfZGF0YSxcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UocmVzKVxcbiAgICAgICAgICAgICAgICAgICAgLnRhcmdldFxcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgXFxcIuOAkOKYge+4j+OAkVxcXCJcXG4gICAgICAgICAgICB9IGNhdGNoIHtcXG4gICAgICAgICAgICAgICAgbG9nKFxcXCLnv7vor5HlpLHotKXvvIzkvb/nlKjljp/mlodcXFwiKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRleHRcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2UgaWYgKHN3aXRjaHRyYW5zID09IFxcXCLlsI/niZvnv7vor5FcXFwiKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IFxcXCJodHRwczovL2FwaS5uaXV0cmFucy5jb20vTml1VHJhbnNTZXJ2ZXIvdHJhbnNsYXRpb25cXFwiO1xcbiAgICAgICAgICAgICAgICB2YXIgYXBpID0gZ2V0SXRlbSgnYXBpJyk7XFxuICAgICAgICAgICAgICAgIGlmIChhcGkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmcgPSBcXFwiaHR0cHM6Ly90ZXN0Lm5pdXRyYW5zLmNvbS9OaXVUcmFuc1NlcnZlci9sYW5ndWFnZT9zcmNfdGV4dD1cXFwiICsgdGV4dCArIFxcXCImc291cmNlPXRleHRcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmcm9tID0gSlNPTi5wYXJzZShmZXRjaChsYW5nLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAxMDAwXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFuZ3VhZ2U7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBvc3QodXJsLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY190ZXh0OiB0ZXh0LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbTogZnJvbSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvOiBcXFwiemhcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpa2V5OiBhcGksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDEyMjNcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UocmVzdWx0KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnRndF90ZXh0KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLnRndF90ZXh0ICsgXFxcIuOAkPCfkK7jgJFcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKFxcXCLnv7vor5HlpLHotKXvvIzkvb/nlKjljp/mlodcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHRcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhcXFwi57+76K+R5aSx6LSl77yM5Y6f5paH5Li656m6XFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHRcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0KFxcXCLpooTlpITnkIbor7floavlhpnnv7vor5FhcGlcXFwiKVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHRcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gY2F0Y2gge1xcbiAgICAgICAgICAgICAgICBsb2coXFxcIue/u+ivkeWksei0pe+8jOS9v+eUqOWOn+aWh1xcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIHRleHRcXG4gICAgICAgIH1cXG4gICAgfTtcXG5cXG4gICAgJC5leHBvcnRzLnRyYW5zbGF0ZSA9IHRyYW5zbGF0ZVwifV0iLCJpY29uIjoiaHR0cHM6Ly9pbWcudmludWEuY24vaW1hZ2VzL3pyTGtRLnBuZyIsInByb3h5IjoiIn0=
Add Comment
Please, Sign In to add comment