@agoric/builders 0.2.0-u20.0 → 0.2.0-u21.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -1
- package/package.json +24 -24
- package/scripts/bundles/bundle-contractGovernor-js-meta.json +925 -0
- package/scripts/bundles/bundle-contractGovernor.js +1 -0
- package/scripts/bundles/bundle-fluxAggregatorKit-js-meta.json +1085 -0
- package/scripts/bundles/bundle-fluxAggregatorKit.js +1 -0
- package/scripts/bundles/bundle-psm-js-meta.json +920 -0
- package/scripts/bundles/bundle-psm.js +1 -0
- package/scripts/bundles/bundle-scaledPriceAuthority-js-meta.json +995 -0
- package/scripts/bundles/bundle-scaledPriceAuthority.js +1 -0
- package/scripts/bundles/bundle-vaultFactory-js-meta.json +1220 -0
- package/scripts/bundles/bundle-vaultFactory.js +1 -0
- package/scripts/orchestration/axelar-gmp.build.js +74 -0
- package/scripts/orchestration/get-chain-config.js +117 -0
- package/scripts/orchestration/helpers.js +46 -0
- package/scripts/orchestration/init-basic-flows.js +2 -33
- package/scripts/orchestration/init-stakeAtom.js +11 -2
- package/scripts/orchestration/init-stakeOsmo.js +11 -2
- package/scripts/testing/init-auto-stake-it.js +2 -33
- package/scripts/testing/init-send-anywhere.js +2 -33
- package/scripts/testing/init-swap-anything.js +36 -0
- package/scripts/testing/restart-axelar-gmp.js +94 -0
- package/scripts/testing/start-query-flows.js +43 -23
- package/scripts/vats/upgrade-provisionPool-to-BLD.js +25 -0
- package/scripts/vats/upgrade-vats.js +30 -4
- package/index.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAACFlTAPwRYBAMEWAQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICJtb2R1bGUiOiAiLi9zcmMvcHNtL3BzbS5qcyIKICB9LAogICJjb21wYXJ0bWVudHMiOiB7CiAgICAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2Jhc2Utem9uZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYxLjUuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2hlYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaGVhcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMyZmM5NmFlMmZlMDg2NmU2N2Q3YTI4NmI1MjM0MzE5NThlZGRhNjZlNjAwYjJiYzRjNDVjZmMxZDJjNjIxZjY0NDAzZmEwMmFiNTVhZjY3NzA4N2YyMjYwZDJiNGU2ZDY1ZDM2NmY5ODc4YWRlNTk2N2U5ZTA5YTVmNjYyOGRhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTdlNTMwMGQ0MTM4MjQ2MzFiYWRmNjgwYjZjNjJhYjNlNDkyMGQzYTc2Y2VkMDJkYTg2NmYwY2E4YWJjNDM2OGY5NTRmM2VhYTZjYjA4NjNkYjMxNDk0NDM0NjBiZmY0ZjBkNTRiMzliNmYwZWQwZTI1NjEzZjViMGIxMWE0NzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDViYTc5MTUzZGI4ODNkZWEwODA4YTkwNjM2ZDcxNmRmMDM0YTcwNmI3Zjg1ZGFkMzc3NzMyODUwOWFjNmZkZjllOTU0YWNmOTk5OTkzMDk1NzRmMTNjM2Y3YWNjOTYxMDM5Yjk0NDliODM1ODQzZGQ5ZDk5NDU1M2FkNzcwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjViY2E4OWMwNmMzNWEzOTc5NDQ1NGFjNTdmZTZkMDRjZDkwMGMyZmY2YjEyY2RmZGNjYzg2ODM1ODRlYzYzNDcxNGM3YWZlZDdkMTJjODQ2OTliZTk4MmI2MjFhYTEzOGQ5OTIzNzViYTBhNzE0MjI2NjMwODFkYTcxNTkxOTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY3ZWI5ZTc5NTg3ZjMwOTViNmJlODUzZjc1Y2FkY2U4ZmRiMWFhNjUyYmE1N2UwNzBmZjcwMGY0Y2U2M2EzMDQ0ODM2MjJhYmYxMDQyNjE2Yjc1NWRkNDk0ODM1ZTY3YjcyMDczYzFiNjZkNDkxZjVkZjZhZGQwNjQxOTNkZmNlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2Utb25jZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1vbmNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDFiMTUzM2ViMDU0ZGI0NjE4N2IwZGVkMWI5Y2U2NzNlZDgzNmE5YmM1NDIzMDQ5MDhiZTIzNTUzZDdhOWIxMTRmYmExYmUzOGVlZWIxZDNmYWI0YzA4NjYxMTRhYzc2MmQyZDBmMGVjMWM0N2IyZGRmNjUyMGE5NTNhMjczODEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJlcGFyZS1yZXZvY2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjU1NDkxMzYwZmFlNGQ5NzZkNzA4ZTJjODg0NzNhYTdhYTdlNmEwZjViNTg1NjE2Yjg3NzVkMDg2ZjU3ZDNkODQwZTE2NmZmMDQ1ZjlhNDhhZmViZmZlZmEzNDEzYTBkNmU3NmEwZWQ4MDZlZWRmMTY2ZWExZmE3NTk1NTY2ZmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvd2F0Y2gtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvd2F0Y2gtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEyY2UwNTMzMTIzYWM5NThmMjJiMWM1MmFiNGI5MDUxNzUxY2YyZmIzZTcwYTczM2QyOGI4OThkMTgyM2EwMmI2MDE1MzI3Y2RiY2Q1NGJkNjk5YjFiZWQyYWMwMDYxYWE1N2FiNjA1YmM2OGYyNDI4ZDIzOTZlZDllNGQ5YmJmIgogICAgICAgIH0sCiAgICAgICAgIi4vem9uZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInpvbmUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJmZTUzZmVkNmUwYjFmMjUyMDgwNTNjZTU4YmFkMmE3M2ZmMzk5ZWIzZjBjNjNiODYzMjM3YjIzYjYxOTM1OGFlMDZhZGM4MDAyODBhNDBjMmE5ZDM2Njk3Njg0NGY0NmU1NzdlNDFlNjYzN2M5N2ExZjhmMWM4ZTk2Zjk1NzI5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMC4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjQuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hbW91bnRNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hbW91bnRNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmJhYTY3MGQ4YjcxMWE3ZGQ4ZTIzNDEwNmIwY2E4YTg0NzA0ZGJjNDY1Mzg0ODY2ZGJiMzczMjNhMDk3YTA2OTA0ZjVjY2I3MGRhYmU2ODRhNjlmY2Q1MWYwNWI2NjAxOTEyMTY2ZDczYWNiMWVjYTAzNWYzMGIwMmI2Y2Y2MTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2FhYjljMzQzMzdjN2VkNzZkNTQ3ZmE1YzM4OTJlNjhmZDY5OTEzZTRmZjgwOTk2ZTdhYTJmMDdhYTM5NmFkMjc1MjY3ZGExNmE1YjU2ODk3ZmY4NTI0N2M3ZGNlMzBjNjU3OWQ3NWQ4MWRjMWM3YzllMmUwNWZkNzBiYWJkN2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGlzcGxheUluZm8uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Rpc3BsYXlJbmZvLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDIzMDhmODMwZDdkYTM4MzAxMjQ4YWZiNWRiMDU1OTU2YjM3MjI1NTRmZWE2ODIwMmEzMjc0NzhkNDY5NTZiMmI1YzMyOGNiM2M5ZTE5YTEzYTZjNTg4OTJmYWU2ZjFjZGQyNTI1OTlkMDhjN2VhNmQxNDQ4YmQ1OTJmZDZkNzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmFlNDYxZTA2YWE3OTQxMGVhYTcwZTE2NWMzNTQxNjdlZGFlNzUzNGJlOTI3MGFjNDU2ZmQ3OTI3MGJmN2Q4Y2IyMDYxNDAxMmM1MjgzMzUyYzgyNDJkYTE3ZWM1YWE3N2ZlMDJlZGQ3N2Y5ZjliMTU5MTk1MTlkYWNmZDQ5YTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXNzdWVyS2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pc3N1ZXJLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMzViY2I2ODI1ODg3OTVkY2MyMDUwYzBkNDVlYWI2Y2U4NmRiZjNiZGJhMjNlYTI5NTk1NDcxMGVhYjgzNzE1MzY5ODUxYWQ4ZDczMjNiMmNkZWRmMzQ2MzcxNDQyMjk0MTFjYzkwZmY0OGFmODQ2OGE0ZTUyMDc3MjM1MmE0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4NWNhZTIzYzExNmM2NGZhNWJhYTI2NTViNzJmZWZmNzQ2MDEzMzZiZWNhOWY1ZjQxMmM4Y2UzYzdhYjgyZDkyMTMzMjQ2NTg2ZjEwN2FkZDE3Y2JlNWFiY2VhNGQyMWQ3ODZiYWYxOWM0YzAwZWRkMTJlZWNiNDdmYTFhNTJkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjJkNWYwMGQ5ZjZmNGE0NzI4YjNjZWNjYWM3ZTU4ZmFhOWM2MTVlNjdlMzYwNDI1ZjJjYzRkNmQ5OWM2MGZhZTM2ZmQxN2IyNzA3YzUwMDYyNzU2NDE1NjRjNDI0Njg3ODE1ZDk1OTNiMjc2OTA5MWFkNTcwZDU2OWUzMDhlNGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTkzM2Q1N2Q5OGM4Njc0YTUzOGZiZmZmNjg2ZDAxMTEyNDQ4YWQ5YzBlNDBiYjNkNTU5MzIyMDI5ZmJlYTE3OTg1YTYxMGFiZWUxMzUyM2EyNGI5NDdhYjdlZjY5ODhiNTMyZmZmMGYzOWFhZTUwOTczOWI2Y2I4NGYyOTY0Y2UiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzQ2ZDUzZDIwMTczZGExZDgxZDk5OTY0MzRhNzQzNDcyNzkwM2IxNGQ0MWVkMmQ4NDZhMTU2MTM3YzhhZDBmMzgyZTMxMDgyOWE0ZGVlYzAwZDZmMzU5MmI2Zjg5MWNmZmU0YmY0ZWJlM2UxZTA1MmU1ZDVmZjJiNWQ5MmRiZjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjljZWUzOTU5MWU5YTBlZDc3MjM2MDEyMDhjZmRlYTNkZmIxYWI4ZWJjNGRiZmIwMDc3MmY2NjhjYWFiMmVlNjU5YzRjZjRhZGJiNTMwYTRkMjJmNWU5MTIxNzA1YWIwYjZhYjVhMmUwYTUzNWRkNWNhY2RlZTY3MjE1ZWFlODZkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnRMZWRnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnRMZWRnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2Mjg3MDBiMjc5MmMyNTlkNDYzZmU4MTZiM2UwOGRkMzdmNTM1NzJkZWE1NGU4NmUyNTAxMDc0YjhiZTEwN2Y3MDAyMDMwMDYzOGNmNDJkYzU2ZmJlNDRhMzRhMzEzYmY3ZmU0YzI1ZWExN2Q1OGY5MTQ0ZmQyY2ZjMzEyNTQ3YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wdXJzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHVyc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMWI0MjA5MWFkZGM3MjJhZTVlMzhlYmQ0MGY0YmM1NTllNWJkMThjNWRjMDYyYzBjNGJkN2MyNmI0ODc3MDg1ODU0NmEyNTE2OTdhZGJhMTc3NWRkNDk3MTcxMDJhYTQxY2I0OGJlNzcxMWQyNWFkYjM4ODYzMTQwNzgzZTVhNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFuc2llbnROb3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MGFiZWMwY2NhZGU3OTNmNjNkODk5YWY2NTgxMzg5YWI2OGE4NzQ0YzM3ZjMzOTc3YzJkYjUxYmQ2NDU3YmJhMGIwM2FmMWY2OTE2YTE3NDk3Njk0ZmJiNTJlMjg5ODg1NTE2MmQ3NGQ4NmU1NThmMDU0MGI5N2Q4ZWVkOTNlMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjhmYmNjYjYxYjgwNzRhMjY0YTNiYzYxZDdlYjE3MzgyYTJjNmUzNTZmN2VkNzk0ZjE1OWU2N2MwMDA4NTU5NGVhYjRkZTRmNzEyOTI1MjY3ZWI0NDJiMDNmZGZlY2Y2NmE1NjFkN2MyYTRlNjRlZjZkNTdmMTFkZTlhZTM0MWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2dvdmVybmFuY2UiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY2xlYW5Qcm9wb3NhbC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvY2xlYW5Qcm9wb3NhbC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFrZUhhbmRsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uc3RhbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25zdGFudHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZTRlY2I5NjE0Y2Q1MjJjNDhlZjExYWI4Y2M3YzJlOWVlZTRlZTkwOWMwYmMyOGY5YmJjNGRjOGZkM2QyMjJkZGFhYzAyNGVmNjBlNjhjZWZiMDViMmExYmJiZmMyNGZhNjgwYWZmNDcxMmNhYTBiMTI0ODUxNjQxNGYyNDE2YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvYXNzZXJ0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2Fzc2VydGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNmM3YzFlM2M1YjFmNmVjZTk0NTgzNTAwMDA4NDhiYTZmOWI5NjhhMzk3M2M5Njg0YzdiOTA2OWFmMDZlNjU0ZGUyOWRiZWJlOGFmMDU2NDBlYmM2OTYwOTJjYjEyM2JhZmMxMmFiODY2YjkyMzI3Mjk2NTk4YmQ4NGNhY2I0MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTcwNzM1OTlmNWU1MzAwNjE3MWY5YTEzZGRmMmFhMmQzZWZmNzg4ZDliNDM4NjU5N2FlNDEwNzdmYmFjNTFlOTE5ZGIyZDVkZmI1ZDU4MWYzMGYyMzQxYjAxZGU5OGYzNWU3YzRjZTdiMWExZWE3MDAyOWY2NDI1Y2MyNTlmNzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZkMzQ4OWQ4NzJmNzVhZDMwMmVlYTdhMjMyYzk3NDVhNzQ5MDI4NzUyODIyNzJmNGM4NmI1ZmE0YzZmNGI2MDQzYWNkYzM3YTczZTU0ODFkMTkzMWQ2NWM3YzRlMDA3ZWQ3YjZkMzM4MzJiZGNhNDlkYjU0MzdkZjk5ZWJiOTQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTlkN2E0OTZlODk2NTNhYjY4MzU0NWNkZjliMGFlMzRlYzFiMTNlYWM2YjdkM2VhYjRkYWU1NmUwOWRhNjNhNTU3Y2M1ZWNhOWRhMWQ1ZWM5NTdkMjlkZWYwYWRmY2I4OGQ0YzczYjNlZDFlYjU5OTU5MThiZmM1NTg0YjBhMzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIxOWEwYTAyN2Y1ZTg1NmM4NzJmYjU3OTJkZDUwYjdjMTJkMzJkMDQ2ZDQzOGM1NzQwMWQ3ZWE4MTczMzkzYjBjOWQwNDk1NjcxZDI3OTJiMGY1YjMyNTgyMDgzNTk3MjNhODg4ZjZiZGFkY2NlMzkzNDU5NDMxNDRkOTEwMDcyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGZlMmIwNDJlZWQyMmY2YzdiYjA3NmViNWM1NTk0Y2IyNDMzMzQ2ZTUyMjEzYmUyOWVjNmRmNTljZTdkNjZlMzk2NDJhYzZiNWVjZDQzZjc2NDUwM2IyZDBjZTU1NWJmZTYzNTRjMDk1YTIzNzE0N2U3MzEzZDMzNmRhNTYxMTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5vci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5vci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVlOTRlZGNjZDIwMGViNzM0YjhlY2ZhMTBlMzVmZjlmZjU4NzgxZjIwNGQwNDhkNjY5ODdjNGY4ZTUzM2E5NTEzNjg4MWMwMDJjNDMxNTM2M2ViMTk1ZDVhYjFhODU0Y2Y0NjZmNjhiMzA3YTg4YmI5OWRmY2ZmODJkMDFmNTM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNTY3NDU2MDRkYTljNDkzNDU0MTZjOGUyZTc5N2JjNDI2N2M0MWY3YzhmNGRmZTg0OTZlZGRhNWZjZTIxNmY4OTg0YmFlNDQyYjI0NjZlNzA3YTg0N2ZjNjlkZmM1ZTZkNmZhMjIxZmUzNDkxYmIxYjRlZmRmZWMyZmQxMzY3NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEhlbHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RIZWxwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYzU5YTJkZWVhODRiNjQ3MTgwNTI5Mzk2MThkMTU0MzZhOTI5NzE0YTExYzg1MmZhMWI3Y2ZlNjJmYmIzYWZiMzVmNzE2MDQ1NTEwNTJjODQxYWJmZjk4NzIwZmQyNzI0ZjdmZjU1ODA3MDVlN2I0Yjg4MDA4NWM1NzYyZGEzNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZWYxNGM2OTg1NTZmYWRlMDg3ZWUwOWY1OGUyNWU2ZDkwOTE2NWJiMTI5NTg0YjI4NDA1YzFiNzllYTkwZDdjYTQ5ZjQzZjAzMDcyZjczOWFkYjI3ZWE5YWE1MGFjNTI5NDA2YjJjOThlZDgzN2I5YWQxMDI4MzI4MjQ0YWU4NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9xdWVzdGlvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcXVlc3Rpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhYmMwYmVhNTkyOTU4Yzk2Mzc3ZDE5NjI1NDY1NTkxODhiZjQ3MzBlNTFkYjAwYzJiYmMzNGZiZmMwZjg2NTI1Yjc5YTdlMTMzYTE3ZjEzNjRjNjNhZTBhMGE0MmJkYmE5YTgwOTYyYjI5NjljYWVkY2FjZWE1MDlkODRiZGNjMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGExZDc0ZTU4MjllNDg4ZjJhYmJmMDkxMDI4N2NmMWMyZjdiOWE0MTQ0NzE0MTMyMzlhZTc4MDc2OWRlMTM4Nzg4MjE1NTYwMzEyOWRhYTgxNTAyNTViMDk3Y2QwNTUzY2VjMWU3ZWQyNDZlN2VhZTZiNjZlMDRjYTlhN2NiNzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmFsaWRhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmFsaWRhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk5ZjJiY2M4MmYzNzY5OGNiZmZiZDQ2ZjRmZWJkNDg4NDU5MjBlNzNhMjE1NTUzZTNiMjQzOTg0ODVkNzQxNTc4YWQxNWZhMmJjMTVhMDk3NGEyNmU0MDRiYzAzY2RhNTU5NDAwNGY5NWFjY2I1NTQzYThjYmUzOWEzY2IwZmE0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2dvdmVybmFuY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3R5cGVHdWFyZHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbGxlY3RGZWVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb2xsZWN0RmVlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFmYzBmYmQxMDY4ZDU0YzhkYzQ2OThjNzkzNTk1ZWVjODY0NmI4M2ZkYjhhMWJmZjBkODE2MDU2ZmRiZTc1MjRkNjM4ODkzZmU2YjE2ZGNkNTQzMjc2MmVmODE1ODQzNWQ1NWExODA1ZjZhZjdiODk4OTk2NGNjZWY0MDcyODY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQwNjFhZDc5OGQwZTE4NzYwYzc1MWQ4NmNiZjA2ODU5YzM4YzA1Mzk5MmE3YmE3Zjc1ZmVhZWQxZWVmYWVjYjBjMWRmYTM0MjIzYTIyYmFmNjBhNDgzODQ2ZTYxNDMzODAyODA5MTg0NzNkMDhmMmIzYjVjN2YxMDZhZWY5NTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHNtL3BzbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHNtL3BzbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE3MDNlNzVlNzRlYjM1MWQxOTMxYjcwOTA1NDRiZTAyOGYyZjhlYTBkNDY2NWZlOTFmNTFjYTYyODgwZGYxM2M2YWE5ZmUyZDY2ZWY5Y2EzZGFiMWM4MjJjYWRmYjU1NjBhNzA1YzUwYzg0ZWY1ODU2NmMyMDU0N2FjYTNlZGVlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlcm5hbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWV0YS1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjQuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdHJlYW0iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RyZWFtLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NhbGxiYWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jYWxsYmFjay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI4MzI1YmI5Mzg3ZWRiNDY4ZDVhMjliYzBhNDQyNGJiNThjNTkyMTEzMjlmMWQ4YjU3NGFhNTVmZTUwYjQyZWNkZmNmOWU4OTA0ZDFjMzhlYjIyYzVlMzg0NDZlYWRmNTE4N2E5OGQ2MDRjMDVjMmZmYTk0YWU5Y2QyMTcxY2E5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbmZpZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29uZmlnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDNhY2E1NTU3NDQ1YmM5ZjAwMDEwNWQxZDQ1NThjNGJjMjNkYTA2NmYzZDRmYTI4ZDVkNTE0YzlmYzE5ZjgyNmU3ZWM0YzYxYjhlYjhhMmQwNDc5ZDk1ZDZmYmM3ODhiMjlhZDI0MGY4MzY4YzU1Nzc4ZDRhZGRiYzY1NGY4ZDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVidWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlYnVnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWU0ZDdhNDEyZGE4YWRkNjcwZTdjNTUyMTM4NTlhMjY4ZWQ2MWZjMTNmZjVmMWU4MGZkOTFmZjhkNzJlYzBmZTMwMDMwNTRmN2JlNzM1Y2YyMWRhOGJkMjRmYjZlYzAyNWI4NWZhOTU5ZDU3NDllM2RmMmRkZGMwYTc0ZmQ1YmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lcnJvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYzZhZWE1YjM1MzA0NWRlNmQ3Zjk0NTE4NWYxYTQyODEyYTQ5M2FhOTFmOTNhZGZlMTNkOTBlZDJkY2U4YmZhZGJlYjc2NGRlZDExMTY3MWU0MTdkMDQ1ZjcwZTI1YWNmZjExYTBmMDFiYjk2OTQyMzU0YmVjMmE3OGI4Njc1MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YjE1OGMwYzlhZTVlZjhmYTc1ZjhkMDY5YWY1NGY0OWRkNWM4N2Q4N2Q3YjEyZmU0MGEwYTJiNTg4NTQwNTg0MWIxZGNmYzE1ZTI0NzM0Y2U1NGFhZGM1Y2MxNGE2MzQ0NzY5YTFiZDZmMjViMzhjMjhkOWRhNDVhZTE2NDQ5NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qcy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvanMtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZGM5OGEyZWRlM2YxMjIyMTMxNDdlMjFhMzA4NWM5MTA1ZTcyZmI4Mjg3OWNkYjk5MGUyYTEwNTFmN2Y3OGUyYmRmMjJkNTJmMjFhYzRkZWMyNjM1Y2QwYTI1YzFhNzlmYThkZDg3ZmVkNmNiMjVjOGY0ZGNlMDljZDUzMDhkMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWQzOTU4ZWNlMmFjZDkxNzdmM2RjZWMwMTM3ZGE5MTllNTZhNjM3ZjNjMDBmZDQ0YThhMWFhYzRiMmNmMDJlOTY2OWQ0ZDkzOGYyMDYwMDljMTJmZGVmNzFiYTMwMmQ1NWJiMGI1ZDAzZjYzZjRiNWU2ODRmMzJhNDkxMGM5OGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJhODExMmQyZWI4YWQ1N2Y2NjY0ZGNhOTdiMDQ2YWE3Y2Y1ODY5NmQ3MDgyZTg0NjllOGM4NjUyOTAxZGI0OGFkNDBhZThhZjlmY2ViMjJlOWUxZjVkM2FjZDAzODM5ZWNlNWNkMWIwOTg4MTQ0MWI0ODIzNjE2ZDZkZWFiNDMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ldGhvZC10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWV0aG9kLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzU0ZTFiN2Y3OWNlZTNiZDU0YzkwMGE0OGE3NTBjZmZiMTQzZGZlMzdmZTRiNjAwMmRmYTEwYjM0NzY5ZDkwYjc0Njk4MmFhODMzOThiZDYyMmIwMjEwNzczZDg3NmQ0NTQwYWE4NjE1MjMwYTcyZGFiZmFlM2U1ZmMzZGVkYTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2VzLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zZXMtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MDlmOGE5YjA0Y2E3OTUzMzY1ZjIxZWM0MDRmOGE5NzhlMTIwOGUyMTUxMDJmZmY5YmIxMzNmZTk2N2IyMmJlNmUwZDAwNTQwZGExYWU2MmY5YTRmMzg3NGZhYjZmMDBjODAwMWE0NTc3NjY0MWI4MTQxMjI1ZmFiMmY0MjcwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90ZXN0aW5nLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2JjMTI3YjY2MWViY2RkNjMzNjY5ZjdlMDVhMDIyODQwMzY1MjljN2ZiZDFiZDQ3ZTA2ZjZjMjliODE5MmUyN2NkZjI2OTA3NmU3OThjODZlYzJjZTE5NGEyZTBlZmZkOTE3OWVjNGRmZThlYzk3OWIzN2I2NmM4ZTY0ZTI3NGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUNoZWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlQ2hlY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNmM1MmJjYmYwOTlhZGJmZWVkZTFiMzM0NjQxZGUwMDI3ZWU2ZmVkYWVkOGNlYjdjYzBhNGUzMzU0ODE4YmY2NTU5ZDJmOGUxNTkxZmRkODJkMGM3ZGNjNWFlZGYyYWY4NGViZGE2MDZmZDI0M2JlYWRmODEyODZmMmVkNGEwNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDU2OWI0ZDE0Y2E2NzkxMTMxMDQyMGE2ZDNlODY0OGI1MDEwYzA0N2ExODU4NGRiMTBiYTVhZGViM2Q1Y2JmOTI5NmZlNTg1Y2U0NDY4ZWQxZTdkZGY4ODMzNThiMjA3MTZmZWEzMTNlYmFjZjdkMjdjYWE2MTVmZDM0NmY4OTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3VwZ3JhZGUtYXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWE5MDQ0NGJmYTkwNjA2ZDZiMGFjNWRkMmRiZDE2YjM1MDJiMWM2MWNkZjBmZGI4MzJhMWNkZjU0ZGVjNDg0ZGMwN2EzOGJmZWVmYWM1Y2UwYTEwODBmODhiYjExOWYzZjIzYzU0ZWNiY2Q2NmJmYTk5MzJlMTA4NzhhMzU0NWIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL25vdGlmaWVyIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdGVzdGluZy11dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2ZjIxYzdjNjhhOGRiNjIxZDkxOThkNTM0Zjk3NmFjYmVlNjYxNWNlNWEwZThmNjAyNmRkOWNhYmZiZTUzYTJiOTY4ZWVkYjMxMTVmMDMwODMyMWI2NDE3MzZkMDRlMjkwNDZlODNhN2IzZTc1MGI3Y2EwZjRkMTgzYzg2YTAyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyN2RlZGE0MWY0ZWZmZDQxZDJjOWNlYmI3ZWY5MTQ3MTZlODAzOTI1MGEzZmM2NGUzMmFmZGE2NWZjZDJlYjE1M2JjMmVmODc0NjVmODkwZDMxYTlmOTQwYzBkNDAwN2RkODg1Njg2ZDVmYzI1YmMwY2NlNzFkMWUyZjcwZWQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM2YmJjYWFjNmVhOGNjODliZjA2ZWExMmYyYzkyZGI0Mjk3MDJiYWViYmVkODc4NTFjNGVmMmRiYTUzNzAyZTY1ZTM3MDA5MTU5NmE4MTFlNTRhNmIxYWQ3OTI0MmRjNTY5MjhlNDEzMGNmYjQyOTA2YzZjODNkMTNjMWExYzAzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFhNWJjZTJiNDE0ZjE2ZTg3NWI5YjUwMzgyNGQ3MjliYmM0YjY4ZWQ5M2U1ZjAzNzQyMmVlYmZmMjI3NDE1ZDBiZmY5ODFhMzA0YmRhMWQ5MzkxN2VlOWY3NDZiNmY2MDEzNmE4MTI2YmZkYzZmMTgwMDUyYjBjY2JlYjBhZGYxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC1ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLW5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzliMTNkZWQ3NjY3N2YyMTIzYmYxZDlhMmNlNmNhZTI0Zjg5ZGE3YTQ5NjJmMDFlOTA2ODFkMmFkZTU1YjY3NzJlZmZlNTU4YmQ5OTIwN2E5MmU0OWY0ZWJmMzAwYjgyNzQxNzc5Yjk5MDE0MTM5NTQxNDlkYmIwZGFiZTRiMWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjRmNDkzZmIxNjU2Njc3Zjk3YTk0OTY4ZDY1YjdkMzhmYWExMWJiYzQyN2Q1MzQ0YzgyOWNjMDUwM2E5NTBiYWI5NmJhNzFjYmRkMDZiNjE3OTZkYTk3NzYzMWUxZDFkZWFlYThlMGFhZDAxMzBjOTE4ODBjNDA3MWJiOTE0NzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MGQ4NzM5YjlmMjBkNTBkNzkxZjNiZDRiZGE3YWYzNWI1ZDE3YmM3MjFjODVhNjg3ZmMyYjAyNTIwMTRmZDAyMTkyMzI0MzNmYTRhODNlYWM3MTllMzI2MzJiMzkyNDI4ZDkzNmE2MDU0OWVmNjFiNjg0YjFmYzQ1NTFjODg1YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjg4ZDE5MDdjNmY5MzAwOWRkZTdlYTdkMTk5M2Y4ODEzMDIxODBlMGEwODgxMzU2NGI1NTUwNDA0MzA1MzYwMDY3MWI0ODVhZmZmYTJkNzE5MzNlMTY0ZWU3ZWM1OGNiMzUwOTRmNTYwNzE3MjVlNmM3NzkzZTYwODk0MWFiNTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdG9waWMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RvcGljLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDE4NzJiMDU2YjNiMWY5YmE5YjFjZTljMGY5NzU2YTQ4ZWNkNThlNTczNDlhODAwZjJmMDgzZTcyMGY4ODExMGFjZDhkZWIyODY0N2ViZjhkMTI3MDYyNjhhN2M3OTc1OGVmOWYxYzgyNDhhNjA5MWMxMWRjM2Q4YmRjMzhlMTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidG9vbHMvdGVzdFN1cHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTBkMDcxODA3NjZkZmRjZDYyMjgxNDZlYTQyNGY3Y2RmNWNhMjFlOWU5YTFjNmY3M2FlNmU2MTM4NTU3NzRkMmY2N2Q3ZWQ3MGMxY2E4ZDFlNDZlN2U5ZDAxMGNmNGY4OTNjZDU4Y2Y2NzhkNjQ2ZWZjNDAxMzA4MzI0OGY0NGQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3RvcmUtdjAuOS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N0b3JlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYxLjUuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYTcxOTU2YmYyZmM0YmExMjViMjBjYjIwMmY3MDM4NzhlYjY5MzhmMDU2NWE5OTlmZWRhMjI2Y2E5ZTA3Yjc5NWFkMWJkY2U2YTg2NzZlNzdmMzBjZTFhMGU2NGZjYTA5MTBkMmI4ODRiMzJhOTM1OGE4NmJlMTVjMDJjYmNkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzlmNWE3YjgyNGM2OTlmOTRlNDhjYzEwNmRhYzFlMDE1OTBjYmNlZGYyOTY5ZDE4YTBkNDkyNjJhZmFiNWM4ZTRiZTkwZTgwNDc4MjA1YzliOGY5NDUxNTY1OTVmMjhlYmRjYWYyYTQ3ZmEzNTQ1M2ZiMDc2NzRhM2Y5MjE0NjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjYzMzBlZTZkZjkxMDJjMmI4OWVlNzBkYTFjYzliYzk4MDFiNzlmMmE3ZmNjZTU2YmYwNTUzZDZiMDMyNjExNmM2MzRlNmRkMWIxMTA0YzJiNWFlYTUwYzE4NzgwZTA0MWQxNTQ0MjA0YzdhNzg5YzExM2UwMTNhNzllZTFlMzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MjYxNjc3NjAzYjFmOTU3Y2U3NmI4ZTA4YTZhYTI4ZmMzM2YyZjQyMDNkNDJiNTczMTE4OGRjYThjMzk0YTNhMjk3ZjlmYjRlM2I3Njk5YTE5MWZiNmQwOTY0MTczNGMxMGFiZTk4YWFkNDk5ZGM1NGI4MjYzNzQ2YzI0ZmVlMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE3ZWI0ZWFjNzRiOGE2ZjNiMDY5MzE3YzQyYTFkY2ZiNzdjOWViYmJkM2NjMGE1MTMxMzU4MWEzMTIzNTViODFmYjhmNTE0NzdhNTc0MmQwYTk5YWU2OGNhYmE3YWEwOGNmNWZmZDE1YTM3YzNlZTg3OWVmMTU2NGE1NmJlZWJhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ZmViNDgxN2IzMTZjZDBjZTQ1OWQ1Y2MxMzZiNThiY2I5YmNjMmU3MzViZWFlYjU1NDUwYzE3NDY2YzAwNGUwYjA2ZjA0Njk1ODRiYmQxODI5NzM3YmE2NTlkNzJhNmZmMzYyNDZjMWFiOGNiMTRmY2YzYThmZTgwMzNkZGI0NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWJjZTIwNjU3ZWY3MjljNmJmNTE3ZmY4MzNmYWFmYTk2NzAxYTE5MWRhYjYzYzMyOTI5MzU4YWNhMTg5YmJjZGZlNzg0NzQyOGM2Mzg1NjVjYTNiYTcxMjNlMDExOWI5MmFhY2Y5NTZhNjJhNGUyZDIwNTBkMGUyMWY2MzNkZjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MmFlOTZmMzhjYTY2YWE3ZTdmOTAyNGI1ZjljMTM0YTFlYjRmZTNiZmEzZmM4ZWIxZmFhZDM3NmVmMWQzMzJhZDVlMjZkZjM5YmE0YmIxZWUyNTI5MTRlYjliNzJhNzdmOTFlZWI2MWYxMzBmYWNjOTUzNjhlN2FkMzA5MWY5NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy90aW1lLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy90aW1lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMC4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjQuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAwYmM0YjIxYTI4YzNhNWI3NmY0N2ZhZGE0ZWMxNzYxZTExNTljNDFlMWZlYmJmMDk1ZWFlZDYxMThlMTczNmU1OTQ2MDNjMThlZjAyNGFjNTZmNmE1YWIzZjNjZjA4NmM1ZjViNTQ0ZWRlMTAwMzAxZmIzNTgyOWM1MWFiMjdmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RpbWVNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90aW1lTWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBhNzU4YTk0OTAzNDA4ZTZiNmJkNWVmM2JhYTFlZGM1MTM0NmI0OGI0YjNhYmY2Mzk3YTY1NTgxODU3ZGVjYzc2NWFjNDM0YjQxYmVlZDI2YTJhMGZhYTRmMWExZWJlZThjNWZiYWE4MTA1YmQ4ZTZkYjE3ODA1Y2VlMjkxMTdmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzOGVkZjMwZDMxMThjNzUyYzNjNzQ3YzRmM2I0NDE0YmI4ZWU2MGNmNTBhZTRmOWVhMmYxYTQ4Y2UzM2Y0NDhmMTY2MWM4MDdhYjA2Zjk1ZjdiNDA3ODVhNjYwNWU3YjZkNzBiOGZmZmI3OWNkZTNmYzliZjFkM2U0YzIwMDlkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0LWRhdGEiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVkZWI4N2NiOWU5YjRlN2ZmMDFhNzAzYjIwYmMyOGQwNmQxMzAyNTA1ODFiYjI2ZWIwZGE0MmEyNDcxY2Y1YjIwNDhkMDczYjZjOWY3MWVmNTE4NmRlNjcxMDU4NjVjZjJjZGY3MjBiM2M4Mzk2NDdmMThjOGMxNzY4Njk2ZTI3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3MmZlM2E2ODM4ODNlODVjYzRkZDNiODZhOGI1ZmMxZjJiYTFmNjc3ZWI4MDMzMTk5MGZkNTQ1MDU2ZjhmMWEzMWJkNGU2OTM1OGViYTEzY2U5MGQxYTJjNWNjMWMzMmZmOTU5MGQyOTBmNGNkODc0NTk4ZTg3ZDAyNzk3MzkyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMyMGQ3YmEwODZiMjY3N2JlYmUzYTJmMDhlNWI4MTljNjU3MTlhYzU4ZDhkMjhhZGY0MDg0ZTlkZDY2ZmJiZjEwNzUyYWUxOTNlODM2Y2EyNWYzNDA3ZWUyZDgxYzk5NjU1MmY4ZGFlYTQ3NjY4MDBlYzQyMmUxYmM5Y2IyNGRmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9iYXNlLXpvbmUvem9uZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vem9uZS1oZWxwZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NsZWFuUHJvcG9zYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NsZWFuUHJvcG9zYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNmViNGFhZDNjNjliNzlhNTM4OWI1NGJlOTY4ZGI3NTljYWEwNGZiNDMzNzU5NjlmOGY4MGUwODg0NTQ0N2ZhMzU3M2M4NTQ0NGMwZWMwZjAwNDI5NDZkNjNlY2JlMmI0YzllNzRhYmM3NWI0ZjlhYzNmYjkwNTYyNWQzMzNjNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWNkZDdlNzcyYjQ4YTM0MjgwMDkzNmU3NDhlZDQ4ZjdiYWVmNGU5Nzc1YmFiODRjMmQ2YmE3MTk3MDYxNTJlNGNmZDYxZDc4ZWI3ZmIwYTFkOWM1NDdiODM3MjY2ZTU3MDE0NmNiOTIzOWMzOTFmYWU4NDZhNzQ5NWQxMjIyYWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZDQxMjRkMjFhYmExMWJhOTBkNjM1OWM1NDQ2YmU2Njk0OTQ3OGZiNTgzMjJhNzYyZmJiMTJlMWU2M2Q3MTIyNjUwYTc5ZmI1YjU3NTYxZTQyZWYzYTdiOTAzMzRkZTlmZDVkMGY1OGM1OTUyYmVkZDM5OTMwYWQ2ZWNmOTNkMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZjQzOTMzMzNiMGU2NzEyMmM0YjVmNGQ3YWNhOGE5YzY3OGJhODIxZWZjZmE4OWI3YTRhNGY4MmExNGIzNzJjMjJhYTk3YjU0ODQzZTNjMTJhMWU4ZWFkMWYxNGUwNzRhZDYyYzAwYjYyMjc0NTczZmIwMzUxZWVlMTA4NjY2OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmODkzOWVjNWNjZTM5YzYyMzRkODg0NTQwYTE5NTNmNTUwMDkyZWI1MGFjZWU4MjQwNjIxOGMzYzQ2MjZiMDk0ZTQ0ZjU3YTQyYmFmMjQ0Y2IwNmEyMTdhNDEwZDA0NTM4MzJiZTFkNDFhMDkwZGY5YjhiOGUzNGZmM2Q4ZTIzNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM2YjQ2MDRkYTAyNzlhNWRmMjgwNjVhNTQyYzY0MTk1OWJjYjA0MjJkZTkzYmQ4MTRlOWZiN2NjZjdjOTUzYzcxNjJlOWI5NzNjZDI0Y2M5ODhhZDJjODA0NTAyYmZlZmNlMDExMWJkMzA4MzFjYjIwYmRlMjY0MGY1NWU3NjI2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmVwYXJlLW93bmFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9wcmVwYXJlLW93bmFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYmZjNTM4ODRiM2Y5MjFmZjFkMDJhZWQzMTNhMjMzZTgzZjhmM2JlNGUyMGI5MDY1MDFjMWFjOTYzZGY4YzNiMzk1OWI0YWVjMmE2NTQ5ZjhiNWFkZGYyM2RmZmY2ZjZhNDA2M2Y5MjI3Y2NjNTBlNTljNWRlOGFjMzk0Yjc4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJmMTdjMzdhZjk3ODc3YTI2MTIxOGRjODA1ZTZkYmJkYTgxNDlkODQ0NTg0YWY0ZTExZmViMDE4OTY4MjdiNGNmMzczMDRhNmRiYWZlOGRhNzAzZmYwNzkwOTRhNjY5ODlhNTNmYTIxZWJlN2Q1NzM1NDJkM2JlY2Q0NTU4NTIyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQyMDUyYTdmNGVmODAwYmU1Y2M0MDJlMjc3OGY4NDJkMDNkODIxNWRhN2Y5YjU3YTQxODdmZDY3ZGNjYmFkYzE1ZDQ3YTcxMjRiY2Y5NjZmNDQ5NTVjOTI0ODNkMTFhM2Q4ODkwZThjYjJjYzViZGUzMjA0MmVjMmE4OGRkOWFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTY4ZWEzZjRiYzJiMTFjOTAyNmU4YWVmZDQzMmEwMDgxMzFiMWMzMmIzNTYxMjM3ODYwOTNkYzhjYzExNDNkNmY5ZDJmNTBmOTQ4YWNlMTY2MWIyYWUzMmZmMDFlZDgzYWJkNzY4MTFiMmVjZmU4NGZjMGY0MWQ4ZjYwZWFmN2MiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYmE3ODI3MWQ1MDVlY2Y2OThmY2E1ZmI4NWIyMTk4NWFjNDg1ZGM0ODcyNzI4ZTM0ZDBmNDA0MTlhMzUwNmM0MWU4Y2Q0YWFmMDNiZDRhZWY1ZGNmNzc4NTgzYmI2M2E1NGNhMjBhNmI0MDc2YjUxNDgzN2Q4ODkyOGZmYjY0MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvc2FmZU1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9zYWZlTWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFmOGQzYjZiZmRjOTM4ZmRjNzljY2NlYTkyZjc2OTE3OGM3MWRlNGMzYjVlNjgyMDI1NzM2MTQwYTUyZWJmZDNjMWIxZGJhY2M0NzMxMTk3N2NmYjdmNWFjYmEzM2FkMGZmYzZmYzk4OGY0ZTgxODYwZmIyMmIyNThhZWM4MzYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MWRkMmM0OTJiNDFjNjk2YzE0NjNjOWZkZGYxNzBiYWViYjE5MDM5MTg1YTU1OTk3YzZlMDgzN2YyYmNmMDdkZjI3MmY0OGRmM2NmZGZmZTQxMTJmODU1NjM3Nzk5NzVmZTZiZmRhMjdhMjM3NmI4MjNiOTMyNmIyOTA3Mzc1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NWZhOWE2ZTQ5NDEyNWE4MDQ3OWM3NjAzZjZjYWNhNzQ4Njg1M2ZlZjdhODZmNzZjOGFlY2QyMjRhZGMwM2EyMDliNjM2Y2U5ZTIzNmVhNDJmNTI3OTIyMjU1YzhiMDc5N2EyOGUyMWIzMzIxMTMxZDRmMzA5ZDBhMGRlMjg4NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjg1YjY4ODMyMmMwZDg0NzkzZTI5ZGQ1YmYwMzNhNDE0ZTBiN2MxN2I1YTc2YmQwNzNmMzU5OTlhYzFiNGMxMDNjNDU2ZTBhOGVlMjNmMmE5ZTFiMTkwY2U5NTI3OWJiYjE3Mzk1Nzg3Y2M2YTJiZjExNWUxM2MxOWE0MTdiZTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmI3MTBkMTJmOWFmODk4MjYxMDBlODA3MDJjMjI2ZDM3ZDk2NDcxZTlhODk5NmZlYmE1MjM4MDllODYxNTAzMGI3ZDczMDE0MTlmYmQ1Mzk5ZjlhZWU2ZWNhOTM2NDAwYTBiYTc1MjY5ZmZhOTNiMzQ0OWZlM2JlMWE0NDE4ZWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZUhhbmRsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZUhhbmRsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY0NDY2ZGJmYTZmZjRmNDg0ZTQ5NTY0NTI4YzE3MzVlY2Q5YWY1MmYyNmU5N2Q5ODJmZTM4Mjk4ZDUyNjBjOTIxN2YxNzgxYTRlM2VmZGY3MDQ2ODFjMzE3ZjkyYjAyMDc2YTYzN2RkZjQyOWZlMzllYWVkM2I5OWE3ZmQzMDRiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNTVhYjVkMTA5OTAyOTE0YjY1ZDZjYTI5OGI2MjY4ODczOWRjNGZkZDI3NmI5NDU0NWI1YTEwZGY0YTdhMzZlMzI3NGIwYzhhZjUwNGM0MzI0MTgxMGQ5ZTMxNTMwZmVlMmU1YzBjNjJlODA1NTA1MzRjNDdlNjIwMTQ5YjExZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy96b25lLXYwLjIuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy96b25lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJkdXJhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjIwOGRlZjhkZjFjYmUxNDE4NjY5ZGVkZjgwYmRmNTk1MzU4ZjUzNjZkMTE4OGFjMDRmZTRhMmNiOWM1M2NhODg0ZDg1MjE1YzkwZjFiODdmOTQ5YmIwNDhhNzk2ZWU1YjZmZGExM2Q1MWEyNTllMjU3NDQ2NDgxOWQ2MjJjZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZHVyYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAyM2JlNTIyZjQ5MzM5NjZkYTQxYTFjNjk5NTE3MTMzNjM3Y2E4ODQ0ODJmNWExOTYyZjRiZjA2ZmRkNjlmZTQzNWNjZDdiN2YwYzkzMWYwYzJmMDRlYWI2ZjFhNGQ2MDkwMDNmM2ZmNDRiOTMzZjhjNDUyYTYzMjc1NjJiZjMyIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi45IjogewogICAgICAibmFtZSI6ICJAZW5kby9jb21tb24iLAogICAgICAibGFiZWwiOiAiQGVuZG8vY29tbW9uLXYxLjIuOSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jb21tb24tdjEuMi45IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXBwbHktbGFiZWxpbmctZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNGVlODI0N2RmODY0YmI0ZGRlNzE1Y2JiZWRiMTE2YWU4MGQ5NGIwZWRlZTc5NGVlYjg2NWU0YTVkMjVkODA0NGRiNWZlMWNmYjk3YWM0MGQ5YmE5OTNlYTJmM2RlYjViNjg4MTNkNTQxMGRmNmQwN2IxMjYyMWZmODQzZTNlZiIKICAgICAgICB9LAogICAgICAgICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZnJvbS11bmlxdWUtZW50cmllcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRjZTg4NWJlMmQ5NDM0ZGIwNjY2ZTYxNDVkZGJiNmI1NjljMzg2ODExMjY3OTUzZTUwYzcyNDA2YTE0YzljNGM2YmFkZjdlODQzNTg5ODI3MzZiNDk4NzJmYmU1YzdiOTBhNjM2OTk0OTViNzM0ZjE1ODM0MjA2NjVmNThlNTFjIgogICAgICAgIH0sCiAgICAgICAgIi4vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpZGVudC1jaGVja2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWFlZTNmZDQzM2I1MWI5YjRlNzA0MzMwN2RkNDRmNTVjZTNjZGQ0NTg0OWVkNDQ2ZWRjNjBkZjM2NzNjYmE2ZjQwMGNmYjZmNzQ1Y2JjMjQ5N2Q3Y2M2OGFiNWUxNGMwZDQwNGM2NTg0NWE4OWFhYWVlNmExNTNlODc3Mjc5OTAiCiAgICAgICAgfSwKICAgICAgICAiLi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibGlzdC1kaWZmZXJlbmNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGRiMTJlZjg1OGMwMjc1ZTNhNGQ4OTc2ZGZiNzg0MjY1YWVhNzE0N2E0Y2E2MTgzYTUwYTFhOGQ0NzNmMGFjZGMzZDE4OWY3ODMzZmZiYzYzMmYxZmI2OGYyY2JmMDMxMzcxNGI0NTYxOTc0MDk2NGIwYzYyOGI3MTY0NzE5MWQiCiAgICAgICAgfSwKICAgICAgICAiLi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm1ha2UtYXJyYXktaXRlcmF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNjc4ZTFlNmMzNzgxMzAzODE4YTYyNDNhZjE0MWUyNmUxNTg2NDNmMTA2MWFiOWI4M2E2MDNjYzNkY2Y1OTBjOTU0NWVkOTg3NDNjOTlmZTBiZTUzODU4MTU4OWI1Y2ZlZTkyYTgyNGY4MTM4NjBhZjI5MTZiZjY2MWVjZjNjZCIKICAgICAgICB9LAogICAgICAgICIuL21ha2UtaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibWFrZS1pdGVyYXRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5ODUwOWMzNDZjZDVhY2UzMmFkMDgwMzc0OTU0OWRhZThmYmE2Y2ExMzYyN2RhZGMzMGNjZmY2NDUzZGQzMTI2MmM2ODNlNTZlY2RiYTM3NWMwM2FkY2Y5YzVkZTcyY2E4ZGU0YTA3YzYzMzY2OTkwZmE0NjlmZjhlZDlkMjZkIgogICAgICAgIH0sCiAgICAgICAgIi4vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDllZjc4NmZlODliMGViYWM2NzEzMDJhN2JhMGQ1ZTBmMjcyYTMzYjM4ZDliYTFlZjdkNzVlM2ZiMTk0YjgyNjQzZWU0Yjk0YjA2Y2Q5MDZhYmUwNmNjOTQ2N2ZkNWE3MzJhMTFjNjA5MDdhMzExYzczOTVhZDcxNGFlNmMxMjUiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWV0YS1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAib2JqZWN0LW1ldGEtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2VkYzkxYjFhZjY4MGQwZWMwMzYxZTBhYThlM2RmYjk3MmViZTFkZmIzMTFiOGU1ZWNlYjU0ZmU0MWI0ZjQ2Y2Q5Njc2MmY1NTNkZDIwMjAyOTRjMzJlZmMxOTRjODdmMjczY2VlNTlhMGIxZTFmMzgyOTlhYzMwMGJkNzg2NDgiCiAgICAgICAgfSwKICAgICAgICAiLi90aHJvdy1sYWJlbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInRocm93LWxhYmVsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5M2M3ZTExYjA5MTExODVlMWZiYzMxNGUyZDRkZjBkZTc0NjZlYTJiNjM4NTM1NjFjNTJiYjIyNDY3NjU4YzU0MDIwZDNlYzFiOWE3MjFiZDNhNGZhOTRkY2I4NmRkMGFmZDUwZDBhZDJkOTA4MDFjN2E4MDY4ZGI5YzJiYTQ3NyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IjogewogICAgICAibmFtZSI6ICJAZW5kby9lbnYtb3B0aW9ucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjYTc2ZWQ3YzZiNjU2NzFmNzBiMjY0NmY2ODk0MzU3MjRkOGI5OTMwYTVmZjI5ZDFmYjMyN2VkOTZmZDQxNDQ2OTUyNTg5NjJkYWZiOTgyODYyYTJlZmMxYjAzZDBhZDk2YjMzYzJjYWU1YmViZmEzNzI2ODg2YTA2ZjY2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMWMyOGQ2YmY3YzhkNmVjMWM1ZjA3YjM0YjUyZjVlMTYzYjY4YTViOGE4YzVhMGI2NWY1YTdkZmY1NzZlNzNhNmFkMWFmMzgwZWIxMTYzMGI0ZDRiZjY4ZGI1MTc1NWVmMTE2ZDc5ZTE1ZGFhZTc2NWIxNDA3YjMxNDc3Y2M2NCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXJyb3JzIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXJyb3JzLXYxLjIuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FhNzRiN2UyNjlmODI2ZTBlMzc1MGQyNmIyYzMxODVmMzc4NzY3YWE0NTUzNTYwOWM4YzNhNDRjOWM1NzQ2YWNiZTA2ODcwMDEyY2ZmZGQ1OWExZGYzNDBjMjFlNzBhYmI2ZDExOTU3Y2FhZTFiMGJkZDljYjMwYzA4M2RkZmUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRkZTQ2MTFjZmEyZmNmM2FkZjE1Mzg1MmRjM2QyM2FiOTM0ZmNmZmUzOTFhNzljNDZhYThmZWFmNDg5Y2YwZTllNzc2YTIxZThhYjRiMGUzOGQ3NjU3MDkwNDRhYTY1MDdkNmQ2YzA3ODYzMGJiMTU1NTIxNGQ3ZWQzM2E4ODI3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sb2NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbG9jYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMDgxNjE4NDcxODdlY2QyY2ZkMGM4YmRiYzMyZWZiNGVlZTFlYmQ0NjRhYzg2ODI1MWM3YjAzM2MxMWJiMzQyMGVjMzdkNjcyYzUzMDBjMjRlNDQ3NzA5NGY3ZTQxMGMxMDY4MWRiMGEwNTY5ODY2ZjI5ODU5ODU4M2Y0ZDBhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzhmY2Q1ZDVlNTllNzE5NzVhNjM5YzU2NTA0M2IxNWYxOGY2ZTc2MDUzOWYyOTJjMjA1OGFkNzRhYWVjYmJkNzNjZDIyOTYyZmNjNGEyYzcxOTA2MDFhZWQ0ZjI4NzU1MzQwMjBmYWNmYjViZmI1YTkyNDk3YjkwZjYwODUxZmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjOTE2MzE0NDU3ZmQ1M2Y5ZGNmMjY4M2Q0ZjVjOTFkNGY4MjA1N2VkMTQwNzk2M2VmMTJiYWQ5MTlkOGVjOTFhOTMzMjU1MWY1MmVkOTFjMjhkODdlZmZhYzdhNDk5NGE5Y2E2OWY1ZmYyNmNhOWIxMWNiYWQ3YzRmZDdhOTA0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZjNzVlMmVkYmE4NTQ1MGM2YmNjYjM1MTI0NmY4ZmZkZDlkMjcwMzliMDA1NjQ1MzBiMTU3YTY2YzM5NmUyMDJjMWIyN2UzZjRjOTY1MjIzMmZkMDJjMDU4YTUzNDU2NWI2YTUyYzBkMGJhY2YyMDZlYTFlZjNiZmE5YjNmOWZlIgogICAgICAgIH0sCiAgICAgICAgIi4vdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NjA3MTIzOGIyNWQzMDc2NmY0NDczYjM2MDc1ZGIwNTAwNGEzMDk1YjdiYTZhZGQwNDRkOTg2NjVjN2UwYzNjMzA5ZDA0ZDQzNThhYWQ4YjA1ZGQ4ZmNmMDBmN2RmMjk2MTU1YzVmODI5YjJmOGJmMzhkZGJlZmIxMGQ1ODM0OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXhvLXYxLjUuOCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXhvIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V4by12MS41LjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXhvLXYxLjUuOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpc3QtZGlmZmVyZW5jZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjQuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM5NDE0NzNjMzA1YmU1N2U3NzgzMWI4NDZiNWRkNzJmMDViMDNlOTc3MDY5ODQxNzRhY2QxZjNhMTNmZjhjY2E0NmMyZDUxMDBmMzVmY2E3ZDhmMDcxNGE1ZGJkOTNkZDA5YjdlNmRiNmRiNGM2MDg5Mzk5YzI0NGVjNDZjY2I3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by1tYWtlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by1tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2Y2IzMmNmNGY5NDUzMDA2NjU2MTliODA1YmU1MjVmZmEwM2QwZmRlNDFmZWQwOWVkYWRkMDQ4NDIwODk0ZTc4ODkwYmE4ZWZjMmYxOTg2N2ZjMTg5YzA4NGUwMGQ4ZTk0YWRkMGRhMTNlOTdjNjExZjY2MjI2ZGU4ODFjZGZmNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJjNzgwMzEwYmYyNWY2NTI1YzIzNThlNjc2NDIyY2RlMWY4NWM3MDI2YzU2MWM0ODQ3MDc3NGZlOGNlMGFmNjM2OTQwOTY0Y2FhMzIzZTJjMjFhYjY1ZWNmY2I5OWQ0OWY4NGY5ZGI4NGJjM2NjNDQ1ZDNiZjA3ZDVhZmJmZmEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2dldC1pbnRlcmZhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2dldC1pbnRlcmZhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTU3Y2JjOTAyNWM4NmFiZTEwMDRiYzViYWQ3YWQ3NWQzNmQ3ZjA2NmQ2NTU1NTk0NjBkNGJmZGUwN2ZhODY0ODA1NWM2ZGNlZTYyNTkyMmUyNjk2NjhhZDE1NGY3ZWVjNzkwMDg4MGViMDQ2YzYwMWQyY2Q4YTU5OTViYmRmMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZmFyLXYxLjEuMTAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ZhciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9mYXItdjEuMS4xMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9mYXItdjEuMS4xMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGFiY2U1YjA1ODQ2MDFhYjU1MDY5OTA0MmQxNmU2NmQwNzRjMjU1YjA0MTkzNmQyYjA3ODczMmE2NDkyN2MzNTE1YTNkNGY5NTBlZTk2MDk5ZWEwNGVkMWRjMTZlNGY0YTg4YWViMGQ4MTFiNGVlYjRkOTdhNDkyZGY1MDRkM2IiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjEuNi4zIjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjEuNi4zIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjEuNi4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMC4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NjM1MDMxMmYwZTJkYjZhNTAxMzdlNzJlOTY1ZGI4ZjZlMDI1YWMyYTNlOWMwOTEyYjJiMjcwN2MyZjUzYzAzZjlkN2JkNjM5NzgzMzY5M2QyZWU5MzMwYzUwNjI4ZWM4NDIxYzBjNzlkN2U2ODBjNGNmNWNmNjlhMDYyNDdjNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOWVlMWJmZDZhMDIzZjhkYzg1ZTllNDI4YWE3OTY1ZWU3YjdmYTE3NDA4NWNjOTdlMmNmZTExOTVmYmQ3Nzc5Yjg2YTAzMmRlNWZiNjZjNWJhM2VmYjY0NWE4MmU2YmM2ODVkMThmZDgyODVmYjVjYWM0MzU5ZGMzOTdjMDZjNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY4NDAyNTc4MjUwNWVhMzE1ZTQ1NTMxODk3YjBlYjc1YWFiNDA2YjJjNmZkY2I2ZWE2YTg3ODY0OGQ3Nzc4NGZkODUwNTdiMTMxMmZjNDg2MjgxY2ZhMGU3ZGIyZThlZjgyNmVmZGE2NzBhMDU2NGRjOTFlYjJkNDg5ZGUxYzgxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI3NzQyNDMzNzI5OTU4ZGVhYjVmNjNkMmE2OWI3OTFiMDRmYTllYTA5OTRmNGE1ODg0ZjYwMjA0ZDYyZTllZDUwYmJmMjllNDViMDVmZTQ0ZTU3ZTAzNmZjMmY1Y2E3MjA4ZDBhOWIxZGNjNGVmZjM3NTM5YzE5NGY1Y2E3ZDE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY5NGI0OTIxMDBkOWQyYjJkMDIzZGIxZmVkZjU2YTgzOThiMmE4OTI1NDI0NTU3OGJiMGZlNDkzYzMxN2IwY2M0ZDgxY2M4YjdmZjE0M2I3NGM0YWU4MDBmN2Y1ZjZiZTc2NjFhODAyZjU3OTU1MmNiMDA2NzcwOGMzZTY5NjA5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllNjUxN2FiNTdkZjkyZGM4Njg5MmFkYzEwNTIwOTJmMzYxNjJmNTA2ZjExZDRmOTBiNmUyMTAxOTViY2M3Y2ZmNjNiNjAzNzc5YTRkZmZiMWM4N2UwNTExZmFiNmEzMDlmMTQ5YTM3NjQwMDc2NTUwNzQwZDFlNmM1YzFhYTEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZTdmZGM4ZTc5MzE3NjA5MjJhMmIyZDZlOGZjZGVmMmU1N2M0MzhmMDNjZjk3ZjU0ZmU2OTljMDVlOTNjZGM4YTE0ZWQ2MjYyZDQ4MWYxNThiMThjOTZjNTI1NTQwNTdiYzZlYzcwZmI1NGIxMjEyMjY2ZGQyYzkxMGNkOGI4NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFkY2Y5MmNkNDY1ZGZmYWEyZTkzN2U2ZTAzZTVhYTY2M2NjYzMzOWEwMjA5YTdhYjY1NTk4OGRhMjAyOWEwMmZhZTU1NjM2ZDExNWYzOGI1Y2I5NWQ1ODU0MjYxOWY4YWFiNzQwMzRhZWJhOWRmYjRhOTUwYmZlMDFjMzhkYzMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjUuMC4xNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NS4wLjE0IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NS4wLjE0IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM5MmFmYjUxOGJjM2E0NzIwMzgwNDBjYjRhNGJmZjhhNmFlZWFmOTgyNzJlYTBhYTJiMGVlMTI5NWUyOTYyZmVhNjZjYTMyYmM5YjQ4YjFjNDZlYzUzNzBjYTc2ZWExMWQxZTQwY2ZlMzRmZjU2NzM1M2IxNDNlMzc4YTk3OTRjIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuOCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNTg0MzE2M2E3NGI5MmRlMTA2YzIyOWUwMWU3ZGFiNzNlZWMxMTE3ZTM4MTU4ZGE4NTM2MmFmOWNhMTBmZDhlYzZmZjg1N2Y5YTM5YjRlMmEzN2JhNmE2YjBkOTJmNzYzNTMwNTJhNTBhZWVkOWM1MDA2YjQ2MmU2ZDY0YmNiMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRkOTkzMjllMjdjZjhmYmI3YmJlZTViMDgzYmQxYzFiZjQzNjMxNzdmNGYzZjk3NWNlZWQ3MThiYzlkNjk0NTFjNmY3OWRjMThkZDJjMzFlY2E1ODUxYzYyYzI0YjUwYzI3MWZkNjQ2MjQ5ZGQzYjliYjRhZmRiNjcwYzRjYzk5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZmViY2E2MDNiNWJlOTY3ZDA1ZjcxNzFlYzJhMmI3OTk0YTM2ZDJkZDhkZmU4YTRhMTM2N2U3ZjM0ZjZiNTI2ZGZmZjRjOGFhZmM5OTVkM2ExNTVjMmY2ZTA3ZDk1NzRhOTYyNTA5OTlkZjQ2OGJiZGYyMDM5OTE5YzZmZDNkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZjNzRkMTI1MTA3NDdhM2FhZDU4N2EwMmFkNDEwMGM2YWI5YzFhNmFkNjNkYzJkMzI0YTQ2MDQzZTJiMmI0ZjdkMjAwMzBlZjgyYTBkMDc1N2FjMjA0ZTBhMmU0MTMyMmRkNmMyMmFmMmZjMjJjY2Y4OWE5MmJkM2UwY2NiYTk5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIxMmQwYmU1NWM3ZmU3NWE0YjE2ZGQ0NzUyODBlN2FjMzRiNGIxMTM1MWYzYzgxZWY4ZjZiZjI0M2ZlNmI5MTk3ZjNiYzUwODM2NjI0MmM4NGI1MTdhMDcxN2I2YmZlNTU1YjM3ZDQyYTZmZmQyZThkMzMxOGE1YTliYzU4NDFlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2l0ZXItaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXRlci1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2NkNzNmMzNiNzBhZGI4ODFiZjA1NmZkMDExNzBkOTdlYzE0NGNiMWFiNjc1MjhjZjY1MDYxYzg3MGUyN2U3M2FhZDU0YTFlNzM4Yzc4N2U1MTE0OWZkYjJlMGU2MjRhOGE0YTVlNGZjMzg3ZDY3MTA0YmQ3MGY5MWRhOWY0OGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZS1mYXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2UtZmFyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTBhNjJkYjMyNjgwYTI1NDFlZmY5NGE5NTM2ZTAwOWRlM2NlZmI2NjhkMWNmYzc1ODUwZTcyZWY4ZDcwZmFhODQwZjNhMjlmZTJlNGIxMzQyMWEzYWQxYTE1MzkyNWYzNGY4MzYzMDhmN2ExOThlZWJmNjEzMWQ2MWE3MDg5MTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZVRhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNjNTlkMzVmMjUzZjI0YzQ1ZWZjMWJhMGY0MmFjMzE1MGVhYTc3NDNlM2I3ZTYwZGNmNjhkNzcxODU5ZDgyNGI1YmY3MWQzYmRjMmVjOWZjODIyYTVmMTRmODQzOWVhZmI0Yzk0NTUzMzQzNWFhN2M3NGQ3ZTQ1ZWEzYTQwZTAwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFiOWU2OGFkOTNmY2E3MzVlYzJlMDk3NDBiZDYzNWE5NWFmNjdlMTdjOGZlZmRjYzBhOGY0ZTU1MTUyNWFjODUwMGY2MjI5NzM4ZTc1MzJjZTY4ZGNmYTMyMDQ1ZDU0NmY5ZGI0Y2RlOTc1ZjA0NzMxNDQyY2I2MTQ3MWE5NTc4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGVPZi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0OGRlYWVjZTRkYWVlNzYwMGYwM2E5ZThkNmJlOGFiODY4ZmEyOTQwNGM1ZDM5YmVkZTdjOTEyMzEwN2U5MDI5NjAyOGI3NTZhNDY1N2FjYmNiM2Q3NzNkZjY5ZGYwN2E3MDNhYjIyNzYyMjY1OGJiZGVkODNmM2Q2YzhmOWUyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlbW90YWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVtb3RhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWQxMjM0MmZkNDFmMDkyMmI0MDgwOWYzNGJmOTRjNWMxNjJjNjA0MzgxZjU2NzU2MDM1ZWNhNTk1MTYyNjAwMzMyNDNkNDYzZjdjYTdlY2YyZmM1NTA4MzY0YmUyYjExMDgwYzc3ZGJiYmFlMDg1NTJjMzNjZjFmNTgwMjZiYjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2FmZS1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zYWZlLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiMTA0MWJkZDM1ZTU1MzI5ZWEzMGIwZjBjNDUyOWQ3ZDJlY2Y5YjllZmI0NzExZTg4ODcyZTY2YWIwMjRlNzQ3YTMwYjlhOTcyYmJjNTk0OWNhZTRmOWE0NjY3NjY3YzQxMzg2ZmI1NTE0ZjhjM2I3OGI3NDY1MzU3NTYyOGZiYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdHJpbmcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0cmluZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM1NzVjMDQ5MTliYWU1ZTE0ZTkzMjQzMmRkN2E5OWM4Yzk1ZjMzYWQ2YjFmMTVhZDcwOWU4Y2IzYjA1Zjc4MTQzZWFlMzg5ZDhiNmJmNzAyNzhhYzBjNzhjZjVlZDdkYmUxMzQxMWZlMmZkMTZkNTg2NThiNzU2Mjg4OTEzY2NiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWQyYzU1NjY1NjZjOTkyNmQwMTRkZjVkNTFmZmMwMzM3YjNlMzM2OWMzNzRiYzJjNjg1MWNjNjk4MThiNWI3MDhiNDcyMzk1MzAzOGIxMjc3ZDBjOWQwNmIwODdkMGQxZGNjYWM3ODQ5YmQ2ZjEwZGNiYTg3MWRmYzgwODViM2EiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NzY5ZjBhMGNjNGQxMzc0MzVkOGM3MzhhYjczOTNiMmQxNjVmODdhNTBjOWE5MGZhZGNhZDMyYWFhNTlkYTUzZTEyMDRkYWE5ZWViODRiN2YzYmY0NDc0NzdhMjg4MzJjNDI3Y2VkMzVkNjQwOWU5OTgzMGZkMGI0NTZmZTUwZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjk5ZmU1MDkwMzU4YTBhNTE4NjU1N2FlYzhhMThlOTgxMmJkYTdkMzg1YzM4ZTQ0NDhmMDkwMDQzNWQyOWJjMjIwYmI0Yzg3MThkMmM2NDNhMzdhOTBjNjliY2FjYmE1MWJkZTU2YzRlNDE3ZDM5MTdhNWNkN2IyOThjNDQ5M2UiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3BhdHRlcm5zLXYxLjQuOCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGF0dGVybnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGF0dGVybnMtdjEuNC44IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3BhdHRlcm5zLXYxLjQuOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pZGVudC1jaGVja2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL21ha2UtYXJyYXktaXRlcmF0b3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL21ha2UtaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGM3MzZiNjc0OWVkOWU0NTNjZDhmY2NhMWZiNzc5NmQ4NTNmYjY0MGNhMWI1MzUzMDg5Nzg3ODA4MjBmY2UwOGUwZWVmZjBhOTc2YTM3M2RhNDRhYTNkZWI5YzE3NTc0MGQ2NDBkMzEzZDZlMGMxZWZhYjM0ZTA2N2M3ZGVmM2UiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jaGVja0tleS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlmNTg1YTIyZjNhNjNmY2M4ZjAyMzBjNzQ4YWZjZTY3ZGM2YWM1MWIyN2RlYWU5Y2IwOGQyNDQ2NmNkNGE0YWMwZTA2YTRmMGM5MjgzYWVjNjE2MzVhNjczZDQ3Nzc5NjA1ODgxOTljOTlmOGI1MzNiOGJlYmVlZjAyYTJkNWMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29tcGFyZUtleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MTU3NzVkZTk5MWQwODhmODAzNWNkZmY0MDk3NmU4YjEyMDhkOGE1MzI4NjQ4YWY1M2MwODc1ZmJmZTY1YjcwMjg5ZGNhNWQwODk4YTBlM2U0MDA0ZWEwMjliYzU4MzA0N2VjYmZhZWIwY2U0NGM3YjcwNWE0NDBmYzRjOTQyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weUJhZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZjNmNmZjk3ZDUxOTc4NjBmMWUzODUxMzQ0NzE2MWViNWE2ZGJkN2ZlMDlmMTcxYzU4NDUwZDRlMTE1MTNjOGRiNzk1ZWMwOGVjYmQxNWE4NzZhM2I3ZTEzMTI1MDEzNDAyMDdhMjM0NGI4NmQ5YjI0YjI0ZWZmZGFhNTRmZDEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29weVNldC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb3B5U2V0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDQ0OWQ4MGZjNjJiMWZhM2QxMWFiMzkwYTEyMjBkMTllNTNlY2MzMmU2Njg3MGVlMDEzYzk5MWQzMzJiZWVlYjgxMmI3OGNmNzY3N2NmNTlmYjQwNmQyNTZmYjUzMzkwMGRmNzE0OWU3N2UwNzczY2NjZWJjMmJjYzU4ZDNmOGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ1OGNhMGQyMjkwZDFjNGNmZWZhNjUyNmY5MGNhYWQyMTlmNDQyZDE4M2M4MmYzZmUxYTA1Yjk2ZjJhN2ZiYzU2NzhhMTFiMzMyZGE5YjBiZGY5MjE1ZDMzNDVlN2FlNmFhNWE4YmFhZTgwNjY5MzJjZjQyNjNjN2MzZDcwMDExIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjExYzNjZjUyOTBmMmEzNWQ1YjE2ZDc1ZWNkZmIyYzNkNTM0MTM2MjE5Nzc1ZDgzMGU5ZTRmZDU2YWM1ZmQ3MDhhMDRlNDgwN2VlYTBkZTZkNDU2NzQ0NzlkZTk4MGRhNDU0MDFjZWY1YmJiOGViYTkxYjc2ZDJkNWU2YzYyMzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNWM2MDk2NDBiYTdkYWIxM2Y0NjI2NjJmYjU5MDYxMWRmNTJlN2Q1NmVhNjRjZDBkNmNkMjJmYzZhOTIyZWQ2ZTM5M2ZiMzk0MGYzOWU4ZDJjNmI3NTU1YWY3MzY0NmRhOTEwOGQ1MWUwMWEwMTBhMTc1MTAyODU5ZTE3MWI5YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2U4Zjc5MDEwODI1YTYwZTQzYjgwYTQ0ZGQzNTBjYTUwOTkzNjhmN2Y0MWUxYmU0Yjk0MmQ5OTgzMDE2Njg3Yjg2NWQ4MDUzMzUxN2Q3MDQwZDgzZGZkMTgwZWYzNjhlODgxMDBhN2M4ZjA0MDY0N2NkZjJhNGY1MjM4NjkyYWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMmY1MDBhMGQwMzBmMWFlYzk5ZWU3MGRmMTQxYjlhYTZkYWY2OTVjMmQ1ZTExMWUzMjRhNWM1ZTE5NDA1ZjRjNTE0Y2M1MWY3NzY0NmNjNTU5MzJmNjAzNDRhMWZhZTZjODY3ZWFjOGIwMjZjZjFiNTQyZWI3MDMyZmZmNzg2YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS45IjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS45IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMmEyNmIwYjE5ZGIyMjg2NzA0NTczODUzYjQ0NjgwNDliY2EwMDkwMjRkZjhkNDQxMmEwY2E2Y2ZlZGI4NWJkMmNmYTljN2M4ZmQwOGFkZDcwZDE4ZGI3NDE0MTM5MTU3OWM0MDExZjMzM2Y3MGE2NWEzMWMxYjg4ZGQ1NTI3OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmQwYzgyNWIyMmY1YWRmZWFlNDk3MGFhODlkODQ3ODk0NWUyYzg3YjM5ODMyYTViZjczNzBjNzY3ZDYyN2JlZDVkZGZlOGUwNTM1OTNlZGVkNzQwMTY1YmQ2MzRiZTkwYmUwMmE2YWM0MzZjNzU0NWNhMmJhM2M4ZThmZDRmZWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNTE4NjY5ZTFkZTRiNzBkNjRlOGI2NWFmOTEzNDI3ZmQ2MWE3MjBlODFiYjYwZjhkZmRkOTY5NWIwOWE5ZWM3ZGVkNWE1MDFiYjcwZDM3NTgxYWZlZTQxNzg2MzNmYjZiNjFlMzgwNTk4MGY1OTM2YzY0ZmZjYzAzYWUzMDVlMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2N2I3OWI2YzQyMGNjNGU3YzY1OTk1ZmUyNDcwMDVkMjgzNjhkMzQ5NzQ3NTgyZWFhZTZmMWEwY2I3NjQxNWJlZmJjMDI2ZmMzNzEwNTU1NTA2MTY3NTQwYjkzNThhODUwYTNjMGY4MzQ0N2EzYTNjODY3MmJiY2IzY2I2NTgzMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vc3RyZWFtLXYxLjIuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vc3RyZWFtIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3N0cmVhbS12MS4yLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vc3RyZWFtLXYxLjIuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZjM3YTk4M2RiY2ZjMzZmMmExMmMyYTU0MjY3Mjk1ZWI3NDAwZTU5YjRiMzE4MmY5ZmI2OTQ1N2M3Y2U5MjYxOTgyMDc5NjhlNzZmMDJmMWZmNGU4YzQ2MTAyMGFiMTc3NjkyZWZjZjM0YzlhZjhkZGZjZTVkMzhmM2EyZmQwZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiamVzc2llLmpzLXYwLjMuNCI6IHsKICAgICAgIm5hbWUiOiAiamVzc2llLmpzIiwKICAgICAgImxhYmVsIjogImplc3NpZS5qcy12MC4zLjQiLAogICAgICAibG9jYXRpb24iOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGFmMTA5OTcyOTAxZWVjM2U3ZDljMDFkYWUyNmFlZDY3OWZmMTBjNmI4YzJlYWI5ZjdiODUwMmEyN2Q5MTVmNGZjMGQ4OGNmZjI1ZjE1YjY5ODVmNGUxY2UyYmQ0NTNiNzgzMTBiZjZjM2M2YTI1ODMzYzUxYjA3MDY1YjAzMjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3ZGU2Y2JiNTFlMTZhMmRkNTIwZjdlNTY2MGFkZmEzZDM2YjlkMjBlZWJhN2NkM2QwMzZhMGQ1YmZkNmQxNGFkODVmNTYzOTAwZjE2YzZhMDdiYzU3MmZmODQzNmMzZmQxYWZkYzc1Njc3MjM3MDk4Mzc0M2U2ZDI0ZDc0N2MxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjExM2JlZTIwMDJiOTJkMzI2OGJjNWExMjlmZDhmNDViMWYxOTI1MjZiYTIyOWZiZDg5OWUxOWUwOGRkNTM3MTI3YzBhZWFjZmRkYzk5N2Y0MTQ5M2NhZTFiN2U3NTg2NGM3ZmUzYmZmOWExYjA5ZmMwOTJkMGNmNDY2MmJlYmE0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZmQ1MmVmMzAyYzFmMTRjNjIwZmRkZDQzNzI3ZDgyMzI0MDNiOWJkMzU2MWUxZjEyM2RjZTlkNGU5YTEzYjU1YTJkMWVlNGFkODA3MDJmMjUxMTE5ZTlkNDkyYThjN2EzNDVmZTU3MWE0NzlkMzkxZTJiNzgxZmZiMTM4YzAwNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWtlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL21ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM4Y2U5YjRjNjA2MTc1OTMzOThjN2M2YzZjMzk5NTQzN2JjNzVmNjZmMjM4ZWM0ZjBlMmNlODc3ODZlY2Q1ZmFhMGFkMzcyMGJiNTQ5Nzg5MjUxNmU0OTkzMjRmNTA2NGE4NjE3Mzk3ZmViZWIyYWZiNjg3ZWRiODk5NGU1ZTgzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9hc3luYy10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRiZTFjYjczMjJlYTcwMDM0NjU0ZGUzMjYzNjA4OWNiNjE3NTc3YTg5YWM0Zjk3NGFkYzUyMzE5OWY1MGVhYzAwMjg4M2FmNTY3MzhlODBiN2FjODA4NDQ4NzczMzZjNTRmNzQ3NzE2MGEyMDc3MjQ0YTE4MGM5Mjc2YmJhZDNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcxL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcxL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NDZiNmFiYmNlYTcwYjUxMjBhMDU0MjYzOWE5ODVkODk4YTI1ZjI1YTIzOTQwZWNjMGZhMjZlNmVmYzhkNjUyYTVkYjlhZTVhNzVlYzI3OGY3OWM0NGQ4ODAwZDk3YTdiZGVlYmZlNjU3MzNiM2FiNjY0YmIyMzUzYzQ2NTVlZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn1QSwMECgAAAAAAAAAAADGASPiNAQAAjQEAACAAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvaGVhcC5qc3siaW1wb3J0cyI6WyIuL3NyYy9oZWFwLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaGVhcC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9oZWFwLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATKSR/8YKAADGCgAAJAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaGVhcC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXhvIiwiQGFnb3JpYy9zdG9yZSIsIi4vbWFrZS1vbmNlLmpzIiwiLi9rZXlzLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sImV4cG9ydHMiOlsibWFrZUhlYXBab25lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyLGlzUGFzc2FibGUsbWFrZUV4byxkZWZpbmVFeG9DbGFzcyxkZWZpbmVFeG9DbGFzc0tpdCxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhclNldFN0b3JlLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxtYWtlT25jZUtpdCxrZXlzLHdhdGNoUHJvbWlzZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJpc1Bhc3NhYmxlXCIsWyRozY9fYSA9PiAoaXNQYXNzYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V4b1wiLCBbW1wibWFrZUV4b1wiLFskaM2PX2EgPT4gKG1ha2VFeG8gPSAkaM2PX2EpXV0sW1wiZGVmaW5lRXhvQ2xhc3NcIixbJGjNj19hID0+IChkZWZpbmVFeG9DbGFzcyA9ICRozY9fYSldXSxbXCJkZWZpbmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKGRlZmluZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJTZXRTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9ICRozY9fYSldXV1dLFtcIi4vbWFrZS1vbmNlLmpzXCIsIFtbXCJtYWtlT25jZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VPbmNlS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9rZXlzLmpzXCIsIFtbXCJhZ29yaWNWYXREYXRhS2V5c1wiLFskaM2PX2EgPT4gKGtleXMgPSAkaM2PX2EpXV1dXSxbXCIuL3dhdGNoLXByb21pc2UuanNcIiwgW1tcIndhdGNoUHJvbWlzZVwiLFskaM2PX2EgPT4gKHdhdGNoUHJvbWlzZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cbmNvbnN0IGRldGFjaGVkSGVhcFN0b3JlcyA9IEZhcignaGVhcFN0b3JlcycsIHtcbiAgZGV0YWNoZWQ6ICgpID0+IGRldGFjaGVkSGVhcFN0b3JlcyxcbiAgaXNTdG9yYWJsZTogaXNQYXNzYWJsZSxcblxuICBzZXRTdG9yZTogbWFrZVNjYWxhclNldFN0b3JlLFxuICBtYXBTdG9yZTogbWFrZVNjYWxhck1hcFN0b3JlLFxuICB3ZWFrTWFwU3RvcmU6IG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsXG4gIHdlYWtTZXRTdG9yZTogbWFrZVNjYWxhcldlYWtTZXRTdG9yZVxufSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUhlYXBab25lID0gKGJhc2VMYWJlbCA9ICdoZWFwWm9uZScpID0+IHtcbiAgY29uc3QgeyBtYWtlT25jZSwgd3JhcFByb3ZpZGVyIH0gPSBtYWtlT25jZUtpdChiYXNlTGFiZWwsIGRldGFjaGVkSGVhcFN0b3Jlcyk7XG5cbiAgLypcbiAgICAgKi9cblxuXG4gIGNvbnN0IG1ha2VTdWJab25lID0gKGxhYmVsLCBfb3B0aW9ucykgPT5cbiAgbWFrZUhlYXBab25lKGAke2Jhc2VMYWJlbH0uJHtsYWJlbH1gKTtcblxuICByZXR1cm4gRmFyKCdoZWFwWm9uZScsIHtcbiAgICBleG86IHdyYXBQcm92aWRlcihtYWtlRXhvLCBrZXlzLmV4byksXG4gICAgZXhvQ2xhc3M6IHdyYXBQcm92aWRlcihkZWZpbmVFeG9DbGFzcywga2V5cy5leG9DbGFzcyksXG4gICAgZXhvQ2xhc3NLaXQ6IHdyYXBQcm92aWRlcihkZWZpbmVFeG9DbGFzc0tpdCwga2V5cy5leG9DbGFzc0tpdCksXG4gICAgc3ViWm9uZTogd3JhcFByb3ZpZGVyKG1ha2VTdWJab25lKSxcblxuICAgIG1ha2VPbmNlLFxuICAgIHdhdGNoUHJvbWlzZSxcbiAgICBkZXRhY2hlZDogZGV0YWNoZWRIZWFwU3RvcmVzLmRldGFjaGVkLFxuICAgIGlzU3RvcmFibGU6IGRldGFjaGVkSGVhcFN0b3Jlcy5pc1N0b3JhYmxlLFxuXG4gICAgbWFwU3RvcmU6IHdyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMubWFwU3RvcmUpLFxuICAgIHNldFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLnNldFN0b3JlKSxcbiAgICB3ZWFrTWFwU3RvcmU6IHdyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMud2Vha01hcFN0b3JlKSxcbiAgICB3ZWFrU2V0U3RvcmU6IHdyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMud2Vha1NldFN0b3JlKVxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VIZWFwWm9uZShtYWtlSGVhcFpvbmUpO1xuaGFyZGVuKG1ha2VIZWFwWm9uZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSGVhcFpvbmUiOlsibWFrZUhlYXBab25lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABVusfp5AgAAeQIAACUAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vZXhwb3J0cy5qcyIsIi4vbWFrZS1vbmNlLmpzIiwiLi9rZXlzLmpzIiwiLi9pcy1wYXNzYWJsZS5qcyIsIi4vd2F0Y2gtcHJvbWlzZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyIsIi4vaXMtcGFzc2FibGUuanMiLCIuL2tleXMuanMiLCIuL21ha2Utb25jZS5qcyIsIi4vd2F0Y2gtcHJvbWlzZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2V4cG9ydHMuanNcIiwgW11dLFtcIi4vbWFrZS1vbmNlLmpzXCIsIFtdXSxbXCIuL2tleXMuanNcIiwgW11dLFtcIi4vaXMtcGFzc2FibGUuanNcIiwgW11dLFtcIi4vd2F0Y2gtcHJvbWlzZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC+U19XbwIAAG8CAAArAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pcy1wYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiaXNQYXNzYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHJlYWxJc1Bhc3NhYmxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiaXNQYXNzYWJsZVwiLFskaM2PX2EgPT4gKHJlYWxJc1Bhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuICovXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGlzUGFzc2FibGUgPSAoc3BlY2ltZW4pID0+IHJlYWxJc1Bhc3NhYmxlKHNwZWNpbWVuKTskaM2PX29uY2UuaXNQYXNzYWJsZShpc1Bhc3NhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGUiOlsiaXNQYXNzYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADWK7qcngMAAJ4DAAAkAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9rZXlzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhZ29yaWNWYXREYXRhS2V5cyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBraW5kID0gKGxhYmVsKSA9PiBgJHtsYWJlbH1fa2luZEhhbmRsZWA7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHNpbmdsZXRvbiA9IChsYWJlbCkgPT4gYCR7bGFiZWx9X3NpbmdsZXRvbmA7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFnb3JpY1ZhdERhdGFLZXlzID0ge1xuICBleG9DbGFzczogKGxhYmVsKSA9PiBoYXJkZW4oW2tpbmQobGFiZWwpXSksXG4gIGV4b0NsYXNzS2l0OiAobGFiZWwpID0+IGhhcmRlbihba2luZChsYWJlbCldKSxcbiAgZXhvOiAobGFiZWwpID0+IGhhcmRlbihba2luZChsYWJlbCksIHNpbmdsZXRvbihsYWJlbCldKSxcbiAgc3RvcmU6IChsYWJlbCkgPT4gaGFyZGVuKFtsYWJlbF0pLFxuICB6b25lOiAobGFiZWwpID0+IGhhcmRlbihbbGFiZWxdKVxufTskaM2PX29uY2UuYWdvcmljVmF0RGF0YUtleXMoYWdvcmljVmF0RGF0YUtleXMpO1xuaGFyZGVuKGFnb3JpY1ZhdERhdGFLZXlzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFnb3JpY1ZhdERhdGFLZXlzIjpbImFnb3JpY1ZhdERhdGFLZXlzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGwo0rquBwAArgcAACkAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL21ha2Utb25jZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlT25jZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkZWZhdWx0TGFiZWxUb0tleXMgPSAobGFiZWwpID0+IGhhcmRlbihbbGFiZWxdKTtcbmhhcmRlbihkZWZhdWx0TGFiZWxUb0tleXMpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlT25jZUtpdCA9IChkZWJ1Z05hbWUsIHN0b3JlcywgYmFja2luZ1N0b3JlID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHVzZWRLZXlzID0gc3RvcmVzLmRldGFjaGVkKCkuc2V0U3RvcmUoYCR7ZGVidWdOYW1lfSB1c2VkIGtleXNgKTtcblxuICAvKlxuICAgICovXG5cbiAgY29uc3QgYXNzZXJ0T25seU9uY2UgPSAoa2V5KSA9PiB7XG4gICAgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHwgRmFpbGBrZXkgJHtrZXl9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICF1c2VkS2V5cy5oYXMoa2V5KSB8fFxuICAgIEZhaWxga2V5ICR7a2V5fSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gdGhpcyB6b25lIGFuZCBpbmNhcm5hdGlvbmA7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgdXNlZEtleXMuYWRkKGtleSk7XG4gIH07XG5cbiAgLypcbiAgXG4gIFxuICAgICovXG5cblxuXG5cblxuICBjb25zdCB3cmFwUHJvdmlkZXIgPSAocHJvdmlkZXIsIGxhYmVsVG9LZXlzID0gZGVmYXVsdExhYmVsVG9LZXlzKSA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCB3cmFwcGVyID0gKGxhYmVsLCAuLi5yZXN0KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBsYWJlbFRvS2V5cyhsYWJlbCkpIHtcbiAgICAgICAgYXNzZXJ0T25seU9uY2Uoa2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm92aWRlcihsYWJlbCwgLi4ucmVzdCk7XG4gICAgfTtcbiAgICByZXR1cm4gLyogICAgICAgICAgICAqLyh3cmFwcGVyKTtcbiAgfTtcblxuICAvKlxuICBcbiAgXG4gIFxuICBcbiAgXG4gICAgKi9cblxuXG5cblxuXG5cblxuXG5cblxuXG4gIGNvbnN0IG1ha2VPbmNlID0gKGtleSwgbWFrZXIpID0+IHtcbiAgICBhc3NlcnRPbmx5T25jZShrZXkpO1xuICAgIGlmIChiYWNraW5nU3RvcmUgJiYgYmFja2luZ1N0b3JlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gYmFja2luZ1N0b3JlLmdldChrZXkpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IG1ha2VyKGtleSk7XG4gICAgc3RvcmVzLmlzU3RvcmFibGUodmFsdWUpIHx8XG4gICAgRmFpbGBtYWtlciByZXR1cm4gdmFsdWUgJHt2YWx1ZX0gaXMgbm90IHN0b3JhYmxlYDtcbiAgICBiYWNraW5nU3RvcmUgJiYgYmFja2luZ1N0b3JlLmluaXQoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyBtYWtlT25jZSwgd3JhcFByb3ZpZGVyIH0pO1xufTskaM2PX29uY2UubWFrZU9uY2VLaXQobWFrZU9uY2VLaXQpO1xuaGFyZGVuKG1ha2VPbmNlS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VPbmNlS2l0IjpbIm1ha2VPbmNlS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABAMGTuYDAAAmAwAADEAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsZnJvbVVuaXF1ZUVudHJpZXMsTTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qc1wiLCBbW1wiZnJvbVVuaXF1ZUVudHJpZXNcIixbJGjNj19hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0ID0gKFxuem9uZSxcbnVLaW5kTmFtZSxcbnVNZXRob2ROYW1lcyxcbm9wdGlvbnMgPSB7fSkgPT5cbntcbiAgY29uc3Qge1xuICAgIHVJbnRlcmZhY2VOYW1lID0gdUtpbmROYW1lLFxuICAgIGV4dHJhTWV0aG9kR3VhcmRzID0gdW5kZWZpbmVkLFxuICAgIGV4dHJhTWV0aG9kcyA9IHVuZGVmaW5lZFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgUmV2b2NhYmxlSUtpdCA9IGhhcmRlbih7XG4gICAgcmV2b2tlcjogTS5pbnRlcmZhY2UoYCR7dUludGVyZmFjZU5hbWV9X3Jldm9rZXJgLCB7XG4gICAgICByZXZva2U6IE0uY2FsbCgpLnJldHVybnMoTS5ib29sZWFuKCkpXG4gICAgfSksXG4gICAgcmV2b2NhYmxlOiBNLmludGVyZmFjZShcbiAgICAgIGAke3VJbnRlcmZhY2VOYW1lfV9yZXZvY2FibGVgLFxuICAgICAge1xuICAgICAgICAuLi5leHRyYU1ldGhvZEd1YXJkc1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGVmYXVsdEd1YXJkczogJ3JhdydcbiAgICAgIH1cbiAgICApXG4gIH0pO1xuXG4gIGNvbnN0IHJldm9jYWJsZUtpbmROYW1lID0gYCR7dUtpbmROYW1lfV9jYXJldGFrZXJgO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgYW1wbGlmaWVyO1xuXG4gIGNvbnN0IG1ha2VSZXZvY2FibGVLaXQgPSB6b25lLmV4b0NsYXNzS2l0KFxuICAgIHJldm9jYWJsZUtpbmROYW1lLFxuICAgIFJldm9jYWJsZUlLaXQsXG4gICAgKHVuZGVybHlpbmcpID0+ICh7XG4gICAgICB1bmRlcmx5aW5nXG4gICAgfSksXG4gICAge1xuICAgICAgcmV2b2tlcjoge1xuICAgICAgICByZXZva2UoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBpZiAoc3RhdGUudW5kZXJseWluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLnVuZGVybHlpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICByZXZvY2FibGU6IHtcbiAgICAgICAgLi4uZnJvbVVuaXF1ZUVudHJpZXMoXG4gICAgICAgICAgdU1ldGhvZE5hbWVzLm1hcCgobmFtZSkgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIFtuYW1lXSguLi5hcmdzKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGNvbnN0IHsgdW5kZXJseWluZyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICAgICAgdW5kZXJseWluZyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIEZhaWxgJHtxKHJldm9jYWJsZUtpbmROYW1lKX0gcmV2b2tlZGA7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlcmx5aW5nW25hbWVdKC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9cbiAgICAgICAgICB9W25hbWVdXVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgLi4uZXh0cmFNZXRob2RzXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBzdGF0ZVNoYXBlOiB7XG4gICAgICAgIHVuZGVybHlpbmc6IE0ub3B0KE0ucmVtb3RhYmxlKCd1bmRlcmx5aW5nJykpXG4gICAgICB9LFxuICAgICAgcmVjZWl2ZUFtcGxpZmllcjogKGFtcCkgPT4ge1xuICAgICAgICBhbXBsaWZpZXIgPSBhbXA7XG4gICAgICB9XG4gICAgfVxuICApO1xuXG4gIC8qXG4gICAgICovXG5cblxuICBjb25zdCBtYWtlUmV2b2NhYmxlID0gKHVuZGVybHlpbmcpID0+XG4gIC8vXG4gIG1ha2VSZXZvY2FibGVLaXQodW5kZXJseWluZykucmV2b2NhYmxlO1xuXG4gIC8qXG4gICAgICovXG5cblxuICBjb25zdCByZXZva2UgPSAocmV2b2NhYmxlKSA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgZmFjZXRzID0gYW1wbGlmaWVyKHJldm9jYWJsZSk7XG4gICAgaWYgKGZhY2V0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmYWNldHMucmV2b2tlci5yZXZva2UoKTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICByZXZva2UsXG4gICAgbWFrZVJldm9jYWJsZVxuICB9KTtcbn07JGjNj19vbmNlLnByZXBhcmVSZXZvY2FibGVNYWtlcktpdChwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQpO1xuaGFyZGVuKHByZXBhcmVSZXZvY2FibGVNYWtlcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQiOlsicHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKpYOdS0CQAAtAkAAC0AAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3dhdGNoLXByb21pc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGF0dGVybnMiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiLCJQcm9taXNlV2F0Y2hlckhhbmRsZXIiLCJQcm9taXNlV2F0Y2hlckkiLCJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTSxFOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vKlxuXG4gKi9cbmNvbnN0IFByb21pc2VXYXRjaGVySGFuZGxlciA9IE0uY2FsbChNLnJhdygpKS5yZXN0KE0ucmF3KCkpLnJldHVybnMoKTtcblxuLypcblxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVySGFuZGxlcihQcm9taXNlV2F0Y2hlckhhbmRsZXIpO1xuY29uc3QgUHJvbWlzZVdhdGNoZXJJID0gTS5pbnRlcmZhY2UoJ1Byb21pc2VXYXRjaGVyJywge1xuICBvbkZ1bGZpbGxlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxuICBvblJlamVjdGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXJcbn0pO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJJKFByb21pc2VXYXRjaGVySSk7XG5jb25zdCBQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkgPSBNLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWQnLCB7XG4gIG9uRnVsZmlsbGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXJcbn0pO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJKFByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSk7XG5jb25zdCBQcm9taXNlV2F0Y2hlclJlamVjdGVkSSA9IE0uaW50ZXJmYWNlKCdQcm9taXNlV2F0Y2hlclJlamVjdGVkJywge1xuICBvblJlamVjdGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXJcbn0pO1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlclJlamVjdGVkSShQcm9taXNlV2F0Y2hlclJlamVjdGVkSSk7XG5jb25zdCBjYWxsTWVNYXliZSA9ICh0aGF0LCBwcm9wLCBwb3N0QXJncykgPT4ge1xuICBjb25zdCBmbiA9IHRoYXRbcHJvcF07XG4gIGlmICghZm4pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGFzc2VydC50eXBlb2YoZm4sICdmdW5jdGlvbicpO1xuICAvKlxuICAgICovXG5cbiAgY29uc3Qgd3JhcHBlZCA9IChhcmcpID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgYXBwbHkoZm4sIHRoYXQsIFthcmcsIC4uLnBvc3RBcmdzXSk7XG4gIH07XG4gIHJldHVybiB3cmFwcGVkO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgd2F0Y2hQcm9taXNlID0gKHAsIHdhdGNoZXIsIC4uLndhdGNoZXJBcmdzKSA9PiB7XG4gIFByb21pc2UucmVzb2x2ZShwKSA9PT0gcCB8fCBGYWlsYHdhdGNoUHJvbWlzZSBvbmx5IHdhdGNoZXMgcHJvbWlzZXNgO1xuICBjb25zdCBvbkZ1bGZpbGxlZCA9IGNhbGxNZU1heWJlKHdhdGNoZXIsICdvbkZ1bGZpbGxlZCcsIHdhdGNoZXJBcmdzKTtcbiAgY29uc3Qgb25SZWplY3RlZCA9IGNhbGxNZU1heWJlKHdhdGNoZXIsICdvblJlamVjdGVkJywgd2F0Y2hlckFyZ3MpO1xuICBvbkZ1bGZpbGxlZCB8fFxuICBvblJlamVjdGVkIHx8XG4gIEZhaWxgcHJvbWlzZSB3YXRjaGVyIG11c3QgaW1wbGVtZW50IGF0IGxlYXN0IG9uZSBoYW5kbGVyIG1ldGhvZGA7XG4gIHZvaWQgRS53aGVuKHAsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbn07JGjNj19vbmNlLndhdGNoUHJvbWlzZSh3YXRjaFByb21pc2UpO1xuaGFyZGVuKHdhdGNoUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQcm9taXNlV2F0Y2hlckhhbmRsZXIiOlsiUHJvbWlzZVdhdGNoZXJIYW5kbGVyIl0sIlByb21pc2VXYXRjaGVySSI6WyJQcm9taXNlV2F0Y2hlckkiXSwiUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJIjpbIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSJdLCJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSI6WyJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSJdLCJ3YXRjaFByb21pc2UiOlsid2F0Y2hQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPo8pgO0AQAAtAEAACgAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvem9uZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvcHJlcGFyZS1yZXZvY2FibGUuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvcHJlcGFyZS1yZXZvY2FibGUuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACI3vaoEfAACBHwAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbCxwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVtb3RhYmxlID0gJGjNj19hKV1dLFtcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1wiLCBbW1wibmF0TWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChuYXRNYXRoSGVscGVycyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcInNldE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoc2V0TWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoY29weVNldE1hdGhIZWxwZXJzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlCYWdNYXRoSGVscGVyc1wiLFskaM2PX2EgPT4gKGNvcHlCYWdNYXRoSGVscGVycyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLy9cbi8qXG5cblxuXG4gKi9cbmNvbnN0IEFzc2V0S2luZCA9IC8qICAgICAgICAgICAgICAgICovKHtcbiAgTkFUOiAnbmF0JyxcbiAgU0VUOiAnc2V0JyxcbiAgQ09QWV9TRVQ6ICdjb3B5U2V0JyxcbiAgQ09QWV9CQUc6ICdjb3B5QmFnJ1xufSk7JGjNj19vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuaGFyZGVuKEFzc2V0S2luZCk7XG5jb25zdCBhc3NldEtpbmROYW1lcyA9IGhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGFzc2VydEFzc2V0S2luZCA9IChhbGxlZ2VkQUspID0+IHtcbiAgYXNzZXRLaW5kTmFtZXMuaW5jbHVkZXMoYWxsZWdlZEFLKSB8fFxuICBGYWlsYFRoZSBhc3NldEtpbmQgJHthbGxlZ2VkQUt9IG11c3QgYmUgb25lIG9mICR7cShhc3NldEtpbmROYW1lcyl9YDtcbn07JGjNj19vbmNlLmFzc2VydEFzc2V0S2luZChhc3NlcnRBc3NldEtpbmQpO1xuaGFyZGVuKGFzc2VydEFzc2V0S2luZCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBoZWxwZXJzID0ge1xuICBuYXQ6IG5hdE1hdGhIZWxwZXJzLFxuICBzZXQ6IHNldE1hdGhIZWxwZXJzLFxuICBjb3B5U2V0OiBjb3B5U2V0TWF0aEhlbHBlcnMsXG4gIGNvcHlCYWc6IGNvcHlCYWdNYXRoSGVscGVyc1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kID0gKHZhbHVlKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbHVlKTtcbiAgaWYgKHBhc3NTdHlsZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gJ25hdCc7XG4gIH1cbiAgaWYgKHBhc3NTdHlsZSA9PT0gJ2NvcHlBcnJheScpIHtcbiAgICByZXR1cm4gJ3NldCc7XG4gIH1cbiAgaWYgKG1hdGNoZXModmFsdWUsIE0uc2V0KCkpKSB7XG4gICAgcmV0dXJuICdjb3B5U2V0JztcbiAgfVxuICBpZiAobWF0Y2hlcyh2YWx1ZSwgTS5iYWcoKSkpIHtcbiAgICByZXR1cm4gJ2NvcHlCYWcnO1xuICB9XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIHRocm93IEZhaWxgdmFsdWUgJHt2YWx1ZX0gbXVzdCBiZSBhIGJpZ2ludCwgY29weVNldCwgY29weUJhZywgb3IgYW4gYXJyYXksIG5vdCAke3EoXG4gICAgcGFzc1N0eWxlXG4gICl9YDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0VmFsdWVHZXRIZWxwZXJzID0gKHZhbHVlKSA9PlxuLy9cbmhlbHBlcnNbYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpXTtcblxuLypcblxuICovJGjNj19vbmNlLmFzc2VydFZhbHVlR2V0SGVscGVycyhhc3NlcnRWYWx1ZUdldEhlbHBlcnMpO1xuY29uc3Qgb3B0aW9uYWxCcmFuZENoZWNrID0gKGFsbGVnZWRCcmFuZCwgYnJhbmQpID0+IHtcbiAgaWYgKGJyYW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGFsbGVnZWRCcmFuZCA9PT0gYnJhbmQgfHxcbiAgICBGYWlsYGFtb3VudCdzIGJyYW5kICR7cShhbGxlZ2VkQnJhbmQpfSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkIGJyYW5kICR7cShcbiAgICAgIGJyYW5kXG4gICAgKX1gO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgY2hlY2tMUkFuZEdldEhlbHBlcnMgPSAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gIGFzc2VydFJlY29yZChsZWZ0QW1vdW50LCAnbGVmdEFtb3VudCcpO1xuICBhc3NlcnRSZWNvcmQocmlnaHRBbW91bnQsICdyaWdodEFtb3VudCcpO1xuICBjb25zdCB7IHZhbHVlOiBsZWZ0VmFsdWUsIGJyYW5kOiBsZWZ0QnJhbmQgfSA9IGxlZnRBbW91bnQ7XG4gIGNvbnN0IHsgdmFsdWU6IHJpZ2h0VmFsdWUsIGJyYW5kOiByaWdodEJyYW5kIH0gPSByaWdodEFtb3VudDtcbiAgYXNzZXJ0UmVtb3RhYmxlKGxlZnRCcmFuZCwgJ2xlZnRCcmFuZCcpO1xuICBhc3NlcnRSZW1vdGFibGUocmlnaHRCcmFuZCwgJ3JpZ2h0QnJhbmQnKTtcbiAgb3B0aW9uYWxCcmFuZENoZWNrKGxlZnRCcmFuZCwgYnJhbmQpO1xuICBvcHRpb25hbEJyYW5kQ2hlY2socmlnaHRCcmFuZCwgYnJhbmQpO1xuICBsZWZ0QnJhbmQgPT09IHJpZ2h0QnJhbmQgfHxcbiAgRmFpbGBCcmFuZHMgaW4gbGVmdCAke3EobGVmdEJyYW5kKX0gYW5kIHJpZ2h0ICR7cShcbiAgICByaWdodEJyYW5kXG4gICl9IHNob3VsZCBtYXRjaCBidXQgZG8gbm90YDtcbiAgY29uc3QgbGVmdEhlbHBlcnMgPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnMobGVmdFZhbHVlKTtcbiAgY29uc3QgcmlnaHRIZWxwZXJzID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHJpZ2h0VmFsdWUpO1xuICBsZWZ0SGVscGVycyA9PT0gcmlnaHRIZWxwZXJzIHx8XG4gIEZhaWxgVGhlIGxlZnQgJHtsZWZ0QW1vdW50fSBhbmQgcmlnaHQgYW1vdW50ICR7cmlnaHRBbW91bnR9IGhhZCBkaWZmZXJlbnQgYXNzZXRLaW5kc2A7XG4gIHJldHVybiBsZWZ0SGVscGVycztcbn07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb2VyY2VMUiA9IChoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkgPT4ge1xuICAvL1xuICByZXR1cm4gW2guZG9Db2VyY2UobGVmdEFtb3VudC52YWx1ZSksIGguZG9Db2VyY2UocmlnaHRBbW91bnQudmFsdWUpXTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBpc0dURSA9IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gIHJldHVybiBoLmRvSXNHVEUoLi4uY29lcmNlTFIoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IEFtb3VudE1hdGggPSB7XG4gIC8vXG4gIC8vXG4gIC8qXG4gIFxuICBcbiAgXG4gIFxuICBcbiAgXG4gICAgKi9cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICBtYWtlOiAoYnJhbmQsIGFsbGVnZWRWYWx1ZSkgPT4ge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgY29uc3QgaCA9IGFzc2VydFZhbHVlR2V0SGVscGVycyhhbGxlZ2VkVmFsdWUpO1xuICAgIGNvbnN0IHZhbHVlID0gaC5kb0NvZXJjZShhbGxlZ2VkVmFsdWUpO1xuICAgIC8vXG4gICAgcmV0dXJuIGhhcmRlbih7IGJyYW5kLCB2YWx1ZSB9KTtcbiAgfSxcbiAgLypcbiAgXG4gIFxuICAgICovXG5cblxuXG5cblxuICBjb2VyY2U6IChicmFuZCwgYWxsZWdlZEFtb3VudCkgPT4ge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgYXNzZXJ0UmVjb3JkKGFsbGVnZWRBbW91bnQsICdhbW91bnQnKTtcbiAgICBjb25zdCB7IGJyYW5kOiBhbGxlZ2VkQnJhbmQsIHZhbHVlOiBhbGxlZ2VkVmFsdWUgfSA9IGFsbGVnZWRBbW91bnQ7XG4gICAgYnJhbmQgPT09IGFsbGVnZWRCcmFuZCB8fFxuICAgIEZhaWxgVGhlIGJyYW5kIGluIHRoZSBhbGxlZ2VkQW1vdW50ICR7YWxsZWdlZEFtb3VudH0gaW4gJ2NvZXJjZScgZGlkbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgYnJhbmQgJHticmFuZH0uYDtcbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCwgYWxsZWdlZFZhbHVlKTtcbiAgfSxcbiAgLypcbiAgXG4gIFxuICAgKi9cblxuXG5cblxuICBnZXRWYWx1ZTogKGJyYW5kLCBhbW91bnQpID0+IEFtb3VudE1hdGguY29lcmNlKGJyYW5kLCBhbW91bnQpLnZhbHVlLFxuICAvKlxuICBcbiAgXG4gICAgKi9cblxuXG5cblxuXG4gIG1ha2VFbXB0eTogKGJyYW5kLCBhc3NldEtpbmQgPSAvKiAgICAgICAgICAgICAgICAqLygnbmF0JykpID0+IHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuICAgIGNvbnN0IHZhbHVlID0gaGVscGVyc1thc3NldEtpbmRdLmRvTWFrZUVtcHR5KCk7XG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKlxuICBcbiAgXG4gICAqL1xuXG5cblxuXG4gIG1ha2VFbXB0eUZyb21BbW91bnQ6IChhbW91bnQpID0+IHtcbiAgICBhc3NlcnRSZWNvcmQoYW1vdW50LCAnYW1vdW50Jyk7XG4gICAgY29uc3QgeyBicmFuZCwgdmFsdWUgfSA9IGFtb3VudDtcbiAgICBjb25zdCBhc3NldEtpbmQgPSBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG4gICAgLy9cbiAgICByZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG4gIH0sXG4gIC8qXG4gIFxuICAgICAqL1xuXG5cblxuXG4gIGlzRW1wdHk6IChhbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgYXNzZXJ0UmVjb3JkKGFtb3VudCwgJ2Ftb3VudCcpO1xuICAgIGNvbnN0IHsgYnJhbmQ6IGFsbGVnZWRCcmFuZCwgdmFsdWUgfSA9IGFtb3VudDtcbiAgICBhc3NlcnRSZW1vdGFibGUoYWxsZWdlZEJyYW5kLCAnYnJhbmQnKTtcbiAgICBvcHRpb25hbEJyYW5kQ2hlY2soYWxsZWdlZEJyYW5kLCBicmFuZCk7XG4gICAgY29uc3QgaCA9IGFzc2VydFZhbHVlR2V0SGVscGVycyh2YWx1ZSk7XG4gICAgcmV0dXJuIGguZG9Jc0VtcHR5KGguZG9Db2VyY2UodmFsdWUpKTtcbiAgfSxcbiAgaXNHVEUsXG4gIC8qXG4gIFxuICBcbiAgICAgKi9cblxuXG5cblxuXG5cbiAgaXNFcXVhbDogKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IGggPSBjaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQpO1xuICAgIHJldHVybiBoLmRvSXNFcXVhbCguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xuICB9LFxuICAvKlxuICBcbiAgXG4gIFxuICAgICAqL1xuXG5cblxuXG5cblxuXG5cbiAgYWRkOiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvQWRkKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQ6IGxlZnRBbW91bnQuYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKlxuICBcbiAgXG4gIFxuICBcbiAgICovXG5cblxuXG5cblxuXG5cblxuICBzdWJ0cmFjdDogKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IGggPSBjaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQpO1xuICAgIGNvbnN0IHZhbHVlID0gaC5kb1N1YnRyYWN0KC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQ6IGxlZnRBbW91bnQuYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKlxuICBcbiAgXG4gICAgKi9cblxuXG5cblxuXG4gIG1pbjogKHgsIHksIGJyYW5kID0gdW5kZWZpbmVkKSA9PlxuICAvL1xuICBpc0dURSh4LCB5LCBicmFuZCkgP1xuICB5IDpcbiAgaXNHVEUoeSwgeCwgYnJhbmQpID9cbiAgeCA6XG4gIEZhaWxgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYCxcbiAgLypcbiAgXG4gIFxuICAgICovXG5cblxuXG5cblxuICBtYXg6ICh4LCB5LCBicmFuZCA9IHVuZGVmaW5lZCkgPT5cbiAgLy9cbiAgaXNHVEUoeCwgeSwgYnJhbmQpID9cbiAgeCA6XG4gIGlzR1RFKHksIHgpID9cbiAgeSA6XG4gIEZhaWxgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYFxufTskaM2PX29uY2UuQW1vdW50TWF0aChBbW91bnRNYXRoKTtcbmhhcmRlbihBbW91bnRNYXRoKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGdldEFzc2V0S2luZCA9IChhbW91bnQpID0+IHtcbiAgYXNzZXJ0UmVjb3JkKGFtb3VudCwgJ2Ftb3VudCcpO1xuICBjb25zdCB7IHZhbHVlIH0gPSBhbW91bnQ7XG4gIHJldHVybiBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG59OyRozY9fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQXNzZXRLaW5kIjpbIkFzc2V0S2luZCJdLCJhc3NlcnRBc3NldEtpbmQiOlsiYXNzZXJ0QXNzZXRLaW5kIl0sImFzc2VydFZhbHVlR2V0SGVscGVycyI6WyJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiXSwiQW1vdW50TWF0aCI6WyJBbW91bnRNYXRoIl0sImdldEFzc2V0S2luZCI6WyJnZXRBc3NldEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAf+5UfC0EAAAtBAAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRTdG9yZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiXSwiZXhwb3J0cyI6WyJtYWtlQW1vdW50U3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRNYXRoOyRozY9faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dXSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBtYWtlQW1vdW50U3RvcmUgPSAoc3RhdGUsIGtleSkgPT4ge1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBnZXRBbW91bnQ6ICgpID0+IHN0YXRlW2tleV0sXG4gICAgaW5jcmVtZW50OiAoZGVsdGEpID0+IHtcbiAgICAgIHN0YXRlW2tleV0gPSBBbW91bnRNYXRoLmFkZChzdGF0ZVtrZXldLCBkZWx0YSk7XG4gICAgfSxcbiAgICBkZWNyZW1lbnQ6IChkZWx0YSkgPT4ge1xuICAgICAgaWYgKEFtb3VudE1hdGguaXNHVEUoc3RhdGVba2V5XSwgZGVsdGEpKSB7XG4gICAgICAgIHN0YXRlW2tleV0gPSBBbW91bnRNYXRoLnN1YnRyYWN0KHN0YXRlW2tleV0sIGRlbHRhKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VBbW91bnRTdG9yZShtYWtlQW1vdW50U3RvcmUpO1xuaGFyZGVuKG1ha2VBbW91bnRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQW1vdW50U3RvcmUiOlsibWFrZUFtb3VudFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ6YVUT8BQAA/AUAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbImNvZXJjZURpc3BsYXlJbmZvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtdXN0TWF0Y2gsRGlzcGxheUluZm9TaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkRpc3BsYXlJbmZvU2hhcGVcIixbJGjNj19hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNvZXJjZURpc3BsYXlJbmZvID0gKGFsbGVnZWREaXNwbGF5SW5mbywgYXNzZXRLaW5kKSA9PiB7XG4gIG11c3RNYXRjaChhbGxlZ2VkRGlzcGxheUluZm8sIERpc3BsYXlJbmZvU2hhcGUsICdkaXNwbGF5SW5mbycpO1xuXG4gIGlmIChhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kID09PSBhc3NldEtpbmQgfHxcbiAgICBGYWlsYGRpc3BsYXlJbmZvLmFzc2V0S2luZCB3YXMgcHJlc2VudCAoJHthbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kfSkgYW5kIGRpZCBub3QgbWF0Y2ggdGhlIGFzc2V0S2luZCBhcmd1bWVudCAoJHthc3NldEtpbmR9KWA7XG4gIH1cbiAgY29uc3QgZGlzcGxheUluZm8gPSBoYXJkZW4oeyAuLi5hbGxlZ2VkRGlzcGxheUluZm8sIGFzc2V0S2luZCB9KTtcblxuICBpZiAoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTnVtYmVyLmlzU2FmZUludGVnZXIoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcykgfHxcbiAgICBGYWlsYGRlY2ltYWxQbGFjZXMgJHtkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzfSBpcyBub3QgYSBzYWZlIGludGVnZXJgO1xuICB9XG5cbiAgcmV0dXJuIGRpc3BsYXlJbmZvO1xufTskaM2PX29uY2UuY29lcmNlRGlzcGxheUluZm8oY29lcmNlRGlzcGxheUluZm8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29lcmNlRGlzcGxheUluZm8iOlsiY29lcmNlRGlzcGxheUluZm8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA819NA00CAABNAgAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPpWdWeSFwAAkhcAACUAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaXNzdWVyS2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b25lL2R1cmFibGUuanMiLCIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIl0sImV4cG9ydHMiOlsiaGFzSXNzdWVyIiwibWFrZUR1cmFibGVJc3N1ZXJLaXQiLCJtYWtlSXNzdWVyS2l0IiwicHJlcGFyZUlzc3VlcktpdCIsInVwZ3JhZGVJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQsRmFpbCxhc3NlcnRQYXR0ZXJuLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxtYWtlRHVyYWJsZVpvbmUsQXNzZXRLaW5kLGFzc2VydEFzc2V0S2luZCxjb2VyY2VEaXNwbGF5SW5mbyxwcmVwYXJlUGF5bWVudExlZGdlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvbmUvZHVyYWJsZS5qc1wiLCBbW1wibWFrZUR1cmFibGVab25lXCIsWyRozY9fYSA9PiAobWFrZUR1cmFibGVab25lID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBc3NldEtpbmRcIixbJGjNj19hID0+IChBc3NldEtpbmQgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0QXNzZXRLaW5kXCIsWyRozY9fYSA9PiAoYXNzZXJ0QXNzZXRLaW5kID0gJGjNj19hKV1dXV0sW1wiLi9kaXNwbGF5SW5mby5qc1wiLCBbW1wiY29lcmNlRGlzcGxheUluZm9cIixbJGjNj19hID0+IChjb2VyY2VEaXNwbGF5SW5mbyA9ICRozY9fYSldXV1dLFtcIi4vcGF5bWVudExlZGdlci5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRMZWRnZXJcIixbJGjNj19hID0+IChwcmVwYXJlUGF5bWVudExlZGdlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc2V0dXBJc3N1ZXJLaXQgPSAoXG57IG5hbWUsIGFzc2V0S2luZCwgZGlzcGxheUluZm8sIGVsZW1lbnRTaGFwZSB9LFxuaXNzdWVyWm9uZSxcbnJlY292ZXJ5U2V0c1N0YXRlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCkgPT5cbntcbiAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gIGFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuXG4gIC8vXG4gIGNvbnN0IGNsZWFuRGlzcGxheUluZm8gPSBjb2VyY2VEaXNwbGF5SW5mbyhkaXNwbGF5SW5mbywgYXNzZXRLaW5kKTtcbiAgaWYgKG9wdFNodXRkb3duV2l0aEZhaWx1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwgJ2Z1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAoZWxlbWVudFNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gIH1cblxuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8vXG4gIGNvbnN0IHsgaXNzdWVyLCBtaW50LCBicmFuZCwgbWludFJlY292ZXJ5UHVyc2UgfSA9IHByZXBhcmVQYXltZW50TGVkZ2VyKFxuICAgIGlzc3VlclpvbmUsXG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgY2xlYW5EaXNwbGF5SW5mbyxcbiAgICBlbGVtZW50U2hhcGUsXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZVxuICApO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGJyYW5kLFxuICAgIGlzc3VlcixcbiAgICBtaW50LFxuICAgIG1pbnRSZWNvdmVyeVB1cnNlLFxuICAgIGRpc3BsYXlJbmZvOiBjbGVhbkRpc3BsYXlJbmZvXG4gIH0pO1xufTtcbmhhcmRlbihzZXR1cElzc3VlcktpdCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IElOU1RBTkNFX0tFWSA9ICdpc3N1ZXInO1xuLypcblxuXG5cbiAqL1xuY29uc3QgUkVDT1ZFUllfU0VUU19TVEFURSA9ICdyZWNvdmVyeVNldHNTdGF0ZSc7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHVwZ3JhZGVJc3N1ZXJLaXQgPSAoXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbnJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCkgPT5cbntcbiAgY29uc3QgaXNzdWVyUmVjb3JkID0gaXNzdWVyQmFnZ2FnZS5nZXQoSU5TVEFOQ0VfS0VZKTtcbiAgY29uc3QgaXNzdWVyWm9uZSA9IG1ha2VEdXJhYmxlWm9uZShpc3N1ZXJCYWdnYWdlKTtcbiAgY29uc3Qgb2xkUmVjb3ZlcnlTZXRzU3RhdGUgPSBpc3N1ZXJCYWdnYWdlLmhhcyhSRUNPVkVSWV9TRVRTX1NUQVRFKSA/XG4gIGlzc3VlckJhZ2dhZ2UuZ2V0KFJFQ09WRVJZX1NFVFNfU1RBVEUpIDpcbiAgJ2hhc1JlY292ZXJ5U2V0cyc7XG4gIGlmIChcbiAgb2xkUmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cycgJiZcbiAgcmVjb3ZlcnlTZXRzT3B0aW9uID09PSAnaGFzUmVjb3ZlcnlTZXRzJylcbiAge1xuICAgIEZhaWxgQ2Fubm90ICh5ZXQ/KSB1cGdyYWRlIGZyb20gJ25vUmVjb3ZlcnlTZXRzJyB0byAnaGFzUmVjb3ZlcnlTZXRzJ2A7XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgcmVjb3ZlcnlTZXRzU3RhdGUgPSByZWNvdmVyeVNldHNPcHRpb24gfHwgb2xkUmVjb3ZlcnlTZXRzU3RhdGU7XG4gIHJldHVybiBzZXR1cElzc3VlcktpdChcbiAgICBpc3N1ZXJSZWNvcmQsXG4gICAgaXNzdWVyWm9uZSxcbiAgICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlXG4gICk7XG59OyRozY9fb25jZS51cGdyYWRlSXNzdWVyS2l0KHVwZ3JhZGVJc3N1ZXJLaXQpO1xuaGFyZGVuKHVwZ3JhZGVJc3N1ZXJLaXQpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBoYXNJc3N1ZXIgPSAoYmFnZ2FnZSkgPT4gYmFnZ2FnZS5oYXMoSU5TVEFOQ0VfS0VZKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmhhc0lzc3VlcihoYXNJc3N1ZXIpO1xuY29uc3QgbWFrZUR1cmFibGVJc3N1ZXJLaXQgPSAoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbi8vXG5hc3NldEtpbmQgPSBBc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm8gPSBoYXJkZW4oe30pLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbnsgZWxlbWVudFNoYXBlID0gdW5kZWZpbmVkLCByZWNvdmVyeVNldHNPcHRpb24gPSB1bmRlZmluZWQgfSA9IHt9KSA9Plxue1xuICBjb25zdCBpc3N1ZXJEYXRhID0gaGFyZGVuKHtcbiAgICBuYW1lLFxuICAgIGFzc2V0S2luZCxcbiAgICBkaXNwbGF5SW5mbyxcbiAgICBlbGVtZW50U2hhcGVcbiAgfSk7XG4gIGlzc3VlckJhZ2dhZ2UuaW5pdChJTlNUQU5DRV9LRVksIGlzc3VlckRhdGEpO1xuICBjb25zdCBpc3N1ZXJab25lID0gbWFrZUR1cmFibGVab25lKGlzc3VlckJhZ2dhZ2UpO1xuICBjb25zdCByZWNvdmVyeVNldHNTdGF0ZSA9IHJlY292ZXJ5U2V0c09wdGlvbiB8fCAnaGFzUmVjb3ZlcnlTZXRzJztcbiAgaXNzdWVyQmFnZ2FnZS5pbml0KFJFQ09WRVJZX1NFVFNfU1RBVEUsIHJlY292ZXJ5U2V0c1N0YXRlKTtcbiAgcmV0dXJuIHNldHVwSXNzdWVyS2l0KFxuICAgIGlzc3VlckRhdGEsXG4gICAgaXNzdWVyWm9uZSxcbiAgICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlXG4gICk7XG59OyRozY9fb25jZS5tYWtlRHVyYWJsZUlzc3VlcktpdChtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByZXBhcmVJc3N1ZXJLaXQgPSAoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbi8vXG5hc3NldEtpbmQgPSBBc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm8gPSBoYXJkZW4oe30pLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbi8vXG5vcHRpb25zID0ge30pID0+XG57XG4gIGlmIChoYXNJc3N1ZXIoaXNzdWVyQmFnZ2FnZSkpIHtcbiAgICBjb25zdCB7IGVsZW1lbnRTaGFwZTogXyA9IHVuZGVmaW5lZCwgcmVjb3ZlcnlTZXRzT3B0aW9uID0gdW5kZWZpbmVkIH0gPVxuICAgIG9wdGlvbnM7XG4gICAgY29uc3QgaXNzdWVyS2l0ID0gdXBncmFkZUlzc3VlcktpdChcbiAgICAgIGlzc3VlckJhZ2dhZ2UsXG4gICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICAgICAgcmVjb3ZlcnlTZXRzT3B0aW9uXG4gICAgKTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cblxuICAgIC8vXG4gICAgcmV0dXJuIGlzc3VlcktpdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpc3N1ZXJLaXQgPSBtYWtlRHVyYWJsZUlzc3VlcktpdChcbiAgICAgIGlzc3VlckJhZ2dhZ2UsXG4gICAgICBuYW1lLFxuICAgICAgYXNzZXRLaW5kLFxuICAgICAgZGlzcGxheUluZm8sXG4gICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICAgICAgb3B0aW9uc1xuICAgICk7XG4gICAgLy9cbiAgICByZXR1cm4gaXNzdWVyS2l0O1xuICB9XG59OyRozY9fb25jZS5wcmVwYXJlSXNzdWVyS2l0KHByZXBhcmVJc3N1ZXJLaXQpO1xuaGFyZGVuKHByZXBhcmVJc3N1ZXJLaXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUlzc3VlcktpdCA9IChcbm5hbWUsXG4vL1xuYXNzZXRLaW5kID0gQXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvID0gaGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4vL1xueyBlbGVtZW50U2hhcGUgPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID0ge30pID0+XG5cbi8vXG5tYWtlRHVyYWJsZUlzc3VlcktpdChcbiAgbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLCB7IGR1cmFibGU6IHRydWUgfSksXG4gIG5hbWUsXG4gIGFzc2V0S2luZCxcbiAgZGlzcGxheUluZm8sXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gIHsgZWxlbWVudFNoYXBlLCByZWNvdmVyeVNldHNPcHRpb24gfVxuKTskaM2PX29uY2UubWFrZUlzc3VlcktpdChtYWtlSXNzdWVyS2l0KTtcbmhhcmRlbihtYWtlSXNzdWVyS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InVwZ3JhZGVJc3N1ZXJLaXQiOlsidXBncmFkZUlzc3VlcktpdCJdLCJoYXNJc3N1ZXIiOlsiaGFzSXNzdWVyIl0sIm1ha2VEdXJhYmxlSXNzdWVyS2l0IjpbIm1ha2VEdXJhYmxlSXNzdWVyS2l0Il0sInByZXBhcmVJc3N1ZXJLaXQiOlsicHJlcGFyZUlzc3VlcktpdCJdLCJtYWtlSXNzdWVyS2l0IjpbIm1ha2VJc3N1ZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAI9K3KA4GAAAOBgAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGtleUVRLG1ha2VDb3B5QmFnLG11c3RNYXRjaCxNLGdldENvcHlCYWdFbnRyaWVzLGJhZ0lzU3VwZXJiYWcsYmFnVW5pb24sYmFnRGlzam9pbnRTdWJ0cmFjdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlCYWdcIixbJGjNj19hID0+IChtYWtlQ29weUJhZyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIixbJGjNj19hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRozY9fYSldXSxbXCJiYWdJc1N1cGVyYmFnXCIsWyRozY9fYSA9PiAoYmFnSXNTdXBlcmJhZyA9ICRozY9fYSldXSxbXCJiYWdVbmlvblwiLFskaM2PX2EgPT4gKGJhZ1VuaW9uID0gJGjNj19hKV1dLFtcImJhZ0Rpc2pvaW50U3VidHJhY3RcIixbJGjNj19hID0+IChiYWdEaXNqb2ludFN1YnRyYWN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBlbXB0eSA9IG1ha2VDb3B5QmFnKFtdKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb3B5QmFnTWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogKGJhZykgPT4ge1xuICAgIG11c3RNYXRjaChiYWcsIE0uYmFnKCksICdiYWcgb2YgYW1vdW50Jyk7XG4gICAgcmV0dXJuIGJhZztcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IChiYWcpID0+IGdldENvcHlCYWdFbnRyaWVzKGJhZykubGVuZ3RoID09PSAwLFxuICBkb0lzR1RFOiBiYWdJc1N1cGVyYmFnLFxuICBkb0lzRXF1YWw6IGtleUVRLFxuICBkb0FkZDogYmFnVW5pb24sXG4gIGRvU3VidHJhY3Q6IGJhZ0Rpc2pvaW50U3VidHJhY3Rcbn0pOyRozY9fb25jZS5jb3B5QmFnTWF0aEhlbHBlcnMoY29weUJhZ01hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlCYWdNYXRoSGVscGVycyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAST/JVcwFAADMBQAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGtleUVRLG1ha2VDb3B5U2V0LG11c3RNYXRjaCxNLGdldENvcHlTZXRLZXlzLHNldElzU3VwZXJzZXQsc2V0RGlzam9pbnRVbmlvbixzZXREaXNqb2ludFN1YnRyYWN0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dLFtcInNldElzU3VwZXJzZXRcIixbJGjNj19hID0+IChzZXRJc1N1cGVyc2V0ID0gJGjNj19hKV1dLFtcInNldERpc2pvaW50VW5pb25cIixbJGjNj19hID0+IChzZXREaXNqb2ludFVuaW9uID0gJGjNj19hKV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIixbJGjNj19hID0+IChzZXREaXNqb2ludFN1YnRyYWN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGVtcHR5ID0gbWFrZUNvcHlTZXQoW10pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY29weVNldE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IChzZXQpID0+IHtcbiAgICBtdXN0TWF0Y2goc2V0LCBNLnNldCgpLCAnc2V0IG9mIGFtb3VudCcpO1xuICAgIHJldHVybiBzZXQ7XG4gIH0sXG4gIGRvTWFrZUVtcHR5OiAoKSA9PiBlbXB0eSxcbiAgZG9Jc0VtcHR5OiAoc2V0KSA9PiBnZXRDb3B5U2V0S2V5cyhzZXQpLmxlbmd0aCA9PT0gMCxcbiAgZG9Jc0dURTogc2V0SXNTdXBlcnNldCxcbiAgZG9Jc0VxdWFsOiBrZXlFUSxcbiAgZG9BZGQ6IHNldERpc2pvaW50VW5pb24sXG4gIGRvU3VidHJhY3Q6IHNldERpc2pvaW50U3VidHJhY3Rcbn0pOyRozY9fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlTZXRNYXRoSGVscGVycyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAExElqrcEAAC3BAAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJuYXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTmF0LGlzTmF0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dLFtcImlzTmF0XCIsWyRozY9fYSA9PiAoaXNOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgZW1wdHkgPSAwbjtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbmF0TWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogKG5hdCkgPT4ge1xuICAgIC8vXG4gICAgYXNzZXJ0LnR5cGVvZihuYXQsICdiaWdpbnQnKTtcbiAgICBpc05hdChuYXQpIHx8IEZhaWxgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmA7XG4gICAgcmV0dXJuIE5hdChuYXQpO1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogKG5hdCkgPT4gbmF0ID09PSBlbXB0eSxcbiAgZG9Jc0dURTogKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ID49IHJpZ2h0LFxuICBkb0lzRXF1YWw6IChsZWZ0LCByaWdodCkgPT4gbGVmdCA9PT0gcmlnaHQsXG4gIC8vXG4gIGRvQWRkOiAobGVmdCwgcmlnaHQpID0+IGxlZnQgKyByaWdodCxcbiAgZG9TdWJ0cmFjdDogKGxlZnQsIHJpZ2h0KSA9PiBOYXQobGVmdCAtIHJpZ2h0KVxufSk7JGjNj19vbmNlLm5hdE1hdGhIZWxwZXJzKG5hdE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIvD1yOUBgAAlAYAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJzZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGFzc2VydEtleSxlbGVtZW50c0lzU3VwZXJzZXQsZWxlbWVudHNEaXNqb2ludFVuaW9uLGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCxjb2VyY2VUb0VsZW1lbnRzLGVsZW1lbnRzQ29tcGFyZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsWyRozY9fYSA9PiAoZWxlbWVudHNJc1N1cGVyc2V0ID0gJGjNj19hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLFskaM2PX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRVbmlvbiA9ICRozY9fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIixbJGjNj19hID0+IChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QgPSAkaM2PX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLFskaM2PX2EgPT4gKGNvZXJjZVRvRWxlbWVudHMgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsWyRozY9fYSA9PiAoZWxlbWVudHNDb21wYXJlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZW1wdHkgPSBoYXJkZW4oW10pO1xuXG4vKlxuXG5cbiAqL1xuY29uc3Qgc2V0TWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogKGxpc3QpID0+IHtcbiAgICBsaXN0ID0gY29lcmNlVG9FbGVtZW50cyhsaXN0KTtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGFzc2VydEtleShsaXN0KTtcbiAgICByZXR1cm4gbGlzdDtcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IChsaXN0KSA9PiBwYXNzU3R5bGVPZihsaXN0KSA9PT0gJ2NvcHlBcnJheScgJiYgbGlzdC5sZW5ndGggPT09IDAsXG4gIGRvSXNHVEU6IGVsZW1lbnRzSXNTdXBlcnNldCxcbiAgZG9Jc0VxdWFsOiAoeCwgeSkgPT4gZWxlbWVudHNDb21wYXJlKHgsIHkpID09PSAwLFxuICBkb0FkZDogZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuICBkb1N1YnRyYWN0OiBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3Rcbn0pOyRozY9fb25jZS5zZXRNYXRoSGVscGVycyhzZXRNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRNYXRoSGVscGVycyI6WyJzZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAw8Vd8wAMAAMADAAAjAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbInByZXBhcmVQYXltZW50S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGluaXRFbXB0eTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLFskaM2PX2EgPT4gKGluaXRFbXB0eSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLy9cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByZXBhcmVQYXltZW50S2luZCA9IChpc3N1ZXJab25lLCBuYW1lLCBicmFuZCwgUGF5bWVudEkpID0+IHtcbiAgY29uc3QgbWFrZVBheW1lbnQgPSBpc3N1ZXJab25lLmV4b0NsYXNzKFxuICAgIGAke25hbWV9IHBheW1lbnRgLFxuICAgIFBheW1lbnRJLFxuICAgIGluaXRFbXB0eSxcbiAgICB7XG4gICAgICBnZXRBbGxlZ2VkQnJhbmQoKSB7XG4gICAgICAgIHJldHVybiBicmFuZDtcbiAgICAgIH1cbiAgICB9XG4gICk7XG4gIC8vXG4gIHJldHVybiBtYWtlUGF5bWVudDtcbn07JGjNj19vbmNlLnByZXBhcmVQYXltZW50S2luZChwcmVwYXJlUGF5bWVudEtpbmQpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50S2luZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUGF5bWVudEtpbmQiOlsicHJlcGFyZVBheW1lbnRLaW5kIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADcdHkhRJQAAUSUAACkAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudExlZGdlci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBhZ29yaWMvc3RvcmUiLCIuL2Ftb3VudE1hdGguanMiLCIuL3BheW1lbnQuanMiLCIuL3B1cnNlLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHEsRmFpbCxhbm5vdGF0ZUVycm9yLGlzUHJvbWlzZSxtdXN0TWF0Y2gsTSxrZXlFUSxBbW91bnRNYXRoLHByZXBhcmVQYXltZW50S2luZCxwcmVwYXJlUHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiLi9wYXltZW50LmpzXCIsIFtbXCJwcmVwYXJlUGF5bWVudEtpbmRcIixbJGjNj19hID0+IChwcmVwYXJlUGF5bWVudEtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL3B1cnNlLmpzXCIsIFtbXCJwcmVwYXJlUHVyc2VLaW5kXCIsWyRozY9fYSA9PiAocHJlcGFyZVB1cnNlS2luZCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQnJhbmRJXCIsWyRozY9fYSA9PiAoQnJhbmRJID0gJGjNj19hKV1dLFtcIm1ha2VJc3N1ZXJJbnRlcmZhY2VzXCIsWyRozY9fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUgPSAoYnJhbmQsIGFzc2V0S2luZCwgZWxlbWVudFNoYXBlKSA9PiB7XG4gIGxldCB2YWx1ZVNoYXBlO1xuICBzd2l0Y2ggKGFzc2V0S2luZCkge1xuICAgIGNhc2UgJ25hdCc6e1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5uYXQoKTtcbiAgICAgICAgZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBGdW5naWJsZSBhc3NldHMgY2Fubm90IGhhdmUgYW4gZWxlbWVudFNoYXBlOiAke3EoZWxlbWVudFNoYXBlKX1gO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlICdzZXQnOntcbiAgICAgICAgaWYgKGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWVTaGFwZSA9IE0uYXJyYXlPZihNLmtleSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZVNoYXBlID0gTS5hcnJheU9mKE0uYW5kKE0ua2V5KCksIGVsZW1lbnRTaGFwZSkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNhc2UgJ2NvcHlTZXQnOntcbiAgICAgICAgaWYgKGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWVTaGFwZSA9IE0uc2V0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWVTaGFwZSA9IE0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjYXNlICdjb3B5QmFnJzp7XG4gICAgICAgIGlmIChlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhbHVlU2hhcGUgPSBNLmJhZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlU2hhcGUgPSBNLmJhZ09mKGVsZW1lbnRTaGFwZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgZGVmYXVsdDp7XG4gICAgICAgIEZhaWxgdW5leHBlY3RlZCBhc3NldCBraW5kICR7cShhc3NldEtpbmQpfWA7XG4gICAgICB9XG4gIH1cblxuICBjb25zdCBhbW91bnRTaGFwZSA9IGhhcmRlbih7XG4gICAgYnJhbmQsIC8vXG4gICAgdmFsdWU6IHZhbHVlU2hhcGVcbiAgfSk7XG4gIHJldHVybiBhbW91bnRTaGFwZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByZXBhcmVQYXltZW50TGVkZ2VyID0gKFxuaXNzdWVyWm9uZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbmVsZW1lbnRTaGFwZSxcbnJlY292ZXJ5U2V0c1N0YXRlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCkgPT5cbntcbiAgLyogICAgICAgICAgICAgICAgICAgKi9cbiAgLy9cbiAgY29uc3QgYnJhbmQgPSBpc3N1ZXJab25lLmV4byhgJHtuYW1lfSBicmFuZGAsIEJyYW5kSSwge1xuICAgIGlzTXlJc3N1ZXIoYWxsZWdlZElzc3Vlcikge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBhbGxlZ2VkSXNzdWVyID09PSBpc3N1ZXI7XG4gICAgfSxcbiAgICBnZXRBbGxlZ2VkTmFtZSgpIHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH0sXG4gICAgLy9cbiAgICBnZXREaXNwbGF5SW5mbygpIHtcbiAgICAgIHJldHVybiBkaXNwbGF5SW5mbztcbiAgICB9LFxuICAgIGdldEFtb3VudFNoYXBlKCkge1xuICAgICAgcmV0dXJuIGFtb3VudFNoYXBlO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgYW1vdW50U2hhcGUgPSBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG4gICAgYnJhbmQsXG4gICAgYXNzZXRLaW5kLFxuICAgIGVsZW1lbnRTaGFwZVxuICApO1xuXG4gIGNvbnN0IHsgSXNzdWVySSwgTWludEksIFBheW1lbnRJLCBQdXJzZUlLaXQgfSA9IG1ha2VJc3N1ZXJJbnRlcmZhY2VzKFxuICAgIGJyYW5kLFxuICAgIGFzc2V0S2luZCxcbiAgICBhbW91bnRTaGFwZVxuICApO1xuXG4gIGNvbnN0IG1ha2VQYXltZW50ID0gcHJlcGFyZVBheW1lbnRLaW5kKGlzc3VlclpvbmUsIG5hbWUsIGJyYW5kLCBQYXltZW50SSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlID0gKHJlYXNvbikgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAob3B0U2h1dGRvd25XaXRoRmFpbHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlKHJlYXNvbik7XG4gICAgICB9IGNhdGNoIChlcnJJblNodXRkb3duKSB7XG4gICAgICAgIGFubm90YXRlRXJyb3IoZXJySW5TaHV0ZG93biwgWGBDYXVzZWQgYnk6ICR7cmVhc29ufWApO1xuICAgICAgICB0aHJvdyBlcnJJblNodXRkb3duO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyByZWFzb247XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcGF5bWVudExlZGdlciA9IGlzc3VlclpvbmUud2Vha01hcFN0b3JlKCdwYXltZW50TGVkZ2VyJywge1xuICAgIHZhbHVlU2hhcGU6IGFtb3VudFNoYXBlXG4gIH0pO1xuXG4gIC8qXG4gIFxuICBcbiAgXG4gIFxuICBcbiAgXG4gICAgICovXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICBjb25zdCBwYXltZW50UmVjb3ZlcnlTZXRzID0gaXNzdWVyWm9uZS53ZWFrTWFwU3RvcmUoJ3BheW1lbnRSZWNvdmVyeVNldHMnKTtcblxuICAvKlxuICBcbiAgXG4gICAqL1xuXG5cblxuXG4gIGNvbnN0IGluaXRQYXltZW50ID0gKHBheW1lbnQsIGFtb3VudCwgb3B0UmVjb3ZlcnlTZXQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAocmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cycpIHtcbiAgICAgIG9wdFJlY292ZXJ5U2V0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgIEZhaWxgd2hlbiByZWNvdmVyU2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnLCBvcHRSZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcbiAgICB9XG4gICAgaWYgKG9wdFJlY292ZXJ5U2V0ICE9PSB1bmRlZmluZWQgJiYgIUFtb3VudE1hdGguaXNFbXB0eShhbW91bnQpKSB7XG4gICAgICBvcHRSZWNvdmVyeVNldC5hZGQocGF5bWVudCk7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzLmluaXQocGF5bWVudCwgb3B0UmVjb3ZlcnlTZXQpO1xuICAgIH1cbiAgICBwYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCwgYW1vdW50KTtcbiAgfTtcblxuICAvKlxuICBcbiAgICAqL1xuXG5cblxuICBjb25zdCBkZWxldGVQYXltZW50ID0gKHBheW1lbnQpID0+IHtcbiAgICBwYXltZW50TGVkZ2VyLmRlbGV0ZShwYXltZW50KTtcbiAgICBpZiAocGF5bWVudFJlY292ZXJ5U2V0cy5oYXMocGF5bWVudCkpIHtcbiAgICAgIGNvbnN0IHJlY292ZXJ5U2V0ID0gcGF5bWVudFJlY292ZXJ5U2V0cy5nZXQocGF5bWVudCk7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzLmRlbGV0ZShwYXltZW50KTtcbiAgICAgIHJlY292ZXJ5U2V0LmRlbGV0ZShwYXltZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNvZXJjZSA9IChhbGxlZ2VkQW1vdW50KSA9PiBBbW91bnRNYXRoLmNvZXJjZShicmFuZCwgYWxsZWdlZEFtb3VudCk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuICAvKlxuICBcbiAgXG4gIFxuICAgKi9cblxuXG5cblxuXG5cbiAgY29uc3QgYXNzZXJ0QW1vdW50Q29uc2lzdGVudCA9IChwYXltZW50QmFsYW5jZSwgb3B0QW1vdW50U2hhcGUpID0+IHtcbiAgICBpZiAob3B0QW1vdW50U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSwgJ2Ftb3VudCcpO1xuICAgIH1cbiAgfTtcblxuICAvKlxuICAgICAqL1xuXG5cbiAgY29uc3QgYXNzZXJ0TGl2ZVBheW1lbnQgPSAocGF5bWVudCkgPT4ge1xuICAgIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpIHx8XG4gICAgRmFpbGAke3BheW1lbnR9IHdhcyBub3QgYSBsaXZlIHBheW1lbnQgZm9yIGJyYW5kICR7cShcbiAgICAgIGJyYW5kXG4gICAgKX0uIEl0IGNvdWxkIGJlIGEgdXNlZC11cCBwYXltZW50LCBhIHBheW1lbnQgZm9yIGFub3RoZXIgYnJhbmQsIG9yIGl0IG1pZ2h0IG5vdCBiZSBhIHBheW1lbnQgYXQgYWxsLmA7XG4gIH07XG5cbiAgLypcbiAgXG4gIFxuICAgKi9cblxuXG5cblxuICBjb25zdCBkZXBvc2l0SW50ZXJuYWwgPSAoXG4gIGJhbGFuY2VTdG9yZSxcbiAgc3JjUGF5bWVudCxcbiAgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQpID0+XG4gIHtcbiAgICAhaXNQcm9taXNlKHNyY1BheW1lbnQpIHx8XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBgZGVwb3NpdCBkb2VzIG5vdCBhY2NlcHQgcHJvbWlzZXMgYXMgZmlyc3QgYXJndW1lbnQuIEluc3RlYWQgb2YgcGFzc2luZyB0aGUgcHJvbWlzZSAoZGVwb3NpdChwYXltZW50UHJvbWlzZSkpLCBjb25zaWRlciB1bndyYXBwaW5nIHRoZSBwcm9taXNlIGZpcnN0OiBFLndoZW4ocGF5bWVudFByb21pc2UsIChhY3R1YWxQYXltZW50ID0+IGRlcG9zaXQoYWN0dWFsUGF5bWVudCkpYCxcbiAgICAgIFR5cGVFcnJvclxuICAgICk7XG4gICAgYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG4gICAgY29uc3Qgc3JjUGF5bWVudEJhbGFuY2UgPSBwYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbiAgICBhc3NlcnRBbW91bnRDb25zaXN0ZW50KHNyY1BheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSk7XG4gICAgdHJ5IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGRlbGV0ZVBheW1lbnQoc3JjUGF5bWVudCk7XG4gICAgICBiYWxhbmNlU3RvcmUuaW5jcmVtZW50KHNyY1BheW1lbnRCYWxhbmNlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuICB9O1xuXG4gIC8qXG4gIFxuICBcbiAgICovXG5cblxuXG5cbiAgY29uc3Qgd2l0aGRyYXdJbnRlcm5hbCA9IChiYWxhbmNlU3RvcmUsIGFtb3VudCwgcmVjb3ZlcnlTZXQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBhbW91bnQgPSBjb2VyY2UoYW1vdW50KTtcbiAgICBjb25zdCBwYXltZW50ID0gbWFrZVBheW1lbnQoKTtcbiAgICAvL1xuICAgIC8vXG4gICAgYmFsYW5jZVN0b3JlLmRlY3JlbWVudChhbW91bnQpIHx8XG4gICAgRmFpbGBXaXRoZHJhd2FsIG9mICR7YW1vdW50fSBmYWlsZWQgYmVjYXVzZSB0aGUgcHVyc2Ugb25seSBjb250YWluZWQgJHtiYWxhbmNlU3RvcmUuZ2V0QW1vdW50KCl9YDtcbiAgICB0cnkge1xuICAgICAgaW5pdFBheW1lbnQocGF5bWVudCwgYW1vdW50LCByZWNvdmVyeVNldCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBwYXltZW50O1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8vXG4gIGNvbnN0IG1ha2VFbXB0eVB1cnNlID0gcHJlcGFyZVB1cnNlS2luZChcbiAgICBpc3N1ZXJab25lLFxuICAgIG5hbWUsXG4gICAgYXNzZXRLaW5kLFxuICAgIGJyYW5kLFxuICAgIFB1cnNlSUtpdCxcbiAgICBoYXJkZW4oe1xuICAgICAgZGVwb3NpdEludGVybmFsLFxuICAgICAgd2l0aGRyYXdJbnRlcm5hbFxuICAgIH0pLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIHBheW1lbnRSZWNvdmVyeVNldHNcbiAgKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgKi9cbiAgLy9cbiAgY29uc3QgaXNzdWVyID0gaXNzdWVyWm9uZS5leG8oYCR7bmFtZX0gaXNzdWVyYCwgSXNzdWVySSwge1xuICAgIGdldEJyYW5kKCkge1xuICAgICAgcmV0dXJuIGJyYW5kO1xuICAgIH0sXG4gICAgZ2V0QWxsZWdlZE5hbWUoKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIGdldEFzc2V0S2luZCgpIHtcbiAgICAgIHJldHVybiBhc3NldEtpbmQ7XG4gICAgfSxcbiAgICBnZXREaXNwbGF5SW5mbygpIHtcbiAgICAgIHJldHVybiBkaXNwbGF5SW5mbztcbiAgICB9LFxuICAgIG1ha2VFbXB0eVB1cnNlKCkge1xuICAgICAgcmV0dXJuIG1ha2VFbXB0eVB1cnNlKCk7XG4gICAgfSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBpc0xpdmUocGF5bWVudCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KTtcbiAgICB9LFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGdldEFtb3VudE9mKHBheW1lbnQpIHtcbiAgICAgIC8vXG4gICAgICBhc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbiAgICAgIHJldHVybiBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiAgICB9LFxuICAgIC8qXG4gICAgICAgKi9cblxuXG4gICAgYnVybihwYXltZW50LCBvcHRBbW91bnRTaGFwZSA9IHVuZGVmaW5lZCkge1xuICAgICAgLy9cbiAgICAgIGFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xuICAgICAgY29uc3QgcGF5bWVudEJhbGFuY2UgPSBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiAgICAgIGFzc2VydEFtb3VudENvbnNpc3RlbnQocGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vXG4gICAgICAgIGRlbGV0ZVBheW1lbnQocGF5bWVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF5bWVudEJhbGFuY2U7XG4gICAgfVxuICB9KTtcblxuICAvKlxuICBcbiAgICAgKi9cblxuXG5cblxuICBjb25zdCBtaW50UmVjb3ZlcnlQdXJzZSA9IC8qICAgICAgICAgICAgICAgICAgICovKFxuICBpc3N1ZXJab25lLm1ha2VPbmNlKCdtaW50UmVjb3ZlcnlQdXJzZScsICgpID0+IG1ha2VFbXB0eVB1cnNlKCkpXG4gICk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtaW50ID0gaXNzdWVyWm9uZS5leG8oYCR7bmFtZX0gbWludGAsIE1pbnRJLCB7XG4gICAgZ2V0SXNzdWVyKCkge1xuICAgICAgcmV0dXJuIGlzc3VlcjtcbiAgICB9LFxuICAgIG1pbnRQYXltZW50KG5ld0Ftb3VudCkge1xuICAgICAgbmV3QW1vdW50ID0gY29lcmNlKG5ld0Ftb3VudCk7XG4gICAgICBtdXN0TWF0Y2gobmV3QW1vdW50LCBhbW91bnRTaGFwZSwgJ21pbnRlZCBhbW91bnQnKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgcmF3UGF5bWVudCA9IG1ha2VQYXltZW50KCk7XG4gICAgICBpbml0UGF5bWVudChyYXdQYXltZW50LCBuZXdBbW91bnQsIHVuZGVmaW5lZCk7XG5cbiAgICAgIGNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlQmVmb3JlID0gbWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xuICAgICAgbWludFJlY292ZXJ5UHVyc2UuZGVwb3NpdChyYXdQYXltZW50LCBuZXdBbW91bnQpO1xuICAgICAgY29uc3QgcGF5bWVudCA9IG1pbnRSZWNvdmVyeVB1cnNlLndpdGhkcmF3KG5ld0Ftb3VudCk7XG4gICAgICBjb25zdCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyID0gbWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xuICAgICAgYXNzZXJ0KGtleUVRKG1pbnRSZWNvdmVyeVB1cnNlQmVmb3JlLCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyKSk7XG4gICAgICByZXR1cm4gcGF5bWVudDtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGlzc3VlcktpdCA9IGhhcmRlbih7IGlzc3VlciwgbWludCwgYnJhbmQsIG1pbnRSZWNvdmVyeVB1cnNlIH0pO1xuICByZXR1cm4gaXNzdWVyS2l0O1xufTskaM2PX29uY2UucHJlcGFyZVBheW1lbnRMZWRnZXIocHJlcGFyZVBheW1lbnRMZWRnZXIpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50TGVkZ2VyIjpbInByZXBhcmVQYXltZW50TGVkZ2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACYHq7jmFAAA5hQAACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcHVyc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIi4vYW1vdW50TWF0aC5qcyIsIi4vdHJhbnNpZW50Tm90aWZpZXIuanMiLCIuL2Ftb3VudFN0b3JlLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVB1cnNlS2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTSxtYWtlQ29weVNldCxBbW91bnRNYXRoLG1ha2VUcmFuc2llbnROb3RpZmllcktpdCxtYWtlQW1vdW50U3RvcmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlTZXRcIixbJGjNj19hID0+IChtYWtlQ29weVNldCA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzXCIsIFtbXCJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXRcIixbJGjNj19hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudFN0b3JlLmpzXCIsIFtbXCJtYWtlQW1vdW50U3RvcmVcIixbJGjNj19hID0+IChtYWtlQW1vdW50U3RvcmUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IEVNUFRZX0NPUFlfU0VUID0gbWFrZUNvcHlTZXQoW10pO1xuXG4vL1xuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByZXBhcmVQdXJzZUtpbmQgPSAoXG5pc3N1ZXJab25lLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxucHVyc2VNZXRob2RzLFxucmVjb3ZlcnlTZXRzU3RhdGUsXG5wYXltZW50UmVjb3ZlcnlTZXRzKSA9Plxue1xuICBjb25zdCBhbW91bnRTaGFwZSA9IGJyYW5kLmdldEFtb3VudFNoYXBlKCk7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgeyBwcm92aWRlTm90aWZpZXIsIHVwZGF0ZTogdXBkYXRlQmFsYW5jZSB9ID0gbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KCk7XG5cbiAgLypcbiAgXG4gIFxuICBcbiAgICAqL1xuXG5cblxuXG5cblxuXG4gIGNvbnN0IG1heWJlUmVjb3ZlcnlTZXQgPSAoc3RhdGUpID0+IHtcbiAgICBjb25zdCB7IHJlY292ZXJ5U2V0IH0gPSBzdGF0ZTtcbiAgICBpZiAocmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdoYXNSZWNvdmVyeVNldHMnKSB7XG4gICAgICByZXR1cm4gcmVjb3ZlcnlTZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnIHx8XG4gICAgICBGYWlsYHJlY292ZXJTZXRzU3RhdGUgbXVzdCBiZSBub1JlY292ZXJ5U2V0cyBpZiBpdCBpc24ndCBoYXNSZWNvdmVyU2V0c2A7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIEZhaWxgcGF5bWVudFJlY292ZXJ5U2V0cyBtdXN0IGFsd2F5cyBiZSBkZWZpbmVkYDtcbiAgICAgIHJlY292ZXJ5U2V0LmdldFNpemUoKSA9PT0gMCB8fFxuICAgICAgRmFpbGBXaXRoIG5vUmVjb3ZlcnlTZXRzLCByZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgeyBkZXBvc2l0SW50ZXJuYWwsIHdpdGhkcmF3SW50ZXJuYWwgfSA9IHB1cnNlTWV0aG9kcztcbiAgY29uc3QgbWFrZVB1cnNlS2l0ID0gaXNzdWVyWm9uZS5leG9DbGFzc0tpdChcbiAgICBgJHtuYW1lfSBQdXJzZWAsXG4gICAgUHVyc2VJS2l0LFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRCYWxhbmNlID0gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG5cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCByZWNvdmVyeVNldCA9IGlzc3VlclpvbmUuZGV0YWNoZWQoKS5zZXRTdG9yZSgncmVjb3Zlcnkgc2V0Jyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbnRCYWxhbmNlLFxuICAgICAgICByZWNvdmVyeVNldFxuICAgICAgfTtcbiAgICB9LFxuICAgIHtcbiAgICAgIHB1cnNlOiB7XG4gICAgICAgIGRlcG9zaXQoc3JjUGF5bWVudCwgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IHB1cnNlIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICBjb25zdCBiYWxhbmNlU3RvcmUgPSBtYWtlQW1vdW50U3RvcmUoc3RhdGUsICdjdXJyZW50QmFsYW5jZScpO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3Qgc3JjUGF5bWVudEJhbGFuY2UgPSBkZXBvc2l0SW50ZXJuYWwoXG4gICAgICAgICAgICBiYWxhbmNlU3RvcmUsXG4gICAgICAgICAgICBzcmNQYXltZW50LFxuICAgICAgICAgICAgb3B0QW1vdW50U2hhcGVcbiAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZUJhbGFuY2UocHVyc2UsIGJhbGFuY2VTdG9yZS5nZXRBbW91bnQoKSk7XG4gICAgICAgICAgcmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuICAgICAgICB9LFxuICAgICAgICB3aXRoZHJhdyhhbW91bnQpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgcHVyc2UgfSA9IHRoaXMuZmFjZXRzO1xuXG4gICAgICAgICAgY29uc3Qgb3B0UmVjb3ZlcnlTZXQgPSBtYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbiAgICAgICAgICBjb25zdCBiYWxhbmNlU3RvcmUgPSBtYWtlQW1vdW50U3RvcmUoc3RhdGUsICdjdXJyZW50QmFsYW5jZScpO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgcGF5bWVudCA9IHdpdGhkcmF3SW50ZXJuYWwoXG4gICAgICAgICAgICBiYWxhbmNlU3RvcmUsXG4gICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICBvcHRSZWNvdmVyeVNldFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQmFsYW5jZShwdXJzZSwgYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpKTtcbiAgICAgICAgICByZXR1cm4gcGF5bWVudDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q3VycmVudEFtb3VudCgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2VTdG9yZSA9IG1ha2VBbW91bnRTdG9yZShzdGF0ZSwgJ2N1cnJlbnRCYWxhbmNlJyk7XG4gICAgICAgICAgcmV0dXJuIGJhbGFuY2VTdG9yZS5nZXRBbW91bnQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyKCkge1xuICAgICAgICAgIHJldHVybiBwcm92aWRlTm90aWZpZXIodGhpcy5mYWNldHMucHVyc2UpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRBbGxlZ2VkQnJhbmQoKSB7XG4gICAgICAgICAgcmV0dXJuIGJyYW5kO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldERlcG9zaXRGYWNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldFJlY292ZXJ5U2V0KCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3Qgb3B0UmVjb3ZlcnlTZXQgPSBtYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbiAgICAgICAgICBpZiAob3B0UmVjb3ZlcnlTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0NPUFlfU0VUO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb3B0UmVjb3ZlcnlTZXQuc25hcHNob3QoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVjb3ZlckFsbCgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgbGV0IGFtb3VudCA9IEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLCBhc3NldEtpbmQpO1xuICAgICAgICAgIGNvbnN0IG9wdFJlY292ZXJ5U2V0ID0gbWF5YmVSZWNvdmVyeVNldChzdGF0ZSk7XG4gICAgICAgICAgaWYgKG9wdFJlY292ZXJ5U2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQ7IC8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgcGF5bWVudCBvZiBvcHRSZWNvdmVyeVNldC5rZXlzKCkpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBmYWNldHMucHVyc2UuZGVwb3NpdChwYXltZW50KTtcbiAgICAgICAgICAgIGFtb3VudCA9IEFtb3VudE1hdGguYWRkKGFtb3VudCwgZGVsdGEsIGJyYW5kKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3B0UmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpID09PSAwIHx8XG4gICAgICAgICAgRmFpbGBpbnRlcm5hbDogUmVtYWluaW5nIHVucmVjb3ZlcmVkIHBheW1lbnRzOiAke2ZhY2V0cy5wdXJzZS5nZXRSZWNvdmVyeVNldCgpfWA7XG4gICAgICAgICAgcmV0dXJuIGFtb3VudDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlcG9zaXRGYWNldDoge1xuICAgICAgICByZWNlaXZlKC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgc3RhdGVTaGFwZToge1xuICAgICAgICBjdXJyZW50QmFsYW5jZTogYW1vdW50U2hhcGUsXG4gICAgICAgIHJlY292ZXJ5U2V0OiBNLnJlbW90YWJsZSgncmVjb3ZlcnlTZXQnKVxuICAgICAgfVxuICAgIH1cbiAgKTtcbiAgcmV0dXJuICgpID0+IG1ha2VQdXJzZUtpdCgpLnB1cnNlO1xufTskaM2PX29uY2UucHJlcGFyZVB1cnNlS2luZChwcmVwYXJlUHVyc2VLaW5kKTtcbmhhcmRlbihwcmVwYXJlUHVyc2VLaW5kKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQdXJzZUtpbmQiOlsicHJlcGFyZVB1cnNlS2luZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACzAL3AJQYAACUGAAAtAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9ub3RpZmllciJdLCJleHBvcnRzIjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUscHJvdmlkZUxhenksbWFrZU5vdGlmaWVyS2l0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLFskaM2PX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsWyRozY9fYSA9PiAobWFrZU5vdGlmaWVyS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vL1xuLy9cbmNvbnN0IG1ha2VUcmFuc2llbnROb3RpZmllcktpdCA9ICgpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB0cmFuc2llbnROb3RpZmVyS2l0cyA9IG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUoXG4gICAgJ3RyYW5zaWVudE5vdGlmZXJLaXRzJ1xuICApO1xuXG4gIGNvbnN0IHByb3ZpZGVOb3RpZmllcktpdCA9IChrZXkpID0+XG4gIHByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLCBrZXksICgpID0+XG4gIG1ha2VOb3RpZmllcktpdChrZXkuZ2V0Q3VycmVudEFtb3VudCgpKVxuICApO1xuXG4gIGNvbnN0IHByb3ZpZGVOb3RpZmllciA9IChrZXkpID0+IHByb3ZpZGVOb3RpZmllcktpdChrZXkpLm5vdGlmaWVyO1xuICBjb25zdCB1cGRhdGUgPSAoa2V5LCBuZXdWYWx1ZSkgPT4ge1xuICAgIGlmICh0cmFuc2llbnROb3RpZmVyS2l0cy5oYXMoa2V5KSkge1xuICAgICAgY29uc3QgeyB1cGRhdGVyIH0gPSB0cmFuc2llbnROb3RpZmVyS2l0cy5nZXQoa2V5KTtcbiAgICAgIHVwZGF0ZXIudXBkYXRlU3RhdGUobmV3VmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4geyBwcm92aWRlTm90aWZpZXIsIHVwZGF0ZSB9O1xufTskaM2PX29uY2UubWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG5oYXJkZW4obWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFuc2llbnROb3RpZmllcktpdCI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMtGF+dIZAADSGQAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiQW1vdW50UGF0dGVyblNoYXBlIiwiQW1vdW50U2hhcGUiLCJBc3NldEtpbmRTaGFwZSIsIkJyYW5kSSIsIkJyYW5kU2hhcGUiLCJEZXBvc2l0RmFjZXRTaGFwZSIsIkRpc3BsYXlJbmZvU2hhcGUiLCJJc3N1ZXJLaXRTaGFwZSIsIklzc3VlclNoYXBlIiwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIiwiTWludFNoYXBlIiwiTm90aWZpZXJTaGFwZSIsIlBheW1lbnRTaGFwZSIsIlB1cnNlU2hhcGUiLCJSYXRpb1NoYXBlIiwiaXNDb3B5QmFnVmFsdWUiLCJpc0NvcHlTZXRWYWx1ZSIsImlzTmF0VmFsdWUiLCJpc1NldFZhbHVlIiwibWFrZUlzc3VlckludGVyZmFjZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNLG1hdGNoZXMsZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZUd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXV1dXSk7XG5cblxuLypcblxuXG5cbiAqL1xuXG5jb25zdCBCcmFuZFNoYXBlID0gTS5yZW1vdGFibGUoJ0JyYW5kJyk7JGjNj19vbmNlLkJyYW5kU2hhcGUoQnJhbmRTaGFwZSk7XG5jb25zdCBJc3N1ZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdJc3N1ZXInKTskaM2PX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuY29uc3QgUGF5bWVudFNoYXBlID0gTS5yZW1vdGFibGUoJ1BheW1lbnQnKTskaM2PX29uY2UuUGF5bWVudFNoYXBlKFBheW1lbnRTaGFwZSk7XG5jb25zdCBQdXJzZVNoYXBlID0gTS5yZW1vdGFibGUoJ1B1cnNlJyk7JGjNj19vbmNlLlB1cnNlU2hhcGUoUHVyc2VTaGFwZSk7XG5jb25zdCBEZXBvc2l0RmFjZXRTaGFwZSA9IE0ucmVtb3RhYmxlKCdEZXBvc2l0RmFjZXQnKTskaM2PX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuY29uc3QgTm90aWZpZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdOb3RpZmllcicpOyRozY9fb25jZS5Ob3RpZmllclNoYXBlKE5vdGlmaWVyU2hhcGUpO1xuY29uc3QgTWludFNoYXBlID0gTS5yZW1vdGFibGUoJ01pbnQnKTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLk1pbnRTaGFwZShNaW50U2hhcGUpO1xuY29uc3QgTmF0VmFsdWVTaGFwZSA9IE0ubmF0KCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBDb3B5U2V0VmFsdWVTaGFwZSA9IE0uc2V0KCk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBTZXRWYWx1ZVNoYXBlID0gTS5hcnJheU9mKE0ua2V5KCkpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBDb3B5QmFnVmFsdWVTaGFwZSA9IE0uYmFnKCk7XG5cbmNvbnN0IEFtb3VudFZhbHVlU2hhcGUgPSBNLm9yKFxuICBOYXRWYWx1ZVNoYXBlLFxuICBDb3B5U2V0VmFsdWVTaGFwZSxcbiAgU2V0VmFsdWVTaGFwZSxcbiAgQ29weUJhZ1ZhbHVlU2hhcGVcbik7XG5cbmNvbnN0IEFtb3VudFNoYXBlID0geyBicmFuZDogQnJhbmRTaGFwZSwgdmFsdWU6IEFtb3VudFZhbHVlU2hhcGUgfTskaM2PX29uY2UuQW1vdW50U2hhcGUoQW1vdW50U2hhcGUpO1xuaGFyZGVuKEFtb3VudFNoYXBlKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgQW1vdW50UGF0dGVyblNoYXBlID0gTS5wYXR0ZXJuKCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuQW1vdW50UGF0dGVyblNoYXBlKEFtb3VudFBhdHRlcm5TaGFwZSk7XG5jb25zdCBSYXRpb1NoYXBlID0geyBudW1lcmF0b3I6IEFtb3VudFNoYXBlLCBkZW5vbWluYXRvcjogQW1vdW50U2hhcGUgfTskaM2PX29uY2UuUmF0aW9TaGFwZShSYXRpb1NoYXBlKTtcbmhhcmRlbihSYXRpb1NoYXBlKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc05hdFZhbHVlID0gKHZhbHVlKSA9PiBtYXRjaGVzKHZhbHVlLCBOYXRWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNOYXRWYWx1ZShpc05hdFZhbHVlKTtcbmhhcmRlbihpc05hdFZhbHVlKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc0NvcHlTZXRWYWx1ZSA9ICh2YWx1ZSkgPT4gbWF0Y2hlcyh2YWx1ZSwgQ29weVNldFZhbHVlU2hhcGUpOyRozY9fb25jZS5pc0NvcHlTZXRWYWx1ZShpc0NvcHlTZXRWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5U2V0VmFsdWUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzU2V0VmFsdWUgPSAodmFsdWUpID0+IG1hdGNoZXModmFsdWUsIFNldFZhbHVlU2hhcGUpOyRozY9fb25jZS5pc1NldFZhbHVlKGlzU2V0VmFsdWUpO1xuaGFyZGVuKGlzU2V0VmFsdWUpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGlzQ29weUJhZ1ZhbHVlID0gKHZhbHVlKSA9PiBtYXRjaGVzKHZhbHVlLCBDb3B5QmFnVmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzQ29weUJhZ1ZhbHVlKGlzQ29weUJhZ1ZhbHVlKTtcbmhhcmRlbihpc0NvcHlCYWdWYWx1ZSk7XG5cbi8vXG5jb25zdCBNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMgPSAxMDA7JGjNj19vbmNlLk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyhNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpO1xuXG5jb25zdCBBc3NldEtpbmRTaGFwZSA9IE0ub3IoJ25hdCcsICdzZXQnLCAnY29weVNldCcsICdjb3B5QmFnJyk7JGjNj19vbmNlLkFzc2V0S2luZFNoYXBlKEFzc2V0S2luZFNoYXBlKTtcblxuY29uc3QgRGlzcGxheUluZm9TaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHt9LFxuICB7XG4gICAgZGVjaW1hbFBsYWNlczogTS5hbmQoXG4gICAgICBNLmd0ZSgtTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbiAgICAgIE0ubHRlKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUylcbiAgICApLFxuICAgIGFzc2V0S2luZDogQXNzZXRLaW5kU2hhcGVcbiAgfSxcbiAge1xuXG5cblxuXG4gICAgLy9cbiAgICAvL1xuICB9KTskaM2PX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtjb25zdCBJc3N1ZXJLaXRTaGFwZSA9IHsgYnJhbmQ6IEJyYW5kU2hhcGUsXG4gIG1pbnQ6IE1pbnRTaGFwZSxcbiAgbWludFJlY292ZXJ5UHVyc2U6IFB1cnNlU2hhcGUsXG4gIGlzc3VlcjogSXNzdWVyU2hhcGUsXG4gIGRpc3BsYXlJbmZvOiBEaXNwbGF5SW5mb1NoYXBlXG59OyRozY9fb25jZS5Jc3N1ZXJLaXRTaGFwZShJc3N1ZXJLaXRTaGFwZSk7XG5oYXJkZW4oSXNzdWVyS2l0U2hhcGUpO1xuXG4vL1xuXG5jb25zdCBCcmFuZEkgPSBNLmludGVyZmFjZSgnQnJhbmQnLCB7XG4gIGlzTXlJc3N1ZXI6IE0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICBnZXRBbGxlZ2VkTmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0RGlzcGxheUluZm86IE0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG4gIGdldEFtb3VudFNoYXBlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKVxufSk7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuQnJhbmRJKEJyYW5kSSk7XG5jb25zdCBtYWtlSXNzdWVySW50ZXJmYWNlcyA9IChcbmJyYW5kU2hhcGUgPSBCcmFuZFNoYXBlLFxuYXNzZXRLaW5kU2hhcGUgPSBBc3NldEtpbmRTaGFwZSxcbmFtb3VudFNoYXBlID0gQW1vdW50U2hhcGUpID0+XG57XG4gIGNvbnN0IElzc3VlckkgPSBNLmludGVyZmFjZSgnSXNzdWVyJywge1xuICAgIGdldEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICAgIGdldEFsbGVnZWROYW1lOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICAgIGdldEFzc2V0S2luZDogTS5jYWxsKCkucmV0dXJucyhhc3NldEtpbmRTaGFwZSksXG4gICAgZ2V0RGlzcGxheUluZm86IE0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG4gICAgbWFrZUVtcHR5UHVyc2U6IE0uY2FsbCgpLnJldHVybnMoUHVyc2VTaGFwZSksXG5cbiAgICBpc0xpdmU6IE0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgICBnZXRBbW91bnRPZjogTS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICAgIGJ1cm46IE0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5cbiAgICBvcHRpb25hbChBbW91bnRQYXR0ZXJuU2hhcGUpLlxuICAgIHJldHVybnMoYW1vdW50U2hhcGUpXG4gIH0pO1xuXG4gIGNvbnN0IE1pbnRJID0gTS5pbnRlcmZhY2UoJ01pbnQnLCB7XG4gICAgZ2V0SXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgICBtaW50UGF5bWVudDogTS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSlcbiAgfSk7XG5cbiAgY29uc3QgUGF5bWVudEkgPSBNLmludGVyZmFjZSgnUGF5bWVudCcsIHtcbiAgICBnZXRBbGxlZ2VkQnJhbmQ6IE0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSlcbiAgfSk7XG5cbiAgY29uc3QgUHVyc2VJID0gTS5pbnRlcmZhY2UoJ1B1cnNlJywge1xuICAgIGdldEFsbGVnZWRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbiAgICBnZXRDdXJyZW50QW1vdW50OiBNLmNhbGwoKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgICBnZXRDdXJyZW50QW1vdW50Tm90aWZpZXI6IE0uY2FsbCgpLnJldHVybnMoTm90aWZpZXJTaGFwZSksXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBkZXBvc2l0OiBNLmNhbGwoUGF5bWVudFNoYXBlKS5cbiAgICBvcHRpb25hbChBbW91bnRQYXR0ZXJuU2hhcGUpLlxuICAgIHJldHVybnMoYW1vdW50U2hhcGUpLFxuICAgIGdldERlcG9zaXRGYWNldDogTS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG4gICAgd2l0aGRyYXc6IE0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpLFxuICAgIGdldFJlY292ZXJ5U2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0uc2V0T2YoUGF5bWVudFNoYXBlKSksXG4gICAgcmVjb3ZlckFsbDogTS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSlcbiAgfSk7XG5cbiAgY29uc3QgRGVwb3NpdEZhY2V0SSA9IE0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLCB7XG4gICAgcmVjZWl2ZTogZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFB1cnNlSSkubWV0aG9kR3VhcmRzLmRlcG9zaXRcbiAgfSk7XG5cbiAgY29uc3QgUHVyc2VJS2l0ID0ge1xuICAgIHB1cnNlOiBQdXJzZUksXG4gICAgZGVwb3NpdEZhY2V0OiBEZXBvc2l0RmFjZXRJXG4gIH07XG4gIGhhcmRlbihQdXJzZUlLaXQpO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIElzc3VlckksXG4gICAgTWludEksXG4gICAgUGF5bWVudEksXG4gICAgUHVyc2VJS2l0XG4gIH0pO1xufTskaM2PX29uY2UubWFrZUlzc3VlckludGVyZmFjZXMobWFrZUlzc3VlckludGVyZmFjZXMpO1xuaGFyZGVuKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyYW5kU2hhcGUiOlsiQnJhbmRTaGFwZSJdLCJJc3N1ZXJTaGFwZSI6WyJJc3N1ZXJTaGFwZSJdLCJQYXltZW50U2hhcGUiOlsiUGF5bWVudFNoYXBlIl0sIlB1cnNlU2hhcGUiOlsiUHVyc2VTaGFwZSJdLCJEZXBvc2l0RmFjZXRTaGFwZSI6WyJEZXBvc2l0RmFjZXRTaGFwZSJdLCJOb3RpZmllclNoYXBlIjpbIk5vdGlmaWVyU2hhcGUiXSwiTWludFNoYXBlIjpbIk1pbnRTaGFwZSJdLCJBbW91bnRTaGFwZSI6WyJBbW91bnRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuU2hhcGUiOlsiQW1vdW50UGF0dGVyblNoYXBlIl0sIlJhdGlvU2hhcGUiOlsiUmF0aW9TaGFwZSJdLCJpc05hdFZhbHVlIjpbImlzTmF0VmFsdWUiXSwiaXNDb3B5U2V0VmFsdWUiOlsiaXNDb3B5U2V0VmFsdWUiXSwiaXNTZXRWYWx1ZSI6WyJpc1NldFZhbHVlIl0sImlzQ29weUJhZ1ZhbHVlIjpbImlzQ29weUJhZ1ZhbHVlIl0sIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyI6WyJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiXSwiQXNzZXRLaW5kU2hhcGUiOlsiQXNzZXRLaW5kU2hhcGUiXSwiRGlzcGxheUluZm9TaGFwZSI6WyJEaXNwbGF5SW5mb1NoYXBlIl0sIklzc3VlcktpdFNoYXBlIjpbIklzc3VlcktpdFNoYXBlIl0sIkJyYW5kSSI6WyJCcmFuZEkiXSwibWFrZUlzc3VlckludGVyZmFjZXMiOlsibWFrZUlzc3VlckludGVyZmFjZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD/AS0vkgMAAJIDAAArAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnN0YW50cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiUGFyYW1UeXBlIiwiUGFyYW1UeXBlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBQYXJhbVR5cGUgPSAvKiAgICAgICAgICAgICAgICAqLyh7XG4gIEFNT1VOVDogJ2Ftb3VudCcsXG4gIEJSQU5EOiAnYnJhbmQnLFxuICBJTlNUQUxMQVRJT046ICdpbnN0YWxsYXRpb24nLFxuICBJTlNUQU5DRTogJ2luc3RhbmNlJyxcbiAgSU5WSVRBVElPTjogJ2ludml0YXRpb24nLFxuICBOQVQ6ICduYXQnLFxuICBSQVRJTzogJ3JhdGlvJyxcbiAgU1RSSU5HOiAnc3RyaW5nJyxcbiAgUEFTU0FCTEVfUkVDT1JEOiAncmVjb3JkJyxcbiAgVElNRVNUQU1QOiAndGltZXN0YW1wJyxcbiAgUkVMQVRJVkVfVElNRTogJ3JlbGF0aXZlVGltZScsXG4gIFVOS05PV046ICd1bmtub3duJ1xufSk7JGjNj19vbmNlLlBhcmFtVHlwZShQYXJhbVR5cGUpO1xuaGFyZGVuKFBhcmFtVHlwZSk7XG5cbi8vXG4vL1xuY29uc3QgUGFyYW1UeXBlcyA9IHsgLi4uUGFyYW1UeXBlIH07JGjNj19vbmNlLlBhcmFtVHlwZXMoUGFyYW1UeXBlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQYXJhbVR5cGUiOlsiUGFyYW1UeXBlIl0sIlBhcmFtVHlwZXMiOlsiUGFyYW1UeXBlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACU8ob6MAwAADAMAAA/AAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9hc3NlcnRpb25zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdGltZSJdLCJleHBvcnRzIjpbImFzc2VydFJlbGF0aXZlVGltZSIsImFzc2VydFRpbWVzdGFtcCIsIm1ha2VBc3NlcnRCcmFuZGVkUmF0aW8iLCJtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uIiwibWFrZUFzc2VydEluc3RhbmNlIiwibWFrZUxvb2tzTGlrZUJyYW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxpc1JlbW90YWJsZSxhc3NlcnRJc1JhdGlvLG11c3RNYXRjaCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxUaW1lc3RhbXBSZWNvcmRTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc1JlbW90YWJsZVwiLFskaM2PX2EgPT4gKGlzUmVtb3RhYmxlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qc1wiLCBbW1wiYXNzZXJ0SXNSYXRpb1wiLFskaM2PX2EgPT4gKGFzc2VydElzUmF0aW8gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV0sW1wiVGltZXN0YW1wUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBSZWNvcmRTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuY29uc3QgbWFrZUxvb2tzTGlrZUJyYW5kID0gKG5hbWUpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIHJldHVybiAoYnJhbmQpID0+IHtcbiAgICBpc1JlbW90YWJsZShicmFuZCkgfHwgRmFpbGB2YWx1ZSBmb3IgJHtuYW1lfSBtdXN0IGJlIGEgYnJhbmQsIHdhcyAke2JyYW5kfWA7XG4gIH07XG59OyRozY9fb25jZS5tYWtlTG9va3NMaWtlQnJhbmQobWFrZUxvb2tzTGlrZUJyYW5kKTtcbmhhcmRlbihtYWtlTG9va3NMaWtlQnJhbmQpO1xuXG5jb25zdCBtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uID0gKG5hbWUpID0+IHtcbiAgcmV0dXJuIChpbnN0YWxsYXRpb24pID0+IHtcbiAgICAvL1xuICAgIHR5cGVvZiBpbnN0YWxsYXRpb24gPT09ICdvYmplY3QnIHx8XG4gICAgRmFpbGB2YWx1ZSBmb3IgJHtuYW1lfSBtdXN0IGJlIGFuIEluc3RhbGxhdGlvbiwgd2FzICR7aW5zdGFsbGF0aW9ufWA7XG4gIH07XG59OyRozY9fb25jZS5tYWtlQXNzZXJ0SW5zdGFsbGF0aW9uKG1ha2VBc3NlcnRJbnN0YWxsYXRpb24pO1xuaGFyZGVuKG1ha2VBc3NlcnRJbnN0YWxsYXRpb24pO1xuXG5jb25zdCBtYWtlQXNzZXJ0SW5zdGFuY2UgPSAobmFtZSkgPT4ge1xuICByZXR1cm4gKGluc3RhbmNlKSA9PiB7XG4gICAgLy9cbiAgICB0eXBlb2YgaW5zdGFuY2UgPT09ICdvYmplY3QnIHx8XG4gICAgRmFpbGB2YWx1ZSBmb3IgJHtuYW1lfSBtdXN0IGJlIGFuIEluc3RhbmNlLCB3YXMgJHtpbnN0YW5jZX1gO1xuICB9O1xufTskaM2PX29uY2UubWFrZUFzc2VydEluc3RhbmNlKG1ha2VBc3NlcnRJbnN0YW5jZSk7XG5oYXJkZW4obWFrZUFzc2VydEluc3RhbmNlKTtcblxuY29uc3QgbWFrZUFzc2VydEJyYW5kZWRSYXRpbyA9IChuYW1lLCBtb2RlbFJhdGlvKSA9PiB7XG4gIHJldHVybiAocmF0aW8pID0+IHtcbiAgICBhc3NlcnRJc1JhdGlvKHJhdGlvKTtcbiAgICByYXRpby5udW1lcmF0b3IuYnJhbmQgPT09IG1vZGVsUmF0aW8ubnVtZXJhdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBOdW1lcmF0b3IgYnJhbmQgZm9yICR7bmFtZX0gbXVzdCBiZSAke21vZGVsUmF0aW8ubnVtZXJhdG9yLmJyYW5kfWA7XG4gICAgcmF0aW8uZGVub21pbmF0b3IuYnJhbmQgPT09IG1vZGVsUmF0aW8uZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYERlbm9taW5hdG9yIGJyYW5kIGZvciAke25hbWV9IG11c3QgYmUgJHttb2RlbFJhdGlvLmRlbm9taW5hdG9yLmJyYW5kfWA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59OyRozY9fb25jZS5tYWtlQXNzZXJ0QnJhbmRlZFJhdGlvKG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8pO1xuaGFyZGVuKG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8pO1xuXG5jb25zdCBhc3NlcnRSZWxhdGl2ZVRpbWUgPSAodmFsdWUpID0+IHtcbiAgbXVzdE1hdGNoKHZhbHVlLCBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSk7XG59OyRozY9fb25jZS5hc3NlcnRSZWxhdGl2ZVRpbWUoYXNzZXJ0UmVsYXRpdmVUaW1lKTtcbmhhcmRlbihhc3NlcnRSZWxhdGl2ZVRpbWUpO1xuXG5jb25zdCBhc3NlcnRUaW1lc3RhbXAgPSAodmFsdWUpID0+IHtcbiAgbXVzdE1hdGNoKHZhbHVlLCBUaW1lc3RhbXBSZWNvcmRTaGFwZSwgJ3RpbWVzdGFtcCcpO1xufTskaM2PX29uY2UuYXNzZXJ0VGltZXN0YW1wKGFzc2VydFRpbWVzdGFtcCk7XG5oYXJkZW4oYXNzZXJ0VGltZXN0YW1wKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMb29rc0xpa2VCcmFuZCI6WyJtYWtlTG9va3NMaWtlQnJhbmQiXSwibWFrZUFzc2VydEluc3RhbGxhdGlvbiI6WyJtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uIl0sIm1ha2VBc3NlcnRJbnN0YW5jZSI6WyJtYWtlQXNzZXJ0SW5zdGFuY2UiXSwibWFrZUFzc2VydEJyYW5kZWRSYXRpbyI6WyJtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvIl0sImFzc2VydFJlbGF0aXZlVGltZSI6WyJhc3NlcnRSZWxhdGl2ZVRpbWUiXSwiYXNzZXJ0VGltZXN0YW1wIjpbImFzc2VydFRpbWVzdGFtcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACC/IC0xg8AAMYPAAA+AAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5BcGkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiLi4vcXVlc3Rpb24uanMiXSwiZXhwb3J0cyI6WyJtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyIsInNldHVwQXBpR292ZXJuYW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxFLEZhcixrZXlFUSxDaG9pY2VNZXRob2QsUXVvcnVtUnVsZSxFbGVjdGlvblR5cGUsY29lcmNlUXVlc3Rpb25TcGVjOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXV1dLFtcIi4uL3F1ZXN0aW9uLmpzXCIsIFtbXCJDaG9pY2VNZXRob2RcIixbJGjNj19hID0+IChDaG9pY2VNZXRob2QgPSAkaM2PX2EpXV0sW1wiUXVvcnVtUnVsZVwiLFskaM2PX2EgPT4gKFF1b3J1bVJ1bGUgPSAkaM2PX2EpXV0sW1wiRWxlY3Rpb25UeXBlXCIsWyRozY9fYSA9PiAoRWxlY3Rpb25UeXBlID0gJGjNj19hKV1dLFtcImNvZXJjZVF1ZXN0aW9uU3BlY1wiLFskaM2PX2EgPT4gKGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyA9IChhcGlNZXRob2ROYW1lLCBtZXRob2RBcmdzKSA9PiB7XG4gIGNvbnN0IHBvc2l0aXZlID0gaGFyZGVuKHsgYXBpTWV0aG9kTmFtZSwgbWV0aG9kQXJncyB9KTtcbiAgY29uc3QgbmVnYXRpdmUgPSBoYXJkZW4oeyBkb250SW52b2tlOiBhcGlNZXRob2ROYW1lIH0pO1xuICByZXR1cm4gaGFyZGVuKHsgcG9zaXRpdmUsIG5lZ2F0aXZlIH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zKG1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zKTtcbmNvbnN0IHNldHVwQXBpR292ZXJuYW5jZSA9IChcbmdldEdvdmVybmVkQXBpcyxcbmdldEdvdmVybmVkTmFtZXMsXG50aW1lcixcbmdldFVwZGF0ZWRQb3NlckZhY2V0KSA9Plxue1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB2b3RlQ291bnRlcnMgPSBuZXcgV2Vha1NldCgpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgdm90ZU9uQXBpSW52b2NhdGlvbiA9IGFzeW5jIChcbiAgYXBpTWV0aG9kTmFtZSxcbiAgbWV0aG9kQXJncyxcbiAgdm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sXG4gIGRlYWRsaW5lKSA9PlxuICB7XG4gICAgY29uc3QgZ292ZXJuZWROYW1lcyA9IGF3YWl0IGdldEdvdmVybmVkTmFtZXMoKTtcbiAgICBnb3Zlcm5lZE5hbWVzLmluY2x1ZGVzKGFwaU1ldGhvZE5hbWUpIHx8XG4gICAgRmFpbGAke2FwaU1ldGhvZE5hbWV9IGlzIG5vdCBhIGdvdmVybmVkIEFQSS5gO1xuXG4gICAgY29uc3QgeyBwb3NpdGl2ZSwgbmVnYXRpdmUgfSA9IG1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zKFxuICAgICAgYXBpTWV0aG9kTmFtZSxcbiAgICAgIG1ldGhvZEFyZ3NcbiAgICApO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaXNzdWUgPSBoYXJkZW4oeyBhcGlNZXRob2ROYW1lLCBtZXRob2RBcmdzIH0pO1xuICAgIGNvbnN0IHF1ZXN0aW9uU3BlYyA9IGNvZXJjZVF1ZXN0aW9uU3BlYyh7XG4gICAgICBtZXRob2Q6IENob2ljZU1ldGhvZC5VTlJBTktFRCxcbiAgICAgIGlzc3VlLFxuICAgICAgcG9zaXRpb25zOiBbcG9zaXRpdmUsIG5lZ2F0aXZlXSxcbiAgICAgIGVsZWN0aW9uVHlwZTogRWxlY3Rpb25UeXBlLkFQSV9JTlZPQ0FUSU9OLFxuICAgICAgbWF4Q2hvaWNlczogMSxcbiAgICAgIG1heFdpbm5lcnM6IDEsXG4gICAgICBjbG9zaW5nUnVsZTogeyB0aW1lciwgZGVhZGxpbmUgfSxcbiAgICAgIHF1b3J1bVJ1bGU6IFF1b3J1bVJ1bGUuTUFKT1JJVFksXG4gICAgICB0aWVPdXRjb21lOiBuZWdhdGl2ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBwdWJsaWNGYWNldDogY291bnRlclB1YmxpY0ZhY2V0LCBpbnN0YW5jZTogdm90ZUNvdW50ZXIgfSA9IGF3YWl0IEUoXG4gICAgICBnZXRVcGRhdGVkUG9zZXJGYWNldCgpXG4gICAgKS5hZGRRdWVzdGlvbih2b3RlQ291bnRlckluc3RhbGxhdGlvbiwgcXVlc3Rpb25TcGVjKTtcblxuICAgIHZvdGVDb3VudGVycy5hZGQodm90ZUNvdW50ZXIpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IG91dGNvbWVPZlVwZGF0ZSA9IEUoY291bnRlclB1YmxpY0ZhY2V0KS5cbiAgICBnZXRPdXRjb21lKCkuXG4gICAgdGhlbihcbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGFzeW5jIChvdXRjb21lKSA9PiB7XG4gICAgICAgIGF3YWl0IG51bGw7XG5cbiAgICAgICAgaWYgKGtleUVRKHBvc2l0aXZlLCBvdXRjb21lKSkge1xuICAgICAgICAgIGtleUVRKG91dGNvbWUsIGhhcmRlbih7IGFwaU1ldGhvZE5hbWUsIG1ldGhvZEFyZ3MgfSkpIHx8XG4gICAgICAgICAgRmFpbGBUaGUgcXVlc3Rpb24ncyBtZXRob2QgbmFtZSAoJHtxKFxuICAgICAgICAgICAgYXBpTWV0aG9kTmFtZVxuICAgICAgICAgICl9KSBhbmQgYXJncyAoJHttZXRob2RBcmdzfSkgZGlkbid0IG1hdGNoIHRoZSBvdXRjb21lICR7b3V0Y29tZX1gO1xuXG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBnb3Zlcm5lZEFwaXMgPSBhd2FpdCBnZXRHb3Zlcm5lZEFwaXMoKTtcbiAgICAgICAgICByZXR1cm4gRShnb3Zlcm5lZEFwaXMpW1xuICAgICAgICAgIGFwaU1ldGhvZE5hbWVdKC4uLm1ldGhvZEFyZ3MpLlxuICAgICAgICAgIHRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHBvc2l0aXZlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBuZWdhdGl2ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIG91dGNvbWVPZlVwZGF0ZSxcbiAgICAgIGluc3RhbmNlOiB2b3RlQ291bnRlcixcbiAgICAgIGRldGFpbHM6IEUoY291bnRlclB1YmxpY0ZhY2V0KS5nZXREZXRhaWxzKClcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gRmFyKCdwYXJhbUdvdmVybm9yJywge1xuICAgIHZvdGVPbkFwaUludm9jYXRpb24sXG4gICAgY3JlYXRlZFF1ZXN0aW9uOiAoYikgPT4gdm90ZUNvdW50ZXJzLmhhcyhiKVxuICB9KTtcbn07JGjNj19vbmNlLnNldHVwQXBpR292ZXJuYW5jZShzZXR1cEFwaUdvdmVybmFuY2UpO1xuXG5oYXJkZW4oc2V0dXBBcGlHb3Zlcm5hbmNlKTtcbmhhcmRlbihtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyI6WyJtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyJdLCJzZXR1cEFwaUdvdmVybmFuY2UiOlsic2V0dXBBcGlHb3Zlcm5hbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGewa67HDQAAxw0AAEEAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiLi4vcXVlc3Rpb24uanMiXSwiZXhwb3J0cyI6WyJtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMiLCJzZXR1cEZpbHRlckdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixtdXN0TWF0Y2gsa2V5RVEsTSxDaG9pY2VNZXRob2QsUXVvcnVtUnVsZSxFbGVjdGlvblR5cGUsY29lcmNlUXVlc3Rpb25TcGVjOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiLi4vcXVlc3Rpb24uanNcIiwgW1tcIkNob2ljZU1ldGhvZFwiLFskaM2PX2EgPT4gKENob2ljZU1ldGhvZCA9ICRozY9fYSldXSxbXCJRdW9ydW1SdWxlXCIsWyRozY9fYSA9PiAoUXVvcnVtUnVsZSA9ICRozY9fYSldXSxbXCJFbGVjdGlvblR5cGVcIixbJGjNj19hID0+IChFbGVjdGlvblR5cGUgPSAkaM2PX2EpXV0sW1wiY29lcmNlUXVlc3Rpb25TcGVjXCIsWyRozY9fYSA9PiAoY29lcmNlUXVlc3Rpb25TcGVjID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zID0gKHN0cmluZ3MpID0+IHtcbiAgY29uc3QgcG9zaXRpdmUgPSBoYXJkZW4oeyBzdHJpbmdzIH0pO1xuICBjb25zdCBuZWdhdGl2ZSA9IGhhcmRlbih7IGRvbnRVcGRhdGU6IHN0cmluZ3MgfSk7XG4gIHJldHVybiB7IHBvc2l0aXZlLCBuZWdhdGl2ZSB9O1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMobWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zKTtcbmNvbnN0IHNldHVwRmlsdGVyR292ZXJuYW5jZSA9ICh0aW1lciwgZ2V0VXBkYXRlZFBvc2VyRmFjZXQsIGdvdmVybmVkQ0YpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgdm90ZUNvdW50ZXJzID0gbmV3IFdlYWtTZXQoKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB2b3RlT25GaWx0ZXIgPSBhc3luYyAodm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIGRlYWRsaW5lLCBzdHJpbmdzKSA9PiB7XG4gICAgbXVzdE1hdGNoKHN0cmluZ3MsIE0uYXJyYXlPZihNLnN0cmluZygpKSk7XG4gICAgY29uc3QgeyBwb3NpdGl2ZSwgbmVnYXRpdmUgfSA9IG1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyhzdHJpbmdzKTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBpc3N1ZSA9IGhhcmRlbih7IHN0cmluZ3MgfSk7XG4gICAgY29uc3QgcXVlc3Rpb25TcGVjID0gY29lcmNlUXVlc3Rpb25TcGVjKHtcbiAgICAgIG1ldGhvZDogQ2hvaWNlTWV0aG9kLlVOUkFOS0VELFxuICAgICAgaXNzdWUsXG4gICAgICBwb3NpdGlvbnM6IFtwb3NpdGl2ZSwgbmVnYXRpdmVdLFxuICAgICAgZWxlY3Rpb25UeXBlOiBFbGVjdGlvblR5cGUuT0ZGRVJfRklMVEVSLFxuICAgICAgbWF4Q2hvaWNlczogMSxcbiAgICAgIG1heFdpbm5lcnM6IDEsXG4gICAgICBjbG9zaW5nUnVsZTogeyB0aW1lciwgZGVhZGxpbmUgfSxcbiAgICAgIHF1b3J1bVJ1bGU6IFF1b3J1bVJ1bGUuTUFKT1JJVFksXG4gICAgICB0aWVPdXRjb21lOiBuZWdhdGl2ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBwdWJsaWNGYWNldDogY291bnRlclB1YmxpY0ZhY2V0LCBpbnN0YW5jZTogdm90ZUNvdW50ZXIgfSA9IGF3YWl0IEUoXG4gICAgICBnZXRVcGRhdGVkUG9zZXJGYWNldCgpXG4gICAgKS5hZGRRdWVzdGlvbih2b3RlQ291bnRlckluc3RhbGxhdGlvbiwgcXVlc3Rpb25TcGVjKTtcblxuICAgIHZvdGVDb3VudGVycy5hZGQodm90ZUNvdW50ZXIpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IG91dGNvbWVPZlVwZGF0ZSA9IEUoY291bnRlclB1YmxpY0ZhY2V0KS5cbiAgICBnZXRPdXRjb21lKCkuXG4gICAgdGhlbihcbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIChvdXRjb21lKSA9PiB7XG4gICAgICAgIGlmIChrZXlFUShvdXRjb21lLCBwb3NpdGl2ZSkpIHtcbiAgICAgICAgICByZXR1cm4gRShnb3Zlcm5lZENGKS5cbiAgICAgICAgICBzZXRPZmZlckZpbHRlcihzdHJpbmdzKS5cbiAgICAgICAgICB0aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBwb3NpdGl2ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlFUShvdXRjb21lLCBuZWdhdGl2ZSkpIHtcbiAgICAgICAgICByZXR1cm4gbmVnYXRpdmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXNzZXJ0LmZhaWwoJ3VucmVjb2duaXplZCBvdXRjb21lJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICBvdXRjb21lT2ZVcGRhdGUsXG4gICAgICBpbnN0YW5jZTogdm90ZUNvdW50ZXIsXG4gICAgICBkZXRhaWxzOiBFKGNvdW50ZXJQdWJsaWNGYWNldCkuZ2V0RGV0YWlscygpXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIEZhcignZmlsdGVyR292ZXJub3InLCB7XG4gICAgdm90ZU9uRmlsdGVyLFxuICAgIGNyZWF0ZWRRdWVzdGlvbjogKGIpID0+IHZvdGVDb3VudGVycy5oYXMoYilcbiAgfSk7XG59OyRozY9fb25jZS5zZXR1cEZpbHRlckdvdmVybmFuY2Uoc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlKTtcblxuaGFyZGVuKHNldHVwRmlsdGVyR292ZXJuYW5jZSk7XG5oYXJkZW4obWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyI6WyJtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMiXSwic2V0dXBGaWx0ZXJHb3Zlcm5hbmNlIjpbInNldHVwRmlsdGVyR292ZXJuYW5jZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADkXmmCDhQAAA4UAABAAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCIuLi9xdWVzdGlvbi5qcyIsIi4uL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJDT05UUkFDVF9FTEVDVE9SQVRFIiwiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSIsIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyIsInNldHVwUGFyYW1Hb3Zlcm5hbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxFLGRlZXBseUZ1bGZpbGxlZCxGYXIsbXVzdE1hdGNoLGtleUVRLENob2ljZU1ldGhvZCxjb2VyY2VRdWVzdGlvblNwZWMsRWxlY3Rpb25UeXBlLFF1b3J1bVJ1bGUsUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIixbJGjNj19hID0+IChkZWVwbHlGdWxmaWxsZWQgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV1dXSxbXCIuLi9xdWVzdGlvbi5qc1wiLCBbW1wiQ2hvaWNlTWV0aG9kXCIsWyRozY9fYSA9PiAoQ2hvaWNlTWV0aG9kID0gJGjNj19hKV1dLFtcImNvZXJjZVF1ZXN0aW9uU3BlY1wiLFskaM2PX2EgPT4gKGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICRozY9fYSldXSxbXCJFbGVjdGlvblR5cGVcIixbJGjNj19hID0+IChFbGVjdGlvblR5cGUgPSAkaM2PX2EpXV0sW1wiUXVvcnVtUnVsZVwiLFskaM2PX2EgPT4gKFF1b3J1bVJ1bGUgPSAkaM2PX2EpXV1dXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZVwiLFskaM2PX2EgPT4gKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuICovXG5jb25zdCBDT05UUkFDVF9FTEVDVE9SQVRFID0gJ0VsZWN0b3JhdGUnO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5DT05UUkFDVF9FTEVDVE9SQVRFKENPTlRSQUNUX0VMRUNUT1JBVEUpO1xuY29uc3QgbWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zID0gKGNoYW5nZXMpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcG9zaXRpdmUgPSB7IGNoYW5nZXMgfTtcbiAgY29uc3QgbmFtZXNPbmx5ID0gT2JqZWN0LmtleXMoY2hhbmdlcyk7XG4gIGNvbnN0IG5lZ2F0aXZlID0geyBub0NoYW5nZTogbmFtZXNPbmx5IH07XG4gIHJldHVybiBoYXJkZW4oeyBwb3NpdGl2ZSwgbmVnYXRpdmUgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMobWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zKTtcbmNvbnN0IGFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0gPSAocGFyYW1TcGVjLCBxdWVzdGlvblNwZWMpID0+IHtcbiAgbXVzdE1hdGNoKHF1ZXN0aW9uU3BlYywgUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG4gIGNvbnN0IHsgcGFyYW1ldGVyTmFtZSwgcGFyYW1QYXRoIH0gPSBwYXJhbVNwZWM7XG4gIGNvbnN0IHsgaXNzdWUgfSA9IHF1ZXN0aW9uU3BlYztcbiAgaXNzdWUuc3BlYy5jaGFuZ2VzW3BhcmFtZXRlck5hbWVdIHx8XG4gIEZhaWxgUXVlc3Rpb24gKCR7aXNzdWUuc3BlYy5jaGFuZ2VzfSkgZG9lcyBub3QgY29uY2VybiAke3BhcmFtZXRlck5hbWV9YDtcbiAga2V5RVEoaXNzdWUuc3BlYy5wYXJhbVBhdGgsIHBhcmFtUGF0aCkgfHxcbiAgRmFpbGBRdWVzdGlvbiBwYXRoICgke2lzc3VlLnNwZWMucGFyYW1QYXRofSkgZG9lc24ndCBtYXRjaCByZXF1ZXN0ICgke3BhcmFtUGF0aH0pYDtcbn07XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLmFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0oYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSk7XG5jb25zdCBzZXR1cFBhcmFtR292ZXJuYW5jZSA9IChcbnBhcmFtTWFuYWdlclJldHJpZXZlckFjY2Vzc29yLFxuY29udHJhY3RJbnN0YW5jZSxcbnRpbWVyLFxuZ2V0VXBkYXRlZFBvc2VyRmFjZXQpID0+XG57XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHZvdGVDb3VudGVycyA9IG5ldyBXZWFrU2V0KCk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHZvdGVPblBhcmFtQ2hhbmdlcyA9IGFzeW5jIChcbiAgdm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sXG4gIGRlYWRsaW5lLFxuICBwYXJhbVNwZWMpID0+XG4gIHtcbiAgICBjb25zdCBwYXJhbU1hbmFnZXJSZXRyaWV2ZXIgPSBwYXJhbU1hbmFnZXJSZXRyaWV2ZXJBY2Nlc3NvcigpO1xuICAgIGNvbnN0IHBhcmFtTWdyID0gYXdhaXQgRShwYXJhbU1hbmFnZXJSZXRyaWV2ZXIpLmdldChwYXJhbVNwZWMucGFyYW1QYXRoKTtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGNoYW5nZVBzID0ge307XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHBhcmFtU3BlYy5jaGFuZ2VzKSkge1xuICAgICAgY29uc3QgcHJvcG9zZWRWYWx1ZSA9IEUocGFyYW1NZ3IpLmdldFZpc2libGVWYWx1ZShcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcGFyYW1TcGVjLmNoYW5nZXNbbmFtZV1cbiAgICAgICk7XG4gICAgICBjaGFuZ2VQc1tuYW1lXSA9IHByb3Bvc2VkVmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGNoYW5nZXMgPSBhd2FpdCBkZWVwbHlGdWxmaWxsZWQoaGFyZGVuKGNoYW5nZVBzKSk7XG5cbiAgICBjb25zdCB7IHBvc2l0aXZlLCBuZWdhdGl2ZSB9ID0gbWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zKGNoYW5nZXMpO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGlzc3VlID0gaGFyZGVuKHtcbiAgICAgIHNwZWM6IHtcbiAgICAgICAgcGFyYW1QYXRoOiBwYXJhbVNwZWMucGFyYW1QYXRoLFxuICAgICAgICBjaGFuZ2VzXG4gICAgICB9LFxuICAgICAgY29udHJhY3Q6IGNvbnRyYWN0SW5zdGFuY2VcbiAgICB9KTtcblxuICAgIGNvbnN0IHF1ZXN0aW9uU3BlYyA9IGNvZXJjZVF1ZXN0aW9uU3BlYyh7XG4gICAgICBtZXRob2Q6IENob2ljZU1ldGhvZC5VTlJBTktFRCxcbiAgICAgIGlzc3VlLFxuICAgICAgcG9zaXRpb25zOiBbcG9zaXRpdmUsIG5lZ2F0aXZlXSxcbiAgICAgIGVsZWN0aW9uVHlwZTogRWxlY3Rpb25UeXBlLlBBUkFNX0NIQU5HRSxcbiAgICAgIG1heENob2ljZXM6IDEsXG4gICAgICBtYXhXaW5uZXJzOiAxLFxuICAgICAgY2xvc2luZ1J1bGU6IHsgdGltZXIsIGRlYWRsaW5lIH0sXG4gICAgICBxdW9ydW1SdWxlOiBRdW9ydW1SdWxlLk1BSk9SSVRZLFxuICAgICAgdGllT3V0Y29tZTogbmVnYXRpdmVcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcHVibGljRmFjZXQ6IGNvdW50ZXJQdWJsaWNGYWNldCwgaW5zdGFuY2U6IHZvdGVDb3VudGVyIH0gPSBhd2FpdCBFKFxuICAgICAgZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKVxuICAgICkuYWRkUXVlc3Rpb24odm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIHF1ZXN0aW9uU3BlYyk7XG5cbiAgICB2b3RlQ291bnRlcnMuYWRkKHZvdGVDb3VudGVyKTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBvdXRjb21lT2ZVcGRhdGUgPSBFKGNvdW50ZXJQdWJsaWNGYWNldCkuXG4gICAgZ2V0T3V0Y29tZSgpLlxuICAgIHRoZW4oYXN5bmMgKG91dGNvbWUpID0+IHtcbiAgICAgIGlmIChrZXlFUShwb3NpdGl2ZSwgb3V0Y29tZSkpIHtcbiAgICAgICAgcmV0dXJuIEUud2hlbihcbiAgICAgICAgICBFKHBhcmFtTWdyKS51cGRhdGVQYXJhbXMocGFyYW1TcGVjLmNoYW5nZXMpLFxuICAgICAgICAgICgpID0+IHBvc2l0aXZlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmVnYXRpdmU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgb3V0Y29tZU9mVXBkYXRlLFxuICAgICAgaW5zdGFuY2U6IHZvdGVDb3VudGVyLFxuICAgICAgZGV0YWlsczogRShjb3VudGVyUHVibGljRmFjZXQpLmdldERldGFpbHMoKVxuICAgIH07XG4gIH07XG5cbiAgcmV0dXJuIEZhcigncGFyYW1Hb3Zlcm5vcicsIHtcbiAgICB2b3RlT25QYXJhbUNoYW5nZXMsXG4gICAgY3JlYXRlZFF1ZXN0aW9uOiAoYikgPT4gdm90ZUNvdW50ZXJzLmhhcyhiKVxuICB9KTtcbn07JGjNj19vbmNlLnNldHVwUGFyYW1Hb3Zlcm5hbmNlKHNldHVwUGFyYW1Hb3Zlcm5hbmNlKTtcblxuaGFyZGVuKHNldHVwUGFyYW1Hb3Zlcm5hbmNlKTtcbmhhcmRlbihtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMpO1xuaGFyZGVuKGFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ09OVFJBQ1RfRUxFQ1RPUkFURSI6WyJDT05UUkFDVF9FTEVDVE9SQVRFIl0sIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyI6WyJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiXSwiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSI6WyJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIl0sInNldHVwUGFyYW1Hb3Zlcm5hbmNlIjpbInNldHVwUGFyYW1Hb3Zlcm5hbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGrBhdq8NwAAvDcAAEEAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy96b2Uvc3JjL2NsZWFuUHJvcG9zYWwuanMiLCJAZW5kby9uYXQiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBhZ29yaWMvaW50ZXJuYWwiLCIuLi9jb25zdGFudHMuanMiLCIuL2Fzc2VydGlvbnMuanMiLCIuL2dvdmVyblBhcmFtLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxGYXIscGFzc1N0eWxlT2YsQW1vdW50TWF0aCxhc3NlcnRLZXl3b3JkTmFtZSxOYXQsa2V5RVEsbWFrZVNjYWxhck1hcFN0b3JlLEUsYXNzZXJ0QWxsRGVmaW5lZCxQYXJhbVR5cGVzLGFzc2VydFRpbWVzdGFtcCxhc3NlcnRSZWxhdGl2ZVRpbWUsbWFrZUFzc2VydEJyYW5kZWRSYXRpbyxtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uLG1ha2VBc3NlcnRJbnN0YW5jZSxtYWtlTG9va3NMaWtlQnJhbmQsQ09OVFJBQ1RfRUxFQ1RPUkFURTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY2xlYW5Qcm9wb3NhbC5qc1wiLCBbW1wiYXNzZXJ0S2V5d29yZE5hbWVcIixbJGjNj19hID0+IChhc3NlcnRLZXl3b3JkTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIixbJGjNj19hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjNj19hKV1dXV0sW1wiLi4vY29uc3RhbnRzLmpzXCIsIFtbXCJQYXJhbVR5cGVzXCIsWyRozY9fYSA9PiAoUGFyYW1UeXBlcyA9ICRozY9fYSldXV1dLFtcIi4vYXNzZXJ0aW9ucy5qc1wiLCBbW1wiYXNzZXJ0VGltZXN0YW1wXCIsWyRozY9fYSA9PiAoYXNzZXJ0VGltZXN0YW1wID0gJGjNj19hKV1dLFtcImFzc2VydFJlbGF0aXZlVGltZVwiLFskaM2PX2EgPT4gKGFzc2VydFJlbGF0aXZlVGltZSA9ICRozY9fYSldXSxbXCJtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvXCIsWyRozY9fYSA9PiAobWFrZUFzc2VydEJyYW5kZWRSYXRpbyA9ICRozY9fYSldXSxbXCJtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uXCIsWyRozY9fYSA9PiAobWFrZUFzc2VydEluc3RhbGxhdGlvbiA9ICRozY9fYSldXSxbXCJtYWtlQXNzZXJ0SW5zdGFuY2VcIixbJGjNj19hID0+IChtYWtlQXNzZXJ0SW5zdGFuY2UgPSAkaM2PX2EpXV0sW1wibWFrZUxvb2tzTGlrZUJyYW5kXCIsWyRozY9fYSA9PiAobWFrZUxvb2tzTGlrZUJyYW5kID0gJGjNj19hKV1dXV0sW1wiLi9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLFskaM2PX2EgPT4gKENPTlRSQUNUX0VMRUNUT1JBVEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyA9IChwYXJhbU1hbmFnZXIsIGdvdmVybmVkUGFyYW1zKSA9PiB7XG4gIGNvbnN0IG1hbmFnZXJFbGVjdG9yYXRlID1cbiAgcGFyYW1NYW5hZ2VyLmdldEludml0YXRpb25BbW91bnQoQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG4gIGNvbnN0IHtcbiAgICBbQ09OVFJBQ1RfRUxFQ1RPUkFURV06IHsgdmFsdWU6IHBhcmFtRWxlY3RvcmF0ZSB9XG4gIH0gPSBnb3Zlcm5lZFBhcmFtcztcbiAgcGFyYW1FbGVjdG9yYXRlIHx8XG4gIEZhaWxgTWlzc2luZyAke3EoQ09OVFJBQ1RfRUxFQ1RPUkFURSl9IHRlcm0gaW4gJHtxKGdvdmVybmVkUGFyYW1zKX1gO1xuICBrZXlFUShtYW5hZ2VyRWxlY3RvcmF0ZSwgcGFyYW1FbGVjdG9yYXRlKSB8fFxuICBGYWlsYEVsZWN0b3JhdGUgaW4gbWFuYWdlciAoJHttYW5hZ2VyRWxlY3RvcmF0ZX0pfSBpbmNvbXBhdGlibGUgd2l0aCB0ZXJtcyAoJHtwYXJhbUVsZWN0b3JhdGV9YDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovJGjNj19vbmNlLmFzc2VydEVsZWN0b3JhdGVNYXRjaGVzKGFzc2VydEVsZWN0b3JhdGVNYXRjaGVzKTtcbmNvbnN0IG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyID0gKHB1Ymxpc2hlcktpdCwgem9lKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbmFtZXNUb1BhcmFtcyA9IG1ha2VTY2FsYXJNYXBTdG9yZSgnUGFyYW1ldGVyIE5hbWUnKTtcbiAgY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IHB1Ymxpc2hlcktpdDtcbiAgYXNzZXJ0QWxsRGVmaW5lZCh7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9KTtcblxuICBjb25zdCBnZXR0ZXJzID0ge307XG4gIGNvbnN0IHNldHRlcnMgPSB7fTtcbiAgY29uc3QgdW5maW5pc2hlZFBhcmFtcyA9IFtdO1xuXG4gIC8vXG4gIC8vXG4gIGNvbnN0IGZpbmlzaEJ1aWxkaW5nID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHVuZmluaXNoZWRQYXJhbXMpO1xuICAgIHVuZmluaXNoZWRQYXJhbXMubGVuZ3RoID0gMDtcbiAgfTtcblxuICBjb25zdCBwdWJsaXNoID0gKCkgPT4ge1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBjdXJyZW50ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgWy4uLm5hbWVzVG9QYXJhbXMuZW50cmllcygpXS5tYXAoKFtrLCB2XSkgPT4gW2ssIHYubWFrZURlc2NyaXB0aW9uKCldKVxuICAgICk7XG4gICAgcHVibGlzaGVyLnVwZGF0ZVN0YXRlKHsgY3VycmVudCB9KTtcbiAgfTtcblxuICAvKlxuICBcbiAgXG4gICAgICovXG5cblxuXG5cblxuXG4gIGNvbnN0IGJ1aWxkQ29weVBhcmFtID0gKG5hbWUsIHZhbHVlLCBhc3NlcnRpb24sIHR5cGUpID0+IHtcbiAgICBsZXQgY3VycmVudDtcbiAgICBhc3NlcnRLZXl3b3JkTmFtZShuYW1lKTtcbiAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IEZhaWxgcGFyYW0gJHtxKG5hbWUpfSBtdXN0IGJlIGRlZmluZWRgO1xuXG4gICAgY29uc3Qgc2V0UGFyYW1WYWx1ZSA9IChuZXdWYWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0aW9uKG5ld1ZhbHVlKTtcbiAgICAgIGN1cnJlbnQgPSBuZXdWYWx1ZTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBbbmFtZV06IG5ld1ZhbHVlIH0pO1xuICAgIH07XG4gICAgc2V0UGFyYW1WYWx1ZSh2YWx1ZSk7XG5cbiAgICBjb25zdCBnZXRWaXNpYmxlVmFsdWUgPSAocHJvcG9zZWQpID0+IHtcbiAgICAgIGFzc2VydGlvbihwcm9wb3NlZCk7XG4gICAgICByZXR1cm4gcHJvcG9zZWQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHB1YmxpY01ldGhvZHMgPSBGYXIoYFBhcmFtZXRlciAke25hbWV9YCwge1xuICAgICAgZ2V0VmFsdWU6ICgpID0+IGN1cnJlbnQsXG4gICAgICBhc3NlcnRUeXBlOiBhc3NlcnRpb24sXG4gICAgICBtYWtlRGVzY3JpcHRpb246ICgpID0+ICh7IHR5cGUsIHZhbHVlOiBjdXJyZW50IH0pLFxuICAgICAgZ2V0VmlzaWJsZVZhbHVlLFxuICAgICAgZ2V0VHlwZTogKCkgPT4gdHlwZVxuICAgIH0pO1xuXG4gICAgLy9cbiAgICBnZXR0ZXJzW2BnZXQke25hbWV9YF0gPSAoKSA9PiBnZXRUeXBlZFBhcmFtKHR5cGUsIG5hbWUpO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgc2V0dGVyc1tgdXBkYXRlJHtuYW1lfWBdID0gc2V0UGFyYW1WYWx1ZTtcbiAgICBzZXR0ZXJzW2BwcmVwYXJlVG9VcGRhdGUke25hbWV9YF0gPSAocHJvcG9zZWRWYWx1ZSkgPT4gcHJvcG9zZWRWYWx1ZTtcbiAgICBuYW1lc1RvUGFyYW1zLmluaXQobmFtZSwgcHVibGljTWV0aG9kcyk7XG4gIH07XG5cbiAgLy9cblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGFkZEFtb3VudCA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydEFtb3VudCA9IChhKSA9PiB7XG4gICAgICBhLmJyYW5kIHx8IEZhaWxgRXhwZWN0ZWQgYW4gQW1vdW50IGZvciAke3EobmFtZSl9LCBnb3Q6ICR7YX1gO1xuICAgICAgcmV0dXJuIEFtb3VudE1hdGguY29lcmNlKHZhbHVlLmJyYW5kLCBhKTtcbiAgICB9O1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRBbW91bnQsIFBhcmFtVHlwZXMuQU1PVU5UKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYWRkQnJhbmQgPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBjb25zdCBhc3NlcnRCcmFuZCA9IG1ha2VMb29rc0xpa2VCcmFuZChuYW1lKTtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0QnJhbmQsIFBhcmFtVHlwZXMuQlJBTkQpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYWRkSW5zdGFsbGF0aW9uID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0SW5zdGFsbGF0aW9uID0gbWFrZUFzc2VydEluc3RhbGxhdGlvbihuYW1lKTtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0SW5zdGFsbGF0aW9uLCBQYXJhbVR5cGVzLklOU1RBTExBVElPTik7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGFkZEluc3RhbmNlID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0SW5zdGFuY2UgPSBtYWtlQXNzZXJ0SW5zdGFuY2UobmFtZSk7XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydEluc3RhbmNlLCBQYXJhbVR5cGVzLklOU1RBTkNFKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGFkZE5hdCA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydE5hdCA9ICh2KSA9PiB7XG4gICAgICBhc3NlcnQudHlwZW9mKHYsICdiaWdpbnQnKTtcbiAgICAgIE5hdCh2KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydE5hdCwgUGFyYW1UeXBlcy5OQVQpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhZGRSYXRpbyA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydEJyYW5kZWRSYXRpbyA9IG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8obmFtZSwgdmFsdWUpO1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRCcmFuZGVkUmF0aW8sIFBhcmFtVHlwZXMuUkFUSU8pO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGFkZFJlY29yZCA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydFJlY29yZCA9ICh2KSA9PiB7XG4gICAgICBwYXNzU3R5bGVPZih2KTtcbiAgICAgIGFzc2VydC50eXBlb2YodiwgJ29iamVjdCcpO1xuICAgIH07XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydFJlY29yZCwgUGFyYW1UeXBlcy5QQVNTQUJMRV9SRUNPUkQpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYWRkU3RyaW5nID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0U3RyaW5nID0gKHYpID0+IGFzc2VydC50eXBlb2YodiwgJ3N0cmluZycpO1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRTdHJpbmcsIFBhcmFtVHlwZXMuU1RSSU5HKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYWRkVGltZXN0YW1wID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydFRpbWVzdGFtcCwgUGFyYW1UeXBlcy5USU1FU1RBTVApO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhZGRSZWxhdGl2ZVRpbWUgPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0UmVsYXRpdmVUaW1lLCBQYXJhbVR5cGVzLlJFTEFUSVZFX1RJTUUpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYWRkVW5rbm93biA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydFVua25vd24gPSAoX3YpID0+IHRydWU7XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydFVua25vd24sIFBhcmFtVHlwZXMuVU5LTk9XTik7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0SW52aXRhdGlvbiA9IGFzeW5jIChpKSA9PiB7XG4gICAgaWYgKCF6b2UpIHtcbiAgICAgIHRocm93IEZhaWxgem9lIG11c3QgYmUgcHJvdmlkZWQgZm9yIGdvdmVybmVkIEludml0YXRpb25zICR7em9lfWA7XG4gICAgfVxuXG4gICAgLy9cbiAgICBjb25zdCBpc0xpdmUgPSBhd2FpdCBFKEUoem9lKS5nZXRJbnZpdGF0aW9uSXNzdWVyKCkpLmlzTGl2ZShpKTtcbiAgICBpc0xpdmUgfHwgRmFpbGBJbnZpdGF0aW9uIHBhc3NlZCB0byBwYXJhbU1hbmFnZXIgaXMgbm90IGxpdmUgJHtpfWA7XG4gIH07XG5cbiAgLypcbiAgXG4gIFxuICBcbiAgICovXG5cblxuXG5cblxuXG4gIGNvbnN0IGJ1aWxkSW52aXRhdGlvblBhcmFtID0gKG5hbWUsIGludml0YXRpb24pID0+IHtcbiAgICBpZiAoIXpvZSkge1xuICAgICAgdGhyb3cgRmFpbGB6b2UgbXVzdCBiZSBwcm92aWRlZCBmb3IgZ292ZXJuZWQgSW52aXRhdGlvbnMgJHt6b2V9YDtcbiAgICB9XG4gICAgbGV0IGN1cnJlbnRJbnZpdGF0aW9uO1xuICAgIGxldCBjdXJyZW50QW1vdW50O1xuXG4gICAgLypcbiAgICAgICovXG5cblxuICAgIC8qXG4gICAgICAgICAqL1xuXG5cblxuXG4gICAgY29uc3QgcHJlcGFyZVRvU2V0SW52aXRhdGlvbiA9IGFzeW5jIChpbnZpdGUpID0+IHtcbiAgICAgIGNvbnN0IFtwcmVwYXJlZEFtb3VudF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBFKEUoem9lKS5nZXRJbnZpdGF0aW9uSXNzdWVyKCkpLmdldEFtb3VudE9mKGludml0ZSksXG4gICAgICBhc3NlcnRJbnZpdGF0aW9uKGludml0ZSldXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gW2ludml0ZSwgcHJlcGFyZWRBbW91bnRdO1xuICAgIH07XG5cbiAgICAvKlxuICAgICAgICAqL1xuXG5cblxuICAgIGNvbnN0IHNldEludml0YXRpb24gPSAoW25ld0ludml0YXRpb24sIGFtb3VudF0pID0+IHtcbiAgICAgIGN1cnJlbnRBbW91bnQgPSBhbW91bnQ7XG4gICAgICBjdXJyZW50SW52aXRhdGlvbiA9IG5ld0ludml0YXRpb247XG4gICAgICByZXR1cm4gaGFyZGVuKHsgW25hbWVdOiBjdXJyZW50QW1vdW50IH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBtYWtlRGVzY3JpcHRpb24gPSAoKSA9PiB7XG4gICAgICByZXR1cm4geyB0eXBlOiBQYXJhbVR5cGVzLklOVklUQVRJT04sIHZhbHVlOiBjdXJyZW50QW1vdW50IH07XG4gICAgfTtcblxuICAgIGNvbnN0IGdldFZpc2libGVWYWx1ZSA9IGFzeW5jIChhbGxlZ2VkSW52aXRhdGlvbikgPT5cbiAgICBFKEUoem9lKS5nZXRJbnZpdGF0aW9uSXNzdWVyKCkpLmdldEFtb3VudE9mKGFsbGVnZWRJbnZpdGF0aW9uKTtcblxuICAgIGNvbnN0IHB1YmxpY01ldGhvZHMgPSBGYXIoYFBhcmFtZXRlciAke25hbWV9YCwge1xuICAgICAgZ2V0VmFsdWU6ICgpID0+IGN1cnJlbnRBbW91bnQsXG4gICAgICBnZXRJbnRlcm5hbFZhbHVlOiAoKSA9PiBjdXJyZW50SW52aXRhdGlvbixcbiAgICAgIGFzc2VydFR5cGU6IGFzc2VydEludml0YXRpb24sXG4gICAgICBtYWtlRGVzY3JpcHRpb24sXG4gICAgICBnZXRUeXBlOiAoKSA9PiBQYXJhbVR5cGVzLklOVklUQVRJT04sXG4gICAgICBnZXRWaXNpYmxlVmFsdWVcbiAgICB9KTtcblxuICAgIGdldHRlcnNbYGdldCR7bmFtZX1gXSA9ICgpID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5JTlZJVEFUSU9OLCBuYW1lKTtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHNldHRlcnNbYHByZXBhcmVUb1VwZGF0ZSR7bmFtZX1gXSA9IHByZXBhcmVUb1NldEludml0YXRpb247XG4gICAgc2V0dGVyc1tgdXBkYXRlJHtuYW1lfWBdID0gc2V0SW52aXRhdGlvbjtcblxuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBmaW5pc2hJbnZpdGF0aW9uUGFyYW0gPSBFLndoZW4oXG4gICAgICBwcmVwYXJlVG9TZXRJbnZpdGF0aW9uKGludml0YXRpb24pLFxuICAgICAgKGludml0YXRpb25BbmRBbW91bnQpID0+IHtcbiAgICAgICAgc2V0SW52aXRhdGlvbihpbnZpdGF0aW9uQW5kQW1vdW50KTtcbiAgICAgICAgLy9cbiAgICAgICAgbmFtZXNUb1BhcmFtcy5pbml0KG5hbWUsIHB1YmxpY01ldGhvZHMpO1xuICAgICAgfVxuICAgICk7XG4gICAgdW5maW5pc2hlZFBhcmFtcy5wdXNoKGZpbmlzaEludml0YXRpb25QYXJhbSk7XG5cbiAgICByZXR1cm4gbmFtZTtcbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhZGRJbnZpdGF0aW9uID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgYXNzZXJ0S2V5d29yZE5hbWUobmFtZSk7XG4gICAgdmFsdWUgIT09IG51bGwgfHwgRmFpbGBwYXJhbSAke3EobmFtZSl9IG11c3QgYmUgZGVmaW5lZGA7XG5cbiAgICBidWlsZEludml0YXRpb25QYXJhbShuYW1lLCB2YWx1ZSk7XG5cbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvL1xuXG4gIGNvbnN0IGdldFR5cGVkUGFyYW0gPSAodHlwZSwgbmFtZSkgPT4ge1xuICAgIGNvbnN0IHBhcmFtID0gbmFtZXNUb1BhcmFtcy5nZXQobmFtZSk7XG4gICAgdHlwZSA9PT0gcGFyYW0uZ2V0VHlwZSgpIHx8IEZhaWxgJHtuYW1lfSBpcyBub3QgJHt0eXBlfWA7XG4gICAgcmV0dXJuIHBhcmFtLmdldFZhbHVlKCk7XG4gIH07XG5cbiAgY29uc3QgZ2V0VmlzaWJsZVZhbHVlID0gKG5hbWUsIHByb3Bvc2VkKSA9PiB7XG4gICAgY29uc3QgcGFyYW0gPSBuYW1lc1RvUGFyYW1zLmdldChuYW1lKTtcbiAgICByZXR1cm4gcGFyYW0uZ2V0VmlzaWJsZVZhbHVlKHByb3Bvc2VkKTtcbiAgfTtcblxuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGdldEludGVybmFsUGFyYW1WYWx1ZSA9IGFzeW5jIChuYW1lKSA9PiB7XG4gICAgYXdhaXQgZmluaXNoQnVpbGRpbmcoKTtcbiAgICByZXR1cm4gbmFtZXNUb1BhcmFtcy5nZXQobmFtZSkuZ2V0SW50ZXJuYWxWYWx1ZSgpO1xuICB9O1xuXG4gIGNvbnN0IGdldFBhcmFtcyA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBmaW5pc2hCdWlsZGluZygpO1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBkZXNjcmlwdGlvbnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBwYXJhbV0gb2YgbmFtZXNUb1BhcmFtcy5lbnRyaWVzKCkpIHtcbiAgICAgIGRlc2NyaXB0aW9uc1tuYW1lXSA9IHBhcmFtLm1ha2VEZXNjcmlwdGlvbigpO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKGRlc2NyaXB0aW9ucyk7XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHVwZGF0ZVBhcmFtcyA9IGFzeW5jIChwYXJhbUNoYW5nZXMpID0+IHtcbiAgICBhd2FpdCBmaW5pc2hCdWlsZGluZygpO1xuICAgIGNvbnN0IHBhcmFtTmFtZXMgPSBPYmplY3Qua2V5cyhwYXJhbUNoYW5nZXMpO1xuXG4gICAgLy9cbiAgICBjb25zdCBhc3luY1Jlc3VsdHMgPSBwYXJhbU5hbWVzLm1hcCgobmFtZSkgPT5cbiAgICBzZXR0ZXJzW2BwcmVwYXJlVG9VcGRhdGUke25hbWV9YF0ocGFyYW1DaGFuZ2VzW25hbWVdKVxuICAgICk7XG4gICAgLy9cbiAgICBjb25zdCBwcmVwYXJlZCA9IGF3YWl0IFByb21pc2UuYWxsKGFzeW5jUmVzdWx0cyk7XG5cbiAgICAvL1xuICAgIGZvciAoY29uc3QgW2ksIG5hbWVdIG9mIHBhcmFtTmFtZXMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBzZXRGbiA9IHNldHRlcnNbYHVwZGF0ZSR7bmFtZX1gXTtcbiAgICAgIHNldEZuKHByZXBhcmVkW2ldKTtcbiAgICB9XG4gICAgcHVibGlzaCgpO1xuICB9O1xuXG4gIC8vXG4gIGNvbnN0IGJ1aWxkID0gKCkgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICB2b2lkIEUud2hlbihmaW5pc2hCdWlsZGluZygpLCAoKSA9PiBwdWJsaXNoKCkpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIEZhcigncGFyYW0gbWFuYWdlcicsIHtcbiAgICAgIGdldFBhcmFtcyxcbiAgICAgIGdldFN1YnNjcmlwdGlvbjogKCkgPT4gc3Vic2NyaWJlcixcbiAgICAgIGdldEFtb3VudDogKG5hbWUpID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5BTU9VTlQsIG5hbWUpLFxuICAgICAgZ2V0QnJhbmQ6IChuYW1lKSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuQlJBTkQsIG5hbWUpLFxuICAgICAgZ2V0SW5zdGFuY2U6IChuYW1lKSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuSU5TVEFOQ0UsIG5hbWUpLFxuICAgICAgZ2V0SW5zdGFsbGF0aW9uOiAobmFtZSkgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOU1RBTExBVElPTiwgbmFtZSksXG4gICAgICBnZXRJbnZpdGF0aW9uQW1vdW50OiAobmFtZSkgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOVklUQVRJT04sIG5hbWUpLFxuICAgICAgZ2V0TmF0OiAobmFtZSkgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLk5BVCwgbmFtZSksXG4gICAgICBnZXRSYXRpbzogKG5hbWUpID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5SQVRJTywgbmFtZSksXG4gICAgICBnZXRSZWNvcmQ6IChuYW1lKSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuUEFTU0FCTEVfUkVDT1JELCBuYW1lKSxcbiAgICAgIGdldFN0cmluZzogKG5hbWUpID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5TVFJJTkcsIG5hbWUpLFxuICAgICAgZ2V0VGltZXN0YW1wOiAobmFtZSkgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlRJTUVTVEFNUCwgbmFtZSksXG4gICAgICBnZXRSZWxhdGl2ZVRpbWU6IChuYW1lKSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuUkVMQVRJVkVfVElNRSwgbmFtZSksXG4gICAgICBnZXRVbmtub3duOiAobmFtZSkgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlVOS05PV04sIG5hbWUpLFxuICAgICAgZ2V0VmlzaWJsZVZhbHVlLFxuICAgICAgZ2V0SW50ZXJuYWxQYXJhbVZhbHVlLFxuICAgICAgLy9cbiAgICAgIC4uLmdldHRlcnMsXG4gICAgICB1cGRhdGVQYXJhbXMsXG4gICAgICAvL1xuICAgICAgcmVhZG9ubHk6ICgpID0+IGhhcmRlbihnZXR0ZXJzKVxuICAgIH0pO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYnVpbGRlciA9IHtcbiAgICBhZGRBbW91bnQ6IChuLCB2KSA9PiBhZGRBbW91bnQobiwgdiwgYnVpbGRlciksXG4gICAgYWRkQnJhbmQ6IChuLCB2KSA9PiBhZGRCcmFuZChuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRJbnN0YWxsYXRpb246IChuLCB2KSA9PiBhZGRJbnN0YWxsYXRpb24obiwgdiwgYnVpbGRlciksXG4gICAgYWRkSW5zdGFuY2U6IChuLCB2KSA9PiBhZGRJbnN0YW5jZShuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRVbmtub3duOiAobiwgdikgPT4gYWRkVW5rbm93bihuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRJbnZpdGF0aW9uOiAobiwgdikgPT4gYWRkSW52aXRhdGlvbihuLCB2LCBidWlsZGVyKSxcbiAgICBhZGROYXQ6IChuLCB2KSA9PiBhZGROYXQobiwgdiwgYnVpbGRlciksXG4gICAgYWRkUmF0aW86IChuLCB2KSA9PiBhZGRSYXRpbyhuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRSZWNvcmQ6IChuLCB2KSA9PiBhZGRSZWNvcmQobiwgdiwgYnVpbGRlciksXG4gICAgYWRkU3RyaW5nOiAobiwgdikgPT4gYWRkU3RyaW5nKG4sIHYsIGJ1aWxkZXIpLFxuICAgIGFkZFJlbGF0aXZlVGltZTogKG4sIHYpID0+IGFkZFJlbGF0aXZlVGltZShuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRUaW1lc3RhbXA6IChuLCB2KSA9PiBhZGRUaW1lc3RhbXAobiwgdiwgYnVpbGRlciksXG4gICAgYnVpbGRcbiAgfTtcbiAgcmV0dXJuIGJ1aWxkZXI7XG59OyRozY9fb25jZS5tYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcihtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcik7XG5cbmhhcmRlbihhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyk7XG5oYXJkZW4obWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiOlsiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiXSwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiOlsibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0qlSCLEOAACxDgAARgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL2Vycm9ycyIsIi4uL2NvbnN0YW50cy5qcyIsIi4vZ292ZXJuUGFyYW0uanMiLCIuL3BhcmFtTWFuYWdlci5qcyJdLCJleHBvcnRzIjpbIm1ha2VQYXJhbU1hbmFnZXIiLCJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zIiwibWFrZVBhcmFtTWFuYWdlclN5bmMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhaWwscSxQYXJhbVR5cGVzLENPTlRSQUNUX0VMRUNUT1JBVEUsbWFrZVBhcmFtTWFuYWdlckJ1aWxkZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuLi9jb25zdGFudHMuanNcIiwgW1tcIlBhcmFtVHlwZXNcIixbJGjNj19hID0+IChQYXJhbVR5cGVzID0gJGjNj19hKV1dXV0sW1wiLi9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLFskaM2PX2EgPT4gKENPTlRSQUNUX0VMRUNUT1JBVEUgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcmFtTWFuYWdlci5qc1wiLCBbW1wibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXJcIixbJGjNj19hID0+IChtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG4gKi9cbi8qXG5cblxuICovXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cbiAqL1xuY29uc3QgYnVpbGRlck1ldGhvZE5hbWUgPSAodHlwZSkgPT5cbmBhZGQke3R5cGVbMF0udG9VcHBlckNhc2UoKSArIHR5cGUuc3Vic3RyaW5nKDEpfWA7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBpc0FzeW5jID0ge1xuICBpbnZpdGF0aW9uOiB0cnVlXG59O1xuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG4gKi9cblxuLy9cbi8vXG4vL1xuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUGFyYW1NYW5hZ2VyID0gKHB1Ymxpc2hlcktpdCwgc3BlYywgemNmKSA9PiB7XG4gIGNvbnN0IGJ1aWxkZXIgPSBtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcihwdWJsaXNoZXJLaXQsIHpjZi5nZXRab2VTZXJ2aWNlKCkpO1xuXG4gIGNvbnN0IHByb21pc2VzID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIFt0eXBlLCB2YWx1ZV1dIG9mIE9iamVjdC5lbnRyaWVzKHNwZWMpKSB7XG4gICAgY29uc3QgYWRkID0gYnVpbGRlcltidWlsZGVyTWV0aG9kTmFtZSh0eXBlKV07XG4gICAgaWYgKGlzQXN5bmNbdHlwZV0pIHtcbiAgICAgIHByb21pc2VzLnB1c2goYWRkKG5hbWUsIHZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIC8vXG4gIC8vXG4gIC8vXG4gIHZvaWQgRS53aGVuKFByb21pc2UuYWxsKHByb21pc2VzKSwgdW5kZWZpbmVkLCAocmVhc29uKSA9PlxuICB6Y2Yuc2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pXG4gICk7XG5cbiAgLy9cbiAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTtcbn07JGjNj19vbmNlLm1ha2VQYXJhbU1hbmFnZXIobWFrZVBhcmFtTWFuYWdlcik7XG5oYXJkZW4obWFrZVBhcmFtTWFuYWdlcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUGFyYW1NYW5hZ2VyU3luYyA9IChwdWJsaXNoZXJLaXQsIHNwZWMpID0+IHtcbiAgY29uc3QgYnVpbGRlciA9IG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKHB1Ymxpc2hlcktpdCk7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgW3R5cGUsIHZhbHVlXV0gb2YgT2JqZWN0LmVudHJpZXMoc3BlYykpIHtcbiAgICBjb25zdCBhZGQgPSBidWlsZGVyW2J1aWxkZXJNZXRob2ROYW1lKHR5cGUpXTtcbiAgICBhZGQgfHwgRmFpbGBObyBidWlsZGVyIG1ldGhvZCBmb3IgcGFyYW0gdHlwZSAke3EodHlwZSl9YDtcbiAgICBhZGQobmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgLy9cbiAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTtcbn07JGjNj19vbmNlLm1ha2VQYXJhbU1hbmFnZXJTeW5jKG1ha2VQYXJhbU1hbmFnZXJTeW5jKTtcbmhhcmRlbihtYWtlUGFyYW1NYW5hZ2VyU3luYyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zID0gKFxucHVibGlzaGVyS2l0LFxuemNmLFxuaW52aXRhdGlvbnMsXG5wYXJhbVR5cGVzTWFwLFxub3ZlcnJpZGVzKSA9Plxue1xuICBpZiAob3ZlcnJpZGVzKSB7XG4gICAgY29uc29sZS5sb2coJ1RQTSAnLCB7IG92ZXJyaWRlcyB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgZ292ZXJuZWRQYXJhbXMgfSA9IHpjZi5nZXRUZXJtcygpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYWtlclNwZWNFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMocGFyYW1UeXBlc01hcCkubWFwKFxuICAgIChbcGFyYW1LZXksIHBhcmFtVHlwZV0pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgIG92ZXJyaWRlcyAmJiBvdmVycmlkZXNbcGFyYW1LZXldID9cbiAgICAgIG92ZXJyaWRlc1twYXJhbUtleV0gOlxuICAgICAgZ292ZXJuZWRQYXJhbXNbcGFyYW1LZXldLnZhbHVlO1xuXG4gICAgICByZXR1cm4gW3BhcmFtS2V5LCAvKiAgICAgICAgICAgICAgICAgICAgICAgICovKFtwYXJhbVR5cGUsIHZhbHVlXSldO1xuICAgIH1cbiAgKTtcbiAgLy9cbiAgZm9yIChjb25zdCBbbmFtZSwgaW52aXRhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoaW52aXRhdGlvbnMpKSB7XG4gICAgbWFrZXJTcGVjRW50cmllcy5wdXNoKFtuYW1lLCBbUGFyYW1UeXBlcy5JTlZJVEFUSU9OLCBpbnZpdGF0aW9uXV0pO1xuICB9XG4gIGNvbnN0IG1ha2VyU3BlYyA9IE9iamVjdC5mcm9tRW50cmllcyhtYWtlclNwZWNFbnRyaWVzKTtcbiAgbWFrZXJTcGVjW0NPTlRSQUNUX0VMRUNUT1JBVEVdIHx8XG4gIEZhaWxgbWlzc2luZyBFbGVjdG9yYXRlIGludml0YXRpb24gcGFyYW0gdmFsdWVgO1xuXG4gIC8vXG4gIHJldHVybiBtYWtlUGFyYW1NYW5hZ2VyKHB1Ymxpc2hlcktpdCwgbWFrZXJTcGVjLCB6Y2YpO1xufTskaM2PX29uY2UubWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyhtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKTtcbmhhcmRlbihtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQYXJhbU1hbmFnZXIiOlsibWFrZVBhcmFtTWFuYWdlciJdLCJtYWtlUGFyYW1NYW5hZ2VyU3luYyI6WyJtYWtlUGFyYW1NYW5hZ2VyU3luYyJdLCJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zIjpbIm1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA07mJoSETAAAhEwAAMgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybm9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIiwiLi9jb250cmFjdEdvdmVybm9yS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsibWV0YSIsInN0YXJ0IiwidmFsaWRhdGVRdWVzdGlvbkRldGFpbHMiLCJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEUsbXVzdE1hdGNoLG1ha2VUcmFjZXIscHJvdmlkZVNpbmdsZXRvbixDT05UUkFDVF9FTEVDVE9SQVRFLHByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0LFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanNcIiwgW1tcInByb3ZpZGVTaW5nbGV0b25cIixbJGjNj19hID0+IChwcm92aWRlU2luZ2xldG9uID0gJGjNj19hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanNcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIixbJGjNj19hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjNj19hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybm9yS2l0LmpzXCIsIFtbXCJwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0ID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZVwiLFskaM2PX2EgPT4gKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IHRyYWNlID0gbWFrZVRyYWNlcignQ0dvdicsIGZhbHNlKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1ldGEgPSB7XG4gIHVwZ3JhZGFiaWxpdHk6ICdjYW5VcGdyYWRlJ1xufTskaM2PX29uY2UubWV0YShtZXRhKTtcbmhhcmRlbihtZXRhKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCB2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyA9IGFzeW5jICh6b2UsIGVsZWN0b3JhdGUsIGRldGFpbHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGNvdW50ZXJJbnN0YW5jZSxcbiAgICBpc3N1ZTogeyBjb250cmFjdDogZ292ZXJuZWRJbnN0YW5jZSB9XG4gIH0gPSBkZXRhaWxzO1xuICBtdXN0TWF0Y2goZGV0YWlscywgUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG4gIGNvbnN0IGdvdmVybm9ySW5zdGFuY2UgPSBhd2FpdCBFLmdldChFKHpvZSkuZ2V0VGVybXMoZ292ZXJuZWRJbnN0YW5jZSkpLlxuICBlbGVjdGlvbk1hbmFnZXI7XG4gIGNvbnN0IGdvdmVybm9yUHVibGljID0gRSh6b2UpLmdldFB1YmxpY0ZhY2V0KGdvdmVybm9ySW5zdGFuY2UpO1xuXG4gIHJldHVybiBQcm9taXNlLmFsbChbXG4gIEUoZ292ZXJub3JQdWJsaWMpLnZhbGlkYXRlVm90ZUNvdW50ZXIoY291bnRlckluc3RhbmNlKSxcbiAgRShnb3Zlcm5vclB1YmxpYykudmFsaWRhdGVFbGVjdG9yYXRlKGVsZWN0b3JhdGUpLFxuICBFKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZVRpbWVyKGRldGFpbHMuY2xvc2luZ1J1bGUpXVxuICApO1xufTskaM2PX29uY2UudmFsaWRhdGVRdWVzdGlvbkRldGFpbHModmFsaWRhdGVRdWVzdGlvbkRldGFpbHMpO1xuaGFyZGVuKHZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCB2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIgPSBhc3luYyAoXG56b2UsXG5lbGVjdG9yYXRlLFxudm90ZUNvdW50ZXIpID0+XG57XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb3VudGVyUHVibGljUCA9IEUoem9lKS5nZXRQdWJsaWNGYWNldCh2b3RlQ291bnRlcik7XG4gIGNvbnN0IHF1ZXN0aW9uRGV0YWlscyA9IGF3YWl0IEUoY291bnRlclB1YmxpY1ApLmdldERldGFpbHMoKTtcblxuICByZXR1cm4gdmFsaWRhdGVRdWVzdGlvbkRldGFpbHMoem9lLCBlbGVjdG9yYXRlLCBxdWVzdGlvbkRldGFpbHMpO1xufTskaM2PX29uY2UudmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyKHZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlcik7XG5oYXJkZW4odmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyKTtcblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc3RhcnQgPSBhc3luYyAoemNmLCBwcml2YXRlQXJncywgYmFnZ2FnZSkgPT4ge1xuICB0cmFjZSgnc3RhcnQnKTtcbiAgY29uc3Qgem9lID0gemNmLmdldFpvZVNlcnZpY2UoKTtcbiAgdHJhY2UoJ2dldFRlcm1zJywgemNmLmdldFRlcm1zKCkpO1xuICBjb25zdCB7XG4gICAgdGltZXIsXG4gICAgZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbixcbiAgICBnb3Zlcm5lZDoge1xuICAgICAgaXNzdWVyS2V5d29yZFJlY29yZDogZ292ZXJuZWRJc3N1ZXJLZXl3b3JkUmVjb3JkLFxuICAgICAgdGVybXM6IGNvbnRyYWN0VGVybXMsXG4gICAgICBsYWJlbDogZ292ZXJuZWRDb250cmFjdExhYmVsXG4gICAgfVxuICB9ID0gemNmLmdldFRlcm1zKCk7XG4gIHRyYWNlKCdjb250cmFjdFRlcm1zJywgY29udHJhY3RUZXJtcyk7XG4gIGNvbnRyYWN0VGVybXMuZ292ZXJuZWRQYXJhbXNbQ09OVFJBQ1RfRUxFQ1RPUkFURV0gfHxcbiAgRmFpbGBDb250cmFjdCBtdXN0IGRlY2xhcmUgJHtDT05UUkFDVF9FTEVDVE9SQVRFfSBhcyBhIGdvdmVybmVkIHBhcmFtZXRlcmA7XG5cbiAgY29uc3QgbWFrZUNvbnRyYWN0R292ZXJub3JLaXQgPSBwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdChiYWdnYWdlLCB7XG4gICAgdGltZXIsXG4gICAgem9lXG4gIH0pO1xuXG4gIHRyYWNlKCdhd2FpdGluZyBwcm92aWRlU2luZ2xldG9uKCknKTtcbiAgY29uc3QgZ292ZXJub3JLaXQgPSBhd2FpdCBwcm92aWRlU2luZ2xldG9uKFxuICAgIGJhZ2dhZ2UsXG4gICAgJ2NvbnRyYWN0R292ZXJub3JLaXQnLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGF1Z21lbnRlZFRlcm1zID0gaGFyZGVuKHtcbiAgICAgICAgLi4uY29udHJhY3RUZXJtcyxcbiAgICAgICAgZWxlY3Rpb25NYW5hZ2VyOiB6Y2YuZ2V0SW5zdGFuY2UoKVxuICAgICAgfSk7XG5cbiAgICAgIHRyYWNlKCdzdGFydGluZyBnb3Zlcm5lZENvbnRyYWN0SW5zdGFsbGF0aW9uIG9mJywgZ292ZXJuZWRDb250cmFjdExhYmVsKTtcbiAgICAgIGNvbnN0IHN0YXJ0ZWRJbnN0YW5jZUtpdCA9IGF3YWl0IEUoem9lKS5zdGFydEluc3RhbmNlKFxuICAgICAgICBnb3Zlcm5lZENvbnRyYWN0SW5zdGFsbGF0aW9uLFxuICAgICAgICBnb3Zlcm5lZElzc3VlcktleXdvcmRSZWNvcmQsXG5cbiAgICAgICAgLy9cbiAgICAgICAgYXVnbWVudGVkVGVybXMsXG4gICAgICAgIHByaXZhdGVBcmdzLmdvdmVybmVkLFxuICAgICAgICBnb3Zlcm5lZENvbnRyYWN0TGFiZWxcbiAgICAgICk7XG4gICAgICB0cmFjZSgnYXdhaXRpbmcgcmVtb3RlIGxpbWl0ZWRDcmVhdG9yRmFjZXQnKTtcbiAgICAgIGNvbnN0IGxpbWl0ZWRDcmVhdG9yRmFjZXQgPSBhd2FpdCBFKFxuICAgICAgICBzdGFydGVkSW5zdGFuY2VLaXQuY3JlYXRvckZhY2V0XG4gICAgICApLmdldExpbWl0ZWRDcmVhdG9yRmFjZXQoKTtcblxuICAgICAgcmV0dXJuIG1ha2VDb250cmFjdEdvdmVybm9yS2l0KHN0YXJ0ZWRJbnN0YW5jZUtpdCwgbGltaXRlZENyZWF0b3JGYWNldCk7XG4gICAgfVxuICApO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgdHJhY2UoJ3N0YXJ0IGNvbXBsZXRlJyk7XG5cbiAgLy9cbiAgcmV0dXJuIHsgY3JlYXRvckZhY2V0OiBnb3Zlcm5vcktpdC5jcmVhdG9yLCBwdWJsaWNGYWNldDogZ292ZXJub3JLaXQucHVibGljIH07XG59OyRozY9fb25jZS5zdGFydChzdGFydCk7XG5oYXJkZW4oc3RhcnQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWV0YSI6WyJtZXRhIl0sInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIjpbInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIl0sInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciI6WyJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiXSwic3RhcnQiOlsic3RhcnQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARl5o3/YpAAD2KQAANQAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybm9yS2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy90aW1lIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuRmlsdGVyLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsVW5ndWFyZGVkSGVscGVySSxtYWtlVHJhY2VyLE0scHJlcGFyZUV4b0NsYXNzS2l0LEUsSW52aXRhdGlvblNoYXBlLEluc3RhbmNlSGFuZGxlU2hhcGUsSW5zdGFsbGF0aW9uU2hhcGUsVGltZXN0YW1wU2hhcGUsc2V0dXBBcGlHb3Zlcm5hbmNlLHNldHVwRmlsdGVyR292ZXJuYW5jZSxDT05UUkFDVF9FTEVDVE9SQVRFLHNldHVwUGFyYW1Hb3Zlcm5hbmNlLENsb3NpbmdSdWxlU2hhcGUsUGFyYW1DaGFuZ2VzU3BlY1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIlVuZ3VhcmRlZEhlbHBlcklcIixbJGjNj19hID0+IChVbmd1YXJkZWRIZWxwZXJJID0gJGjNj19hKV1dLFtcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiSW52aXRhdGlvblNoYXBlXCIsWyRozY9fYSA9PiAoSW52aXRhdGlvblNoYXBlID0gJGjNj19hKV1dLFtcIkluc3RhbmNlSGFuZGxlU2hhcGVcIixbJGjNj19hID0+IChJbnN0YW5jZUhhbmRsZVNoYXBlID0gJGjNj19hKV1dLFtcIkluc3RhbGxhdGlvblNoYXBlXCIsWyRozY9fYSA9PiAoSW5zdGFsbGF0aW9uU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5BcGkuanNcIiwgW1tcInNldHVwQXBpR292ZXJuYW5jZVwiLFskaM2PX2EgPT4gKHNldHVwQXBpR292ZXJuYW5jZSA9ICRozY9fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc1wiLCBbW1wic2V0dXBGaWx0ZXJHb3Zlcm5hbmNlXCIsWyRozY9fYSA9PiAoc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlID0gJGjNj19hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanNcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIixbJGjNj19hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjNj19hKV1dLFtcInNldHVwUGFyYW1Hb3Zlcm5hbmNlXCIsWyRozY9fYSA9PiAoc2V0dXBQYXJhbUdvdmVybmFuY2UgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkNsb3NpbmdSdWxlU2hhcGVcIixbJGjNj19hID0+IChDbG9zaW5nUnVsZVNoYXBlID0gJGjNj19hKV1dLFtcIlBhcmFtQ2hhbmdlc1NwZWNTaGFwZVwiLFskaM2PX2EgPT4gKFBhcmFtQ2hhbmdlc1NwZWNTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG5jb25zdCB0cmFjZSA9IG1ha2VUcmFjZXIoJ0NHSycsIGZhbHNlKTtcblxuY29uc3QgQ29udHJhY3RHb3Zlcm5vcktpdEkgPSB7XG4gIGhlbHBlcjogVW5ndWFyZGVkSGVscGVySSxcbiAgY3JlYXRvcjogTS5pbnRlcmZhY2UoJ0NvbnRyYWN0IEdvdmVybm9yIEtpdCBjcmVhdG9yJywge1xuICAgIHJlcGxhY2VFbGVjdG9yYXRlOiBNLmNhbGwoSW52aXRhdGlvblNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICB2b3RlT25QYXJhbUNoYW5nZXM6IE0uY2FsbChcbiAgICAgIEluc3RhbGxhdGlvblNoYXBlLFxuICAgICAgVGltZXN0YW1wU2hhcGUsXG4gICAgICBQYXJhbUNoYW5nZXNTcGVjU2hhcGVcbiAgICApLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIHZvdGVPbkFwaUludm9jYXRpb246IE0uY2FsbChcbiAgICAgIE0uc3RyaW5nKCksXG4gICAgICBNLmFycmF5T2YoTS5hbnkoKSksXG4gICAgICBJbnN0YWxsYXRpb25TaGFwZSxcbiAgICAgIFRpbWVzdGFtcFNoYXBlXG4gICAgKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICB2b3RlT25PZmZlckZpbHRlcjogTS5jYWxsKFxuICAgICAgSW5zdGFsbGF0aW9uU2hhcGUsXG4gICAgICBUaW1lc3RhbXBTaGFwZSxcbiAgICAgIE0uYXJyYXlPZihNLnN0cmluZygpKVxuICAgICkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgZ2V0Q3JlYXRvckZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdFbGVjdG9yYXRlQ3JlYXRvcicpKSxcbiAgICBnZXRBZG1pbkZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdFbGVjdG9yYXRlQWRtaW4nKSksXG4gICAgZ2V0SW5zdGFuY2U6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG4gICAgZ2V0UHVibGljRmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ0VsZWN0b3JhdGVQdWJsaWMnKSlcbiAgfSksXG4gIHB1YmxpYzogTS5pbnRlcmZhY2UoJ0NvbnRyYWN0IEdvdmVybm9yIEtpdCBwdWJsaWMnLCB7XG4gICAgZ2V0RWxlY3RvcmF0ZTogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoIC8qICAgICAgICAgICovKSksXG4gICAgZ2V0R292ZXJuZWRDb250cmFjdDogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbiAgICB2YWxpZGF0ZVZvdGVDb3VudGVyOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgdmFsaWRhdGVFbGVjdG9yYXRlOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgdmFsaWRhdGVUaW1lcjogTS5jYWxsKENsb3NpbmdSdWxlU2hhcGUpLnJldHVybnMoKVxuICB9KVxufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQgPSAoYmFnZ2FnZSwgcG93ZXJzKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGZpbHRlckdvdmVybmFuY2U7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgcGFyYW1Hb3Zlcm5hbmNlO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBhcGlHb3Zlcm5hbmNlO1xuXG4gIC8qICAgICAgICAgICAgICAqL1xuICBsZXQgcG9zZXJGYWNldDtcblxuICBjb25zdCBtYWtlQ29udHJhY3RHb3Zlcm5vcktpdCA9IHByZXBhcmVFeG9DbGFzc0tpdChcbiAgICBiYWdnYWdlLFxuICAgICdDb250cmFjdEdvdmVybm9yS2l0JyxcbiAgICBDb250cmFjdEdvdmVybm9yS2l0SSxcbiAgICAvKlxuICAgICAgICovXG5cblxuICAgIChzdGFydGVkSW5zdGFuY2VLaXQsIGxpbWl0ZWRDcmVhdG9yRmFjZXQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXJ0ZWRJbnN0YW5jZUtpdCxcbiAgICAgICAgbGltaXRlZENyZWF0b3JGYWNldCxcbiAgICAgICAgY3VycmVudEludml0YXRpb246IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyhudWxsKVxuICAgICAgfTtcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlbHBlcjoge1xuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICBhc3luYyBnZXRFbGVjdG9yYXRlSW5zdGFuY2UoKSB7XG4gICAgICAgICAgY29uc3QgeyBwdWJsaWNGYWNldCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBjb25zdCBpbnZpdGF0aW9uQW1vdW50ID1cbiAgICAgICAgICBhd2FpdCBFKHB1YmxpY0ZhY2V0KS5nZXRJbnZpdGF0aW9uQW1vdW50KENPTlRSQUNUX0VMRUNUT1JBVEUpO1xuICAgICAgICAgIHJldHVybiBpbnZpdGF0aW9uQW1vdW50LnZhbHVlWzBdLmluc3RhbmNlO1xuICAgICAgICB9LFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGdldFVwZGF0ZWRQb3NlckZhY2V0KCkge1xuICAgICAgICAgIGNvbnN0IHsgY3JlYXRvckZhY2V0IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IG5ld0ludml0YXRpb24gPSBhd2FpdCBFKFxuICAgICAgICAgICAgRShFKGNyZWF0b3JGYWNldCkuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSkuZ2V0KHtcbiAgICAgICAgICAgICAga2V5OiAnZ292ZXJuZWRQYXJhbXMnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICkuZ2V0SW50ZXJuYWxQYXJhbVZhbHVlKENPTlRSQUNUX0VMRUNUT1JBVEUpO1xuXG4gICAgICAgICAgaWYgKG5ld0ludml0YXRpb24gIT09IHRoaXMuc3RhdGUuY3VycmVudEludml0YXRpb24pIHtcbiAgICAgICAgICAgIHBvc2VyRmFjZXQgPSBFKEUocG93ZXJzLnpvZSkub2ZmZXIobmV3SW52aXRhdGlvbikpLmdldE9mZmVyUmVzdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnRJbnZpdGF0aW9uID0gbmV3SW52aXRhdGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHBvc2VyRmFjZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHByb3ZpZGVBcGlHb3Zlcm5hbmNlKCkge1xuICAgICAgICAgIGNvbnN0IHsgdGltZXIgfSA9IHBvd2VycztcbiAgICAgICAgICBjb25zdCB7IGNyZWF0b3JGYWNldCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBhd2FpdCBudWxsO1xuICAgICAgICAgIGlmICghYXBpR292ZXJuYW5jZSkge1xuICAgICAgICAgICAgdHJhY2UoJ2F3YWl0aW5nIGdvdmVybmVkIEFQSSBkZXBlbmRlbmNpZXMnKTtcbiAgICAgICAgICAgIGNvbnN0IGdvdmVybmVkTmFtZXMgPSBhd2FpdCBFKGNyZWF0b3JGYWNldCkuZ2V0R292ZXJuZWRBcGlOYW1lcygpO1xuICAgICAgICAgICAgdHJhY2UoJ3NldHVwQXBpR292ZXJuYW5jZScpO1xuICAgICAgICAgICAgYXBpR292ZXJuYW5jZSA9IGdvdmVybmVkTmFtZXMubGVuZ3RoID9cbiAgICAgICAgICAgIHNldHVwQXBpR292ZXJuYW5jZShcbiAgICAgICAgICAgICAgKCkgPT4gRShjcmVhdG9yRmFjZXQpLmdldEdvdmVybmVkQXBpcygpLFxuICAgICAgICAgICAgICAoKSA9PiBFKGNyZWF0b3JGYWNldCkuZ2V0R292ZXJuZWRBcGlOYW1lcygpLFxuICAgICAgICAgICAgICB0aW1lcixcbiAgICAgICAgICAgICAgKCkgPT4gdGhpcy5mYWNldHMuaGVscGVyLmdldFVwZGF0ZWRQb3NlckZhY2V0KClcbiAgICAgICAgICAgICkgOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICB2b3RlT25BcGlJbnZvY2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2FwaSBnb3Zlcm5hbmNlIG5vdCBjb25maWd1cmVkJyk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNyZWF0ZWRRdWVzdGlvbjogKCkgPT4gZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhcGlHb3Zlcm5hbmNlO1xuICAgICAgICB9LFxuICAgICAgICBwcm92aWRlRmlsdGVyR292ZXJuYW5jZSgpIHtcbiAgICAgICAgICBpZiAoIWZpbHRlckdvdmVybmFuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGltZXIgfSA9IHBvd2VycztcbiAgICAgICAgICAgIGNvbnN0IHsgY3JlYXRvckZhY2V0IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgICAgZmlsdGVyR292ZXJuYW5jZSA9IHNldHVwRmlsdGVyR292ZXJuYW5jZShcbiAgICAgICAgICAgICAgdGltZXIsXG4gICAgICAgICAgICAgICgpID0+IHRoaXMuZmFjZXRzLmhlbHBlci5nZXRVcGRhdGVkUG9zZXJGYWNldCgpLFxuICAgICAgICAgICAgICBjcmVhdG9yRmFjZXRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaWx0ZXJHb3Zlcm5hbmNlO1xuICAgICAgICB9LFxuICAgICAgICBwcm92aWRlUGFyYW1Hb3Zlcm5hbmNlKCkge1xuICAgICAgICAgIGlmICghcGFyYW1Hb3Zlcm5hbmNlKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVyIH0gPSBwb3dlcnM7XG4gICAgICAgICAgICBjb25zdCB7IGNyZWF0b3JGYWNldCwgaW5zdGFuY2UgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgICBwYXJhbUdvdmVybmFuY2UgPSBzZXR1cFBhcmFtR292ZXJuYW5jZShcbiAgICAgICAgICAgICAgKCkgPT4gRShjcmVhdG9yRmFjZXQpLmdldFBhcmFtTWdyUmV0cmlldmVyKCksXG4gICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICB0aW1lcixcbiAgICAgICAgICAgICAgKCkgPT4gdGhpcy5mYWNldHMuaGVscGVyLmdldFVwZGF0ZWRQb3NlckZhY2V0KClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYXJhbUdvdmVybmFuY2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjcmVhdG9yOiB7XG4gICAgICAgIC8qXG4gICAgICAgICAgICovXG5cblxuICAgICAgICByZXBsYWNlRWxlY3RvcmF0ZShwb3Nlckludml0YXRpb24pIHtcbiAgICAgICAgICBjb25zdCB7IGNyZWF0b3JGYWNldCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgcGFyYW1NZ3IgPSBFKEUoY3JlYXRvckZhY2V0KS5nZXRQYXJhbU1nclJldHJpZXZlcigpKS5nZXQoe1xuICAgICAgICAgICAga2V5OiAnZ292ZXJuZWRQYXJhbXMnXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBFKHBhcmFtTWdyKS51cGRhdGVQYXJhbXMoe1xuICAgICAgICAgICAgRWxlY3RvcmF0ZTogcG9zZXJJbnZpdGF0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICB2b3RlT25QYXJhbUNoYW5nZXModm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIGRlYWRsaW5lLCBwYXJhbVNwZWMpIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgcmV0dXJuIGhlbHBlci5cbiAgICAgICAgICBwcm92aWRlUGFyYW1Hb3Zlcm5hbmNlKCkuXG4gICAgICAgICAgdm90ZU9uUGFyYW1DaGFuZ2VzKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLCBkZWFkbGluZSwgcGFyYW1TcGVjKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICB2b3RlT25BcGlJbnZvY2F0aW9uKFxuICAgICAgICBhcGlNZXRob2ROYW1lLFxuICAgICAgICBtZXRob2RBcmdzLFxuICAgICAgICB2b3RlQ291bnRlckluc3RhbGxhdGlvbixcbiAgICAgICAgZGVhZGxpbmUpXG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgcmV0dXJuIEUoaGVscGVyLnByb3ZpZGVBcGlHb3Zlcm5hbmNlKCkpLnZvdGVPbkFwaUludm9jYXRpb24oXG4gICAgICAgICAgICBhcGlNZXRob2ROYW1lLFxuICAgICAgICAgICAgbWV0aG9kQXJncyxcbiAgICAgICAgICAgIHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuICAgICAgICAgICAgZGVhZGxpbmVcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICB2b3RlT25PZmZlckZpbHRlcih2b3RlQ291bnRlckluc3RhbGxhdGlvbiwgZGVhZGxpbmUsIHN0cmluZ3MpIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgcmV0dXJuIGhlbHBlci5cbiAgICAgICAgICBwcm92aWRlRmlsdGVyR292ZXJuYW5jZSgpLlxuICAgICAgICAgIHZvdGVPbkZpbHRlcih2b3RlQ291bnRlckluc3RhbGxhdGlvbiwgZGVhZGxpbmUsIHN0cmluZ3MpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRDcmVhdG9yRmFjZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUubGltaXRlZENyZWF0b3JGYWNldDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0QWRtaW5GYWNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5hZG1pbkZhY2V0O1xuICAgICAgICB9LFxuICAgICAgICBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pbnN0YW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0UHVibGljRmFjZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucHVibGljRmFjZXQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwdWJsaWM6IHtcbiAgICAgICAgZ2V0RWxlY3RvcmF0ZSgpIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgcmV0dXJuIGhlbHBlci5nZXRFbGVjdG9yYXRlSW5zdGFuY2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0R292ZXJuZWRDb250cmFjdCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pbnN0YW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdmFsaWRhdGVWb3RlQ291bnRlcihjb3VudGVyKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXG4gICAgICAgICAgRS5nZXQoaGVscGVyLnByb3ZpZGVBcGlHb3Zlcm5hbmNlKCkpLFxuICAgICAgICAgIGhlbHBlci5wcm92aWRlRmlsdGVyR292ZXJuYW5jZSgpLFxuICAgICAgICAgIGhlbHBlci5wcm92aWRlUGFyYW1Hb3Zlcm5hbmNlKCldO1xuXG4gICAgICAgICAgY29uc3QgY2hlY2tzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB2YWxpZGF0b3JzLm1hcCgodmFsaWRhdGUpID0+IEUodmFsaWRhdGUuY3JlYXRlZFF1ZXN0aW9uKShjb3VudGVyKSlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY2hlY2tzLnNvbWUoQm9vbGVhbikgfHxcbiAgICAgICAgICBGYWlsYFZvdGVDb3VudGVyIHdhcyBub3QgY3JlYXRlZCBieSB0aGlzIGNvbnRyYWN0R292ZXJub3JgO1xuICAgICAgICB9LFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICB2YWxpZGF0ZUVsZWN0b3JhdGUocmVnUCkge1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICByZXR1cm4gRS53aGVuKHJlZ1AsIGFzeW5jIChyZWcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZWN0b3JhdGVJbnN0YW5jZSA9IGF3YWl0IGhlbHBlci5nZXRFbGVjdG9yYXRlSW5zdGFuY2UoKTtcbiAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgcmVnID09PSBlbGVjdG9yYXRlSW5zdGFuY2UsXG4gICAgICAgICAgICAgIFwiRWxlY3RvcmF0ZSBkb2Vzbid0IG1hdGNoIG15IEVsZWN0b3JhdGVcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgIHZhbGlkYXRlVGltZXIoY2xvc2luZ1J1bGUpIHtcbiAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICBjbG9zaW5nUnVsZS50aW1lciA9PT0gcG93ZXJzLnRpbWVyLFxuICAgICAgICAgICAgJ2Nsb3NpbmcgcnVsZSBtdXN0IHVzZSBteSB0aW1lcidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICApO1xuXG4gIHJldHVybiBtYWtlQ29udHJhY3RHb3Zlcm5vcktpdDtcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLnByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0KHByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0IjpbInByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACqlC4LWIQAA1iEAADAAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RIZWxwZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL3RpbWUiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qcyJdLCJleHBvcnRzIjpbIkdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkiLCJoYW5kbGVQYXJhbUdvdmVybmFuY2UiLCJwdWJsaWNNaXhpbkFQSSIsInZhbGlkYXRlRWxlY3RvcmF0ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRmFyLG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQsZ2V0TWV0aG9kTmFtZXMsb2JqZWN0TWFwLGlnbm9yZUNvbnRleHQscHJlcGFyZUV4byxNLEFtb3VudFNoYXBlLEJyYW5kU2hhcGUsUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsVGltZXN0YW1wUmVjb3JkU2hhcGUsRSxtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zLEdvdmVybm9yRmFjZXRTaGFwZSxDT05UUkFDVF9FTEVDVE9SQVRFOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXRcIixbJGjNj19hID0+IChtYWtlU3RvcmVkUHVibGlzaGVyS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChnZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXSxbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJpZ25vcmVDb250ZXh0XCIsWyRozY9fYSA9PiAoaWdub3JlQ29udGV4dCA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4byA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRTaGFwZVwiLFskaM2PX2EgPT4gKEFtb3VudFNoYXBlID0gJGjNj19hKV1dLFtcIkJyYW5kU2hhcGVcIixbJGjNj19hID0+IChCcmFuZFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlID0gJGjNj19hKV1dLFtcIlRpbWVzdGFtcFJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzXCIsIFtbXCJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zXCIsWyRozY9fYSA9PiAobWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiR292ZXJub3JGYWNldFNoYXBlXCIsWyRozY9fYSA9PiAoR292ZXJub3JGYWNldFNoYXBlID0gJGjNj19hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanNcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIixbJGjNj19hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgR09WRVJOQU5DRV9TVE9SQUdFX0tFWSA9ICdnb3Zlcm5hbmNlJzskaM2PX29uY2UuR09WRVJOQU5DRV9TVE9SQUdFX0tFWShHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZKTtcblxuY29uc3QgcHVibGljTWl4aW5BUEkgPSBoYXJkZW4oe1xuICBnZXRTdWJzY3JpcHRpb246IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JlZFN1YnNjcmlwdGlvbicpKSxcbiAgZ2V0R292ZXJuZWRQYXJhbXM6IE0uY2FsbCgpLnJldHVybnMoTS5vcihNLnJlY29yZCgpLCBNLnByb21pc2UoKSkpLFxuICBnZXRBbW91bnQ6IE0uY2FsbCgpLnJldHVybnMoQW1vdW50U2hhcGUpLFxuICBnZXRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhCcmFuZFNoYXBlKSxcbiAgZ2V0SW5zdGFuY2U6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ0luc3RhbmNlJykpLFxuICBnZXRJbnN0YWxsYXRpb246IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSxcbiAgZ2V0SW52aXRhdGlvbkFtb3VudDogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldE5hdDogTS5jYWxsKCkucmV0dXJucyhNLmJpZ2ludCgpKSxcbiAgZ2V0UmF0aW86IE0uY2FsbCgpLnJldHVybnMoTS5yZWNvcmQoKSksXG4gIGdldFN0cmluZzogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0VGltZXN0YW1wOiBNLmNhbGwoKS5yZXR1cm5zKFRpbWVzdGFtcFJlY29yZFNoYXBlKSxcbiAgZ2V0UmVsYXRpdmVUaW1lOiBNLmNhbGwoKS5yZXR1cm5zKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlKSxcbiAgZ2V0VW5rbm93bjogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKVxufSk7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5wdWJsaWNNaXhpbkFQSShwdWJsaWNNaXhpbkFQSSk7XG5jb25zdCB2YWxpZGF0ZUVsZWN0b3JhdGUgPSAoemNmLCBwYXJhbU1hbmFnZXIpID0+IHtcbiAgY29uc3QgaW52aXRhdGlvbiA9IHBhcmFtTWFuYWdlci5nZXRJbnRlcm5hbFBhcmFtVmFsdWUoQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG4gIHJldHVybiBFLndoZW4oXG4gICAgRSh6Y2YuZ2V0SW52aXRhdGlvbklzc3VlcigpKS5pc0xpdmUoaW52aXRhdGlvbiksXG4gICAgKGlzTGl2ZSkgPT4gaXNMaXZlIHx8IEZhaWxgRWxlY3RvcmF0ZSBpbnZpdGF0aW9uIGlzIG5vdCBsaXZlLmBcbiAgKTtcbn07JGjNj19vbmNlLnZhbGlkYXRlRWxlY3RvcmF0ZSh2YWxpZGF0ZUVsZWN0b3JhdGUpO1xuaGFyZGVuKHZhbGlkYXRlRWxlY3RvcmF0ZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBmYWNldEhlbHBlcnMgPSAoemNmLCBwYXJhbU1hbmFnZXIpID0+IHtcbiAgLy9cbiAgLy9cbiAgdm9pZCB2YWxpZGF0ZUVsZWN0b3JhdGUoemNmLCBwYXJhbU1hbmFnZXIpO1xuXG4gIGNvbnN0IHR5cGVkQWNjZXNzb3JzID0ge1xuICAgIGdldEFtb3VudDogcGFyYW1NYW5hZ2VyLmdldEFtb3VudCxcbiAgICBnZXRCcmFuZDogcGFyYW1NYW5hZ2VyLmdldEJyYW5kLFxuICAgIGdldEluc3RhbmNlOiBwYXJhbU1hbmFnZXIuZ2V0SW5zdGFuY2UsXG4gICAgZ2V0SW5zdGFsbGF0aW9uOiBwYXJhbU1hbmFnZXIuZ2V0SW5zdGFsbGF0aW9uLFxuICAgIGdldEludml0YXRpb25BbW91bnQ6IHBhcmFtTWFuYWdlci5nZXRJbnZpdGF0aW9uQW1vdW50LFxuICAgIGdldE5hdDogcGFyYW1NYW5hZ2VyLmdldE5hdCxcbiAgICBnZXRSYXRpbzogcGFyYW1NYW5hZ2VyLmdldFJhdGlvLFxuICAgIGdldFN0cmluZzogcGFyYW1NYW5hZ2VyLmdldFN0cmluZyxcbiAgICBnZXRUaW1lc3RhbXA6IHBhcmFtTWFuYWdlci5nZXRUaW1lc3RhbXAsXG4gICAgZ2V0UmVsYXRpdmVUaW1lOiBwYXJhbU1hbmFnZXIuZ2V0UmVsYXRpdmVUaW1lLFxuICAgIGdldFVua25vd246IHBhcmFtTWFuYWdlci5nZXRVbmtub3duXG4gIH07XG5cbiAgY29uc3QgY29tbW9uUHVibGljTWV0aG9kcyA9IHtcbiAgICBnZXRTdWJzY3JpcHRpb246ICgpID0+IHBhcmFtTWFuYWdlci5nZXRTdWJzY3JpcHRpb24oKSxcbiAgICBnZXRHb3Zlcm5lZFBhcmFtczogKCkgPT4gcGFyYW1NYW5hZ2VyLmdldFBhcmFtcygpXG4gIH07XG5cbiAgLypcbiAgXG4gICAgICovXG5cblxuXG5cbiAgY29uc3QgYXVnbWVudFB1YmxpY0ZhY2V0ID0gKG9yaWdpbmFsUHVibGljRmFjZXQpID0+IHtcbiAgICByZXR1cm4gRmFyKCdwdWJsaWNGYWNldCcsIHtcbiAgICAgIC4uLm9yaWdpbmFsUHVibGljRmFjZXQsXG4gICAgICAuLi5jb21tb25QdWJsaWNNZXRob2RzLFxuICAgICAgLi4udHlwZWRBY2Nlc3NvcnNcbiAgICB9KTtcbiAgfTtcblxuICAvKlxuICBcbiAgICAqL1xuXG5cblxuICBjb25zdCBhdWdtZW50VmlydHVhbFB1YmxpY0ZhY2V0ID0gKG9yaWdpbmFsUHVibGljRmFjZXQpID0+IHtcbiAgICByZXR1cm4gRmFyKCdwdWJsaWNGYWNldCcsIHtcbiAgICAgIC4uLm9yaWdpbmFsUHVibGljRmFjZXQsXG4gICAgICAuLi5jb21tb25QdWJsaWNNZXRob2RzLFxuICAgICAgLi4ub2JqZWN0TWFwKHR5cGVkQWNjZXNzb3JzLCBpZ25vcmVDb250ZXh0KVxuICAgIH0pO1xuICB9O1xuXG4gIC8qXG4gIFxuICAgICovXG5cblxuXG4gIGNvbnN0IG1ha2VGYXJHb3Zlcm5vckZhY2V0ID0gKGxpbWl0ZWRDcmVhdG9yRmFjZXQsIGdvdmVybmVkQXBpcyA9IHt9KSA9PiB7XG4gICAgY29uc3QgZ292ZXJub3JGYWNldCA9IEZhcignZ292ZXJub3JGYWNldCcsIHtcbiAgICAgIGdldFBhcmFtTWdyUmV0cmlldmVyOiAoKSA9PlxuICAgICAgRmFyKCdwYXJhbVJldHJpZXZlcicsIHsgZ2V0OiAoKSA9PiBwYXJhbU1hbmFnZXIgfSksXG4gICAgICBnZXRJbnZpdGF0aW9uOiAobmFtZSkgPT4gcGFyYW1NYW5hZ2VyLmdldEludGVybmFsUGFyYW1WYWx1ZShuYW1lKSxcbiAgICAgIGdldExpbWl0ZWRDcmVhdG9yRmFjZXQ6ICgpID0+IGxpbWl0ZWRDcmVhdG9yRmFjZXQsXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgZ2V0R292ZXJuZWRBcGlzOiAoKSA9PiBGYXIoJ2dvdmVybmVkQVBJcycsIGdvdmVybmVkQXBpcyksXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBnZXRHb3Zlcm5lZEFwaU5hbWVzOiAoKSA9PiBPYmplY3Qua2V5cyhnb3Zlcm5lZEFwaXMpLFxuICAgICAgc2V0T2ZmZXJGaWx0ZXI6IChzdHJpbmdzKSA9PiB6Y2Yuc2V0T2ZmZXJGaWx0ZXIoc3RyaW5ncylcbiAgICB9KTtcblxuICAgIC8vXG4gICAgcmV0dXJuIGdvdmVybm9yRmFjZXQ7XG4gIH07XG5cbiAgLypcbiAgXG4gICAgKi9cblxuXG5cbiAgY29uc3QgbWFrZUdvdmVybm9yRmFjZXQgPSAob3JpZ2luYWxDcmVhdG9yRmFjZXQsIGdvdmVybmVkQXBpcyA9IHt9KSA9PiB7XG4gICAgcmV0dXJuIG1ha2VGYXJHb3Zlcm5vckZhY2V0KG9yaWdpbmFsQ3JlYXRvckZhY2V0LCBnb3Zlcm5lZEFwaXMpO1xuICB9O1xuXG4gIC8qXG4gIFxuICBcbiAgICovXG5cblxuXG5cbiAgY29uc3QgbWFrZVZpcnR1YWxHb3Zlcm5vckZhY2V0ID0gKGxpbWl0ZWRDcmVhdG9yRmFjZXQpID0+IHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgZ292ZXJub3JGYWNldCA9IGhhcmRlbih7XG4gICAgICBnZXRQYXJhbU1nclJldHJpZXZlcjogKCkgPT5cbiAgICAgIEZhcigncGFyYW1SZXRyaWV2ZXInLCB7IGdldDogKCkgPT4gcGFyYW1NYW5hZ2VyIH0pLFxuICAgICAgZ2V0SW52aXRhdGlvbjogKF9jb250ZXh0LCAvKiAgICAgICAgICAgICAgICAgKi9uYW1lKSA9PlxuICAgICAgcGFyYW1NYW5hZ2VyLmdldEludGVybmFsUGFyYW1WYWx1ZShuYW1lKSxcbiAgICAgIGdldExpbWl0ZWRDcmVhdG9yRmFjZXQ6ICh7IGZhY2V0cyB9KSA9PiBmYWNldHMubGltaXRlZENyZWF0b3JGYWNldCxcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgZ2V0R292ZXJuZWRBcGlzOiAoeyBmYWNldHMgfSkgPT4gZmFjZXRzLmdvdmVybmVkQXBpcyxcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGdldEdvdmVybmVkQXBpTmFtZXM6ICh7IGZhY2V0cyB9KSA9PlxuICAgICAgZ2V0TWV0aG9kTmFtZXMoZmFjZXRzLmdvdmVybmVkQXBpcyB8fCB7fSksXG4gICAgICBzZXRPZmZlckZpbHRlcjogKF9jb250ZXh0LCBzdHJpbmdzKSA9PiB6Y2Yuc2V0T2ZmZXJGaWx0ZXIoc3RyaW5ncylcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGdvdmVybm9yRmFjZXQsIGxpbWl0ZWRDcmVhdG9yRmFjZXQgfTtcbiAgfTtcblxuICAvKlxuICBcbiAgXG4gICAgICovXG5cblxuXG5cblxuXG4gIGNvbnN0IG1ha2VEdXJhYmxlR292ZXJub3JGYWNldCA9IChcbiAgYmFnZ2FnZSxcbiAgbGltaXRlZENyZWF0b3JGYWNldCxcbiAgZ292ZXJuZWRBcGlzID0ge30pID0+XG4gIHtcbiAgICBjb25zdCBmYXJHb3Zlcm5lZEFwaXMgPSBGYXIoJ2dvdmVybmVkQVBJcycsIHsgLi4uZ292ZXJuZWRBcGlzIH0pO1xuICAgIGNvbnN0IGdvdmVybm9yRmFjZXQgPSBwcmVwYXJlRXhvKFxuICAgICAgYmFnZ2FnZSxcbiAgICAgICdnb3Zlcm5vckZhY2V0JyxcbiAgICAgIE0uaW50ZXJmYWNlKCdnb3Zlcm5vckZhY2V0JywgR292ZXJub3JGYWNldFNoYXBlKSxcbiAgICAgIHtcbiAgICAgICAgZ2V0UGFyYW1NZ3JSZXRyaWV2ZXI6ICgpID0+XG4gICAgICAgIEZhcigncGFyYW1SZXRyaWV2ZXInLCB7IGdldDogKCkgPT4gcGFyYW1NYW5hZ2VyIH0pLFxuICAgICAgICBnZXRJbnZpdGF0aW9uOiAobmFtZSkgPT4gcGFyYW1NYW5hZ2VyLmdldEludGVybmFsUGFyYW1WYWx1ZShuYW1lKSxcbiAgICAgICAgZ2V0TGltaXRlZENyZWF0b3JGYWNldDogKCkgPT4gbGltaXRlZENyZWF0b3JGYWNldCxcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgIGdldEdvdmVybmVkQXBpczogKCkgPT4gZmFyR292ZXJuZWRBcGlzLFxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBnZXRHb3Zlcm5lZEFwaU5hbWVzOiAoKSA9PiBPYmplY3Qua2V5cyhnb3Zlcm5lZEFwaXMgfHwge30pLFxuICAgICAgICBzZXRPZmZlckZpbHRlcjogKHN0cmluZ3MpID0+IHpjZi5zZXRPZmZlckZpbHRlcihzdHJpbmdzKVxuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4geyBnb3Zlcm5vckZhY2V0LCBsaW1pdGVkQ3JlYXRvckZhY2V0IH07XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgcHVibGljTWl4aW46IHtcbiAgICAgIC4uLmNvbW1vblB1YmxpY01ldGhvZHMsXG4gICAgICAuLi50eXBlZEFjY2Vzc29yc1xuICAgIH0sXG4gICAgYXVnbWVudFB1YmxpY0ZhY2V0LFxuICAgIGF1Z21lbnRWaXJ0dWFsUHVibGljRmFjZXQsXG4gICAgbWFrZUdvdmVybm9yRmFjZXQsXG5cbiAgICBtYWtlRmFyR292ZXJub3JGYWNldCxcbiAgICBtYWtlVmlydHVhbEdvdmVybm9yRmFjZXQsXG4gICAgbWFrZUR1cmFibGVHb3Zlcm5vckZhY2V0LFxuXG4gICAgcGFyYW1zOiBwYXJhbU1hbmFnZXIucmVhZG9ubHkoKVxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlID0gKFxuemNmLFxuaW5pdGlhbFBvc2VySW52aXRhdGlvbixcbnBhcmFtVHlwZXNNYXAsXG5zdG9yYWdlTm9kZSxcbm1hcnNoYWxsZXIsXG5vdmVycmlkZXMpID0+XG57XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHB1Ymxpc2hlcktpdCA9IG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQoXG4gICAgc3RvcmFnZU5vZGUsXG4gICAgbWFyc2hhbGxlcixcbiAgICBHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZXG4gICk7XG4gIGNvbnN0IHBhcmFtTWFuYWdlciA9IG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMoXG4gICAgcHVibGlzaGVyS2l0LFxuICAgIHpjZixcbiAgICB7IEVsZWN0b3JhdGU6IGluaXRpYWxQb3Nlckludml0YXRpb24gfSxcbiAgICBwYXJhbVR5cGVzTWFwLFxuICAgIG92ZXJyaWRlc1xuICApO1xuXG4gIHJldHVybiBmYWNldEhlbHBlcnMoemNmLCBwYXJhbU1hbmFnZXIpO1xufTskaM2PX29uY2UuaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlKGhhbmRsZVBhcmFtR292ZXJuYW5jZSk7XG5cbmhhcmRlbihoYW5kbGVQYXJhbUdvdmVybmFuY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHVibGljTWl4aW5BUEkiOlsicHVibGljTWl4aW5BUEkiXSwiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIjpbImhhbmRsZVBhcmFtR292ZXJuYW5jZSJdLCJHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZIjpbIkdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkiXSwidmFsaWRhdGVFbGVjdG9yYXRlIjpbInZhbGlkYXRlRWxlY3RvcmF0ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADsUWPwPQkAAD0JAAAnAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vcXVlc3Rpb24uanMiLCIuL2NvbnRyYWN0R292ZXJub3IuanMiLCIuL2NvbnRyYWN0SGVscGVyLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyIsIi4vdmFsaWRhdG9ycy5qcyIsIi4vY29uc3RhbnRzLmpzIl0sImV4cG9ydHMiOlsiRWxlY3Rpb25UeXBlIiwiRWxlY3Rpb25UeXBlIiwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIiwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciIsIm1ha2VQYXJhbU1hbmFnZXJTeW5jIiwibWFrZVBhcmFtTWFuYWdlclN5bmMiLCJwdWJsaWNNaXhpbkFQSSIsInB1YmxpY01peGluQVBJIiwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIiwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIixudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9xdWVzdGlvbi5qc1wiLCBbXV0sW1wiLi9jb250cmFjdEdvdmVybm9yLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0SGVscGVyLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc1wiLCBbXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qc1wiLCBbXV0sW1wiLi92YWxpZGF0b3JzLmpzXCIsIFtdXSxbXCIuL2NvbnN0YW50cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vcXVlc3Rpb24uanMiOltbIkNob2ljZU1ldGhvZCIsIkNob2ljZU1ldGhvZCJdLFsiRWxlY3Rpb25UeXBlIiwiRWxlY3Rpb25UeXBlIl0sWyJRdW9ydW1SdWxlIiwiUXVvcnVtUnVsZSJdLFsiY29lcmNlUXVlc3Rpb25TcGVjIiwiY29lcmNlUXVlc3Rpb25TcGVjIl0sWyJwb3NpdGlvbkluY2x1ZGVkIiwicG9zaXRpb25JbmNsdWRlZCJdLFsiYnVpbGRRdWVzdGlvbiIsImJ1aWxkUXVlc3Rpb24iXV0sIi4vY29udHJhY3RHb3Zlcm5vci5qcyI6W1sidmFsaWRhdGVRdWVzdGlvbkRldGFpbHMiLCJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyJdLFsidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIiwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIl1dLCIuL2NvbnRyYWN0SGVscGVyLmpzIjpbWyJoYW5kbGVQYXJhbUdvdmVybmFuY2UiLCJoYW5kbGVQYXJhbUdvdmVybmFuY2UiXSxbInB1YmxpY01peGluQVBJIiwicHVibGljTWl4aW5BUEkiXV0sIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIjpbWyJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIiwiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSJdLFsibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIl0sWyJzZXR1cFBhcmFtR292ZXJuYW5jZSIsInNldHVwUGFyYW1Hb3Zlcm5hbmNlIl0sWyJDT05UUkFDVF9FTEVDVE9SQVRFIiwiQ09OVFJBQ1RfRUxFQ1RPUkFURSJdXSwiLi9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzIjpbWyJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyIsImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzIl0sWyJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciIsIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyIl1dLCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyI6W1sibWFrZVBhcmFtTWFuYWdlciIsIm1ha2VQYXJhbU1hbmFnZXIiXSxbIm1ha2VQYXJhbU1hbmFnZXJTeW5jIiwibWFrZVBhcmFtTWFuYWdlclN5bmMiXV0sIi4vdmFsaWRhdG9ycy5qcyI6W1siYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIiwiYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIl0sWyJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiLCJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiXV0sIi4vY29uc3RhbnRzLmpzIjpbWyJQYXJhbVR5cGVzIiwiUGFyYW1UeXBlcyJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/Ob0YpcMAACXDAAAKgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9xdWVzdGlvbi5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy96b2Uvc3JjL21ha2VIYW5kbGUuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJDaG9pY2VNZXRob2QiLCJFbGVjdGlvblR5cGUiLCJRdW9ydW1SdWxlIiwiYnVpbGRRdWVzdGlvbiIsImNvZXJjZVF1ZXN0aW9uU3BlYyIsInBvc2l0aW9uSW5jbHVkZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlRXhvLG11c3RNYXRjaCxrZXlFUSxNLG1ha2VIYW5kbGUsUXVlc3Rpb25JLFF1ZXN0aW9uU3BlY1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZUV4b1wiLFskaM2PX2EgPT4gKG1ha2VFeG8gPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qc1wiLCBbW1wibWFrZUhhbmRsZVwiLFskaM2PX2EgPT4gKG1ha2VIYW5kbGUgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlF1ZXN0aW9uSVwiLFskaM2PX2EgPT4gKFF1ZXN0aW9uSSA9ICRozY9fYSldXSxbXCJRdWVzdGlvblNwZWNTaGFwZVwiLFskaM2PX2EgPT4gKFF1ZXN0aW9uU3BlY1NoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLypcblxuICovXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgQ2hvaWNlTWV0aG9kID0gLyogICAgICAgICAgICAgICAgKi8oe1xuICBVTlJBTktFRDogJ3VucmFua2VkJyxcbiAgT1JERVI6ICdvcmRlcicsXG4gIFBMVVJBTElUWTogJ3BsdXJhbGl0eSdcbn0pOyRozY9fb25jZS5DaG9pY2VNZXRob2QoQ2hvaWNlTWV0aG9kKTtcblxuY29uc3QgRWxlY3Rpb25UeXBlID0gLyogICAgICAgICAgICAgICAgKi8oe1xuICAvL1xuICBQQVJBTV9DSEFOR0U6ICdwYXJhbV9jaGFuZ2UnLFxuICAvL1xuICBFTEVDVElPTjogJ2VsZWN0aW9uJyxcbiAgU1VSVkVZOiAnc3VydmV5JyxcbiAgLy9cbiAgQVBJX0lOVk9DQVRJT046ICdhcGlfaW52b2NhdGlvbicsXG4gIE9GRkVSX0ZJTFRFUjogJ29mZmVyX2ZpbHRlcidcbn0pOyRozY9fb25jZS5FbGVjdGlvblR5cGUoRWxlY3Rpb25UeXBlKTtcblxuY29uc3QgUXVvcnVtUnVsZSA9IC8qICAgICAgICAgICAgICAgICovKHtcbiAgTUFKT1JJVFk6ICdtYWpvcml0eScsXG4gIE5PX1FVT1JVTTogJ25vX3F1b3J1bScsXG4gIC8vXG4gIEFMTDogJ2FsbCdcbn0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLlF1b3J1bVJ1bGUoUXVvcnVtUnVsZSk7XG5jb25zdCBwb3NpdGlvbkluY2x1ZGVkID0gKHBvc2l0aW9ucywgcCkgPT4gcG9zaXRpb25zLnNvbWUoKGUpID0+IGtleUVRKGUsIHApKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5wb3NpdGlvbkluY2x1ZGVkKHBvc2l0aW9uSW5jbHVkZWQpO1xuY29uc3QgY29lcmNlUXVlc3Rpb25TcGVjID0gKHtcbiAgbWV0aG9kLFxuICBpc3N1ZSxcbiAgcG9zaXRpb25zLFxuICBlbGVjdGlvblR5cGUsXG4gIG1heENob2ljZXMsXG4gIG1heFdpbm5lcnMsXG4gIGNsb3NpbmdSdWxlLFxuICBxdW9ydW1SdWxlLFxuICB0aWVPdXRjb21lXG59KSA9PiB7XG4gIGNvbnN0IHF1ZXN0aW9uID0gaGFyZGVuKHtcbiAgICBtZXRob2QsXG4gICAgaXNzdWUsXG4gICAgcG9zaXRpb25zLFxuICAgIG1heENob2ljZXM6IE51bWJlcihtYXhDaG9pY2VzKSxcbiAgICBtYXhXaW5uZXJzOiBOdW1iZXIobWF4V2lubmVycyksXG4gICAgZWxlY3Rpb25UeXBlLFxuICAgIGNsb3NpbmdSdWxlLFxuICAgIHF1b3J1bVJ1bGUsXG4gICAgdGllT3V0Y29tZVxuICB9KTtcblxuICBtdXN0TWF0Y2gocXVlc3Rpb24sIFF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBtdXN0TWF0Y2gocXVlc3Rpb24udGllT3V0Y29tZSwgTS5vciguLi5xdWVzdGlvbi5wb3NpdGlvbnMpKTtcblxuICByZXR1cm4gcXVlc3Rpb247XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLmNvZXJjZVF1ZXN0aW9uU3BlYyhjb2VyY2VRdWVzdGlvblNwZWMpO1xuY29uc3QgYnVpbGRRdWVzdGlvbiA9IChxdWVzdGlvblNwZWMsIGNvdW50ZXJJbnN0YW5jZSkgPT4ge1xuICBjb25zdCBxdWVzdGlvbkhhbmRsZSA9IG1ha2VIYW5kbGUoJ1F1ZXN0aW9uJyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgKi9cbiAgcmV0dXJuIG1ha2VFeG8oJ3F1ZXN0aW9uIGRldGFpbHMnLCBRdWVzdGlvbkksIHtcbiAgICBnZXRWb3RlQ291bnRlcigpIHtcbiAgICAgIHJldHVybiBjb3VudGVySW5zdGFuY2U7XG4gICAgfSxcbiAgICBnZXREZXRhaWxzKCkge1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIC4uLnF1ZXN0aW9uU3BlYyxcbiAgICAgICAgcXVlc3Rpb25IYW5kbGUsXG4gICAgICAgIGNvdW50ZXJJbnN0YW5jZVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn07JGjNj19vbmNlLmJ1aWxkUXVlc3Rpb24oYnVpbGRRdWVzdGlvbik7XG5cbmhhcmRlbihidWlsZFF1ZXN0aW9uKTtcbmhhcmRlbihDaG9pY2VNZXRob2QpO1xuaGFyZGVuKEVsZWN0aW9uVHlwZSk7XG5oYXJkZW4oY29lcmNlUXVlc3Rpb25TcGVjKTtcbmhhcmRlbihwb3NpdGlvbkluY2x1ZGVkKTtcbmhhcmRlbihRdW9ydW1SdWxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNob2ljZU1ldGhvZCI6WyJDaG9pY2VNZXRob2QiXSwiRWxlY3Rpb25UeXBlIjpbIkVsZWN0aW9uVHlwZSJdLCJRdW9ydW1SdWxlIjpbIlF1b3J1bVJ1bGUiXSwicG9zaXRpb25JbmNsdWRlZCI6WyJwb3NpdGlvbkluY2x1ZGVkIl0sImNvZXJjZVF1ZXN0aW9uU3BlYyI6WyJjb2VyY2VRdWVzdGlvblNwZWMiXSwiYnVpbGRRdWVzdGlvbiI6WyJidWlsZFF1ZXN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABjsF3xRPQAAUT0AACwAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIiwiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL25vdGlmaWVyIl0sImV4cG9ydHMiOlsiQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlIiwiQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlIiwiQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkiLCJCaW5hcnlWb3RlQ291bnRlckNsb3NlSSIsIkJpbmFyeVZvdGVDb3VudGVyUHVibGljSSIsIkNob2ljZU1ldGhvZFNoYXBlIiwiQ2xvc2luZ1J1bGVTaGFwZSIsIkVsZWN0aW9uVHlwZVNoYXBlIiwiRWxlY3RvcmF0ZUNyZWF0b3JJIiwiRWxlY3RvcmF0ZVB1YmxpY0kiLCJHb3Zlcm5vckZhY2V0U2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIiwiTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiLCJOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiLCJOb1NpbXBsZVBvc2l0aW9uU2hhcGUiLCJPZmZlckZpbHRlcklzc3VlU2hhcGUiLCJPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlIiwiT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSIsIk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUiLCJQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlIiwiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiLCJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSIsIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIiwiUGFyYW1DaGFuZ2VzU3BlY1NoYXBlIiwiUGFyYW1QYXRoU2hhcGUiLCJQb3NpdGlvblNoYXBlIiwiUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJRdWVzdGlvbkhhbmRsZVNoYXBlIiwiUXVlc3Rpb25JIiwiUXVlc3Rpb25TcGVjU2hhcGUiLCJRdWVzdGlvblN0YXRzU2hhcGUiLCJRdW9ydW1SdWxlU2hhcGUiLCJTaW1wbGVJc3N1ZVNoYXBlIiwiU2ltcGxlUG9zaXRpb25zU2hhcGUiLCJTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSIsIlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlIiwiVm90ZUNvdW50ZXJBZG1pbkkiLCJWb3RlQ291bnRlckNsb3NlSSIsIlZvdGVDb3VudGVyUHVibGljSSIsIlZvdGVySGFuZGxlIiwiWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiLCJZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiLCJZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIiwiWWVzU2ltcGxlUG9zaXRpb25TaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sVGltZXN0YW1wU2hhcGUsSW5zdGFuY2VIYW5kbGVTaGFwZSxUaW1lclNoYXBlLG1ha2VIYW5kbGVTaGFwZSxTdWJzY3JpYmVyU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJJbnN0YW5jZUhhbmRsZVNoYXBlXCIsWyRozY9fYSA9PiAoSW5zdGFuY2VIYW5kbGVTaGFwZSA9ICRozY9fYSldXSxbXCJUaW1lclNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXJTaGFwZSA9ICRozY9fYSldXSxbXCJtYWtlSGFuZGxlU2hhcGVcIixbJGjNj19hID0+IChtYWtlSGFuZGxlU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIixbJGjNj19hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbmNvbnN0IENob2ljZU1ldGhvZFNoYXBlID0gTS5vcigndW5yYW5rZWQnLCAnb3JkZXInLCAncGx1cmFsaXR5Jyk7JGjNj19vbmNlLkNob2ljZU1ldGhvZFNoYXBlKENob2ljZU1ldGhvZFNoYXBlKTtcbmNvbnN0IFF1b3J1bVJ1bGVTaGFwZSA9IE0ub3IoJ21ham9yaXR5JywgJ25vX3F1b3J1bScsICdhbGwnKTskaM2PX29uY2UuUXVvcnVtUnVsZVNoYXBlKFF1b3J1bVJ1bGVTaGFwZSk7XG5jb25zdCBFbGVjdGlvblR5cGVTaGFwZSA9IE0ub3IoXG4gICdwYXJhbV9jaGFuZ2UnLFxuICAnZWxlY3Rpb24nLFxuICAnc3VydmV5JyxcbiAgJ2FwaV9pbnZvY2F0aW9uJyxcbiAgJ29mZmVyX2ZpbHRlcidcbik7JGjNj19vbmNlLkVsZWN0aW9uVHlwZVNoYXBlKEVsZWN0aW9uVHlwZVNoYXBlKTtcblxuY29uc3QgQ2xvc2luZ1J1bGVTaGFwZSA9IHtcbiAgdGltZXI6IE0uZXJlZihUaW1lclNoYXBlKSxcbiAgZGVhZGxpbmU6IFRpbWVzdGFtcFNoYXBlXG59OyRozY9fb25jZS5DbG9zaW5nUnVsZVNoYXBlKENsb3NpbmdSdWxlU2hhcGUpO1xuaGFyZGVuKENsb3NpbmdSdWxlU2hhcGUpO1xuXG4vL1xuY29uc3QgWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlID0ge1xuICBzdHJpbmdzOiBNLmFycmF5T2YoTS5zdHJpbmcoKSlcbn07JGjNj19vbmNlLlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZShZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKFllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSk7XG5cbmNvbnN0IE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlID0geyBkb250VXBkYXRlOiBNLmFycmF5T2YoTS5zdHJpbmcoKSkgfTskaM2PX29uY2UuTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUoTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKTtcblxuY29uc3QgT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSA9IFtcblllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlXTskaM2PX29uY2UuT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZShPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlKTtcblxuaGFyZGVuKE9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUpO1xuXG5jb25zdCBPZmZlckZpbHRlcklzc3VlU2hhcGUgPSB7IHN0cmluZ3M6IE0uYXJyYXlPZihNLnN0cmluZygpKSB9OyRozY9fb25jZS5PZmZlckZpbHRlcklzc3VlU2hhcGUoT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlKTtcbmhhcmRlbihPZmZlckZpbHRlcklzc3VlU2hhcGUpO1xuXG5jb25zdCBPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlID0ge1xuICBtZXRob2Q6IENob2ljZU1ldGhvZFNoYXBlLFxuICBpc3N1ZTogT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlLFxuICBwb3NpdGlvbnM6IE9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUsXG4gIGVsZWN0aW9uVHlwZTogJ29mZmVyX2ZpbHRlcicsXG4gIG1heENob2ljZXM6IDEsXG4gIG1heFdpbm5lcnM6IDEsXG4gIGNsb3NpbmdSdWxlOiBDbG9zaW5nUnVsZVNoYXBlLFxuICBxdW9ydW1SdWxlOiBRdW9ydW1SdWxlU2hhcGUsXG4gIHRpZU91dGNvbWU6IE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlXG59OyRozY9fb25jZS5PZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlKE9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUpO1xuaGFyZGVuKE9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG5jb25zdCBPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlID0ge1xuICAuLi5PZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlLFxuICBxdWVzdGlvbkhhbmRsZTogbWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuICBjb3VudGVySW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGVcbn07JGjNj19vbmNlLk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUoT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5oYXJkZW4oT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cbi8vXG5jb25zdCBQYXJhbUNoYW5nZXNTcGVjU2hhcGUgPSBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0uYW55KCkpOyRozY9fb25jZS5QYXJhbUNoYW5nZXNTcGVjU2hhcGUoUGFyYW1DaGFuZ2VzU3BlY1NoYXBlKTtcbmNvbnN0IFllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUgPSBQYXJhbUNoYW5nZXNTcGVjU2hhcGU7JGjNj19vbmNlLlllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUoWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSk7XG5jb25zdCBOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUgPSB7IG5vQ2hhbmdlOiBNLmFycmF5T2YoTS5zdHJpbmcoKSkgfTskaM2PX29uY2UuTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKTtcblxuY29uc3QgUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUgPSBbXG5ZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlLFxuTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlXTskaM2PX29uY2UuUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUoUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUpO1xuXG5oYXJkZW4oUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUpO1xuXG5jb25zdCBQYXJhbVBhdGhTaGFwZSA9IHsga2V5OiBNLmFueSgpIH07JGjNj19vbmNlLlBhcmFtUGF0aFNoYXBlKFBhcmFtUGF0aFNoYXBlKTtcbmhhcmRlbihQYXJhbVBhdGhTaGFwZSk7XG5cbmNvbnN0IFBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUgPSB7XG4gIHNwZWM6IHtcbiAgICBwYXJhbVBhdGg6IFBhcmFtUGF0aFNoYXBlLFxuICAgIGNoYW5nZXM6IFBhcmFtQ2hhbmdlc1NwZWNTaGFwZVxuICB9LFxuICBjb250cmFjdDogSW5zdGFuY2VIYW5kbGVTaGFwZVxufTskaM2PX29uY2UuUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZShQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlKTtcbmhhcmRlbihQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlKTtcblxuY29uc3QgUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUgPSB7XG4gIG1ldGhvZDogJ3VucmFua2VkJyxcbiAgaXNzdWU6IFBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUsXG4gIHBvc2l0aW9uczogUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUsXG4gIGVsZWN0aW9uVHlwZTogJ3BhcmFtX2NoYW5nZScsXG4gIG1heENob2ljZXM6IDEsXG4gIG1heFdpbm5lcnM6IDEsXG4gIGNsb3NpbmdSdWxlOiBDbG9zaW5nUnVsZVNoYXBlLFxuICBxdW9ydW1SdWxlOiAnbWFqb3JpdHknLFxuICB0aWVPdXRjb21lOiBOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGVcbn07JGjNj19vbmNlLlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlKTtcbmhhcmRlbihQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSk7XG5cbmNvbnN0IFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlID0ge1xuICAuLi5QYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSxcbiAgcXVlc3Rpb25IYW5kbGU6IG1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbiAgY291bnRlckluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlXG59OyRozY9fb25jZS5QYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZShQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5oYXJkZW4oUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG5jb25zdCBBcGlJbnZvY2F0aW9uU3BlY1NoYXBlID0ge1xuICBhcGlNZXRob2ROYW1lOiBNLnN0cmluZygpLFxuICBtZXRob2RBcmdzOiBNLmFycmF5T2YoTS5hbnkoKSlcbn07XG5oYXJkZW4oQXBpSW52b2NhdGlvblNwZWNTaGFwZSk7XG5cbmNvbnN0IFllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlID0gQXBpSW52b2NhdGlvblNwZWNTaGFwZTskaM2PX29uY2UuWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUoWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUpO1xuY29uc3QgTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSA9IHsgZG9udEludm9rZTogTS5zdHJpbmcoKSB9OyRozY9fb25jZS5Ob0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUpO1xuXG5jb25zdCBBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUgPSBbXG5ZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGVdOyRozY9fb25jZS5BcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUoQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlKTtcblxuaGFyZGVuKEFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSk7XG5cbmNvbnN0IEFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSA9IHtcbiAgbWV0aG9kOiAndW5yYW5rZWQnLFxuICBpc3N1ZTogQXBpSW52b2NhdGlvblNwZWNTaGFwZSxcbiAgcG9zaXRpb25zOiBBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUsXG4gIGVsZWN0aW9uVHlwZTogJ2FwaV9pbnZvY2F0aW9uJyxcbiAgbWF4Q2hvaWNlczogMSxcbiAgbWF4V2lubmVyczogMSxcbiAgY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlU2hhcGUsXG4gIHF1b3J1bVJ1bGU6IFF1b3J1bVJ1bGVTaGFwZSxcbiAgdGllT3V0Y29tZTogTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZVxufTskaM2PX29uY2UuQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlKEFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSk7XG5oYXJkZW4oQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuY29uc3QgQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlID0ge1xuICAuLi5BcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUsXG4gIHF1ZXN0aW9uSGFuZGxlOiBtYWtlSGFuZGxlU2hhcGUoJ1F1ZXN0aW9uJyksXG4gIGNvdW50ZXJJbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZVxufTskaM2PX29uY2UuQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlKEFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5oYXJkZW4oQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuY29uc3QgU2ltcGxlU3BlY1NoYXBlID0geyB0ZXh0OiBNLnN0cmluZygpIH07XG5oYXJkZW4oU2ltcGxlU3BlY1NoYXBlKTtcblxuY29uc3QgWWVzU2ltcGxlUG9zaXRpb25TaGFwZSA9IHsgdGV4dDogTS5zdHJpbmcoKSB9OyRozY9fb25jZS5ZZXNTaW1wbGVQb3NpdGlvblNoYXBlKFllc1NpbXBsZVBvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKFllc1NpbXBsZVBvc2l0aW9uU2hhcGUpO1xuXG5jb25zdCBOb1NpbXBsZVBvc2l0aW9uU2hhcGUgPSB7IHRleHQ6IE0uc3RyaW5nKCkgfTskaM2PX29uY2UuTm9TaW1wbGVQb3NpdGlvblNoYXBlKE5vU2ltcGxlUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oTm9TaW1wbGVQb3NpdGlvblNoYXBlKTtcblxuY29uc3QgU2ltcGxlUG9zaXRpb25zU2hhcGUgPSBbXG5ZZXNTaW1wbGVQb3NpdGlvblNoYXBlLFxuTm9TaW1wbGVQb3NpdGlvblNoYXBlXTskaM2PX29uY2UuU2ltcGxlUG9zaXRpb25zU2hhcGUoU2ltcGxlUG9zaXRpb25zU2hhcGUpO1xuXG5oYXJkZW4oU2ltcGxlUG9zaXRpb25zU2hhcGUpO1xuXG5jb25zdCBTaW1wbGVJc3N1ZVNoYXBlID0gU2ltcGxlU3BlY1NoYXBlOyRozY9fb25jZS5TaW1wbGVJc3N1ZVNoYXBlKFNpbXBsZUlzc3VlU2hhcGUpO1xuaGFyZGVuKFNpbXBsZUlzc3VlU2hhcGUpO1xuXG5jb25zdCBTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSA9IHtcbiAgbWV0aG9kOiBDaG9pY2VNZXRob2RTaGFwZSxcbiAgaXNzdWU6IFNpbXBsZUlzc3VlU2hhcGUsXG4gIHBvc2l0aW9uczogTS5hcnJheU9mKHsgdGV4dDogTS5zdHJpbmcoKSB9KSxcbiAgZWxlY3Rpb25UeXBlOiBNLm9yKCdlbGVjdGlvbicsICdzdXJ2ZXknKSxcbiAgbWF4Q2hvaWNlczogTS5ndGUoMSksXG4gIG1heFdpbm5lcnM6IE0uZ3RlKDEpLFxuICBjbG9zaW5nUnVsZTogQ2xvc2luZ1J1bGVTaGFwZSxcbiAgcXVvcnVtUnVsZTogUXVvcnVtUnVsZVNoYXBlLFxuICB0aWVPdXRjb21lOiBOb1NpbXBsZVBvc2l0aW9uU2hhcGVcbn07JGjNj19vbmNlLlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlKFNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlKTtcbmhhcmRlbihTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSk7XG5cbmNvbnN0IFNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlID0ge1xuICAuLi5TaW1wbGVRdWVzdGlvblNwZWNTaGFwZSxcbiAgcXVlc3Rpb25IYW5kbGU6IG1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbiAgY291bnRlckluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlXG59OyRozY9fb25jZS5TaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZShTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5oYXJkZW4oU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG5jb25zdCBRdWVzdGlvblNwZWNTaGFwZSA9IE0ub3IoXG4gIEFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSxcbiAgT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSxcbiAgUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUsXG4gIFNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlXG4pOyRozY9fb25jZS5RdWVzdGlvblNwZWNTaGFwZShRdWVzdGlvblNwZWNTaGFwZSk7XG5cbmNvbnN0IFBvc2l0aW9uU2hhcGUgPSBNLm9yKFxuICBZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbiAgTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbiAgWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlLFxuICBOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbiAgWWVzU2ltcGxlUG9zaXRpb25TaGFwZSxcbiAgTm9TaW1wbGVQb3NpdGlvblNoYXBlLFxuICBZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlLFxuICBOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGVcbik7JGjNj19vbmNlLlBvc2l0aW9uU2hhcGUoUG9zaXRpb25TaGFwZSk7XG5cbmNvbnN0IFF1ZXN0aW9uSGFuZGxlU2hhcGUgPSBtYWtlSGFuZGxlU2hhcGUoJ3F1ZXN0aW9uJyk7XG5cbi8vXG4kaM2PX29uY2UuUXVlc3Rpb25IYW5kbGVTaGFwZShRdWVzdGlvbkhhbmRsZVNoYXBlKTtjb25zdCBJbnZpdGF0aW9uU2hhcGUgPSBNLnJlbW90YWJsZSgnSW52aXRhdGlvbicpO1xuXG4vL1xuLy9cbi8vXG4kaM2PX29uY2UuSW52aXRhdGlvblNoYXBlKEludml0YXRpb25TaGFwZSk7Y29uc3QgUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSBNLm9yKFxuICBQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSxcbiAgQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlLFxuICBPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlLFxuICBTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZVxuKTskaM2PX29uY2UuUXVlc3Rpb25EZXRhaWxzU2hhcGUoUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG5jb25zdCBFbGVjdG9yYXRlUHVibGljSSA9IE0uaW50ZXJmYWNlKCdDb21taXR0ZWUgUHVibGljRmFjZXQnLCB7XG4gIGdldFF1ZXN0aW9uU3Vic2NyaWJlcjogTS5jYWxsKCkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuICBnZXRPcGVuUXVlc3Rpb25zOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0TmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0SW5zdGFuY2U6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG4gIGdldFF1ZXN0aW9uOiBNLmNhbGwoUXVlc3Rpb25IYW5kbGVTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSlcbn0pOyRozY9fb25jZS5FbGVjdG9yYXRlUHVibGljSShFbGVjdG9yYXRlUHVibGljSSk7XG5jb25zdCBFbGVjdG9yYXRlUHVibGljU2hhcGUgPSBNLnJlbW90YWJsZSgnRWxlY3RvcmF0ZVB1YmxpYycpO1xuXG5jb25zdCBFbGVjdG9yYXRlQ3JlYXRvckkgPSBNLmludGVyZmFjZSgnQ29tbWl0dGVlIEFkbWluRmFjZXQnLCB7XG4gIGdldFBvc2VySW52aXRhdGlvbjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGFkZFF1ZXN0aW9uOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSwgUXVlc3Rpb25TcGVjU2hhcGUpLnJldHVybnMoXG4gICAgTS5wcm9taXNlKClcbiAgKSxcbiAgZ2V0Vm90ZXJJbnZpdGF0aW9uczogTS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5wcm9taXNlKCkpKSxcbiAgZ2V0UXVlc3Rpb25TdWJzY3JpYmVyOiBNLmNhbGwoKS5yZXR1cm5zKFN1YnNjcmliZXJTaGFwZSksXG4gIGdldFB1YmxpY0ZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKEVsZWN0b3JhdGVQdWJsaWNTaGFwZSlcbn0pOyRozY9fb25jZS5FbGVjdG9yYXRlQ3JlYXRvckkoRWxlY3RvcmF0ZUNyZWF0b3JJKTtcblxuY29uc3QgUXVlc3Rpb25TdGF0c1NoYXBlID0ge1xuICBzcG9pbGVkOiBNLm5hdCgpLFxuICB2b3RlczogTS5uYXQoKSxcbiAgcmVzdWx0czogTS5hcnJheU9mKHsgcG9zaXRpb246IFBvc2l0aW9uU2hhcGUsIHRvdGFsOiBNLm5hdCgpIH0pXG59OyRozY9fb25jZS5RdWVzdGlvblN0YXRzU2hhcGUoUXVlc3Rpb25TdGF0c1NoYXBlKTtcbmhhcmRlbihRdWVzdGlvblN0YXRzU2hhcGUpO1xuXG5jb25zdCBRdWVzdGlvbkkgPSBNLmludGVyZmFjZSgnUXVlc3Rpb24nLCB7XG4gIGdldFZvdGVDb3VudGVyOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpLFxuICBnZXREZXRhaWxzOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKVxufSk7JGjNj19vbmNlLlF1ZXN0aW9uSShRdWVzdGlvbkkpO1xuY29uc3QgUXVlc3Rpb25TaGFwZSA9IE0ucmVtb3RhYmxlKCdRdWVzdGlvbicpO1xuXG5jb25zdCBCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kgPSBNLmludGVyZmFjZShcbiAgJ0JpbmFyeVZvdGVDb3VudGVyIFB1YmxpY0ZhY2V0JyxcbiAge1xuICAgIGdldFF1ZXN0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uU2hhcGUpLFxuICAgIGlzT3BlbjogTS5jYWxsKCkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gICAgZ2V0T3V0Y29tZTogTS5jYWxsKCkucmV0dXJucyhNLmVyZWYoTS5wcm9taXNlKCkpKSxcbiAgICBnZXRTdGF0czogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgZ2V0RGV0YWlsczogTS5jYWxsKCkucmV0dXJucyhRdWVzdGlvbkRldGFpbHNTaGFwZSksXG4gICAgZ2V0SW5zdGFuY2U6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSlcbiAgfVxuKTskaM2PX29uY2UuQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJKEJpbmFyeVZvdGVDb3VudGVyUHVibGljSSk7XG5cbmNvbnN0IFZvdGVySGFuZGxlID0gTS5yZW1vdGFibGUoKTskaM2PX29uY2UuVm90ZXJIYW5kbGUoVm90ZXJIYW5kbGUpO1xuY29uc3QgQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkgPSBNLmludGVyZmFjZShcbiAgJ0JpbmFyeVZvdGVDb3VudGVyIEFkbWluRmFjZXQnLFxuICB7XG4gICAgc3VibWl0Vm90ZTogTS5jYWxsKFZvdGVySGFuZGxlLCBNLmFycmF5T2YoUG9zaXRpb25TaGFwZSkpLlxuICAgIG9wdGlvbmFsKE0ubmF0KCkpLlxuICAgIHJldHVybnMoeyBjaG9zZW46IFBvc2l0aW9uU2hhcGUsIHNoYXJlczogTS5uYXQoKSB9KVxuICB9XG4pOyRozY9fb25jZS5CaW5hcnlWb3RlQ291bnRlckFkbWluSShCaW5hcnlWb3RlQ291bnRlckFkbWluSSk7XG5cbmNvbnN0IEJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJID0gTS5pbnRlcmZhY2UoXG4gICdCaW5hcnlWb3RlQ291bnRlciBDbG9zZUZhY2V0JyxcbiAge1xuICAgIGNsb3NlVm90aW5nOiBNLmNhbGwoKS5yZXR1cm5zKClcbiAgfVxuKTskaM2PX29uY2UuQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkoQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkpO1xuXG5jb25zdCBWb3RlQ291bnRlclB1YmxpY0kgPSBNLmludGVyZmFjZSgnVm90ZUNvdW50ZXIgUHVibGljRmFjZXQnLCB7XG4gIGdldFF1ZXN0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uU2hhcGUpLFxuICBpc09wZW46IE0uY2FsbCgpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICBnZXRPdXRjb21lOiBNLmNhbGwoKS5yZXR1cm5zKE0uZXJlZihNLnByb21pc2UoKSkpLFxuICBnZXRTdGF0czogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldERldGFpbHM6IE0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25EZXRhaWxzU2hhcGUpLFxuICBnZXRJbnN0YW5jZTogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKVxufSk7JGjNj19vbmNlLlZvdGVDb3VudGVyUHVibGljSShWb3RlQ291bnRlclB1YmxpY0kpO1xuXG5jb25zdCBWb3RlQ291bnRlckFkbWluSSA9IE0uaW50ZXJmYWNlKCdWb3RlQ291bnRlciBBZG1pbkZhY2V0Jywge1xuICBzdWJtaXRWb3RlOiBNLmNhbGwoVm90ZXJIYW5kbGUsIE0uYXJyYXlPZihQb3NpdGlvblNoYXBlKSkuXG4gIG9wdGlvbmFsKE0ubmF0KCkpLlxuICByZXR1cm5zKHsgY2hvc2VuOiBNLmFycmF5T2YoUG9zaXRpb25TaGFwZSksIHNoYXJlczogTS5uYXQoKSB9KVxufSk7JGjNj19vbmNlLlZvdGVDb3VudGVyQWRtaW5JKFZvdGVDb3VudGVyQWRtaW5JKTtcblxuY29uc3QgVm90ZUNvdW50ZXJDbG9zZUkgPSBNLmludGVyZmFjZSgnVm90ZUNvdW50ZXIgQ2xvc2VGYWNldCcsIHtcbiAgY2xvc2VWb3Rpbmc6IE0uY2FsbCgpLnJldHVybnMoKVxufSk7JGjNj19vbmNlLlZvdGVDb3VudGVyQ2xvc2VJKFZvdGVDb3VudGVyQ2xvc2VJKTtcblxuY29uc3QgR292ZXJub3JGYWNldFNoYXBlID0ge1xuICBnZXRQYXJhbU1nclJldHJpZXZlcjogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgncGFyYW1SZXRyaWV2ZXInKSksXG4gIGdldEludml0YXRpb246IE0uY2FsbCgpLnJldHVybnMoSW52aXRhdGlvblNoYXBlKSxcbiAgZ2V0TGltaXRlZENyZWF0b3JGYWNldDogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgpKSxcbiAgZ2V0R292ZXJuZWRBcGlzOiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdnb3Zlcm5lZEFQSXMnKSksXG4gIGdldEdvdmVybmVkQXBpTmFtZXM6IE0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbiAgc2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbChNLmFycmF5T2YoTS5zdHJpbmcoKSkpLnJldHVybnMoTS5wcm9taXNlKCkpXG59OyRozY9fb25jZS5Hb3Zlcm5vckZhY2V0U2hhcGUoR292ZXJub3JGYWNldFNoYXBlKTtcbmhhcmRlbihHb3Zlcm5vckZhY2V0U2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ2hvaWNlTWV0aG9kU2hhcGUiOlsiQ2hvaWNlTWV0aG9kU2hhcGUiXSwiUXVvcnVtUnVsZVNoYXBlIjpbIlF1b3J1bVJ1bGVTaGFwZSJdLCJFbGVjdGlvblR5cGVTaGFwZSI6WyJFbGVjdGlvblR5cGVTaGFwZSJdLCJDbG9zaW5nUnVsZVNoYXBlIjpbIkNsb3NpbmdSdWxlU2hhcGUiXSwiWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIjpbIlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSJdLCJOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSI6WyJOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSJdLCJPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlIjpbIk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUiXSwiT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlIjpbIk9mZmVyRmlsdGVySXNzdWVTaGFwZSJdLCJPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlIjpbIk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUiXSwiT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlBhcmFtQ2hhbmdlc1NwZWNTaGFwZSI6WyJQYXJhbUNoYW5nZXNTcGVjU2hhcGUiXSwiWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSI6WyJZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIl0sIk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSI6WyJOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiXSwiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiOlsiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiXSwiUGFyYW1QYXRoU2hhcGUiOlsiUGFyYW1QYXRoU2hhcGUiXSwiUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSI6WyJQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlIl0sIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIl0sIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIjpbIlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIl0sIk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiOlsiTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSJdLCJBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUiOlsiQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlIl0sIkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSI6WyJBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUiXSwiQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJZZXNTaW1wbGVQb3NpdGlvblNoYXBlIjpbIlllc1NpbXBsZVBvc2l0aW9uU2hhcGUiXSwiTm9TaW1wbGVQb3NpdGlvblNoYXBlIjpbIk5vU2ltcGxlUG9zaXRpb25TaGFwZSJdLCJTaW1wbGVQb3NpdGlvbnNTaGFwZSI6WyJTaW1wbGVQb3NpdGlvbnNTaGFwZSJdLCJTaW1wbGVJc3N1ZVNoYXBlIjpbIlNpbXBsZUlzc3VlU2hhcGUiXSwiU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUiOlsiU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUiXSwiU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiUXVlc3Rpb25TcGVjU2hhcGUiOlsiUXVlc3Rpb25TcGVjU2hhcGUiXSwiUG9zaXRpb25TaGFwZSI6WyJQb3NpdGlvblNoYXBlIl0sIlF1ZXN0aW9uSGFuZGxlU2hhcGUiOlsiUXVlc3Rpb25IYW5kbGVTaGFwZSJdLCJJbnZpdGF0aW9uU2hhcGUiOlsiSW52aXRhdGlvblNoYXBlIl0sIlF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIlF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIkVsZWN0b3JhdGVQdWJsaWNJIjpbIkVsZWN0b3JhdGVQdWJsaWNJIl0sIkVsZWN0b3JhdGVDcmVhdG9ySSI6WyJFbGVjdG9yYXRlQ3JlYXRvckkiXSwiUXVlc3Rpb25TdGF0c1NoYXBlIjpbIlF1ZXN0aW9uU3RhdHNTaGFwZSJdLCJRdWVzdGlvbkkiOlsiUXVlc3Rpb25JIl0sIkJpbmFyeVZvdGVDb3VudGVyUHVibGljSSI6WyJCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kiXSwiVm90ZXJIYW5kbGUiOlsiVm90ZXJIYW5kbGUiXSwiQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkiOlsiQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkiXSwiQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkiOlsiQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkiXSwiVm90ZUNvdW50ZXJQdWJsaWNJIjpbIlZvdGVDb3VudGVyUHVibGljSSJdLCJWb3RlQ291bnRlckFkbWluSSI6WyJWb3RlQ291bnRlckFkbWluSSJdLCJWb3RlQ291bnRlckNsb3NlSSI6WyJWb3RlQ291bnRlckNsb3NlSSJdLCJHb3Zlcm5vckZhY2V0U2hhcGUiOlsiR292ZXJub3JGYWNldFNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOTJtBa6CQAAugkAACwAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvdmFsaWRhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIiwiYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBhc3NlcnRDb250cmFjdEdvdmVybmFuY2UgPSBhc3luYyAoXG56b2UsXG5hbGxlZ2VkR292ZXJuZWQsXG5hbGxlZ2VkR292ZXJub3IsXG5jb250cmFjdEdvdmVybm9ySW5zdGFsbGF0aW9uKSA9Plxue1xuICBjb25zdCBhbGxlZ2VkR292ZXJub3JQRiA9IEUoem9lKS5nZXRQdWJsaWNGYWNldChhbGxlZ2VkR292ZXJub3IpO1xuICBjb25zdCByZWFsR292ZXJuZWRQID0gRShhbGxlZ2VkR292ZXJub3JQRikuZ2V0R292ZXJuZWRDb250cmFjdCgpO1xuICBjb25zdCBhbGxlZ2VkR292ZXJuZWRUZXJtc1AgPSBFKHpvZSkuZ2V0VGVybXMoYWxsZWdlZEdvdmVybmVkKTtcblxuICBjb25zdCBbeyBlbGVjdGlvbk1hbmFnZXI6IHJlYWxHb3Zlcm5vckluc3RhbmNlIH0sIHJlYWxHb3Zlcm5lZEluc3RhbmNlXSA9XG4gIGF3YWl0IFByb21pc2UuYWxsKFthbGxlZ2VkR292ZXJuZWRUZXJtc1AsIHJlYWxHb3Zlcm5lZFBdKTtcblxuICBhc3NlcnQoXG4gICAgLy9cbiAgICBhbGxlZ2VkR292ZXJub3IgPT09IHJlYWxHb3Zlcm5vckluc3RhbmNlLFxuICAgICdUaGUgYWxsZWdlZCBnb3Zlcm5vciBkaWQgbm90IG1hdGNoIHRoZSBnb3Zlcm5vciByZXRyaWV2ZWQgZnJvbSB0aGUgZ292ZXJuZWQgY29udHJhY3QnXG4gICk7XG5cbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRHb3Zlcm5lZCA9PT0gcmVhbEdvdmVybmVkSW5zdGFuY2UsXG4gICAgJ1RoZSBhbGxlZ2VkIGdvdmVybmVkIGRpZCBub3QgbWF0Y2ggdGhlIGdvdmVybmVkIGNvbnRyYWN0IHJldHJpZXZlZCBmcm9tIHRoZSBnb3Zlcm5vcidcbiAgKTtcblxuICBjb25zdCBnb3Zlcm5vckluc3RhbGxhdGlvbkZyb21Hb3Zlcm5lZCA9XG4gIGF3YWl0IEUoem9lKS5nZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZShyZWFsR292ZXJub3JJbnN0YW5jZSk7XG5cbiAgYXNzZXJ0KFxuICAgIGdvdmVybm9ySW5zdGFsbGF0aW9uRnJvbUdvdmVybmVkID09PSBjb250cmFjdEdvdmVybm9ySW5zdGFsbGF0aW9uLFxuICAgICdUaGUgZ292ZXJuZWQgY29udHJhY3QgaXMgbm90IGdvdmVybmVkIGJ5IGFuIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlZCBpbnN0YWxsYXRpb24uJ1xuICApO1xuXG4gIHJldHVybiB7IGdvdmVybm9yOiByZWFsR292ZXJub3JJbnN0YW5jZSwgZ292ZXJuZWQ6IHJlYWxHb3Zlcm5lZEluc3RhbmNlIH07XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmFzc2VydENvbnRyYWN0R292ZXJuYW5jZShhc3NlcnRDb250cmFjdEdvdmVybmFuY2UpO1xuY29uc3QgYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlID0gYXN5bmMgKFxuem9lLFxuYWxsZWdlZEdvdmVybm9yLFxuYWxsZWdlZEVsZWN0b3JhdGUpID0+XG57XG4gIGNvbnN0IGFsbGVnZWRHb3Zlcm5vclBGID0gRSh6b2UpLmdldFB1YmxpY0ZhY2V0KGFsbGVnZWRHb3Zlcm5vcik7XG4gIGNvbnN0IGVsZWN0b3JhdGUgPSBhd2FpdCBFKGFsbGVnZWRHb3Zlcm5vclBGKS5nZXRFbGVjdG9yYXRlKCk7XG4gIGVsZWN0b3JhdGUgPT09IGFsbGVnZWRFbGVjdG9yYXRlIHx8XG4gIEZhaWxgVGhlIGFsbGVnZWRFbGVjdG9yYXRlIGRpZG4ndCBtYXRjaCB0aGUgYWN0dWFsICR7cShlbGVjdG9yYXRlKX1gO1xuXG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlKGFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSk7XG5cbmhhcmRlbihhc3NlcnRDb250cmFjdEdvdmVybmFuY2UpO1xuaGFyZGVuKGFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiOlsiYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIl0sImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSI6WyJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAhbropTUEAAA1BAAAMQAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvY29sbGVjdEZlZXMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyJdLCJleHBvcnRzIjpbIm1ha2VDb2xsZWN0RmVlc0ludml0YXRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhdG9taWNUcmFuc2ZlcjskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcImF0b21pY1RyYW5zZmVyXCIsWyRozY9fYSA9PiAoYXRvbWljVHJhbnNmZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uID0gKHpjZiwgZmVlU2VhdCwgZmVlQnJhbmQsIGtleXdvcmQpID0+IHtcbiAgY29uc3QgY29sbGVjdEZlZXMgPSAoc2VhdCkgPT4ge1xuICAgIGNvbnN0IGFtb3VudCA9IGZlZVNlYXQuZ2V0QW1vdW50QWxsb2NhdGVkKGtleXdvcmQsIGZlZUJyYW5kKTtcbiAgICBhdG9taWNUcmFuc2Zlcih6Y2YsIGZlZVNlYXQsIHNlYXQsIHsgW2tleXdvcmRdOiBhbW91bnQgfSwgeyBGZWU6IGFtb3VudCB9KTtcblxuICAgIHNlYXQuZXhpdCgpO1xuICAgIHJldHVybiBgcGFpZCBvdXQgJHthbW91bnQudmFsdWV9YDtcbiAgfTtcblxuICByZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKGNvbGxlY3RGZWVzLCAnY29sbGVjdCBmZWVzJyk7XG59OyRozY9fb25jZS5tYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uKG1ha2VDb2xsZWN0RmVlc0ludml0YXRpb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvbiI6WyJtYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAA7BBwZrDQAAaw0AADUAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL2NvbnRyYWN0U3VwcG9ydC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyJdLCJleHBvcnRzIjpbImFkZFN1YnRyYWN0IiwiYWxsRW1wdHkiLCJhbW91bnRQYXR0ZXJuIiwiYXNzZXJ0T25seUtleXMiLCJjaGVja0RlYnRMaW1pdCIsIm1ha2VOYXRBbW91bnRTaGFwZSIsInF1b3RlQXNSYXRpbyIsInJhdGlvUGF0dGVybiIsInN1YnRyYWN0VG9FbXB0eSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxBbW91bnRNYXRoLE0sbWFrZVJhdGlvRnJvbUFtb3VudHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wibWFrZVJhdGlvRnJvbUFtb3VudHNcIixbJGjNj19hID0+IChtYWtlUmF0aW9Gcm9tQW1vdW50cyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgYW1vdW50UGF0dGVybiA9IGhhcmRlbih7IGJyYW5kOiBNLnJlbW90YWJsZSgpLCB2YWx1ZTogTS5hbnkoKSB9KTskaM2PX29uY2UuYW1vdW50UGF0dGVybihhbW91bnRQYXR0ZXJuKTtcbmNvbnN0IHJhdGlvUGF0dGVybiA9IGhhcmRlbih7XG4gIG51bWVyYXRvcjogYW1vdW50UGF0dGVybixcbiAgZGVub21pbmF0b3I6IGFtb3VudFBhdHRlcm5cbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5yYXRpb1BhdHRlcm4ocmF0aW9QYXR0ZXJuKTtcbmNvbnN0IGFkZFN1YnRyYWN0ID0gKGJhc2UsIGdhaW4sIGxvc3MpID0+XG5BbW91bnRNYXRoLnN1YnRyYWN0KEFtb3VudE1hdGguYWRkKGJhc2UsIGdhaW4pLCBsb3NzKTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmFkZFN1YnRyYWN0KGFkZFN1YnRyYWN0KTtcbmNvbnN0IHN1YnRyYWN0VG9FbXB0eSA9IChsZWZ0LCByaWdodCkgPT5cbkFtb3VudE1hdGguaXNHVEUocmlnaHQsIGxlZnQpID9cbi8qICAgICAgICAgICAgKi8oQW1vdW50TWF0aC5tYWtlRW1wdHlGcm9tQW1vdW50KGxlZnQpKSA6XG4vKiAgICAgICAgICAgICovKEFtb3VudE1hdGguc3VidHJhY3QobGVmdCwgcmlnaHQpKTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLnN1YnRyYWN0VG9FbXB0eShzdWJ0cmFjdFRvRW1wdHkpO1xuY29uc3QgYXNzZXJ0T25seUtleXMgPSAocHJvcG9zYWwsIGtleXMpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG9ubHlLZXlzID0gKGNsYXVzZSkgPT5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY2xhdXNlKS5ldmVyeSgoYykgPT4ga2V5cy5pbmNsdWRlcyhjKSk7XG4gIG9ubHlLZXlzKHByb3Bvc2FsLmdpdmUpIHx8IEZhaWxgZXh0cmFuZW91cyB0ZXJtcyBpbiBnaXZlOiAke3Byb3Bvc2FsLmdpdmV9YDtcbiAgb25seUtleXMocHJvcG9zYWwud2FudCkgfHwgRmFpbGBleHRyYW5lb3VzIHRlcm1zIGluIHdhbnQ6ICR7cHJvcG9zYWwud2FudH1gO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0T25seUtleXMoYXNzZXJ0T25seUtleXMpO1xuY29uc3QgYWxsRW1wdHkgPSAoYW1vdW50cykgPT4ge1xuICByZXR1cm4gYW1vdW50cy5ldmVyeSgoYSkgPT4gQW1vdW50TWF0aC5pc0VtcHR5KGEpKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuYWxsRW1wdHkoYWxsRW1wdHkpO1xuY29uc3QgY2hlY2tEZWJ0TGltaXQgPSAoZGVidExpbWl0LCB0b3RhbERlYnQsIHRvTWludCkgPT4ge1xuICBpZiAoQW1vdW50TWF0aC5pc0VtcHR5KHRvTWludCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZGVidFBvc3QgPSBBbW91bnRNYXRoLmFkZCh0b3RhbERlYnQsIHRvTWludCk7XG4gIEFtb3VudE1hdGguaXNHVEUoZGVidExpbWl0LCBkZWJ0UG9zdCkgfHxcbiAgRmFpbGBNaW50aW5nICR7cSh0b01pbnQpfSBwYXN0ICR7cShcbiAgICB0b3RhbERlYnRcbiAgKX0gd291bGQgaGl0IHRvdGFsIGRlYnQgbGltaXQgJHtxKGRlYnRMaW1pdCl9YDtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi8kaM2PX29uY2UuY2hlY2tEZWJ0TGltaXQoY2hlY2tEZWJ0TGltaXQpO1xuY29uc3QgbWFrZU5hdEFtb3VudFNoYXBlID0gKGJyYW5kLCBtaW4pID0+XG5oYXJkZW4oeyBicmFuZCwgdmFsdWU6IG1pbiA/IE0uZ3RlKG1pbikgOiBNLm5hdCgpIH0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLm1ha2VOYXRBbW91bnRTaGFwZShtYWtlTmF0QW1vdW50U2hhcGUpO1xuY29uc3QgcXVvdGVBc1JhdGlvID0gKHF1b3RlQW1vdW50KSA9PlxubWFrZVJhdGlvRnJvbUFtb3VudHMocXVvdGVBbW91bnQuYW1vdW50SW4sIHF1b3RlQW1vdW50LmFtb3VudE91dCk7JGjNj19vbmNlLnF1b3RlQXNSYXRpbyhxdW90ZUFzUmF0aW8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYW1vdW50UGF0dGVybiI6WyJhbW91bnRQYXR0ZXJuIl0sInJhdGlvUGF0dGVybiI6WyJyYXRpb1BhdHRlcm4iXSwiYWRkU3VidHJhY3QiOlsiYWRkU3VidHJhY3QiXSwic3VidHJhY3RUb0VtcHR5IjpbInN1YnRyYWN0VG9FbXB0eSJdLCJhc3NlcnRPbmx5S2V5cyI6WyJhc3NlcnRPbmx5S2V5cyJdLCJhbGxFbXB0eSI6WyJhbGxFbXB0eSJdLCJjaGVja0RlYnRMaW1pdCI6WyJjaGVja0RlYnRMaW1pdCJdLCJtYWtlTmF0QW1vdW50U2hhcGUiOlsibWFrZU5hdEFtb3VudFNoYXBlIl0sInF1b3RlQXNSYXRpbyI6WyJxdW90ZUFzUmF0aW8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARlbGD002AABNNgAALQAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvcHNtL3BzbS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9nb3Zlcm5hbmNlIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL3N0b3JlIiwiLi4vY29sbGVjdEZlZXMuanMiLCIuLi9jb250cmFjdFN1cHBvcnQuanMiXSwiZXhwb3J0cyI6WyJtZXRhIiwic3RhcnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEUsQW1vdW50TWF0aCxBbW91bnRTaGFwZSxCcmFuZFNoYXBlLFJhdGlvU2hhcGUsQ09OVFJBQ1RfRUxFQ1RPUkFURSxoYW5kbGVQYXJhbUdvdmVybmFuY2UsUGFyYW1UeXBlcyxwdWJsaWNNaXhpbkFQSSxTdG9yYWdlTm9kZVNoYXBlLE0scHJlcGFyZUV4byxwcm92aWRlLGF0b21pY1RyYW5zZmVyLGNlaWxNdWx0aXBseUJ5LGZsb29yRGl2aWRlQnksZmxvb3JNdWx0aXBseUJ5LG1ha2VSZWNvcmRlclRvcGljLHByZXBhcmVSZWNvcmRlcktpdE1ha2Vycyxwcm92aWRlQWxsLHByb3ZpZGVFbXB0eVNlYXQsVG9waWNzUmVjb3JkU2hhcGUsQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLEZlZU1pbnRBY2Nlc3NTaGFwZSxJbnN0YW5jZUhhbmRsZVNoYXBlLEludml0YXRpb25TaGFwZSxtdXN0TWF0Y2gsbWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvbixtYWtlTmF0QW1vdW50U2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dLFtcIkFtb3VudFNoYXBlXCIsWyRozY9fYSA9PiAoQW1vdW50U2hhcGUgPSAkaM2PX2EpXV0sW1wiQnJhbmRTaGFwZVwiLFskaM2PX2EgPT4gKEJyYW5kU2hhcGUgPSAkaM2PX2EpXV0sW1wiUmF0aW9TaGFwZVwiLFskaM2PX2EgPT4gKFJhdGlvU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2dvdmVybmFuY2VcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIixbJGjNj19hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjNj19hKV1dLFtcImhhbmRsZVBhcmFtR292ZXJuYW5jZVwiLFskaM2PX2EgPT4gKGhhbmRsZVBhcmFtR292ZXJuYW5jZSA9ICRozY9fYSldXSxbXCJQYXJhbVR5cGVzXCIsWyRozY9fYSA9PiAoUGFyYW1UeXBlcyA9ICRozY9fYSldXSxbXCJwdWJsaWNNaXhpbkFQSVwiLFskaM2PX2EgPT4gKHB1YmxpY01peGluQVBJID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiU3RvcmFnZU5vZGVTaGFwZVwiLFskaM2PX2EgPT4gKFN0b3JhZ2VOb2RlU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4byA9ICRozY9fYSldXSxbXCJwcm92aWRlXCIsWyRozY9fYSA9PiAocHJvdmlkZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcImF0b21pY1RyYW5zZmVyXCIsWyRozY9fYSA9PiAoYXRvbWljVHJhbnNmZXIgPSAkaM2PX2EpXV0sW1wiY2VpbE11bHRpcGx5QnlcIixbJGjNj19hID0+IChjZWlsTXVsdGlwbHlCeSA9ICRozY9fYSldXSxbXCJmbG9vckRpdmlkZUJ5XCIsWyRozY9fYSA9PiAoZmxvb3JEaXZpZGVCeSA9ICRozY9fYSldXSxbXCJmbG9vck11bHRpcGx5QnlcIixbJGjNj19hID0+IChmbG9vck11bHRpcGx5QnkgPSAkaM2PX2EpXV0sW1wibWFrZVJlY29yZGVyVG9waWNcIixbJGjNj19hID0+IChtYWtlUmVjb3JkZXJUb3BpYyA9ICRozY9fYSldXSxbXCJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnNcIixbJGjNj19hID0+IChwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUFsbFwiLFskaM2PX2EgPT4gKHByb3ZpZGVBbGwgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUVtcHR5U2VhdFwiLFskaM2PX2EgPT4gKHByb3ZpZGVFbXB0eVNlYXQgPSAkaM2PX2EpXV0sW1wiVG9waWNzUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChUb3BpY3NSZWNvcmRTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV0sW1wiRmVlTWludEFjY2Vzc1NoYXBlXCIsWyRozY9fYSA9PiAoRmVlTWludEFjY2Vzc1NoYXBlID0gJGjNj19hKV1dLFtcIkluc3RhbmNlSGFuZGxlU2hhcGVcIixbJGjNj19hID0+IChJbnN0YW5jZUhhbmRsZVNoYXBlID0gJGjNj19hKV1dLFtcIkludml0YXRpb25TaGFwZVwiLFskaM2PX2EgPT4gKEludml0YXRpb25TaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4uL2NvbGxlY3RGZWVzLmpzXCIsIFtbXCJtYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uXCIsWyRozY9fYSA9PiAobWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvbiA9ICRozY9fYSldXV1dLFtcIi4uL2NvbnRyYWN0U3VwcG9ydC5qc1wiLCBbW1wibWFrZU5hdEFtb3VudFNoYXBlXCIsWyRozY9fYSA9PiAobWFrZU5hdEFtb3VudFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtZXRhID0ge1xuICB1cGdyYWRhYmlsaXR5OiAnY2FuVXBncmFkZScsXG4gIGN1c3RvbVRlcm1zU2hhcGU6IHtcbiAgICBhbmNob3JCcmFuZDogQnJhbmRTaGFwZSxcbiAgICBhbmNob3JQZXJNaW50ZWQ6IFJhdGlvU2hhcGUsXG4gICAgZWxlY3Rpb25NYW5hZ2VyOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxuICAgIGdvdmVybmVkUGFyYW1zOiB7XG4gICAgICBbQ09OVFJBQ1RfRUxFQ1RPUkFURV06IHtcbiAgICAgICAgdHlwZTogUGFyYW1UeXBlcy5JTlZJVEFUSU9OLFxuICAgICAgICB2YWx1ZTogQW1vdW50U2hhcGVcbiAgICAgIH0sXG4gICAgICBXYW50TWludGVkRmVlOiB7XG4gICAgICAgIHR5cGU6IFBhcmFtVHlwZXMuUkFUSU8sXG4gICAgICAgIHZhbHVlOiBSYXRpb1NoYXBlXG4gICAgICB9LFxuICAgICAgR2l2ZU1pbnRlZEZlZToge1xuICAgICAgICB0eXBlOiBQYXJhbVR5cGVzLlJBVElPLFxuICAgICAgICB2YWx1ZTogUmF0aW9TaGFwZVxuICAgICAgfSxcbiAgICAgIE1pbnRMaW1pdDogeyB0eXBlOiBQYXJhbVR5cGVzLkFNT1VOVCwgdmFsdWU6IEFtb3VudFNoYXBlIH1cbiAgICB9XG4gIH0sXG4gIHByaXZhdGVBcmdzU2hhcGU6IE0uc3BsaXRSZWNvcmQoXG4gICAge1xuICAgICAgbWFyc2hhbGxlcjogTS5yZW1vdGFibGUoJ01hcnNoYWxsZXInKSxcbiAgICAgIHN0b3JhZ2VOb2RlOiBTdG9yYWdlTm9kZVNoYXBlXG4gICAgfSxcbiAgICB7XG4gICAgICAvL1xuICAgICAgZmVlTWludEFjY2VzczogRmVlTWludEFjY2Vzc1NoYXBlLFxuICAgICAgaW5pdGlhbFBvc2VySW52aXRhdGlvbjogSW52aXRhdGlvblNoYXBlXG4gICAgfVxuICApXG59OyRozY9fb25jZS5tZXRhKG1ldGEpO1xuaGFyZGVuKG1ldGEpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc3RhcnQgPSBhc3luYyAoemNmLCBwcml2YXRlQXJncywgYmFnZ2FnZSkgPT4ge1xuICBjb25zdCB7IGFuY2hvckJyYW5kLCBhbmNob3JQZXJNaW50ZWQgfSA9IHpjZi5nZXRUZXJtcygpO1xuICBjb25zb2xlLmxvZygnUFNNIFN0YXJ0aW5nJywgYW5jaG9yQnJhbmQsIGFuY2hvclBlck1pbnRlZCk7XG5cbiAgY29uc3QgeyBtYWtlUmVjb3JkZXJLaXQgfSA9IHByZXBhcmVSZWNvcmRlcktpdE1ha2VycyhcbiAgICBiYWdnYWdlLFxuICAgIHByaXZhdGVBcmdzLm1hcnNoYWxsZXJcbiAgKTtcblxuICBjb25zdCB7IHN0YWJsZU1pbnQgfSA9IGF3YWl0IHByb3ZpZGVBbGwoYmFnZ2FnZSwge1xuICAgIHN0YWJsZU1pbnQ6ICgpID0+IHpjZi5yZWdpc3RlckZlZU1pbnQoJ01pbnRlZCcsIHByaXZhdGVBcmdzLmZlZU1pbnRBY2Nlc3MpXG4gIH0pO1xuICBjb25zdCB7IGJyYW5kOiBzdGFibGVCcmFuZCB9ID0gc3RhYmxlTWludC5nZXRJc3N1ZXJSZWNvcmQoKTtcbiAgKGFuY2hvclBlck1pbnRlZC5udW1lcmF0b3IuYnJhbmQgPT09IGFuY2hvckJyYW5kICYmXG4gIGFuY2hvclBlck1pbnRlZC5kZW5vbWluYXRvci5icmFuZCA9PT0gc3RhYmxlQnJhbmQpIHx8XG4gIEZhaWxgUmF0aW8gJHthbmNob3JQZXJNaW50ZWR9IGlzIG5vdCBjb25zaXN0ZW50IHdpdGggYnJhbmRzICR7YW5jaG9yQnJhbmR9IGFuZCAke3N0YWJsZUJyYW5kfWA7XG5cbiAgemNmLnNldFRlc3RKaWcoKCkgPT4gKHtcbiAgICBzdGFibGVJc3N1ZXJSZWNvcmQ6IHN0YWJsZU1pbnQuZ2V0SXNzdWVyUmVjb3JkKClcbiAgfSkpO1xuICBjb25zdCBlbXB0eVN0YWJsZSA9IEFtb3VudE1hdGgubWFrZUVtcHR5KHN0YWJsZUJyYW5kKTtcbiAgY29uc3QgZW1wdHlBbmNob3IgPSBBbW91bnRNYXRoLm1ha2VFbXB0eShhbmNob3JCcmFuZCk7XG5cbiAgY29uc3QgeyBwdWJsaWNNaXhpbiwgbWFrZUR1cmFibGVHb3Zlcm5vckZhY2V0LCBwYXJhbXMgfSA9XG4gIGF3YWl0IGhhbmRsZVBhcmFtR292ZXJuYW5jZShcbiAgICB6Y2YsXG4gICAgcHJpdmF0ZUFyZ3MuaW5pdGlhbFBvc2VySW52aXRhdGlvbixcbiAgICB7XG4gICAgICBHaXZlTWludGVkRmVlOiBQYXJhbVR5cGVzLlJBVElPLFxuICAgICAgTWludExpbWl0OiBQYXJhbVR5cGVzLkFNT1VOVCxcbiAgICAgIFdhbnRNaW50ZWRGZWU6IFBhcmFtVHlwZXMuUkFUSU9cbiAgICB9LFxuICAgIHByaXZhdGVBcmdzLnN0b3JhZ2VOb2RlLFxuICAgIHByaXZhdGVBcmdzLm1hcnNoYWxsZXJcbiAgKTtcblxuICBjb25zdCBhbmNob3JQb29sID0gcHJvdmlkZUVtcHR5U2VhdCh6Y2YsIGJhZ2dhZ2UsICdhbmNob3JQb29sU2VhdCcpO1xuICBjb25zdCBmZWVQb29sID0gcHJvdmlkZUVtcHR5U2VhdCh6Y2YsIGJhZ2dhZ2UsICdmZWVQb29sU2VhdCcpO1xuICBjb25zdCBzdGFnZSA9IHByb3ZpZGVFbXB0eVNlYXQoemNmLCBiYWdnYWdlLCAnc3RhZ2VTZWF0Jyk7XG5cbiAgLy9cbiAgLy9cbiAgcHJvdmlkZShiYWdnYWdlLCAnbWludGVkUG9vbEJhbGFuY2UnLCAoKSA9PlxuICBBbW91bnRNYXRoLm1ha2VFbXB0eShzdGFibGVCcmFuZClcbiAgKTtcbiAgcHJvdmlkZShiYWdnYWdlLCAndG90YWxBbmNob3JQcm92aWRlZCcsICgpID0+XG4gIEFtb3VudE1hdGgubWFrZUVtcHR5KGFuY2hvckJyYW5kKVxuICApO1xuICBwcm92aWRlKGJhZ2dhZ2UsICd0b3RhbE1pbnRlZFByb3ZpZGVkJywgKCkgPT5cbiAgQW1vdW50TWF0aC5tYWtlRW1wdHkoc3RhYmxlQnJhbmQpXG4gICk7XG5cbiAgY29uc3QgeyBtZXRyaWNzS2l0IH0gPSBhd2FpdCBwcm92aWRlQWxsKGJhZ2dhZ2UsIHtcbiAgICBtZXRyaWNzS2l0OiAoKSA9PlxuICAgIEUud2hlbihFKHByaXZhdGVBcmdzLnN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKCdtZXRyaWNzJyksIChub2RlKSA9PlxuICAgIG1ha2VSZWNvcmRlcktpdChcbiAgICAgIG5vZGUsXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8oTS5hbnkoKSlcbiAgICApXG4gICAgKVxuICB9KTtcbiAgY29uc3QgdG9waWNzID0gaGFyZGVuKHtcbiAgICBtZXRyaWNzOiBtYWtlUmVjb3JkZXJUb3BpYygnUFNNIG1ldHJpY3MnLCBtZXRyaWNzS2l0KVxuICB9KTtcblxuICBjb25zdCB1cGRhdGVNZXRyaWNzID0gKCkgPT4ge1xuICAgIHZvaWQgRShtZXRyaWNzS2l0LnJlY29yZGVyKS53cml0ZShcbiAgICAgIGhhcmRlbih7XG4gICAgICAgIGFuY2hvclBvb2xCYWxhbmNlOiBhbmNob3JQb29sLmdldEFtb3VudEFsbG9jYXRlZCgnQW5jaG9yJywgYW5jaG9yQnJhbmQpLFxuICAgICAgICBmZWVQb29sQmFsYW5jZTogZmVlUG9vbC5nZXRBbW91bnRBbGxvY2F0ZWQoJ01pbnRlZCcsIHN0YWJsZUJyYW5kKSxcbiAgICAgICAgbWludGVkUG9vbEJhbGFuY2U6IGJhZ2dhZ2UuZ2V0KCdtaW50ZWRQb29sQmFsYW5jZScpLFxuICAgICAgICB0b3RhbEFuY2hvclByb3ZpZGVkOiBiYWdnYWdlLmdldCgndG90YWxBbmNob3JQcm92aWRlZCcpLFxuICAgICAgICB0b3RhbE1pbnRlZFByb3ZpZGVkOiBiYWdnYWdlLmdldCgndG90YWxNaW50ZWRQcm92aWRlZCcpXG4gICAgICB9KVxuICAgICk7XG4gIH07XG4gIHVwZGF0ZU1ldHJpY3MoKTtcblxuICBjb25zdCBBbmNob3JBbW91bnRTaGFwZSA9IG1ha2VOYXRBbW91bnRTaGFwZShhbmNob3JCcmFuZCk7XG4gIGNvbnN0IFN0YWJsZUFtb3VudFNoYXBlID0gbWFrZU5hdEFtb3VudFNoYXBlKHN0YWJsZUJyYW5kKTtcblxuICAvKlxuICAgICAqL1xuXG5cbiAgY29uc3QgcmVzdG9yZU1ldHJpY3NIb29rID0gKHNlYXQsIHRhcmdldCkgPT4ge1xuICAgIGFzc2VydChcbiAgICAgIEFtb3VudE1hdGguaXNFbXB0eShhbmNob3JQb29sLmdldEFtb3VudEFsbG9jYXRlZCgnQW5jaG9yJywgYW5jaG9yQnJhbmQpKSxcbiAgICAgICdjYW5ub3QgcmVzdG9yZU1ldHJpY3M6IGFuY2hvclBvb2wgaXMgbm90IGVtcHR5J1xuICAgICk7XG4gICAgYXNzZXJ0KFxuICAgICAgQW1vdW50TWF0aC5pc0VtcHR5KGZlZVBvb2wuZ2V0QW1vdW50QWxsb2NhdGVkKCdNaW50ZWQnLCBzdGFibGVCcmFuZCkpLFxuICAgICAgJ2Nhbm5vdCByZXN0b3JlTWV0cmljczogZmVlUG9vbCBpcyBub3QgZW1wdHknXG4gICAgKTtcbiAgICBtdXN0TWF0Y2goXG4gICAgICB0YXJnZXQsXG4gICAgICBoYXJkZW4oe1xuICAgICAgICBmZWVQb29sQmFsYW5jZTogU3RhYmxlQW1vdW50U2hhcGUsXG4gICAgICAgIG1pbnRlZFBvb2xCYWxhbmNlOiBTdGFibGVBbW91bnRTaGFwZSxcbiAgICAgICAgdG90YWxBbmNob3JQcm92aWRlZDogQW5jaG9yQW1vdW50U2hhcGUsXG4gICAgICAgIHRvdGFsTWludGVkUHJvdmlkZWQ6IFN0YWJsZUFtb3VudFNoYXBlXG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qge1xuICAgICAgZ2l2ZTogeyBBbmNob3IgfVxuICAgIH0gPSBzZWF0LmdldFByb3Bvc2FsKCk7XG4gICAgc3RhYmxlTWludC5taW50R2FpbnMoeyBNaW50ZWQ6IHRhcmdldC5mZWVQb29sQmFsYW5jZSB9LCBmZWVQb29sKTtcbiAgICBhdG9taWNUcmFuc2Zlcih6Y2YsIHNlYXQsIGFuY2hvclBvb2wsIHsgQW5jaG9yIH0pO1xuICAgIGJhZ2dhZ2Uuc2V0KCdtaW50ZWRQb29sQmFsYW5jZScsIHRhcmdldC5taW50ZWRQb29sQmFsYW5jZSk7XG4gICAgYmFnZ2FnZS5zZXQoJ3RvdGFsQW5jaG9yUHJvdmlkZWQnLCB0YXJnZXQudG90YWxBbmNob3JQcm92aWRlZCk7XG4gICAgYmFnZ2FnZS5zZXQoJ3RvdGFsTWludGVkUHJvdmlkZWQnLCB0YXJnZXQudG90YWxNaW50ZWRQcm92aWRlZCk7XG4gICAgc2VhdC5leGl0KCk7XG4gICAgdXBkYXRlTWV0cmljcygpO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhc3NlcnRVbmRlckxpbWl0ID0gKHRvTWludCkgPT4ge1xuICAgIGNvbnN0IG1pbnRlZEFmdGVyID0gQW1vdW50TWF0aC5hZGQoXG4gICAgICBiYWdnYWdlLmdldCgnbWludGVkUG9vbEJhbGFuY2UnKSxcbiAgICAgIHRvTWludFxuICAgICk7XG4gICAgQW1vdW50TWF0aC5pc0dURShwYXJhbXMuZ2V0TWludExpbWl0KCksIG1pbnRlZEFmdGVyKSB8fFxuICAgIEZhaWxgUmVxdWVzdCB3b3VsZCBleGNlZWQgbWludCBsaW1pdGA7XG4gIH07XG5cbiAgY29uc3QgYnVybk1pbnRlZCA9ICh0b0J1cm4pID0+IHtcbiAgICBzdGFibGVNaW50LmJ1cm5Mb3NzZXMoeyBNaW50ZWQ6IHRvQnVybiB9LCBzdGFnZSk7XG4gICAgYmFnZ2FnZS5zZXQoXG4gICAgICAnbWludGVkUG9vbEJhbGFuY2UnLFxuICAgICAgQW1vdW50TWF0aC5zdWJ0cmFjdChiYWdnYWdlLmdldCgnbWludGVkUG9vbEJhbGFuY2UnKSwgdG9CdXJuKVxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgbWludE1pbnRlZCA9ICh0b01pbnQpID0+IHtcbiAgICBzdGFibGVNaW50Lm1pbnRHYWlucyh7IE1pbnRlZDogdG9NaW50IH0sIHN0YWdlKTtcbiAgICBiYWdnYWdlLnNldChcbiAgICAgICdtaW50ZWRQb29sQmFsYW5jZScsXG4gICAgICBBbW91bnRNYXRoLmFkZChiYWdnYWdlLmdldCgnbWludGVkUG9vbEJhbGFuY2UnKSwgdG9NaW50KVxuICAgICk7XG4gIH07XG5cbiAgLypcbiAgXG4gICAgKi9cblxuXG5cbiAgY29uc3QgZ2l2ZU1pbnRlZCA9IChzZWF0LCBnaXZlbiwgd2FudGVkID0gZW1wdHlBbmNob3IpID0+IHtcbiAgICBjb25zdCBmZWUgPSBjZWlsTXVsdGlwbHlCeShnaXZlbiwgcGFyYW1zLmdldEdpdmVNaW50ZWRGZWUoKSk7XG4gICAgY29uc3QgYWZ0ZXJGZWUgPSBBbW91bnRNYXRoLnN1YnRyYWN0KGdpdmVuLCBmZWUpO1xuICAgIGNvbnN0IG1heEFuY2hvciA9IGZsb29yTXVsdGlwbHlCeShhZnRlckZlZSwgYW5jaG9yUGVyTWludGVkKTtcbiAgICBBbW91bnRNYXRoLmlzR1RFKG1heEFuY2hvciwgd2FudGVkKSB8fFxuICAgIEZhaWxgd2FudGVkICR7d2FudGVkfSBpcyBtb3JlIHRoYW4gJHtnaXZlbn0gbWludXMgZmVlcyAke2ZlZX1gO1xuICAgIHpjZi5hdG9taWNSZWFycmFuZ2UoXG4gICAgICBoYXJkZW4oW1xuICAgICAgW3NlYXQsIHN0YWdlLCB7IEluOiBhZnRlckZlZSB9LCB7IE1pbnRlZDogYWZ0ZXJGZWUgfV0sXG4gICAgICBbc2VhdCwgZmVlUG9vbCwgeyBJbjogZmVlIH0sIHsgTWludGVkOiBmZWUgfV0sXG4gICAgICBbYW5jaG9yUG9vbCwgc2VhdCwgeyBBbmNob3I6IG1heEFuY2hvciB9LCB7IE91dDogbWF4QW5jaG9yIH1dXVxuICAgICAgKVxuICAgICk7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgYnVybk1pbnRlZChhZnRlckZlZSk7XG4gICAgYmFnZ2FnZS5zZXQoXG4gICAgICAndG90YWxBbmNob3JQcm92aWRlZCcsXG4gICAgICBBbW91bnRNYXRoLmFkZChiYWdnYWdlLmdldCgndG90YWxBbmNob3JQcm92aWRlZCcpLCBtYXhBbmNob3IpXG4gICAgKTtcbiAgfTtcblxuICAvKlxuICBcbiAgICovXG5cblxuICBjb25zdCB3YW50TWludGVkID0gKHNlYXQsIGdpdmVuLCB3YW50ZWQgPSBlbXB0eVN0YWJsZSkgPT4ge1xuICAgIGNvbnN0IGFzU3RhYmxlID0gZmxvb3JEaXZpZGVCeShnaXZlbiwgYW5jaG9yUGVyTWludGVkKTtcbiAgICBhc3NlcnRVbmRlckxpbWl0KGFzU3RhYmxlKTtcbiAgICBjb25zdCBmZWUgPSBjZWlsTXVsdGlwbHlCeShhc1N0YWJsZSwgcGFyYW1zLmdldFdhbnRNaW50ZWRGZWUoKSk7XG4gICAgY29uc3QgYWZ0ZXJGZWUgPSBBbW91bnRNYXRoLnN1YnRyYWN0KGFzU3RhYmxlLCBmZWUpO1xuICAgIEFtb3VudE1hdGguaXNHVEUoYWZ0ZXJGZWUsIHdhbnRlZCkgfHxcbiAgICBGYWlsYHdhbnRlZCAke3dhbnRlZH0gaXMgbW9yZSB0aGFuICR7Z2l2ZW59IG1pbnVzIGZlZXMgJHtmZWV9YDtcbiAgICBtaW50TWludGVkKGFzU3RhYmxlKTtcbiAgICB0cnkge1xuICAgICAgemNmLmF0b21pY1JlYXJyYW5nZShcbiAgICAgICAgaGFyZGVuKFtcbiAgICAgICAgW3NlYXQsIGFuY2hvclBvb2wsIHsgSW46IGdpdmVuIH0sIHsgQW5jaG9yOiBnaXZlbiB9XSxcbiAgICAgICAgW3N0YWdlLCBzZWF0LCB7IE1pbnRlZDogYWZ0ZXJGZWUgfSwgeyBPdXQ6IGFmdGVyRmVlIH1dLFxuICAgICAgICBbc3RhZ2UsIGZlZVBvb2wsIHsgTWludGVkOiBmZWUgfV1dXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgYnVybk1pbnRlZChhc1N0YWJsZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBiYWdnYWdlLnNldChcbiAgICAgICd0b3RhbE1pbnRlZFByb3ZpZGVkJyxcbiAgICAgIEFtb3VudE1hdGguYWRkKGJhZ2dhZ2UuZ2V0KCd0b3RhbE1pbnRlZFByb3ZpZGVkJyksIGFzU3RhYmxlKVxuICAgICk7XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBnaXZlTWludGVkSG9vayA9IChzZWF0KSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZ2l2ZTogeyBJbjogZ2l2ZW4gfSxcbiAgICAgIHdhbnQ6IHsgT3V0OiB3YW50ZWQgfSA9IHsgT3V0OiB1bmRlZmluZWQgfVxuICAgIH0gPSBzZWF0LmdldFByb3Bvc2FsKCk7XG4gICAgZ2l2ZU1pbnRlZChzZWF0LCBnaXZlbiwgd2FudGVkKTtcbiAgICBzZWF0LmV4aXQoKTtcbiAgICB1cGRhdGVNZXRyaWNzKCk7XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB3YW50TWludGVkSG9vayA9IChzZWF0KSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZ2l2ZTogeyBJbjogZ2l2ZW4gfSxcbiAgICAgIHdhbnQ6IHsgT3V0OiB3YW50ZWQgfSA9IHsgT3V0OiB1bmRlZmluZWQgfVxuICAgIH0gPSBzZWF0LmdldFByb3Bvc2FsKCk7XG4gICAgd2FudE1pbnRlZChzZWF0LCBnaXZlbiwgd2FudGVkKTtcbiAgICBzZWF0LmV4aXQoKTtcbiAgICB1cGRhdGVNZXRyaWNzKCk7XG4gIH07XG5cbiAgY29uc3QgeyBhbmNob3JBbW91bnRTaGFwZSwgc3RhYmxlQW1vdW50U2hhcGUgfSA9IGF3YWl0IHByb3ZpZGVBbGwoYmFnZ2FnZSwge1xuICAgIGFuY2hvckFtb3VudFNoYXBlOiAoKSA9PiBFKGFuY2hvckJyYW5kKS5nZXRBbW91bnRTaGFwZSgpLFxuICAgIHN0YWJsZUFtb3VudFNoYXBlOiAoKSA9PiBFKHN0YWJsZUJyYW5kKS5nZXRBbW91bnRTaGFwZSgpXG4gIH0pO1xuXG4gIGNvbnN0IHB1YmxpY0ZhY2V0ID0gcHJlcGFyZUV4byhcbiAgICBiYWdnYWdlLFxuICAgICdQYXJpdHkgU3RhYmlsaXR5IE1vZHVsZScsXG4gICAgTS5pbnRlcmZhY2UoJ1BTTScsIHtcbiAgICAgIGdldE1ldHJpY3M6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ01ldHJpY3NTdWJzY3JpYmVyJykpLFxuICAgICAgZ2V0UG9vbEJhbGFuY2U6IE0uY2FsbCgpLnJldHVybnMoYW5jaG9yQW1vdW50U2hhcGUpLFxuICAgICAgZ2V0UHVibGljVG9waWNzOiBNLmNhbGwoKS5yZXR1cm5zKFRvcGljc1JlY29yZFNoYXBlKSxcbiAgICAgIG1ha2VXYW50TWludGVkSW52aXRhdGlvbjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICBtYWtlR2l2ZU1pbnRlZEludml0YXRpb246IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgICAgLi4ucHVibGljTWl4aW5BUElcbiAgICB9KSxcbiAgICB7XG4gICAgICBnZXRNZXRyaWNzKCkge1xuICAgICAgICByZXR1cm4gbWV0cmljc0tpdC5zdWJzY3JpYmVyO1xuICAgICAgfSxcbiAgICAgIGdldFBvb2xCYWxhbmNlKCkge1xuICAgICAgICByZXR1cm4gYW5jaG9yUG9vbC5nZXRBbW91bnRBbGxvY2F0ZWQoJ0FuY2hvcicsIGFuY2hvckJyYW5kKTtcbiAgICAgIH0sXG4gICAgICBnZXRQdWJsaWNUb3BpY3MoKSB7XG4gICAgICAgIHJldHVybiB0b3BpY3M7XG4gICAgICB9LFxuICAgICAgbWFrZVdhbnRNaW50ZWRJbnZpdGF0aW9uKCkge1xuICAgICAgICByZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKFxuICAgICAgICAgIHdhbnRNaW50ZWRIb29rLFxuICAgICAgICAgICd3YW50TWludGVkJyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgTS5zcGxpdFJlY29yZCh7XG4gICAgICAgICAgICBnaXZlOiB7IEluOiBhbmNob3JBbW91bnRTaGFwZSB9LFxuICAgICAgICAgICAgd2FudDogTS5vcih7IE91dDogc3RhYmxlQW1vdW50U2hhcGUgfSwge30pXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBtYWtlR2l2ZU1pbnRlZEludml0YXRpb24oKSB7XG4gICAgICAgIHJldHVybiB6Y2YubWFrZUludml0YXRpb24oXG4gICAgICAgICAgZ2l2ZU1pbnRlZEhvb2ssXG4gICAgICAgICAgJ2dpdmVNaW50ZWQnLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBNLnNwbGl0UmVjb3JkKHtcbiAgICAgICAgICAgIGdpdmU6IHsgSW46IHN0YWJsZUFtb3VudFNoYXBlIH0sXG4gICAgICAgICAgICB3YW50OiBNLm9yKHsgT3V0OiBhbmNob3JBbW91bnRTaGFwZSB9LCB7fSlcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIC4uLnB1YmxpY01peGluXG4gICAgfVxuICApO1xuXG4gIGNvbnN0IGxpbWl0ZWRDcmVhdG9yRmFjZXQgPSBwcmVwYXJlRXhvKFxuICAgIGJhZ2dhZ2UsXG4gICAgJ1BTTSBtYWNoaW5lJyxcbiAgICBNLmludGVyZmFjZSgnUFNNIG1hY2hpbmUnLCB7XG4gICAgICBnZXRSZXdhcmRBbGxvY2F0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgICBtYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKFxuICAgICAgICBNLnByb21pc2UoIC8qICAgICAgICAgICAgICAgICAqLylcbiAgICAgICksXG4gICAgICBtYWtlUmVzdG9yZU1ldHJpY3NJbnZpdGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKFxuICAgICAgICBNLnByb21pc2UoIC8qICAgICAgICAgICAgICAgICAqLylcbiAgICAgIClcbiAgICB9KSxcbiAgICB7XG4gICAgICBnZXRSZXdhcmRBbGxvY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmVlUG9vbC5nZXRDdXJyZW50QWxsb2NhdGlvbigpO1xuICAgICAgfSxcbiAgICAgIG1ha2VDb2xsZWN0RmVlc0ludml0YXRpb24oKSB7XG4gICAgICAgIHJldHVybiBtYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uKHpjZiwgZmVlUG9vbCwgc3RhYmxlQnJhbmQsICdNaW50ZWQnKTtcbiAgICAgIH0sXG4gICAgICBtYWtlUmVzdG9yZU1ldHJpY3NJbnZpdGF0aW9uKCkge1xuICAgICAgICByZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKFxuICAgICAgICAgIHJlc3RvcmVNZXRyaWNzSG9vayxcbiAgICAgICAgICAncmVzdG9yZU1ldHJpY3MnLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBNLnNwbGl0UmVjb3JkKHtcbiAgICAgICAgICAgIGdpdmU6IHtcbiAgICAgICAgICAgICAgQW5jaG9yOiBBbmNob3JBbW91bnRTaGFwZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICApO1xuXG4gIGNvbnN0IHsgZ292ZXJub3JGYWNldCB9ID0gbWFrZUR1cmFibGVHb3Zlcm5vckZhY2V0KFxuICAgIGJhZ2dhZ2UsXG4gICAgbGltaXRlZENyZWF0b3JGYWNldFxuICApO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBjcmVhdG9yRmFjZXQ6IGdvdmVybm9yRmFjZXQsXG4gICAgcHVibGljRmFjZXRcbiAgfSk7XG59OyRozY9fb25jZS5zdGFydChzdGFydCk7XG5oYXJkZW4oc3RhcnQpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ldGEiOlsibWV0YSJdLCJzdGFydCI6WyJzdGFydCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB4MdQv4xwAAOMcAAAnAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NhbGxiYWNrLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImNhbGxFIiwiY2FsbFN5bmMiLCJpc0NhbGxiYWNrIiwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siLCJtYWtlTWV0aG9kQ2FsbGJhY2siLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siLCJtYWtlU3luY01ldGhvZENhbGxiYWNrIiwicHJlcGFyZUF0dGVudWF0b3IiLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VFcnJvcixxLEUsaXNPYmplY3QsaXNQYXNzYWJsZVN5bWJvbCxnZXRJbnRlcmZhY2VNZXRob2RLZXlzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJpc1Bhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoaXNQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IHsgb3duS2V5czogcmF3T3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IG93bktleXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8oXG5yYXdPd25LZXlzXG4pO1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXNQcm9wZXJ0eUtleSA9IChrZXkpID0+IHtcbiAgc3dpdGNoICh0eXBlb2Yga2V5KSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBjYWxsU3luYyA9IChjYWxsYmFjaywgLi4uYXJncykgPT4ge1xuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRhcmdldCguLi5ib3VuZCwgLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIHRhcmdldFttZXRob2ROYW1lXSguLi5ib3VuZCwgLi4uYXJncyk7XG59OyRozY9fb25jZS5jYWxsU3luYyhjYWxsU3luYyk7XG5oYXJkZW4oY2FsbFN5bmMpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBjYWxsRSA9IChjYWxsYmFjaywgLi4uYXJncykgPT4ge1xuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIEUodGFyZ2V0KSguLi5ib3VuZCwgLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIEUodGFyZ2V0KVttZXRob2ROYW1lXSguLi5ib3VuZCwgLi4uYXJncyk7XG59OyRozY9fb25jZS5jYWxsRShjYWxsRSk7XG5oYXJkZW4oY2FsbEUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrID0gKHRhcmdldCwgLi4uYm91bmQpID0+IHtcbiAgdHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICBGYWlsYHN5bmMgZnVuY3Rpb24gY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYSBmdW5jdGlvbjogJHt0YXJnZXR9YDtcbiAgLyogICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgYm91bmQsIGlzU3luYzogdHJ1ZSB9KTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyhjYik7XG59OyRozY9fb25jZS5tYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sobWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUZ1bmN0aW9uQ2FsbGJhY2sgPSAodGFyZ2V0LCAuLi5ib3VuZCkgPT4ge1xuICBpc09iamVjdCh0YXJnZXQpIHx8XG4gIEZhaWxgZnVuY3Rpb24gY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYSBmdW5jdGlvbiBwcmVzZW5jZTogJHt0YXJnZXR9YDtcbiAgLyogICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgYm91bmQgfSk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAqLyhjYik7XG59OyRozY9fb25jZS5tYWtlRnVuY3Rpb25DYWxsYmFjayhtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZUZ1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlU3luY01ldGhvZENhbGxiYWNrID0gKHRhcmdldCwgbWV0aG9kTmFtZSwgLi4uYm91bmQpID0+IHtcbiAgaXNPYmplY3QodGFyZ2V0KSB8fFxuICBGYWlsYHN5bmMgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbiAgdHlwZW9mIG1ldGhvZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gIGlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkgfHxcbiAgRmFpbGBtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIHBhc3NhYmxlIHN5bWJvbDogJHttZXRob2ROYW1lfWA7XG4gIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY2IgPSBoYXJkZW4oeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kLCBpc1N5bmM6IHRydWUgfSk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8oY2IpO1xufTskaM2PX29uY2UubWFrZVN5bmNNZXRob2RDYWxsYmFjayhtYWtlU3luY01ldGhvZENhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY01ldGhvZENhbGxiYWNrKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZU1ldGhvZENhbGxiYWNrID0gKHRhcmdldCwgbWV0aG9kTmFtZSwgLi4uYm91bmQpID0+IHtcbiAgaXNPYmplY3QodGFyZ2V0KSB8fCBGYWlsYG1ldGhvZCBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3Q6ICR7dGFyZ2V0fWA7XG4gIHR5cGVvZiBtZXRob2ROYW1lID09PSAnc3RyaW5nJyB8fFxuICBpc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpIHx8XG4gIEZhaWxgbWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBwYXNzYWJsZSBzeW1ib2w6ICR7bWV0aG9kTmFtZX1gO1xuICAvKiAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCB9KTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICovKGNiKTtcbn07JGjNj19vbmNlLm1ha2VNZXRob2RDYWxsYmFjayhtYWtlTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VNZXRob2RDYWxsYmFjayk7XG5cbi8qXG5cblxuICovXG5jb25zdCBpc0NhbGxiYWNrID0gKGNhbGxiYWNrKSA9PiB7XG4gIGlmICghaXNPYmplY3QoY2FsbGJhY2spKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCB9ID0gY2FsbGJhY2s7XG4gIHJldHVybiAoXG4gIGlzT2JqZWN0KHRhcmdldCkgJiZcbiAgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fFxuICB0eXBlb2YgbWV0aG9kTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKSkgJiZcbiAgQXJyYXkuaXNBcnJheShib3VuZClcbiAgKTtcbn07JGjNj19vbmNlLmlzQ2FsbGJhY2soaXNDYWxsYmFjayk7XG5oYXJkZW4oaXNDYWxsYmFjayk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByZXBhcmVBdHRlbnVhdG9yID0gKFxuem9uZSxcbm1ldGhvZE5hbWVzLFxueyBpbnRlcmZhY2VHdWFyZCwgdGFnID0gJ0F0dGVudWF0b3InIH0gPSB7fSkgPT5cbntcbiAgLypcbiAgXG4gICAgICovXG5cblxuXG5cbiAgY29uc3QgbWV0aG9kcyA9IC8qICAgICAgICAgICAgICAgICAgKi8oXG4gIGZyb21FbnRyaWVzKFxuICAgIG1ldGhvZE5hbWVzLm1hcCgoa2V5KSA9PiB7XG4gICAgICAvL1xuICAgICAgaWYgKCFpc1Byb3BlcnR5S2V5KGtleSkpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBrZXkgJHtxKGtleSl9IGlzIG5vdCBhIFByb3BlcnR5S2V5YDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbSA9IC8qICAgICAgICAgICAgICAgICAgKi8oe1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgW2tleV0oLi4uYXJncykge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgY2IgPSB0aGlzLnN0YXRlLmNic1trZXldO1xuICAgICAgICAgIGlmICghY2IpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG1ha2VFcnJvcihgdW5pbXBsZW1lbnRlZCAke3EodGFnKX0gbWV0aG9kICR7cShrZXkpfWApO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUuaXNTeW5jKSB7XG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2IuaXNTeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbFN5bmMoY2IsIC4uLmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2FsbEUoY2IsIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9KVtrZXldO1xuICAgICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICovKFtrZXksIG1dKTtcbiAgICB9KVxuICApXG4gICk7XG5cbiAgLypcbiAgXG4gIFxuICBcbiAgICAgKi9cblxuXG5cblxuXG5cblxuXG4gIGNvbnN0IG1ha2VBdHRlbnVhdG9yID0gem9uZS5leG9DbGFzcyhcbiAgICB0YWcsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgLypcbiAgICAgICAgICovXG5cblxuXG5cbiAgICAoe1xuICAgICAgdGFyZ2V0ID0gbnVsbCxcbiAgICAgIGlzU3luYyA9IGZhbHNlLFxuICAgICAgb3ZlcnJpZGVzID0gLyogICAgICAgICAgICAgICAgICAgICovKHt9KVxuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IGNicyA9IC8qICAgICAgICAgICAgICAgICAgICAqLyh7fSk7XG5cbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBTZXQobWV0aG9kTmFtZXMpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Ygb3duS2V5cyhvdmVycmlkZXMpKSB7XG4gICAgICAgIHJlbWFpbmluZy5oYXMoa2V5KSB8fFxuICAgICAgICBGYWlsYCR7cSh0YWcpfSBvdmVycmlkZXNbJHtxKGtleSl9XSBub3QgYWxsb3dlZCBieSBtZXRob2ROYW1lc2A7XG5cbiAgICAgICAgcmVtYWluaW5nLmRlbGV0ZShrZXkpO1xuICAgICAgICBjb25zdCBjYiA9IG92ZXJyaWRlc1trZXldO1xuICAgICAgICBjYiA9PSBudWxsIHx8XG4gICAgICAgIGlzQ2FsbGJhY2soY2IpIHx8XG4gICAgICAgIEZhaWxgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIGlzIG5vdCBhIGNhbGxiYWNrOyBnb3QgJHtjYn1gO1xuICAgICAgICBjYnNba2V5XSA9IGNiO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVtYWluaW5nKSB7XG4gICAgICAgIGlmIChpc1N5bmMpIHtcbiAgICAgICAgICBjYnNba2V5XSA9IG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2sodGFyZ2V0LCBrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNic1trZXldID0gbWFrZU1ldGhvZENhbGxiYWNrKHRhcmdldCwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGhhcmRlbih7IGNicywgaXNTeW5jIH0pO1xuICAgIH0sXG4gICAgLyogICAgICAgICAgICAgICAgICAqLyhtZXRob2RzKVxuICApO1xuICByZXR1cm4gbWFrZUF0dGVudWF0b3I7XG59OyRozY9fb25jZS5wcmVwYXJlQXR0ZW51YXRvcihwcmVwYXJlQXR0ZW51YXRvcik7XG5oYXJkZW4ocHJlcGFyZUF0dGVudWF0b3IpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciA9ICh6b25lLCBpbnRlcmZhY2VHdWFyZCwgb3B0cyA9IHt9KSA9PiB7XG4gIGNvbnN0IG1ldGhvZE5hbWVzID0gZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyhpbnRlcmZhY2VHdWFyZCk7XG4gIGNvbnN0IG1ha2VBdHRlbnVhdG9yID0gcHJlcGFyZUF0dGVudWF0b3Ioem9uZSwgbWV0aG9kTmFtZXMsIHtcbiAgICAuLi5vcHRzLFxuICAgIGludGVyZmFjZUd1YXJkXG4gIH0pO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyhtYWtlQXR0ZW51YXRvcik7XG59OyRozY9fb25jZS5wcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IocHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FsbFN5bmMiOlsiY2FsbFN5bmMiXSwiY2FsbEUiOlsiY2FsbEUiXSwibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIjpbIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayJdLCJtYWtlRnVuY3Rpb25DYWxsYmFjayI6WyJtYWtlRnVuY3Rpb25DYWxsYmFjayJdLCJtYWtlU3luY01ldGhvZENhbGxiYWNrIjpbIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siXSwibWFrZU1ldGhvZENhbGxiYWNrIjpbIm1ha2VNZXRob2RDYWxsYmFjayJdLCJpc0NhbGxiYWNrIjpbImlzQ2FsbGJhY2siXSwicHJlcGFyZUF0dGVudWF0b3IiOlsicHJlcGFyZUF0dGVudWF0b3IiXSwicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIjpbInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADSytOUUQYAAFEGAAAlAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NvbmZpZy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnJpZGdlSWQiLCJDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCIsIlZCYW5rQWNjb3VudCIsIldhbGxldE5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgQnJpZGdlSWQgPSAvKiAgICAgICAgICAgICAgICAqLyh7XG4gIEJBTks6ICdiYW5rJyxcbiAgQ09SRTogJ2NvcmUnLFxuICBESUJDOiAnZGliYycsXG4gIFNUT1JBR0U6ICdzdG9yYWdlJyxcbiAgUFJPVklTSU9OOiAncHJvdmlzaW9uJyxcbiAgUFJPVklTSU9OX1NNQVJUX1dBTExFVDogJ3Byb3Zpc2lvbldhbGxldCcsXG4gIFZMT0NBTENIQUlOOiAndmxvY2FsY2hhaW4nLFxuICBWVFJBTlNGRVI6ICd2dHJhbnNmZXInLFxuICBXQUxMRVQ6ICd3YWxsZXQnXG59KTskaM2PX29uY2UuQnJpZGdlSWQoQnJpZGdlSWQpO1xuaGFyZGVuKEJyaWRnZUlkKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IENvc21vc0luaXRLZXlUb0JyaWRnZUlkID0ge1xuICB2YmFua1BvcnQ6ICdiYW5rJyxcbiAgdmliY1BvcnQ6ICdkaWJjJ1xufTskaM2PX29uY2UuQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQoQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQpO1xuaGFyZGVuKENvc21vc0luaXRLZXlUb0JyaWRnZUlkKTtcblxuY29uc3QgV2FsbGV0TmFtZSA9IC8qICAgICAgICAgICAgICAgICovKHtcbiAgZGVwb3NpdEZhY2V0OiAnZGVwb3NpdEZhY2V0J1xufSk7JGjNj19vbmNlLldhbGxldE5hbWUoV2FsbGV0TmFtZSk7XG5oYXJkZW4oV2FsbGV0TmFtZSk7XG5cbi8vXG5jb25zdCBWQmFua0FjY291bnQgPSAvKiAgICAgICAgICAgICAgICAqLyh7XG4gIHJlc2VydmU6IHtcbiAgICBtb2R1bGU6ICd2YmFuay9yZXNlcnZlJyxcbiAgICBhZGRyZXNzOiAnYWdvcmljMWFlMGxtdHpsZ3JjbmxhOXhqa3BhYXJxNWQ1ZGZlejYzaDNudWNsJ1xuICB9LFxuICBwcm92aXNpb246IHtcbiAgICBtb2R1bGU6ICd2YmFuay9wcm92aXNpb24nLFxuICAgIGFkZHJlc3M6ICdhZ29yaWMxbWVnenl0ZzY1Y3lyZ3pzNmZ2enhncmNxdnd3bDd1Z3B0NjIzNDYnXG4gIH1cbn0pOyRozY9fb25jZS5WQmFua0FjY291bnQoVkJhbmtBY2NvdW50KTtcbmhhcmRlbihWQmFua0FjY291bnQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJpZGdlSWQiOlsiQnJpZGdlSWQiXSwiQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQiOlsiQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQiXSwiV2FsbGV0TmFtZSI6WyJXYWxsZXROYW1lIl0sIlZCYW5rQWNjb3VudCI6WyJWQmFua0FjY291bnQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmYszw1sFAABbBQAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9kZWJ1Zy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRyYWNlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuXG5sZXQgZGVidWdJbnN0YW5jZSA9IDE7XG5cbi8qXG5cblxuICovXG5jb25zdCBtYWtlVHJhY2VyID0gKG5hbWUsIGVuYWJsZSA9IHRydWUpID0+IHtcbiAgZGVidWdJbnN0YW5jZSArPSAxO1xuICBsZXQgZGVidWdDb3VudCA9IDE7XG4gIGNvbnN0IGtleSA9IGAtLS0tLSAke25hbWV9LiR7ZGVidWdJbnN0YW5jZX0gYDtcbiAgLy9cbiAgc3dpdGNoIChlbmFibGUpIHtcbiAgICBjYXNlIGZhbHNlOntcbiAgICAgICAgY29uc3QgbG9nRGlzYWJsZWQgPSAoLi4uX2FyZ3MpID0+IHt9O1xuICAgICAgICByZXR1cm4gbG9nRGlzYWJsZWQ7XG4gICAgICB9XG4gICAgY2FzZSAndmVyYm9zZSc6e1xuICAgICAgICBjb25zdCBpbmZvVGljayA9IChvcHRMb2csIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBpZiAob3B0TG9nLmxvZykge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgKGRlYnVnQ291bnQgKz0gMSksIC4uLmFyZ3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oa2V5LCAoZGVidWdDb3VudCArPSAxKSwgb3B0TG9nLCAuLi5hcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpbmZvVGljaztcbiAgICAgIH1cbiAgICBkZWZhdWx0OntcbiAgICAgICAgY29uc3QgZGVidWdUaWNrID0gKG9wdExvZywgLi4uYXJncykgPT4ge1xuICAgICAgICAgIGlmIChvcHRMb2cubG9nKSB7XG4gICAgICAgICAgICBvcHRMb2cubG9nKGtleSwgKGRlYnVnQ291bnQgKz0gMSksIC4uLmFyZ3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oa2V5LCAoZGVidWdDb3VudCArPSAxKSwgb3B0TG9nLCAuLi5hcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBkZWJ1Z1RpY2s7XG4gICAgICB9XG4gIH1cbn07JGjNj19vbmNlLm1ha2VUcmFjZXIobWFrZVRyYWNlcik7XG5oYXJkZW4obWFrZVRyYWNlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhY2VyIjpbIm1ha2VUcmFjZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKqk82KoCAACqAgAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9lcnJvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiTm9uTnVsbGlzaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBOb25OdWxsaXNoID0gKHZhbCwgb3B0RGV0YWlscyA9IGB1bmV4cGVjdGVkICR7cSh2YWwpfWApID0+IHtcbiAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgLy9cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIGFzc2VydC5mYWlsKG9wdERldGFpbHMpO1xufTskaM2PX29uY2UuTm9uTnVsbGlzaChOb25OdWxsaXNoKTtcbmhhcmRlbihOb25OdWxsaXNoKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Ik5vbk51bGxpc2giOlsiTm9uTnVsbGlzaCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC1XJjTvwMAAL8DAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vZXJyb3JzLmpzIiwiLi9qcy11dGlscy5qcyIsIi4vbWFyc2hhbC5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi9zZXMtdXRpbHMuanMiLCIuL3R5cGVDaGVjay5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOlsiLi9jb25maWcuanMiLCIuL2RlYnVnLmpzIiwiLi9lcnJvcnMuanMiLCIuL2pzLXV0aWxzLmpzIiwiLi9tZXRob2QtdG9vbHMuanMiLCIuL3Nlcy11dGlscy5qcyIsIi4vdHlwZUNoZWNrLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2NvbmZpZy5qc1wiLCBbXV0sW1wiLi9kZWJ1Zy5qc1wiLCBbXV0sW1wiLi9lcnJvcnMuanNcIiwgW11dLFtcIi4vanMtdXRpbHMuanNcIiwgW11dLFtcIi4vbWFyc2hhbC5qc1wiLCBbXV0sW1wiLi9tZXRob2QtdG9vbHMuanNcIiwgW11dLFtcIi4vc2VzLXV0aWxzLmpzXCIsIFtdXSxbXCIuL3R5cGVDaGVjay5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9tYXJzaGFsLmpzIjpbWyJwdXJlRGF0YU1hcnNoYWxsZXIiLCJwdXJlRGF0YU1hcnNoYWxsZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHlXbMunDwAApw8AACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvanMtdXRpbHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlRSVUUiLCJkZWVwQ29weUpzb25hYmxlIiwiZGVlcE1hcE9iamVjdCIsImRlZmluZU5hbWUiLCJmcm9tVHlwZWRFbnRyaWVzIiwibG9nTGV2ZWxzIiwibWFrZU1lYXN1cmVTZWNvbmRzIiwib2JqZWN0TWFwTXV0YWJsZSIsInR5cGVkRW50cmllcyIsInR5cGVkTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vL1xuLypcblxuXG4gKi9cblxuY29uc3QgeyBkZWZpbmVQcm9wZXJ0eSB9ID0gT2JqZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBUUlVFID0gLyogICAgICAgICAgICAgICAgKi8odHJ1ZSk7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuVFJVRShUUlVFKTtcbmNvbnN0IHR5cGVkRW50cmllcyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAqLyhPYmplY3QuZW50cmllcyk7XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLnR5cGVkRW50cmllcyh0eXBlZEVudHJpZXMpO1xuY29uc3QgZnJvbVR5cGVkRW50cmllcyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8oXG5PYmplY3QuZnJvbUVudHJpZXNcbik7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5mcm9tVHlwZWRFbnRyaWVzKGZyb21UeXBlZEVudHJpZXMpO1xuY29uc3QgdHlwZWRNYXAgPSAvKiAgICAgICAgICAgICAgICAgICAqLyhcbkZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLmJpbmQoQXJyYXkucHJvdG90eXBlLm1hcClcbik7JGjNj19vbmNlLnR5cGVkTWFwKHR5cGVkTWFwKTtcblxuY29uc3QgbG9nTGV2ZWxzID0gLyogICAgICAgICAgICAgICAgKi8oW1xuJ2RlYnVnJyxcbidsb2cnLFxuJ2luZm8nLFxuJ3dhcm4nLFxuJ2Vycm9yJ11cbik7JGjNj19vbmNlLmxvZ0xldmVscyhsb2dMZXZlbHMpO1xuT2JqZWN0LmZyZWV6ZShsb2dMZXZlbHMpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGRlZXBDb3B5SnNvbmFibGUgPSAodmFsdWUpID0+IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVlcENvcHlKc29uYWJsZShkZWVwQ29weUpzb25hYmxlKTtcbmNvbnN0IGRlZXBNYXBPYmplY3RJbnRlcm5hbCA9ICh2YWx1ZSwgbmFtZSwgY29udGFpbmVyLCBtYXBwZXIpID0+IHtcbiAgaWYgKGNvbnRhaW5lciAmJiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBtYXBwZWQgPSBtYXBwZXIodmFsdWUsIG5hbWUsIGNvbnRhaW5lcik7XG4gICAgaWYgKG1hcHBlZCAhPT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgbGV0IHdhc01hcHBlZCA9IGZhbHNlO1xuICBjb25zdCB2YWx1ZU9iaiA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovKHZhbHVlKTtcbiAgLypcbiAgXG4gICAqL1xuXG5cbiAgY29uc3QgbWFwRW50cnkgPSAoW2lubmVyTmFtZSwgaW5uZXJWYWx1ZV0pID0+IHtcbiAgICBjb25zdCBtYXBwZWRJbm5lclZhbHVlID0gZGVlcE1hcE9iamVjdEludGVybmFsKFxuICAgICAgaW5uZXJWYWx1ZSxcbiAgICAgIGlubmVyTmFtZSxcbiAgICAgIHZhbHVlT2JqLFxuICAgICAgbWFwcGVyXG4gICAgKTtcbiAgICB3YXNNYXBwZWQgfHw9IG1hcHBlZElubmVyVmFsdWUgIT09IGlubmVyVmFsdWU7XG4gICAgcmV0dXJuIFtpbm5lck5hbWUsIC8qICAgICAgICAgICAgICAqLyhtYXBwZWRJbm5lclZhbHVlKV07XG4gIH07XG4gIGNvbnN0IG1hcHBlZEVudHJpZXMgPSB0eXBlZEVudHJpZXModmFsdWVPYmopLm1hcChtYXBFbnRyeSk7XG5cbiAgaWYgKCF3YXNNYXBwZWQpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBjb25zdCBtYXBwZWRPYmogPSBmcm9tVHlwZWRFbnRyaWVzKG1hcHBlZEVudHJpZXMpO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICovKG1hcHBlZE9iaik7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZGVlcE1hcE9iamVjdCA9IChvYmosIG1hcHBlcikgPT5cbi8qICAgICAgICAgICAgICAqLyhkZWVwTWFwT2JqZWN0SW50ZXJuYWwob2JqLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbWFwcGVyKSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVlcE1hcE9iamVjdChkZWVwTWFwT2JqZWN0KTtcbmNvbnN0IGRlZmluZU5hbWUgPSAobmFtZSwgZm4pID0+XG5kZWZpbmVQcm9wZXJ0eShmbiwgJ25hbWUnLCB7IHZhbHVlOiBuYW1lIH0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWZpbmVOYW1lKGRlZmluZU5hbWUpO1xuY29uc3Qgb2JqZWN0TWFwTXV0YWJsZSA9IChvYmosIG1hcHBlcikgPT4ge1xuICBjb25zdCBvbGRFbnRyaWVzID0gdHlwZWRFbnRyaWVzKG9iaik7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hcEVudHJ5ID0gKFtrLCB2XSkgPT4gW2ssIG1hcHBlcih2LCBrKV07XG4gIGNvbnN0IG5ld0VudHJpZXMgPSB0eXBlZE1hcChvbGRFbnRyaWVzLCBtYXBFbnRyeSk7XG4gIGNvbnN0IG5ld09iaiA9IGZyb21UeXBlZEVudHJpZXMobmV3RW50cmllcyk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgKi8obmV3T2JqKTtcbn07XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLm9iamVjdE1hcE11dGFibGUob2JqZWN0TWFwTXV0YWJsZSk7XG5jb25zdCBtYWtlTWVhc3VyZVNlY29uZHMgPSAoY3VycmVudFRpbWVNaWxsaXNlYykgPT4ge1xuICAvKlxuICBcbiAgICovXG5cblxuICBjb25zdCBtZWFzdXJlU2Vjb25kcyA9IGFzeW5jIChmbikgPT4ge1xuICAgIGNvbnN0IHQwID0gY3VycmVudFRpbWVNaWxsaXNlYygpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKCk7XG4gICAgY29uc3QgZHVyYXRpb25NaWxsaXNlYyA9IGN1cnJlbnRUaW1lTWlsbGlzZWMoKSAtIHQwO1xuICAgIHJldHVybiB7IHJlc3VsdCwgZHVyYXRpb246IGR1cmF0aW9uTWlsbGlzZWMgLyAxMDAwIH07XG4gIH07XG4gIHJldHVybiBtZWFzdXJlU2Vjb25kcztcbn07JGjNj19vbmNlLm1ha2VNZWFzdXJlU2Vjb25kcyhtYWtlTWVhc3VyZVNlY29uZHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVFJVRSI6WyJUUlVFIl0sInR5cGVkRW50cmllcyI6WyJ0eXBlZEVudHJpZXMiXSwiZnJvbVR5cGVkRW50cmllcyI6WyJmcm9tVHlwZWRFbnRyaWVzIl0sInR5cGVkTWFwIjpbInR5cGVkTWFwIl0sImxvZ0xldmVscyI6WyJsb2dMZXZlbHMiXSwiZGVlcENvcHlKc29uYWJsZSI6WyJkZWVwQ29weUpzb25hYmxlIl0sImRlZXBNYXBPYmplY3QiOlsiZGVlcE1hcE9iamVjdCJdLCJkZWZpbmVOYW1lIjpbImRlZmluZU5hbWUiXSwib2JqZWN0TWFwTXV0YWJsZSI6WyJvYmplY3RNYXBNdXRhYmxlIl0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/y5/rAMYAAADGAAALwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL3BhdHRlcm5zIiwiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qcyIsIi4vY2FsbGJhY2suanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDYXBEYXRhIiwiYXNzZXJ0UGF0aFNlZ21lbnQiLCJpc1N0cmVhbUNlbGwiLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCIsIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCIsInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxFLEZhcixNLG1ha2VIZWFwWm9uZSxjYjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanNcIiwgW1tcIm1ha2VIZWFwWm9uZVwiLFskaM2PX2EgPT4gKG1ha2VIZWFwWm9uZSA9ICRozY9fYSldXV1dLFtcIi4vY2FsbGJhY2suanNcIiwgW1tcIipcIixbJGjNj19hID0+IChjYiA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VDaGFpblN0b3JhZ2VSb290LCduYW1lJyx7dmFsdWU6XCJtYWtlQ2hhaW5TdG9yYWdlUm9vdFwifSk7JGjNj19vbmNlLm1ha2VDaGFpblN0b3JhZ2VSb290KG1ha2VDaGFpblN0b3JhZ2VSb290KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVN0b3JhZ2VOb2RlQ2hpbGQsJ25hbWUnLHt2YWx1ZTpcIm1ha2VTdG9yYWdlTm9kZUNoaWxkXCJ9KTskaM2PX29uY2UubWFrZVN0b3JhZ2VOb2RlQ2hpbGQobWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IENoYWluU3RvcmFnZU5vZGVJID0gTS5pbnRlcmZhY2UoJ1N0b3JhZ2VOb2RlJywge1xuICBzZXRWYWx1ZTogTS5jYWxsV2hlbihNLnN0cmluZygpKS5yZXR1cm5zKCksXG4gIGdldFBhdGg6IE0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG4gIGdldFN0b3JlS2V5OiBNLmNhbGxXaGVuKCkucmV0dXJucyhNLnJlY29yZCgpKSxcbiAgbWFrZUNoaWxkTm9kZTogTS5jYWxsKE0uc3RyaW5nKCkpLlxuICBvcHRpb25hbChNLnNwbGl0UmVjb3JkKHt9LCB7IHNlcXVlbmNlOiBNLmJvb2xlYW4oKSB9LCB7fSkpLlxuICByZXR1cm5zKE0ucmVtb3RhYmxlKCdTdG9yYWdlTm9kZScpKVxufSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzU3RyZWFtQ2VsbCA9IChjZWxsKSA9PlxuY2VsbCAmJlxudHlwZW9mIGNlbGwgPT09ICdvYmplY3QnICYmXG5BcnJheS5pc0FycmF5KGNlbGwudmFsdWVzKSAmJlxudHlwZW9mIGNlbGwuYmxvY2tIZWlnaHQgPT09ICdzdHJpbmcnICYmXG4vXjAkfF5bMS05XVswLTldKiQvLnRlc3QoY2VsbC5ibG9ja0hlaWdodCk7JGjNj19vbmNlLmlzU3RyZWFtQ2VsbChpc1N0cmVhbUNlbGwpO1xuaGFyZGVuKGlzU3RyZWFtQ2VsbCk7XG5cbi8vXG4vL1xuLypcblxuXG4gKi9cbmNvbnN0IGFzc2VydENhcERhdGEgPSAoZGF0YSkgPT4ge1xuICBhc3NlcnQudHlwZW9mKGRhdGEsICdvYmplY3QnKTtcbiAgYXNzZXJ0KGRhdGEpO1xuICBhc3NlcnQudHlwZW9mKGRhdGEuYm9keSwgJ3N0cmluZycpO1xuICBhc3NlcnQoQXJyYXkuaXNBcnJheShkYXRhLnNsb3RzKSk7XG4gIC8vXG59OyRozY9fb25jZS5hc3NlcnRDYXBEYXRhKGFzc2VydENhcERhdGEpO1xuaGFyZGVuKGFzc2VydENhcERhdGEpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgcGF0aFNlZ21lbnRQYXR0ZXJuID0gL15bYS16QS1aMC05Xy1dezEsMTAwfSQvO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBhc3NlcnRQYXRoU2VnbWVudCA9IChuYW1lKSA9PiB7XG4gIHBhdGhTZWdtZW50UGF0dGVybi50ZXN0KG5hbWUpIHx8XG4gIEZhaWxgUGF0aCBzZWdtZW50IG5hbWVzIG11c3QgY29uc2lzdCBvZiAxIHRvIDEwMCBjaGFyYWN0ZXJzIGxpbWl0ZWQgdG8gQVNDSUkgYWxwaGFudW1lcmljcywgdW5kZXJzY29yZXMsIGFuZC9vciBkYXNoZXM6ICR7bmFtZX1gO1xufTskaM2PX29uY2UuYXNzZXJ0UGF0aFNlZ21lbnQoYXNzZXJ0UGF0aFNlZ21lbnQpO1xuaGFyZGVuKGFzc2VydFBhdGhTZWdtZW50KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuICovXG5jb25zdCBwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSA9ICh6b25lKSA9PiB7XG4gIC8qXG4gIFxuICBcbiAgXG4gIFxuICAgICAqL1xuXG5cblxuXG5cblxuXG5cblxuXG4gIGNvbnN0IG1ha2VDaGFpblN0b3JhZ2VOb2RlID0gem9uZS5leG9DbGFzcyhcbiAgICAnQ2hhaW5TdG9yYWdlTm9kZScsXG4gICAgQ2hhaW5TdG9yYWdlTm9kZUksXG4gICAgLypcbiAgICBcbiAgICAgICovXG5cblxuXG5cblxuICAgIChtZXNzZW5nZXIsIHBhdGgsIHsgc2VxdWVuY2UgPSBmYWxzZSB9ID0ge30pID0+IHtcbiAgICAgIGFzc2VydC50eXBlb2YocGF0aCwgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0LnR5cGVvZihzZXF1ZW5jZSwgJ2Jvb2xlYW4nKTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBwYXRoLCBtZXNzZW5nZXIsIHNlcXVlbmNlIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgZ2V0UGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucGF0aDtcbiAgICAgIH0sXG4gICAgICAvKlxuICAgICAgICAgKi9cblxuXG4gICAgICBhc3luYyBnZXRTdG9yZUtleSgpIHtcbiAgICAgICAgY29uc3QgeyBwYXRoLCBtZXNzZW5nZXIgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIHJldHVybiBjYi5jYWxsRShtZXNzZW5nZXIsIHtcbiAgICAgICAgICBtZXRob2Q6ICdnZXRTdG9yZUtleScsXG4gICAgICAgICAgYXJnczogW3BhdGhdXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8qXG4gICAgICAgICAgICovXG5cblxuXG5cbiAgICAgIG1ha2VDaGlsZE5vZGUobmFtZSwgY2hpbGROb2RlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc2VxdWVuY2UsIHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgYXNzZXJ0UGF0aFNlZ21lbnQobmFtZSk7XG4gICAgICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IHNlcXVlbmNlLCAuLi5jaGlsZE5vZGVPcHRpb25zIH07XG4gICAgICAgIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZShcbiAgICAgICAgICBtZXNzZW5nZXIsXG4gICAgICAgICAgYCR7cGF0aH0uJHtuYW1lfWAsXG4gICAgICAgICAgbWVyZ2VkT3B0aW9uc1xuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBhc3luYyBzZXRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCB7IHNlcXVlbmNlLCBwYXRoLCBtZXNzZW5nZXIgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGFzc2VydC50eXBlb2YodmFsdWUsICdzdHJpbmcnKTtcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgIGxldCBlbnRyeTtcbiAgICAgICAgaWYgKCFzZXF1ZW5jZSAmJiAhdmFsdWUpIHtcbiAgICAgICAgICBlbnRyeSA9IFtwYXRoXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbnRyeSA9IFtwYXRoLCB2YWx1ZV07XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgY2IuY2FsbEUobWVzc2VuZ2VyLCB7XG4gICAgICAgICAgbWV0aG9kOiBzZXF1ZW5jZSA/ICdhcHBlbmQnIDogJ3NldCcsXG4gICAgICAgICAgYXJnczogW2VudHJ5XVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgfVxuICApO1xuICByZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGU7XG59OyRozY9fb25jZS5wcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZShwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSk7XG5cbmNvbnN0IG1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZSA9IHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKG1ha2VIZWFwWm9uZSgpKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIG1ha2VDaGFpblN0b3JhZ2VSb290KFxuaGFuZGxlU3RvcmFnZU1lc3NhZ2UsXG5yb290UGF0aCxcbnJvb3RPcHRpb25zID0ge30pXG57XG4gIGNvbnN0IG1lc3NlbmdlciA9IGNiLm1ha2VGdW5jdGlvbkNhbGxiYWNrKGhhbmRsZVN0b3JhZ2VNZXNzYWdlKTtcblxuICAvL1xuICBjb25zdCByb290Tm9kZSA9IG1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZShtZXNzZW5nZXIsIHJvb3RQYXRoLCByb290T3B0aW9ucyk7XG4gIHJldHVybiByb290Tm9kZTtcbn1cblxuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VOdWxsU3RvcmFnZU5vZGUgPSAoKSA9PiB7XG4gIC8vXG4gIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbiAgICBGYXIoJ051bGxNZXNzZW5nZXInLCAoKSA9PiBudWxsKSxcbiAgICAnbnVsbCdcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWFrZVN0b3JhZ2VOb2RlQ2hpbGQoc3RvcmFnZU5vZGVSZWYsIGNoaWxkTmFtZSkge1xuICBjb25zdCBleGlzdGluZ1N0b3JhZ2VOb2RlID0gYXdhaXQgc3RvcmFnZU5vZGVSZWY7XG4gIGNvbnN0IHN0b3JhZ2VOb2RlID0gZXhpc3RpbmdTdG9yYWdlTm9kZSB8fCBtYWtlTnVsbFN0b3JhZ2VOb2RlKCk7XG4gIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkTmFtZSk7XG59XG5oYXJkZW4obWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG4vL1xuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICByZXR1cm4gYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgbWFyc2hhbGxlZCA9IGF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbHVlKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkobWFyc2hhbGxlZCk7XG4gICAgcmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKHNlcmlhbGl6ZWQpO1xuICB9O1xufTskaM2PX29uY2UubWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShtYWtlU2VyaWFsaXplVG9TdG9yYWdlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU3RyZWFtQ2VsbCI6WyJpc1N0cmVhbUNlbGwiXSwiYXNzZXJ0Q2FwRGF0YSI6WyJhc3NlcnRDYXBEYXRhIl0sImFzc2VydFBhdGhTZWdtZW50IjpbImFzc2VydFBhdGhTZWdtZW50Il0sInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIjpbInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sIm1ha2VDaGFpblN0b3JhZ2VSb290IjpbIm1ha2VDaGFpblN0b3JhZ2VSb290Il0sIm1ha2VTdG9yYWdlTm9kZUNoaWxkIjpbIm1ha2VTdG9yYWdlTm9kZUNoaWxkIl0sIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiOlsibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADchL469BAAAPQQAAAmAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIi4vbGliLWNoYWluU3RvcmFnZS5qcyJdLCJleHBvcnRzIjpbImJvYXJkU2xvdHRpbmdNYXJzaGFsbGVyIiwibWFrZUJvYXJkUmVtb3RlIiwibWFrZUhpc3RvcnlSZXZpdmVyIiwicHVyZURhdGFNYXJzaGFsbGVyIiwic2xvdFRvQm9hcmRSZW1vdGUiLCJ1bm1hcnNoYWxGcm9tVnN0b3JhZ2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEZhcixtYWtlTWFyc2hhbCxpc1N0cmVhbUNlbGw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiLi9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJpc1N0cmVhbUNlbGxcIixbJGjNj19hID0+IChpc1N0cmVhbUNlbGwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFrZUJvYXJkUmVtb3RlID0gKHsgYm9hcmRJZCwgaWZhY2UgfSkgPT4ge1xuICBjb25zdCBub25hbGxlZ2VkID0gaWZhY2UgPyBpZmFjZS5yZXBsYWNlKC9eQWxsZWdlZDogLywgJycpIDogJyc7XG4gIHJldHVybiBGYXIoYEJvYXJkUmVtb3RlJHtub25hbGxlZ2VkfWAsIHsgZ2V0Qm9hcmRJZDogKCkgPT4gYm9hcmRJZCB9KTtcbn07XG5cbi8qXG5cblxuICovJGjNj19vbmNlLm1ha2VCb2FyZFJlbW90ZShtYWtlQm9hcmRSZW1vdGUpO1xuY29uc3Qgc2xvdFRvQm9hcmRSZW1vdGUgPSAoYm9hcmRJZCwgaWZhY2UpID0+XG5tYWtlQm9hcmRSZW1vdGUoeyBib2FyZElkLCBpZmFjZSB9KTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5zbG90VG9Cb2FyZFJlbW90ZShzbG90VG9Cb2FyZFJlbW90ZSk7XG5jb25zdCBib2FyZFZhbFRvU2xvdCA9ICh2YWwpID0+IHtcbiAgaWYgKCdnZXRCb2FyZElkJyBpbiB2YWwpIHtcbiAgICByZXR1cm4gdmFsLmdldEJvYXJkSWQoKTtcbiAgfVxuICB0aHJvdyBGYWlsYHVua25vd24gb2JqIGluIGJvYXJkU2xvdHRpbmdNYXJzaGFsbGVyLnZhbFRvU2xvdCAke3ZhbH1gO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYm9hcmRTbG90dGluZ01hcnNoYWxsZXIgPSAoc2xvdFRvVmFsID0gdW5kZWZpbmVkKSA9PiB7XG4gIHJldHVybiBtYWtlTWFyc2hhbChib2FyZFZhbFRvU2xvdCwgc2xvdFRvVmFsLCB7XG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcydcbiAgfSk7XG59O1xuXG4vL1xuLy9cbi8qXG5cblxuICovJGjNj19vbmNlLmJvYXJkU2xvdHRpbmdNYXJzaGFsbGVyKGJvYXJkU2xvdHRpbmdNYXJzaGFsbGVyKTtcbmNvbnN0IGFzc2VydENhcERhdGEgPSAoZGF0YSkgPT4ge1xuICBhc3NlcnQudHlwZW9mKGRhdGEsICdvYmplY3QnKTtcbiAgYXNzZXJ0KGRhdGEpO1xuICBhc3NlcnQudHlwZW9mKGRhdGEuYm9keSwgJ3N0cmluZycpO1xuICBhc3NlcnQoQXJyYXkuaXNBcnJheShkYXRhLnNsb3RzKSk7XG4gIC8vXG59O1xuaGFyZGVuKGFzc2VydENhcERhdGEpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHVubWFyc2hhbEZyb21Wc3RvcmFnZSA9IChkYXRhLCBrZXksIGZyb21DYXBEYXRhLCBpbmRleCkgPT4ge1xuICBjb25zdCBzZXJpYWxpemVkID0gZGF0YS5nZXQoa2V5KSB8fCBGYWlsYG5vIGRhdGEgZm9yICR7a2V5fWA7XG4gIGFzc2VydC50eXBlb2Yoc2VyaWFsaXplZCwgJ3N0cmluZycpO1xuICBhc3NlcnQudHlwZW9mKGluZGV4LCAnbnVtYmVyJyk7XG5cbiAgY29uc3Qgc3RyZWFtQ2VsbCA9IEpTT04ucGFyc2Uoc2VyaWFsaXplZCk7XG4gIGlmICghaXNTdHJlYW1DZWxsKHN0cmVhbUNlbGwpKSB7XG4gICAgdGhyb3cgRmFpbGBub3QgYSBTdHJlYW1DZWxsOiAke3N0cmVhbUNlbGx9YDtcbiAgfVxuXG4gIGNvbnN0IHsgdmFsdWVzIH0gPSBzdHJlYW1DZWxsO1xuICB2YWx1ZXMubGVuZ3RoID4gMCB8fCBGYWlsYG5vIFN0cmVhbUNlbGwgdmFsdWVzOiAke3N0cmVhbUNlbGx9YDtcblxuICBjb25zdCBtYXJzaGFsbGVkID0gdmFsdWVzLmF0KGluZGV4KTtcbiAgYXNzZXJ0LnR5cGVvZihtYXJzaGFsbGVkLCAnc3RyaW5nJyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNhcERhdGEgPSBoYXJkZW4oSlNPTi5wYXJzZShtYXJzaGFsbGVkKSk7XG4gIGFzc2VydENhcERhdGEoY2FwRGF0YSk7XG5cbiAgY29uc3QgdW5tYXJzaGFsbGVkID0gZnJvbUNhcERhdGEoY2FwRGF0YSk7XG4gIHJldHVybiB1bm1hcnNoYWxsZWQ7XG59OyRozY9fb25jZS51bm1hcnNoYWxGcm9tVnN0b3JhZ2UodW5tYXJzaGFsRnJvbVZzdG9yYWdlKTtcbmhhcmRlbih1bm1hcnNoYWxGcm9tVnN0b3JhZ2UpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VIaXN0b3J5UmV2aXZlciA9IChlbnRyaWVzLCBzbG90VG9WYWwgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgYm9hcmQgPSBib2FyZFNsb3R0aW5nTWFyc2hhbGxlcihzbG90VG9WYWwpO1xuICBjb25zdCB2c01hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBmcm9tQ2FwRGF0YSA9ICguLi5hcmdzKSA9PlxuICBSZWZsZWN0LmFwcGx5KGJvYXJkLmZyb21DYXBEYXRhLCBib2FyZCwgYXJncyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZ2V0SXRlbSA9IChrZXkpID0+IHVubWFyc2hhbEZyb21Wc3RvcmFnZSh2c01hcCwga2V5LCBmcm9tQ2FwRGF0YSwgLTEpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNoaWxkcmVuID0gKHByZWZpeCkgPT4ge1xuICAgIHByZWZpeC5lbmRzV2l0aCgnLicpIHx8IEZhaWxgcHJlZml4IG11c3QgZW5kIHdpdGggJy4nYDtcbiAgICByZXR1cm4gaGFyZGVuKFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgZW50cmllcy5cbiAgICAgIG1hcCgoW2ssIF9dKSA9PiBrKS5cbiAgICAgIGZpbHRlcigoaykgPT4gay5zdGFydHNXaXRoKHByZWZpeCkpLlxuICAgICAgbWFwKChrKSA9PiBrLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KCcuJylbMF0pXG4gICAgKV1cbiAgICApO1xuICB9O1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBoYXMgPSAoaykgPT4gdnNNYXAuZ2V0KGspICE9PSB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIGhhcmRlbih7IGdldEl0ZW0sIGNoaWxkcmVuLCBoYXMgfSk7XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UubWFrZUhpc3RvcnlSZXZpdmVyKG1ha2VIaXN0b3J5UmV2aXZlcik7XG5jb25zdCByZWplY3RPQ2FwID0gKGNhcCkgPT4gRmFpbGAke2NhcH0gaXMgbm90IHB1cmUgZGF0YWA7XG5jb25zdCBwdXJlRGF0YU1hcnNoYWxsZXIgPSBtYWtlTWFyc2hhbChyZWplY3RPQ2FwLCByZWplY3RPQ2FwLCB7XG4gIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnXG59KTskaM2PX29uY2UucHVyZURhdGFNYXJzaGFsbGVyKHB1cmVEYXRhTWFyc2hhbGxlcik7XG5oYXJkZW4ocHVyZURhdGFNYXJzaGFsbGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VCb2FyZFJlbW90ZSI6WyJtYWtlQm9hcmRSZW1vdGUiXSwic2xvdFRvQm9hcmRSZW1vdGUiOlsic2xvdFRvQm9hcmRSZW1vdGUiXSwiYm9hcmRTbG90dGluZ01hcnNoYWxsZXIiOlsiYm9hcmRTbG90dGluZ01hcnNoYWxsZXIiXSwidW5tYXJzaGFsRnJvbVZzdG9yYWdlIjpbInVubWFyc2hhbEZyb21Wc3RvcmFnZSJdLCJtYWtlSGlzdG9yeVJldml2ZXIiOlsibWFrZUhpc3RvcnlSZXZpdmVyIl0sInB1cmVEYXRhTWFyc2hhbGxlciI6WyJwdXJlRGF0YU1hcnNoYWxsZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAH44dwH0JAAB9CQAAKwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRob2QtdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImJpbmRBbGxNZXRob2RzIiwiZ2V0TWV0aG9kTmFtZXMiLCJnZXRTdHJpbmdNZXRob2ROYW1lcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGlzT2JqZWN0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXV1dXSk7XG5cblxuLypcblxuXG4gKi9cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgY3JlYXRlLCBmcm9tRW50cmllcywgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB9ID1cbk9iamVjdDtcbmNvbnN0IHsgb3duS2V5cywgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQgPSAoYSwgYikgPT4ge1xuICBpZiAodHlwZW9mIGEgPT09IHR5cGVvZiBiKSB7XG4gICAgY29uc3QgbGVmdCA9IFN0cmluZyhhKTtcbiAgICBjb25zdCByaWdodCA9IFN0cmluZyhiKTtcbiAgICAvL1xuICAgIHJldHVybiBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPiByaWdodCA/IDEgOiAwO1xuICB9XG4gIGlmICh0eXBlb2YgYSA9PT0gJ3N5bWJvbCcpIHtcbiAgICBhc3NlcnQodHlwZW9mIGIgPT09ICdzdHJpbmcnKTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgYXNzZXJ0KHR5cGVvZiBhID09PSAnc3RyaW5nJyk7XG4gIGFzc2VydCh0eXBlb2YgYiA9PT0gJ3N5bWJvbCcpO1xuICByZXR1cm4gMTtcbn07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBnZXRNZXRob2ROYW1lcyA9ICh2YWwpID0+IHtcbiAgbGV0IGxheWVyID0gdmFsO1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKTsgLy9cbiAgd2hpbGUgKGxheWVyICE9PSBudWxsICYmIGxheWVyICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgLy9cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuICAgIGNvbnN0IG93bk5hbWVzID0gLyogICAgICAgICAgICAgICovKG93bktleXMoZGVzY3MpKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygb3duTmFtZXMpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKHR5cGVvZiB2YWxbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsYXllciA9IGdldFByb3RvdHlwZU9mKGxheWVyKTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFsuLi5uYW1lc10uc29ydChjb21wYXJlU3RyaW5naWZpZWQpKTtcbn07JGjNj19vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBnZXRTdHJpbmdNZXRob2ROYW1lcyA9ICh2YWwpID0+XG4vKiAgICAgICAgICAgICAgICAgICAqLyhcbmdldE1ldGhvZE5hbWVzKHZhbCkuZmlsdGVyKChuYW1lKSA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpXG4pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmdldFN0cmluZ01ldGhvZE5hbWVzKGdldFN0cmluZ01ldGhvZE5hbWVzKTtcbmNvbnN0IGJpbmRBbGxNZXRob2RzID0gKG9iaikgPT5cbmhhcmRlbihcbiAgY3JlYXRlKFxuICAgIG9iaixcbiAgICBmcm9tRW50cmllcyhcbiAgICAgIGdldE1ldGhvZE5hbWVzKG9iaikubWFwKChuYW1lKSA9PiBbXG4gICAgICBuYW1lLFxuICAgICAge1xuICAgICAgICB2YWx1ZTogKCAvKiAgICAgICAgICAgICAgICAgICAgKi8uLi5hcmdzKSA9PlxuICAgICAgICBhcHBseShvYmpbbmFtZV0sIG9iaiwgYXJncyksXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH1dXG4gICAgICApXG4gICAgKVxuICApXG4pOyRozY9fb25jZS5iaW5kQWxsTWV0aG9kcyhiaW5kQWxsTWV0aG9kcyk7XG5oYXJkZW4oYmluZEFsbE1ldGhvZHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiOlsiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5N9+PP8rAAD/KwAAKAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9zZXMtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1ldGEtbWFwLmpzIiwiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9zdHJlYW0iLCJqZXNzaWUuanMiLCIuL2pzLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIiwiYWdncmVnYXRlVHJ5RmluYWxseSIsImFsbFZhbHVlcyIsImFzc2VydEFsbERlZmluZWQiLCJhdHRlbnVhdGUiLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiLCJmb3JldmVyIiwiZnJvbVVuaXF1ZUVudHJpZXMiLCJtYWtlTGltaXRlZENvbnNvbGUiLCJvYmplY3RNYXAiLCJvYmplY3RNZXRhTWFwIiwic3luY2hyb25pemVkVGVlIiwidW50aWxUcnVlIiwid2hpbGVUcnVlIiwid2l0aERlZmVycmVkQ2xlYW51cCIsInppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG9iamVjdE1hcCxvYmplY3RNZXRhTWFwLGZyb21VbmlxdWVFbnRyaWVzLHEsRmFpbCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixYLGRlZXBseUZ1bGZpbGxlZCxpc09iamVjdCxtYWtlUHJvbWlzZUtpdCxtYWtlUXVldWUsYXN5bmNHZW5lcmF0ZSxsb2dMZXZlbHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKSwkaM2PX2xpdmVbXCJvYmplY3RNYXBcIl1dXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanNcIiwgW1tcIm9iamVjdE1ldGFNYXBcIixbJGjNj19hID0+IChvYmplY3RNZXRhTWFwID0gJGjNj19hKSwkaM2PX2xpdmVbXCJvYmplY3RNZXRhTWFwXCJdXV1dXSxbXCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qc1wiLCBbW1wiZnJvbVVuaXF1ZUVudHJpZXNcIixbJGjNj19hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRozY9fYSksJGjNj19saXZlW1wiZnJvbVVuaXF1ZUVudHJpZXNcIl1dXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsWyRozY9fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjNj19hKV1dLFtcImlzT2JqZWN0XCIsWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3N0cmVhbVwiLCBbW1wibWFrZVF1ZXVlXCIsWyRozY9fYSA9PiAobWFrZVF1ZXVlID0gJGjNj19hKV1dXV0sW1wiamVzc2llLmpzXCIsIFtbXCJhc3luY0dlbmVyYXRlXCIsWyRozY9fYSA9PiAoYXN5bmNHZW5lcmF0ZSA9ICRozY9fYSldXV1dLFtcIi4vanMtdXRpbHMuanNcIiwgW1tcImxvZ0xldmVsc1wiLFskaM2PX2EgPT4gKGxvZ0xldmVscyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBmcm9tRW50cmllcywga2V5cywgdmFsdWVzIH0gPSBPYmplY3Q7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYWtlTGltaXRlZENvbnNvbGUgPSAobWFrZUxvZ2dlcikgPT4ge1xuICBjb25zdCBsaW1pdGVkQ29uc29sZSA9IC8qICAgICAgICAgICAgICAqLyhcbiAgZnJvbUVudHJpZXMobG9nTGV2ZWxzLm1hcCgobGV2ZWwpID0+IFtsZXZlbCwgbWFrZUxvZ2dlcihsZXZlbCldKSlcbiAgKTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovKGhhcmRlbihsaW1pdGVkQ29uc29sZSkpO1xufTskaM2PX29uY2UubWFrZUxpbWl0ZWRDb25zb2xlKG1ha2VMaW1pdGVkQ29uc29sZSk7XG5oYXJkZW4obWFrZUxpbWl0ZWRDb25zb2xlKTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgZGVlcGx5RnVsZmlsbGVkT2JqZWN0ID0gYXN5bmMgKG9iaikgPT4ge1xuICBpc09iamVjdChvYmopIHx8IEZhaWxgcGFyYW0gbXVzdCBiZSBhbiBvYmplY3RgO1xuICByZXR1cm4gZGVlcGx5RnVsZmlsbGVkKG9iaik7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmRlZXBseUZ1bGZpbGxlZE9iamVjdChkZWVwbHlGdWxmaWxsZWRPYmplY3QpO1xuY29uc3QgbWFrZUFnZ3JlZ2F0ZUVycm9yID1cbnR5cGVvZiBBZ2dyZWdhdGVFcnJvciA9PT0gJ2Z1bmN0aW9uJyA/XG4oZXJyb3JzLCBtZXNzYWdlLCBvcHRpb25zKSA9PiBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpIDpcbihlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpID0+IHtcbiAgcmV0dXJuIG1ha2VFcnJvcihtZXNzYWdlID8/ICdtdWx0aXBsZSBlcnJvcnMnLCB1bmRlZmluZWQsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGVycm9yc1xuICB9KTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IFByb21pc2VBbGxPckVycm9ycyA9IGFzeW5jIChpdGVtcykgPT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGl0ZW1zKS50aGVuKChyZXN1bHRzKSA9PiB7XG4gICAgY29uc3QgZXJyb3JzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8oXG4gICAgcmVzdWx0cy5maWx0ZXIoKHsgc3RhdHVzIH0pID0+IHN0YXR1cyA9PT0gJ3JlamVjdGVkJylcbiAgICApLm1hcCgocmVzdWx0KSA9PiByZXN1bHQucmVhc29uKTtcbiAgICBpZiAoIWVycm9ycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8ocmVzdWx0cykubWFwKFxuICAgICAgICAocmVzdWx0KSA9PiByZXN1bHQudmFsdWVcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aHJvdyBlcnJvcnNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG1ha2VBZ2dyZWdhdGVFcnJvcihlcnJvcnMpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuUHJvbWlzZUFsbE9yRXJyb3JzKFByb21pc2VBbGxPckVycm9ycyk7XG5jb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5ID0gYXN5bmMgKHRyaWVyLCBmaW5hbGl6ZXIpID0+XG50cmllcigpLnRoZW4oXG4gIGFzeW5jIChyZXN1bHQpID0+IGZpbmFsaXplcigpLnRoZW4oKCkgPT4gcmVzdWx0KSxcbiAgYXN5bmMgKHRyeUVycm9yKSA9PlxuICBmaW5hbGl6ZXIodHJ5RXJyb3IpLlxuICB0aGVuKFxuICAgICgpID0+IHRyeUVycm9yLFxuICAgIChmaW5hbGl6ZUVycm9yKSA9PiBtYWtlQWdncmVnYXRlRXJyb3IoW3RyeUVycm9yLCBmaW5hbGl6ZUVycm9yXSlcbiAgKS5cbiAgdGhlbigoZXJyb3IpID0+IFByb21pc2UucmVqZWN0KGVycm9yKSlcbik7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hZ2dyZWdhdGVUcnlGaW5hbGx5KGFnZ3JlZ2F0ZVRyeUZpbmFsbHkpO1xuY29uc3Qgd2l0aERlZmVycmVkQ2xlYW51cCA9IGFzeW5jIChmbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY2xlYW51cHNMSUZPID0gW107XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhZGRDbGVhbnVwID0gKGNsZWFudXApID0+IHtcbiAgICBjbGVhbnVwc0xJRk8udW5zaGlmdChjbGVhbnVwKTtcbiAgfTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZmluYWxpemVyID0gYXN5bmMgKGVycikgPT4ge1xuICAgIC8vXG4gICAgY29uc3QgY2xlYW51cFJlc3VsdHMgPSBjbGVhbnVwc0xJRk8ubWFwKGFzeW5jIChjbGVhbnVwKSA9PiB7XG4gICAgICBhd2FpdCBudWxsO1xuICAgICAgcmV0dXJuIGNsZWFudXAoZXJyKTtcbiAgICB9KTtcbiAgICBhd2FpdCBQcm9taXNlQWxsT3JFcnJvcnMoY2xlYW51cFJlc3VsdHMpO1xuICB9O1xuICByZXR1cm4gYWdncmVnYXRlVHJ5RmluYWxseSgoKSA9PiBmbihhZGRDbGVhbnVwKSwgZmluYWxpemVyKTtcbn07XG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS53aXRoRGVmZXJyZWRDbGVhbnVwKHdpdGhEZWZlcnJlZENsZWFudXApO1xuY29uc3QgYXNzZXJ0QWxsRGVmaW5lZCA9IChvYmopID0+IHtcbiAgY29uc3QgbWlzc2luZyA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWlzc2luZy5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICBGYWlsYG1pc3NpbmcgJHtxKG1pc3NpbmcpfWA7XG4gIH1cbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0QWxsRGVmaW5lZChhc3NlcnRBbGxEZWZpbmVkKTtcbmNvbnN0IGF0dGVudWF0ZSA9IChzcGVjaW1lbiwgcGVybWl0LCB0cmFuc2Zvcm0gPSAoeCkgPT4geCkgPT4ge1xuICAvL1xuICBpZiAocGVybWl0ID09PSB0cnVlIHx8IHR5cGVvZiBwZXJtaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8oc3BlY2ltZW4pO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcGF0aCA9IFtdO1xuICAvKlxuICBcbiAgICovXG5cblxuICBjb25zdCBleHRyYWN0ID0gKHN1YlNwZWNpbWVuLCBzdWJQZXJtaXQpID0+IHtcbiAgICBpZiAoc3ViUGVybWl0ID09PSBudWxsIHx8IHR5cGVvZiBzdWJQZXJtaXQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBwYXRoLmxlbmd0aCA9PT0gMCA/XG4gICAgICBGYWlsYGludmFsaWQgcGVybWl0OiAke3EocGVybWl0KX1gIDpcbiAgICAgIEZhaWxgaW52YWxpZCBwZXJtaXQgYXQgcGF0aCAke3EocGF0aCl9OiAke3Eoc3ViUGVybWl0KX1gO1xuICAgIH0gZWxzZSBpZiAoc3ViU3BlY2ltZW4gPT09IG51bGwgfHwgdHlwZW9mIHN1YlNwZWNpbWVuICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgcGF0aC5sZW5ndGggPT09IDAgP1xuICAgICAgRmFpbGBzcGVjaW1lbiBtdXN0IGJlIGFuIG9iamVjdCBmb3IgcGVybWl0ICR7cShwZXJtaXQpfWAgOlxuICAgICAgRmFpbGBzcGVjaW1lbiBhdCBwYXRoICR7cShwYXRoKX0gbXVzdCBiZSBhbiBvYmplY3QgZm9yIHBlcm1pdCAke3Eoc3ViUGVybWl0KX1gO1xuICAgIH1cbiAgICBjb25zdCBwaWNrcyA9IE9iamVjdC5lbnRyaWVzKHN1YlBlcm1pdCkubWFwKChbc3ViS2V5LCBkZWVwUGVybWl0XSkgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaGFzT3duKHN1YlNwZWNpbWVuLCBzdWJLZXkpKSB7XG4gICAgICAgIHRocm93IEZhaWxgc3BlY2ltZW4gaXMgbWlzc2luZyBwYXRoICR7cShwYXRoLmNvbmNhdChzdWJLZXkpKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVlcFNwZWNpbWVuID0gUmVmbGVjdC5nZXQoc3ViU3BlY2ltZW4sIHN1YktleSk7XG4gICAgICBpZiAoZGVlcFBlcm1pdCA9PT0gdHJ1ZSB8fCB0eXBlb2YgZGVlcFBlcm1pdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtzdWJLZXksIGRlZXBTcGVjaW1lbl07XG4gICAgICB9XG4gICAgICBwYXRoLnB1c2goc3ViS2V5KTtcbiAgICAgIGNvbnN0IGV4dHJhY3RlZCA9IGV4dHJhY3QoIC8qICAgICAgICAgICAgICAqLyhkZWVwU3BlY2ltZW4pLCBkZWVwUGVybWl0KTtcbiAgICAgIGNvbnN0IGVudHJ5ID0gW3N1YktleSwgZXh0cmFjdGVkXTtcbiAgICAgIHBhdGgucG9wKCk7XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYW5zZm9ybShPYmplY3QuZnJvbUVudHJpZXMocGlja3MpLCBzdWJQZXJtaXQpO1xuICB9O1xuXG4gIC8vXG4gIHJldHVybiBleHRyYWN0KHNwZWNpbWVuLCBwZXJtaXQpO1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuYXR0ZW51YXRlKGF0dGVudWF0ZSk7XG5jb25zdCBub3REb25lID0gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYWx3YXlzRG9uZSA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG5cbmNvbnN0IGZvcmV2ZXIgPSBhc3luY0dlbmVyYXRlKCgpID0+IG5vdERvbmUpO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5mb3JldmVyKGZvcmV2ZXIpO1xuY29uc3Qgd2hpbGVUcnVlID0gKHByb2R1Y2UpID0+XG5hc3luY0dlbmVyYXRlKGFzeW5jICgpID0+IHtcbiAgY29uc3QgdmFsdWUgPSBhd2FpdCBwcm9kdWNlKCk7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gYWx3YXlzRG9uZTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBkb25lOiBmYWxzZSxcbiAgICB2YWx1ZVxuICB9KTtcbn0pO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS53aGlsZVRydWUod2hpbGVUcnVlKTtcbmNvbnN0IHVudGlsVHJ1ZSA9IChwcm9kdWNlKSA9PlxuYXN5bmNHZW5lcmF0ZShhc3luYyAoKSA9PiB7XG4gIGNvbnN0IHZhbHVlID0gYXdhaXQgcHJvZHVjZSgpO1xuICBpZiAodmFsdWUpIHtcbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIGRvbmU6IHRydWUsXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGRvbmU6IGZhbHNlLFxuICAgIHZhbHVlXG4gIH0pO1xufSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS51bnRpbFRydWUodW50aWxUcnVlKTtcbmNvbnN0IHppcCA9ICh4cywgeXMpID0+IGhhcmRlbih4cy5tYXAoKHgsIGkpID0+IFt4LCB5c1sraV1dKSk7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuemlwKHppcCk7XG5jb25zdCBhbGxWYWx1ZXMgPSBhc3luYyAob2JqKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgUHJvbWlzZS5hbGwodmFsdWVzKG9iaikpO1xuICAvL1xuICByZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKHppcChrZXlzKG9iaiksIHJlc29sdmVkKSkpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmFsbFZhbHVlcyhhbGxWYWx1ZXMpO1xuY29uc3Qgc3luY2hyb25pemVkVGVlID0gKHNvdXJjZVN0cmVhbSwgcmVhZGVyQ291bnQpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGRvbmVSZXN1bHQ7XG5cbiAgLypcbiAgXG4gICAqL1xuXG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBxdWV1ZXMgPSBbXTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHB1bGxOZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHF1ZXVlcy5tYXAoKHF1ZXVlKSA9PiBxdWV1ZS5nZXQoKSkpO1xuICAgIGNvbnN0IHJlamVjdGlvbnMgPSBbXTtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCByZXNvbHZlcnMgPSBbXTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGZvciAoY29uc3Qgc2V0dGxlZFJlc3VsdCBvZiByZXF1ZXN0cykge1xuICAgICAgaWYgKHNldHRsZWRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIHJlamVjdGlvbnMucHVzaChzZXR0bGVkUmVzdWx0LnJlYXNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lIHx8PSAhIXNldHRsZWRSZXN1bHQudmFsdWUuZG9uZTtcbiAgICAgICAgcmVzb2x2ZXJzLnB1c2goc2V0dGxlZFJlc3VsdC52YWx1ZS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoZG9uZVJlc3VsdCkge1xuICAgICAgcmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKGRvbmVSZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAocmVqZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbWFrZUVycm9yKFhgVGVlZCBzdHJlYW0gdGhyZXdgKTtcbiAgICAgIGFubm90YXRlRXJyb3IoZXJyb3IsIFhgVGVlZCByZWplY3Rpb25zOiAke3JlamVjdGlvbnN9YCk7XG4gICAgICByZXN1bHQgPVxuICAgICAgc291cmNlU3RyZWFtLnRocm93Py4oZXJyb3IpIHx8XG4gICAgICBQcm9taXNlLnJlc29sdmUoc291cmNlU3RyZWFtLnJldHVybj8uKCkpLnRoZW4oKCkgPT5cbiAgICAgIFByb21pc2UucmVqZWN0KGVycm9yKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGRvbmUpIHtcbiAgICAgIHJlc3VsdCA9XG4gICAgICBzb3VyY2VTdHJlYW0ucmV0dXJuPy4oKSB8fFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc291cmNlU3RyZWFtLm5leHQoKTtcbiAgICB9XG4gICAgcmVzdWx0LnRoZW4oXG4gICAgICAocikgPT4ge1xuICAgICAgICBpZiAoci5kb25lKSB7XG4gICAgICAgICAgZG9uZVJlc3VsdCA9IHI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGRvbmVSZXN1bHQgPSB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgIH1cbiAgICApO1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZSBvZiByZXNvbHZlcnMpIHtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHB1bGxOZXh0KCk7XG4gIH07XG5cbiAgY29uc3QgcmVhZGVycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHJlYWRlckNvdW50IH0pLm1hcCgoKSA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBxdWV1ZSA9IG1ha2VRdWV1ZSgpO1xuICAgIHF1ZXVlcy5wdXNoKHF1ZXVlKTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcmVhZGVyID0gaGFyZGVuKHtcbiAgICAgIGFzeW5jIG5leHQoKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAgICAqL1xuXG5cblxuICAgICAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gICAgICAgIHF1ZXVlLnB1dCh7IHZhbHVlOiByZXNvbHZlLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgcmV0dXJuKCkge1xuICAgICAgICAvKlxuICAgICAgICAgICAgKi9cblxuXG5cbiAgICAgICAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgICBxdWV1ZS5wdXQoeyB2YWx1ZTogcmVzb2x2ZSwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgdGhyb3cocmVhc29uKSB7XG4gICAgICAgIGNvbnN0IHJlamVjdGlvbiA9IFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIHF1ZXVlLnB1dChyZWplY3Rpb24pO1xuICAgICAgICByZXR1cm4gcmVqZWN0aW9uO1xuICAgICAgfSxcbiAgICAgIC8vXG4gICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gcmVhZGVyO1xuICAgICAgfSxcbiAgICAgIC8vXG4gICAgICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG4gICAgICAgIGF3YWl0IHJlYWRlci5yZXR1cm4oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVhZGVyO1xuICB9KTtcblxuICB2b2lkIHB1bGxOZXh0KCk7XG4gIHJldHVybiByZWFkZXJzO1xufTskaM2PX29uY2Uuc3luY2hyb25pemVkVGVlKHN5bmNocm9uaXplZFRlZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJvYmplY3RNYXAiOlsib2JqZWN0TWFwIixmYWxzZV0sIm9iamVjdE1ldGFNYXAiOlsib2JqZWN0TWV0YU1hcCIsZmFsc2VdLCJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyIsZmFsc2VdfSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMaW1pdGVkQ29uc29sZSI6WyJtYWtlTGltaXRlZENvbnNvbGUiXSwiZGVlcGx5RnVsZmlsbGVkT2JqZWN0IjpbImRlZXBseUZ1bGZpbGxlZE9iamVjdCJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJ3aXRoRGVmZXJyZWRDbGVhbnVwIjpbIndpdGhEZWZlcnJlZENsZWFudXAiXSwiYXNzZXJ0QWxsRGVmaW5lZCI6WyJhc3NlcnRBbGxEZWZpbmVkIl0sImF0dGVudWF0ZSI6WyJhdHRlbnVhdGUiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXSwic3luY2hyb25pemVkVGVlIjpbInN5bmNocm9uaXplZFRlZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABjJ+i4rgYAAK4GAAAsAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3Rlc3RpbmctdXRpbHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImV2ZW50TG9vcEl0ZXJhdGlvbiIsImluc3BlY3RNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuLypcblxuXG4gKi9cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBldmVudExvb3BJdGVyYXRpb24gPSBhc3luYyAoKSA9PlxubmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldEltbWVkaWF0ZShyZXNvbHZlKSk7JGjNj19vbmNlLmV2ZW50TG9vcEl0ZXJhdGlvbihldmVudExvb3BJdGVyYXRpb24pO1xuaGFyZGVuKGV2ZW50TG9vcEl0ZXJhdGlvbik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHN0cmluZ09yVGFnID0gKHZhbHVlKSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ107XG4gIH1cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59O1xuLypcblxuXG4gKi9cbmNvbnN0IGluc3BlY3RNYXBTdG9yZSA9IChzdG9yZSkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBvYmogPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygc3RvcmUua2V5cygpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICBjb25zdCBoYXNLZXlzID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAna2V5cycgaW4gdmFsdWU7XG4gICAgY29uc3QgaW5kZXggPSBzdHJpbmdPclRhZyhrZXkpO1xuICAgIGlmIChoYXNLZXlzICYmICdnZXQnIGluIHZhbHVlKSB7XG4gICAgICBvYmpbaW5kZXhdID0gaW5zcGVjdE1hcFN0b3JlKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0tleXMpIHtcbiAgICAgIG9ialtpbmRleF0gPSBBcnJheS5mcm9tKHZhbHVlLmtleXMoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtpbmRleF0gPVxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlID9cbiAgICAgIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gOlxuICAgICAgdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59OyRozY9fb25jZS5pbnNwZWN0TWFwU3RvcmUoaW5zcGVjdE1hcFN0b3JlKTtcbmhhcmRlbihpbnNwZWN0TWFwU3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZXZlbnRMb29wSXRlcmF0aW9uIjpbImV2ZW50TG9vcEl0ZXJhdGlvbiJdLCJpbnNwZWN0TWFwU3RvcmUiOlsiaW5zcGVjdE1hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO3aTIYNAwAADQMAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUNoZWNrLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiY2FzdCIsIm11c3RNYXRjaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHR5cGVsZXNzTXVzdE1hdGNoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKHR5cGVsZXNzTXVzdE1hdGNoID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKlxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtdXN0TWF0Y2ggPSB0eXBlbGVzc011c3RNYXRjaDtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpO1xuY29uc3QgY2FzdCA9IChzcGVjaW1lbiwgcGF0dCkgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIHBhdHQpO1xuICByZXR1cm4gc3BlY2ltZW47XG59OyRozY9fb25jZS5jYXN0KGNhc3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJjYXN0IjpbImNhc3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQUzXyiQEAAAkBAAAKQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiQnJpZGdlQmlnSW50U2hhcGUiLCJTdG9yYWdlTm9kZVNoYXBlIiwiVW5ndWFyZGVkSGVscGVySSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE07JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCBTdG9yYWdlTm9kZVNoYXBlID0gTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJyk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5TdG9yYWdlTm9kZVNoYXBlKFN0b3JhZ2VOb2RlU2hhcGUpO1xuY29uc3QgVW5ndWFyZGVkSGVscGVySSA9IE0uaW50ZXJmYWNlKFxuICAnaGVscGVyJyxcbiAge30sXG4gIC8vXG4gIHsgc2xvcHB5OiB0cnVlIH1cbik7XG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuICovJGjNj19vbmNlLlVuZ3VhcmRlZEhlbHBlckkoVW5ndWFyZGVkSGVscGVySSk7XG5jb25zdCBCcmlkZ2VCaWdJbnRTaGFwZSA9IE0ub3IoTS5udW1iZXIoKSwgTS5zdHJpbmcoKSk7JGjNj19vbmNlLkJyaWRnZUJpZ0ludFNoYXBlKEJyaWRnZUJpZ0ludFNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlN0b3JhZ2VOb2RlU2hhcGUiOlsiU3RvcmFnZU5vZGVTaGFwZSJdLCJVbmd1YXJkZWRIZWxwZXJJIjpbIlVuZ3VhcmRlZEhlbHBlckkiXSwiQnJpZGdlQmlnSW50U2hhcGUiOlsiQnJpZGdlQmlnSW50U2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACiShhgMwcAADMHAAAqAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3VwZ3JhZGUtYXBpLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSIsImlzQWJhbmRvbmVkRXJyb3IiLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIiwibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSxtYXRjaGVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBpc0Zyb3plbiB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlID0gaGFyZGVuKHtcbiAgbmFtZTogJ3ZhdFVwZ3JhZGVkJyxcbiAgdXBncmFkZU1lc3NhZ2U6IE0uc3RyaW5nKCksXG4gIGluY2FybmF0aW9uTnVtYmVyOiBNLm51bWJlcigpXG59KTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5VcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpO1xuY29uc3QgbWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uID0gKHVwZ3JhZGVNZXNzYWdlLCB0b0luY2FybmF0aW9uTnVtYmVyKSA9PlxuaGFyZGVuKHtcbiAgbmFtZTogJ3ZhdFVwZ3JhZGVkJyxcbiAgdXBncmFkZU1lc3NhZ2UsXG4gIGluY2FybmF0aW9uTnVtYmVyOiB0b0luY2FybmF0aW9uTnVtYmVyXG59KTskaM2PX29uY2UubWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc1VwZ3JhZGVEaXNjb25uZWN0aW9uID0gKHJlYXNvbikgPT5cbnJlYXNvbiAhPSBudWxsICYmIC8vXG5pc0Zyb3plbihyZWFzb24pICYmXG5tYXRjaGVzKHJlYXNvbiwgVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSk7JGjNj19vbmNlLmlzVXBncmFkZURpc2Nvbm5lY3Rpb24oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBpc0FiYW5kb25lZEVycm9yID0gKHJlYXNvbikgPT5cbnJlYXNvbiAhPSBudWxsICYmIC8vXG5pc0Zyb3plbihyZWFzb24pICYmXG5tYXRjaGVzKHJlYXNvbiwgTS5lcnJvcigpKSAmJlxuLy9cbi8vXG5yZWFzb24ubWVzc2FnZSA9PT0gJ3ZhdCB0ZXJtaW5hdGVkJzskaM2PX29uY2UuaXNBYmFuZG9uZWRFcnJvcihpc0FiYW5kb25lZEVycm9yKTtcbmhhcmRlbihpc0FiYW5kb25lZEVycm9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiOlsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSJdLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIl0sImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc0FiYW5kb25lZEVycm9yIjpbImlzQWJhbmRvbmVkRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/XpQsdAIAADQCAAAMwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N1YnNjcmliZS5qcyJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsc3Vic2NyaWJlTGF0ZXN0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVMYXRlc3RcIixbJGjNj19hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIgPSBzdWJzY3JpYmVMYXRlc3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIpO1xuY29uc3Qgb2JzZXJ2ZUl0ZXJhdG9yID0gKGFzeW5jSXRlcmF0b3JQLCBpdGVyYXRpb25PYnNlcnZlcikgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKGFjaywgb2JzZXJ2ZXJFcnJvcikgPT4ge1xuICAgIGNvbnN0IHJlY3VyID0gKCkgPT4ge1xuICAgICAgRS53aGVuKFxuICAgICAgICBFKGFzeW5jSXRlcmF0b3JQKS5uZXh0KCksXG4gICAgICAgICh7IHZhbHVlLCBkb25lIH0pID0+IHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoICYmIGl0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCh2YWx1ZSk7XG4gICAgICAgICAgICBhY2sodW5kZWZpbmVkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUgJiZcbiAgICAgICAgICAgIGl0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbiAgICAgICAgICAgIHJlY3VyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAocmVhc29uKSA9PiB7XG4gICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbCAmJiBpdGVyYXRpb25PYnNlcnZlci5mYWlsKHJlYXNvbik7XG4gICAgICAgICAgYWNrKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICkuY2F0Y2gob2JzZXJ2ZXJFcnJvcik7XG4gICAgfTtcbiAgICByZWN1cigpO1xuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uub2JzZXJ2ZUl0ZXJhdG9yKG9ic2VydmVJdGVyYXRvcik7XG5jb25zdCBvYnNlcnZlSXRlcmF0aW9uID0gKGFzeW5jSXRlcmFibGVQLCBpdGVyYXRpb25PYnNlcnZlcikgPT4ge1xuICBjb25zdCBpdGVyYXRvclAgPSBFKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgcmV0dXJuIG9ic2VydmVJdGVyYXRvcihpdGVyYXRvclAsIGl0ZXJhdGlvbk9ic2VydmVyKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uub2JzZXJ2ZUl0ZXJhdGlvbihvYnNlcnZlSXRlcmF0aW9uKTtcbmNvbnN0IG9ic2VydmVOb3RpZmllciA9IChub3RpZmllclAsIGl0ZXJhdGlvbk9ic2VydmVyKSA9Plxub2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpYmVMYXRlc3Qobm90aWZpZXJQKSwgaXRlcmF0aW9uT2JzZXJ2ZXIpOyRozY9fb25jZS5vYnNlcnZlTm90aWZpZXIob2JzZXJ2ZU5vdGlmaWVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl0sIm9ic2VydmVJdGVyYXRvciI6WyJvYnNlcnZlSXRlcmF0b3IiXSwib2JzZXJ2ZUl0ZXJhdGlvbiI6WyJvYnNlcnZlSXRlcmF0aW9uIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwj7tuOsHAADrBwAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9zdWJzY3JpYmVyLmpzIiwiLi90b3BpYy5qcyIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi9zdG9yZWQtbm90aWZpZXIuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zdG9yZWQtbm90aWZpZXIuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbXV0sW1wiLi9ub3RpZmllci5qc1wiLCBbXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtdXSxbXCIuL3RvcGljLmpzXCIsIFtdXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtdXSxbXCIuL3N0b3Jlc3ViLmpzXCIsIFtdXSxbXCIuL3N0b3JlZC1ub3RpZmllci5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vcHVibGlzaC1raXQuanMiOltbIm1ha2VQdWJsaXNoS2l0IiwibWFrZVB1Ymxpc2hLaXQiXSxbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLFsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSxbIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlRWFjaFRvcGljSSJdLFsiSXRlcmFibGVMYXRlc3RUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLFsiU3Vic2NyaWJlclNoYXBlIiwiU3Vic2NyaWJlclNoYXBlIl1dLCIuL3N1YnNjcmliZS5qcyI6W1sic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUVhY2giXSxbInN1YnNjcmliZUxhdGVzdCIsInN1YnNjcmliZUxhdGVzdCJdXSwiLi9ub3RpZmllci5qcyI6W1sibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyIl0sWyJtYWtlTm90aWZpZXJLaXQiLCJtYWtlTm90aWZpZXJLaXQiXSxbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXSxbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXV0sIi4vc3Vic2NyaWJlci5qcyI6W1sibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb24iXSxbIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il1dLCIuL3RvcGljLmpzIjpbWyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIiwibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdXSwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyI6W1sib2JzZXJ2ZU5vdGlmaWVyIiwib2JzZXJ2ZU5vdGlmaWVyIl0sWyJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiXSxbIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0aW9uIl0sWyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACD3dfrEhMAABITAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL25vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQsRSxGYXIsbWFrZVB1Ymxpc2hLaXQsc3Vic2NyaWJlTGF0ZXN0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIixbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZU5vdGlmaWVyID0gKHNoYXJhYmxlSW50ZXJuYWxzUCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBub3RpZmllciA9IEZhcignbm90aWZpZXInLCB7XG4gICAgLi4uc3Vic2NyaWJlTGF0ZXN0KHNoYXJhYmxlSW50ZXJuYWxzUCksXG4gICAgZ2V0VXBkYXRlU2luY2U6IGFzeW5jICh1cGRhdGVDb3VudCkgPT5cbiAgICBFKHNoYXJhYmxlSW50ZXJuYWxzUCkuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuXG4gICAgLypcbiAgICAgICAgICovXG5cblxuXG5cbiAgICBnZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOiBhc3luYyAoKSA9PiBzaGFyYWJsZUludGVybmFsc1AsXG4gICAgLypcbiAgICAgICAgKi9cblxuXG5cbiAgICBnZXRTdG9yZUtleTogKCkgPT4gaGFyZGVuKHsgbm90aWZpZXIgfSlcbiAgfSk7XG4gIHJldHVybiBub3RpZmllcjtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZU5vdGlmaWVyKG1ha2VOb3RpZmllcik7XG5jb25zdCBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciA9IChzdWJzY3JpYmVyKSA9PiB7XG4gIC8qXG4gICAgKi9cblxuICBjb25zdCBiYXNlTm90aWZpZXIgPSBoYXJkZW4oe1xuICAgIGdldFVwZGF0ZVNpbmNlOiAodXBkYXRlQ291bnQgPSB1bmRlZmluZWQpID0+XG4gICAgRShzdWJzY3JpYmVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudClcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgbm90aWZpZXIgPSBGYXIoJ25vdGlmaWVyJywge1xuICAgIC4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuICAgIC4uLmJhc2VOb3RpZmllclxuICB9KTtcbiAgcmV0dXJuIG5vdGlmaWVyO1xufTskaM2PX29uY2UubWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIobWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZU5vdGlmaWVyS2l0ID0gKC4uLmluaXRpYWxTdGF0ZUFycikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuXG4gIGNvbnN0IG5vdGlmaWVyID0gbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIoc3Vic2NyaWJlcik7XG5cbiAgY29uc3QgdXBkYXRlciA9IEZhcigndXBkYXRlcicsIHtcbiAgICB1cGRhdGVTdGF0ZTogKHN0YXRlKSA9PiBwdWJsaXNoZXIucHVibGlzaChzdGF0ZSksXG4gICAgZmluaXNoOiAoY29tcGxldGlvbikgPT4gcHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbiAgICBmYWlsOiAocmVhc29uKSA9PiBwdWJsaXNoZXIuZmFpbChyZWFzb24pXG4gIH0pO1xuXG4gIGFzc2VydChpbml0aWFsU3RhdGVBcnIubGVuZ3RoIDw9IDEsICd0b28gbWFueSBhcmd1bWVudHMnKTtcbiAgaWYgKGluaXRpYWxTdGF0ZUFyci5sZW5ndGggPT09IDEpIHtcbiAgICB1cGRhdGVyLnVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZUFyclswXSk7XG4gIH1cblxuICAvL1xuICAvL1xuICByZXR1cm4gaGFyZGVuKHsgbm90aWZpZXIsIHVwZGF0ZXIgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZU5vdGlmaWVyS2l0KG1ha2VOb3RpZmllcktpdCk7XG5jb25zdCBtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSA9IChhc3luY0l0ZXJhYmxlUCkgPT4ge1xuICBjb25zdCBpdGVyYXRvclAgPSBFKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBvcHROZXh0UHJvbWlzZTtcbiAgbGV0IGN1cnJlbnRVcGRhdGVDb3VudCA9IDBuO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBjdXJyZW50UmVzcG9uc2U7XG4gIGxldCBmaW5hbCA9IGZhbHNlO1xuXG4gIC8qXG4gICAgKi9cblxuICBjb25zdCBiYXNlTm90aWZpZXIgPSBGYXIoJ2Jhc2VOb3RpZmllcicsIHtcbiAgICBnZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCA9IC0xbikge1xuICAgICAgaWYgKHVwZGF0ZUNvdW50IDwgY3VycmVudFVwZGF0ZUNvdW50KSB7XG4gICAgICAgIGlmIChjdXJyZW50UmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodXBkYXRlQ291bnQgIT09IGN1cnJlbnRVcGRhdGVDb3VudCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAnZ2V0VXBkYXRlU2luY2UgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHVwZGF0ZUNvdW50LidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIGlmIChmaW5hbCkge1xuICAgICAgICBhc3NlcnQoY3VycmVudFJlc3BvbnNlICE9PSB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBpZiAoIW9wdE5leHRQcm9taXNlKSB7XG4gICAgICAgIGNvbnN0IG5leHRJdGVyUmVzdWx0UCA9IEUoaXRlcmF0b3JQKS5uZXh0KCk7XG4gICAgICAgIG9wdE5leHRQcm9taXNlID0gRS53aGVuKFxuICAgICAgICAgIG5leHRJdGVyUmVzdWx0UCxcbiAgICAgICAgICAoeyBkb25lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQoIWZpbmFsKTtcbiAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgIGZpbmFsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRVcGRhdGVDb3VudCArPSAxbjtcbiAgICAgICAgICAgIGN1cnJlbnRSZXNwb25zZSA9IGhhcmRlbih7XG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICB1cGRhdGVDb3VudDogZG9uZSA/IHVuZGVmaW5lZCA6IGN1cnJlbnRVcGRhdGVDb3VudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcHROZXh0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoX3JlYXNvbikgPT4ge1xuICAgICAgICAgICAgZmluYWwgPSB0cnVlO1xuICAgICAgICAgICAgY3VycmVudFJlc3BvbnNlID1cbiAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgKG5leHRJdGVyUmVzdWx0UCk7XG4gICAgICAgICAgICBvcHROZXh0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdE5leHRQcm9taXNlO1xuICAgIH1cbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgbm90aWZpZXIgPSBGYXIoJ25vdGlmaWVyJywge1xuICAgIC8vXG4gICAgLy9cbiAgICAuLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbiAgICAuLi5iYXNlTm90aWZpZXJcbiAgfSk7XG4gIHJldHVybiBub3RpZmllcjtcbn07JGjNj19vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTm90aWZpZXIiOlsibWFrZU5vdGlmaWVyIl0sIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIjpbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl0sIm1ha2VOb3RpZmllcktpdCI6WyJtYWtlTm90aWZpZXJLaXQiXSwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiOlsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxC2iI2UyAABlMgAAKgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9wdWJsaXNoLWtpdC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3BhdHRlcm5zIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIlVwZGF0ZUNvdW50U2hhcGUiLCJtYWtlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInB1Ymxpc2hLaXRJS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEUsRmFyLG1ha2VQcm9taXNlS2l0LE0sZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkLGNhbkJlRHVyYWJsZSxwcmVwYXJlRXhvQ2xhc3NLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIixbJGjNj19hID0+IChjYW5CZUR1cmFibGUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuY29uc3Qgc2luayA9ICgpID0+IHt9O1xuY29uc3QgbWFrZVF1aWV0UmVqZWN0aW9uID0gKHJlYXNvbikgPT4ge1xuICBjb25zdCByZWplY3Rpb24gPSBoYXJkZW4oUHJvbWlzZS5yZWplY3QocmVhc29uKSk7XG4gIHZvaWQgRS53aGVuKHJlamVjdGlvbiwgc2luaywgc2luayk7XG4gIHJldHVybiByZWplY3Rpb247XG59O1xuY29uc3QgdG9vRmFyUmVqZWN0aW9uID0gbWFrZVF1aWV0UmVqZWN0aW9uKFxuICBoYXJkZW4oRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgZW5kIG9mIGl0ZXJhdGlvbi4nKSlcbik7XG5cbmNvbnN0IFB1Ymxpc2hlckkgPSBNLmludGVyZmFjZSgnUHVibGlzaGVyJywge1xuICBwdWJsaXNoOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBmaW5pc2g6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gIGZhaWw6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKClcbn0pO1xuXG4vL1xuJGjNj19vbmNlLlB1Ymxpc2hlckkoUHVibGlzaGVySSk7Y29uc3QgVXBkYXRlQ291bnRTaGFwZSA9IE0ub3IoTS5iaWdpbnQoKSwgTS5udW1iZXIoKSk7JGjNj19vbmNlLlVwZGF0ZUNvdW50U2hhcGUoVXBkYXRlQ291bnRTaGFwZSk7XG5jb25zdCBTdWJzY3JpYmVySSA9IE0uaW50ZXJmYWNlKCdTdWJzY3JpYmVyJywge1xuICBzdWJzY3JpYmVBZnRlcjogTS5jYWxsKCkub3B0aW9uYWwoTS5iaWdpbnQoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldFVwZGF0ZVNpbmNlOiBNLmNhbGwoKS5vcHRpb25hbChVcGRhdGVDb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKVxufSk7JGjNj19vbmNlLlN1YnNjcmliZXJJKFN1YnNjcmliZXJJKTtcbmNvbnN0IHB1Ymxpc2hLaXRJS2l0ID0gaGFyZGVuKHtcbiAgcHVibGlzaGVyOiBQdWJsaXNoZXJJLFxuICBzdWJzY3JpYmVyOiBTdWJzY3JpYmVySVxufSk7JGjNj19vbmNlLnB1Ymxpc2hLaXRJS2l0KHB1Ymxpc2hLaXRJS2l0KTtcblxuY29uc3QgRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSA9IE0uaW50ZXJmYWNlKFxuICAnRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InLFxuICB7XG4gICAgZm9yazogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiBNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLCAvL1xuICAgIG5leHQ6IE0uY2FsbFdoZW4oKS5yZXR1cm5zKE0uYW55KCkpXG4gIH1cbik7JGjNj19vbmNlLkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUoRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSk7XG5cbmNvbnN0IEl0ZXJhYmxlRWFjaFRvcGljSSA9IE0uaW50ZXJmYWNlKCdJdGVyYWJsZUVhY2hUb3BpYycsIHtcbiAgc3Vic2NyaWJlQWZ0ZXI6XG4gIGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChTdWJzY3JpYmVySSkubWV0aG9kR3VhcmRzLnN1YnNjcmliZUFmdGVyLFxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiBNLmNhbGwoKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicpXG4gIClcbn0pOyRozY9fb25jZS5JdGVyYWJsZUVhY2hUb3BpY0koSXRlcmFibGVFYWNoVG9waWNJKTtcblxuY29uc3QgSXRlcmFibGVMYXRlc3RUb3BpY0kgPSBNLmludGVyZmFjZSgnSXRlcmFibGVMYXRlc3RUb3BpYycsIHtcbiAgZ2V0VXBkYXRlU2luY2U6XG4gIGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChTdWJzY3JpYmVySSkubWV0aG9kR3VhcmRzLmdldFVwZGF0ZVNpbmNlLFxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiBNLmNhbGwoKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicpXG4gIClcbn0pO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuSXRlcmFibGVMYXRlc3RUb3BpY0koSXRlcmFibGVMYXRlc3RUb3BpY0kpO1xuY29uc3Qgd2Vha01lbW9pemVVbmFyeSA9IChmbikgPT4ge1xuICBjb25zdCBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG4gIHJldHVybiAoYXJnKSA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICovXG4gICAgY29uc3Qgb2FyZyA9IGFyZztcbiAgICBpZiAoY2FjaGUuaGFzKG9hcmcpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KG9hcmcpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmbihhcmcpO1xuICAgIGNhY2hlLnNldChvYXJnLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkID0gKHJlY29yZCkgPT4ge1xuICBjb25zdCB7XG4gICAgaGVhZDogeyB2YWx1ZSwgZG9uZSB9LFxuICAgIHB1Ymxpc2hDb3VudFxuICB9ID0gcmVjb3JkO1xuICBpZiAoZG9uZSkge1xuICAgIC8vXG4gICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCB1cGRhdGVDb3VudDogdW5kZWZpbmVkIH0pO1xuICB9XG4gIHJldHVybiBoYXJkZW4oeyB2YWx1ZSwgdXBkYXRlQ291bnQ6IHB1Ymxpc2hDb3VudCB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VQdWJsaXNoS2l0ID0gKCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgdGFpbFA7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgdGFpbFI7XG4gICgoKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKSkpO1xuXG4gIGxldCBjdXJyZW50UHVibGlzaENvdW50ID0gMG47XG4gIGxldCBjdXJyZW50UCA9IHRhaWxQO1xuICBjb25zdCBhZHZhbmNlQ3VycmVudCA9IChkb25lLCB2YWx1ZSwgcmVqZWN0aW9uKSA9PiB7XG4gICAgaWYgKHRhaWxSID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRQdWJsaXNoQ291bnQgKz0gMW47XG4gICAgY3VycmVudFAgPSB0YWlsUDtcbiAgICBjb25zdCByZXNvbHZlQ3VycmVudCA9IHRhaWxSO1xuXG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHRhaWxQID0gdG9vRmFyUmVqZWN0aW9uO1xuICAgICAgdGFpbFIgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICgoKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKSkpO1xuICAgIH1cblxuICAgIGlmIChyZWplY3Rpb24pIHtcbiAgICAgIHJlc29sdmVDdXJyZW50KHJlamVjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmVDdXJyZW50KFxuICAgICAgICBoYXJkZW4oe1xuICAgICAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmUgfSxcbiAgICAgICAgICBwdWJsaXNoQ291bnQ6IGN1cnJlbnRQdWJsaXNoQ291bnQsXG4gICAgICAgICAgdGFpbDogdGFpbFBcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCA9IHdlYWtNZW1vaXplVW5hcnkoXG4gICAgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZFxuICApO1xuXG4gIC8qXG4gICAgICovXG5cblxuICBjb25zdCBzdWJzY3JpYmVyID0gRmFyKCdTdWJzY3JpYmVyJywge1xuICAgIHN1YnNjcmliZUFmdGVyOiAocHVibGlzaENvdW50ID0gLTFuKSA9PiB7XG4gICAgICBhc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwgJ2JpZ2ludCcpO1xuICAgICAgaWYgKHB1Ymxpc2hDb3VudCA9PT0gY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICByZXR1cm4gdGFpbFA7XG4gICAgICB9IGVsc2UgaWYgKHB1Ymxpc2hDb3VudCA8IGN1cnJlbnRQdWJsaXNoQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgJ3N1YnNjcmliZUFmdGVyIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCBwdWJsaXNoQ291bnQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0VXBkYXRlU2luY2U6ICh1cGRhdGVDb3VudCkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gICAgICB9XG4gICAgICB1cGRhdGVDb3VudCA9IEJpZ0ludCh1cGRhdGVDb3VudCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgc3Vic2NyaWJlclxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAudGhlbigoKSA9PiBzdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKCkpXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHB1Ymxpc2hlciA9IEZhcignUHVibGlzaGVyJywge1xuICAgIHB1Ymxpc2g6ICh2YWx1ZSkgPT4ge1xuICAgICAgYWR2YW5jZUN1cnJlbnQoZmFsc2UsIHZhbHVlKTtcbiAgICB9LFxuICAgIGZpbmlzaDogKGZpbmFsVmFsdWUpID0+IHtcbiAgICAgIGFkdmFuY2VDdXJyZW50KHRydWUsIGZpbmFsVmFsdWUpO1xuICAgIH0sXG4gICAgZmFpbDogKHJlYXNvbikgPT4ge1xuICAgICAgYWR2YW5jZUN1cnJlbnQodHJ1ZSwgdW5kZWZpbmVkLCBtYWtlUXVpZXRSZWplY3Rpb24ocmVhc29uKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGhhcmRlbih7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9KTtcbn07JGjNj19vbmNlLm1ha2VQdWJsaXNoS2l0KG1ha2VQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlUHVibGlzaEtpdCk7XG5cbmNvbnN0IER1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZSA9IGhhcmRlbih7XG4gIHZhbHVlRHVyYWJpbGl0eTogTS5hbnkoKSxcbiAgcHVibGlzaENvdW50OiBNLmFueSgpLFxuICBzdGF0dXM6IE0uYW55KCksXG4gIGhhc1ZhbHVlOiBNLmFueSgpLFxuICB2YWx1ZTogTS5hbnkoKVxufSk7XG5cbi8vXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7IHZhbHVlRHVyYWJpbGl0eSA9ICdtYW5kYXRvcnknIH0gPSBvcHRpb25zO1xuICBhc3NlcnQuZXF1YWwodmFsdWVEdXJhYmlsaXR5LCAnbWFuZGF0b3J5Jyk7XG4gIHJldHVybiB7XG4gICAgLy9cbiAgICB2YWx1ZUR1cmFiaWxpdHksXG5cbiAgICAvL1xuICAgIHB1Ymxpc2hDb3VudDogMG4sXG4gICAgc3RhdHVzOiAnbGl2ZScsIC8vXG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBoYXNWYWx1ZTogZmFsc2UsXG4gICAgdmFsdWU6IHVuZGVmaW5lZFxuICB9O1xufTtcblxuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qXG5cblxuICovXG5jb25zdCBnZXRFcGhlbWVyYWxLZXkgPSAoZmFjZXRzKSA9PiBmYWNldHMucHVibGlzaGVyO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YSA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBwcm92aWRlQ3VycmVudFAgPSAoc3RhdGUsIGZhY2V0cywgdGFpbCkgPT4ge1xuICBjb25zdCBlcGhlbWVyYWxLZXkgPSBnZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbiAgY29uc3QgZm91bmREYXRhID0gZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLmdldChlcGhlbWVyYWxLZXkpO1xuICBjb25zdCBjdXJyZW50UCA9IGZvdW5kRGF0YSAmJiBmb3VuZERhdGEuY3VycmVudFA7XG4gIGlmIChjdXJyZW50UCkge1xuICAgIHJldHVybiBjdXJyZW50UDtcbiAgfVxuXG4gIGNvbnN0IHsgcHVibGlzaENvdW50LCBzdGF0dXMsIGhhc1ZhbHVlLCB2YWx1ZSB9ID0gc3RhdGU7XG4gIGlmICghaGFzVmFsdWUpIHtcbiAgICBhc3NlcnQoc3RhdHVzID09PSAnbGl2ZScpO1xuICAgIHJldHVybiB0YWlsO1xuICB9XG4gIGlmIChzdGF0dXMgPT09ICdsaXZlJyB8fCBzdGF0dXMgPT09ICdmaW5pc2hlZCcpIHtcbiAgICBjb25zdCBjZWxsID0gaGFyZGVuKHtcbiAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmU6IHN0YXR1cyAhPT0gJ2xpdmUnIH0sXG4gICAgICBwdWJsaXNoQ291bnQsXG4gICAgICB0YWlsXG4gICAgfSk7XG4gICAgcmV0dXJuIEUucmVzb2x2ZShjZWxsKTtcbiAgfSBlbHNlIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgcmV0dXJuIG1ha2VRdWlldFJlamVjdGlvbih2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YSA9IChzdGF0ZSwgZmFjZXRzKSA9PiB7XG4gIGNvbnN0IGVwaGVtZXJhbEtleSA9IGdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuICBjb25zdCBmb3VuZERhdGEgPSBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG4gIGlmIChmb3VuZERhdGEpIHtcbiAgICByZXR1cm4gZm91bmREYXRhO1xuICB9XG5cbiAgY29uc3QgeyBzdGF0dXMgfSA9IHN0YXRlO1xuICBsZXQgdGFpbFA7XG4gIGxldCB0YWlsUjtcbiAgaWYgKHN0YXR1cyA9PT0gJ2xpdmUnKSB7XG4gICAgKCgoeyBwcm9taXNlOiB0YWlsUCwgcmVzb2x2ZTogdGFpbFIgfSA9IG1ha2VQcm9taXNlS2l0KCkpKSk7XG4gICAgdm9pZCBFLndoZW4odGFpbFAsIHNpbmssIHNpbmspO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ2ZpbmlzaGVkJyB8fCBzdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgdGFpbFAgPSB0b29GYXJSZWplY3Rpb247XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuICB9XG4gIC8vXG4gIGNvbnN0IG9iaiA9IGhhcmRlbih7IGN1cnJlbnRQOiB1bmRlZmluZWQsIHRhaWxQLCB0YWlsUiB9KTtcbiAgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChlcGhlbWVyYWxLZXksIG9iaik7XG4gIHJldHVybiBvYmo7XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0ID0gKGNvbnRleHQsIHZhbHVlLCB0YXJnZXRTdGF0dXMgPSAnbGl2ZScpID0+IHtcbiAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSBjb250ZXh0O1xuICBjb25zdCB7IHZhbHVlRHVyYWJpbGl0eSwgc3RhdHVzIH0gPSBzdGF0ZTtcbiAgaWYgKHN0YXR1cyAhPT0gJ2xpdmUnKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gIH1cbiAgY29uc3QgZG9uZSA9IHRhcmdldFN0YXR1cyAhPT0gJ2xpdmUnO1xuICBpZiAoZG9uZSB8fCB2YWx1ZUR1cmFiaWxpdHkgPT09ICdtYW5kYXRvcnknKSB7XG4gICAgY2FuQmVEdXJhYmxlKHZhbHVlKSB8fCBGYWlsYENhbm5vdCBhY2NlcHQgbm9uLWR1cmFibGUgdmFsdWU6ICR7dmFsdWV9YDtcbiAgfVxuICBjb25zdCB7IHRhaWxQOiBvbGRUYWlsUCwgdGFpbFI6IHJlc29sdmVPbGRUYWlsIH0gPVxuICBwcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKHN0YXRlLCBmYWNldHMpO1xuICBhc3NlcnQudHlwZW9mKHJlc29sdmVPbGRUYWlsLCAnZnVuY3Rpb24nKTtcblxuICBjb25zdCBwdWJsaXNoQ291bnQgPSBzdGF0ZS5wdWJsaXNoQ291bnQgKyAxbjtcbiAgc3RhdGUucHVibGlzaENvdW50ID0gcHVibGlzaENvdW50O1xuXG4gIGxldCB0YWlsUDtcbiAgbGV0IHRhaWxSO1xuICBpZiAoZG9uZSkge1xuICAgIHN0YXRlLnN0YXR1cyA9IHRhcmdldFN0YXR1cztcbiAgICB0YWlsUCA9IHRvb0ZhclJlamVjdGlvbjtcbiAgICB0YWlsUiA9IHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICAoKCh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSkpKTtcbiAgICB2b2lkIEUud2hlbih0YWlsUCwgc2luaywgc2luayk7XG4gIH1cblxuICBsZXQgY3VycmVudFA7XG4gIGlmICh0YXJnZXRTdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgc3RhdGUuaGFzVmFsdWUgPSB0cnVlO1xuICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgY29uc3QgcmVqZWN0aW9uID0gbWFrZVF1aWV0UmVqZWN0aW9uKHZhbHVlKTtcbiAgICByZXNvbHZlT2xkVGFpbChyZWplY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoZG9uZSB8fCAodmFsdWVEdXJhYmlsaXR5ICE9PSAnaWdub3JlZCcgJiYgY2FuQmVEdXJhYmxlKHZhbHVlKSkpIHtcbiAgICAgIHN0YXRlLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIC8vXG4gICAgICBjdXJyZW50UCA9IG9sZFRhaWxQO1xuICAgIH1cblxuICAgIHJlc29sdmVPbGRUYWlsKFxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgaGVhZDogeyB2YWx1ZSwgZG9uZSB9LFxuICAgICAgICBwdWJsaXNoQ291bnQsXG4gICAgICAgIHRhaWw6IHRhaWxQXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KFxuICAgIGdldEVwaGVtZXJhbEtleShmYWNldHMpLFxuICAgIGhhcmRlbih7IGN1cnJlbnRQLCB0YWlsUCwgdGFpbFIgfSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCA9IChiYWdnYWdlLCBraW5kTmFtZSkgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQgPSBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkO1xuXG4gIHJldHVybiBwcmVwYXJlRXhvQ2xhc3NLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBwdWJsaXNoS2l0SUtpdCxcbiAgICBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSxcbiAgICB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHB1Ymxpc2hlcjoge1xuICAgICAgICBwdWJsaXNoKHZhbHVlKSB7XG4gICAgICAgICAgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZmluaXNoKGZpbmFsVmFsdWUpIHtcbiAgICAgICAgICBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcywgZmluYWxWYWx1ZSwgJ2ZpbmlzaGVkJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGZhaWwocmVhc29uKSB7XG4gICAgICAgICAgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsIHJlYXNvbiwgJ2ZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHN1YnNjcmliZXI6IHtcbiAgICAgICAgc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50ID0gLTFuKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgcHVibGlzaENvdW50OiBjdXJyZW50UHVibGlzaENvdW50IH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCB7IGN1cnJlbnRQLCB0YWlsUCB9ID0gcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgZmFjZXRzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocHVibGlzaENvdW50ID09PSBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFpbFA7XG4gICAgICAgICAgfSBlbHNlIGlmIChwdWJsaXNoQ291bnQgPCBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFAgfHwgcHJvdmlkZUN1cnJlbnRQKHN0YXRlLCBmYWNldHMsIHRhaWxQKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICdzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGZhY2V0czogeyBzdWJzY3JpYmVyIH1cbiAgICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgICBpZiAodXBkYXRlQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZUNvdW50ID0gQmlnSW50KHVwZGF0ZUNvdW50KTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHN1YnNjcmliZXJcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC50aGVuKCgpID0+IHN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBzdGF0ZVNoYXBlOiBEdXJhYmxlUHVibGlzaEtpdFN0YXRlU2hhcGVcbiAgICB9XG4gICk7XG59OyRozY9fb25jZS5wcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcbmhhcmRlbihwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuXG5jb25zdCBTdWJzY3JpYmVyU2hhcGUgPSBNLnJlbW90YWJsZSgnU3Vic2NyaWJlcicpOyRozY9fb25jZS5TdWJzY3JpYmVyU2hhcGUoU3Vic2NyaWJlclNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlB1Ymxpc2hlckkiOlsiUHVibGlzaGVySSJdLCJVcGRhdGVDb3VudFNoYXBlIjpbIlVwZGF0ZUNvdW50U2hhcGUiXSwiU3Vic2NyaWJlckkiOlsiU3Vic2NyaWJlckkiXSwicHVibGlzaEtpdElLaXQiOlsicHVibGlzaEtpdElLaXQiXSwiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSI6WyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIl0sIkl0ZXJhYmxlRWFjaFRvcGljSSI6WyJJdGVyYWJsZUVhY2hUb3BpY0kiXSwiSXRlcmFibGVMYXRlc3RUb3BpY0kiOlsiSXRlcmFibGVMYXRlc3RUb3BpY0kiXSwibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiXSwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IjpbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD++zZ2SCAAAkggAAC4AAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiQGVuZG8vZmFyIiwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyJdLCJleHBvcnRzIjpbIm1ha2VTdG9yZWROb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxFLEZhcixvYnNlcnZlTm90aWZpZXI7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIixbJGjNj19hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlTm90aWZpZXJcIixbJGjNj19hID0+IChvYnNlcnZlTm90aWZpZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZVN0b3JlZE5vdGlmaWVyID0gKG5vdGlmaWVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBhc3NlcnRBbGxEZWZpbmVkKHsgbm90aWZpZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyIH0pO1xuXG4gIGNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlID0gbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcik7XG5cbiAgb2JzZXJ2ZU5vdGlmaWVyKG5vdGlmaWVyLCB7XG4gICAgdXBkYXRlU3RhdGUodmFsdWUpIHtcbiAgICAgIG1hcnNoYWxsVG9TdG9yYWdlKHZhbHVlKS5jYXRjaCgocmVhc29uKSA9PlxuICAgICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIHVwZGF0ZVN0YXRlJywgcmVhc29uKVxuICAgICAgKTtcbiAgICB9LFxuICAgIGZhaWwocmVhc29uKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBmYWlsZWQgdG8gaXRlcmF0ZScsIHJlYXNvbik7XG4gICAgfVxuICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgaGFsdGVkIGl0ZXJhdGlvbicsIHJlYXNvbik7XG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB1bnNlcmlhbGl6ZXIgPSBGYXIoJ3Vuc2VyaWFsaXplcicsIHtcbiAgICBmcm9tQ2FwRGF0YTogKGRhdGEpID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gICAgdW5zZXJpYWxpemU6IChkYXRhKSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0b3JlZE5vdGlmaWVyID0gRmFyKCdTdG9yZWROb3RpZmllcicsIHtcbiAgICBnZXRVcGRhdGVTaW5jZTogKHVwZGF0ZUNvdW50KSA9PiBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG4gICAgZ2V0UGF0aDogKCkgPT4gRShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuICAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gdW5zZXJpYWxpemVyXG4gIH0pO1xuICByZXR1cm4gc3RvcmVkTm90aWZpZXI7XG59OyRozY9fb25jZS5tYWtlU3RvcmVkTm90aWZpZXIobWFrZVN0b3JlZE5vdGlmaWVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdG9yZWROb3RpZmllciI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJDgLfswXAADMFwAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIiwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IiwibWFrZVN0b3JlZFN1YnNjcmliZXIiLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYXIsbWFrZU1hcnNoYWwsYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLG9ic2VydmVJdGVyYXRpb24sbWFrZVB1Ymxpc2hLaXQsbWFrZVN1YnNjcmlwdGlvbktpdCxzdWJzY3JpYmVFYWNoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLFskaM2PX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsWyRozY9fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRozY9fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVJdGVyYXRpb25cIixbJGjNj19hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjNj19hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChtYWtlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLFskaM2PX2EgPT4gKG1ha2VTdWJzY3JpcHRpb25LaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkID0gYXN5bmMgKHN1YnNjcmliZXIsIGNvbnN1bWVWYWx1ZSkgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBpdGVyYXRvciA9IHN1YnNjcmliZUVhY2goc3Vic2NyaWJlcilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gIGF3YWl0IG51bGw7XG4gIHdoaWxlICghZmluaXNoZWQpIHtcbiAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG4gICAgYXdhaXQgY29uc3VtZVZhbHVlKHZhbHVlKTtcbiAgICBmaW5pc2hlZCA9ICEhZG9uZTtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChmb3JFYWNoUHVibGljYXRpb25SZWNvcmQpO1xuY29uc3QgbWFrZVN0b3JlZFN1YnNjcmliZXIgPSAoc3Vic2NyaWJlciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpID0+IHtcbiAgYXNzZXJ0QWxsRGVmaW5lZCh7IHN1YnNjcmliZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyIH0pO1xuXG4gIGNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlID0gbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcik7XG5cbiAgLy9cbiAgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKHN1YnNjcmliZXIsIG1hcnNoYWxsVG9TdG9yYWdlKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZFN1YnNjcmliZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLCBlcnIpO1xuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgdW5zZXJpYWxpemVyID0gRmFyKCd1bnNlcmlhbGl6ZXInLCB7XG4gICAgZnJvbUNhcERhdGE6IChkYXRhKSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICAgIHVuc2VyaWFsaXplOiAoZGF0YSkgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKVxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0b3Jlc3ViID0gRmFyKCdTdG9yZWRTdWJzY3JpYmVyJywge1xuICAgIHN1YnNjcmliZUFmdGVyOiAocHVibGlzaENvdW50KSA9PiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG4gICAgZ2V0VXBkYXRlU2luY2U6ICh1cGRhdGVDb3VudCkgPT4gc3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG4gICAgZ2V0UGF0aDogKCkgPT4gRShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuICAgIGdldFN0b3JlS2V5OiAoKSA9PiBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpLFxuICAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gdW5zZXJpYWxpemVyXG4gIH0pO1xuICByZXR1cm4gc3RvcmVzdWI7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlU3RvcmVkU3Vic2NyaWJlcihtYWtlU3RvcmVkU3Vic2NyaWJlcik7XG5jb25zdCBtYWtlU3RvcmVkU3Vic2NyaXB0aW9uID0gKFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyID0gbWFrZU1hcnNoYWwodW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcbiAgbWFyc2hhbFNhdmVFcnJvcjogKCkgPT4ge30sXG4gIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnXG59KSkgPT5cbntcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHVuc2VyaWFsaXplciA9IEZhcigndW5zZXJpYWxpemVyJywge1xuICAgIGZyb21DYXBEYXRhOiAoZGF0YSkgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgICB1bnNlcmlhbGl6ZTogKGRhdGEpID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSlcbiAgfSk7XG5cbiAgLy9cbiAgbGV0IHB1Ymxpc2hGYWlsZWQgPSBmYWxzZTtcbiAgbGV0IHB1Ymxpc2hFeGNlcHRpb247XG5cbiAgY29uc3QgZmFpbCA9IChlcnIpID0+IHtcbiAgICBwdWJsaXNoRmFpbGVkID0gdHJ1ZTtcbiAgICBwdWJsaXNoRXhjZXB0aW9uID0gZXJyO1xuICB9O1xuXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHB1Ymxpc2hWYWx1ZSA9IChvYmopID0+IHtcbiAgICBhc3NlcnQoc3RvcmFnZU5vZGUpO1xuICAgIGlmIChwdWJsaXNoRmFpbGVkKSB7XG4gICAgICAvL1xuICAgICAgdGhyb3cgcHVibGlzaEV4Y2VwdGlvbjtcbiAgICB9XG5cbiAgICAvL1xuICAgIEUobWFyc2hhbGxlcikuXG4gICAgdG9DYXBEYXRhKG9iaikuXG4gICAgdGhlbigoc2VyaWFsaXplZCkgPT4ge1xuICAgICAgY29uc3QgZW5jb2RlZCA9IEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xuICAgICAgcmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuICAgIH0pLlxuICAgIGNhdGNoKGZhaWwpO1xuICB9O1xuXG4gIGlmIChzdG9yYWdlTm9kZSkge1xuICAgIC8vXG4gICAgb2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpcHRpb24sIHtcbiAgICAgIHVwZGF0ZVN0YXRlOiBwdWJsaXNoVmFsdWUsXG4gICAgICBmaW5pc2g6IHB1Ymxpc2hWYWx1ZVxuICAgIH0pLmNhdGNoKGZhaWwpO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0b3Jlc3ViID0gRmFyKCdTdG9yZWRTdWJzY3JpcHRpb24nLCB7XG4gICAgLy9cbiAgICBnZXRTdG9yZUtleTogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzdG9yYWdlTm9kZSkge1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgc3Vic2NyaXB0aW9uIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RvcmVLZXkgPSBhd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IC4uLnN0b3JlS2V5LCBzdWJzY3JpcHRpb24gfSk7XG4gICAgfSxcbiAgICBnZXRVbnNlcmlhbGl6ZXI6ICgpID0+IHVuc2VyaWFsaXplcixcbiAgICBnZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczogKCkgPT5cbiAgICBzdWJzY3JpcHRpb24uZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzdWJzY3JpcHRpb25bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCksXG4gICAgc3Vic2NyaWJlQWZ0ZXI6IChwdWJsaXNoQ291bnQpID0+IHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpXG4gIH0pO1xuICByZXR1cm4gc3RvcmVzdWI7XG59OyRozY9fb25jZS5tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQgPSAoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIsIGNoaWxkUGF0aCkgPT4ge1xuICBjb25zdCB7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfSA9IG1ha2VTdWJzY3JpcHRpb25LaXQoKTtcblxuICBpZiAoc3RvcmFnZU5vZGUgJiYgY2hpbGRQYXRoKSB7XG4gICAgc3RvcmFnZU5vZGUgPSBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkUGF0aCk7XG4gIH1cblxuICAvL1xuICBjb25zdCBzdWJzY3JpYmVyID0gbWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbiAgICBzdWJzY3JpcHRpb24sXG4gICAgc3RvcmFnZU5vZGUsXG4gICAgbWFyc2hhbGxlclxuICApO1xuXG4gIHJldHVybiB7XG4gICAgcHVibGlzaGVyOiBwdWJsaWNhdGlvbixcbiAgICBzdWJzY3JpYmVyXG4gIH07XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQobWFrZVN0b3JlZFB1Ymxpc2hlcktpdCk7XG5jb25zdCBtYWtlU3RvcmVkUHVibGlzaEtpdCA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICByZXR1cm4ge1xuICAgIHB1Ymxpc2hlcixcbiAgICAvL1xuICAgIHN1YnNjcmliZXI6IG1ha2VTdG9yZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKVxuICB9O1xufTskaM2PX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hLaXQobWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCI6WyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiXSwibWFrZVN0b3JlZFN1YnNjcmliZXIiOlsibWFrZVN0b3JlZFN1YnNjcmliZXIiXSwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiI6WyJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCJdLCJtYWtlU3RvcmVkUHVibGlzaEtpdCI6WyJtYWtlU3RvcmVkUHVibGlzaEtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACRfA0UDxYAAA8WAAAoAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiXSwiZXhwb3J0cyI6WyJzdWJzY3JpYmUiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxGYWlsLGFubm90YXRlRXJyb3IsRSxGYXIsaXNPYmplY3QsaXNVcGdyYWRlRGlzY29ubmVjdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzT2JqZWN0XCIsWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qc1wiLCBbW1wiaXNVcGdyYWRlRGlzY29ubmVjdGlvblwiLFskaM2PX2EgPT4gKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCBzaW5rID0gKCkgPT4ge307XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmVjb25uZWN0QXNOZWVkZWQgPSBhc3luYyAoZ2V0dGVyLCBzZWVkID0gW10pID0+IHtcbiAgbGV0IGRpc2Nvbm5lY3Rpb247XG4gIGxldCBsYXN0VmVyc2lvbiA9IC1JbmZpbml0eTtcbiAgLy9cbiAgYXdhaXQgbnVsbDtcbiAgZm9yIChsZXQgaSA9IDA7OyBpICs9IDEpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0UCA9IGkgPCBzZWVkLmxlbmd0aCA/IHNlZWRbaV0gOiBnZXR0ZXIoKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3VsdFA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24oZXJyKSkge1xuICAgICAgICBpZiAoIWRpc2Nvbm5lY3Rpb24pIHtcbiAgICAgICAgICBkaXNjb25uZWN0aW9uID0gZXJyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgaW5jYXJuYXRpb25OdW1iZXI6IHZlcnNpb24gfSA9IGVycjtcbiAgICAgICAgaWYgKHZlcnNpb24gPiBsYXN0VmVyc2lvbikge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGxhc3RWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKGlzT2JqZWN0KGVycikgJiYgZGlzY29ubmVjdGlvbiAmJiBkaXNjb25uZWN0aW9uICE9PSBlcnIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhbm5vdGF0ZUVycm9yKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgWGBBdHRlbXB0aW5nIHRvIHJlY292ZXIgZnJvbSBkaXNjb25uZWN0aW9uOiAke2Rpc2Nvbm5lY3Rpb259YFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcblxuXG4gICAgICAgICAgLy9cbiAgICAgICAgfX10aHJvdyBlcnI7XG4gICAgfVxuICB9XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IHN1YnNjcmliZSA9IChpdFApID0+XG5GYXIoJ0FzeW5jSXRlcmFibGUnLCB7XG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHtcbiAgICBjb25zdCBpdCA9IEUoaXRQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgICBjb25zdCBzZWxmID0gRmFyKCdBc3luY0l0ZXJhYmxlSXRlcmF0b3InLCB7XG4gICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgICAgbmV4dDogYXN5bmMgKCkgPT4gRShpdCkubmV4dCgpXG4gICAgfSk7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLnN1YnNjcmliZShzdWJzY3JpYmUpO1xuY29uc3QgbWFrZUVhY2hJdGVyYXRvciA9ICh0b3BpYywgbmV4dENlbGxQKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IHNlbGYgPSBGYXIoJ0VhY2hJdGVyYXRvcicsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgIG5leHQ6ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaGVhZDogcmVzdWx0UCxcbiAgICAgICAgcHVibGlzaENvdW50OiBwdWJsaXNoQ291bnRQLFxuICAgICAgICB0YWlsOiB0YWlsUFxuICAgICAgfSA9IEUuZ2V0KG5leHRDZWxsUCk7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgZ2V0U3VjY2Vzc29yID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwdWJsaXNoQ291bnQgPSBhd2FpdCBwdWJsaXNoQ291bnRQO1xuICAgICAgICBhc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwgJ2JpZ2ludCcpO1xuICAgICAgICBjb25zdCBzdWNjZXNzb3IgPSBhd2FpdCBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuICAgICAgICBjb25zdCBuZXdQdWJsaXNoQ291bnQgPSBzdWNjZXNzb3IucHVibGlzaENvdW50O1xuICAgICAgICBpZiAobmV3UHVibGlzaENvdW50ICE9PSBwdWJsaXNoQ291bnQgKyAxbikge1xuICAgICAgICAgIEZhaWxgZWFjaEl0ZXJhdG9yIGJyb2tlbiBieSBnYXAgZnJvbSBwdWJsaXNoQ291bnQgJHtwdWJsaXNoQ291bnR9IHRvICR7bmV3UHVibGlzaENvdW50fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NvcjtcbiAgICAgIH07XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgbmV4dENlbGxQID0gcmVjb25uZWN0QXNOZWVkZWQoZ2V0U3VjY2Vzc29yLCBbdGFpbFBdKTtcblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHZvaWQgRS53aGVuKHB1Ymxpc2hDb3VudFAsIHNpbmssIHNpbmspO1xuICAgICAgdm9pZCBFLndoZW4obmV4dENlbGxQLCBzaW5rLCBzaW5rKTtcbiAgICAgIHJldHVybiByZXN1bHRQO1xuICAgIH0sXG4gICAgZm9yazogKCkgPT4gbWFrZUVhY2hJdGVyYXRvcih0b3BpYywgbmV4dENlbGxQKVxuICB9KTtcbiAgcmV0dXJuIHNlbGY7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc3Vic2NyaWJlRWFjaCA9ICh0b3BpYykgPT4ge1xuICBjb25zdCBpdGVyYWJsZSA9IEZhcignRWFjaEl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2VsbFAgPSByZWNvbm5lY3RBc05lZWRlZCgoKSA9PiBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcigpKTtcbiAgICAgIHJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHRvcGljLCBmaXJzdENlbGxQKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gaXRlcmFibGU7XG59OyRozY9fb25jZS5zdWJzY3JpYmVFYWNoKHN1YnNjcmliZUVhY2gpO1xuaGFyZGVuKHN1YnNjcmliZUVhY2gpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgY2xvbmVMYXRlc3RJdGVyYXRvciA9ICh0b3BpYywgbG9jYWxVcGRhdGVDb3VudCwgdGVybWluYWxSZXN1bHQpID0+IHtcbiAgbGV0IG11dGV4ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLypcbiAgXG4gICAgKi9cblxuXG5cbiAgY29uc3QgbWF5YmVSZXF1ZXN0TmV4dFJlc3VsdCA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAodGVybWluYWxSZXN1bHQpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuICAgIH1cblxuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB7IHZhbHVlLCB1cGRhdGVDb3VudCB9ID0gYXdhaXQgcmVjb25uZWN0QXNOZWVkZWQoKCkgPT5cbiAgICBFKHRvcGljKS5nZXRVcGRhdGVTaW5jZShsb2NhbFVwZGF0ZUNvdW50KVxuICAgICk7XG4gICAgLy9cbiAgICBsb2NhbFVwZGF0ZUNvdW50ID0gdXBkYXRlQ291bnQ7XG5cbiAgICAvL1xuICAgIGlmICh1cGRhdGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZXJtaW5hbFJlc3VsdCA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlIH0pO1xuICAgICAgcmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pO1xuICB9O1xuXG4gIGNvbnN0IHNlbGYgPSBGYXIoJ0xhdGVzdEl0ZXJhdG9yJywge1xuICAgIGZvcms6ICgpID0+IGNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMsIGxvY2FsVXBkYXRlQ291bnQsIHRlcm1pbmFsUmVzdWx0KSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgIG5leHQ6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cblxuICAgICAgaWYgKHRlcm1pbmFsUmVzdWx0KSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IG5leHRSZXN1bHQgPSBtdXRleC50aGVuKG1heWJlUmVxdWVzdE5leHRSZXN1bHQpO1xuICAgICAgbXV0ZXggPSBuZXh0UmVzdWx0LnRoZW4oc2luaywgc2luayk7XG4gICAgICAvL1xuXG4gICAgICByZXR1cm4gbmV4dFJlc3VsdDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc2VsZjtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VMYXRlc3RJdGVyYXRvciA9ICh0b3BpYykgPT4gY2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzdWJzY3JpYmVMYXRlc3QgPSAodG9waWMpID0+IHtcbiAgY29uc3QgaXRlcmFibGUgPSBGYXIoJ0xhdGVzdEl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IG1ha2VMYXRlc3RJdGVyYXRvcih0b3BpYylcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZTtcbn07JGjNj19vbmNlLnN1YnNjcmliZUxhdGVzdChzdWJzY3JpYmVMYXRlc3QpO1xuaGFyZGVuKHN1YnNjcmliZUxhdGVzdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdWJzY3JpYmUiOlsic3Vic2NyaWJlIl0sInN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJk8xWBFCAAARQgAACkAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlci5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N1YnNjcmliZS5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3RvcGljLmpzIl0sImV4cG9ydHMiOlsibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixzdWJzY3JpYmVFYWNoLG1ha2VQdWJsaXNoS2l0LG1ha2VQaW5uZWRIaXN0b3J5VG9waWM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRozY9fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3RvcGljLmpzXCIsIFtbXCJtYWtlUGlubmVkSGlzdG9yeVRvcGljXCIsWyRozY9fYSA9PiAobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbiA9ICh0b3BpYykgPT4ge1xuICBjb25zdCBzdWJzY3JpcHRpb24gPSBGYXIoJ1N1YnNjcmlwdGlvbicsIHtcbiAgICAuLi5zdWJzY3JpYmVFYWNoKHRvcGljKSxcbiAgICBzdWJzY3JpYmVBZnRlcjogYXN5bmMgKHB1Ymxpc2hDb3VudCkgPT4gRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcblxuICAgIC8qXG4gICAgICAgICAqL1xuXG5cblxuXG4gICAgZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6IGFzeW5jICgpID0+IHRvcGljLFxuXG4gICAgZ2V0U3RvcmVLZXk6ICgpID0+IGhhcmRlbih7IHN1YnNjcmlwdGlvbiB9KVxuICB9KTtcbiAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbn07JGjNj19vbmNlLm1ha2VTdWJzY3JpcHRpb24obWFrZVN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbik7XG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0ID0gKCkgPT4ge1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICAvL1xuICAvL1xuXG4gIGNvbnN0IHBpbm5lZEhpc3RvcnlUb3BpYyA9IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG1ha2VTdWJzY3JpcHRpb24ocGlubmVkSGlzdG9yeVRvcGljKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwdWJsaWNhdGlvbiA9IEZhcigncHVibGljYXRpb24nLCB7XG4gICAgdXBkYXRlU3RhdGU6IChub25GaW5hbFZhbHVlKSA9PiBwdWJsaXNoZXIucHVibGlzaChub25GaW5hbFZhbHVlKSxcbiAgICBmaW5pc2g6IChjb21wbGV0aW9uKSA9PiBwdWJsaXNoZXIuZmluaXNoKGNvbXBsZXRpb24pLFxuICAgIGZhaWw6IChyZWFzb24pID0+IHB1Ymxpc2hlci5mYWlsKHJlYXNvbilcbiAgfSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfSk7XG59OyRozY9fb25jZS5tYWtlU3Vic2NyaXB0aW9uS2l0KG1ha2VTdWJzY3JpcHRpb25LaXQpO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb25LaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACCEXcGRgQAAEYEAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3RvcGljLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUGlubmVkSGlzdG9yeVRvcGljID0gKHRvcGljKSA9PiB7XG4gIC8vXG5cbiAgLy9cbiAgY29uc3QgcGlubmVkUHViTGlzdCA9IHRvcGljLnN1YnNjcmliZUFmdGVyKCk7XG5cbiAgcmV0dXJuIEZhcignUGlubmVkSGlzdG9yeVRvcGljJywge1xuICAgIHN1YnNjcmliZUFmdGVyOiBhc3luYyAocHVibGlzaENvdW50ID0gLTFuKSA9PiB7XG4gICAgICBpZiAocHVibGlzaENvdW50ID09PSAtMW4pIHtcbiAgICAgICAgcmV0dXJuIHBpbm5lZFB1Ykxpc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gdG9waWMuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbiAgICB9LFxuICAgIGdldFVwZGF0ZVNpbmNlOiBhc3luYyAodXBkYXRlQ291bnQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdG9waWMuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpO1xuICAgIH1cbiAgfSk7XG59OyRozY9fb25jZS5tYWtlUGlubmVkSGlzdG9yeVRvcGljKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xuaGFyZGVuKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXb30c/8GAAD/BgAALQAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VGYWtlTWFyc2hhbGxlciIsIm1ha2VGYWtlU3RvcmFnZSIsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzXCIsIFtdXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5jb25zdCBtYWtlRmFrZVN0b3JhZ2UgPSAocGF0aCwgcHVibGljYXRpb24pID0+IHtcbiAgbGV0IHNldFZhbHVlQ2FsbHMgPSAwO1xuICBjb25zdCBmdWxsUGF0aCA9IGBwdWJsaXNoLiR7cGF0aH1gO1xuICBjb25zdCBzdG9yZUtleSA9IGhhcmRlbih7XG4gICAgc3RvcmVOYW1lOiAnc3dpbmdzZXQnLFxuICAgIHN0b3JlU3Via2V5OiBgc3dpbmdzZXQvZGF0YToke2Z1bGxQYXRofWAsXG4gICAgZGF0YVByZWZpeEJ5dGVzOiAnJ1xuICB9KTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdG9yYWdlID0gRmFyKCdTdG9yYWdlTm9kZScsIHtcbiAgICBnZXRQYXRoOiAoKSA9PiBwYXRoLFxuICAgIGdldFN0b3JlS2V5OiBhc3luYyAoKSA9PiBzdG9yZUtleSxcbiAgICBzZXRWYWx1ZTogYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICBzZXRWYWx1ZUNhbGxzICs9IDE7XG4gICAgICBhc3NlcnQudHlwZW9mKHZhbHVlLCAnc3RyaW5nJyk7XG4gICAgICBpZiAocHVibGljYXRpb24pIHtcbiAgICAgICAgcHVibGljYXRpb24udXBkYXRlU3RhdGUodmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbWFrZUNoaWxkTm9kZTogKCkgPT4gc3RvcmFnZSxcbiAgICBjb3VudFNldFZhbHVlQ2FsbHM6ICgpID0+IHNldFZhbHVlQ2FsbHNcbiAgfSk7XG4gIHJldHVybiBzdG9yYWdlO1xufTskaM2PX29uY2UubWFrZUZha2VTdG9yYWdlKG1ha2VGYWtlU3RvcmFnZSk7XG5oYXJkZW4obWFrZUZha2VTdG9yYWdlKTtcblxuY29uc3QgbWFrZUZha2VNYXJzaGFsbGVyID0gKCkgPT5cbm1ha2VNYXJzaGFsKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG4gIG1hcnNoYWxTYXZlRXJyb3I6ICgpID0+IHt9XG59KTskaM2PX29uY2UubWFrZUZha2VNYXJzaGFsbGVyKG1ha2VGYWtlTWFyc2hhbGxlcik7XG5oYXJkZW4obWFrZUZha2VNYXJzaGFsbGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanMiOltbImV2ZW50TG9vcEl0ZXJhdGlvbiIsImV2ZW50TG9vcEl0ZXJhdGlvbiJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRmFrZVN0b3JhZ2UiOlsibWFrZUZha2VTdG9yYWdlIl0sIm1ha2VGYWtlTWFyc2hhbGxlciI6WyJtYWtlRmFrZU1hcnNoYWxsZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWdP8PJwNAACcDQAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyIsIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsIkBlbmRvL2V4byIsIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLCIuL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyIsIm11c3RNYXRjaCIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAodHlwZWxlc3NNdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qc1wiLCBbXV0sW1wiQGVuZG8vZXhvXCIsIFtdXSxbXCIuL2xlZ2FjeS9sZWdhY3lNYXAuanNcIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW11dLFtcIi4vdHlwZXMuanNcIiwgW11dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtdXN0TWF0Y2ggPSB0eXBlbGVzc011c3RNYXRjaDskaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6W1sibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6W1sibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6W1sicHJvdmlkZUxhenkiLCJwcm92aWRlTGF6eSJdXSwiQGVuZG8vcGF0dGVybnMiOltbImlzS2V5IiwiaXNLZXkiXSxbImFzc2VydEtleSIsImFzc2VydEtleSJdLFsiYXNzZXJ0U2NhbGFyS2V5IiwiYXNzZXJ0U2NhbGFyS2V5Il0sWyJtYWtlQ29weVNldCIsIm1ha2VDb3B5U2V0Il0sWyJnZXRDb3B5U2V0S2V5cyIsImdldENvcHlTZXRLZXlzIl0sWyJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnIl0sWyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sWyJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlCYWdFbnRyaWVzIl0sWyJtYWtlQ29weU1hcCIsIm1ha2VDb3B5TWFwIl0sWyJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIl0sWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdLFsiY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIl0sWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdLFsiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldENvbXBhcmUiLCJzZXRDb21wYXJlIl0sWyJzZXRVbmlvbiIsInNldFVuaW9uIl0sWyJzZXREaXNqb2ludFVuaW9uIiwic2V0RGlzam9pbnRVbmlvbiJdLFsic2V0SW50ZXJzZWN0aW9uIiwic2V0SW50ZXJzZWN0aW9uIl0sWyJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRTdWJ0cmFjdCJdLFsiYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il0sWyJNIiwiTSJdLFsiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIl0sWyJpc1BhdHRlcm4iLCJpc1BhdHRlcm4iXSxbImFzc2VydFBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIl0sWyJtYXRjaGVzIiwibWF0Y2hlcyJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il0sWyJpc0NvcHlNYXAiLCJpc0NvcHlNYXAiXV0sIkBlbmRvL2V4byI6W1siaW5pdEVtcHR5IiwiaW5pdEVtcHR5Il0sWyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIl0sWyJkZWZpbmVFeG9DbGFzc0tpdCIsImRlZmluZUV4b0NsYXNzS2l0Il0sWyJtYWtlRXhvIiwibWFrZUV4byJdXSwiLi9sZWdhY3kvbGVnYWN5TWFwLmpzIjpbWyJtYWtlTGVnYWN5TWFwIiwibWFrZUxlZ2FjeU1hcCJdXSwiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6W1sibWFrZUxlZ2FjeVdlYWtNYXAiLCJtYWtlTGVnYWN5V2Vha01hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFH982n4BQAA+AUAACwAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUxlZ2FjeU1hcCA9ICh0YWcgPSAna2V5JykgPT4ge1xuICBjb25zdCBtID0gbmV3IE1hcCgpO1xuICBjb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3QgPSAoa2V5KSA9PlxuICAhbS5oYXMoa2V5KSB8fCBGYWlsYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IChrZXkpID0+XG4gIG0uaGFzKGtleSkgfHwgRmFpbGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IChrZXkpID0+IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBtLmhhcyhrZXkpO1xuICAgIH0sXG4gICAgaW5pdDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuICAgICAgbS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBnZXQ6IChrZXkpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgcmV0dXJuIG0uZ2V0KGtleSk7XG4gICAgfSxcbiAgICBzZXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIG0uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiAoa2V5KSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIG0uZGVsZXRlKGtleSk7XG4gICAgfSxcbiAgICBrZXlzOiAoKSA9PiBtLmtleXMoKSxcbiAgICB2YWx1ZXM6ICgpID0+IG0udmFsdWVzKCksXG4gICAgZW50cmllczogKCkgPT4gbS5lbnRyaWVzKCksXG4gICAgZ2V0U2l6ZTogKCkgPT4gbS5zaXplLFxuICAgIGNsZWFyOiAoKSA9PiBtLmNsZWFyKClcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlTGVnYWN5TWFwKG1ha2VMZWdhY3lNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAErx2U2fBQAAnwUAADAAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUxlZ2FjeVdlYWtNYXAgPSAodGFnID0gJ2tleScpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB3bSA9IG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdCA9IChrZXkpID0+XG4gICF3bS5oYXMoa2V5KSB8fCBGYWlsYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IChrZXkpID0+XG4gIHdtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiAoa2V5KSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gd20uaGFzKGtleSk7XG4gICAgfSxcbiAgICBpbml0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG4gICAgICB3bS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBnZXQ6IChrZXkpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiAvKiAgICAgICAgICAgICovKHdtLmdldChrZXkpKTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgd20uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiAoa2V5KSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIHdtLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfSk7XG59OyRozY9fb25jZS5tYWtlTGVnYWN5V2Vha01hcChtYWtlTGVnYWN5V2Vha01hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeVdlYWtNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeVdlYWtNYXAiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8HAajLgSAAC4EgAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyIsIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhcixhc3NlcnRQYXNzYWJsZSxmaWx0ZXJJdGVyYWJsZSxtYXBJdGVyYWJsZSxjb21wYXJlUmFuayxhc3NlcnRTY2FsYXJLZXksbWFrZUNvcHlNYXAsbWF0Y2hlcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyxtYWtlQ3VycmVudEtleXNLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIixbJGjNj19hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRozY9fYSldXSxbXCJtYXBJdGVyYWJsZVwiLFskaM2PX2EgPT4gKG1hcEl0ZXJhYmxlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiY29tcGFyZVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlUmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJhc3NlcnRTY2FsYXJLZXlcIixbJGjNj19hID0+IChhc3NlcnRTY2FsYXJLZXkgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlNYXBcIixbJGjNj19hID0+IChtYWtlQ29weU1hcCA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHNcIixbJGjNj19hID0+IChtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyA9ICRozY9fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLFskaM2PX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZU1hcFN0b3JlTWV0aG9kcyA9IChcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSA9IHVuZGVmaW5lZCxcbnRhZyA9ICdrZXknKSA9Plxue1xuICBjb25zdCB7IGFzc2VydFVwZGF0ZU9uQWRkLCBhc3NlcnRVcGRhdGVPbkRlbGV0ZSwgaXRlcmFibGVLZXlzIH0gPVxuICBtYWtlQ3VycmVudEtleXNLaXQoXG4gICAgKCkgPT4ganNtYXAua2V5cygpLFxuICAgIChrKSA9PiBqc21hcC5oYXMoayksXG4gICAgY29tcGFyZVJhbmssXG4gICAgYXNzZXJ0S1ZPa1RvQWRkLFxuICAgIGFzc2VydEtleU9rVG9EZWxldGUsXG4gICAgdGFnXG4gICk7XG5cbiAgLypcbiAgXG4gICAqL1xuXG5cbiAgY29uc3Qga2V5cyA9IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAoa2V5UGF0dCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlUGF0dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaXRlcmFibGVLZXlzO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXIgPSAoaykgPT4ge1xuICAgICAgaWYgKGtleVBhdHQgIT09IHVuZGVmaW5lZCAmJiAhbWF0Y2hlcyhrLCBrZXlQYXR0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgaWYgKHZhbHVlUGF0dCAhPT0gdW5kZWZpbmVkICYmICFtYXRjaGVzKGpzbWFwLmdldChrKSwgdmFsdWVQYXR0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsIGZpbHRlcik7XG4gIH07XG5cbiAgLypcbiAgXG4gICAqL1xuXG5cbiAgY29uc3QgdmFsdWVzID0gKGtleVBhdHQgPSB1bmRlZmluZWQsIHZhbHVlUGF0dCA9IHVuZGVmaW5lZCkgPT5cbiAgbWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LCB2YWx1ZVBhdHQpLCAoaykgPT4gLyogICAgICAgICAgICAqLyhqc21hcC5nZXQoaykpKTtcblxuICAvKlxuICBcbiAgICovXG5cblxuICBjb25zdCBlbnRyaWVzID0gKGtleVBhdHQgPSB1bmRlZmluZWQsIHZhbHVlUGF0dCA9IHVuZGVmaW5lZCkgPT5cbiAgbWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LCB2YWx1ZVBhdHQpLCAoaykgPT4gW1xuICBrLFxuICAvKiAgICAgICAgICAgICovKGpzbWFwLmdldChrKSldXG4gICk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG4gICAgICBqc21hcCxcbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovKGFzc2VydFVwZGF0ZU9uQWRkKSxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIGFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuICAgICAgdGFnXG4gICAgKSxcbiAgICBrZXlzLFxuICAgIHZhbHVlcyxcbiAgICBlbnRyaWVzLFxuXG4gICAgc25hcHNob3Q6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgbWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LCB2YWx1ZVBhdHQpKSxcblxuICAgIGdldFNpemU6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAga2V5UGF0dCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlUGF0dCA9PT0gdW5kZWZpbmVkID9cbiAgICBqc21hcC5zaXplIDpcbiAgICBbLi4ua2V5cyhrZXlQYXR0LCB2YWx1ZVBhdHQpXS5sZW5ndGgsXG5cbiAgICBjbGVhcjogKGtleVBhdHQgPSB1bmRlZmluZWQsIHZhbHVlUGF0dCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGtleVBhdHQgPT09IHVuZGVmaW5lZCAmJiB2YWx1ZVBhdHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBqc21hcC5jbGVhcigpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0LCB2YWx1ZVBhdHQpKSB7XG4gICAgICAgIGpzbWFwLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZU1hcFN0b3JlTWV0aG9kcyhtYWtlTWFwU3RvcmVNZXRob2RzKTtcbmNvbnN0IG1ha2VTY2FsYXJNYXBTdG9yZSA9IChcbnRhZyA9ICdrZXknLFxueyBrZXlTaGFwZSA9IHVuZGVmaW5lZCwgdmFsdWVTaGFwZSA9IHVuZGVmaW5lZCB9ID0ge30pID0+XG57XG4gIGNvbnN0IGpzbWFwID0gbmV3IE1hcCgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG4gIGlmICh2YWx1ZVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvU2V0ID0gKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbih2YWx1ZSk7XG5cbiAgICBhc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKHZhbHVlLCB2YWx1ZVNoYXBlLCAnbWFwU3RvcmUgdmFsdWUnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvQWRkID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgaGFyZGVuKGtleSk7XG5cbiAgICBhc3NlcnRTY2FsYXJLZXkoa2V5KTtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICdtYXBTdG9yZSBrZXknKTtcbiAgICB9XG4gICAgYXNzZXJ0S1ZPa1RvU2V0KGtleSwgdmFsdWUpO1xuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBNYXBTdG9yZSBvZiAke3EodGFnKX1gLCB7XG4gICAgLi4ubWFrZU1hcFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzbWFwLFxuICAgICAgYXNzZXJ0S1ZPa1RvQWRkLFxuICAgICAgYXNzZXJ0S1ZPa1RvU2V0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGFnXG4gICAgKVxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJNYXBTdG9yZShtYWtlU2NhbGFyTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAnfMYU1wwAANcMAAAxAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIixbJGjNj19hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsWyRozY9fYSA9PiAobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIixbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZVNldFN0b3JlTWV0aG9kcyA9IChcbmpzc2V0LFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUgPSB1bmRlZmluZWQsXG5rZXlOYW1lID0gJ2tleScpID0+XG57XG4gIGNvbnN0IHsgYXNzZXJ0VXBkYXRlT25BZGQsIGFzc2VydFVwZGF0ZU9uRGVsZXRlLCBpdGVyYWJsZUtleXMgfSA9XG4gIG1ha2VDdXJyZW50S2V5c0tpdChcbiAgICAoKSA9PiBqc3NldC5rZXlzKCksXG4gICAgKGspID0+IGpzc2V0LmhhcyhrKSxcbiAgICBjb21wYXJlUmFuayxcbiAgICBhc3NlcnRLZXlPa1RvQWRkLFxuICAgIGFzc2VydEtleU9rVG9EZWxldGUsXG4gICAga2V5TmFtZVxuICApO1xuXG4gIC8qXG4gICAgICovXG5cblxuICBjb25zdCBrZXlzID0gKGtleVBhdHQgPSB1bmRlZmluZWQpID0+XG4gIGtleVBhdHQgPT09IHVuZGVmaW5lZCA/XG4gIGl0ZXJhYmxlS2V5cyA6XG4gIGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cywgKGspID0+IG1hdGNoZXMoaywga2V5UGF0dCkpO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIC4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKFxuICAgICAganNzZXQsXG4gICAgICBhc3NlcnRVcGRhdGVPbkFkZCxcbiAgICAgIGFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuICAgICAga2V5TmFtZVxuICAgICksXG5cbiAgICBrZXlzLFxuXG4gICAgdmFsdWVzOiBrZXlzLFxuXG4gICAgc25hcHNob3Q6IChrZXlQYXR0ID0gdW5kZWZpbmVkKSA9PiBtYWtlQ29weVNldChrZXlzKGtleVBhdHQpKSxcblxuICAgIGdldFNpemU6IChrZXlQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgIGtleVBhdHQgPT09IHVuZGVmaW5lZCA/IGpzc2V0LnNpemUgOiBbLi4ua2V5cyhrZXlQYXR0KV0ubGVuZ3RoLFxuXG4gICAgY2xlYXI6IChrZXlQYXR0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoa2V5UGF0dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGpzc2V0LmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQpKSB7XG4gICAgICAgIGpzc2V0LmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlU2V0U3RvcmVNZXRob2RzKG1ha2VTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgbWFrZVNjYWxhclNldFN0b3JlID0gKFxudGFnID0gJ2tleScsXG57IGtleVNoYXBlID0gdW5kZWZpbmVkIH0gPSB7fSkgPT5cbntcbiAgY29uc3QganNzZXQgPSBuZXcgU2V0KCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLZXlPa1RvQWRkID0gKGtleSkgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBoYXJkZW4oa2V5KTtcblxuICAgIGFzc2VydFNjYWxhcktleShrZXkpO1xuICAgIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2goa2V5LCBrZXlTaGFwZSwgJ3NldFN0b3JlIGtleScpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gRmFyKGBzY2FsYXIgU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VTZXRTdG9yZU1ldGhvZHMoanNzZXQsIGFzc2VydEtleU9rVG9BZGQsIHVuZGVmaW5lZCwgdGFnKVxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABud1iIpQ8AAKUPAAA1AAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLEZhcixhc3NlcnRQYXNzYWJsZSxwYXNzU3R5bGVPZixnZXRDb3B5TWFwRW50cmllcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlNYXA7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5TWFwRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyaWVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXSxbXCJpc0NvcHlNYXBcIixbJGjNj19hID0+IChpc0NvcHlNYXAgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gKFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlID0gdW5kZWZpbmVkLFxua2V5TmFtZSA9ICdrZXknKSA9Plxue1xuICBjb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3QgPSAoa2V5KSA9PlxuICAhanNtYXAuaGFzKGtleSkgfHwgRmFpbGAke3Eoa2V5TmFtZSl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcblxuICBjb25zdCBhc3NlcnRLZXlFeGlzdHMgPSAoa2V5KSA9PlxuICBqc21hcC5oYXMoa2V5KSB8fCBGYWlsYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGhhczogKGtleSkgPT4ge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIGpzbWFwLmhhcyhrZXkpO1xuICAgIH0sXG4gICAgZ2V0OiAoa2V5KSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gLyogICAgICAgICAgICAqLyhqc21hcC5nZXQoa2V5KSk7XG4gICAgfSxcblxuICAgIGluaXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbiAgICAgIGFzc2VydEtWT2tUb0FkZChrZXksIHZhbHVlKTtcbiAgICAgIGpzbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgYXNzZXJ0S1ZPa1RvU2V0KGtleSwgdmFsdWUpO1xuICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiAoa2V5KSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIGlmIChhc3NlcnRLZXlPa1RvRGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAganNtYXAuZGVsZXRlKGtleSk7XG4gICAgfSxcblxuICAgIGFkZEFsbDogKGVudHJpZXMpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZW50cmllc1tTeW1ib2wuaXRlcmF0b3JdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4oZW50cmllcykgJiYgaXNDb3B5TWFwKGVudHJpZXMpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBlbnRyaWVzID0gZ2V0Q29weU1hcEVudHJpZXMoZW50cmllcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRmFpbGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7ZW50cmllc31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovKGVudHJpZXMpKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGFzc2VydEtWT2tUb0FkZChrZXksIHZhbHVlKTtcbiAgICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgbWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9IChcbnRhZyA9ICdrZXknLFxueyBsb25nTGl2ZWQgPSB0cnVlLCBrZXlTaGFwZSA9IHVuZGVmaW5lZCwgdmFsdWVTaGFwZSA9IHVuZGVmaW5lZCB9ID0ge30pID0+XG57XG4gIGNvbnN0IGpzbWFwID0gbmV3IChsb25nTGl2ZWQgPyBXZWFrTWFwIDogTWFwKSgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG4gIGlmICh2YWx1ZVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvU2V0ID0gKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbih2YWx1ZSk7XG5cbiAgICBhc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKHZhbHVlLCB2YWx1ZVNoYXBlLCAnd2Vha01hcFN0b3JlIHZhbHVlJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFzc2VydEtWT2tUb0FkZCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbihrZXkpO1xuICAgIHBhc3NTdHlsZU9mKGtleSkgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgRmFpbGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtNYXBTdG9yZXM6ICR7a2V5fWA7XG4gICAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChrZXksIGtleVNoYXBlLCAnd2Vha01hcFN0b3JlIGtleScpO1xuICAgIH1cbiAgICBhc3NlcnRLVk9rVG9TZXQoa2V5LCB2YWx1ZSk7XG4gIH07XG5cbiAgcmV0dXJuIEZhcihgc2NhbGFyIFdlYWtNYXBTdG9yZSBvZiAke3EodGFnKX1gLCB7XG4gICAgLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG4gICAgICBqc21hcCxcbiAgICAgIGFzc2VydEtWT2tUb0FkZCxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRhZ1xuICAgIClcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlU2NhbGFyV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP2echGyCwAAsgsAADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsRmFyLHBhc3NTdHlsZU9mLGdldENvcHlTZXRLZXlzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weVNldDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXSxbXCJpc0NvcHlTZXRcIixbJGjNj19hID0+IChpc0NvcHlTZXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gKFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSA9IHVuZGVmaW5lZCxcbmtleU5hbWUgPSAna2V5JykgPT5cbntcbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0gKGtleSkgPT5cbiAganNzZXQuaGFzKGtleSkgfHwgRmFpbGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IChrZXkpID0+IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBqc3NldC5oYXMoa2V5KTtcbiAgICB9LFxuXG4gICAgYWRkOiAoa2V5KSA9PiB7XG4gICAgICBhc3NlcnRLZXlPa1RvQWRkKGtleSk7XG4gICAgICBqc3NldC5hZGQoa2V5KTtcbiAgICB9LFxuICAgIGRlbGV0ZTogKGtleSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBpZiAoYXNzZXJ0S2V5T2tUb0RlbGV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIGpzc2V0LmRlbGV0ZShrZXkpO1xuICAgIH0sXG5cbiAgICBhZGRBbGw6IChrZXlzKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGtleXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGtleXMpICYmIGlzQ29weVNldChrZXlzKSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAga2V5cyA9IGdldENvcHlTZXRLZXlzKGtleXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEZhaWxgcHJvdmlkZWQgZGF0YSBzb3VyY2UgaXMgbm90IGl0ZXJhYmxlOiAke2tleXN9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgLyogICAgICAgICAgICAgICAgICAgICAgKi8oa2V5cykpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuICAgICAgICBqc3NldC5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyk7XG5jb25zdCBtYWtlU2NhbGFyV2Vha1NldFN0b3JlID0gKFxudGFnID0gJ2tleScsXG57IGxvbmdMaXZlZCA9IHRydWUsIGtleVNoYXBlID0gdW5kZWZpbmVkIH0gPSB7fSkgPT5cbntcbiAgY29uc3QganNzZXQgPSBuZXcgKGxvbmdMaXZlZCA/IFdlYWtTZXQgOiBTZXQpKCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLZXlPa1RvQWRkID0gKGtleSkgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBoYXJkZW4oa2V5KTtcbiAgICBwYXNzU3R5bGVPZihrZXkpID09PSAncmVtb3RhYmxlJyB8fFxuICAgIEZhaWxgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrU3RvcmVzOiAke2tleX1gO1xuICAgIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2goa2V5LCBrZXlTaGFwZSwgJ3dlYWtTZXRTdG9yZSBrZXknKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEZhcihgc2NhbGFyIFdlYWtTZXRTdG9yZSBvZiAke3EodGFnKX1gLCB7XG4gICAgLi4ubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMoanNzZXQsIGFzc2VydEtleU9rVG9BZGQsIHVuZGVmaW5lZCwgdGFnKVxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUobWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARzCUkWsQAABrEAAALgAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiYXBwZW5kVG9TdG9yZWRBcnJheSIsImlzQ29weU1hcCIsImlzQ29weVNldCIsIm1ha2VBdG9taWNQcm92aWRlciIsIm1ha2VDdXJyZW50S2V5c0tpdCIsInByb3ZpZGVMYXp5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEZhcixpc0NvcHlNYXAsaXNDb3B5U2V0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJpc0NvcHlNYXBcIixbJGjNj19hID0+IChpc0NvcHlNYXAgPSAkaM2PX2EpLCRozY9fbGl2ZVtcImlzQ29weU1hcFwiXV1dLFtcImlzQ29weVNldFwiLFskaM2PX2EgPT4gKGlzQ29weVNldCA9ICRozY9fYSksJGjNj19saXZlW1wiaXNDb3B5U2V0XCJdXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlQ3VycmVudEtleXNLaXQgPSAoXG5nZXRSYXdLZXlzLFxuY2hlY2tIYXMsXG5jb21wYXJlLFxuYXNzZXJ0T2tUb0FkZCxcbmFzc2VydE9rVG9EZWxldGUgPSB1bmRlZmluZWQsXG5rZXlOYW1lID0gJ2tleScpID0+XG57XG4gIGxldCB1cGRhdGVDb3VudCA9IDA7XG4gIGxldCBzb3J0ZWRLZXlzTWVtbztcblxuICBjb25zdCBhc3NlcnRVcGRhdGVPbkFkZCA9IChrLCB2ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgYXNzZXJ0T2tUb0FkZChrLCB2KTtcbiAgICB1cGRhdGVDb3VudCArPSAxO1xuICAgIHNvcnRlZEtleXNNZW1vID0gdW5kZWZpbmVkO1xuICB9O1xuXG4gIGNvbnN0IGFzc2VydFVwZGF0ZU9uRGVsZXRlID0gKGspID0+IGFzc2VydE9rVG9EZWxldGUgJiYgYXNzZXJ0T2tUb0RlbGV0ZShrKTtcblxuICBjb25zdCBnZXRTb3J0ZWRLZXlzID0gKCkgPT4ge1xuICAgIGlmIChzb3J0ZWRLZXlzTWVtbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzb3J0ZWRLZXlzTWVtbyA9IGhhcmRlbihbLi4uZ2V0UmF3S2V5cygpXS5zb3J0KGNvbXBhcmUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvcnRlZEtleXNNZW1vO1xuICB9O1xuXG4gIGNvbnN0IGl0ZXJhYmxlS2V5cyA9IEZhcignSXRlcmFibGUgb2Yga2V5cycsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9IHVwZGF0ZUNvdW50O1xuICAgICAgZ2V0U29ydGVkS2V5cygpO1xuICAgICAgY29uc3QgbGVuID0gc29ydGVkS2V5c01lbW8ubGVuZ3RoO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgcmV0dXJuIEZhcignSXRlcmF0b3Igb2Yga2V5cycsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGdlbmVyYXRpb24gPT09IHVwZGF0ZUNvdW50IHx8IEZhaWxgU3RvcmUgJHtxKGtleU5hbWUpfSBjdXJzb3Igc3RhbGVgO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNvcnRlZEtleXNNZW1vW2ldO1xuICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgIGlmIChjaGVja0hhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgYXNzZXJ0VXBkYXRlT25BZGQsXG4gICAgYXNzZXJ0VXBkYXRlT25EZWxldGUsXG4gICAgaXRlcmFibGVLZXlzXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUN1cnJlbnRLZXlzS2l0KG1ha2VDdXJyZW50S2V5c0tpdCk7XG5oYXJkZW4obWFrZUN1cnJlbnRLZXlzS2l0KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBwcm92aWRlTGF6eSA9IChtYXBTdG9yZSwga2V5LCBtYWtlVmFsdWUpID0+IHtcbiAgaWYgKCFtYXBTdG9yZS5oYXMoa2V5KSkge1xuICAgIG1hcFN0b3JlLmluaXQoa2V5LCBtYWtlVmFsdWUoa2V5KSk7XG4gIH1cbiAgcmV0dXJuIG1hcFN0b3JlLmdldChrZXkpO1xufTskaM2PX29uY2UucHJvdmlkZUxhenkocHJvdmlkZUxhenkpO1xuaGFyZGVuKHByb3ZpZGVMYXp5KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlQXRvbWljUHJvdmlkZXIgPSAoc3RvcmUpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHBlbmRpbmcgPSBuZXcgTWFwKCk7XG5cbiAgLypcbiAgXG4gIFxuICBcbiAgICAgKi9cblxuXG5cblxuXG5cblxuXG4gIGNvbnN0IHByb3ZpZGVBc3luYyA9IChrZXksIG1ha2VWYWx1ZSwgZmluaXNoVmFsdWUpID0+IHtcbiAgICBpZiAoc3RvcmUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3RvcmUuZ2V0KGtleSkpO1xuICAgIH1cbiAgICBpZiAoIXBlbmRpbmcuaGFzKGtleSkpIHtcbiAgICAgIGNvbnN0IHZhbFAgPSBtYWtlVmFsdWUoa2V5KS5cbiAgICAgIHRoZW4oKHYpID0+IHtcbiAgICAgICAgc3RvcmUuaW5pdChrZXksIHYpO1xuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0pLlxuICAgICAgdGhlbigodikgPT4ge1xuICAgICAgICBpZiAoZmluaXNoVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gZmluaXNoVmFsdWUoa2V5LCB2KS50aGVuKCgpID0+IHYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2O1xuICAgICAgfSkuXG4gICAgICBmaW5hbGx5KCgpID0+IHtcbiAgICAgICAgcGVuZGluZy5kZWxldGUoa2V5KTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZy5zZXQoa2V5LCB2YWxQKTtcbiAgICB9XG4gICAgY29uc3QgdmFsUCA9IHBlbmRpbmcuZ2V0KGtleSk7XG4gICAgYXNzZXJ0KHZhbFApO1xuICAgIHJldHVybiB2YWxQO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyBwcm92aWRlQXN5bmMgfSk7XG59OyRozY9fb25jZS5tYWtlQXRvbWljUHJvdmlkZXIobWFrZUF0b21pY1Byb3ZpZGVyKTtcbmhhcmRlbihtYWtlQXRvbWljUHJvdmlkZXIpO1xuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgYXBwZW5kVG9TdG9yZWRBcnJheSA9IChtYXBTdG9yZSwga2V5LCBpdGVtKSA9PiB7XG4gIGlmIChtYXBTdG9yZS5oYXMoa2V5KSkge1xuICAgIGNvbnN0IGV4dGFudCA9IG1hcFN0b3JlLmdldChrZXkpO1xuICAgIG1hcFN0b3JlLnNldChrZXksIGhhcmRlbihbLi4uZXh0YW50LCBpdGVtXSkpO1xuICB9IGVsc2Uge1xuICAgIG1hcFN0b3JlLmluaXQoa2V5LCBoYXJkZW4oW2l0ZW1dKSk7XG4gIH1cbn07JGjNj19vbmNlLmFwcGVuZFRvU3RvcmVkQXJyYXkoYXBwZW5kVG9TdG9yZWRBcnJheSk7XG5oYXJkZW4oYXBwZW5kVG9TdG9yZWRBcnJheSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIixmYWxzZV0sImlzQ29weVNldCI6WyJpc0NvcHlTZXQiLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQ3VycmVudEtleXNLaXQiOlsibWFrZUN1cnJlbnRLZXlzS2l0Il0sInByb3ZpZGVMYXp5IjpbInByb3ZpZGVMYXp5Il0sIm1ha2VBdG9taWNQcm92aWRlciI6WyJtYWtlQXRvbWljUHJvdmlkZXIiXSwiYXBwZW5kVG9TdG9yZWRBcnJheSI6WyJhcHBlbmRUb1N0b3JlZEFycmF5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7fWYmzACAAAwAgAAHAAAAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy90aW1lTWF0aC5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy90aW1lTWF0aC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMtaW5kZXguanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADt7QjLEVAACxFQAAIwAAAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3RpbWVNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJUaW1lTWF0aCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE5hdCxGYWlsLHEsbXVzdE1hdGNoLFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLFRpbWVzdGFtcFJlY29yZFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlID0gJGjNj19hKV1dLFtcIlRpbWVzdGFtcFJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGFncmVlZFRpbWVyQnJhbmQgPSAobGVmdEJyYW5kLCByaWdodEJyYW5kKSA9PiB7XG4gIGlmIChsZWZ0QnJhbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChyaWdodEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByaWdodEJyYW5kO1xuICAgIH1cbiAgfSBlbHNlIGlmIChyaWdodEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbGVmdEJyYW5kO1xuICB9IGVsc2Uge1xuICAgIGxlZnRCcmFuZCA9PT0gcmlnaHRCcmFuZCB8fFxuICAgIEZhaWxgVGltZXJCcmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnRCcmFuZCl9IHZzICR7cShyaWdodEJyYW5kKX1gO1xuICAgIHJldHVybiBsZWZ0QnJhbmQ7XG4gIH1cbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHNoYXJlZFRpbWVyQnJhbmQgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgY29uc3QgbGVmdEJyYW5kID0gdHlwZW9mIGxlZnQgPT09ICdiaWdpbnQnID8gdW5kZWZpbmVkIDogbGVmdC50aW1lckJyYW5kO1xuICBjb25zdCByaWdodEJyYW5kID0gdHlwZW9mIHJpZ2h0ID09PSAnYmlnaW50JyA/IHVuZGVmaW5lZCA6IHJpZ2h0LnRpbWVyQnJhbmQ7XG4gIHJldHVybiBhZ3JlZWRUaW1lckJyYW5kKGxlZnRCcmFuZCwgcmlnaHRCcmFuZCk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYWJzTGlrZSA9IChsZWZ0LCByaWdodCwgYWJzVmFsdWUpID0+IHtcbiAgTmF0KGFic1ZhbHVlKTtcbiAgY29uc3QgdGltZXJCcmFuZCA9IHNoYXJlZFRpbWVyQnJhbmQobGVmdCwgcmlnaHQpO1xuICBpZiAodGltZXJCcmFuZCkge1xuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgdGltZXJCcmFuZCxcbiAgICAgIGFic1ZhbHVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGFic1ZhbHVlO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmVsTGlrZSA9IChsZWZ0LCByaWdodCwgcmVsVmFsdWUpID0+IHtcbiAgTmF0KHJlbFZhbHVlKTtcbiAgY29uc3QgdGltZXJCcmFuZCA9IHNoYXJlZFRpbWVyQnJhbmQobGVmdCwgcmlnaHQpO1xuICBpZiAodGltZXJCcmFuZCkge1xuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgdGltZXJCcmFuZCxcbiAgICAgIHJlbFZhbHVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlbFZhbHVlO1xuICB9XG59O1xuXG4vL1xuLy9cbi8vXG5cbmNvbnN0IGFic1ZhbHVlID0gKGFicykgPT4ge1xuICBpZiAodHlwZW9mIGFicyA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gTmF0KGFicyk7XG4gIH1cbiAgbXVzdE1hdGNoKGFicywgVGltZXN0YW1wUmVjb3JkU2hhcGUsICd0aW1lc3RhbXAnKTtcbiAgcmV0dXJuIE5hdChhYnMuYWJzVmFsdWUpO1xufTtcblxuY29uc3QgcmVsVmFsdWUgPSAocmVsKSA9PiB7XG4gIGlmICh0eXBlb2YgcmVsID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBOYXQocmVsKTtcbiAgfVxuICBtdXN0TWF0Y2gocmVsLCBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSwgJ3JlbGF0aXZlJyk7XG4gIHJldHVybiBOYXQocmVsLnJlbFZhbHVlKTtcbn07XG5cbmNvbnN0IG1ha2VUaW1lc3RhbXBSZWNvcmQgPSAoYWJzLCB0aW1lckJyYW5kKSA9PlxuaGFyZGVuKHsgYWJzVmFsdWU6IGFicywgdGltZXJCcmFuZCB9KTtcbmNvbnN0IG1ha2VSZWxhdGl2ZVRpbWVSZWNvcmQgPSAocmVsLCB0aW1lckJyYW5kKSA9PlxuaGFyZGVuKHsgcmVsVmFsdWU6IHJlbCwgdGltZXJCcmFuZCB9KTtcblxuY29uc3QgY29lcmNlVGltZXN0YW1wUmVjb3JkID0gKHRzLCBicmFuZCkgPT4ge1xuICBicmFuZCB8fCBGYWlsYG11c3QgaGF2ZSBhIGJyYW5kYDtcbiAgaWYgKHR5cGVvZiB0cyA9PT0gJ251bWJlcicpIHtcbiAgICB0cyA9IE5hdCh0cyk7XG4gIH1cbiAgaWYgKHR5cGVvZiB0cyA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gbWFrZVRpbWVzdGFtcFJlY29yZCh0cywgYnJhbmQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHsgdGltZXJCcmFuZCB9ID0gdHM7XG4gICAgbXVzdE1hdGNoKHRzLCBUaW1lc3RhbXBSZWNvcmRTaGFwZSwgJ3RpbWVzdGFtcCcpO1xuICAgIGFncmVlZFRpbWVyQnJhbmQodGltZXJCcmFuZCwgYnJhbmQpO1xuICAgIHJldHVybiB0cztcbiAgfVxufTtcblxuY29uc3QgY29lcmNlUmVsYXRpdmVUaW1lUmVjb3JkID0gKHJ0LCBicmFuZCkgPT4ge1xuICBicmFuZCB8fCBGYWlsYG11c3QgaGF2ZSBhIGJyYW5kYDtcbiAgaWYgKHR5cGVvZiBydCA9PT0gJ251bWJlcicpIHtcbiAgICBydCA9IE5hdChydCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBydCA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gbWFrZVJlbGF0aXZlVGltZVJlY29yZChydCwgYnJhbmQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHsgdGltZXJCcmFuZCB9ID0gcnQ7XG4gICAgbXVzdE1hdGNoKHJ0LCBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSwgJ3JlbGF0aXZlVGltZScpO1xuICAgIGFncmVlZFRpbWVyQnJhbmQodGltZXJCcmFuZCwgYnJhbmQpO1xuICAgIHJldHVybiBydDtcbiAgfVxufTtcblxuY29uc3QgYWRkQWJzUmVsID0gKGFicywgcmVsKSA9PlxuYWJzTGlrZShhYnMsIHJlbCwgYWJzVmFsdWUoYWJzKSArIHJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBhZGRSZWxSZWwgPSAocmVsMSwgcmVsMikgPT5cbnJlbExpa2UocmVsMSwgcmVsMiwgcmVsVmFsdWUocmVsMSkgKyByZWxWYWx1ZShyZWwyKSk7XG5cbmNvbnN0IHN1YnRyYWN0QWJzQWJzID0gKGFiczEsIGFiczIpID0+XG5yZWxMaWtlKGFiczEsIGFiczIsIGFic1ZhbHVlKGFiczEpIC0gYWJzVmFsdWUoYWJzMikpO1xuXG5jb25zdCBjbGFtcGVkU3VidHJhY3RBYnNBYnMgPSAoYWJzMSwgYWJzMikgPT4ge1xuICBjb25zdCB2YWwxID0gYWJzVmFsdWUoYWJzMSk7XG4gIGNvbnN0IHZhbDIgPSBhYnNWYWx1ZShhYnMyKTtcbiAgcmV0dXJuIHJlbExpa2UoYWJzMSwgYWJzMiwgdmFsMSA+IHZhbDIgPyB2YWwxIC0gdmFsMiA6IDBuKTtcbn07XG5cbmNvbnN0IHN1YnRyYWN0QWJzUmVsID0gKGFicywgcmVsKSA9PlxuYWJzTGlrZShhYnMsIHJlbCwgYWJzVmFsdWUoYWJzKSAtIHJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBzdWJ0cmFjdFJlbFJlbCA9IChyZWwxLCByZWwyKSA9PlxucmVsTGlrZShyZWwxLCByZWwyLCByZWxWYWx1ZShyZWwxKSAtIHJlbFZhbHVlKHJlbDIpKTtcblxuY29uc3QgaXNSZWxaZXJvID0gKHJlbCkgPT4gcmVsVmFsdWUocmVsKSA9PT0gMG47XG5cbmNvbnN0IG11bHRpcGx5UmVsTmF0ID0gKHJlbCwgbmF0KSA9PiByZWxMaWtlKHJlbCwgbmF0LCByZWxWYWx1ZShyZWwpICogbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsTmF0ID0gKHJlbCwgbmF0KSA9PiByZWxMaWtlKHJlbCwgbmF0LCByZWxWYWx1ZShyZWwpIC8gbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsUmVsID0gKHJlbDEsIHJlbDIpID0+IHtcbiAgc2hhcmVkVGltZXJCcmFuZChyZWwxLCByZWwyKTsgLy9cbiAgcmV0dXJuIHJlbFZhbHVlKHJlbDEpIC8gcmVsVmFsdWUocmVsMik7XG59O1xuXG5jb25zdCBtb2RBYnNSZWwgPSAoYWJzLCBzdGVwKSA9PlxucmVsTGlrZShhYnMsIHN0ZXAsIGFic1ZhbHVlKGFicykgJSByZWxWYWx1ZShzdGVwKSk7XG5cbmNvbnN0IG1vZFJlbFJlbCA9IChyZWwsIHN0ZXApID0+XG5yZWxMaWtlKHJlbCwgc3RlcCwgcmVsVmFsdWUocmVsKSAlIHJlbFZhbHVlKHN0ZXApKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGNvbXBhcmVWYWx1ZXMgPSAobGVmdCwgcmlnaHQsIHYxLCB2MikgPT4ge1xuICBzaGFyZWRUaW1lckJyYW5kKGxlZnQsIHJpZ2h0KTtcbiAgaWYgKHYxIDwgdjIpIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSBpZiAodjEgPT09IHYyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0KHYxID4gdjIpO1xuICAgIHJldHVybiAxO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgVGltZU1hdGggPSBoYXJkZW4oe1xuICBhYnNWYWx1ZSxcbiAgcmVsVmFsdWUsXG4gIGNvZXJjZVRpbWVzdGFtcFJlY29yZCxcbiAgY29lcmNlUmVsYXRpdmVUaW1lUmVjb3JkLFxuICAvL1xuICBhZGRBYnNSZWwsXG4gIC8vXG4gIGFkZFJlbFJlbCxcbiAgc3VidHJhY3RBYnNBYnMsXG4gIGNsYW1wZWRTdWJ0cmFjdEFic0FicyxcbiAgc3VidHJhY3RBYnNSZWwsXG4gIHN1YnRyYWN0UmVsUmVsLFxuICBpc1JlbFplcm8sXG4gIG11bHRpcGx5UmVsTmF0LFxuICBkaXZpZGVSZWxOYXQsXG4gIGRpdmlkZVJlbFJlbCxcbiAgbW9kQWJzUmVsLFxuICBtb2RSZWxSZWwsXG4gIGNvbXBhcmVBYnM6IChhYnMxLCBhYnMyKSA9PlxuICBjb21wYXJlVmFsdWVzKGFiczEsIGFiczIsIGFic1ZhbHVlKGFiczEpLCBhYnNWYWx1ZShhYnMyKSksXG4gIGNvbXBhcmVSZWw6IChyZWwxLCByZWwyKSA9PlxuICBjb21wYXJlVmFsdWVzKHJlbDEsIHJlbDIsIHJlbFZhbHVlKHJlbDEpLCByZWxWYWx1ZShyZWwyKSlcbn0pOyRozY9fb25jZS5UaW1lTWF0aChUaW1lTWF0aCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUaW1lTWF0aCI6WyJUaW1lTWF0aCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB6n/rIAgkAAAIJAAAlAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIiwiUmVsYXRpdmVUaW1lU2hhcGUiLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIiwiVGltZXJCcmFuZFNoYXBlIiwiVGltZXJTZXJ2aWNlU2hhcGUiLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSIsIlRpbWVzdGFtcFNoYXBlIiwiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE07JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXV0pO1xuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCBUaW1lckJyYW5kU2hhcGUgPSBNLnJlbW90YWJsZSgnVGltZXJCcmFuZCcpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5UaW1lckJyYW5kU2hhcGUoVGltZXJCcmFuZFNoYXBlKTtcbmNvbnN0IFRpbWVzdGFtcFZhbHVlU2hhcGUgPSBNLm5hdCgpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5UaW1lc3RhbXBWYWx1ZVNoYXBlKFRpbWVzdGFtcFZhbHVlU2hhcGUpO1xuY29uc3QgUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSA9IE0ubmF0KCk7IC8vXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLlJlbGF0aXZlVGltZVZhbHVlU2hhcGUoUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSk7XG5jb25zdCBUaW1lc3RhbXBSZWNvcmRTaGFwZSA9IHtcbiAgdGltZXJCcmFuZDogVGltZXJCcmFuZFNoYXBlLFxuICBhYnNWYWx1ZTogVGltZXN0YW1wVmFsdWVTaGFwZVxufTskaM2PX29uY2UuVGltZXN0YW1wUmVjb3JkU2hhcGUoVGltZXN0YW1wUmVjb3JkU2hhcGUpO1xuaGFyZGVuKFRpbWVzdGFtcFJlY29yZFNoYXBlKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IFJlbGF0aXZlVGltZVJlY29yZFNoYXBlID0ge1xuICB0aW1lckJyYW5kOiBUaW1lckJyYW5kU2hhcGUsXG4gIHJlbFZhbHVlOiBSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlXG59OyRozY9fb25jZS5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZShSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSk7XG5oYXJkZW4oUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBUaW1lc3RhbXBTaGFwZSA9IE0ub3IoVGltZXN0YW1wUmVjb3JkU2hhcGUsIFRpbWVzdGFtcFZhbHVlU2hhcGUpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLlRpbWVzdGFtcFNoYXBlKFRpbWVzdGFtcFNoYXBlKTtcbmNvbnN0IFJlbGF0aXZlVGltZVNoYXBlID0gTS5vcihcbiAgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsXG4gIFJlbGF0aXZlVGltZVZhbHVlU2hhcGVcbik7JGjNj19vbmNlLlJlbGF0aXZlVGltZVNoYXBlKFJlbGF0aXZlVGltZVNoYXBlKTtcblxuY29uc3QgVGltZXJTZXJ2aWNlU2hhcGUgPSBNLnJlbW90YWJsZSgnVGltZXJTZXJ2aWNlJyk7JGjNj19vbmNlLlRpbWVyU2VydmljZVNoYXBlKFRpbWVyU2VydmljZVNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRpbWVyQnJhbmRTaGFwZSI6WyJUaW1lckJyYW5kU2hhcGUiXSwiVGltZXN0YW1wVmFsdWVTaGFwZSI6WyJUaW1lc3RhbXBWYWx1ZVNoYXBlIl0sIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiOlsiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSJdLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSI6WyJUaW1lc3RhbXBSZWNvcmRTaGFwZSJdLCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSJdLCJUaW1lc3RhbXBTaGFwZSI6WyJUaW1lc3RhbXBTaGFwZSJdLCJSZWxhdGl2ZVRpbWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVTaGFwZSJdLCJUaW1lclNlcnZpY2VTaGFwZSI6WyJUaW1lclNlcnZpY2VTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIvYGPg8ZAAAPGQAAKAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9leG8tdXRpbHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJpZ25vcmVDb250ZXh0IiwibWFrZUV4b1V0aWxzIiwicHJlcGFyZUV4byIsInByZXBhcmVFeG9DbGFzcyIsInByZXBhcmVFeG9DbGFzc0tpdCIsInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmRNdWx0aSIsInByZXBhcmVTaW5nbGV0b24iLCJwcm92aWRlS2luZEhhbmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGluaXRFbXB0eSxwcm92aWRlLGdsb2JhbFZhdERhdGE7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIixbJGjNj19hID0+IChpbml0RW1wdHkgPSAkaM2PX2EpXV1dXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJwcm92aWRlXCIsWyRozY9fYSA9PiAocHJvdmlkZSA9ICRozY9fYSldXSxbXCJWYXREYXRhXCIsWyRozY9fYSA9PiAoZ2xvYmFsVmF0RGF0YSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLypcblxuICovXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBpZ25vcmVDb250ZXh0ID1cbihmbikgPT5cbihfY29udGV4dCwgLi4uYXJncykgPT5cbmZuKC4uLmFyZ3MpOyRozY9fb25jZS5pZ25vcmVDb250ZXh0KGlnbm9yZUNvbnRleHQpO1xuaGFyZGVuKGlnbm9yZUNvbnRleHQpO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1ha2VFeG9VdGlscyA9IChWYXREYXRhKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWZpbmVLaW5kLFxuICAgIGRlZmluZUtpbmRNdWx0aSxcbiAgICBkZWZpbmVEdXJhYmxlS2luZCxcbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpLFxuICAgIG1ha2VLaW5kSGFuZGxlXG4gIH0gPSBWYXREYXRhO1xuXG4gIC8qXG4gIFxuICAgICovXG5cblxuXG4gIGNvbnN0IHByb3ZpZGVLaW5kSGFuZGxlID0gKGJhZ2dhZ2UsIGtpbmROYW1lKSA9PlxuICBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwgKCkgPT4gbWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTtcbiAgaGFyZGVuKHByb3ZpZGVLaW5kSGFuZGxlKTtcblxuICAvKlxuICAgICAqL1xuXG5cbiAgY29uc3QgcHJlcGFyZUtpbmQgPSAoXG4gIGJhZ2dhZ2UsXG4gIGtpbmROYW1lLFxuICBpbml0LFxuICBiZWhhdmlvcixcbiAgb3B0aW9ucyA9IHVuZGVmaW5lZCkgPT5cblxuICBkZWZpbmVEdXJhYmxlS2luZChcbiAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgaW5pdCxcbiAgICBiZWhhdmlvcixcbiAgICBvcHRpb25zXG4gICk7XG4gIGhhcmRlbihwcmVwYXJlS2luZCk7XG5cbiAgLypcbiAgICAgKi9cblxuXG4gIGNvbnN0IHByZXBhcmVLaW5kTXVsdGkgPSAoXG4gIGJhZ2dhZ2UsXG4gIGtpbmROYW1lLFxuICBpbml0LFxuICBiZWhhdmlvcixcbiAgb3B0aW9ucyA9IHVuZGVmaW5lZCkgPT5cblxuICBkZWZpbmVEdXJhYmxlS2luZE11bHRpKFxuICAgIHByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2UsIGtpbmROYW1lKSxcbiAgICBpbml0LFxuICAgIGJlaGF2aW9yLFxuICAgIG9wdGlvbnNcbiAgKTtcbiAgaGFyZGVuKHByZXBhcmVLaW5kTXVsdGkpO1xuXG4gIC8qXG4gIFxuICBcbiAgXG4gIFxuICBcbiAgICovXG5cblxuXG5cblxuXG5cblxuXG5cbiAgY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzID0gKHRhZywgaW50ZXJmYWNlR3VhcmQsIGluaXQsIG1ldGhvZHMsIG9wdGlvbnMpID0+XG4gIC8vXG4gIGRlZmluZUtpbmQodGFnLCBpbml0LCBtZXRob2RzLCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICB0aGlzZnVsTWV0aG9kczogdHJ1ZSxcbiAgICBpbnRlcmZhY2VHdWFyZFxuICB9KTtcbiAgaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7XG5cbiAgLypcbiAgXG4gIFxuICBcbiAgXG4gIFxuICAgKi9cblxuXG5cblxuXG5cblxuXG5cblxuICBjb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQgPSAoXG4gIHRhZyxcbiAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gIGluaXQsXG4gIGZhY2V0cyxcbiAgb3B0aW9ucykgPT5cblxuICAvL1xuICBkZWZpbmVLaW5kTXVsdGkodGFnLCBpbml0LCBmYWNldHMsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHRoaXNmdWxNZXRob2RzOiB0cnVlLFxuICAgIGludGVyZmFjZUd1YXJkS2l0XG4gIH0pO1xuICBoYXJkZW4oZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTtcblxuICAvKlxuICBcbiAgXG4gIFxuICBcbiAgXG4gICAqL1xuXG5cblxuXG5cblxuXG5cblxuXG4gIGNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzcyA9IChcbiAga2luZEhhbmRsZSxcbiAgaW50ZXJmYWNlR3VhcmQsXG4gIGluaXQsXG4gIG1ldGhvZHMsXG4gIG9wdGlvbnMpID0+XG5cbiAgLy9cbiAgZGVmaW5lRHVyYWJsZUtpbmQoa2luZEhhbmRsZSwgaW5pdCwgbWV0aG9kcywge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgaW50ZXJmYWNlR3VhcmRcbiAgfSk7XG4gIGhhcmRlbihkZWZpbmVEdXJhYmxlRXhvQ2xhc3MpO1xuXG4gIC8qXG4gIFxuICBcbiAgXG4gIFxuICBcbiAgICovXG5cblxuXG5cblxuXG5cblxuXG5cbiAgY29uc3QgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0ID0gKFxuICBraW5kSGFuZGxlLFxuICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgaW5pdCxcbiAgZmFjZXRzLFxuICBvcHRpb25zKSA9PlxuXG4gIC8vXG4gIGRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSwgaW5pdCwgZmFjZXRzLCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICB0aGlzZnVsTWV0aG9kczogdHJ1ZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdFxuICB9KTtcbiAgaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7XG5cbiAgLypcbiAgXG4gIFxuICBcbiAgXG4gIFxuICAgICovXG5cblxuXG5cblxuXG5cblxuXG5cblxuICBjb25zdCBwcmVwYXJlRXhvQ2xhc3MgPSAoXG4gIGJhZ2dhZ2UsXG4gIGtpbmROYW1lLFxuICBpbnRlcmZhY2VHdWFyZCxcbiAgaW5pdCxcbiAgbWV0aG9kcyxcbiAgb3B0aW9ucyA9IHVuZGVmaW5lZCkgPT5cblxuICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3MoXG4gICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIGluaXQsXG4gICAgbWV0aG9kcyxcbiAgICBvcHRpb25zXG4gICk7XG4gIGhhcmRlbihwcmVwYXJlRXhvQ2xhc3MpO1xuXG4gIC8qXG4gIFxuICBcbiAgXG4gIFxuICBcbiAgICAqL1xuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgY29uc3QgcHJlcGFyZUV4b0NsYXNzS2l0ID0gKFxuICBiYWdnYWdlLFxuICBraW5kTmFtZSxcbiAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gIGluaXQsXG4gIGZhY2V0cyxcbiAgb3B0aW9ucyA9IHVuZGVmaW5lZCkgPT5cblxuICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQoXG4gICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIGluaXQsXG4gICAgZmFjZXRzLFxuICAgIG9wdGlvbnNcbiAgKTtcbiAgaGFyZGVuKHByZXBhcmVFeG9DbGFzc0tpdCk7XG5cbiAgLypcbiAgXG4gIFxuICBcbiAgICAqL1xuXG5cblxuXG5cblxuXG4gIGNvbnN0IHByZXBhcmVFeG8gPSAoXG4gIGJhZ2dhZ2UsXG4gIGtpbmROYW1lLFxuICBpbnRlcmZhY2VHdWFyZCxcbiAgbWV0aG9kcyxcbiAgb3B0aW9ucyA9IHVuZGVmaW5lZCkgPT5cbiAge1xuICAgIGNvbnN0IG1ha2VTaW5nbGV0b24gPSBwcmVwYXJlRXhvQ2xhc3MoXG4gICAgICBiYWdnYWdlLFxuICAgICAga2luZE5hbWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICAgIGluaXRFbXB0eSxcbiAgICAgIG1ldGhvZHMsXG4gICAgICBvcHRpb25zXG4gICAgKTtcblxuICAgIHJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9zaW5nbGV0b25gLCAoKSA9PiBtYWtlU2luZ2xldG9uKCkpO1xuICB9O1xuICBoYXJkZW4ocHJlcGFyZUV4byk7XG5cbiAgLypcbiAgXG4gIFxuICAgICovXG5cblxuXG5cblxuICBjb25zdCBwcmVwYXJlU2luZ2xldG9uID0gKGJhZ2dhZ2UsIGtpbmROYW1lLCBtZXRob2RzLCBvcHRpb25zID0gdW5kZWZpbmVkKSA9PlxuICBwcmVwYXJlRXhvKGJhZ2dhZ2UsIGtpbmROYW1lLCB1bmRlZmluZWQsIG1ldGhvZHMsIG9wdGlvbnMpO1xuICBoYXJkZW4ocHJlcGFyZVNpbmdsZXRvbik7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgZGVmaW5lVmlydHVhbEV4b0NsYXNzLFxuICAgIGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbiAgICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3MsXG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0LFxuICAgIHByZXBhcmVFeG9DbGFzcyxcbiAgICBwcmVwYXJlRXhvQ2xhc3NLaXQsXG4gICAgcHJlcGFyZUV4byxcblxuICAgIHByZXBhcmVTaW5nbGV0b24sXG4gICAgcHJvdmlkZUtpbmRIYW5kbGUsXG4gICAgcHJlcGFyZUtpbmQsXG4gICAgcHJlcGFyZUtpbmRNdWx0aVxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VFeG9VdGlscyhtYWtlRXhvVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxFeG9VdGlscyA9IG1ha2VFeG9VdGlscyhnbG9iYWxWYXREYXRhKTtcblxuY29uc3Qge1xuICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG4gIGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbiAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG4gIHByZXBhcmVFeG9DbGFzcyxcbiAgcHJlcGFyZUV4b0NsYXNzS2l0LFxuICBwcmVwYXJlRXhvLFxuICBwcmVwYXJlU2luZ2xldG9uXG59ID0gZ2xvYmFsRXhvVXRpbHM7XG5cbi8qXG5cbiAqLyRozY9fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MoZGVmaW5lVmlydHVhbEV4b0NsYXNzKTskaM2PX29uY2UuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzcyhkZWZpbmVEdXJhYmxlRXhvQ2xhc3MpOyRozY9fb25jZS5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQoZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KTskaM2PX29uY2UucHJlcGFyZUV4b0NsYXNzKHByZXBhcmVFeG9DbGFzcyk7JGjNj19vbmNlLnByZXBhcmVFeG9DbGFzc0tpdChwcmVwYXJlRXhvQ2xhc3NLaXQpOyRozY9fb25jZS5wcmVwYXJlRXhvKHByZXBhcmVFeG8pOyRozY9fb25jZS5wcmVwYXJlU2luZ2xldG9uKHByZXBhcmVTaW5nbGV0b24pO1xuY29uc3QgeyBwcm92aWRlS2luZEhhbmRsZSwgcHJlcGFyZUtpbmQsIHByZXBhcmVLaW5kTXVsdGkgfSA9XG5nbG9iYWxFeG9VdGlsczskaM2PX29uY2UucHJvdmlkZUtpbmRIYW5kbGUocHJvdmlkZUtpbmRIYW5kbGUpOyRozY9fb25jZS5wcmVwYXJlS2luZChwcmVwYXJlS2luZCk7JGjNj19vbmNlLnByZXBhcmVLaW5kTXVsdGkocHJlcGFyZUtpbmRNdWx0aSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZ25vcmVDb250ZXh0IjpbImlnbm9yZUNvbnRleHQiXSwibWFrZUV4b1V0aWxzIjpbIm1ha2VFeG9VdGlscyJdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG9DbGFzcyI6WyJwcmVwYXJlRXhvQ2xhc3MiXSwicHJlcGFyZUV4b0NsYXNzS2l0IjpbInByZXBhcmVFeG9DbGFzc0tpdCJdLCJwcmVwYXJlRXhvIjpbInByZXBhcmVFeG8iXSwicHJlcGFyZVNpbmdsZXRvbiI6WyJwcmVwYXJlU2luZ2xldG9uIl0sInByb3ZpZGVLaW5kSGFuZGxlIjpbInByb3ZpZGVLaW5kSGFuZGxlIl0sInByZXBhcmVLaW5kIjpbInByZXBhcmVLaW5kIl0sInByZXBhcmVLaW5kTXVsdGkiOlsicHJlcGFyZUtpbmRNdWx0aSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADPnOvptggAALYIAAAkAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiLi9leG8tdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbXV0sW1wiLi9leG8tdXRpbHMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAYWdvcmljL3N0b3JlIjpbWyJNIiwiTSJdLFsibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyI6W1sibWFrZUtpbmRIYW5kbGUiLCJtYWtlS2luZEhhbmRsZSJdLFsicHJvdmlkZVByb21pc2VXYXRjaGVyIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sWyJ3YXRjaFByb21pc2UiLCJ3YXRjaFByb21pc2UiXSxbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSxbImNhbkJlRHVyYWJsZSIsImNhbkJlRHVyYWJsZSJdLFsicGlja0ZhY2V0IiwicGlja0ZhY2V0Il0sWyJwYXJ0aWFsQXNzaWduIiwicGFydGlhbEFzc2lnbiJdLFsicHJvdmlkZSIsInByb3ZpZGUiXSxbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdLFsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSJdLFsiZGVmaW5lS2luZCIsImRlZmluZUtpbmQiXSxbImRlZmluZUtpbmRNdWx0aSIsImRlZmluZUtpbmRNdWx0aSJdLFsiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZCJdLFsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXV0sIi4vZXhvLXV0aWxzLmpzIjpbWyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSxbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLFsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG9DbGFzcyIsInByZXBhcmVFeG9DbGFzcyJdLFsicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUV4b0NsYXNzS2l0Il0sWyJwcmVwYXJlRXhvIiwicHJlcGFyZUV4byJdLFsicHJlcGFyZVNpbmdsZXRvbiIsInByZXBhcmVTaW5nbGV0b24iXSxbImlnbm9yZUNvbnRleHQiLCJpZ25vcmVDb250ZXh0Il0sWyJwcm92aWRlS2luZEhhbmRsZSIsInByb3ZpZGVLaW5kSGFuZGxlIl0sWyJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kIl0sWyJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZUtpbmRNdWx0aSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA62clrM8XAADPFwAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiVmF0RGF0YSIsImNhbkJlRHVyYWJsZSIsImRlZmluZUR1cmFibGVLaW5kIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUtpbmQiLCJkZWZpbmVLaW5kTXVsdGkiLCJtYWtlS2luZEhhbmRsZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVN0b3JlVXRpbHMiLCJwYXJ0aWFsQXNzaWduIiwicGlja0ZhY2V0IiwicHJvdmlkZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscHJvdmlkZUxhenk7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIixbJGjNj19hID0+IChwcm92aWRlTGF6eSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG5sZXQgVmF0RGF0YUdsb2JhbDtcbmlmICgnVmF0RGF0YScgaW4gZ2xvYmFsVGhpcykge1xuICBnbG9iYWxUaGlzLlZhdERhdGEgfHwgRmFpbGBWYXREYXRhIGRlZmluZWQgaW4gZ2xvYmFsIGFzIG51bGwgb3IgdW5kZWZpbmVkYDtcbiAgLy9cbiAgVmF0RGF0YUdsb2JhbCA9IC8qICAgICAgICAgICAgICAqLyhnbG9iYWxUaGlzLlZhdERhdGEpO1xufSBlbHNlIHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgdW5hdmFpbGFibGUgPSAoKSA9PiBGYWlsYFZhdERhdGEgdW5hdmFpbGFibGVgO1xuICBWYXREYXRhR2xvYmFsID0ge1xuICAgIGRlZmluZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUtpbmRNdWx0aTogdW5hdmFpbGFibGUsXG4gICAgZGVmaW5lRHVyYWJsZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGk6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VLaW5kSGFuZGxlOiB1bmF2YWlsYWJsZSxcbiAgICBwcm92aWRlUHJvbWlzZVdhdGNoZXI6IHVuYXZhaWxhYmxlLFxuICAgIHdhdGNoUHJvbWlzZTogdW5hdmFpbGFibGUsXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIGNhbkJlRHVyYWJsZTogdW5hdmFpbGFibGVcbiAgfTtcbn1cblxuY29uc3QgVmF0RGF0YUV4cG9ydCA9IFZhdERhdGFHbG9iYWw7JGjNj19vbmNlLlZhdERhdGFFeHBvcnQoVmF0RGF0YUV4cG9ydCk7XG5cblxuLypcblxuICovXG5jb25zdCB7XG4gIGRlZmluZUtpbmQsXG4gIGRlZmluZUtpbmRNdWx0aSxcbiAgZGVmaW5lRHVyYWJsZUtpbmQsXG4gIGRlZmluZUR1cmFibGVLaW5kTXVsdGlcbn0gPSBWYXREYXRhR2xvYmFsOyRozY9fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRozY9fb25jZS5kZWZpbmVLaW5kTXVsdGkoZGVmaW5lS2luZE11bHRpKTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUtpbmQoZGVmaW5lRHVyYWJsZUtpbmQpOyRozY9fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG5jb25zdCB7XG4gIG1ha2VLaW5kSGFuZGxlLFxuICBwcm92aWRlUHJvbWlzZVdhdGNoZXIsXG4gIHdhdGNoUHJvbWlzZSxcbiAgbWFrZVNjYWxhckJpZ01hcFN0b3JlLFxuICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxuICBtYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG4gIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUsXG4gIGNhbkJlRHVyYWJsZVxufSA9IFZhdERhdGFHbG9iYWw7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlS2luZEhhbmRsZShtYWtlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ01hcFN0b3JlKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUpOyRozY9fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbmNvbnN0IHBpY2tGYWNldCA9XG4obWFrZXIsIGZhY2V0TmFtZSkgPT5cbiguLi5hcmdzKSA9PlxubWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaM2PX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcGFydGlhbEFzc2lnbiA9ICh0YXJnZXQsIHNvdXJjZSkgPT4ge1xuICBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKTtcbn07JGjNj19vbmNlLnBhcnRpYWxBc3NpZ24ocGFydGlhbEFzc2lnbik7XG5oYXJkZW4ocGFydGlhbEFzc2lnbik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBwcm92aWRlID1cbi8vXG4vKlxuXG4gICAqL1xuXG5cblxuKHByb3ZpZGVMYXp5KTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucHJvdmlkZShwcm92aWRlKTtcbmNvbnN0IG1ha2VTdG9yZVV0aWxzID0gKFZhdERhdGEpID0+IHtcbiAgY29uc3Qge1xuICAgIC8vXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlLFxuICAgIC8vXG4gICAgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxcbiAgICAvL1xuICAgIG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbiAgICAvL1xuICAgIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmVcbiAgfSA9IFZhdERhdGE7XG5cbiAgLypcbiAgXG4gICAqL1xuXG5cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVNYXBTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gIHByb3ZpZGUoYmFnZ2FnZSwgbmFtZSwgKCkgPT5cbiAgbWFrZVNjYWxhckJpZ01hcFN0b3JlKG5hbWUsIHsgZHVyYWJsZTogdHJ1ZSwgLi4ub3B0aW9ucyB9KVxuICApO1xuICBoYXJkZW4ocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5cbiAgLypcbiAgXG4gICAqL1xuXG5cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAoYmFnZ2FnZSwgbmFtZSwgb3B0aW9ucyA9IHt9KSA9PlxuICBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+XG4gIG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pXG4gICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7XG5cbiAgLypcbiAgXG4gICAqL1xuXG5cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVTZXRTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gIHByb3ZpZGUoYmFnZ2FnZSwgbmFtZSwgKCkgPT5cbiAgbWFrZVNjYWxhckJpZ1NldFN0b3JlKG5hbWUsIHsgZHVyYWJsZTogdHJ1ZSwgLi4ub3B0aW9ucyB9KVxuICApO1xuICBoYXJkZW4ocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG5cbiAgLypcbiAgXG4gICAqL1xuXG5cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUgPSAoYmFnZ2FnZSwgbmFtZSwgb3B0aW9ucyA9IHt9KSA9PlxuICBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+XG4gIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pXG4gICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgcHJvdmlkZUR1cmFibGVNYXBTdG9yZSxcbiAgICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbiAgICBwcm92aWRlRHVyYWJsZVNldFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVN0b3JlVXRpbHMobWFrZVN0b3JlVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxTdG9yZVV0aWxzID0gbWFrZVN0b3JlVXRpbHMoVmF0RGF0YUdsb2JhbCk7XG5jb25zdCB7XG4gIHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsXG4gIHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLFxuICBwcm92aWRlRHVyYWJsZVNldFN0b3JlLFxuICBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZVxufSA9IGdsb2JhbFN0b3JlVXRpbHM7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTskaM2PX29uY2UucHJvdmlkZUR1cmFibGVTZXRTdG9yZShwcm92aWRlRHVyYWJsZVNldFN0b3JlKTskaM2PX29uY2UucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVmF0RGF0YSI6WyJWYXREYXRhRXhwb3J0Il0sImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCJdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIl0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIl0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdLCJtYWtlS2luZEhhbmRsZSI6WyJtYWtlS2luZEhhbmRsZSJdLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiOlsicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXSwibWFrZVNjYWxhckJpZ01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSwiY2FuQmVEdXJhYmxlIjpbImNhbkJlRHVyYWJsZSJdLCJwaWNrRmFjZXQiOlsicGlja0ZhY2V0Il0sInBhcnRpYWxBc3NpZ24iOlsicGFydGlhbEFzc2lnbiJdLCJwcm92aWRlIjpbInByb3ZpZGUiXSwibWFrZVN0b3JlVXRpbHMiOlsibWFrZVN0b3JlVXRpbHMiXSwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADjMzEBfhQAAH4UAAAoAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY2xlYW5Qcm9wb3NhbC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL2ludGVybmFsIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJNQVhfS0VZV09SRF9MRU5HVEgiLCJhc3NlcnRLZXl3b3JkTmFtZSIsImNsZWFuS2V5d29yZHMiLCJjbGVhblByb3Bvc2FsIiwiY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCIsImNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0LHEsRmFpbCxBbW91bnRNYXRoLGdldEFzc2V0S2luZCxvYmplY3RNYXAsYXNzZXJ0UmVjb3JkLGFzc2VydEtleSxhc3NlcnRQYXR0ZXJuLG11c3RNYXRjaCxpc0tleSxGdWxsUHJvcG9zYWxTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXSxbXCJnZXRBc3NldEtpbmRcIixbJGjNj19hID0+IChnZXRBc3NldEtpbmQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImlzS2V5XCIsWyRozY9fYSA9PiAoaXNLZXkgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkZ1bGxQcm9wb3NhbFNoYXBlXCIsWyRozY9fYSA9PiAoRnVsbFByb3Bvc2FsU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG5jb25zdCBNQVhfS0VZV09SRF9MRU5HVEggPSAxMDA7XG5cbi8qXG5cbiAqLyRozY9fb25jZS5NQVhfS0VZV09SRF9MRU5HVEgoTUFYX0tFWVdPUkRfTEVOR1RIKTtcblxuY29uc3QgZmlyc3RDYXBBU0NJSSA9IC9eW0EtWl1bYS16QS1aMC05XyRdKiQvO1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBhc3NlcnRLZXl3b3JkTmFtZSA9IChrZXl3b3JkKSA9PiB7XG4gIGFzc2VydC50eXBlb2Yoa2V5d29yZCwgJ3N0cmluZycpO1xuICBrZXl3b3JkLmxlbmd0aCA8PSBNQVhfS0VZV09SRF9MRU5HVEggfHxcbiAgRmFpbGBrZXl3b3JkICR7cShrZXl3b3JkKX0gZXhjZWVkZWQgbWF4aW11bSBsZW5ndGggJHtxKFxuICAgIE1BWF9LRVlXT1JEX0xFTkdUSFxuICApfSBjaGFyYWN0ZXJzOyBnb3QgJHtrZXl3b3JkLmxlbmd0aH1gO1xuICBmaXJzdENhcEFTQ0lJLnRlc3Qoa2V5d29yZCkgfHxcbiAgRmFpbGBrZXl3b3JkICR7cShcbiAgICBrZXl3b3JkXG4gICl9IG11c3QgYmUgYW4gYXNjaWkgaWRlbnRpZmllciBzdGFydGluZyB3aXRoIHVwcGVyIGNhc2UuYDtcbiAgKGtleXdvcmQgIT09ICdOYU4nICYmIGtleXdvcmQgIT09ICdJbmZpbml0eScpIHx8XG4gIEZhaWxga2V5d29yZCAke3Eoa2V5d29yZCl9IG11c3Qgbm90IGJlIGEgbnVtYmVyJ3MgbmFtZWA7XG59O1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5hc3NlcnRLZXl3b3JkTmFtZShhc3NlcnRLZXl3b3JkTmFtZSk7XG5jb25zdCBjbGVhbktleXdvcmRzID0gKHVuY2xlYW5LZXl3b3JkUmVjb3JkKSA9PiB7XG4gIGhhcmRlbih1bmNsZWFuS2V5d29yZFJlY29yZCk7XG4gIGFzc2VydFJlY29yZCh1bmNsZWFuS2V5d29yZFJlY29yZCwgJ2tleXdvcmRSZWNvcmQnKTtcbiAgY29uc3Qga2V5d29yZHMgPSBvd25LZXlzKHVuY2xlYW5LZXl3b3JkUmVjb3JkKTtcblxuICAvL1xuICAvL1xuICBmb3IgKGNvbnN0IGtleXdvcmQgb2Yga2V5d29yZHMpIHtcbiAgICBhc3NlcnRLZXl3b3JkTmFtZShrZXl3b3JkKTtcbiAgfVxuXG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAqLyhrZXl3b3Jkcyk7XG59OyRozY9fb25jZS5jbGVhbktleXdvcmRzKGNsZWFuS2V5d29yZHMpO1xuXG5jb25zdCBjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCA9IChcbmFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkLFxuZ2V0QXNzZXRLaW5kQnlCcmFuZCkgPT5cbntcbiAgY2xlYW5LZXl3b3JkcyhhbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCk7XG4gIC8vXG4gIHJldHVybiBvYmplY3RNYXAoYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsIChhbW91bnQpID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKGlzS2V5KGFtb3VudCkpIHtcbiAgICAgIGNvbnN0IGJyYW5kQXNzZXRLaW5kID0gZ2V0QXNzZXRLaW5kQnlCcmFuZChhbW91bnQuYnJhbmQpO1xuICAgICAgY29uc3QgYXNzZXRLaW5kID0gZ2V0QXNzZXRLaW5kKGFtb3VudCk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGFzc2V0S2luZCA9PT0gYnJhbmRBc3NldEtpbmQgfHxcbiAgICAgIEZhaWxgVGhlIGFtb3VudCAke2Ftb3VudH0gZGlkIG5vdCBoYXZlIHRoZSBhc3NldEtpbmQgb2YgdGhlIGJyYW5kICR7YnJhbmRBc3NldEtpbmR9YDtcbiAgICAgIHJldHVybiBBbW91bnRNYXRoLmNvZXJjZShhbW91bnQuYnJhbmQsIGFtb3VudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydFBhdHRlcm4oYW1vdW50KTtcbiAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5jb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZChjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCk7XG5jb25zdCBjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkID0gKFxuYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG5nZXRBc3NldEtpbmRCeUJyYW5kKSA9Plxue1xuICBjb25zdCByZXN1bHQgPSBjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZChcbiAgICBhbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCxcbiAgICBnZXRBc3NldEtpbmRCeUJyYW5kXG4gICk7XG4gIGFzc2VydEtleShyZXN1bHQpO1xuICAvL1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cblxuXG4gKi8kaM2PX29uY2UuY29lcmNlQW1vdW50S2V5d29yZFJlY29yZChjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKTtcbmNvbnN0IGFzc2VydEV4aXQgPSAoZXhpdCkgPT5cbm93bktleXMoZXhpdCkubGVuZ3RoID09PSAxIHx8IEZhaWxgZXhpdCAke2V4aXR9IHNob3VsZCBvbmx5IGhhdmUgb25lIGtleWA7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0S2V5d29yZE5vdEluQm90aCA9ICh3YW50LCBnaXZlKSA9PiB7XG4gIGNvbnN0IHdhbnRLZXl3b3JkU2V0ID0gbmV3IFNldChvd25LZXlzKHdhbnQpKTtcbiAgY29uc3QgZ2l2ZUtleXdvcmRzID0gb3duS2V5cyhnaXZlKTtcblxuICBmb3IgKGNvbnN0IGtleXdvcmQgb2YgZ2l2ZUtleXdvcmRzKSB7XG4gICAgIXdhbnRLZXl3b3JkU2V0LmhhcyhrZXl3b3JkKSB8fFxuICAgIEZhaWxgYSBrZXl3b3JkIGNhbm5vdCBiZSBpbiBib3RoICd3YW50JyBhbmQgJ2dpdmUnYDtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGNsZWFuUHJvcG9zYWwgPSAocHJvcG9zYWwsIGdldEFzc2V0S2luZEJ5QnJhbmQpID0+IHtcbiAgYXNzZXJ0UmVjb3JkKHByb3Bvc2FsLCAncHJvcG9zYWwnKTtcbiAgLy9cbiAgY29uc3Qge1xuICAgIHdhbnQgPSBoYXJkZW4oe30pLFxuICAgIGdpdmUgPSBoYXJkZW4oe30pLFxuICAgIGV4aXQgPSBoYXJkZW4oeyBvbkRlbWFuZDogbnVsbCB9KSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wb3NhbDtcbiAgb3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgRmFpbGAke3Byb3Bvc2FsfSAtIE11c3Qgb25seSBoYXZlIHdhbnQ6LCBnaXZlOiwgZXhpdDogcHJvcGVydGllczogJHtyZXN0fWA7XG5cbiAgY29uc3QgY2xlYW5lZFdhbnQgPSBjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZChcbiAgICB3YW50LFxuICAgIGdldEFzc2V0S2luZEJ5QnJhbmRcbiAgKTtcbiAgY29uc3QgY2xlYW5lZEdpdmUgPSBjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKGdpdmUsIGdldEFzc2V0S2luZEJ5QnJhbmQpO1xuXG4gIGNvbnN0IGNsZWFuZWRQcm9wb3NhbCA9IGhhcmRlbih7XG4gICAgd2FudDogY2xlYW5lZFdhbnQsXG4gICAgZ2l2ZTogY2xlYW5lZEdpdmUsXG4gICAgZXhpdFxuICB9KTtcbiAgbXVzdE1hdGNoKGNsZWFuZWRQcm9wb3NhbCwgRnVsbFByb3Bvc2FsU2hhcGUsICdwcm9wb3NhbCcpO1xuICBhc3NlcnRFeGl0KGV4aXQpO1xuICBhc3NlcnRLZXl3b3JkTm90SW5Cb3RoKGNsZWFuZWRXYW50LCBjbGVhbmVkR2l2ZSk7XG4gIHJldHVybiBjbGVhbmVkUHJvcG9zYWw7XG59OyRozY9fb25jZS5jbGVhblByb3Bvc2FsKGNsZWFuUHJvcG9zYWwpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiTUFYX0tFWVdPUkRfTEVOR1RIIjpbIk1BWF9LRVlXT1JEX0xFTkdUSCJdLCJhc3NlcnRLZXl3b3JkTmFtZSI6WyJhc3NlcnRLZXl3b3JkTmFtZSJdLCJjbGVhbktleXdvcmRzIjpbImNsZWFuS2V5d29yZHMiXSwiY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQiOlsiY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQiXSwiY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCI6WyJjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkIl0sImNsZWFuUHJvcG9zYWwiOlsiY2xlYW5Qcm9wb3NhbCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADr1+zkWwYAAFsGAAA0AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiXSwiZXhwb3J0cyI6WyJpc09mZmVyU2FmZSIsInNhdGlzZmllc1dhbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRNYXRoOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzT2ZmZXJTYWZlLCduYW1lJyx7dmFsdWU6XCJpc09mZmVyU2FmZVwifSk7JGjNj19vbmNlLmlzT2ZmZXJTYWZlKGlzT2ZmZXJTYWZlKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHNhdGlzZmllc0ludGVybmFsID0gKGdpdmVPcldhbnQgPSB7fSwgYWxsb2NhdGlvbikgPT4ge1xuICBjb25zdCBpc0dURUJ5S2V5d29yZCA9IChba2V5d29yZCwgcmVxdWlyZWRBbW91bnRdKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGlmIChhbGxvY2F0aW9uW2tleXdvcmRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBhbGxvY2F0aW9uQW1vdW50ID0gYWxsb2NhdGlvbltrZXl3b3JkXTtcbiAgICByZXR1cm4gQW1vdW50TWF0aC5pc0dURShhbGxvY2F0aW9uQW1vdW50LCByZXF1aXJlZEFtb3VudCkgPyAxIDogMDtcbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGdpdmVPcldhbnQpLmV2ZXJ5KGlzR1RFQnlLZXl3b3JkKSA/IDEgOiAwO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc2F0aXNmaWVzV2FudCA9IChwcm9wb3NhbCwgYWxsb2NhdGlvbikgPT5cbnNhdGlzZmllc0ludGVybmFsKHByb3Bvc2FsLndhbnQsIGFsbG9jYXRpb24pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uuc2F0aXNmaWVzV2FudChzYXRpc2ZpZXNXYW50KTtcbmNvbnN0IHNhdGlzZmllc0dpdmUgPSAocHJvcG9zYWwsIGFsbG9jYXRpb24pID0+XG5zYXRpc2ZpZXNJbnRlcm5hbChwcm9wb3NhbC5naXZlLCBhbGxvY2F0aW9uKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gaXNPZmZlclNhZmUocHJvcG9zYWwsIGFsbG9jYXRpb24pIHtcbiAgcmV0dXJuIChcbiAgc2F0aXNmaWVzR2l2ZShwcm9wb3NhbCwgYWxsb2NhdGlvbikgPiAwIHx8XG4gIHNhdGlzZmllc1dhbnQocHJvcG9zYWwsIGFsbG9jYXRpb24pID4gMFxuICApO1xufVxuXG5oYXJkZW4oaXNPZmZlclNhZmUpO1xuaGFyZGVuKHNhdGlzZmllc1dhbnQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2F0aXNmaWVzV2FudCI6WyJzYXRpc2ZpZXNXYW50Il0sImlzT2ZmZXJTYWZlIjpbImlzT2ZmZXJTYWZlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJjc6VNXBwAAVwcAADkAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIi4uL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJUcmFuc2ZlclBhcnRTaGFwZSIsImF0b21pY1JlYXJyYW5nZSIsImF0b21pY1RyYW5zZmVyIiwiZnJvbU9ubHkiLCJ0b09ubHkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNLEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxTZWF0U2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSA9ICRozY9fYSldXSxbXCJTZWF0U2hhcGVcIixbJGjNj19hID0+IChTZWF0U2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qXG5cbiAqL1xuXG5jb25zdCBUcmFuc2ZlclBhcnRTaGFwZSA9IE0uc3BsaXRBcnJheShcbiAgaGFyZGVuKFtNLm9wdChTZWF0U2hhcGUpLCBNLm9wdChTZWF0U2hhcGUpLCBNLm9wdChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpXSksXG4gIGhhcmRlbihbTS5vcHQoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKV0pXG4pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuVHJhbnNmZXJQYXJ0U2hhcGUoVHJhbnNmZXJQYXJ0U2hhcGUpO1xuY29uc3QgYXRvbWljUmVhcnJhbmdlID0gKHpjZiwgdHJhbnNmZXJzKSA9PiB7XG4gIHpjZi5hdG9taWNSZWFycmFuZ2UodHJhbnNmZXJzKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hdG9taWNSZWFycmFuZ2UoYXRvbWljUmVhcnJhbmdlKTtcbmNvbnN0IGZyb21Pbmx5ID0gKGZyb21TZWF0LCBmcm9tQW1vdW50cykgPT5cbmhhcmRlbihbZnJvbVNlYXQsIHVuZGVmaW5lZCwgZnJvbUFtb3VudHNdKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmZyb21Pbmx5KGZyb21Pbmx5KTtcbmNvbnN0IHRvT25seSA9ICh0b1NlYXQsIHRvQW1vdW50cykgPT5cbmhhcmRlbihbdW5kZWZpbmVkLCB0b1NlYXQsIHVuZGVmaW5lZCwgdG9BbW91bnRzXSk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS50b09ubHkodG9Pbmx5KTtcbmNvbnN0IGF0b21pY1RyYW5zZmVyID0gKFxuemNmLFxuZnJvbVNlYXQgPSB1bmRlZmluZWQsXG50b1NlYXQgPSB1bmRlZmluZWQsXG5mcm9tQW1vdW50cyA9IHVuZGVmaW5lZCxcbnRvQW1vdW50cyA9IHVuZGVmaW5lZCkgPT5cbnpjZi5hdG9taWNSZWFycmFuZ2UoaGFyZGVuKFtbZnJvbVNlYXQsIHRvU2VhdCwgZnJvbUFtb3VudHMsIHRvQW1vdW50c11dKSk7JGjNj19vbmNlLmF0b21pY1RyYW5zZmVyKGF0b21pY1RyYW5zZmVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRyYW5zZmVyUGFydFNoYXBlIjpbIlRyYW5zZmVyUGFydFNoYXBlIl0sImF0b21pY1JlYXJyYW5nZSI6WyJhdG9taWNSZWFycmFuZ2UiXSwiZnJvbU9ubHkiOlsiZnJvbU9ubHkiXSwidG9Pbmx5IjpbInRvT25seSJdLCJhdG9taWNUcmFuc2ZlciI6WyJhdG9taWNUcmFuc2ZlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADqgwqHeBAAAHgQAAA4AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vZXJyb3JzIiwiLi9zYWZlTWF0aC5qcyJdLCJleHBvcnRzIjpbImNhbGNMaXFWYWx1ZVRvTWludCIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsImNhbGNWYWx1ZVRvUmVtb3ZlIiwiZ2V0SW5wdXRQcmljZSIsImdldE91dHB1dFByaWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTmF0LEZhaWwsbmF0U2FmZU1hdGg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3NhZmVNYXRoLmpzXCIsIFtbXCJuYXRTYWZlTWF0aFwiLFskaM2PX2EgPT4gKG5hdFNhZmVNYXRoID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5jb25zdCB7IHN1YnRyYWN0LCBhZGQsIG11bHRpcGx5LCBmbG9vckRpdmlkZSB9ID0gbmF0U2FmZU1hdGg7XG5cbmNvbnN0IEJBU0lTX1BPSU5UUyA9IDEwMDAwbjsgLy9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGdldElucHV0UHJpY2UgPSAoXG5pbnB1dFZhbHVlLFxuaW5wdXRSZXNlcnZlLFxub3V0cHV0UmVzZXJ2ZSxcbmZlZUJhc2lzUG9pbnRzID0gMzBuKSA9Plxue1xuICBpbnB1dFZhbHVlID0gTmF0KGlucHV0VmFsdWUpO1xuICBpbnB1dFJlc2VydmUgPSBOYXQoaW5wdXRSZXNlcnZlKTtcbiAgb3V0cHV0UmVzZXJ2ZSA9IE5hdChvdXRwdXRSZXNlcnZlKTtcbiAgaW5wdXRWYWx1ZSA+IDBuIHx8IEZhaWxgaW5wdXRWYWx1ZSAke2lucHV0VmFsdWV9IG11c3QgYmUgcG9zaXRpdmVgO1xuICBpbnB1dFJlc2VydmUgPiAwbiB8fCBGYWlsYGlucHV0UmVzZXJ2ZSAke2lucHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG4gIG91dHB1dFJlc2VydmUgPiAwbiB8fCBGYWlsYG91dHB1dFJlc2VydmUgJHtvdXRwdXRSZXNlcnZlfSBtdXN0IGJlIHBvc2l0aXZlYDtcblxuICBjb25zdCBvbmVNaW51c0ZlZVNjYWxlZCA9IHN1YnRyYWN0KEJBU0lTX1BPSU5UUywgZmVlQmFzaXNQb2ludHMpO1xuICBjb25zdCBpbnB1dFdpdGhGZWUgPSBtdWx0aXBseShpbnB1dFZhbHVlLCBvbmVNaW51c0ZlZVNjYWxlZCk7XG4gIGNvbnN0IG51bWVyYXRvciA9IG11bHRpcGx5KGlucHV0V2l0aEZlZSwgb3V0cHV0UmVzZXJ2ZSk7XG4gIGNvbnN0IGRlbm9taW5hdG9yID0gYWRkKG11bHRpcGx5KGlucHV0UmVzZXJ2ZSwgQkFTSVNfUE9JTlRTKSwgaW5wdXRXaXRoRmVlKTtcbiAgcmV0dXJuIGZsb29yRGl2aWRlKG51bWVyYXRvciwgZGVub21pbmF0b3IpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZ2V0SW5wdXRQcmljZShnZXRJbnB1dFByaWNlKTtcbmNvbnN0IGdldE91dHB1dFByaWNlID0gKFxub3V0cHV0VmFsdWUsXG5pbnB1dFJlc2VydmUsXG5vdXRwdXRSZXNlcnZlLFxuZmVlQmFzaXNQb2ludHMgPSAzMG4pID0+XG57XG4gIG91dHB1dFZhbHVlID0gTmF0KG91dHB1dFZhbHVlKTtcbiAgaW5wdXRSZXNlcnZlID0gTmF0KGlucHV0UmVzZXJ2ZSk7XG4gIG91dHB1dFJlc2VydmUgPSBOYXQob3V0cHV0UmVzZXJ2ZSk7XG5cbiAgaW5wdXRSZXNlcnZlID4gMG4gfHwgRmFpbGBpbnB1dFJlc2VydmUgJHtpbnB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgO1xuICBvdXRwdXRSZXNlcnZlID4gMG4gfHwgRmFpbGBvdXRwdXRSZXNlcnZlICR7b3V0cHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG4gIG91dHB1dFJlc2VydmUgPiBvdXRwdXRWYWx1ZSB8fFxuICBGYWlsYG91dHB1dFJlc2VydmUgJHtvdXRwdXRSZXNlcnZlfSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvdXRwdXRWYWx1ZSAke291dHB1dFZhbHVlfWA7XG5cbiAgY29uc3Qgb25lTWludXNGZWVTY2FsZWQgPSBzdWJ0cmFjdChCQVNJU19QT0lOVFMsIGZlZUJhc2lzUG9pbnRzKTtcbiAgY29uc3QgbnVtZXJhdG9yID0gbXVsdGlwbHkobXVsdGlwbHkob3V0cHV0VmFsdWUsIGlucHV0UmVzZXJ2ZSksIEJBU0lTX1BPSU5UUyk7XG4gIGNvbnN0IGRlbm9taW5hdG9yID0gbXVsdGlwbHkoXG4gICAgc3VidHJhY3Qob3V0cHV0UmVzZXJ2ZSwgb3V0cHV0VmFsdWUpLFxuICAgIG9uZU1pbnVzRmVlU2NhbGVkXG4gICk7XG4gIHJldHVybiBhZGQoZmxvb3JEaXZpZGUobnVtZXJhdG9yLCBkZW5vbWluYXRvciksIDFuKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5nZXRPdXRwdXRQcmljZShnZXRPdXRwdXRQcmljZSk7XG5jb25zdCBjYWxjTGlxVmFsdWVUb01pbnQgPSAoXG5saXFUb2tlblN1cHBseSxcbmlucHV0VmFsdWUsXG5pbnB1dFJlc2VydmUpID0+XG57XG4gIGxpcVRva2VuU3VwcGx5ID0gTmF0KGxpcVRva2VuU3VwcGx5KTtcbiAgaW5wdXRWYWx1ZSA9IE5hdChpbnB1dFZhbHVlKTtcbiAgaW5wdXRSZXNlcnZlID0gTmF0KGlucHV0UmVzZXJ2ZSk7XG5cbiAgaWYgKGxpcVRva2VuU3VwcGx5ID09PSAwbikge1xuICAgIHJldHVybiBpbnB1dFZhbHVlO1xuICB9XG4gIHJldHVybiBmbG9vckRpdmlkZShtdWx0aXBseShpbnB1dFZhbHVlLCBsaXFUb2tlblN1cHBseSksIGlucHV0UmVzZXJ2ZSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuY2FsY0xpcVZhbHVlVG9NaW50KGNhbGNMaXFWYWx1ZVRvTWludCk7XG5jb25zdCBjYWxjU2Vjb25kYXJ5UmVxdWlyZWQgPSAoXG5jZW50cmFsSW4sXG5jZW50cmFsUG9vbCxcbnNlY29uZGFyeVBvb2wsXG5zZWNvbmRhcnlJbikgPT5cbntcbiAgY2VudHJhbEluID0gTmF0KGNlbnRyYWxJbik7XG4gIGNlbnRyYWxQb29sID0gTmF0KGNlbnRyYWxQb29sKTtcbiAgc2Vjb25kYXJ5UG9vbCA9IE5hdChzZWNvbmRhcnlQb29sKTtcbiAgc2Vjb25kYXJ5SW4gPSBOYXQoc2Vjb25kYXJ5SW4pO1xuXG4gIGlmIChjZW50cmFsUG9vbCA9PT0gMG4gfHwgc2Vjb25kYXJ5UG9vbCA9PT0gMG4pIHtcbiAgICByZXR1cm4gc2Vjb25kYXJ5SW47XG4gIH1cblxuICBjb25zdCBzY2FsZWRTZWNvbmRhcnkgPSBmbG9vckRpdmlkZShcbiAgICBtdWx0aXBseShjZW50cmFsSW4sIHNlY29uZGFyeVBvb2wpLFxuICAgIGNlbnRyYWxQb29sXG4gICk7XG4gIGNvbnN0IGV4YWN0ID1cbiAgbXVsdGlwbHkoY2VudHJhbEluLCBzZWNvbmRhcnlQb29sKSA9PT1cbiAgbXVsdGlwbHkoc2NhbGVkU2Vjb25kYXJ5LCBjZW50cmFsUG9vbCk7XG5cbiAgLy9cbiAgLy9cbiAgcmV0dXJuIGV4YWN0ID8gc2NhbGVkU2Vjb25kYXJ5IDogMW4gKyBzY2FsZWRTZWNvbmRhcnk7XG59O1xuXG4vL1xuLy9cbiRozY9fb25jZS5jYWxjU2Vjb25kYXJ5UmVxdWlyZWQoY2FsY1NlY29uZGFyeVJlcXVpcmVkKTtjb25zdCBjYWxjVmFsdWVUb1JlbW92ZSA9IChcbmxpcVRva2VuU3VwcGx5LFxucG9vbFZhbHVlLFxubGlxdWlkaXR5VmFsdWVJbikgPT5cbntcbiAgbGlxVG9rZW5TdXBwbHkgPSBOYXQobGlxVG9rZW5TdXBwbHkpO1xuICBsaXF1aWRpdHlWYWx1ZUluID0gTmF0KGxpcXVpZGl0eVZhbHVlSW4pO1xuICBwb29sVmFsdWUgPSBOYXQocG9vbFZhbHVlKTtcblxuICByZXR1cm4gZmxvb3JEaXZpZGUobXVsdGlwbHkobGlxdWlkaXR5VmFsdWVJbiwgcG9vbFZhbHVlKSwgbGlxVG9rZW5TdXBwbHkpO1xufTskaM2PX29uY2UuY2FsY1ZhbHVlVG9SZW1vdmUoY2FsY1ZhbHVlVG9SZW1vdmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0SW5wdXRQcmljZSI6WyJnZXRJbnB1dFByaWNlIl0sImdldE91dHB1dFByaWNlIjpbImdldE91dHB1dFByaWNlIl0sImNhbGNMaXFWYWx1ZVRvTWludCI6WyJjYWxjTGlxVmFsdWVUb01pbnQiXSwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIjpbImNhbGNTZWNvbmRhcnlSZXF1aXJlZCJdLCJjYWxjVmFsdWVUb1JlbW92ZSI6WyJjYWxjVmFsdWVUb1JlbW92ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADLOQ2VkAoAAJAKAAA1AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsibWFrZUVwaGVtZXJhUHJvdmlkZXIiLCJwcm92aWRlQWxsIiwicHJvdmlkZUVtcHR5U2VhdCIsInByb3ZpZGVTaW5nbGV0b24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhbGxWYWx1ZXMsb2JqZWN0TWFwLHByb3ZpZGUsRTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFsbFZhbHVlc1wiLFskaM2PX2EgPT4gKGFsbFZhbHVlcyA9ICRozY9fYSldXSxbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlXCIsWyRozY9fYSA9PiAocHJvdmlkZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFcGhlbWVyYVByb3ZpZGVyID0gKGluaXQpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBleHRhbnQgPSBuZXcgV2Vha01hcCgpO1xuXG4gIC8qXG4gIFxuICAgKi9cblxuXG4gIHJldHVybiAoa2V5KSA9PiB7XG4gICAgaWYgKGV4dGFudC5oYXMoa2V5KSkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBleHRhbnQuZ2V0KGtleSk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0VwaCA9IGluaXQoa2V5KTtcbiAgICBleHRhbnQuc2V0KGtleSwgbmV3RXBoKTtcbiAgICByZXR1cm4gbmV3RXBoO1xuICB9O1xufTskaM2PX29uY2UubWFrZUVwaGVtZXJhUHJvdmlkZXIobWFrZUVwaGVtZXJhUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VFcGhlbWVyYVByb3ZpZGVyKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcHJvdmlkZUVtcHR5U2VhdCA9ICh6Y2YsIGJhZ2dhZ2UsIG5hbWUpID0+IHtcbiAgcmV0dXJuIHByb3ZpZGUoYmFnZ2FnZSwgbmFtZSwgKCkgPT4gemNmLm1ha2VFbXB0eVNlYXRLaXQoKS56Y2ZTZWF0KTtcbn07JGjNj19vbmNlLnByb3ZpZGVFbXB0eVNlYXQocHJvdmlkZUVtcHR5U2VhdCk7XG5oYXJkZW4ocHJvdmlkZUVtcHR5U2VhdCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcHJvdmlkZUFsbCA9IChiYWdnYWdlLCB0aHVua3MpID0+IHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRodW5rcyk7XG4gIC8vXG4gIGNvbnN0IGluQmFnZ2FnZSA9IGJhZ2dhZ2UuaGFzKGtleXNbMF0pO1xuICBpZiAoaW5CYWdnYWdlKSB7XG4gICAgY29uc3Qgb2JqID0gb2JqZWN0TWFwKFxuICAgICAgdGh1bmtzLFxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIChfLCBrKSA9PiBiYWdnYWdlLmdldChrKVxuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShoYXJkZW4ob2JqKSk7XG4gIH1cblxuICBjb25zdCBrZXllZFByb21pc2VzID0gb2JqZWN0TWFwKHRodW5rcywgKGZuKSA9PiBmbigpKTtcblxuICByZXR1cm4gYWxsVmFsdWVzKGtleWVkUHJvbWlzZXMpLnRoZW4oKGtleWVkVmFscykgPT4ge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGtleWVkVmFscykpIHtcbiAgICAgIGJhZ2dhZ2UuaW5pdChrLCB2KTtcbiAgICB9XG4gICAgcmV0dXJuIGtleWVkVmFscztcbiAgfSk7XG59OyRozY9fb25jZS5wcm92aWRlQWxsKHByb3ZpZGVBbGwpO1xuaGFyZGVuKHByb3ZpZGVBbGwpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcHJvdmlkZVNpbmdsZXRvbiA9IChtYXBTdG9yZSwga2V5LCBtYWtlVmFsdWUsIHdpdGhWYWx1ZSkgPT4ge1xuICBjb25zdCBzdG9yZWQgPSBtYXBTdG9yZS5oYXMoa2V5KSA/XG4gIHVuZGVmaW5lZCA6XG4gIEUud2hlbihtYWtlVmFsdWUoKSwgKHYpID0+IG1hcFN0b3JlLmluaXQoa2V5LCBoYXJkZW4odikpKTtcblxuICByZXR1cm4gRS53aGVuKHN0b3JlZCwgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gbWFwU3RvcmUuZ2V0KGtleSk7XG4gICAgaWYgKHdpdGhWYWx1ZSkge1xuICAgICAgd2l0aFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9KTtcbn07JGjNj19vbmNlLnByb3ZpZGVTaW5nbGV0b24ocHJvdmlkZVNpbmdsZXRvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRXBoZW1lcmFQcm92aWRlciI6WyJtYWtlRXBoZW1lcmFQcm92aWRlciJdLCJwcm92aWRlRW1wdHlTZWF0IjpbInByb3ZpZGVFbXB0eVNlYXQiXSwicHJvdmlkZUFsbCI6WyJwcm92aWRlQWxsIl0sInByb3ZpZGVTaW5nbGV0b24iOlsicHJvdmlkZVNpbmdsZXRvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADdDckzUAoAAFAKAAAwAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYm9uZGluZ0N1cnZlcy5qcyIsIi4vc2FmZU1hdGguanMiLCIuL3N0YXRlTWFjaGluZS5qcyIsIi4vYXRvbWljVHJhbnNmZXIuanMiLCIuL3pvZUhlbHBlcnMuanMiLCIuL3JhdGlvLmpzIiwiLi9kdXJhYmlsaXR5LmpzIiwiLi9wcmVwYXJlLW93bmFibGUuanMiLCIuL3ByaWNlQXV0aG9yaXR5LmpzIiwiLi9wcmljZVF1b3RlLmpzIiwiLi9zdGF0aXN0aWNzLmpzIiwiLi9yZWNvcmRlci5qcyIsIi4vdG9waWNzLmpzIl0sImV4cG9ydHMiOlsiYXRvbWljVHJhbnNmZXIiLCJhdG9taWNUcmFuc2ZlciIsImdldE91dHB1dFByaWNlIiwiZ2V0T3V0cHV0UHJpY2UiLCJtYWtlUmF0aW9Gcm9tQW1vdW50cyIsIm1ha2VSYXRpb0Zyb21BbW91bnRzIiwic3dhcCIsInN3YXAiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL2R1cmFiaWxpdHkuanMiLCIuL3ByZXBhcmUtb3duYWJsZS5qcyIsIi4vcHJpY2VBdXRob3JpdHkuanMiLCIuL3ByaWNlUXVvdGUuanMiLCIuL3JlY29yZGVyLmpzIiwiLi9zdGF0aXN0aWNzLmpzIiwiLi90b3BpY3MuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9ib25kaW5nQ3VydmVzLmpzXCIsIFtdXSxbXCIuL3NhZmVNYXRoLmpzXCIsIFtdXSxbXCIuL3N0YXRlTWFjaGluZS5qc1wiLCBbXV0sW1wiLi9hdG9taWNUcmFuc2Zlci5qc1wiLCBbXV0sW1wiLi96b2VIZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3JhdGlvLmpzXCIsIFtdXSxbXCIuL2R1cmFiaWxpdHkuanNcIiwgW11dLFtcIi4vcHJlcGFyZS1vd25hYmxlLmpzXCIsIFtdXSxbXCIuL3ByaWNlQXV0aG9yaXR5LmpzXCIsIFtdXSxbXCIuL3ByaWNlUXVvdGUuanNcIiwgW11dLFtcIi4vc3RhdGlzdGljcy5qc1wiLCBbXV0sW1wiLi9yZWNvcmRlci5qc1wiLCBbXV0sW1wiLi90b3BpY3MuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL2JvbmRpbmdDdXJ2ZXMuanMiOltbImdldElucHV0UHJpY2UiLCJnZXRJbnB1dFByaWNlIl0sWyJnZXRPdXRwdXRQcmljZSIsImdldE91dHB1dFByaWNlIl0sWyJjYWxjTGlxVmFsdWVUb01pbnQiLCJjYWxjTGlxVmFsdWVUb01pbnQiXSxbImNhbGNWYWx1ZVRvUmVtb3ZlIiwiY2FsY1ZhbHVlVG9SZW1vdmUiXSxbImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCJdXSwiLi9zYWZlTWF0aC5qcyI6W1sibmF0U2FmZU1hdGgiLCJuYXRTYWZlTWF0aCJdXSwiLi9zdGF0ZU1hY2hpbmUuanMiOltbIm1ha2VTdGF0ZU1hY2hpbmUiLCJtYWtlU3RhdGVNYWNoaW5lIl1dLCIuL2F0b21pY1RyYW5zZmVyLmpzIjpbWyJhdG9taWNSZWFycmFuZ2UiLCJhdG9taWNSZWFycmFuZ2UiXSxbImF0b21pY1RyYW5zZmVyIiwiYXRvbWljVHJhbnNmZXIiXSxbImZyb21Pbmx5IiwiZnJvbU9ubHkiXSxbInRvT25seSIsInRvT25seSJdXSwiLi96b2VIZWxwZXJzLmpzIjpbWyJkZWZhdWx0QWNjZXB0YW5jZU1zZyIsImRlZmF1bHRBY2NlcHRhbmNlTXNnIl0sWyJzd2FwIiwic3dhcCJdLFsiZml0UHJvcG9zYWxTaGFwZSIsImZpdFByb3Bvc2FsU2hhcGUiXSxbImFzc2VydFByb3Bvc2FsU2hhcGUiLCJhc3NlcnRQcm9wb3NhbFNoYXBlIl0sWyJhc3NlcnRJc3N1ZXJLZXl3b3JkcyIsImFzc2VydElzc3VlcktleXdvcmRzIl0sWyJzYXRpc2ZpZXMiLCJzYXRpc2ZpZXMiXSxbImFzc2VydE5hdEFzc2V0S2luZCIsImFzc2VydE5hdEFzc2V0S2luZCJdLFsic3dhcEV4YWN0Iiwic3dhcEV4YWN0Il0sWyJkZXBvc2l0VG9TZWF0IiwiZGVwb3NpdFRvU2VhdCJdLFsid2l0aGRyYXdGcm9tU2VhdCIsIndpdGhkcmF3RnJvbVNlYXQiXSxbInNhdmVBbGxJc3N1ZXJzIiwic2F2ZUFsbElzc3VlcnMiXSxbIm9mZmVyVG8iLCJvZmZlclRvIl1dLCIuL3JhdGlvLmpzIjpbWyJtYWtlUmF0aW8iLCJtYWtlUmF0aW8iXSxbIm1ha2VSYXRpb0Zyb21BbW91bnRzIiwibWFrZVJhdGlvRnJvbUFtb3VudHMiXSxbImZsb29yTXVsdGlwbHlCeSIsImZsb29yTXVsdGlwbHlCeSJdLFsiZmxvb3JEaXZpZGVCeSIsImZsb29yRGl2aWRlQnkiXSxbImNlaWxNdWx0aXBseUJ5IiwiY2VpbE11bHRpcGx5QnkiXSxbImNlaWxEaXZpZGVCeSIsImNlaWxEaXZpZGVCeSJdLFsiYXNzZXJ0SXNSYXRpbyIsImFzc2VydElzUmF0aW8iXSxbImludmVydFJhdGlvIiwiaW52ZXJ0UmF0aW8iXSxbIm9uZU1pbnVzIiwib25lTWludXMiXSxbImFkZFJhdGlvcyIsImFkZFJhdGlvcyJdLFsibXVsdGlwbHlSYXRpb3MiLCJtdWx0aXBseVJhdGlvcyJdLFsicmF0aW9zU2FtZSIsInJhdGlvc1NhbWUiXSxbInF1YW50aXplIiwicXVhbnRpemUiXSxbInJhdGlvR1RFIiwicmF0aW9HVEUiXSxbInN1YnRyYWN0UmF0aW9zIiwic3VidHJhY3RSYXRpb3MiXSxbInJhdGlvVG9OdW1iZXIiLCJyYXRpb1RvTnVtYmVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACuv4VzfQkAAH0JAAA6AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByZXBhcmUtb3duYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyIsIkBhZ29yaWMvYmFzZS16b25lL3pvbmUtaGVscGVycy5qcyIsIi4uL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlT3duYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0scHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0LE9mZmVySGFuZGxlckk7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2Jhc2Utem9uZS96b25lLWhlbHBlcnMuanNcIiwgW1tcInByZXBhcmVSZXZvY2FibGVNYWtlcktpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVSZXZvY2FibGVNYWtlcktpdCA9ICRozY9fYSldXV1dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIk9mZmVySGFuZGxlcklcIixbJGjNj19hID0+IChPZmZlckhhbmRsZXJJID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbmNvbnN0IFRyYW5zZmVyUHJvcG9zYWxTaGFwZSA9IE0uc3BsaXRSZWNvcmQoe1xuICBnaXZlOiB7fSxcbiAgd2FudDoge30sXG4gIGV4aXQ6IHtcbiAgICBvbkRlbWFuZDogbnVsbFxuICB9XG59KTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByZXBhcmVPd25hYmxlID0gKFxuem9uZSxcbm1ha2VJbnZpdGF0aW9uLFxudUtpbmROYW1lLFxudU1ldGhvZE5hbWVzLFxub3B0aW9ucyA9IHt9KSA9Plxue1xuICBjb25zdCB7IHVJbnRlcmZhY2VOYW1lID0gdUtpbmROYW1lIH0gPSBvcHRpb25zO1xuICBjb25zdCB7IHJldm9rZSwgbWFrZVJldm9jYWJsZSB9ID0gcHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0KFxuICAgIHpvbmUsXG4gICAgdUtpbmROYW1lLFxuICAgIHVNZXRob2ROYW1lcyxcbiAgICB7XG4gICAgICB1SW50ZXJmYWNlTmFtZSxcbiAgICAgIGV4dHJhTWV0aG9kR3VhcmRzOiB7XG4gICAgICAgIG1ha2VUcmFuc2Zlckludml0YXRpb246IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpXG4gICAgICB9LFxuICAgICAgZXh0cmFNZXRob2RzOiB7XG4gICAgICAgIG1ha2VUcmFuc2Zlckludml0YXRpb24oKSB7XG4gICAgICAgICAgY29uc3QgeyB1bmRlcmx5aW5nIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IHsgcmV2b2NhYmxlIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICBjb25zdCBjdXN0b21EZXRhaWxzID0gdW5kZXJseWluZy5nZXRJbnZpdGF0aW9uQ3VzdG9tRGV0YWlscygpO1xuICAgICAgICAgIGNvbnN0IHRyYW5zZmVySGFuZGxlciA9IG1ha2VUcmFuc2ZlckhhbmRsZXIodW5kZXJseWluZyk7XG5cbiAgICAgICAgICBjb25zdCBpbnZpdGF0aW9uID0gbWFrZUludml0YXRpb24oXG4gICAgICAgICAgICB0cmFuc2ZlckhhbmRsZXIsXG4gICAgICAgICAgICAndHJhbnNmZXInLFxuICAgICAgICAgICAgY3VzdG9tRGV0YWlscyxcbiAgICAgICAgICAgIFRyYW5zZmVyUHJvcG9zYWxTaGFwZVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV2b2tlKHJldm9jYWJsZSk7XG4gICAgICAgICAgcmV0dXJuIGludml0YXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICk7XG5cbiAgY29uc3QgbWFrZVRyYW5zZmVySGFuZGxlciA9IHpvbmUuZXhvQ2xhc3MoXG4gICAgJ1RyYW5zZmVySGFuZGxlcicsXG4gICAgT2ZmZXJIYW5kbGVySSxcbiAgICAodW5kZXJseWluZykgPT4gKHtcbiAgICAgIHVuZGVybHlpbmdcbiAgICB9KSxcbiAgICB7XG4gICAgICBoYW5kbGUoc2VhdCkge1xuICAgICAgICBjb25zdCB7IHVuZGVybHlpbmcgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGNvbnN0IHJldm9jYWJsZSA9IG1ha2VSZXZvY2FibGUodW5kZXJseWluZyk7XG4gICAgICAgIHNlYXQuZXhpdCgpO1xuICAgICAgICByZXR1cm4gcmV2b2NhYmxlO1xuICAgICAgfVxuICAgIH1cbiAgKTtcblxuICBjb25zdCBtYWtlT3duYWJsZSA9ICh1bmRlcmx5aW5nKSA9PiBtYWtlUmV2b2NhYmxlKHVuZGVybHlpbmcpO1xuICByZXR1cm4gaGFyZGVuKG1ha2VPd25hYmxlKTtcbn07JGjNj19vbmNlLnByZXBhcmVPd25hYmxlKHByZXBhcmVPd25hYmxlKTtcbmhhcmRlbihwcmVwYXJlT3duYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlT3duYWJsZSI6WyJwcmVwYXJlT3duYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAALVPyNLCsAACwrAAA5AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvdGltZSIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJQcmljZUF1dGhvcml0eUkiLCJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsRSxGYXIsbWFrZVByb21pc2VLaXQsQW1vdW50TWF0aCxBbW91bnRTaGFwZSxCcmFuZFNoYXBlLG1ha2VOb3RpZmllcixtYWtlVHJhY2VyLFRpbWVzdGFtcFNoYXBlLE07JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV0sW1wiQW1vdW50U2hhcGVcIixbJGjNj19hID0+IChBbW91bnRTaGFwZSA9ICRozY9fYSldXSxbXCJCcmFuZFNoYXBlXCIsWyRozY9fYSA9PiAoQnJhbmRTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllclwiLFskaM2PX2EgPT4gKG1ha2VOb3RpZmllciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdQQScsIGZhbHNlKTtcblxuLypcblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlzTFQgPSAoYW1vdW50LCBhbW91bnRMaW1pdCkgPT4gIUFtb3VudE1hdGguaXNHVEUoYW1vdW50LCBhbW91bnRMaW1pdCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlzTFRFID0gKGFtb3VudCwgYW1vdW50TGltaXQpID0+IEFtb3VudE1hdGguaXNHVEUoYW1vdW50TGltaXQsIGFtb3VudCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlzR1RFID0gKGFtb3VudCwgYW1vdW50TGltaXQpID0+IEFtb3VudE1hdGguaXNHVEUoYW1vdW50LCBhbW91bnRMaW1pdCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlzR1QgPSAoYW1vdW50LCBhbW91bnRMaW1pdCkgPT4gIUFtb3VudE1hdGguaXNHVEUoYW1vdW50TGltaXQsIGFtb3VudCk7XG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgR3VhcmRDYWxsQW1vdW50VHVwbGUgPSBNLmNhbGwoQW1vdW50U2hhcGUsIEFtb3VudFNoYXBlKS5yZXR1cm5zKFxuICBNLnByb21pc2UoKVxuKTtcbmNvbnN0IFByaWNlQXV0aG9yaXR5SSA9IE0uaW50ZXJmYWNlKCdQcmljZUF1dGhvcml0eScsIHtcbiAgZ2V0UXVvdGVJc3N1ZXI6IE0uY2FsbChCcmFuZFNoYXBlLCBCcmFuZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0VGltZXJTZXJ2aWNlOiBNLmNhbGwoQnJhbmRTaGFwZSwgQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHF1b3RlR2l2ZW46IE0uY2FsbChBbW91bnRTaGFwZSwgQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHF1b3RlV2FudGVkOiBNLmNhbGwoQnJhbmRTaGFwZSwgQW1vdW50U2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBtYWtlUXVvdGVOb3RpZmllcjogTS5jYWxsKEFtb3VudFNoYXBlLCBCcmFuZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgcXVvdGVBdFRpbWU6IE0uY2FsbChUaW1lc3RhbXBTaGFwZSwgQW1vdW50U2hhcGUsIEJyYW5kU2hhcGUpLnJldHVybnMoXG4gICAgTS5wcm9taXNlKClcbiAgKSxcbiAgcXVvdGVXaGVuTFQ6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBxdW90ZVdoZW5MVEU6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBxdW90ZVdoZW5HVEU6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBxdW90ZVdoZW5HVDogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIG11dGFibGVRdW90ZVdoZW5MVDogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIG11dGFibGVRdW90ZVdoZW5MVEU6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBtdXRhYmxlUXVvdGVXaGVuR1RFOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgbXV0YWJsZVF1b3RlV2hlbkdUOiBHdWFyZENhbGxBbW91bnRUdXBsZVxufSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlByaWNlQXV0aG9yaXR5SShQcmljZUF1dGhvcml0eUkpO1xuY29uc3QgbWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0ID0gKG9wdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIHRpbWVyLFxuICAgIGNyZWF0ZVF1b3RlLFxuICAgIGFjdHVhbEJyYW5kSW4sXG4gICAgYWN0dWFsQnJhbmRPdXQsXG4gICAgcXVvdGVJc3N1ZXIsXG4gICAgbm90aWZpZXJcbiAgfSA9IG9wdHM7XG5cbiAgbGV0IGhhdmVGaXJzdFF1b3RlID0gZmFsc2U7XG5cbiAgdm9pZCBFKG5vdGlmaWVyKS5cbiAgZ2V0VXBkYXRlU2luY2UoKS5cbiAgdGhlbigoXykgPT4gKGhhdmVGaXJzdFF1b3RlID0gdHJ1ZSkpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB0cmlnZ2VycyA9IG5ldyBTZXQoKTtcbiAgY29uc3QgbXV0YWJsZVRyaWdnZXJzID0gbmV3IE1hcCgpO1xuXG4gIC8qXG4gICAgICovXG5cblxuICBjb25zdCBmaXJlVHJpZ2dlcnMgPSBhc3luYyAodHJpZ2dlckNyZWF0ZVF1b3RlKSA9PiB7XG4gICAgaWYgKCFoYXZlRmlyc3RRdW90ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFsuLi50cmlnZ2VycywgLi4uQXJyYXkuZnJvbShtdXRhYmxlVHJpZ2dlcnMudmFsdWVzKCkpXS5tYXAoKHRyaWdnZXIpID0+XG4gICAgICB0cmlnZ2VyKHRyaWdnZXJDcmVhdGVRdW90ZSlcbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIC8qXG4gIFxuICAgKi9cblxuXG4gIGNvbnN0IG1ha2VRdW90ZVdoZW5PdXQgPVxuICAoY29tcGFyZUFtb3VudHNGbikgPT5cbiAgLypcbiAgXG4gICAqL1xuXG5cblxuXG4gIGFzeW5jIChhbW91bnRJbiwgYW1vdW50T3V0TGltaXQpID0+IHtcbiAgICBhbW91bnRJbiA9IEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sIGFtb3VudEluKTtcbiAgICBhbW91bnRPdXRMaW1pdCA9IEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kT3V0LCBhbW91bnRPdXRMaW1pdCk7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgdHJpZ2dlclBLID0gbWFrZVByb21pc2VLaXQoKTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgdHJpZ2dlciA9IGFzeW5jIChjcmVhdGVJbnN0YW50UXVvdGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHF1b3RlUCA9IGNyZWF0ZUluc3RhbnRRdW90ZSgoY2FsY0Ftb3VudE91dCkgPT4ge1xuICAgICAgICAgIGlmICghdHJpZ2dlcnMuaGFzKHRyaWdnZXIpKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYW1vdW50T3V0ID0gY2FsY0Ftb3VudE91dChhbW91bnRJbik7XG5cbiAgICAgICAgICBpZiAoIWNvbXBhcmVBbW91bnRzRm4oYW1vdW50T3V0LCBhbW91bnRPdXRMaW1pdCkpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIHsgYW1vdW50SW4sIGFtb3VudE91dCB9O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXF1b3RlUCkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJpZ2dlcnMuZGVsZXRlKHRyaWdnZXIpO1xuICAgICAgICB0cmlnZ2VyUEsucmVzb2x2ZShxdW90ZVApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvL1xuICAgICAgICB0cmlnZ2VyUEsucmVqZWN0KGUpO1xuICAgICAgICB0cmlnZ2Vycy5kZWxldGUodHJpZ2dlcik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRyaWdnZXJzLmFkZCh0cmlnZ2VyKTtcblxuICAgIC8vXG4gICAgYXdhaXQgdHJpZ2dlcihjcmVhdGVRdW90ZSk7XG5cbiAgICByZXR1cm4gdHJpZ2dlclBLLnByb21pc2U7XG4gIH07XG5cbiAgLypcbiAgXG4gICAqL1xuXG5cbiAgY29uc3QgbWFrZU11dGFibGVRdW90ZSA9XG4gIChjb21wYXJlQW1vdW50c0ZuKSA9PlxuICAvKlxuICAgICAqL1xuXG5cbiAgYXN5bmMgKGFtb3VudEluLCBhbW91bnRPdXRMaW1pdCkgPT4ge1xuICAgIEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sIGFtb3VudEluKTtcbiAgICBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCwgYW1vdW50T3V0TGltaXQpO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IHRyaWdnZXJQSyA9IG1ha2VQcm9taXNlS2l0KCk7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBtdXRhYmxlUXVvdGUgPSBGYXIoJ011dGFibGVRdW90ZScsIHtcbiAgICAgIGNhbmNlbDogKGUpID0+IHRyaWdnZXJQSy5yZWplY3QoZSksXG4gICAgICB1cGRhdGVMZXZlbDogKG5ld0Ftb3VudEluLCBuZXdBbW91bnRPdXRMaW1pdCkgPT4ge1xuICAgICAgICBjb25zdCBjb2VyY2VkQW1vdW50SW4gPSBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLCBuZXdBbW91bnRJbik7XG4gICAgICAgIGNvbnN0IGNvZXJjZWRBbW91bnRPdXRMaW1pdCA9IEFtb3VudE1hdGguY29lcmNlKFxuICAgICAgICAgIGFjdHVhbEJyYW5kT3V0LFxuICAgICAgICAgIG5ld0Ftb3VudE91dExpbWl0XG4gICAgICAgICk7XG4gICAgICAgIGFtb3VudEluID0gY29lcmNlZEFtb3VudEluO1xuICAgICAgICBhbW91bnRPdXRMaW1pdCA9IGNvZXJjZWRBbW91bnRPdXRMaW1pdDtcbiAgICAgICAgdm9pZCBmaXJlVHJpZ2dlcnMoY3JlYXRlUXVvdGUpO1xuICAgICAgfSxcbiAgICAgIGdldFByb21pc2U6ICgpID0+IHRyaWdnZXJQSy5wcm9taXNlXG4gICAgfSk7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IG11dGFibGVUcmlnZ2VyID0gYXN5bmMgKGNyZWF0ZUluc3RhbnRRdW90ZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVvdGVQID0gY3JlYXRlSW5zdGFudFF1b3RlKChjYWxjQW1vdW50T3V0KSA9PiB7XG4gICAgICAgICAgaWYgKCFtdXRhYmxlVHJpZ2dlcnMuaGFzKG11dGFibGVRdW90ZSkpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhbW91bnRPdXQgPSBjYWxjQW1vdW50T3V0KGFtb3VudEluKTtcblxuICAgICAgICAgIGlmICghY29tcGFyZUFtb3VudHNGbihhbW91bnRPdXQsIGFtb3VudE91dExpbWl0KSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4geyBhbW91bnRJbiwgYW1vdW50T3V0IH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcXVvdGVQKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBtdXRhYmxlVHJpZ2dlcnMuZGVsZXRlKG11dGFibGVRdW90ZSk7XG4gICAgICAgIHRyaWdnZXJQSy5yZXNvbHZlKHF1b3RlUCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHRyaWdnZXJQSy5yZWplY3QoZSk7XG4gICAgICAgIG11dGFibGVUcmlnZ2Vycy5kZWxldGUobXV0YWJsZVF1b3RlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbXV0YWJsZVRyaWdnZXJzLnNldChtdXRhYmxlUXVvdGUsIG11dGFibGVUcmlnZ2VyKTtcblxuICAgIC8vXG4gICAgYXdhaXQgbXV0YWJsZVRyaWdnZXIoY3JlYXRlUXVvdGUpO1xuXG4gICAgcmV0dXJuIG11dGFibGVRdW90ZTtcbiAgfTtcblxuICAvKlxuICBcbiAgICAqL1xuXG5cblxuICBjb25zdCBhc3NlcnRCcmFuZHMgPSAoYnJhbmRJbiwgYnJhbmRPdXQpID0+IHtcbiAgICBicmFuZEluID09PSBhY3R1YWxCcmFuZEluIHx8XG4gICAgRmFpbGBEZXNpcmVkIGJyYW5kSW4gJHtxKGJyYW5kSW4pfSBtdXN0IG1hdGNoICR7cShhY3R1YWxCcmFuZEluKX1gO1xuICAgIGJyYW5kT3V0ID09PSBhY3R1YWxCcmFuZE91dCB8fFxuICAgIEZhaWxgRGVzaXJlZCBicmFuZE91dCAke3EoYnJhbmRPdXQpfSBtdXN0IG1hdGNoICR7cShhY3R1YWxCcmFuZE91dCl9YDtcbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwcmljZUF1dGhvcml0eSA9IEZhcignUHJpY2VBdXRob3JpdHknLCB7XG4gICAgZ2V0UXVvdGVJc3N1ZXIoYnJhbmRJbiwgYnJhbmRPdXQpIHtcbiAgICAgIGFzc2VydEJyYW5kcyhicmFuZEluLCBicmFuZE91dCk7XG4gICAgICByZXR1cm4gcXVvdGVJc3N1ZXI7XG4gICAgfSxcbiAgICBnZXRUaW1lclNlcnZpY2UoYnJhbmRJbiwgYnJhbmRPdXQpIHtcbiAgICAgIGFzc2VydEJyYW5kcyhicmFuZEluLCBicmFuZE91dCk7XG4gICAgICByZXR1cm4gdGltZXI7XG4gICAgfSxcbiAgICBtYWtlUXVvdGVOb3RpZmllcihhbW91bnRJbiwgYnJhbmRPdXQpIHtcbiAgICAgIEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sIGFtb3VudEluKTtcbiAgICAgIGFzc2VydEJyYW5kcyhhbW91bnRJbi5icmFuZCwgYnJhbmRPdXQpO1xuXG4gICAgICAvL1xuICAgICAgY29uc3Qgc3BlY2lmaWNCYXNlTm90aWZpZXIgPSBoYXJkZW4oe1xuICAgICAgICBhc3luYyBnZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCA9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpO1xuXG4gICAgICAgICAgLy9cbiAgICAgICAgICBsZXQgcXVvdGU7XG4gICAgICAgICAgLy9cblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBxdW90ZSA9IGNyZWF0ZVF1b3RlKChjYWxjQW1vdW50T3V0KSA9PiAoe1xuICAgICAgICAgICAgICBhbW91bnRJbixcbiAgICAgICAgICAgICAgYW1vdW50T3V0OiBjYWxjQW1vdW50T3V0KGFtb3VudEluKVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblxuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgIH1pZiAoIXF1b3RlKSB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYGNyZWF0ZVF1b3RlIHJldHVybmVkIG5vdGhpbmdgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcXVvdGU7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHVwZGF0ZUNvdW50OiByZWNvcmQudXBkYXRlQ291bnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCBzcGVjaWZpY05vdGlmaWVyID0gRmFyKCdRdW90ZU5vdGlmaWVyJywge1xuICAgICAgICAuLi5tYWtlTm90aWZpZXIoc3BlY2lmaWNCYXNlTm90aWZpZXIpLFxuICAgICAgICAvL1xuICAgICAgICAuLi5zcGVjaWZpY0Jhc2VOb3RpZmllclxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3BlY2lmaWNOb3RpZmllcjtcbiAgICB9LFxuICAgIGFzeW5jIHF1b3RlR2l2ZW4oYW1vdW50SW4sIGJyYW5kT3V0KSB7XG4gICAgICB0cmFjZSgncXVvdGVHaXZlbicsIGFtb3VudEluLCBicmFuZE91dCk7XG4gICAgICBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLCBhbW91bnRJbik7XG4gICAgICBhc3NlcnRCcmFuZHMoYW1vdW50SW4uYnJhbmQsIGJyYW5kT3V0KTtcblxuICAgICAgYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbiAgICAgIGNvbnN0IHF1b3RlID0gY3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQpID0+ICh7XG4gICAgICAgIGFtb3VudEluLFxuICAgICAgICBhbW91bnRPdXQ6IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pXG4gICAgICB9KSk7XG4gICAgICBhc3NlcnQocXVvdGUpO1xuICAgICAgcmV0dXJuIHF1b3RlO1xuICAgIH0sXG4gICAgYXN5bmMgcXVvdGVXYW50ZWQoYnJhbmRJbiwgYW1vdW50T3V0KSB7XG4gICAgICBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCwgYW1vdW50T3V0KTtcbiAgICAgIGFzc2VydEJyYW5kcyhicmFuZEluLCBhbW91bnRPdXQuYnJhbmQpO1xuXG4gICAgICBhd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSgpO1xuICAgICAgY29uc3QgcXVvdGUgPSBjcmVhdGVRdW90ZSgoY2FsY0Ftb3VudE91dCwgY2FsY0Ftb3VudEluKSA9PiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGFtb3VudEluID0gY2FsY0Ftb3VudEluKGFtb3VudE91dCk7XG4gICAgICAgIGNvbnN0IGFjdHVhbEFtb3VudE91dCA9IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pO1xuICAgICAgICBBbW91bnRNYXRoLmlzR1RFKGFjdHVhbEFtb3VudE91dCwgYW1vdW50T3V0KSB8fFxuICAgICAgICBGYWlsYENhbGN1bGF0aW9uIG9mICR7YWN0dWFsQW1vdW50T3V0fSBkaWRuJ3QgY292ZXIgZXhwZWN0ZWQgJHthbW91bnRPdXR9YDtcbiAgICAgICAgcmV0dXJuIHsgYW1vdW50SW4sIGFtb3VudE91dCB9O1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQocXVvdGUpO1xuICAgICAgcmV0dXJuIHF1b3RlO1xuICAgIH0sXG4gICAgYXN5bmMgcXVvdGVBdFRpbWUoZGVhZGxpbmUsIGFtb3VudEluLCBicmFuZE91dCkge1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgYW1vdW50SW4pO1xuICAgICAgYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLCBicmFuZE91dCk7XG5cbiAgICAgIGF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKCk7XG4gICAgICBjb25zdCBxdW90ZVBLID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgIGF3YWl0IEUodGltZXIpLnNldFdha2V1cChcbiAgICAgICAgZGVhZGxpbmUsXG4gICAgICAgIEZhcignd2FrZU9iaicsIHtcbiAgICAgICAgICBhc3luYyB3YWtlKHRpbWVzdGFtcCkge1xuICAgICAgICAgICAgYXdhaXQgbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHF1b3RlUCA9IGNyZWF0ZVF1b3RlKChjYWxjQW1vdW50T3V0KSA9PiAoe1xuICAgICAgICAgICAgICAgIGFtb3VudEluLFxuICAgICAgICAgICAgICAgIGFtb3VudE91dDogY2FsY0Ftb3VudE91dChhbW91bnRJbiksXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wXG4gICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBxdW90ZVBLLnJlc29sdmUocXVvdGVQKTtcbiAgICAgICAgICAgICAgYXdhaXQgcXVvdGVQSy5wcm9taXNlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBxdW90ZVBLLnJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvL1xuICAgICAgcmV0dXJuIHF1b3RlUEsucHJvbWlzZTtcbiAgICB9LFxuICAgIHF1b3RlV2hlbkxUOiBtYWtlUXVvdGVXaGVuT3V0KGlzTFQpLFxuICAgIHF1b3RlV2hlbkxURTogbWFrZVF1b3RlV2hlbk91dChpc0xURSksXG4gICAgcXVvdGVXaGVuR1RFOiBtYWtlUXVvdGVXaGVuT3V0KGlzR1RFKSxcbiAgICBxdW90ZVdoZW5HVDogbWFrZVF1b3RlV2hlbk91dChpc0dUKSxcbiAgICBtdXRhYmxlUXVvdGVXaGVuTFQ6IG1ha2VNdXRhYmxlUXVvdGUoaXNMVCksXG4gICAgbXV0YWJsZVF1b3RlV2hlbkxURTogbWFrZU11dGFibGVRdW90ZShpc0xURSksXG4gICAgbXV0YWJsZVF1b3RlV2hlbkdUOiBtYWtlTXV0YWJsZVF1b3RlKGlzR1QpLFxuICAgIG11dGFibGVRdW90ZVdoZW5HVEU6IG1ha2VNdXRhYmxlUXVvdGUoaXNHVEUpXG4gIH0pO1xuXG4gIHJldHVybiB7IHByaWNlQXV0aG9yaXR5LCBhZG1pbkZhY2V0OiB7IGZpcmVUcmlnZ2VycyB9IH07XG59OyRozY9fb25jZS5tYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQobWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlByaWNlQXV0aG9yaXR5SSI6WyJQcmljZUF1dGhvcml0eUkiXSwibWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0IjpbIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC6BKhXRgkAAEYJAAA1AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbmF0IiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBhZ29yaWMvZXJ0cCJdLCJleHBvcnRzIjpbImdldEFtb3VudEluIiwiZ2V0QW1vdW50T3V0IiwiZ2V0UHJpY2VEZXNjcmlwdGlvbiIsImdldFRpbWVzdGFtcCIsIm1ha2VQcmljZVF1b3RlSXNzdWVyIiwidW5pdEFtb3VudCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTmF0LEUsQW1vdW50TWF0aCxBc3NldEtpbmQsbWFrZUlzc3VlcktpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXSxbXCJBc3NldEtpbmRcIixbJGjNj19hID0+IChBc3NldEtpbmQgPSAkaM2PX2EpXV0sW1wibWFrZUlzc3VlcktpdFwiLFskaM2PX2EgPT4gKG1ha2VJc3N1ZXJLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLypcblxuICovXG5cbi8vXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuICovXG5jb25zdCBnZXRQcmljZURlc2NyaXB0aW9uID0gKHF1b3RlKSA9PiB7XG4gIHF1b3RlLnF1b3RlQW1vdW50LnZhbHVlLmxlbmd0aCA9PT0gMSB8fFxuICBGYWlsYHF1b3RlQW1vdW50IHNldCBtdXN0IGhhdmUgb25lIG1lbWJlcmA7XG4gIHJldHVybiBxdW90ZS5xdW90ZUFtb3VudC52YWx1ZVswXTtcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLmdldFByaWNlRGVzY3JpcHRpb24oZ2V0UHJpY2VEZXNjcmlwdGlvbik7XG5jb25zdCBnZXRBbW91bnRJbiA9IChxdW90ZSkgPT4gZ2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkuYW1vdW50SW47XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5nZXRBbW91bnRJbihnZXRBbW91bnRJbik7XG5jb25zdCBnZXRBbW91bnRPdXQgPSAocXVvdGUpID0+IGdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLmFtb3VudE91dDtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuZ2V0QW1vdW50T3V0KGdldEFtb3VudE91dCk7XG5jb25zdCBnZXRUaW1lc3RhbXAgPSAocXVvdGUpID0+IGdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLnRpbWVzdGFtcDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5nZXRUaW1lc3RhbXAoZ2V0VGltZXN0YW1wKTtcbmNvbnN0IHVuaXRBbW91bnQgPSBhc3luYyAoYnJhbmQpID0+IHtcbiAgLy9cbiAgY29uc3QgZGlzcGxheUluZm8gPSBhd2FpdCBFKGJyYW5kKS5nZXREaXNwbGF5SW5mbygpO1xuICBjb25zdCBkZWNpbWFsUGxhY2VzID0gZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyA/PyAwO1xuICByZXR1cm4gQW1vdW50TWF0aC5tYWtlKGJyYW5kLCAxMG4gKiogTmF0KGRlY2ltYWxQbGFjZXMpKTtcbn07JGjNj19vbmNlLnVuaXRBbW91bnQodW5pdEFtb3VudCk7XG5oYXJkZW4odW5pdEFtb3VudCk7XG5cbmNvbnN0IG1ha2VQcmljZVF1b3RlSXNzdWVyID0gKCkgPT5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8oXG5tYWtlSXNzdWVyS2l0KCdxdW90ZScsIEFzc2V0S2luZC5TRVQpXG4pOyRozY9fb25jZS5tYWtlUHJpY2VRdW90ZUlzc3VlcihtYWtlUHJpY2VRdW90ZUlzc3Vlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRQcmljZURlc2NyaXB0aW9uIjpbImdldFByaWNlRGVzY3JpcHRpb24iXSwiZ2V0QW1vdW50SW4iOlsiZ2V0QW1vdW50SW4iXSwiZ2V0QW1vdW50T3V0IjpbImdldEFtb3VudE91dCJdLCJnZXRUaW1lc3RhbXAiOlsiZ2V0VGltZXN0YW1wIl0sInVuaXRBbW91bnQiOlsidW5pdEFtb3VudCJdLCJtYWtlUHJpY2VRdW90ZUlzc3VlciI6WyJtYWtlUHJpY2VRdW90ZUlzc3VlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADQamy5ZCwAAGQsAAAwAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvZXJ0cCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9uYXQiLCIuL3NhZmVNYXRoLmpzIl0sImV4cG9ydHMiOlsiYWRkUmF0aW9zIiwiYXNzZXJ0SXNSYXRpbyIsImFzc2VydFBhcnNhYmxlTnVtYmVyIiwiY2VpbERpdmlkZUJ5IiwiY2VpbE11bHRpcGx5QnkiLCJkaXZpZGVCeSIsImZsb29yRGl2aWRlQnkiLCJmbG9vck11bHRpcGx5QnkiLCJpbnZlcnRSYXRpbyIsIm1ha2VSYXRpbyIsIm1ha2VSYXRpb0Zyb21BbW91bnRzIiwibXVsdGlwbHlCeSIsIm11bHRpcGx5UmF0aW9zIiwib25lTWludXMiLCJwYXJzZVJhdGlvIiwicXVhbnRpemUiLCJyYXRpb0dURSIsInJhdGlvVG9OdW1iZXIiLCJyYXRpb3NTYW1lIiwic3VidHJhY3RSYXRpb3MiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsQW1vdW50TWF0aCxhc3NlcnRSZWNvcmQsaXNOYXQsbmF0U2FmZU1hdGg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiaXNOYXRcIixbJGjNj19hID0+IChpc05hdCA9ICRozY9fYSldXV1dLFtcIi4vc2FmZU1hdGguanNcIiwgW1tcIm5hdFNhZmVNYXRoXCIsWyRozY9fYSA9PiAobmF0U2FmZU1hdGggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgeyBtdWx0aXBseSwgZmxvb3JEaXZpZGUsIGNlaWxEaXZpZGUsIGJhbmtlcnNEaXZpZGUsIGFkZCwgc3VidHJhY3QgfSA9XG5uYXRTYWZlTWF0aDtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG5jb25zdCBQRVJDRU5UID0gMTAwbjtcblxuY29uc3QgcmF0aW9Qcm9wZXJ0eU5hbWVzID0gWydudW1lcmF0b3InLCAnZGVub21pbmF0b3InXTtcblxuY29uc3QgYXNzZXJ0SXNSYXRpbyA9IChyYXRpbykgPT4ge1xuICBhc3NlcnRSZWNvcmQocmF0aW8sICdyYXRpbycpO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmF0aW8pO1xuICBrZXlzLmxlbmd0aCA9PT0gMiB8fCBGYWlsYFJhdGlvICR7cmF0aW99IG11c3QgYmUgYSByZWNvcmQgd2l0aCAyIGZpZWxkcy5gO1xuICBmb3IgKGNvbnN0IG5hbWUgb2Yga2V5cykge1xuICAgIHJhdGlvUHJvcGVydHlOYW1lcy5pbmNsdWRlcyhuYW1lKSB8fFxuICAgIEZhaWxgUGFyYW1ldGVyIG11c3QgYmUgYSBSYXRpbyByZWNvcmQsIGJ1dCAke3JhdGlvfSBoYXMgJHtxKG5hbWUpfWA7XG4gIH1cbiAgY29uc3QgbnVtZXJhdG9yVmFsdWUgPSByYXRpby5udW1lcmF0b3IudmFsdWU7XG4gIGNvbnN0IGRlbm9taW5hdG9yVmFsdWUgPSByYXRpby5kZW5vbWluYXRvci52YWx1ZTtcbiAgaXNOYXQobnVtZXJhdG9yVmFsdWUpIHx8XG4gIEZhaWxgVGhlIG51bWVyYXRvciB2YWx1ZSBtdXN0IGJlIGEgTmF0VmFsdWUsIG5vdCAke251bWVyYXRvclZhbHVlfWA7XG4gIGlzTmF0KGRlbm9taW5hdG9yVmFsdWUpIHx8XG4gIEZhaWxgVGhlIGRlbm9taW5hdG9yIHZhbHVlIG11c3QgYmUgYSBOYXRWYWx1ZSwgbm90ICR7ZGVub21pbmF0b3JWYWx1ZX1gO1xufTtcblxuLypcblxuXG5cblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0SXNSYXRpbyhhc3NlcnRJc1JhdGlvKTtcbmNvbnN0IG1ha2VSYXRpbyA9IChcbm51bWVyYXRvcixcbm51bWVyYXRvckJyYW5kLFxuZGVub21pbmF0b3IgPSBQRVJDRU5ULFxuZGVub21pbmF0b3JCcmFuZCA9IG51bWVyYXRvckJyYW5kKSA9Plxue1xuICBkZW5vbWluYXRvciA+IDBuIHx8XG4gIEZhaWxgTm8gaW5maW5pdGUgcmF0aW9zISBEZW5vbWluYXRvciB3YXMgMCAke3EoZGVub21pbmF0b3JCcmFuZCl9YDtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBudW1lcmF0b3I6IEFtb3VudE1hdGgubWFrZShudW1lcmF0b3JCcmFuZCwgbnVtZXJhdG9yKSxcbiAgICBkZW5vbWluYXRvcjogQW1vdW50TWF0aC5tYWtlKGRlbm9taW5hdG9yQnJhbmQsIGRlbm9taW5hdG9yKVxuICB9KTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZVJhdGlvKG1ha2VSYXRpbyk7XG5jb25zdCBtYWtlUmF0aW9Gcm9tQW1vdW50cyA9IChudW1lcmF0b3JBbW91bnQsIGRlbm9taW5hdG9yQW1vdW50KSA9PiB7XG4gIEFtb3VudE1hdGguY29lcmNlKG51bWVyYXRvckFtb3VudC5icmFuZCwgbnVtZXJhdG9yQW1vdW50KTtcbiAgQW1vdW50TWF0aC5jb2VyY2UoZGVub21pbmF0b3JBbW91bnQuYnJhbmQsIGRlbm9taW5hdG9yQW1vdW50KTtcbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICAvL1xuICAgIG51bWVyYXRvckFtb3VudC52YWx1ZSxcbiAgICBudW1lcmF0b3JBbW91bnQuYnJhbmQsXG4gICAgZGVub21pbmF0b3JBbW91bnQudmFsdWUsXG4gICAgZGVub21pbmF0b3JBbW91bnQuYnJhbmRcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlUmF0aW9Gcm9tQW1vdW50cyhtYWtlUmF0aW9Gcm9tQW1vdW50cyk7XG5jb25zdCBtdWx0aXBseUhlbHBlciA9IChhbW91bnQsIHJhdGlvLCBkaXZpZGVPcCkgPT4ge1xuICBBbW91bnRNYXRoLmNvZXJjZShhbW91bnQuYnJhbmQsIGFtb3VudCk7XG4gIGFzc2VydElzUmF0aW8ocmF0aW8pO1xuICBhbW91bnQuYnJhbmQgPT09IHJhdGlvLmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gIEZhaWxgYW1vdW50J3MgYnJhbmQgJHtxKGFtb3VudC5icmFuZCl9IG11c3QgbWF0Y2ggcmF0aW8ncyBkZW5vbWluYXRvciAke3EoXG4gICAgcmF0aW8uZGVub21pbmF0b3IuYnJhbmRcbiAgKX1gO1xuXG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICovKFxuICBBbW91bnRNYXRoLm1ha2UoXG4gICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuICAgIGRpdmlkZU9wKFxuICAgICAgbXVsdGlwbHkoYW1vdW50LnZhbHVlLCByYXRpby5udW1lcmF0b3IudmFsdWUpLFxuICAgICAgcmF0aW8uZGVub21pbmF0b3IudmFsdWVcbiAgICApXG4gIClcbiAgKTtcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBmbG9vck11bHRpcGx5QnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LCByYXRpbywgZmxvb3JEaXZpZGUpO1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuZmxvb3JNdWx0aXBseUJ5KGZsb29yTXVsdGlwbHlCeSk7XG5jb25zdCBjZWlsTXVsdGlwbHlCeSA9IChhbW91bnQsIHJhdGlvKSA9PiB7XG4gIHJldHVybiBtdWx0aXBseUhlbHBlcihhbW91bnQsIHJhdGlvLCBjZWlsRGl2aWRlKTtcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLmNlaWxNdWx0aXBseUJ5KGNlaWxNdWx0aXBseUJ5KTtcbmNvbnN0IG11bHRpcGx5QnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LCByYXRpbywgYmFua2Vyc0RpdmlkZSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UubXVsdGlwbHlCeShtdWx0aXBseUJ5KTtcbmNvbnN0IGRpdmlkZUhlbHBlciA9IChhbW91bnQsIHJhdGlvLCBkaXZpZGVPcCkgPT4ge1xuICBBbW91bnRNYXRoLmNvZXJjZShhbW91bnQuYnJhbmQsIGFtb3VudCk7XG4gIGFzc2VydElzUmF0aW8ocmF0aW8pO1xuICBhbW91bnQuYnJhbmQgPT09IHJhdGlvLm51bWVyYXRvci5icmFuZCB8fFxuICBGYWlsYGFtb3VudCdzIGJyYW5kICR7cShhbW91bnQuYnJhbmQpfSBtdXN0IG1hdGNoIHJhdGlvJ3MgbnVtZXJhdG9yICR7cShcbiAgICByYXRpby5udW1lcmF0b3IuYnJhbmRcbiAgKX1gO1xuXG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICovKFxuICBBbW91bnRNYXRoLm1ha2UoXG4gICAgcmF0aW8uZGVub21pbmF0b3IuYnJhbmQsXG4gICAgZGl2aWRlT3AoXG4gICAgICBtdWx0aXBseShhbW91bnQudmFsdWUsIHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlKSxcbiAgICAgIHJhdGlvLm51bWVyYXRvci52YWx1ZVxuICAgIClcbiAgKVxuICApO1xufTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGZsb29yRGl2aWRlQnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCwgcmF0aW8sIGZsb29yRGl2aWRlKTtcbn07XG5cbi8qXG5cblxuICovJGjNj19vbmNlLmZsb29yRGl2aWRlQnkoZmxvb3JEaXZpZGVCeSk7XG5jb25zdCBjZWlsRGl2aWRlQnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCwgcmF0aW8sIGNlaWxEaXZpZGUpO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuY2VpbERpdmlkZUJ5KGNlaWxEaXZpZGVCeSk7XG5jb25zdCBkaXZpZGVCeSA9IChhbW91bnQsIHJhdGlvKSA9PiB7XG4gIHJldHVybiBkaXZpZGVIZWxwZXIoYW1vdW50LCByYXRpbywgYmFua2Vyc0RpdmlkZSk7XG59O1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5kaXZpZGVCeShkaXZpZGVCeSk7XG5jb25zdCBpbnZlcnRSYXRpbyA9IChyYXRpbykgPT4ge1xuICBhc3NlcnRJc1JhdGlvKHJhdGlvKTtcblxuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIC8qICAgICAgICAgICAgICAgICAgICovKHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlKSxcbiAgICByYXRpby5kZW5vbWluYXRvci5icmFuZCxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAqLyhyYXRpby5udW1lcmF0b3IudmFsdWUpLFxuICAgIHJhdGlvLm51bWVyYXRvci5icmFuZFxuICApO1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5pbnZlcnRSYXRpbyhpbnZlcnRSYXRpbyk7XG5jb25zdCBhZGRSYXRpb3MgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG4gIGFzc2VydElzUmF0aW8obGVmdCk7XG4gIGxlZnQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5udW1lcmF0b3IuYnJhbmQgfHxcbiAgRmFpbGBudW1lcmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gO1xuICBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kID09PSByaWdodC5kZW5vbWluYXRvci5icmFuZCB8fFxuICBGYWlsYGRlbm9taW5hdG9yIGJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIGFkZChcbiAgICAgIG11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksIC8vXG4gICAgICBtdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLCByaWdodC5udW1lcmF0b3IudmFsdWUpIC8vXG4gICAgKSwgLy9cbiAgICBsZWZ0Lm51bWVyYXRvci5icmFuZCxcbiAgICBtdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksIC8vXG4gICAgbGVmdC5kZW5vbWluYXRvci5icmFuZFxuICApO1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5hZGRSYXRpb3MoYWRkUmF0aW9zKTtcbmNvbnN0IHN1YnRyYWN0UmF0aW9zID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGFzc2VydElzUmF0aW8ocmlnaHQpO1xuICBhc3NlcnRJc1JhdGlvKGxlZnQpO1xuICBsZWZ0Lm51bWVyYXRvci5icmFuZCA9PT0gcmlnaHQubnVtZXJhdG9yLmJyYW5kIHx8XG4gIEZhaWxgbnVtZXJhdG9yIGJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcbiAgbGVmdC5kZW5vbWluYXRvci5icmFuZCA9PT0gcmlnaHQuZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgRmFpbGBkZW5vbWluYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG5cbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBzdWJ0cmFjdChcbiAgICAgIG11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksIC8vXG4gICAgICBtdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLCByaWdodC5udW1lcmF0b3IudmFsdWUpIC8vXG4gICAgKSwgLy9cbiAgICBsZWZ0Lm51bWVyYXRvci5icmFuZCxcbiAgICBtdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksIC8vXG4gICAgbGVmdC5kZW5vbWluYXRvci5icmFuZFxuICApO1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5zdWJ0cmFjdFJhdGlvcyhzdWJ0cmFjdFJhdGlvcyk7XG5jb25zdCBtdWx0aXBseVJhdGlvcyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICBhc3NlcnRJc1JhdGlvKHJpZ2h0KTtcbiAgYXNzZXJ0SXNSYXRpbyhsZWZ0KTtcblxuICBjb25zdCBnZXRSZW1haW5pbmdCcmFuZHMgPSAoKSA9PiB7XG4gICAgLy9cbiAgICBpZiAocmlnaHQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5kZW5vbWluYXRvci5icmFuZCkge1xuICAgICAgcmV0dXJuIFtsZWZ0Lm51bWVyYXRvci5icmFuZCwgbGVmdC5kZW5vbWluYXRvci5icmFuZF07XG4gICAgfVxuICAgIGlmIChyaWdodC5udW1lcmF0b3IuYnJhbmQgPT09IGxlZnQuZGVub21pbmF0b3IuYnJhbmQpIHtcbiAgICAgIHJldHVybiBbbGVmdC5udW1lcmF0b3IuYnJhbmQsIHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiAgICB9XG4gICAgaWYgKGxlZnQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5kZW5vbWluYXRvci5icmFuZCkge1xuICAgICAgcmV0dXJuIFtyaWdodC5udW1lcmF0b3IuYnJhbmQsIGxlZnQuZGVub21pbmF0b3IuYnJhbmRdO1xuICAgIH1cbiAgICBpZiAobGVmdC5udW1lcmF0b3IuYnJhbmQgPT09IGxlZnQuZGVub21pbmF0b3IuYnJhbmQpIHtcbiAgICAgIHJldHVybiBbcmlnaHQubnVtZXJhdG9yLmJyYW5kLCByaWdodC5kZW5vbWluYXRvci5icmFuZF07XG4gICAgfVxuICAgIHRocm93IEZhaWxgYXQgbGVhc3Qgb25lIGJyYW5kIG11c3QgY2FuY2VsIG91dDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG4gIH07XG5cbiAgY29uc3QgW251bWVyYXRvckJyYW5kLCBkZW5vbWluYXRvckJyYW5kXSA9IGdldFJlbWFpbmluZ0JyYW5kcygpO1xuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIG11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLCByaWdodC5udW1lcmF0b3IudmFsdWUpLFxuICAgIG51bWVyYXRvckJyYW5kLFxuICAgIG11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUsIHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSxcbiAgICBkZW5vbWluYXRvckJyYW5kXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UubXVsdGlwbHlSYXRpb3MobXVsdGlwbHlSYXRpb3MpO1xuY29uc3Qgb25lTWludXMgPSAocmF0aW8pID0+IHtcbiAgYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG4gIHJhdGlvLm51bWVyYXRvci5icmFuZCA9PT0gcmF0aW8uZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgRmFpbGBvbmVNaW51cyBvbmx5IHN1cHBvcnRzIHJhdGlvcyB3aXRoIGEgc2luZ2xlIGJyYW5kLCBidXQgJHtyYXRpby5udW1lcmF0b3IuYnJhbmR9IGRvZXNuJ3QgbWF0Y2ggJHtyYXRpby5kZW5vbWluYXRvci5icmFuZH1gO1xuICByYXRpby5udW1lcmF0b3IudmFsdWUgPD0gcmF0aW8uZGVub21pbmF0b3IudmFsdWUgfHxcbiAgRmFpbGBQYXJhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTogJHtyYXRpby5udW1lcmF0b3IudmFsdWV9LyR7cmF0aW8uZGVub21pbmF0b3IudmFsdWV9YDtcbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBzdWJ0cmFjdChyYXRpby5kZW5vbWluYXRvci52YWx1ZSwgcmF0aW8ubnVtZXJhdG9yLnZhbHVlKSxcbiAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICAgcmF0aW8uZGVub21pbmF0b3IudmFsdWUsXG4gICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kXG4gICk7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLm9uZU1pbnVzKG9uZU1pbnVzKTtcbmNvbnN0IHJhdGlvR1RFID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGlmIChsZWZ0Lm51bWVyYXRvci5icmFuZCA9PT0gcmlnaHQubnVtZXJhdG9yLmJyYW5kKSB7XG4gICAgbGVmdC5kZW5vbWluYXRvci5icmFuZCA9PT0gcmlnaHQuZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYG51bWVyYXRvciBicmFuZHMgbWF0Y2gsIGJ1dCBkZW5vbWluYXRvciBicmFuZHMgZG9uJ3Q6ICR7cShsZWZ0KX0gJHtxKFxuICAgICAgcmlnaHRcbiAgICApfWA7XG4gIH0gZWxzZSBpZiAobGVmdC5udW1lcmF0b3IuYnJhbmQgPT09IGxlZnQuZGVub21pbmF0b3IuYnJhbmQpIHtcbiAgICByaWdodC5udW1lcmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBsZWZ0aGFuZCBicmFuZHMgbWF0Y2gsIGJ1dCByaWdodGhhbmQgYnJhbmRzIGRvbid0OiAke3EobGVmdCl9ICR7cShcbiAgICAgIHJpZ2h0XG4gICAgKX1gO1xuICB9XG4gIHJldHVybiBuYXRTYWZlTWF0aC5pc0dURShcbiAgICBtdWx0aXBseShsZWZ0Lm51bWVyYXRvci52YWx1ZSwgcmlnaHQuZGVub21pbmF0b3IudmFsdWUpLFxuICAgIG11bHRpcGx5KHJpZ2h0Lm51bWVyYXRvci52YWx1ZSwgbGVmdC5kZW5vbWluYXRvci52YWx1ZSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLnJhdGlvR1RFKHJhdGlvR1RFKTtcbmNvbnN0IHJhdGlvc1NhbWUgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIChcbiAgQW1vdW50TWF0aC5pc0VxdWFsKGxlZnQubnVtZXJhdG9yLCByaWdodC5udW1lcmF0b3IpICYmXG4gIEFtb3VudE1hdGguaXNFcXVhbChsZWZ0LmRlbm9taW5hdG9yLCByaWdodC5kZW5vbWluYXRvcilcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UucmF0aW9zU2FtZShyYXRpb3NTYW1lKTtcbmNvbnN0IHF1YW50aXplID0gKHJhdGlvLCBuZXdEZW4pID0+IHtcbiAgY29uc3Qgb2xkRGVuID0gcmF0aW8uZGVub21pbmF0b3IudmFsdWU7XG4gIGNvbnN0IG9sZE51bSA9IHJhdGlvLm51bWVyYXRvci52YWx1ZTtcbiAgaWYgKG5ld0RlbiA+IG9sZERlbikge1xuICAgIHJldHVybiByYXRpbztcbiAgfVxuXG4gIGNvbnN0IG5ld051bSA9XG4gIG5ld0RlbiA9PT0gb2xkRGVuID8gb2xkTnVtIDogYmFua2Vyc0RpdmlkZShvbGROdW0gKiBuZXdEZW4sIG9sZERlbik7XG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgbmV3TnVtLFxuICAgIHJhdGlvLm51bWVyYXRvci5icmFuZCxcbiAgICBuZXdEZW4sXG4gICAgcmF0aW8uZGVub21pbmF0b3IuYnJhbmRcbiAgKTtcbn07JGjNj19vbmNlLnF1YW50aXplKHF1YW50aXplKTtcblxuY29uc3QgTlVNRVJJQ19SRSA9IC9eKFxcZFxcZCopKD86XFwuKFxcZCopKT8kLztcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBwYXJzZVJhdGlvID0gKFxubnVtZXJpYyxcbm51bWVyYXRvckJyYW5kLFxuZGVub21pbmF0b3JCcmFuZCA9IG51bWVyYXRvckJyYW5kKSA9Plxue1xuICBjb25zdCBtYXRjaCA9IGAke251bWVyaWN9YC5tYXRjaChOVU1FUklDX1JFKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IEZhaWxgSW52YWxpZCBudW1lcmljIGRhdGE6ICR7bnVtZXJpY31gO1xuICB9XG5cbiAgY29uc3QgW18sIHdob2xlLCBwYXJ0ID0gJyddID0gbWF0Y2g7XG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgQmlnSW50KGAke3dob2xlfSR7cGFydH1gKSxcbiAgICBudW1lcmF0b3JCcmFuZCxcbiAgICAxMG4gKiogQmlnSW50KHBhcnQubGVuZ3RoKSxcbiAgICBkZW5vbWluYXRvckJyYW5kXG4gICk7XG59O1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5wYXJzZVJhdGlvKHBhcnNlUmF0aW8pO1xuY29uc3QgYXNzZXJ0UGFyc2FibGVOdW1iZXIgPSAoc3BlY2ltZW4pID0+IHtcbiAgY29uc3QgbWF0Y2ggPSBgJHtzcGVjaW1lbn1gLm1hdGNoKE5VTUVSSUNfUkUpO1xuICBtYXRjaCB8fCBGYWlsYEludmFsaWQgbnVtZXJpYyBkYXRhOiAke3NwZWNpbWVufWA7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0UGFyc2FibGVOdW1iZXIoYXNzZXJ0UGFyc2FibGVOdW1iZXIpO1xuY29uc3QgcmF0aW9Ub051bWJlciA9IChyYXRpbykgPT4ge1xuICBjb25zdCBuID0gTnVtYmVyKHJhdGlvLm51bWVyYXRvci52YWx1ZSk7XG4gIGNvbnN0IGQgPSBOdW1iZXIocmF0aW8uZGVub21pbmF0b3IudmFsdWUpO1xuICByZXR1cm4gbiAvIGQ7XG59OyRozY9fb25jZS5yYXRpb1RvTnVtYmVyKHJhdGlvVG9OdW1iZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SXNSYXRpbyI6WyJhc3NlcnRJc1JhdGlvIl0sIm1ha2VSYXRpbyI6WyJtYWtlUmF0aW8iXSwibWFrZVJhdGlvRnJvbUFtb3VudHMiOlsibWFrZVJhdGlvRnJvbUFtb3VudHMiXSwiZmxvb3JNdWx0aXBseUJ5IjpbImZsb29yTXVsdGlwbHlCeSJdLCJjZWlsTXVsdGlwbHlCeSI6WyJjZWlsTXVsdGlwbHlCeSJdLCJtdWx0aXBseUJ5IjpbIm11bHRpcGx5QnkiXSwiZmxvb3JEaXZpZGVCeSI6WyJmbG9vckRpdmlkZUJ5Il0sImNlaWxEaXZpZGVCeSI6WyJjZWlsRGl2aWRlQnkiXSwiZGl2aWRlQnkiOlsiZGl2aWRlQnkiXSwiaW52ZXJ0UmF0aW8iOlsiaW52ZXJ0UmF0aW8iXSwiYWRkUmF0aW9zIjpbImFkZFJhdGlvcyJdLCJzdWJ0cmFjdFJhdGlvcyI6WyJzdWJ0cmFjdFJhdGlvcyJdLCJtdWx0aXBseVJhdGlvcyI6WyJtdWx0aXBseVJhdGlvcyJdLCJvbmVNaW51cyI6WyJvbmVNaW51cyJdLCJyYXRpb0dURSI6WyJyYXRpb0dURSJdLCJyYXRpb3NTYW1lIjpbInJhdGlvc1NhbWUiXSwicXVhbnRpemUiOlsicXVhbnRpemUiXSwicGFyc2VSYXRpbyI6WyJwYXJzZVJhdGlvIl0sImFzc2VydFBhcnNhYmxlTnVtYmVyIjpbImFzc2VydFBhcnNhYmxlTnVtYmVyIl0sInJhdGlvVG9OdW1iZXIiOlsicmF0aW9Ub051bWJlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADTFxpxFxwAABccAAAzAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJSZWNvcmRlcktpdFNoYXBlIiwiZGVmaW5lRVJlY29yZGVyS2l0IiwiZGVmaW5lUmVjb3JkZXJLaXQiLCJwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzIiwicHJlcGFyZVJlY29yZGVyIiwicHJlcGFyZVJlY29yZGVyS2l0IiwicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxTdG9yYWdlTm9kZVNoYXBlLHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCxtYWtlRmFrZU1hcnNoYWxsZXIsbWFrZUZha2VTdG9yYWdlLG11c3RNYXRjaCxNLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxwcmVwYXJlRXhvQ2xhc3MsRTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJTdG9yYWdlTm9kZVNoYXBlXCIsWyRozY9fYSA9PiAoU3RvcmFnZU5vZGVTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzXCIsIFtbXCJtYWtlRmFrZU1hcnNoYWxsZXJcIixbJGjNj19hID0+IChtYWtlRmFrZU1hcnNoYWxsZXIgPSAkaM2PX2EpXV0sW1wibWFrZUZha2VTdG9yYWdlXCIsWyRozY9fYSA9PiAobWFrZUZha2VTdG9yYWdlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBwcmVwYXJlUmVjb3JkZXIgPSAoYmFnZ2FnZSwgbWFyc2hhbGxlcikgPT4ge1xuICBjb25zdCBtYWtlUmVjb3JkZXIgPSBwcmVwYXJlRXhvQ2xhc3MoXG4gICAgYmFnZ2FnZSxcbiAgICAnUmVjb3JkZXInLFxuICAgIE0uaW50ZXJmYWNlKCdSZWNvcmRlcicsIHtcbiAgICAgIGdldFN0b3JhZ2VOb2RlOiBNLmNhbGwoKS5yZXR1cm5zKFN0b3JhZ2VOb2RlU2hhcGUpLFxuICAgICAgZ2V0U3RvcmFnZVBhdGg6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCAvKiAgICAgICAgKi8pKSxcbiAgICAgIHdyaXRlOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICB3cml0ZUZpbmFsOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSlcbiAgICB9KSxcbiAgICAvKlxuICAgICAgICAgKi9cblxuXG5cblxuICAgIChcbiAgICBwdWJsaXNoZXIsXG4gICAgc3RvcmFnZU5vZGUsXG4gICAgdmFsdWVTaGFwZSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovKE0uYW55KCkpKSA9PlxuICAgIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgICAgIHB1Ymxpc2hlcixcbiAgICAgICAgc3RvcmFnZU5vZGUsXG4gICAgICAgIHN0b3JhZ2VQYXRoOiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8odW5kZWZpbmVkKSxcbiAgICAgICAgdmFsdWVTaGFwZVxuICAgICAgfTtcbiAgICB9LFxuICAgIHtcbiAgICAgIGdldFN0b3JhZ2VOb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdG9yYWdlTm9kZTtcbiAgICAgIH0sXG4gICAgICAvKlxuICAgICAgICAgICovXG5cblxuXG4gICAgICBhc3luYyBnZXRTdG9yYWdlUGF0aCgpIHtcbiAgICAgICAgY29uc3QgeyBzdG9yYWdlUGF0aDogaGVsZFBhdGggfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIC8vXG4gICAgICAgIGF3YWl0IG51bGw7XG4gICAgICAgIGlmIChoZWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGhlbGRQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCBFKHRoaXMuc3RhdGUuc3RvcmFnZU5vZGUpLmdldFBhdGgoKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5zdG9yYWdlUGF0aCA9IHBhdGg7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfSxcbiAgICAgIC8qXG4gICAgICAgICAgICovXG5cblxuXG5cbiAgICAgIGFzeW5jIHdyaXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgY2xvc2VkLCBwdWJsaXNoZXIsIHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAhY2xvc2VkIHx8IEZhaWxgY2Fubm90IHdyaXRlIHRvIGNsb3NlZCByZWNvcmRlcmA7XG4gICAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSk7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgICAgYXdhaXQgRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hlci5wdWJsaXNoKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICAvKlxuICAgICAgICAgICAqL1xuXG5cblxuXG4gICAgICBhc3luYyB3cml0ZUZpbmFsKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgY2xvc2VkLCBwdWJsaXNoZXIsIHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAhY2xvc2VkIHx8IEZhaWxgY2Fubm90IHdyaXRlIHRvIGNsb3NlZCByZWNvcmRlcmA7XG4gICAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSk7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgICAgYXdhaXQgRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5zdGF0ZS5jbG9zZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcHVibGlzaGVyLmZpbmlzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICApO1xuXG4gIHJldHVybiBtYWtlUmVjb3JkZXI7XG59OyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXIocHJlcGFyZVJlY29yZGVyKTtcbmhhcmRlbihwcmVwYXJlUmVjb3JkZXIpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGRlZmluZVJlY29yZGVyS2l0ID0gKHsgbWFrZVJlY29yZGVyLCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQgfSkgPT4ge1xuICAvKlxuICBcbiAgICAqL1xuXG5cblxuICBjb25zdCBtYWtlUmVjb3JkZXJLaXQgPSAoc3RvcmFnZU5vZGUsIHZhbHVlU2hhcGUpID0+IHtcbiAgICBjb25zdCB7IHN1YnNjcmliZXIsIHB1Ymxpc2hlciB9ID0gbWFrZUR1cmFibGVQdWJsaXNoS2l0KCk7XG4gICAgY29uc3QgcmVjb3JkZXIgPSBtYWtlUmVjb3JkZXIoXG4gICAgICBwdWJsaXNoZXIsXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyhcbiAgICAgIHN0b3JhZ2VOb2RlXG4gICAgICApLFxuICAgICAgdmFsdWVTaGFwZVxuICAgICk7XG4gICAgcmV0dXJuIGhhcmRlbih7IHN1YnNjcmliZXIsIHJlY29yZGVyIH0pO1xuICB9O1xuICByZXR1cm4gbWFrZVJlY29yZGVyS2l0O1xufTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVmaW5lUmVjb3JkZXJLaXQoZGVmaW5lUmVjb3JkZXJLaXQpO1xuY29uc3QgZGVmaW5lRVJlY29yZGVyS2l0ID0gKHsgbWFrZVJlY29yZGVyLCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQgfSkgPT4ge1xuICAvKlxuICBcbiAgICAqL1xuXG5cblxuICBjb25zdCBtYWtlRVJlY29yZGVyS2l0ID0gKHN0b3JhZ2VOb2RlUCwgdmFsdWVTaGFwZSkgPT4ge1xuICAgIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQoKTtcbiAgICBjb25zdCByZWNvcmRlclAgPSBFLndoZW4oc3RvcmFnZU5vZGVQLCAoc3RvcmFnZU5vZGUpID0+XG4gICAgbWFrZVJlY29yZGVyKFxuICAgICAgcHVibGlzaGVyLFxuICAgICAgLy9cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovKHN0b3JhZ2VOb2RlKSxcbiAgICAgIHZhbHVlU2hhcGVcbiAgICApXG4gICAgKTtcbiAgICByZXR1cm4geyBzdWJzY3JpYmVyLCByZWNvcmRlclAgfTtcbiAgfTtcbiAgcmV0dXJuIG1ha2VFUmVjb3JkZXJLaXQ7XG59OyRozY9fb25jZS5kZWZpbmVFUmVjb3JkZXJLaXQoZGVmaW5lRVJlY29yZGVyS2l0KTtcbmhhcmRlbihkZWZpbmVFUmVjb3JkZXJLaXQpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcHJlcGFyZVJlY29yZGVyS2l0ID0gKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpID0+IHtcbiAgY29uc3QgbWFrZUR1cmFibGVQdWJsaXNoS2l0ID0gcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ0R1cmFibGUgUHVibGlzaCBLaXQnXG4gICk7XG4gIGNvbnN0IG1ha2VSZWNvcmRlciA9IHByZXBhcmVSZWNvcmRlcihiYWdnYWdlLCBtYXJzaGFsbGVyKTtcbiAgcmV0dXJuIGRlZmluZVJlY29yZGVyS2l0KHsgbWFrZUR1cmFibGVQdWJsaXNoS2l0LCBtYWtlUmVjb3JkZXIgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLnByZXBhcmVSZWNvcmRlcktpdChwcmVwYXJlUmVjb3JkZXJLaXQpO1xuY29uc3QgcHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzID0gKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpID0+IHtcbiAgY29uc3QgbWFrZUR1cmFibGVQdWJsaXNoS2l0ID0gcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ0R1cmFibGUgUHVibGlzaCBLaXQnXG4gICk7XG4gIGNvbnN0IG1ha2VSZWNvcmRlciA9IHByZXBhcmVSZWNvcmRlcihiYWdnYWdlLCBtYXJzaGFsbGVyKTtcblxuICBjb25zdCBtYWtlUmVjb3JkZXJLaXQgPSBkZWZpbmVSZWNvcmRlcktpdCh7XG4gICAgbWFrZVJlY29yZGVyLFxuICAgIG1ha2VEdXJhYmxlUHVibGlzaEtpdFxuICB9KTtcbiAgY29uc3QgbWFrZUVSZWNvcmRlcktpdCA9IGRlZmluZUVSZWNvcmRlcktpdCh7XG4gICAgbWFrZVJlY29yZGVyLFxuICAgIG1ha2VEdXJhYmxlUHVibGlzaEtpdFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG1ha2VEdXJhYmxlUHVibGlzaEtpdCxcbiAgICBtYWtlUmVjb3JkZXIsXG4gICAgbWFrZVJlY29yZGVyS2l0LFxuICAgIG1ha2VFUmVjb3JkZXJLaXRcbiAgfTtcbn07XG5cbi8qXG5cbiAqLyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMocHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKTtcbmNvbnN0IHByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMgPSAoKSA9PiB7XG4gIGNvbnN0IGJhZ2dhZ2UgPSBtYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ21vY2sgcmVjb3JkZXIgYmFnZ2FnZScpO1xuICBjb25zdCBtYXJzaGFsbGVyID0gbWFrZUZha2VNYXJzaGFsbGVyKCk7XG4gIHJldHVybiB7XG4gICAgLi4ucHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpLFxuICAgIHN0b3JhZ2VOb2RlOiBtYWtlRmFrZVN0b3JhZ2UoJ21vY2sgcmVjb3JkZXIgc3RvcmFnZScpXG4gIH07XG59OyRozY9fb25jZS5wcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzKHByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMpO1xuXG5jb25zdCBSZWNvcmRlcktpdFNoYXBlID0ge1xuICByZWNvcmRlcjogTS5yZW1vdGFibGUoKSxcbiAgc3Vic2NyaWJlcjogTS5yZW1vdGFibGUoKVxufTskaM2PX29uY2UuUmVjb3JkZXJLaXRTaGFwZShSZWNvcmRlcktpdFNoYXBlKTtcbmhhcmRlbihSZWNvcmRlcktpdFNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVSZWNvcmRlciI6WyJwcmVwYXJlUmVjb3JkZXIiXSwiZGVmaW5lUmVjb3JkZXJLaXQiOlsiZGVmaW5lUmVjb3JkZXJLaXQiXSwiZGVmaW5lRVJlY29yZGVyS2l0IjpbImRlZmluZUVSZWNvcmRlcktpdCJdLCJwcmVwYXJlUmVjb3JkZXJLaXQiOlsicHJlcGFyZVJlY29yZGVyS2l0Il0sInByZXBhcmVSZWNvcmRlcktpdE1ha2VycyI6WyJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMiXSwicHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyI6WyJwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzIl0sIlJlY29yZGVyS2l0U2hhcGUiOlsiUmVjb3JkZXJLaXRTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADl7gszkgUAAJIFAAAzAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3NhZmVNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm5hdFNhZmVNYXRoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTmF0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBuYXRTYWZlTWF0aCA9IGhhcmRlbih7XG4gIC8qICAgICAgICAgICAgICAgICovXG4gIC8vXG4gIGFkZDogKHgsIHkpID0+IE5hdCh4KSArIE5hdCh5KSxcbiAgLyogICAgICAgICAgICAgICAgKi9cbiAgc3VidHJhY3Q6ICh4LCB5KSA9PiBOYXQoTmF0KHgpIC0gTmF0KHkpKSxcbiAgLyogICAgICAgICAgICAgICAgKi9cbiAgbXVsdGlwbHk6ICh4LCB5KSA9PiBOYXQoeCkgKiBOYXQoeSksXG4gIC8qICAgICAgICAgICAgICAgICovXG4gIGZsb29yRGl2aWRlOiAoeCwgeSkgPT4gTmF0KHgpIC8gTmF0KHkpLFxuICAvKiAgICAgICAgICAgICAgICAqL1xuICBjZWlsRGl2aWRlOiAoeCwgeSkgPT4ge1xuICAgIHkgPSBOYXQoeSk7XG4gICAgcmV0dXJuIE5hdChOYXQoeCkgKyB5IC0gMW4pIC8geTtcbiAgfSxcbiAgLypcbiAgXG4gICAqL1xuXG5cbiAgYmFua2Vyc0RpdmlkZTogKGEsIGIpID0+IHtcbiAgICBhID0gTmF0KGEpO1xuICAgIGIgPSBOYXQoYik7XG5cbiAgICBjb25zdCBkaXYgPSBhIC8gYjtcbiAgICBjb25zdCByZW0gPSBhICUgYjtcbiAgICAvL1xuICAgIGlmIChyZW0gKiAybiA+IGIpIHtcbiAgICAgIHJldHVybiBkaXYgKyAxbjtcbiAgICB9IGVsc2UgaWYgKHJlbSAqIDJuID09PSBiKSB7XG4gICAgICAvL1xuICAgICAgaWYgKGRpdiAlIDJuID09PSAxbikgcmV0dXJuIGRpdiArIDFuO1xuICAgIH1cbiAgICByZXR1cm4gZGl2O1xuICB9LFxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgaXNHVEU6ICh4LCB5KSA9PiBOYXQoeCkgPj0gTmF0KHkpXG59KTskaM2PX29uY2UubmF0U2FmZU1hdGgobmF0U2FmZU1hdGgpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0U2FmZU1hdGgiOlsibmF0U2FmZU1hdGgiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMrGGcAwEAAAMBAAANwAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZVN0YXRlTWFjaGluZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG5cblxuXG5cbiovXG5jb25zdCBtYWtlU3RhdGVNYWNoaW5lID0gKGluaXRpYWxTdGF0ZSwgYWxsb3dlZFRyYW5zaXRpb25zQXJyYXkpID0+IHtcbiAgbGV0IHN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICBjb25zdCBhbGxvd2VkVHJhbnNpdGlvbnMgPSBuZXcgTWFwKGFsbG93ZWRUcmFuc2l0aW9uc0FycmF5KTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgY2FuVHJhbnNpdGlvblRvOiAobmV4dFN0YXRlKSA9PlxuICAgIGFsbG93ZWRUcmFuc2l0aW9ucy5nZXQoc3RhdGUpLmluY2x1ZGVzKG5leHRTdGF0ZSksXG4gICAgdHJhbnNpdGlvblRvOiAobmV4dFN0YXRlKSA9PiB7XG4gICAgICBhc3NlcnQoYWxsb3dlZFRyYW5zaXRpb25zLmdldChzdGF0ZSkuaW5jbHVkZXMobmV4dFN0YXRlKSk7XG4gICAgICBzdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICB9LFxuICAgIGdldFN0YXR1czogKF8pID0+IHN0YXRlXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVN0YXRlTWFjaGluZShtYWtlU3RhdGVNYWNoaW5lKTtcbmhhcmRlbihtYWtlU3RhdGVNYWNoaW5lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdGF0ZU1hY2hpbmUiOlsibWFrZVN0YXRlTWFjaGluZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD9bnjQ/AMAAPwDAAA1AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImNhbGN1bGF0ZU1lZGlhbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBjYWxjdWxhdGVNZWRpYW4gPSAoc2FtcGxlcywgbWF0aCkgPT4ge1xuICBjb25zdCBzb3J0ZWQgPSBzYW1wbGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoIW1hdGguaXNHVEUoYSwgYikpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKCFtYXRoLmlzR1RFKGIsIGEpKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH0pO1xuXG4gIGlmIChzb3J0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgLy9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHNvcnRlZC5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgLy9cbiAgICByZXR1cm4gc29ydGVkWyhzb3J0ZWQubGVuZ3RoIC0gMSkgLyAyXTtcbiAgfVxuXG4gIC8vXG4gIGNvbnN0IHNlY29uZEluZGV4ID0gc29ydGVkLmxlbmd0aCAvIDI7XG4gIGNvbnN0IHN1bSA9IG1hdGguYWRkKHNvcnRlZFtzZWNvbmRJbmRleCAtIDFdLCBzb3J0ZWRbc2Vjb25kSW5kZXhdKTtcbiAgcmV0dXJuIG1hdGguZGl2aWRlKHN1bSwgMm4pO1xufTskaM2PX29uY2UuY2FsY3VsYXRlTWVkaWFuKGNhbGN1bGF0ZU1lZGlhbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYWxjdWxhdGVNZWRpYW4iOlsiY2FsY3VsYXRlTWVkaWFuIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPrzXk+KBgAAigYAADEAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsiUHVibGljVG9waWNTaGFwZSIsIlN1YnNjcmliZXJTaGFwZSIsIlRvcGljc1JlY29yZFNoYXBlIiwibWFrZVJlY29yZGVyVG9waWMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBTdWJzY3JpYmVyU2hhcGUsTSxFOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsWyRozY9fYSA9PiAoU3Vic2NyaWJlclNoYXBlID0gJGjNj19hKSwkaM2PX2xpdmVbXCJTdWJzY3JpYmVyU2hhcGVcIl1dXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5jb25zdCBQdWJsaWNUb3BpY1NoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIHN1YnNjcmliZXI6IFN1YnNjcmliZXJTaGFwZSxcbiAgICBzdG9yYWdlUGF0aDogTS5vcihNLnByb21pc2UoIC8qICAgICAgICAqLyksIE0uc3RyaW5nKCkpXG4gIH0sXG4gIHsgZGVzY3JpcHRpb246IE0uc3RyaW5nKCkgfVxuKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuUHVibGljVG9waWNTaGFwZShQdWJsaWNUb3BpY1NoYXBlKTtcblxuY29uc3QgVG9waWNzUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKE0uc3RyaW5nKCksIFB1YmxpY1RvcGljU2hhcGUpO1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLlRvcGljc1JlY29yZFNoYXBlKFRvcGljc1JlY29yZFNoYXBlKTtcbmNvbnN0IG1ha2VSZWNvcmRlclRvcGljID0gKGRlc2NyaXB0aW9uLCByZWNvcmRlcktpdCkgPT4ge1xuICBjb25zdCByZWNQID1cbiAgJ3JlY29yZGVyJyBpbiByZWNvcmRlcktpdCA/IHJlY29yZGVyS2l0LnJlY29yZGVyIDogcmVjb3JkZXJLaXQucmVjb3JkZXJQO1xuICByZXR1cm4ge1xuICAgIGRlc2NyaXB0aW9uLFxuICAgIHN1YnNjcmliZXI6IHJlY29yZGVyS2l0LnN1YnNjcmliZXIsXG4gICAgc3RvcmFnZVBhdGg6IEUocmVjUCkuZ2V0U3RvcmFnZVBhdGgoKVxuICB9O1xufTskaM2PX29uY2UubWFrZVJlY29yZGVyVG9waWMobWFrZVJlY29yZGVyVG9waWMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiU3Vic2NyaWJlclNoYXBlIjpbIlN1YnNjcmliZXJTaGFwZSIsZmFsc2VdfSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlB1YmxpY1RvcGljU2hhcGUiOlsiUHVibGljVG9waWNTaGFwZSJdLCJUb3BpY3NSZWNvcmRTaGFwZSI6WyJUb3BpY3NSZWNvcmRTaGFwZSJdLCJtYWtlUmVjb3JkZXJUb3BpYyI6WyJtYWtlUmVjb3JkZXJUb3BpYyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA4MFI48iQAAPIkAAA1AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCIuLi9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIiwiLi9hdG9taWNUcmFuc2Zlci5qcyJdLCJleHBvcnRzIjpbImFzc2VydElzc3VlcktleXdvcmRzIiwiYXNzZXJ0TmF0QXNzZXRLaW5kIiwiYXNzZXJ0UHJvcG9zYWxTaGFwZSIsImRlZmF1bHRBY2NlcHRhbmNlTXNnIiwiZGVwb3NpdFRvU2VhdCIsImRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnIiwiZml0UHJvcG9zYWxTaGFwZSIsIm1hcEtleXdvcmRzIiwib2ZmZXJUbyIsInNhdGlzZmllcyIsInNhdmVBbGxJc3N1ZXJzIiwic3dhcCIsInN3YXBFeGFjdCIsIndpdGhkcmF3RnJvbVNlYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEUsbWFrZVByb21pc2VLaXQsbXVzdE1hdGNoLGtleUVRLEFzc2V0S2luZCxmcm9tVW5pcXVlRW50cmllcyxzYXRpc2ZpZXNXYW50LGF0b21pY1RyYW5zZmVyLGZyb21Pbmx5LHRvT25seTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFzc2V0S2luZFwiLFskaM2PX2EgPT4gKEFzc2V0S2luZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCIuLi9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzXCIsIFtbXCJzYXRpc2ZpZXNXYW50XCIsWyRozY9fYSA9PiAoc2F0aXNmaWVzV2FudCA9ICRozY9fYSldXV1dLFtcIi4vYXRvbWljVHJhbnNmZXIuanNcIiwgW1tcImF0b21pY1RyYW5zZmVyXCIsWyRozY9fYSA9PiAoYXRvbWljVHJhbnNmZXIgPSAkaM2PX2EpXV0sW1wiZnJvbU9ubHlcIixbJGjNj19hID0+IChmcm9tT25seSA9ICRozY9fYSldXSxbXCJ0b09ubHlcIixbJGjNj19hID0+ICh0b09ubHkgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IGRlZmF1bHRBY2NlcHRhbmNlTXNnID0gYFRoZSBvZmZlciBoYXMgYmVlbiBhY2NlcHRlZC4gT25jZSB0aGUgY29udHJhY3QgaGFzIGJlZW4gY29tcGxldGVkLCBwbGVhc2UgY2hlY2sgeW91ciBwYXlvdXRgOyRozY9fb25jZS5kZWZhdWx0QWNjZXB0YW5jZU1zZyhkZWZhdWx0QWNjZXB0YW5jZU1zZyk7XG5cbmNvbnN0IGdldEtleXNTb3J0ZWQgPSAob2JqKSA9PiBoYXJkZW4oUmVmbGVjdC5vd25LZXlzKG9iaiB8fCB7fSkuc29ydCgpKTtcblxuY29uc3QgYXNzZXJ0SXNzdWVyS2V5d29yZHMgPSAoemNmLCBleHBlY3RlZCkgPT4ge1xuICBjb25zdCB7IGlzc3VlcnMgfSA9IHpjZi5nZXRUZXJtcygpO1xuICBjb25zdCBhY3R1YWwgPSBnZXRLZXlzU29ydGVkKGlzc3VlcnMpO1xuICBleHBlY3RlZCA9IFsuLi5leHBlY3RlZF07IC8vXG4gIGV4cGVjdGVkLnNvcnQoKTtcbiAga2V5RVEoYWN0dWFsLCBoYXJkZW4oZXhwZWN0ZWQpKSB8fFxuICBGYWlsYGtleXdvcmRzOiAke2FjdHVhbH0gd2VyZSBub3QgYXMgZXhwZWN0ZWQ6ICR7ZXhwZWN0ZWR9YDtcbn07XG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmFzc2VydElzc3VlcktleXdvcmRzKGFzc2VydElzc3VlcktleXdvcmRzKTtcbmNvbnN0IHNhdGlzZmllcyA9IChfaWdub3JlZCwgc2VhdCwgdXBkYXRlKSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRBbGxvY2F0aW9uID0gc2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpO1xuICBjb25zdCBuZXdBbGxvY2F0aW9uID0geyAuLi5jdXJyZW50QWxsb2NhdGlvbiwgLi4udXBkYXRlIH07XG4gIGNvbnN0IHByb3Bvc2FsID0gc2VhdC5nZXRQcm9wb3NhbCgpO1xuICByZXR1cm4gc2F0aXNmaWVzV2FudChwcm9wb3NhbCwgbmV3QWxsb2NhdGlvbik7XG59O1xuXG4vKiAgICAgICAgICAgICAgICovJGjNj19vbmNlLnNhdGlzZmllcyhzYXRpc2ZpZXMpO1xuY29uc3Qgc3dhcCA9ICh6Y2YsIGxlZnRTZWF0LCByaWdodFNlYXQpID0+IHtcbiAgdHJ5IHtcbiAgICB6Y2YuYXRvbWljUmVhcnJhbmdlKFxuICAgICAgaGFyZGVuKFtcbiAgICAgIFtyaWdodFNlYXQsIGxlZnRTZWF0LCBsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnRdLFxuICAgICAgW2xlZnRTZWF0LCByaWdodFNlYXQsIHJpZ2h0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnRdXVxuICAgICAgKVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxlZnRTZWF0LmZhaWwoZXJyKTtcbiAgICByaWdodFNlYXQuZmFpbChlcnIpO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGxlZnRTZWF0LmV4aXQoKTtcbiAgcmlnaHRTZWF0LmV4aXQoKTtcbiAgcmV0dXJuIGRlZmF1bHRBY2NlcHRhbmNlTXNnO1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLnN3YXAoc3dhcCk7XG5jb25zdCBzd2FwRXhhY3QgPSAoemNmLCBsZWZ0U2VhdCwgcmlnaHRTZWF0KSA9PiB7XG4gIHRyeSB7XG4gICAgemNmLmF0b21pY1JlYXJyYW5nZShcbiAgICAgIGhhcmRlbihbXG4gICAgICBmcm9tT25seShyaWdodFNlYXQsIHJpZ2h0U2VhdC5nZXRQcm9wb3NhbCgpLmdpdmUpLFxuICAgICAgZnJvbU9ubHkobGVmdFNlYXQsIGxlZnRTZWF0LmdldFByb3Bvc2FsKCkuZ2l2ZSksXG5cbiAgICAgIHRvT25seShsZWZ0U2VhdCwgbGVmdFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KSxcbiAgICAgIHRvT25seShyaWdodFNlYXQsIHJpZ2h0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnQpXVxuICAgICAgKVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxlZnRTZWF0LmZhaWwoZXJyKTtcbiAgICByaWdodFNlYXQuZmFpbChlcnIpO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGxlZnRTZWF0LmV4aXQoKTtcbiAgcmlnaHRTZWF0LmV4aXQoKTtcbiAgcmV0dXJuIGRlZmF1bHRBY2NlcHRhbmNlTXNnO1xufTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uuc3dhcEV4YWN0KHN3YXBFeGFjdCk7XG5jb25zdCBmaXRQcm9wb3NhbFNoYXBlID0gKHNlYXQsIHByb3Bvc2FsU2hhcGUpID0+XG4vL1xubXVzdE1hdGNoKHNlYXQuZ2V0UHJvcG9zYWwoKSwgaGFyZGVuKHByb3Bvc2FsU2hhcGUpLCAncHJvcG9zYWwnKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5maXRQcm9wb3NhbFNoYXBlKGZpdFByb3Bvc2FsU2hhcGUpO1xuY29uc3QgYXNzZXJ0UHJvcG9zYWxTaGFwZSA9IChzZWF0LCBleHBlY3RlZCkgPT4ge1xuICBhc3NlcnQudHlwZW9mKGV4cGVjdGVkLCAnb2JqZWN0Jyk7XG4gICFBcnJheS5pc0FycmF5KGV4cGVjdGVkKSB8fCBGYWlsYEV4cGVjdGVkIG11c3QgYmUgYW4gbm9uLWFycmF5IG9iamVjdGA7XG4gIGNvbnN0IGFzc2VydFZhbHVlc051bGwgPSAoZSkgPT4ge1xuICAgIGlmIChlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgT2JqZWN0LnZhbHVlcyhlKSkge1xuICAgICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgICBGYWlsYFRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgcmVjb3JkIG11c3QgYmUgbnVsbCBidXQgd2FzICR7dmFsdWV9YDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy9cbiAgLy9cbiAgYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC5naXZlKTtcbiAgYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC53YW50KTtcbiAgYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC5leGl0KTtcblxuICBjb25zdCBhY3R1YWwgPSBzZWF0LmdldFByb3Bvc2FsKCk7XG4gIGNvbnN0IGFzc2VydEtleXMgPSAoYSwgZSkgPT4ge1xuICAgIGlmIChlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGtleUVRKGdldEtleXNTb3J0ZWQoYSksIGdldEtleXNTb3J0ZWQoZSkpIHx8XG4gICAgICBGYWlsYGFjdHVhbCAke2F9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgJHtlfWA7XG4gICAgfVxuICB9O1xuICBhc3NlcnRLZXlzKGFjdHVhbC5naXZlLCBleHBlY3RlZC5naXZlKTtcbiAgYXNzZXJ0S2V5cyhhY3R1YWwud2FudCwgZXhwZWN0ZWQud2FudCk7XG4gIGFzc2VydEtleXMoYWN0dWFsLmV4aXQsIGV4cGVjdGVkLmV4aXQpO1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuYXNzZXJ0UHJvcG9zYWxTaGFwZShhc3NlcnRQcm9wb3NhbFNoYXBlKTtcbmNvbnN0IGFzc2VydE5hdEFzc2V0S2luZCA9ICh6Y2YsIGJyYW5kKSA9PiB7XG4gIHpjZi5nZXRBc3NldEtpbmQoYnJhbmQpID09PSBBc3NldEtpbmQuTkFUIHx8XG4gIEZhaWxgYnJhbmQgbXVzdCBiZSBBc3NldEtpbmQuTkFUYDtcbn07JGjNj19vbmNlLmFzc2VydE5hdEFzc2V0S2luZChhc3NlcnROYXRBc3NldEtpbmQpO1xuXG5jb25zdCBkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyA9IGBEZXBvc2l0IGFuZCByZWFsbG9jYXRpb24gc3VjY2Vzc2Z1bC5gO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKTtcbmNvbnN0IGRlcG9zaXRUb1NlYXQgPSBhc3luYyAoemNmLCByZWNpcGllbnRTZWF0LCBhbW91bnRzLCBwYXltZW50cykgPT4ge1xuICAhcmVjaXBpZW50U2VhdC5oYXNFeGl0ZWQoKSB8fCBGYWlsYFRoZSByZWNpcGllbnRTZWF0IGNhbm5vdCBoYXZlIGV4aXRlZC5gO1xuXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHJlYWxsb2NhdGVBZnRlckRlcG9zaXQgPSAodGVtcFNlYXQpID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGF0b21pY1RyYW5zZmVyKHpjZiwgdGVtcFNlYXQsIHJlY2lwaWVudFNlYXQsIGFtb3VudHMpO1xuICAgIHRlbXBTZWF0LmV4aXQoKTtcbiAgICByZXR1cm4gZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2c7XG4gIH07XG4gIGNvbnN0IGludml0YXRpb24gPSB6Y2YubWFrZUludml0YXRpb24oXG4gICAgcmVhbGxvY2F0ZUFmdGVyRGVwb3NpdCxcbiAgICAndGVtcG9yYXJ5IHNlYXQgZm9yIGRlcG9zaXQnXG4gICk7XG4gIGNvbnN0IHByb3Bvc2FsID0gaGFyZGVuKHsgZ2l2ZTogYW1vdW50cyB9KTtcbiAgaGFyZGVuKHBheW1lbnRzKTtcbiAgLy9cbiAgLy9cbiAgY29uc3Qgem9lID0gemNmLmdldFpvZVNlcnZpY2UoKTtcbiAgY29uc3QgdGVtcFVzZXJTZWF0ID0gRSh6b2UpLm9mZmVyKGludml0YXRpb24sIHByb3Bvc2FsLCBwYXltZW50cyk7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIHJldHVybiBFKHRlbXBVc2VyU2VhdCkuZ2V0T2ZmZXJSZXN1bHQoKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlcG9zaXRUb1NlYXQoZGVwb3NpdFRvU2VhdCk7XG5jb25zdCB3aXRoZHJhd0Zyb21TZWF0ID0gYXN5bmMgKHpjZiwgc2VhdCwgYW1vdW50cykgPT4ge1xuICAhc2VhdC5oYXNFeGl0ZWQoKSB8fCBGYWlsYFRoZSBzZWF0IGNhbm5vdCBoYXZlIGV4aXRlZC5gO1xuICBjb25zdCB7IHpjZlNlYXQ6IHRlbXBTZWF0LCB1c2VyU2VhdDogdGVtcFVzZXJTZWF0UCB9ID0gemNmLm1ha2VFbXB0eVNlYXRLaXQoKTtcbiAgYXRvbWljVHJhbnNmZXIoemNmLCBzZWF0LCB0ZW1wU2VhdCwgYW1vdW50cyk7XG4gIHRlbXBTZWF0LmV4aXQoKTtcbiAgcmV0dXJuIEUodGVtcFVzZXJTZWF0UCkuZ2V0UGF5b3V0cygpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLndpdGhkcmF3RnJvbVNlYXQod2l0aGRyYXdGcm9tU2VhdCk7XG5jb25zdCBzYXZlQWxsSXNzdWVycyA9IGFzeW5jICh6Y2YsIGlzc3VlcktleXdvcmRSZWNvcmQgPSBoYXJkZW4oe30pKSA9PiB7XG4gIGNvbnN0IHsgaXNzdWVycyB9ID0gemNmLmdldFRlcm1zKCk7XG4gIGNvbnN0IGlzc3VlcnNQU2F2ZWQgPSBPYmplY3QuZW50cmllcyhpc3N1ZXJLZXl3b3JkUmVjb3JkKS5tYXAoXG4gICAgKFtrZXl3b3JkLCBpc3N1ZXJdKSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmIChpc3N1ZXJzW2tleXdvcmRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHpjZi5zYXZlSXNzdWVyKGlzc3Vlciwga2V5d29yZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGlzc3VlcnNQU2F2ZWQpO1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2Uuc2F2ZUFsbElzc3VlcnMoc2F2ZUFsbElzc3VlcnMpO1xuY29uc3QgbWFwS2V5d29yZHMgPSAoa2V5d29yZFJlY29yZCA9IHt9LCBrZXl3b3JkTWFwcGluZykgPT4ge1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGZyb21VbmlxdWVFbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoa2V5d29yZFJlY29yZCkubWFwKChba2V5d29yZCwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmIChrZXl3b3JkTWFwcGluZ1trZXl3b3JkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIFtrZXl3b3JkLCB2YWx1ZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrZXl3b3JkTWFwcGluZ1trZXl3b3JkXSwgdmFsdWVdO1xuICAgICAgfSlcbiAgICApXG4gICk7XG59O1xuLyogICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5tYXBLZXl3b3JkcyhtYXBLZXl3b3Jkcyk7XG5jb25zdCByZXZlcnNlID0gKGtleXdvcmRSZWNvcmQgPSB7fSkgPT4ge1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGZyb21VbmlxdWVFbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoa2V5d29yZFJlY29yZCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFt2YWx1ZSwga2V5XSlcbiAgICApXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG9mZmVyVG8gPSBhc3luYyAoXG56Y2YsXG5pbnZpdGF0aW9uLFxua2V5d29yZE1hcHBpbmcsXG5wcm9wb3NhbCxcbmZyb21TZWF0LFxudG9TZWF0LFxub2ZmZXJBcmdzKSA9Plxue1xuICBpZiAoa2V5d29yZE1hcHBpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIGtleXdvcmRNYXBwaW5nID0gaGFyZGVuKHt9KTtcbiAgfVxuXG4gIGNvbnN0IGRlZmluZWRUb1NlYXQgPSB0b1NlYXQgIT09IHVuZGVmaW5lZCA/IHRvU2VhdCA6IGZyb21TZWF0O1xuXG4gIGNvbnN0IHpvZSA9IHpjZi5nZXRab2VTZXJ2aWNlKCk7XG4gIGNvbnN0IG1hcHBpbmdSZXZlcnNlZCA9IHJldmVyc2Uoa2V5d29yZE1hcHBpbmcpO1xuXG4gIGNvbnN0IG5ld0tleXdvcmRzID1cbiAgcHJvcG9zYWwgIT09IHVuZGVmaW5lZCA/XG4gIG1hcEtleXdvcmRzKHByb3Bvc2FsLmdpdmUsIG1hcHBpbmdSZXZlcnNlZCkgOlxuICBoYXJkZW4oe30pO1xuXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHBheW1lbnRzID0gYXdhaXQgd2l0aGRyYXdGcm9tU2VhdCh6Y2YsIGZyb21TZWF0LCBuZXdLZXl3b3Jkcyk7XG5cbiAgLy9cbiAgY29uc3QgcGF5bWVudHNGb3JPdGhlckNvbnRyYWN0ID0gbWFwS2V5d29yZHMocGF5bWVudHMsIGtleXdvcmRNYXBwaW5nKTtcblxuICBjb25zdCB1c2VyU2VhdFByb21pc2UgPSBFKHpvZSkub2ZmZXIoXG4gICAgaW52aXRhdGlvbixcbiAgICBwcm9wb3NhbCxcbiAgICBwYXltZW50c0Zvck90aGVyQ29udHJhY3QsXG4gICAgb2ZmZXJBcmdzXG4gICk7XG5cbiAgY29uc3QgZGVwb3NpdGVkUHJvbWlzZUtpdCA9IG1ha2VQcm9taXNlS2l0KCk7XG5cbiAgY29uc3QgZG9EZXBvc2l0ID0gYXN5bmMgKHBheW91dFBheW1lbnRzKSA9PiB7XG4gICAgLy9cbiAgICBjb25zdCBhbW91bnRzID0gYXdhaXQgRSh1c2VyU2VhdFByb21pc2UpLmdldEZpbmFsQWxsb2NhdGlvbigpO1xuXG4gICAgLy9cbiAgICBjb25zdCBtYXBwZWRBbW91bnRzID0gbWFwS2V5d29yZHMoYW1vdW50cywgbWFwcGluZ1JldmVyc2VkKTtcbiAgICBjb25zdCBtYXBwZWRQYXltZW50cyA9IG1hcEtleXdvcmRzKHBheW91dFBheW1lbnRzLCBtYXBwaW5nUmV2ZXJzZWQpO1xuICAgIGF3YWl0IGRlcG9zaXRUb1NlYXQoemNmLCBkZWZpbmVkVG9TZWF0LCBtYXBwZWRBbW91bnRzLCBtYXBwZWRQYXltZW50cyk7XG4gICAgZGVwb3NpdGVkUHJvbWlzZUtpdC5yZXNvbHZlKG1hcHBlZEFtb3VudHMpO1xuICB9O1xuXG4gIHZvaWQgRSh1c2VyU2VhdFByb21pc2UpLmdldFBheW91dHMoKS50aGVuKGRvRGVwb3NpdCk7XG5cbiAgLy9cbiAgcmV0dXJuIGhhcmRlbih7IHVzZXJTZWF0UHJvbWlzZSwgZGVwb3NpdGVkOiBkZXBvc2l0ZWRQcm9taXNlS2l0LnByb21pc2UgfSk7XG59OyRozY9fb25jZS5vZmZlclRvKG9mZmVyVG8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciOlsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciXSwiYXNzZXJ0SXNzdWVyS2V5d29yZHMiOlsiYXNzZXJ0SXNzdWVyS2V5d29yZHMiXSwic2F0aXNmaWVzIjpbInNhdGlzZmllcyJdLCJzd2FwIjpbInN3YXAiXSwic3dhcEV4YWN0IjpbInN3YXBFeGFjdCJdLCJmaXRQcm9wb3NhbFNoYXBlIjpbImZpdFByb3Bvc2FsU2hhcGUiXSwiYXNzZXJ0UHJvcG9zYWxTaGFwZSI6WyJhc3NlcnRQcm9wb3NhbFNoYXBlIl0sImFzc2VydE5hdEFzc2V0S2luZCI6WyJhc3NlcnROYXRBc3NldEtpbmQiXSwiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciOlsiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciXSwiZGVwb3NpdFRvU2VhdCI6WyJkZXBvc2l0VG9TZWF0Il0sIndpdGhkcmF3RnJvbVNlYXQiOlsid2l0aGRyYXdGcm9tU2VhdCJdLCJzYXZlQWxsSXNzdWVycyI6WyJzYXZlQWxsSXNzdWVycyJdLCJtYXBLZXl3b3JkcyI6WyJtYXBLZXl3b3JkcyJdLCJvZmZlclRvIjpbIm9mZmVyVG8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+vFH3YIGAACCBgAAJQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL21ha2VIYW5kbGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVEdXJhYmxlSGFuZGxlIiwibWFrZUhhbmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsaW5pdEVtcHR5LG1ha2VFeG8scHJlcGFyZUV4b0NsYXNzLEhhbmRsZUk7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsWyRozY9fYSA9PiAoaW5pdEVtcHR5ID0gJGjNj19hKV1dLFtcIm1ha2VFeG9cIixbJGjNj19hID0+IChtYWtlRXhvID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b0NsYXNzXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJIYW5kbGVJXCIsWyRozY9fYSA9PiAoSGFuZGxlSSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGRlZmluZUR1cmFibGVIYW5kbGUgPSAoYmFnZ2FnZSwgaGFuZGxlVHlwZSkgPT4ge1xuICB0eXBlb2YgaGFuZGxlVHlwZSA9PT0gJ3N0cmluZycgfHwgRmFpbGBoYW5kbGVUeXBlIG11c3QgYmUgYSBzdHJpbmdgO1xuICBjb25zdCBtYWtlSGFuZGxlID0gcHJlcGFyZUV4b0NsYXNzKFxuICAgIGJhZ2dhZ2UsXG4gICAgYCR7aGFuZGxlVHlwZX1IYW5kbGVgLFxuICAgIEhhbmRsZUksXG4gICAgaW5pdEVtcHR5LFxuICAgIHt9XG4gICk7XG4gIC8vXG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8obWFrZUhhbmRsZSk7XG59OyRozY9fb25jZS5kZWZpbmVEdXJhYmxlSGFuZGxlKGRlZmluZUR1cmFibGVIYW5kbGUpO1xuaGFyZGVuKGRlZmluZUR1cmFibGVIYW5kbGUpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUhhbmRsZSA9IChoYW5kbGVUeXBlKSA9PiB7XG4gIHR5cGVvZiBoYW5kbGVUeXBlID09PSAnc3RyaW5nJyB8fCBGYWlsYGhhbmRsZVR5cGUgbXVzdCBiZSBhIHN0cmluZ2A7XG4gIC8vXG4gIC8vXG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgKi8obWFrZUV4byhgJHtoYW5kbGVUeXBlfUhhbmRsZWAsIEhhbmRsZUksIHt9KSk7XG59OyRozY9fb25jZS5tYWtlSGFuZGxlKG1ha2VIYW5kbGUpO1xuaGFyZGVuKG1ha2VIYW5kbGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmaW5lRHVyYWJsZUhhbmRsZSI6WyJkZWZpbmVEdXJhYmxlSGFuZGxlIl0sIm1ha2VIYW5kbGUiOlsibWFrZUhhbmRsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADD9GQFOEcAADhHAAAlAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdGltZSJdLCJleHBvcnRzIjpbIkFkbWluRmFjZXRJIiwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIiwiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSIsIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIiwiQnVuZGxlQ2FwU2hhcGUiLCJCdW5kbGVTaGFwZSIsIkVtcHR5UHJvcG9zYWxTaGFwZSIsIkV4aXRPYmplY3RJIiwiRXhpdE9iamVjdFNoYXBlIiwiRmVlTWludEFjY2Vzc1NoYXBlIiwiRnVsbFByb3Bvc2FsU2hhcGUiLCJIYW5kbGVJIiwiSGFuZGxlT2ZmZXJJIiwiSW5zdGFsbGF0aW9uU2hhcGUiLCJJbnN0YW5jZUFkbWluSSIsIkluc3RhbmNlQWRtaW5TaGFwZSIsIkluc3RhbmNlSGFuZGxlU2hhcGUiLCJJbnN0YW5jZVJlY29yZFNoYXBlIiwiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIiwiSW52aXRhdGlvbkhhbmRsZVNoYXBlIiwiSW52aXRhdGlvblNoYXBlIiwiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSIsIklzc3VlclJlY29yZFNoYXBlIiwiS2V5d29yZFNoYXBlIiwiT2ZmZXJIYW5kbGVySSIsIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIiwiUHJpY2VRdW90ZVNoYXBlIiwiUHJvcG9zYWxTaGFwZSIsIlNlYXREYXRhU2hhcGUiLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSIsIlNlYXRTaGFwZSIsIlRlcm1zU2hhcGUiLCJUaW1lclNoYXBlIiwiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiLCJab2VNaW50SSIsIlpvZU1pbnRTaGFwZSIsIlpvZVNlcnZpY2VJIiwiWm9lU3RvcmFnZU1hbmFnZXJJS2l0IiwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiLCJpc09uRGVtYW5kRXhpdFJ1bGUiLCJpc1dhaXZlZEV4aXRSdWxlIiwibWFrZUhhbmRsZVNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQW1vdW50U2hhcGUsQXNzZXRLaW5kU2hhcGUsQnJhbmRTaGFwZSxEaXNwbGF5SW5mb1NoYXBlLElzc3VlcktpdFNoYXBlLElzc3VlclNoYXBlLFBheW1lbnRTaGFwZSxTdWJzY3JpYmVyU2hhcGUsTSxUaW1lc3RhbXBTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50U2hhcGVcIixbJGjNj19hID0+IChBbW91bnRTaGFwZSA9ICRozY9fYSldXSxbXCJBc3NldEtpbmRTaGFwZVwiLFskaM2PX2EgPT4gKEFzc2V0S2luZFNoYXBlID0gJGjNj19hKV1dLFtcIkJyYW5kU2hhcGVcIixbJGjNj19hID0+IChCcmFuZFNoYXBlID0gJGjNj19hKV1dLFtcIkRpc3BsYXlJbmZvU2hhcGVcIixbJGjNj19hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjNj19hKV1dLFtcIklzc3VlcktpdFNoYXBlXCIsWyRozY9fYSA9PiAoSXNzdWVyS2l0U2hhcGUgPSAkaM2PX2EpXV0sW1wiSXNzdWVyU2hhcGVcIixbJGjNj19hID0+IChJc3N1ZXJTaGFwZSA9ICRozY9fYSldXSxbXCJQYXltZW50U2hhcGVcIixbJGjNj19hID0+IChQYXltZW50U2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIixbJGjNj19hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLy9cbmNvbnN0IEtleXdvcmRTaGFwZSA9IE0uc3RyaW5nKCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5LZXl3b3JkU2hhcGUoS2V5d29yZFNoYXBlKTtcbmNvbnN0IEludml0YXRpb25IYW5kbGVTaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uSGFuZGxlJyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuSW52aXRhdGlvbkhhbmRsZVNoYXBlKEludml0YXRpb25IYW5kbGVTaGFwZSk7XG5jb25zdCBJbnZpdGF0aW9uU2hhcGUgPSBNLnJlbW90YWJsZSgnSW52aXRhdGlvbicpOyRozY9fb25jZS5JbnZpdGF0aW9uU2hhcGUoSW52aXRhdGlvblNoYXBlKTtcbmNvbnN0IEluc3RhbmNlSGFuZGxlU2hhcGUgPSBNLnJlbW90YWJsZSgnSW5zdGFuY2VIYW5kbGUnKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLkluc3RhbmNlSGFuZGxlU2hhcGUoSW5zdGFuY2VIYW5kbGVTaGFwZSk7XG5jb25zdCBJbnN0YWxsYXRpb25TaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKTskaM2PX29uY2UuSW5zdGFsbGF0aW9uU2hhcGUoSW5zdGFsbGF0aW9uU2hhcGUpO1xuY29uc3QgU2VhdFNoYXBlID0gTS5yZW1vdGFibGUoJ1NlYXQnKTskaM2PX29uY2UuU2VhdFNoYXBlKFNlYXRTaGFwZSk7XG5cbmNvbnN0IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLCBBbW91bnRTaGFwZSk7JGjNj19vbmNlLkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZShBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuY29uc3QgQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoXG4gIEtleXdvcmRTaGFwZSxcbiAgTS5wYXR0ZXJuKClcbik7JGjNj19vbmNlLkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUoQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoXG4gIEtleXdvcmRTaGFwZSxcbiAgTS5lcmVmKFBheW1lbnRTaGFwZSlcbik7JGjNj19vbmNlLlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKTtcbmNvbnN0IElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLCBJc3N1ZXJTaGFwZSk7JGjNj19vbmNlLklzc3VlcktleXdvcmRSZWNvcmRTaGFwZShJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpO1xuY29uc3QgSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoXG4gIEtleXdvcmRTaGFwZSxcbiAgTS5lcmVmKElzc3VlclNoYXBlKVxuKTskaM2PX29uY2UuSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZShJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlKTtcbmNvbnN0IEJyYW5kS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsIEJyYW5kU2hhcGUpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5CcmFuZEtleXdvcmRSZWNvcmRTaGFwZShCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCBJc3N1ZXJSZWNvcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBicmFuZDogQnJhbmRTaGFwZSxcbiAgICBpc3N1ZXI6IElzc3VlclNoYXBlLFxuICAgIGFzc2V0S2luZDogQXNzZXRLaW5kU2hhcGVcbiAgfSxcbiAgeyBkaXNwbGF5SW5mbzogRGlzcGxheUluZm9TaGFwZSB9XG4pOyRozY9fb25jZS5Jc3N1ZXJSZWNvcmRTaGFwZShJc3N1ZXJSZWNvcmRTaGFwZSk7XG5cbmNvbnN0IFRlcm1zU2hhcGUgPSB7XG4gIGlzc3VlcnM6IElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSxcbiAgYnJhbmRzOiBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZVxufTskaM2PX29uY2UuVGVybXNTaGFwZShUZXJtc1NoYXBlKTtcbmhhcmRlbihUZXJtc1NoYXBlKTtcblxuY29uc3QgSW5zdGFuY2VSZWNvcmRTaGFwZSA9IHtcbiAgaW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb25TaGFwZSxcbiAgaW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG4gIHRlcm1zOiBNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpXG59OyRozY9fb25jZS5JbnN0YW5jZVJlY29yZFNoYXBlKEluc3RhbmNlUmVjb3JkU2hhcGUpO1xuaGFyZGVuKEluc3RhbmNlUmVjb3JkU2hhcGUpO1xuXG5jb25zdCBIYW5kbGVJID0gTS5pbnRlcmZhY2UoJ0hhbmRsZScsIHt9KTskaM2PX29uY2UuSGFuZGxlSShIYW5kbGVJKTtcblxuY29uc3QgbWFrZUhhbmRsZVNoYXBlID0gKG5hbWUpID0+IE0ucmVtb3RhYmxlKGAke25hbWV9SGFuZGxlYCk7JGjNj19vbmNlLm1ha2VIYW5kbGVTaGFwZShtYWtlSGFuZGxlU2hhcGUpO1xuY29uc3QgVGltZXJTaGFwZSA9IG1ha2VIYW5kbGVTaGFwZSgndGltZXInKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5UaW1lclNoYXBlKFRpbWVyU2hhcGUpO1xuY29uc3QgRnVsbFByb3Bvc2FsU2hhcGUgPSB7XG4gIHdhbnQ6IEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUsXG4gIGdpdmU6IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgLy9cbiAgLy9cbiAgLy9cbiAgZXhpdDogTS5zcGxpdFJlY29yZChcbiAgICB7fSxcbiAgICB7XG4gICAgICBvbkRlbWFuZDogbnVsbCxcbiAgICAgIHdhaXZlZDogbnVsbCxcbiAgICAgIGFmdGVyRGVhZGxpbmU6IHtcbiAgICAgICAgdGltZXI6IE0uZXJlZihUaW1lclNoYXBlKSxcbiAgICAgICAgZGVhZGxpbmU6IFRpbWVzdGFtcFNoYXBlXG4gICAgICB9XG4gICAgfSxcbiAgICB7fVxuICApXG59OyRozY9fb25jZS5GdWxsUHJvcG9zYWxTaGFwZShGdWxsUHJvcG9zYWxTaGFwZSk7XG5oYXJkZW4oRnVsbFByb3Bvc2FsU2hhcGUpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IFByb3Bvc2FsU2hhcGUgPSBNLnNwbGl0UmVjb3JkKHt9LCBGdWxsUHJvcG9zYWxTaGFwZSwge30pOyRozY9fb25jZS5Qcm9wb3NhbFNoYXBlKFByb3Bvc2FsU2hhcGUpO1xuXG5jb25zdCBFbXB0eVByb3Bvc2FsU2hhcGUgPSBNLnNwbGl0UmVjb3JkKHtcbiAgZ2l2ZToge30sXG4gIHdhbnQ6IHt9LFxuICBleGl0OiB7IG9uRGVtYW5kOiBudWxsIH1cbn0pOyRozY9fb25jZS5FbXB0eVByb3Bvc2FsU2hhcGUoRW1wdHlQcm9wb3NhbFNoYXBlKTtcblxuY29uc3QgaXNPbkRlbWFuZEV4aXRSdWxlID0gKGV4aXQpID0+IHtcbiAgY29uc3QgW2V4aXRLZXldID0gT2JqZWN0LmtleXMoZXhpdCk7XG4gIHJldHVybiBleGl0S2V5ID09PSAnb25EZW1hbmQnO1xufTskaM2PX29uY2UuaXNPbkRlbWFuZEV4aXRSdWxlKGlzT25EZW1hbmRFeGl0UnVsZSk7XG5oYXJkZW4oaXNPbkRlbWFuZEV4aXRSdWxlKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGlzV2FpdmVkRXhpdFJ1bGUgPSAoZXhpdCkgPT4ge1xuICBjb25zdCBbZXhpdEtleV0gPSBPYmplY3Qua2V5cyhleGl0KTtcbiAgcmV0dXJuIGV4aXRLZXkgPT09ICd3YWl2ZWQnO1xufTskaM2PX29uY2UuaXNXYWl2ZWRFeGl0UnVsZShpc1dhaXZlZEV4aXRSdWxlKTtcbmhhcmRlbihpc1dhaXZlZEV4aXRSdWxlKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlID0gKGV4aXQpID0+IHtcbiAgY29uc3QgW2V4aXRLZXldID0gT2JqZWN0LmtleXMoZXhpdCk7XG4gIHJldHVybiBleGl0S2V5ID09PSAnYWZ0ZXJEZWFkbGluZSc7XG59OyRozY9fb25jZS5pc0FmdGVyRGVhZGxpbmVFeGl0UnVsZShpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSk7XG5oYXJkZW4oaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBJbnZpdGF0aW9uRWxlbWVudFNoYXBlID0gTS5zcGxpdFJlY29yZCh7XG4gIGRlc2NyaXB0aW9uOiBNLnN0cmluZygpLFxuICBoYW5kbGU6IEludml0YXRpb25IYW5kbGVTaGFwZSxcbiAgaW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG4gIGluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uU2hhcGVcbn0pOyRozY9fb25jZS5JbnZpdGF0aW9uRWxlbWVudFNoYXBlKEludml0YXRpb25FbGVtZW50U2hhcGUpO1xuXG5jb25zdCBPZmZlckhhbmRsZXJJID0gTS5pbnRlcmZhY2UoJ09mZmVySGFuZGxlcicsIHtcbiAgaGFuZGxlOiBNLmNhbGwoU2VhdFNoYXBlKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpXG59KTskaM2PX29uY2UuT2ZmZXJIYW5kbGVySShPZmZlckhhbmRsZXJJKTtcblxuY29uc3QgU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUgPSBNLmFycmF5T2Yoe1xuICBzZWF0SGFuZGxlOiBTZWF0U2hhcGUsXG4gIGFsbG9jYXRpb246IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZVxufSk7JGjNj19vbmNlLlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKTtcblxuY29uc3QgWm9lTWludFNoYXBlID0gTS5yZW1vdGFibGUoJ1pvZU1pbnQnKTskaM2PX29uY2UuWm9lTWludFNoYXBlKFpvZU1pbnRTaGFwZSk7XG5jb25zdCBab2VNaW50SSA9IE0uaW50ZXJmYWNlKCdab2VNaW50Jywge1xuICBnZXRJc3N1ZXJSZWNvcmQ6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyUmVjb3JkU2hhcGUpLFxuICBtaW50QW5kRXNjcm93OiBNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKSxcbiAgd2l0aGRyYXdBbmRCdXJuOiBNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKVxufSk7JGjNj19vbmNlLlpvZU1pbnRJKFpvZU1pbnRJKTtcblxuY29uc3QgRmVlTWludEFjY2Vzc1NoYXBlID0gTS5yZW1vdGFibGUoJ0ZlZU1pbnRBY2Nlc3MnKTskaM2PX29uY2UuRmVlTWludEFjY2Vzc1NoYXBlKEZlZU1pbnRBY2Nlc3NTaGFwZSk7XG5cbmNvbnN0IEV4aXRPYmplY3RJID0gTS5pbnRlcmZhY2UoJ0V4aXQgT2JqZWN0Jywge1xuICBleGl0OiBNLmNhbGwoKS5yZXR1cm5zKClcbn0pOyRozY9fb25jZS5FeGl0T2JqZWN0SShFeGl0T2JqZWN0SSk7XG5cbmNvbnN0IEV4aXRPYmplY3RTaGFwZSA9IE0ucmVtb3RhYmxlKCdFeGl0T2JqJyk7JGjNj19vbmNlLkV4aXRPYmplY3RTaGFwZShFeGl0T2JqZWN0U2hhcGUpO1xuY29uc3QgSW5zdGFuY2VBZG1pblNoYXBlID0gTS5yZW1vdGFibGUoJ0luc3RhbmNlQWRtaW4nKTskaM2PX29uY2UuSW5zdGFuY2VBZG1pblNoYXBlKEluc3RhbmNlQWRtaW5TaGFwZSk7XG5jb25zdCBJbnN0YW5jZUFkbWluSSA9IE0uaW50ZXJmYWNlKCdJbnN0YW5jZUFkbWluJywge1xuICBtYWtlSW52aXRhdGlvbjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSwgTS5zdHJpbmcoKSkuXG4gIG9wdGlvbmFsKE0ucmVjb3JkKCksIE0ucGF0dGVybigpKS5cbiAgcmV0dXJucyhJbnZpdGF0aW9uU2hhcGUpLFxuICBzYXZlSXNzdWVyOiBNLmNhbGxXaGVuKE0uYXdhaXQoSXNzdWVyU2hhcGUpLCBLZXl3b3JkU2hhcGUpLnJldHVybnMoXG4gICAgSXNzdWVyUmVjb3JkU2hhcGVcbiAgKSxcbiAgbWFrZU5vRXNjcm93U2VhdDogTS5jYWxsKFxuICAgIEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgICBQcm9wb3NhbFNoYXBlLFxuICAgIEV4aXRPYmplY3RTaGFwZSxcbiAgICBTZWF0U2hhcGVcbiAgKS5yZXR1cm5zKFNlYXRTaGFwZSksXG4gIGV4aXRBbGxTZWF0czogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbiAgZmFpbEFsbFNlYXRzOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBleGl0U2VhdDogTS5jYWxsKFNlYXRTaGFwZSwgTS5hbnkoKSkucmV0dXJucygpLFxuICBmYWlsU2VhdDogTS5jYWxsKFNlYXRTaGFwZSwgTS5hbnkoKSkucmV0dXJucygpLFxuICBtYWtlWm9lTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSkuXG4gIG9wdGlvbmFsKFxuICAgIEFzc2V0S2luZFNoYXBlLFxuICAgIERpc3BsYXlJbmZvU2hhcGUsXG4gICAgTS5zcGxpdFJlY29yZCh7fSwgeyBlbGVtZW50U2hhcGU6IE0ucGF0dGVybigpIH0pXG4gICkuXG4gIHJldHVybnMoTS5yZW1vdGFibGUoJ3pvZU1pbnQnKSksXG4gIHJlZ2lzdGVyRmVlTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSwgRmVlTWludEFjY2Vzc1NoYXBlKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdmZWVNaW50JylcbiAgKSxcbiAgcmVwbGFjZUFsbG9jYXRpb25zOiBNLmNhbGwoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpLnJldHVybnMoKSxcbiAgc3RvcEFjY2VwdGluZ09mZmVyczogTS5jYWxsKCkucmV0dXJucygpLFxuICBzZXRPZmZlckZpbHRlcjogTS5jYWxsKE0uYXJyYXlPZihNLnN0cmluZygpKSkucmV0dXJucygpLFxuICBnZXRPZmZlckZpbHRlcjogTS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuICBnZXRFeGl0U3Vic2NyaWJlcjogTS5jYWxsKFNlYXRTaGFwZSkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuICBpc0Jsb2NrZWQ6IE0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgcmVwYWlyQ29udHJhY3RDb21wbGV0aW9uV2F0Y2hlcjogTS5jYWxsKCkucmV0dXJucygpXG59KTskaM2PX29uY2UuSW5zdGFuY2VBZG1pbkkoSW5zdGFuY2VBZG1pbkkpO1xuXG5jb25zdCBJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCA9IHtcbiAgaW5zdGFuY2VTdG9yYWdlTWFuYWdlcjogTS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXInLCB7XG4gICAgZ2V0VGVybXM6IE0uY2FsbCgpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG4gICAgZ2V0SXNzdWVyczogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuICAgIGdldEJyYW5kczogTS5jYWxsKCkucmV0dXJucyhCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgZ2V0SW5zdGFsbGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbGxhdGlvblNoYXBlKSxcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuICAgIHNhdmVJc3N1ZXI6IE0uY2FsbChJc3N1ZXJTaGFwZSwgS2V5d29yZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBtYWtlWm9lTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSkuXG4gICAgb3B0aW9uYWwoXG4gICAgICBBc3NldEtpbmRTaGFwZSxcbiAgICAgIERpc3BsYXlJbmZvU2hhcGUsXG4gICAgICBNLnNwbGl0UmVjb3JkKHt9LCB7IGVsZW1lbnRTaGFwZTogTS5wYXR0ZXJuKCkgfSlcbiAgICApLlxuICAgIHJldHVybnMoTS5lcmVmKFpvZU1pbnRTaGFwZSkpLFxuICAgIHJlZ2lzdGVyRmVlTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSwgRmVlTWludEFjY2Vzc1NoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKVxuICAgICksXG4gICAgZ2V0SW5zdGFuY2VSZWNvcmQ6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VSZWNvcmRTaGFwZSksXG4gICAgZ2V0SXNzdWVyUmVjb3JkczogTS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoSXNzdWVyUmVjb3JkU2hhcGUpKSxcbiAgICBnZXRXaXRoZHJhd0ZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdXaXRoZHJhd0ZhY2V0JykpLFxuICAgIGluaXRJbnN0YW5jZUFkbWluOiBNLmNhbGwoXG4gICAgICBJbnN0YW5jZUhhbmRsZVNoYXBlLFxuICAgICAgTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKVxuICAgICkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgZGVsZXRlSW5zdGFuY2VBZG1pbjogTS5jYWxsKEluc3RhbmNlQWRtaW5TaGFwZSkucmV0dXJucygpLFxuICAgIG1ha2VJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLCBNLnN0cmluZygpKS5cbiAgICBvcHRpb25hbChNLnJlY29yZCgpLCBNLnBhdHRlcm4oKSkuXG4gICAgcmV0dXJucyhQYXltZW50U2hhcGUpLFxuICAgIGdldFJvb3Q6IE0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG4gICAgZ2V0QWRtaW5Ob2RlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKSlcbiAgfSksXG4gIHdpdGhkcmF3RmFjZXQ6IE0uaW50ZXJmYWNlKCdXaXRoZHJhd0ZhY2V0Jywge1xuICAgIHdpdGhkcmF3UGF5bWVudHM6IE0uY2FsbChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG4gICAgICBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZVxuICAgIClcbiAgfSksXG4gIGhlbHBlcnM6IE0uaW50ZXJmYWNlKCdJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyIGhlbHBlcicsIHtcbiAgICB3cmFwSXNzdWVyS2l0V2l0aFpvZU1pbnQ6IE0uY2FsbChcbiAgICAgIEtleXdvcmRTaGFwZSxcbiAgICAgIElzc3VlcktpdFNoYXBlLFxuICAgICAgTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpXG4gICAgKS5yZXR1cm5zKFpvZU1pbnRTaGFwZSlcbiAgfSlcbn07JGjNj19vbmNlLkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KTtcbmhhcmRlbihJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5cbmNvbnN0IEJ1bmRsZUNhcFNoYXBlID0gTS5yZW1vdGFibGUoJ2J1bmRsZUNhcCcpOyRozY9fb25jZS5CdW5kbGVDYXBTaGFwZShCdW5kbGVDYXBTaGFwZSk7XG5jb25zdCBCdW5kbGVTaGFwZSA9IE0uYW5kKFxuICBNLnNwbGl0UmVjb3JkKHsgbW9kdWxlRm9ybWF0OiBNLmFueSgpIH0pLFxuICBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0uc3RyaW5nKHsgc3RyaW5nTGVuZ3RoTGltaXQ6IEluZmluaXR5IH0pKVxuKTskaM2PX29uY2UuQnVuZGxlU2hhcGUoQnVuZGxlU2hhcGUpO1xuXG5jb25zdCBVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHsgaW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb25TaGFwZSB9LFxuICB7XG4gICAgYnVuZGxlOiBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0uc3RyaW5nKHsgc3RyaW5nTGVuZ3RoTGltaXQ6IEluZmluaXR5IH0pKSxcbiAgICBidW5kbGVDYXA6IEJ1bmRsZUNhcFNoYXBlLFxuICAgIGJ1bmRsZUlEOiBNLnN0cmluZygpXG4gIH0sXG4gIHt9XG4pOyRozY9fb25jZS5VbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZShVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSk7XG5cbmNvbnN0IFpvZVN0b3JhZ2VNYW5hZ2VySUtpdCA9IHtcbiAgem9lU2VydmljZURhdGFBY2Nlc3M6IE0uaW50ZXJmYWNlKCdab2VTZXJ2aWNlIGRhdGFBY2Nlc3MnLCB7XG4gICAgZ2V0VGVybXM6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSkpLFxuICAgIGdldElzc3VlcnM6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgZ2V0QnJhbmRzOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgZ2V0SW5zdGFsbGF0aW9uOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICAgIE0uZXJlZihNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpXG4gICAgKSxcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuICAgIGdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjogTS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5lcmVmKE0uc3RyaW5nKCkpXG4gICAgKSxcbiAgICBpbnN0YWxsQnVuZGxlOiBNLmNhbGwoTS5vcihJbnN0YW5jZUhhbmRsZVNoYXBlLCBCdW5kbGVTaGFwZSkpLlxuICAgIG9wdGlvbmFsKE0uc3RyaW5nKCkpLlxuICAgIHJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIGluc3RhbGxCdW5kbGVJRDogTS5jYWxsKE0uc3RyaW5nKCkpLlxuICAgIG9wdGlvbmFsKE0uc3RyaW5nKCkpLlxuICAgIHJldHVybnMoTS5wcm9taXNlKCkpLFxuXG4gICAgZ2V0UHVibGljRmFjZXQ6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5lcmVmKE0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpKVxuICAgICksXG4gICAgZ2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG4gICAgZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLm9wdChNLnBhdHRlcm4oKSlcbiAgICApXG4gIH0pLFxuICBtYWtlT2ZmZXJBY2Nlc3M6IE0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIG1ha2VPZmZlciBhY2Nlc3MnLCB7XG4gICAgZ2V0QXNzZXRLaW5kQnlCcmFuZDogTS5jYWxsKEJyYW5kU2hhcGUpLnJldHVybnMoQXNzZXRLaW5kU2hhcGUpLFxuICAgIGdldEluc3RhbmNlQWRtaW46IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKVxuICAgICksXG4gICAgZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLm9wdChNLnBhdHRlcm4oKSlcbiAgICApLFxuICAgIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuICAgIGRlcG9zaXRQYXltZW50czogTS5jYWxsKFByb3Bvc2FsU2hhcGUsIFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5wcm9taXNlKClcbiAgICApXG4gIH0pLFxuICBzdGFydEluc3RhbmNlQWNjZXNzOiBNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBzdGFydEluc3RhbmNlIGFjY2VzcycsIHtcbiAgICBtYWtlWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcjogTS5jYWxsKFxuICAgICAgSW5zdGFsbGF0aW9uU2hhcGUsXG4gICAgICBNLmFueSgpLFxuICAgICAgSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgICAgIE0ub3IoSW5zdGFuY2VIYW5kbGVTaGFwZSwgQnVuZGxlU2hhcGUpLFxuICAgICAgTS5vcihCdW5kbGVDYXBTaGFwZSwgQnVuZGxlU2hhcGUpLFxuICAgICAgTS5zdHJpbmcoKVxuICAgICkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgdW53cmFwSW5zdGFsbGF0aW9uOiBNLmNhbGxXaGVuKE0uZXJlZihJbnN0YWxsYXRpb25TaGFwZSkpLnJldHVybnMoXG4gICAgICBVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZVxuICAgIClcbiAgfSksXG4gIGludml0YXRpb25Jc3N1ZXJBY2Nlc3M6IE0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIGludml0YXRpb25Jc3N1ZXInLCB7XG4gICAgZ2V0SW52aXRhdGlvbklzc3VlcjogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSlcbiAgfSlcbn07JGjNj19vbmNlLlpvZVN0b3JhZ2VNYW5hZ2VySUtpdChab2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuaGFyZGVuKFpvZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5cbmNvbnN0IFpvZVNlcnZpY2VJID0gTS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UnLCB7XG4gIGluc3RhbGw6IE0uY2FsbChNLmFueSgpKS5vcHRpb25hbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgaW5zdGFsbEJ1bmRsZUlEOiBNLmNhbGwoTS5zdHJpbmcoKSkub3B0aW9uYWwoTS5zdHJpbmcoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHN0YXJ0SW5zdGFuY2U6IE0uY2FsbChNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKS5cbiAgb3B0aW9uYWwoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSwgTS5yZWNvcmQoKSwgTS5yZWNvcmQoKSwgTS5zdHJpbmcoKSkuXG4gIHJldHVybnMoTS5wcm9taXNlKCkpLFxuICBvZmZlcjogTS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5cbiAgb3B0aW9uYWwoUHJvcG9zYWxTaGFwZSwgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUsIE0uYW55KCkpLlxuICByZXR1cm5zKE0ucHJvbWlzZSgpKSxcblxuICBnZXRPZmZlckZpbHRlcjogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIE0uYXJyYXlPZihNLnN0cmluZygpKVxuICApLFxuICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0RmVlSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0QnJhbmRzOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGVcbiAgKSxcbiAgZ2V0SXNzdWVyczogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIElzc3VlcktleXdvcmRSZWNvcmRTaGFwZVxuICApLFxuICBnZXRQdWJsaWNGYWNldDogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpXG4gICksXG4gIGdldFRlcm1zOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG4gIGdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSlcbiAgKSxcbiAgZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKFxuICAgIE0uZXJlZihNLnN0cmluZygpKVxuICApLFxuXG4gIGdldEluc3RhbGxhdGlvbjogTS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0SW5zdGFuY2U6IE0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldENvbmZpZ3VyYXRpb246IE0uY2FsbCgpLnJldHVybnMoe1xuICAgIGZlZUlzc3VlckNvbmZpZzoge1xuICAgICAgbmFtZTogTS5zdHJpbmcoKSxcbiAgICAgIGFzc2V0S2luZDogJ25hdCcsXG4gICAgICBkaXNwbGF5SW5mbzogRGlzcGxheUluZm9TaGFwZVxuICAgIH1cbiAgfSksXG4gIGdldEludml0YXRpb25EZXRhaWxzOiBNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG4gIGdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgIE0ub3B0KE0ucGF0dGVybigpKVxuICApXG59KTskaM2PX29uY2UuWm9lU2VydmljZUkoWm9lU2VydmljZUkpO1xuXG5jb25zdCBBZG1pbkZhY2V0SSA9IE0uaW50ZXJmYWNlKCdaY2ZBZG1pbkZhY2V0Jywge1xuICBnZXRWYXRTaHV0ZG93blByb21pc2U6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICByZXN0YXJ0Q29udHJhY3Q6IE0uY2FsbCgpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICB1cGdyYWRlQ29udHJhY3Q6IE0uY2FsbChNLnN0cmluZygpKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgdGVybWluYXRlQ29udHJhY3Q6IE0uY2FsbChNLmVycm9yKCkpLnJldHVybnMoTS5wcm9taXNlKCkpXG59KTskaM2PX29uY2UuQWRtaW5GYWNldEkoQWRtaW5GYWNldEkpO1xuXG5jb25zdCBTZWF0RGF0YVNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIHByb3Bvc2FsOiBQcm9wb3NhbFNoYXBlLFxuICAgIGluaXRpYWxBbGxvY2F0aW9uOiBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICAgc2VhdEhhbmRsZTogU2VhdFNoYXBlXG4gIH0sXG4gIHtcbiAgICBvZmZlckFyZ3M6IE0uYW55KClcbiAgfVxuKTskaM2PX29uY2UuU2VhdERhdGFTaGFwZShTZWF0RGF0YVNoYXBlKTtcblxuY29uc3QgSGFuZGxlT2ZmZXJJID0gTS5pbnRlcmZhY2UoJ0hhbmRsZU9mZmVyJywge1xuICBoYW5kbGVPZmZlcjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSwgU2VhdERhdGFTaGFwZSkucmV0dXJucyh7XG4gICAgb2ZmZXJSZXN1bHRQcm9taXNlOiBNLnByb21pc2UoKSxcbiAgICBleGl0T2JqOiBFeGl0T2JqZWN0U2hhcGVcbiAgfSlcbn0pOyRozY9fb25jZS5IYW5kbGVPZmZlckkoSGFuZGxlT2ZmZXJJKTtcblxuY29uc3QgUHJpY2VRdW90ZVNoYXBlID0ge1xuICBxdW90ZUFtb3VudDogQW1vdW50U2hhcGUsXG4gIHF1b3RlUGF5bWVudDogTS5lcmVmKFBheW1lbnRTaGFwZSlcbn07JGjNj19vbmNlLlByaWNlUXVvdGVTaGFwZShQcmljZVF1b3RlU2hhcGUpO1xuaGFyZGVuKFByaWNlUXVvdGVTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJLZXl3b3JkU2hhcGUiOlsiS2V5d29yZFNoYXBlIl0sIkludml0YXRpb25IYW5kbGVTaGFwZSI6WyJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiXSwiSW52aXRhdGlvblNoYXBlIjpbIkludml0YXRpb25TaGFwZSJdLCJJbnN0YW5jZUhhbmRsZVNoYXBlIjpbIkluc3RhbmNlSGFuZGxlU2hhcGUiXSwiSW5zdGFsbGF0aW9uU2hhcGUiOlsiSW5zdGFsbGF0aW9uU2hhcGUiXSwiU2VhdFNoYXBlIjpbIlNlYXRTaGFwZSJdLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIl0sIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSJdLCJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSI6WyJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSJdLCJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSI6WyJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJSZWNvcmRTaGFwZSI6WyJJc3N1ZXJSZWNvcmRTaGFwZSJdLCJUZXJtc1NoYXBlIjpbIlRlcm1zU2hhcGUiXSwiSW5zdGFuY2VSZWNvcmRTaGFwZSI6WyJJbnN0YW5jZVJlY29yZFNoYXBlIl0sIkhhbmRsZUkiOlsiSGFuZGxlSSJdLCJtYWtlSGFuZGxlU2hhcGUiOlsibWFrZUhhbmRsZVNoYXBlIl0sIlRpbWVyU2hhcGUiOlsiVGltZXJTaGFwZSJdLCJGdWxsUHJvcG9zYWxTaGFwZSI6WyJGdWxsUHJvcG9zYWxTaGFwZSJdLCJQcm9wb3NhbFNoYXBlIjpbIlByb3Bvc2FsU2hhcGUiXSwiRW1wdHlQcm9wb3NhbFNoYXBlIjpbIkVtcHR5UHJvcG9zYWxTaGFwZSJdLCJpc09uRGVtYW5kRXhpdFJ1bGUiOlsiaXNPbkRlbWFuZEV4aXRSdWxlIl0sImlzV2FpdmVkRXhpdFJ1bGUiOlsiaXNXYWl2ZWRFeGl0UnVsZSJdLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSI6WyJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSJdLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIjpbIkludml0YXRpb25FbGVtZW50U2hhcGUiXSwiT2ZmZXJIYW5kbGVySSI6WyJPZmZlckhhbmRsZXJJIl0sIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIjpbIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIl0sIlpvZU1pbnRTaGFwZSI6WyJab2VNaW50U2hhcGUiXSwiWm9lTWludEkiOlsiWm9lTWludEkiXSwiRmVlTWludEFjY2Vzc1NoYXBlIjpbIkZlZU1pbnRBY2Nlc3NTaGFwZSJdLCJFeGl0T2JqZWN0SSI6WyJFeGl0T2JqZWN0SSJdLCJFeGl0T2JqZWN0U2hhcGUiOlsiRXhpdE9iamVjdFNoYXBlIl0sIkluc3RhbmNlQWRtaW5TaGFwZSI6WyJJbnN0YW5jZUFkbWluU2hhcGUiXSwiSW5zdGFuY2VBZG1pbkkiOlsiSW5zdGFuY2VBZG1pbkkiXSwiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiXSwiQnVuZGxlQ2FwU2hhcGUiOlsiQnVuZGxlQ2FwU2hhcGUiXSwiQnVuZGxlU2hhcGUiOlsiQnVuZGxlU2hhcGUiXSwiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiOlsiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiXSwiWm9lU3RvcmFnZU1hbmFnZXJJS2l0IjpbIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJab2VTZXJ2aWNlSSI6WyJab2VTZXJ2aWNlSSJdLCJBZG1pbkZhY2V0SSI6WyJBZG1pbkZhY2V0SSJdLCJTZWF0RGF0YVNoYXBlIjpbIlNlYXREYXRhU2hhcGUiXSwiSGFuZGxlT2ZmZXJJIjpbIkhhbmRsZU9mZmVySSJdLCJQcmljZVF1b3RlU2hhcGUiOlsiUHJpY2VRdW90ZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANn0k7SWAQAAlgEAAB4AAABAYWdvcmljL3pvbmUtdjAuMi4yL2R1cmFibGUuanN7ImltcG9ydHMiOlsiLi9zcmMvZHVyYWJsZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2R1cmFibGUuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZHVyYWJsZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACjNH2h2BEAANgRAAAiAAAAQGFnb3JpYy96b25lLXYwLjIuMi9zcmMvZHVyYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvYmFzZS16b25lIl0sImV4cG9ydHMiOlsibWFrZUR1cmFibGVab25lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxGYXIsaXNQYXNzYWJsZSxjYW5CZUR1cmFibGUsbWFrZVNjYWxhck1hcFN0b3JlLHByZXBhcmVFeG8scHJlcGFyZUV4b0NsYXNzLHByZXBhcmVFeG9DbGFzc0tpdCxwcm92aWRlRHVyYWJsZU1hcFN0b3JlLHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUscHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUscHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsd2F0Y2hQcm9taXNlLGtleXMsbWFrZU9uY2VLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVcIixbJGjNj19hID0+IChpc1Bhc3NhYmxlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiY2FuQmVEdXJhYmxlXCIsWyRozY9fYSA9PiAoY2FuQmVEdXJhYmxlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4byA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlTWFwU3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlU2V0U3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZVNldFN0b3JlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSA9ICRozY9fYSldXSxbXCJ3YXRjaFByb21pc2VcIixbJGjNj19hID0+ICh3YXRjaFByb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2Jhc2Utem9uZVwiLCBbW1wiYWdvcmljVmF0RGF0YUtleXNcIixbJGjNj19hID0+IChrZXlzID0gJGjNj19hKV1dLFtcIm1ha2VPbmNlS2l0XCIsWyRozY9fYSA9PiAobWFrZU9uY2VLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGlzU3RvcmFibGUgPSAoc3BlY2ltZW4pID0+IGlzUGFzc2FibGUoc3BlY2ltZW4pICYmIGNhbkJlRHVyYWJsZShzcGVjaW1lbik7XG5oYXJkZW4oaXNTdG9yYWJsZSk7XG5cbi8qXG5cbiAqL1xuY29uc3QgYXR0YWNoRHVyYWJsZVN0b3JlcyA9IChnZXRCYWdnYWdlKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWFwU3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBiYWdnYWdlID0gZ2V0QmFnZ2FnZSgpO1xuICAgIGNvbnN0IHJldCA9IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUoYmFnZ2FnZSwgbGFiZWwsIG9wdGlvbnMpO1xuICAgIHJldHVybiByZXQ7XG4gIH07XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc2V0U3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+XG4gIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUoZ2V0QmFnZ2FnZSgpLCBsYWJlbCwgb3B0aW9ucyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHdlYWtTZXRTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT5cbiAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUoZ2V0QmFnZ2FnZSgpLCBsYWJlbCwgb3B0aW9ucyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHdlYWtNYXBTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT5cbiAgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoZ2V0QmFnZ2FnZSgpLCBsYWJlbCwgb3B0aW9ucyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIHJldHVybiBGYXIoJ2R1cmFibGVTdG9yZXMnLCB7XG4gICAgZGV0YWNoZWQ6ICgpID0+IGRldGFjaGVkRHVyYWJsZVN0b3JlcyxcbiAgICBpc1N0b3JhYmxlLFxuICAgIG1hcFN0b3JlLFxuICAgIHNldFN0b3JlLFxuICAgIHdlYWtNYXBTdG9yZSxcbiAgICB3ZWFrU2V0U3RvcmVcbiAgfSk7XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRldGFjaGVkRHVyYWJsZVN0b3JlcyA9IGF0dGFjaER1cmFibGVTdG9yZXMoKCkgPT5cbm1ha2VTY2FsYXJNYXBTdG9yZSgnZGV0YWNoZWQnKVxuKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VEdXJhYmxlWm9uZSA9IChiYWdnYWdlLCBiYXNlTGFiZWwgPSAnZHVyYWJsZVpvbmUnKSA9PiB7XG4gIGJhZ2dhZ2UgfHwgRmFpbGBiYWdnYWdlIHJlcXVpcmVkYDtcblxuICBjb25zdCBhdHRhY2hlZFN0b3JlcyA9IGF0dGFjaER1cmFibGVTdG9yZXMoKCkgPT4gYmFnZ2FnZSk7XG5cbiAgY29uc3QgeyBtYWtlT25jZSwgd3JhcFByb3ZpZGVyIH0gPSBtYWtlT25jZUtpdChcbiAgICBiYXNlTGFiZWwsXG4gICAgYXR0YWNoZWRTdG9yZXMsXG4gICAgYmFnZ2FnZVxuICApO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZXhvQ2xhc3MgPSAoLi4uYXJncykgPT4gcHJlcGFyZUV4b0NsYXNzKGJhZ2dhZ2UsIC4uLmFyZ3MpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8vXG4gIC8vXG4gIGNvbnN0IGV4b0NsYXNzS2l0ID0gKC4uLmFyZ3MpID0+IHByZXBhcmVFeG9DbGFzc0tpdChiYWdnYWdlLCAuLi5hcmdzKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZXhvID0gKC4uLmFyZ3MpID0+IHByZXBhcmVFeG8oYmFnZ2FnZSwgLi4uYXJncyk7XG5cbiAgY29uc3Qgc3ViWm9uZVN0b3JlID0gd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLm1hcFN0b3JlLCBrZXlzLnpvbmUpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdWJab25lID0gKGxhYmVsLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IHN1YkJhZ2dhZ2UgPSBzdWJab25lU3RvcmUobGFiZWwsIG9wdGlvbnMpO1xuICAgIHJldHVybiBtYWtlRHVyYWJsZVpvbmUoc3ViQmFnZ2FnZSwgYCR7YmFzZUxhYmVsfS4ke2xhYmVsfWApO1xuICB9O1xuXG4gIHJldHVybiBGYXIoJ2R1cmFibGVab25lJywge1xuICAgIGV4bzogd3JhcFByb3ZpZGVyKGV4bywga2V5cy5leG8pLFxuICAgIGV4b0NsYXNzOiB3cmFwUHJvdmlkZXIoZXhvQ2xhc3MsIGtleXMuZXhvQ2xhc3MpLFxuICAgIGV4b0NsYXNzS2l0OiB3cmFwUHJvdmlkZXIoZXhvQ2xhc3NLaXQsIGtleXMuZXhvQ2xhc3NLaXQpLFxuICAgIHN1YlpvbmUsXG5cbiAgICBtYWtlT25jZSxcbiAgICB3YXRjaFByb21pc2UsXG4gICAgZGV0YWNoZWQ6IGF0dGFjaGVkU3RvcmVzLmRldGFjaGVkLFxuICAgIGlzU3RvcmFibGU6IGF0dGFjaGVkU3RvcmVzLmlzU3RvcmFibGUsXG5cbiAgICBtYXBTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLm1hcFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgICBzZXRTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLnNldFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgICB3ZWFrTWFwU3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy53ZWFrTWFwU3RvcmUsIGtleXMuc3RvcmUpLFxuICAgIHdlYWtTZXRTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLndlYWtTZXRTdG9yZSwga2V5cy5zdG9yZSlcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRHVyYWJsZVpvbmUobWFrZUR1cmFibGVab25lKTtcbmhhcmRlbihtYWtlRHVyYWJsZVpvbmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUR1cmFibGVab25lIjpbIm1ha2VEdXJhYmxlWm9uZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB63APlKwUAACsFAAArAAAAQGVuZG8vY29tbW9uLXYxLjIuOS9hcHBseS1sYWJlbGluZy1lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Rocm93LWxhYmVsZWQuanMiXSwiZXhwb3J0cyI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLGlzUHJvbWlzZSx0aHJvd0xhYmVsZWQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3Rocm93LWxhYmVsZWQuanNcIiwgW1tcInRocm93TGFiZWxlZFwiLFskaM2PX2EgPT4gKHRocm93TGFiZWxlZCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGFwcGx5TGFiZWxpbmdFcnJvciA9IChmdW5jLCBhcmdzLCBsYWJlbCA9IHVuZGVmaW5lZCkgPT4ge1xuICBpZiAobGFiZWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmdW5jKC4uLmFyZ3MpO1xuICB9XG4gIGxldCByZXN1bHQ7XG4gIHRyeSB7XG4gICAgcmVzdWx0ID0gZnVuYyguLi5hcmdzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3dMYWJlbGVkKGVyciwgbGFiZWwpO1xuICB9XG4gIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiBFLndoZW4ocmVzdWx0LCB1bmRlZmluZWQsIChyZWFzb24pID0+IHRocm93TGFiZWxlZChyZWFzb24sIGxhYmVsKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTskaM2PX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFwcGx5TGFiZWxpbmdFcnJvciI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAl6jMEKAEAACgBAAAKgAAAEBlbmRvL2NvbW1vbi12MS4yLjkvZnJvbS11bmlxdWUtZW50cmllcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZnJvbVVuaXF1ZUVudHJpZXMgPSAoYWxsRW50cmllcykgPT4ge1xuICBjb25zdCBlbnRyaWVzQXJyYXkgPSBbLi4uYWxsRW50cmllc107XG4gIGNvbnN0IHJlc3VsdCA9IGhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpKTtcbiAgaWYgKG93bktleXMocmVzdWx0KS5sZW5ndGggPT09IGVudHJpZXNBcnJheS5sZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBfXSBvZiBlbnRyaWVzQXJyYXkpIHtcbiAgICBpZiAobmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICBGYWlsYGNvbGxpc2lvbiBvbiBwcm9wZXJ0eSBuYW1lICR7cShuYW1lKX06ICR7ZW50cmllc0FycmF5fWA7XG4gICAgfVxuICAgIG5hbWVzLmFkZChuYW1lKTtcbiAgfVxuICB0aHJvdyBGYWlsYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYDtcbn07JGjNj19vbmNlLmZyb21VbmlxdWVFbnRyaWVzKGZyb21VbmlxdWVFbnRyaWVzKTtcbmhhcmRlbihmcm9tVW5pcXVlRW50cmllcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAARhrgsQwIAAEMCAAAkAAAAQGVuZG8vY29tbW9uLXYxLjIuOS9pZGVudC1jaGVja2VyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpZGVudENoZWNrZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cbi8vXG4vL1xuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgaWRlbnRDaGVja2VyID0gKGNvbmQsIF9kZXRhaWxzKSA9PiBjb25kOyRozY9fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAOKp6oiwIAAIsCAAAmAAAAQGVuZG8vY29tbW9uLXYxLjIuOS9saXN0LWRpZmZlcmVuY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImxpc3REaWZmZXJlbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGxpc3REaWZmZXJlbmNlID0gKGxlZnRMaXN0LCByaWdodExpc3QpID0+IHtcbiAgY29uc3QgcmlnaHRTZXQgPSBuZXcgU2V0KHJpZ2h0TGlzdCk7XG4gIHJldHVybiBsZWZ0TGlzdC5maWx0ZXIoKGVsZW1lbnQpID0+ICFyaWdodFNldC5oYXMoZWxlbWVudCkpO1xufTskaM2PX29uY2UubGlzdERpZmZlcmVuY2UobGlzdERpZmZlcmVuY2UpO1xuaGFyZGVuKGxpc3REaWZmZXJlbmNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEJWBD2vAwAArwMAACoAAABAZW5kby9jb21tb24tdjEuMi45L21ha2UtYXJyYXktaXRlcmF0b3IuanN7ImltcG9ydHMiOlsiLi9tYWtlLWl0ZXJhdG9yLmpzIl0sImV4cG9ydHMiOlsibWFrZUFycmF5SXRlcmF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlSXRlcmF0b3I7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtaXRlcmF0b3IuanNcIiwgW1tcIm1ha2VJdGVyYXRvclwiLFskaM2PX2EgPT4gKG1ha2VJdGVyYXRvciA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlQXJyYXlJdGVyYXRvciA9IChhcnIpID0+IHtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGFycjtcbiAgbGV0IGkgPSAwO1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHtcbiAgICAvKiAgICAgICAgICAgICovXG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICB2YWx1ZSA9IGFycltpXTtcbiAgICAgIGkgKz0gMTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gICAgfVxuICAgIC8vXG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlIH0pO1xuICB9KTtcbn07JGjNj19vbmNlLm1ha2VBcnJheUl0ZXJhdG9yKG1ha2VBcnJheUl0ZXJhdG9yKTtcbmhhcmRlbihtYWtlQXJyYXlJdGVyYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXJyYXlJdGVyYXRvciI6WyJtYWtlQXJyYXlJdGVyYXRvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADV6eHjVgIAAFYCAAAkAAAAQGVuZG8vY29tbW9uLXYxLjIuOS9tYWtlLWl0ZXJhdG9yLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlSXRlcmF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VJdGVyYXRvciA9IChuZXh0KSA9PiB7XG4gIGNvbnN0IGl0ZXIgPSBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiBpdGVyLFxuICAgIG5leHRcbiAgfSk7XG4gIHJldHVybiBpdGVyO1xufTskaM2PX29uY2UubWFrZUl0ZXJhdG9yKG1ha2VJdGVyYXRvcik7XG5oYXJkZW4obWFrZUl0ZXJhdG9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VJdGVyYXRvciI6WyJtYWtlSXRlcmF0b3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8HMmySoDAAAqAwAAIQAAAEBlbmRvL2NvbW1vbi12MS4yLjkvb2JqZWN0LW1hcC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsib2JqZWN0TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO2NvbnN0IHsgZW50cmllcywgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBvYmplY3RNYXAgPSAob3JpZ2luYWwsIG1hcEZuKSA9PiB7XG4gIGNvbnN0IGVudHMgPSBlbnRyaWVzKG9yaWdpbmFsKTtcbiAgY29uc3QgbWFwRW50cyA9IGVudHMubWFwKFxuICAgIChbaywgdl0pID0+IC8qICAgICAgICAgICAgICAgICAgICAgICAqLyhbaywgbWFwRm4odiwgayldKVxuICApO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovKGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSkpO1xufTskaM2PX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im9iamVjdE1hcCI6WyJvYmplY3RNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4LHdvxoEAAAaBAAAJgAAAEBlbmRvL2NvbW1vbi12MS4yLjkvb2JqZWN0LW1ldGEtbWFwLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJvYmplY3RNZXRhTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO2NvbnN0IHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgY3JlYXRlLCBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgb2JqZWN0TWV0YU1hcCA9IChcbm9yaWdpbmFsLFxubWV0YU1hcEZuLFxucHJvdG8gPSBPYmplY3QucHJvdG90eXBlKSA9Plxue1xuICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob3JpZ2luYWwpO1xuICBjb25zdCBrZXlzID0gb3duS2V5cyhvcmlnaW5hbCk7XG5cbiAgY29uc3QgZGVzY0VudHJpZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovKFxuICBrZXlzLlxuICBtYXAoKGtleSkgPT4gW2tleSwgbWV0YU1hcEZuKGRlc2NzW2tleV0sIGtleSldKS5cbiAgZmlsdGVyKChbX2tleSwgb3B0RGVzY10pID0+IG9wdERlc2MgIT09IHVuZGVmaW5lZClcbiAgKTtcbiAgcmV0dXJuIGhhcmRlbihjcmVhdGUocHJvdG8sIGZyb21FbnRyaWVzKGRlc2NFbnRyaWVzKSkpO1xufTskaM2PX29uY2Uub2JqZWN0TWV0YU1hcChvYmplY3RNZXRhTWFwKTtcbmhhcmRlbihvYmplY3RNZXRhTWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im9iamVjdE1ldGFNYXAiOlsib2JqZWN0TWV0YU1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABzUcTODAQAAAwEAAAkAAAAQGVuZG8vY29tbW9uLXYxLjIuOS90aHJvdy1sYWJlbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbInRocm93TGFiZWxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsbWFrZUVycm9yLGFubm90YXRlRXJyb3I7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHRocm93TGFiZWxlZCA9IChcbmlubmVyRXJyLFxubGFiZWwsXG5lcnJDb25zdHJ1Y3RvciA9IHVuZGVmaW5lZCxcbm9wdGlvbnMgPSB1bmRlZmluZWQpID0+XG57XG4gIGlmICh0eXBlb2YgbGFiZWwgPT09ICdudW1iZXInKSB7XG4gICAgbGFiZWwgPSBgWyR7bGFiZWx9XWA7XG4gIH1cbiAgY29uc3Qgb3V0ZXJFcnIgPSBtYWtlRXJyb3IoXG4gICAgYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YCxcbiAgICBlcnJDb25zdHJ1Y3RvcixcbiAgICBvcHRpb25zXG4gICk7XG4gIGFubm90YXRlRXJyb3Iob3V0ZXJFcnIsIFhgQ2F1c2VkIGJ5ICR7aW5uZXJFcnJ9YCk7XG4gIHRocm93IG91dGVyRXJyO1xufTskaM2PX29uY2UudGhyb3dMYWJlbGVkKHRocm93TGFiZWxlZCk7XG5oYXJkZW4odGhyb3dMYWJlbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANKKhqaIBAACiAQAAIQAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2Vudi1vcHRpb25zLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI+O+N6CDwAAgg8AACsAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvc3JjL2Vudi1vcHRpb25zLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIiwiZ2V0RW52aXJvbm1lbnRPcHRpb24iLCJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0IiwibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qICAgICAgICAgICAgICAgICAgICovXG4vL1xuXG4vL1xuLy9cblxuLy9cbi8vXG4vL1xuXG5jb25zdCB7IGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcblxuLy9cbi8vXG5jb25zdCB1bmN1cnJ5VGhpcyA9XG4oZm4pID0+XG4ocmVjZWl2ZXIsIC4uLmFyZ3MpID0+XG5hcHBseShmbiwgcmVjZWl2ZXIsIGFyZ3MpO1xuY29uc3QgYXJyYXlQdXNoID0gdW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuY29uc3QgYXJyYXlJbmNsdWRlcyA9IHVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyk7XG5jb25zdCBzdHJpbmdTcGxpdCA9IHVuY3VycnlUaGlzKFN0cmluZy5wcm90b3R5cGUuc3BsaXQpO1xuXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IEZhaWwgPSAobGl0ZXJhbHMsIC4uLmFyZ3MpID0+IHtcbiAgbGV0IG1zZyA9IGxpdGVyYWxzWzBdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBtc2cgPSBgJHttc2d9JHthcmdzW2ldfSR7bGl0ZXJhbHNbaSArIDFdfWA7XG4gIH1cbiAgdGhyb3cgRXJyb3IobXNnKTtcbn07XG5cbi8vXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFbnZpcm9ubWVudENhcHRvciA9IChhR2xvYmFsLCBkcm9wTmFtZXMgPSBmYWxzZSkgPT4ge1xuICBjb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMgPSBbXTtcblxuICAvKlxuICBcbiAgXG4gICAgICovXG5cblxuXG5cblxuXG4gIGNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uID0gKFxuICBvcHRpb25OYW1lLFxuICBkZWZhdWx0U2V0dGluZyxcbiAgb3B0T3RoZXJWYWx1ZXMgPSB1bmRlZmluZWQpID0+XG4gIHtcbiAgICB0eXBlb2Ygb3B0aW9uTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lICR7cShvcHRpb25OYW1lKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuICAgIHR5cGVvZiBkZWZhdWx0U2V0dGluZyA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBkZWZhdWx0IHNldHRpbmcgJHtxKFxuICAgICAgZGVmYXVsdFNldHRpbmdcbiAgICApfSBtdXN0IGJlIGEgc3RyaW5nLmA7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICBsZXQgc2V0dGluZyA9IGRlZmF1bHRTZXR0aW5nO1xuICAgIGNvbnN0IGdsb2JhbFByb2Nlc3MgPSBhR2xvYmFsLnByb2Nlc3MgfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGdsb2JhbEVudiA9XG4gICAgKHR5cGVvZiBnbG9iYWxQcm9jZXNzID09PSAnb2JqZWN0JyAmJiBnbG9iYWxQcm9jZXNzLmVudikgfHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsRW52ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKG9wdGlvbk5hbWUgaW4gZ2xvYmFsRW52KSB7XG4gICAgICAgIGlmICghZHJvcE5hbWVzKSB7XG4gICAgICAgICAgYXJyYXlQdXNoKGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcywgb3B0aW9uTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBnbG9iYWxFbnZbb3B0aW9uTmFtZV07XG4gICAgICAgIC8vXG4gICAgICAgIHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZWQgJHtxKFxuICAgICAgICAgIG9wdGlvbk5hbWVcbiAgICAgICAgKX0sIGlmIHByZXNlbnQsIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgc3RyaW5nIHZhbHVlLCBnb3QgJHtxKFxuICAgICAgICAgIG9wdGlvblZhbHVlXG4gICAgICAgICl9YDtcbiAgICAgICAgc2V0dGluZyA9IG9wdGlvblZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBvcHRPdGhlclZhbHVlcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgc2V0dGluZyA9PT0gZGVmYXVsdFNldHRpbmcgfHxcbiAgICBhcnJheUluY2x1ZGVzKG9wdE90aGVyVmFsdWVzLCBzZXR0aW5nKSB8fFxuICAgIEZhaWxgVW5yZWNvZ25pemVkICR7cShvcHRpb25OYW1lKX0gdmFsdWUgJHtxKFxuICAgICAgc2V0dGluZ1xuICAgICl9LiBFeHBlY3RlZCBvbmUgb2YgJHtxKFtkZWZhdWx0U2V0dGluZywgLi4ub3B0T3RoZXJWYWx1ZXNdKX1gO1xuICAgIHJldHVybiBzZXR0aW5nO1xuICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG4gIC8qXG4gICAgICovXG5cblxuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0ID0gKG9wdGlvbk5hbWUpID0+IHtcbiAgICBjb25zdCBvcHRpb24gPSBnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCAnJyk7XG4gICAgcmV0dXJuIGZyZWV6ZShvcHRpb24gPT09ICcnID8gW10gOiBzdHJpbmdTcGxpdChvcHRpb24sICcsJykpO1xuICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9IChvcHRpb25OYW1lLCBlbGVtZW50KSA9PlxuICBhcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksIGVsZW1lbnQpO1xuXG4gIGNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9ICgpID0+IHtcbiAgICByZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiAgfTtcbiAgZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxuICAgIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lc1xuICB9KTtcbn07JGjNj19vbmNlLm1ha2VFbnZpcm9ubWVudENhcHRvcihtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuZnJlZXplKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG5cbi8qXG5cblxuICovXG5jb25zdCB7XG4gIGdldEVudmlyb25tZW50T3B0aW9uLFxuICBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0LFxuICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXG59ID0gbWFrZUVudmlyb25tZW50Q2FwdG9yKGdsb2JhbFRoaXMsIHRydWUpOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbihnZXRFbnZpcm9ubWVudE9wdGlvbik7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7JGjNj19vbmNlLmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sImdldEVudmlyb25tZW50T3B0aW9uIjpbImdldEVudmlyb25tZW50T3B0aW9uIl0sImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiOlsiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCJdLCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJ8UmbDkIAAA5CAAAHAAAAEBlbmRvL2Vycm9ycy12MS4yLjkvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkZhaWwiLCJYIiwiYW5ub3RhdGVFcnJvciIsImFzc2VydCIsImIiLCJiYXJlIiwibWFrZUVycm9yIiwibm90ZSIsInEiLCJxdW90ZSIsInJlZGFjdGVkIiwidGhyb3dSZWRhY3RlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiAgICAgICAgICAgICAgICAgICAqL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuXG5jb25zdCBnbG9iYWxBc3NlcnQgPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuaWYgKGdsb2JhbEFzc2VydCA9PT0gdW5kZWZpbmVkKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BlbmRvL2Vycm9ycydgXG4gICk7XG59XG5cbmNvbnN0IG1pc3NpbmcgPSAvKiAgICAgICAgICAgICAgICAqLyhbXG4ndHlwZW9mJyxcbidlcnJvcicsXG4nZmFpbCcsXG4nZXF1YWwnLFxuJ3N0cmluZycsXG4nbm90ZScsXG4nZGV0YWlscycsXG4nRmFpbCcsXG4ncXVvdGUnLFxuLy9cbi8vXG4vL1xuLy9cbidtYWtlQXNzZXJ0J11cbikuZmlsdGVyKChuYW1lKSA9PiBnbG9iYWxBc3NlcnRbbmFtZV0gPT09IHVuZGVmaW5lZCk7XG5pZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbiAgICAgICcsICdcbiAgICApfWBcbiAgKTtcbn1cblxuLy9cbi8vXG4vL1xuY29uc3Qge1xuICBiYXJlLFxuICBkZXRhaWxzOiByZWRhY3RlZCxcbiAgZXJyb3I6IG1ha2VFcnJvcixcbiAgRmFpbDogdGhyb3dSZWRhY3RlZCxcbiAgbWFrZUFzc2VydDogX29taXR0ZWRNYWtlQXNzZXJ0LFxuICBub3RlLFxuICBxdW90ZSxcbiAgLi4uYXNzZXJ0aW9uc1xufSA9IGdsb2JhbEFzc2VydDtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbiRozY9fb25jZS5yZWRhY3RlZChyZWRhY3RlZCk7JGjNj19vbmNlLm1ha2VFcnJvcihtYWtlRXJyb3IpOyRozY9fb25jZS50aHJvd1JlZGFjdGVkKHRocm93UmVkYWN0ZWQpOyRozY9fb25jZS5ub3RlKG5vdGUpOyRozY9fb25jZS5xdW90ZShxdW90ZSk7Y29uc3QgYXNzZXJ0ID0gKHZhbHVlLCBvcHREZXRhaWxzLCBlcnJDb250cnVjdG9yLCBvcHRpb25zKSA9PlxuZ2xvYmFsQXNzZXJ0KHZhbHVlLCBvcHREZXRhaWxzLCBlcnJDb250cnVjdG9yLCBvcHRpb25zKTskaM2PX29uY2UuYXNzZXJ0KGFzc2VydCk7XG5PYmplY3QuYXNzaWduKGFzc2VydCwgYXNzZXJ0aW9ucyk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IGJhcmVPclF1b3RlID0gYmFyZSB8fCBxdW90ZTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5iYXJlT3JRdW90ZShiYXJlT3JRdW90ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWRhY3RlZCI6WyJyZWRhY3RlZCJdLCJYIjpbInJlZGFjdGVkIl0sIm1ha2VFcnJvciI6WyJtYWtlRXJyb3IiXSwidGhyb3dSZWRhY3RlZCI6WyJ0aHJvd1JlZGFjdGVkIl0sIkZhaWwiOlsidGhyb3dSZWRhY3RlZCJdLCJub3RlIjpbIm5vdGUiXSwiYW5ub3RhdGVFcnJvciI6WyJub3RlIl0sInF1b3RlIjpbInF1b3RlIl0sInEiOlsicXVvdGUiXSwiYXNzZXJ0IjpbImFzc2VydCJdLCJiYXJlIjpbImJhcmVPclF1b3RlIl0sImIiOlsiYmFyZU9yUXVvdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAUUg0vVcVAABXFQAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wL3NyYy9FLmpzeyJpbXBvcnRzIjpbIi4vdHJhY2stdHVybnMuanMiLCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHJhY2tUdXJucyxtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsWyRozY9fYSA9PiAodHJhY2tUdXJucyA9ICRozY9fYSldXV1dLFtcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsWyRozY9fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsLCBlcnJvcjogbWFrZUVycm9yIH0gPSBhc3NlcnQ7XG5jb25zdCB7IGFzc2lnbiwgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qXG5cbiAqL1xuXG5jb25zdCBvblNlbmQgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fU0VORF9CUkVBS1BPSU5UUycpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlciA9IHtcbiAgc2V0KF90YXJnZXQsIF9wcm9wLCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGlzRXh0ZW5zaWJsZShfdGFyZ2V0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBzZXRQcm90b3R5cGVPZihfdGFyZ2V0LCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KF90YXJnZXQsIF9wcm9wKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFUHJveHlIYW5kbGVyID0gKHJlY2lwaWVudCwgSGFuZGxlZFByb21pc2UpID0+XG5oYXJkZW4oe1xuICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICBnZXQ6IChfdGFyZ2V0LCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpID0+IHtcbiAgICByZXR1cm4gaGFyZGVuKFxuICAgICAge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgW3Byb3BlcnR5S2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgaWYgKHRoaXMgIT09IHJlY2VpdmVyKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgbWFrZUVycm9yKFxuICAgICAgICAgICAgICAgIFhgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocHJvcGVydHlLZXkpfVwiIG1ldGhvZCBvZiBFKCR7cShcbiAgICAgICAgICAgICAgICAgIHJlY2lwaWVudFxuICAgICAgICAgICAgICAgICl9KWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QocmVjaXBpZW50LCBwcm9wZXJ0eUtleSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgIH1bcHJvcGVydHlLZXldXG4gICAgKTtcbiAgfSxcbiAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJnQXJyYXkgPSBbXSkgPT4ge1xuICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCB1bmRlZmluZWQpKSB7XG4gICAgICAvL1xuICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgfVxuICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHJlY2lwaWVudCwgYXJnQXJyYXkpO1xuICB9LFxuICBoYXM6IChfdGFyZ2V0LCBfcCkgPT4ge1xuICAgIC8vXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyID0gKHJlY2lwaWVudCwgSGFuZGxlZFByb21pc2UpID0+XG5oYXJkZW4oe1xuICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICBnZXQ6IChfdGFyZ2V0LCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpID0+IHtcbiAgICByZXR1cm4gaGFyZGVuKFxuICAgICAge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIHRoaXMgPT09IHJlY2VpdmVyIHx8XG4gICAgICAgICAgRmFpbGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShcbiAgICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgICAgKX1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EocmVjaXBpZW50KX0pYDtcbiAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgIH1cbiAgICAgICAgICBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHJlY2lwaWVudCwgcHJvcGVydHlLZXksIGFyZ3MpO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgIH1bcHJvcGVydHlLZXldXG4gICAgKTtcbiAgfSxcbiAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJnc0FycmF5ID0gW10pID0+IHtcbiAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgLy9cbiAgICAgIGRlYnVnZ2VyOyAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgIH1cbiAgICBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkocmVjaXBpZW50LCBhcmdzQXJyYXkpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0sXG4gIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgLy9cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyID0gKHgsIEhhbmRsZWRQcm9taXNlKSA9PlxuaGFyZGVuKHtcbiAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgaGFzOiAoX3RhcmdldCwgX3Byb3ApID0+IHRydWUsXG4gIGdldDogKF90YXJnZXQsIHByb3ApID0+IEhhbmRsZWRQcm9taXNlLmdldCh4LCBwcm9wKVxufSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZnVuY1RhcmdldCA9IGZyZWV6ZSgoKSA9PiB7fSk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBvYmpUYXJnZXQgPSBmcmVlemUoeyBfX3Byb3RvX186IG51bGwgfSk7XG5cbi8qXG5cbiAqL1xuY29uc3QgbWFrZUUgPSAoSGFuZGxlZFByb21pc2UpID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBhc3NpZ24oXG4gICAgICAvKlxuICAgICAgXG4gICAgICAgKi9cblxuXG5cblxuXG5cbiAgICAgIC8vXG4gICAgICAoeCkgPT4gbmV3IFByb3h5KGZ1bmNUYXJnZXQsIG1ha2VFUHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG4gICAgICB7XG4gICAgICAgIC8qXG4gICAgICAgIFxuICAgICAgICAgKi9cblxuXG5cblxuXG5cblxuXG4gICAgICAgIC8vXG4gICAgICAgIGdldDogKHgpID0+IG5ldyBQcm94eShvYmpUYXJnZXQsIG1ha2VFR2V0UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLypcbiAgICAgICAgICAgICAgICAqL1xuXG5cblxuXG5cblxuXG4gICAgICAgIHJlc29sdmU6IEhhbmRsZWRQcm9taXNlLnJlc29sdmUsXG5cbiAgICAgICAgLypcbiAgICAgICAgICAgICAgICAqL1xuXG5cblxuXG5cblxuXG4gICAgICAgIHNlbmRPbmx5OiAoeCkgPT5cbiAgICAgICAgLy9cbiAgICAgICAgbmV3IFByb3h5KGZ1bmNUYXJnZXQsIG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcblxuICAgICAgICAvKlxuICAgICAgICBcbiAgICAgICAgICAqL1xuXG5cblxuXG5cblxuXG5cblxuICAgICAgICB3aGVuOiAoeCwgb25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpID0+XG4gICAgICAgIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihcbiAgICAgICAgICAuLi50cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCwgb25yZWplY3RlZF0pXG4gICAgICAgIClcbiAgICAgIH1cbiAgICApXG4gICk7XG59O1xuXG5jb25zdCB7IGRlZmF1bHQ6ICRjzY9fZGVmYXVsdCB9ID0geyBkZWZhdWx0OiBtYWtlRSB9O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlZmF1bHQoJGPNj19kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAUMfJoGIOAABiDgAAJwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wL3NyYy9sb2NhbC5qc3siaW1wb3J0cyI6WyIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJnZXRNZXRob2ROYW1lcyIsImxvY2FsQXBwbHlGdW5jdGlvbiIsImxvY2FsQXBwbHlNZXRob2QiLCJsb2NhbEdldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcjskaM2PX2ltcG9ydHMoW1tcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsWyRozY9fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSwgRmFpbCB9ID0gYXNzZXJ0O1xuXG5jb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGdldFByb3RvdHlwZU9mLCBmcmVlemUgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHksIG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbmNvbnN0IG50eXBlb2YgPSAoc3BlY2ltZW4pID0+IChzcGVjaW1lbiA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBzcGVjaW1lbik7XG5cbmNvbnN0IG9uRGVsaXZlcnkgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fREVMSVZFUllfQlJFQUtQT0lOVFMnKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc09iamVjdCA9ICh2YWwpID0+IE9iamVjdCh2YWwpID09PSB2YWw7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQgPSAoYSwgYikgPT4ge1xuICBpZiAodHlwZW9mIGEgPT09IHR5cGVvZiBiKSB7XG4gICAgY29uc3QgbGVmdCA9IFN0cmluZyhhKTtcbiAgICBjb25zdCByaWdodCA9IFN0cmluZyhiKTtcbiAgICAvL1xuICAgIHJldHVybiBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPiByaWdodCA/IDEgOiAwO1xuICB9XG4gIGlmICh0eXBlb2YgYSA9PT0gJ3N5bWJvbCcpIHtcbiAgICBhc3NlcnQodHlwZW9mIGIgPT09ICdzdHJpbmcnKTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgYXNzZXJ0KHR5cGVvZiBhID09PSAnc3RyaW5nJyk7XG4gIGFzc2VydCh0eXBlb2YgYiA9PT0gJ3N5bWJvbCcpO1xuICByZXR1cm4gMTtcbn07XG5cbi8qXG5cblxuICovXG5jb25zdCBnZXRNZXRob2ROYW1lcyA9ICh2YWwpID0+IHtcbiAgbGV0IGxheWVyID0gdmFsO1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKTsgLy9cbiAgd2hpbGUgKGxheWVyICE9PSBudWxsICYmIGxheWVyICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgLy9cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAodHlwZW9mIHZhbFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBuYW1lcy5hZGQobmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNPYmplY3QodmFsKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxheWVyID0gZ2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuICB9XG4gIHJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xufTtcbi8vXG4vL1xuJGjNj19vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtmcmVlemUoZ2V0TWV0aG9kTmFtZXMpO1xuXG5jb25zdCBsb2NhbEFwcGx5RnVuY3Rpb24gPSAocmVjaXBpZW50LCBhcmdzKSA9PiB7XG4gIHR5cGVvZiByZWNpcGllbnQgPT09ICdmdW5jdGlvbicgfHxcbiAgYXNzZXJ0LmZhaWwoXG4gICAgWGBDYW5ub3QgaW52b2tlIHRhcmdldCBhcyBhIGZ1bmN0aW9uOyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgIG50eXBlb2YocmVjaXBpZW50KVxuICAgICl9YCxcbiAgICBUeXBlRXJyb3JcbiAgKTtcbiAgaWYgKG9uRGVsaXZlcnkgJiYgb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgIC8vXG4gICAgZGVidWdnZXI7IC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShyZWNpcGllbnQsIHVuZGVmaW5lZCwgYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5sb2NhbEFwcGx5RnVuY3Rpb24obG9jYWxBcHBseUZ1bmN0aW9uKTtcblxuY29uc3QgbG9jYWxBcHBseU1ldGhvZCA9IChyZWNpcGllbnQsIG1ldGhvZE5hbWUsIGFyZ3MpID0+IHtcbiAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fCBtZXRob2ROYW1lID09PSBudWxsKSB7XG4gICAgLy9cbiAgICByZXR1cm4gbG9jYWxBcHBseUZ1bmN0aW9uKHJlY2lwaWVudCwgYXJncyk7XG4gIH1cbiAgaWYgKHJlY2lwaWVudCA9PT0gdW5kZWZpbmVkIHx8IHJlY2lwaWVudCA9PT0gbnVsbCkge1xuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGBDYW5ub3QgZGVsaXZlciAke3EobWV0aG9kTmFtZSl9IHRvIHRhcmdldDsgdHlwZW9mIHRhcmdldCBpcyAke3EoXG4gICAgICAgIG50eXBlb2YocmVjaXBpZW50KVxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yXG4gICAgKTtcbiAgfVxuICBjb25zdCBmbiA9IHJlY2lwaWVudFttZXRob2ROYW1lXTtcbiAgaWYgKGZuID09PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgdGFyZ2V0IGhhcyBubyBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSwgaGFzICR7cShcbiAgICAgICAgZ2V0TWV0aG9kTmFtZXMocmVjaXBpZW50KVxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yXG4gICAgKTtcbiAgfVxuICBjb25zdCBmdHlwZSA9IG50eXBlb2YoZm4pO1xuICB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgfHxcbiAgRmFpbGBpbnZva2VkIG1ldGhvZCAke3EobWV0aG9kTmFtZSl9IGlzIG5vdCBhIGZ1bmN0aW9uOyBpdCBpcyBhICR7cShcbiAgICBmdHlwZVxuICApfWA7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIG1ldGhvZE5hbWUpKSB7XG4gICAgLy9cbiAgICBkZWJ1Z2dlcjsgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGFwcGx5KGZuLCByZWNpcGllbnQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseU1ldGhvZChsb2NhbEFwcGx5TWV0aG9kKTtcblxuY29uc3QgbG9jYWxHZXQgPSAodCwga2V5KSA9PiB0W2tleV07JGjNj19vbmNlLmxvY2FsR2V0KGxvY2FsR2V0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImxvY2FsQXBwbHlGdW5jdGlvbiI6WyJsb2NhbEFwcGx5RnVuY3Rpb24iXSwibG9jYWxBcHBseU1ldGhvZCI6WyJsb2NhbEFwcGx5TWV0aG9kIl0sImxvY2FsR2V0IjpbImxvY2FsR2V0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN8er60LDwAACw8AADUAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMC9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IHF1b3RlOiBxLCBGYWlsIH0gPSBhc3NlcnQ7XG5cbmNvbnN0IHsgaGFzT3duLCBmcmVlemUsIGVudHJpZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuLypcblxuXG5cblxuXG4gKi9cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgaXNKU09OUmVjb3JkID0gKHZhbCkgPT5cbnR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWwpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzaW1wbGlmeVRhZyA9ICh0YWcpID0+IHtcbiAgZm9yIChjb25zdCBwcmVmaXggb2YgWydBbGxlZ2VkOiAnLCAnRGVidWdOYW1lOiAnXSkge1xuICAgIGlmICh0YWcuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICByZXR1cm4gdGFnLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFnO1xufTtcblxuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9IChvcHRpb25OYW1lKSA9PiB7XG4gIGxldCBicmVha3BvaW50cyA9IEpTT04ucGFyc2UoZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJ251bGwnKSk7XG5cbiAgaWYgKGJyZWFrcG9pbnRzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgYnJlYWtwb2ludHNUYWJsZTtcblxuICBjb25zdCBnZXRCcmVha3BvaW50cyA9ICgpID0+IGJyZWFrcG9pbnRzO1xuICBmcmVlemUoZ2V0QnJlYWtwb2ludHMpO1xuXG4gIGNvbnN0IHNldEJyZWFrcG9pbnRzID0gKG5ld0JyZWFrcG9pbnRzID0gYnJlYWtwb2ludHMpID0+IHtcbiAgICBpc0pTT05SZWNvcmQobmV3QnJlYWtwb2ludHMpIHx8XG4gICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbiB0byBiZSBhIEpTT04gYnJlYWtwb2ludHMgcmVjb3JkYDtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIC8vXG4gICAgY29uc3QgbmV3QnJlYWtwb2ludHNUYWJsZSA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICBmb3IgKGNvbnN0IFt0YWcsIG1ldGhvZEJQc10gb2YgZW50cmllcyhuZXdCcmVha3BvaW50cykpIHtcbiAgICAgIHRhZyA9PT0gc2ltcGxpZnlUYWcodGFnKSB8fFxuICAgICAgRmFpbGBKdXN0IHVzZSBzaW1wbGUgdGFnICR7cShzaW1wbGlmeVRhZyh0YWcpKX0gcmF0aGVyIHRoYW4gJHtxKHRhZyl9YDtcbiAgICAgIGlzSlNPTlJlY29yZChtZXRob2RCUHMpIHx8XG4gICAgICBGYWlsYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKFxuICAgICAgICB0YWdcbiAgICAgICl9IHRvIGJlIGEgSlNPTiBtZXRob2RzIGJyZWFrcG9pbnRzIHJlY29yZGA7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBjb3VudF0gb2YgZW50cmllcyhtZXRob2RCUHMpKSB7XG4gICAgICAgIGNvdW50ID09PSAnKicgfHxcbiAgICAgICAgKHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpICYmXG4gICAgICAgIGNvdW50ID49IDApIHx8XG4gICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EodGFnKX0uJHtxKFxuICAgICAgICAgIG1ldGhvZE5hbWVcbiAgICAgICAgKX0gdG8gYmUgXCIqXCIgb3IgYSBub24tbmVnYXRpdmUgaW50ZWdlcmA7XG5cbiAgICAgICAgY29uc3QgY2xhc3NCUHMgPSBoYXNPd24obmV3QnJlYWtwb2ludHNUYWJsZSwgbWV0aG9kTmFtZSkgP1xuICAgICAgICBuZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdIDpcbiAgICAgICAgKG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gPSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBfX3Byb3RvX186IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIGNsYXNzQlBzW3RhZ10gPSBjb3VudDtcbiAgICAgIH1cbiAgICB9XG4gICAgYnJlYWtwb2ludHMgPSBuZXdCcmVha3BvaW50cztcbiAgICBicmVha3BvaW50c1RhYmxlID0gbmV3QnJlYWtwb2ludHNUYWJsZTtcbiAgfTtcbiAgZnJlZXplKHNldEJyZWFrcG9pbnRzKTtcblxuICBjb25zdCBzaG91bGRCcmVha3BvaW50ID0gKHJlY2lwaWVudCwgbWV0aG9kTmFtZSkgPT4ge1xuICAgIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHwgbWV0aG9kTmFtZSA9PT0gbnVsbCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NCUHMgPSBicmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdIHx8IGJyZWFrcG9pbnRzVGFibGVbJyonXTtcbiAgICBpZiAoY2xhc3NCUHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgdGFnID0gc2ltcGxpZnlUYWcocmVjaXBpZW50W1N5bWJvbC50b1N0cmluZ1RhZ10pO1xuICAgIGxldCBjb3VudCA9IGNsYXNzQlBzW3RhZ107XG4gICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhZyA9ICcqJztcbiAgICAgIGNvdW50ID0gY2xhc3NCUHNbdGFnXTtcbiAgICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSAnKicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhc3NlcnQodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJyAmJiBjb3VudCA+PSAxKTtcbiAgICBjbGFzc0JQc1t0YWddID0gY291bnQgLSAxO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgZnJlZXplKHNob3VsZEJyZWFrcG9pbnQpO1xuXG4gIGNvbnN0IGJyZWFrcG9pbnRUZXN0ZXIgPSBmcmVlemUoe1xuICAgIGdldEJyZWFrcG9pbnRzLFxuICAgIHNldEJyZWFrcG9pbnRzLFxuICAgIHNob3VsZEJyZWFrcG9pbnRcbiAgfSk7XG4gIGJyZWFrcG9pbnRUZXN0ZXIuc2V0QnJlYWtwb2ludHMoKTtcbiAgcmV0dXJuIGJyZWFrcG9pbnRUZXN0ZXI7XG59OyRozY9fb25jZS5tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbmZyZWV6ZShtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAH1gKNPQMAAD0DAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlRTskaM2PX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKG1ha2VFID0gJGjNj19hKV1dXV0sW1wiLi9leHBvcnRzLmpzXCIsIFtdXV0pO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgaHAgPSBIYW5kbGVkUHJvbWlzZTskaM2PX29uY2UuaHAoaHApO1xuY29uc3QgRSA9IG1ha2VFKGhwKTskaM2PX29uY2UuRShFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABCx2ZTXgoAAF4KAAAtAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXSxbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm4gPSAwO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG5cbi8vXG5jb25zdCBWRVJCT1NFID0gZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcygnREVCVUcnLCAndHJhY2stdHVybnMnKTtcblxuLy9cbi8vXG5jb25zdCBFTkFCTEVEID1cbmdldEVudmlyb25tZW50T3B0aW9uKCdUUkFDS19UVVJOUycsICdkaXNhYmxlZCcsIFsnZW5hYmxlZCddKSA9PT0gJ2VuYWJsZWQnO1xuXG4vL1xuLy9cbi8vXG4vL1xuXG5jb25zdCBhZGRSZWplY3Rpb25Ob3RlID0gKGRldGFpbHNOb3RlKSA9PiAocmVhc29uKSA9PiB7XG4gIGlmIChyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGdsb2JhbFRoaXMuYXNzZXJ0Lm5vdGUocmVhc29uLCBkZXRhaWxzTm90ZSk7XG4gIH1cbiAgaWYgKFZFUkJPU0UpIHtcbiAgICBjb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLCByZWFzb24pO1xuICB9XG59O1xuXG5jb25zdCB3cmFwRnVuY3Rpb24gPVxuKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkgPT5cbiguLi5hcmdzKSA9PiB7XG4gIGhpZGRlblByaW9yRXJyb3IgPSBzZW5kaW5nRXJyb3I7XG4gIGhpZGRlbkN1cnJlbnRUdXJuICs9IDE7XG4gIGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG4gIHRyeSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZnVuYyguLi5hcmdzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKFxuICAgICAgICAgIGVycixcbiAgICAgICAgICBYYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChWRVJCT1NFKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLCBlcnIpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICAvL1xuICAgIGNvbnN0IGRldGFpbHNOb3RlID0gWGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGZpbmFsbHkge1xuICAgIGhpZGRlblByaW9yRXJyb3IgPSB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgdHJhY2tUdXJucyA9IChmdW5jcykgPT4ge1xuICBpZiAoIUVOQUJMRUQgfHwgdHlwZW9mIGdsb2JhbFRoaXMgPT09ICd1bmRlZmluZWQnIHx8ICFnbG9iYWxUaGlzLmFzc2VydCkge1xuICAgIHJldHVybiBmdW5jcztcbiAgfVxuICBjb25zdCB7IGRldGFpbHM6IFgsIG5vdGU6IGFubm90YXRlRXJyb3IgfSA9IGdsb2JhbFRoaXMuYXNzZXJ0O1xuXG4gIGhpZGRlbkN1cnJlbnRFdmVudCArPSAxO1xuICBjb25zdCBzZW5kaW5nRXJyb3IgPSBFcnJvcihcbiAgICBgRXZlbnQ6ICR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWBcbiAgKTtcbiAgaWYgKGhpZGRlblByaW9yRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFubm90YXRlRXJyb3Ioc2VuZGluZ0Vycm9yLCBYYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuICB9XG5cbiAgcmV0dXJuIC8qICAgICAgICAgICAgKi8oXG4gIGZ1bmNzLm1hcCgoZnVuYykgPT4gZnVuYyAmJiB3cmFwRnVuY3Rpb24oZnVuYywgc2VuZGluZ0Vycm9yLCBYKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS50cmFja1R1cm5zKHRyYWNrVHVybnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMC91dGlscy5qc3siaW1wb3J0cyI6WyIuL3NyYy9sb2NhbC5qcyIsIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2xvY2FsLmpzXCIsIFtdXSxbXCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvbG9jYWwuanMiOltbImdldE1ldGhvZE5hbWVzIiwiZ2V0TWV0aG9kTmFtZXMiXV0sIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOltbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciIsIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3EXZo2ACAABgAgAAGQAAAEBlbmRvL2V4by12MS41LjgvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZXhvLW1ha2Vycy5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy9leG8tbWFrZXJzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZXhvLW1ha2Vycy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL2dldC1pbnRlcmZhY2UuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzIjpbWyJHRVRfSU5URVJGQUNFX0dVQVJEIiwiR0VUX0lOVEVSRkFDRV9HVUFSRCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsQ9eCpAXAACQFwAAIgAAAEBlbmRvL2V4by12MS41Ljgvc3JjL2V4by1tYWtlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyIsIi4vZXhvLXRvb2xzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzc0tpdCIsImluaXRFbXB0eSIsIm1ha2VFeG8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyxGYWlsLHEsZGVmZW5kUHJvdG90eXBlLGRlZmVuZFByb3RvdHlwZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLFskaM2PX2EgPT4gKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9leG8tdG9vbHMuanNcIiwgW1tcImRlZmVuZFByb3RvdHlwZVwiLFskaM2PX2EgPT4gKGRlZmVuZFByb3RvdHlwZSA9ICRozY9fYSldXSxbXCJkZWZlbmRQcm90b3R5cGVLaXRcIixbJGjNj19hID0+IChkZWZlbmRQcm90b3R5cGVLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG5jb25zdCB7IGNyZWF0ZSwgc2VhbCwgZnJlZXplLCBkZWZpbmVQcm9wZXJ0eSwgdmFsdWVzIH0gPSBPYmplY3Q7XG5cbi8vXG5jb25zdCBMQUJFTF9JTlNUQU5DRVMgPSBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKCdERUJVRycsICdsYWJlbC1pbnN0YW5jZXMnKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBtYWtlU2VsZiA9IChwcm90bywgaW5zdGFuY2VDb3VudCkgPT4ge1xuICBjb25zdCBzZWxmID0gY3JlYXRlKHByb3RvKTtcbiAgaWYgKExBQkVMX0lOU1RBTkNFUykge1xuICAgIGRlZmluZVByb3BlcnR5KHNlbGYsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuICAgICAgdmFsdWU6IGAke3Byb3RvW1N5bWJvbC50b1N0cmluZ1RhZ119IyR7aW5zdGFuY2VDb3VudH1gLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbihzZWxmKTtcbn07XG5cbmNvbnN0IGVtcHR5UmVjb3JkID0gaGFyZGVuKHt9KTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBpbml0RW1wdHkgPSAoKSA9PiBlbXB0eVJlY29yZDtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaW5pdEVtcHR5KGluaXRFbXB0eSk7XG5jb25zdCBkZWZpbmVFeG9DbGFzcyA9IChcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zID0ge30pID0+XG57XG4gIGhhcmRlbihtZXRob2RzKTtcbiAgY29uc3Qge1xuICAgIGZpbmlzaCA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlQW1wbGlmaWVyID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3RlciA9IHVuZGVmaW5lZFxuICB9ID0gb3B0aW9ucztcbiAgcmVjZWl2ZUFtcGxpZmllciA9PT0gdW5kZWZpbmVkIHx8XG4gIEZhaWxgT25seSBmYWNldHMgb2YgYW4gZXhvIGNsYXNzIGtpdCBjYW4gYmUgYW1wbGlmaWVkICR7cSh0YWcpfWA7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNvbnRleHRNYXAgPSBuZXcgV2Vha01hcCgpO1xuICBjb25zdCBwcm90byA9IGRlZmVuZFByb3RvdHlwZShcbiAgICB0YWcsXG4gICAgKHNlbGYpID0+IC8qICAgICAgICAgICAgICAqLyhjb250ZXh0TWFwLmdldChzZWxmKSksXG4gICAgbWV0aG9kcyxcbiAgICB0cnVlLFxuICAgIGludGVyZmFjZUd1YXJkXG4gICk7XG4gIGxldCBpbnN0YW5jZUNvdW50ID0gMDtcbiAgLypcbiAgICAqL1xuXG4gIGNvbnN0IG1ha2VJbnN0YW5jZSA9ICguLi5hcmdzKSA9PiB7XG4gICAgLy9cbiAgICBjb25zdCBzdGF0ZSA9IHNlYWwoaW5pdCguLi5hcmdzKSk7XG4gICAgaW5zdGFuY2VDb3VudCArPSAxO1xuICAgIGNvbnN0IHNlbGYgPSBtYWtlU2VsZihwcm90bywgaW5zdGFuY2VDb3VudCk7XG5cbiAgICAvL1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgY29udGV4dCA9IGZyZWV6ZSh7IHN0YXRlLCBzZWxmIH0pO1xuICAgIGNvbnRleHRNYXAuc2V0KHNlbGYsIGNvbnRleHQpO1xuICAgIGlmIChmaW5pc2gpIHtcbiAgICAgIGZpbmlzaChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgaWYgKHJlY2VpdmVJbnN0YW5jZVRlc3Rlcikge1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBpc0luc3RhbmNlID0gKGV4bywgZmFjZXROYW1lID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBmYWNldE5hbWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgRmFpbGBmYWNldE5hbWUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGFuIGV4byBjbGFzcyBraXQ6ICR7cShcbiAgICAgICAgdGFnXG4gICAgICApfSBoYXMgbm8gZmFjZXQgJHtxKGZhY2V0TmFtZSl9YDtcbiAgICAgIHJldHVybiBjb250ZXh0TWFwLmhhcyhleG8pO1xuICAgIH07XG4gICAgaGFyZGVuKGlzSW5zdGFuY2UpO1xuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3Rlcihpc0luc3RhbmNlKTtcbiAgfVxuXG4gIHJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlKTtcbn07JGjNj19vbmNlLmRlZmluZUV4b0NsYXNzKGRlZmluZUV4b0NsYXNzKTtcbmhhcmRlbihkZWZpbmVFeG9DbGFzcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBkZWZpbmVFeG9DbGFzc0tpdCA9IChcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbm1ldGhvZHNLaXQsXG5vcHRpb25zID0ge30pID0+XG57XG4gIGhhcmRlbihtZXRob2RzS2l0KTtcbiAgY29uc3Qge1xuICAgIGZpbmlzaCA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlQW1wbGlmaWVyID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3RlciA9IHVuZGVmaW5lZFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY29udGV4dE1hcEtpdCA9IG9iamVjdE1hcChtZXRob2RzS2l0LCAoKSA9PiBuZXcgV2Vha01hcCgpKTtcbiAgY29uc3QgZ2V0Q29udGV4dEtpdCA9IG9iamVjdE1hcChcbiAgICBjb250ZXh0TWFwS2l0LFxuICAgIChjb250ZXh0TWFwKSA9PiAoZmFjZXQpID0+IGNvbnRleHRNYXAuZ2V0KGZhY2V0KVxuICApO1xuICBjb25zdCBwcm90b3R5cGVLaXQgPSBkZWZlbmRQcm90b3R5cGVLaXQoXG4gICAgdGFnLFxuICAgIGdldENvbnRleHRLaXQsXG4gICAgbWV0aG9kc0tpdCxcbiAgICB0cnVlLFxuICAgIGludGVyZmFjZUd1YXJkS2l0XG4gICk7XG4gIGxldCBpbnN0YW5jZUNvdW50ID0gMDtcbiAgLypcbiAgICAqL1xuXG4gIGNvbnN0IG1ha2VJbnN0YW5jZUtpdCA9ICguLi5hcmdzKSA9PiB7XG4gICAgLy9cbiAgICBjb25zdCBzdGF0ZSA9IHNlYWwoaW5pdCguLi5hcmdzKSk7XG4gICAgLy9cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgY29udGV4dCA9IHsgc3RhdGUsIGZhY2V0czogbnVsbCB9O1xuICAgIGluc3RhbmNlQ291bnQgKz0gMTtcbiAgICBjb25zdCBmYWNldHMgPSBvYmplY3RNYXAocHJvdG90eXBlS2l0LCAocHJvdG8sIGZhY2V0TmFtZSkgPT4ge1xuICAgICAgY29uc3Qgc2VsZiA9IG1ha2VTZWxmKHByb3RvLCBpbnN0YW5jZUNvdW50KTtcbiAgICAgIGNvbnRleHRNYXBLaXRbZmFjZXROYW1lXS5zZXQoc2VsZiwgY29udGV4dCk7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9KTtcbiAgICBjb250ZXh0LmZhY2V0cyA9IGZhY2V0cztcbiAgICAvL1xuICAgIGZyZWV6ZShjb250ZXh0KTtcbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICBmaW5pc2goY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICovKGNvbnRleHQuZmFjZXRzKTtcbiAgfTtcblxuICBpZiAocmVjZWl2ZUFtcGxpZmllcikge1xuICAgIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBhbXBsaWZ5ID0gKGV4b0ZhY2V0KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbnRleHRNYXAgb2YgdmFsdWVzKGNvbnRleHRNYXBLaXQpKSB7XG4gICAgICAgIGlmIChjb250ZXh0TWFwLmhhcyhleG9GYWNldCkpIHtcbiAgICAgICAgICBjb25zdCB7IGZhY2V0cyB9ID0gY29udGV4dE1hcC5nZXQoZXhvRmFjZXQpO1xuICAgICAgICAgIHJldHVybiBmYWNldHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IEZhaWxgTXVzdCBiZSBhIGZhY2V0IG9mICR7cSh0YWcpfTogJHtleG9GYWNldH1gO1xuICAgIH07XG4gICAgaGFyZGVuKGFtcGxpZnkpO1xuICAgIHJlY2VpdmVBbXBsaWZpZXIoYW1wbGlmeSk7XG4gIH1cblxuICBpZiAocmVjZWl2ZUluc3RhbmNlVGVzdGVyKSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGlzSW5zdGFuY2UgPSAoZXhvRmFjZXQsIGZhY2V0TmFtZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGZhY2V0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXMoY29udGV4dE1hcEtpdCkuc29tZSgoY29udGV4dE1hcCkgPT5cbiAgICAgICAgY29udGV4dE1hcC5oYXMoZXhvRmFjZXQpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhc3NlcnQudHlwZW9mKGZhY2V0TmFtZSwgJ3N0cmluZycpO1xuICAgICAgY29uc3QgY29udGV4dE1hcCA9IGNvbnRleHRNYXBLaXRbZmFjZXROYW1lXTtcbiAgICAgIGNvbnRleHRNYXAgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgRmFpbGBleG8gY2xhc3Mga2l0ICR7cSh0YWcpfSBoYXMgbm8gZmFjZXQgbmFtZWQgJHtxKGZhY2V0TmFtZSl9YDtcbiAgICAgIHJldHVybiBjb250ZXh0TWFwLmhhcyhleG9GYWNldCk7XG4gICAgfTtcbiAgICBoYXJkZW4oaXNJbnN0YW5jZSk7XG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyKGlzSW5zdGFuY2UpO1xuICB9XG5cbiAgcmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2VLaXQpO1xufTskaM2PX29uY2UuZGVmaW5lRXhvQ2xhc3NLaXQoZGVmaW5lRXhvQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzS2l0KTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFeG8gPSAodGFnLCBpbnRlcmZhY2VHdWFyZCwgbWV0aG9kcywgb3B0aW9ucyA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBtYWtlSW5zdGFuY2UgPSBkZWZpbmVFeG9DbGFzcyhcbiAgICB0YWcsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdEVtcHR5LFxuICAgIG1ldGhvZHMsXG4gICAgb3B0aW9uc1xuICApO1xuICByZXR1cm4gbWFrZUluc3RhbmNlKCk7XG59OyRozY9fb25jZS5tYWtlRXhvKG1ha2VFeG8pO1xuaGFyZGVuKG1ha2VFeG8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaW5pdEVtcHR5IjpbImluaXRFbXB0eSJdLCJkZWZpbmVFeG9DbGFzcyI6WyJkZWZpbmVFeG9DbGFzcyJdLCJkZWZpbmVFeG9DbGFzc0tpdCI6WyJkZWZpbmVFeG9DbGFzc0tpdCJdLCJtYWtlRXhvIjpbIm1ha2VFeG8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADq9w1ZI3AACSNwAAIQAAAEBlbmRvL2V4by12MS41Ljgvc3JjL2V4by10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2ZhciIsIkBlbmRvL3BhdHRlcm5zIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9nZXQtaW50ZXJmYWNlLmpzIl0sImV4cG9ydHMiOlsiZGVmZW5kUHJvdG90eXBlIiwiZGVmZW5kUHJvdG90eXBlS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0TWV0aG9kTmFtZXMsaGFzT3duUHJvcGVydHlPZix0b1Rocm93YWJsZSxFLEZhcixtdXN0TWF0Y2gsTSxpc0F3YWl0QXJnR3VhcmQsaXNSYXdHdWFyZCxnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCxnZXRNZXRob2RHdWFyZFBheWxvYWQsZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkLGdldENvcHlNYXBFbnRyaWVzLGxpc3REaWZmZXJlbmNlLG9iamVjdE1hcCxxLEZhaWwsR0VUX0lOVEVSRkFDRV9HVUFSRDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsWyRozY9fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRozY9fYSldXSxbXCJ0b1Rocm93YWJsZVwiLFskaM2PX2EgPT4gKHRvVGhyb3dhYmxlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImlzQXdhaXRBcmdHdWFyZFwiLFskaM2PX2EgPT4gKGlzQXdhaXRBcmdHdWFyZCA9ICRozY9fYSldXSxbXCJpc1Jhd0d1YXJkXCIsWyRozY9fYSA9PiAoaXNSYXdHdWFyZCA9ICRozY9fYSldXSxbXCJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dLFtcImdldE1ldGhvZEd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldE1ldGhvZEd1YXJkUGF5bG9hZCA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJpZXNcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanNcIiwgW1tcImxpc3REaWZmZXJlbmNlXCIsWyRozY9fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vZ2V0LWludGVyZmFjZS5qc1wiLCBbW1wiR0VUX0lOVEVSRkFDRV9HVUFSRFwiLFskaM2PX2EgPT4gKEdFVF9JTlRFUkZBQ0VfR1VBUkQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IHsgYXBwbHksIG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGRlZmluZVByb3BlcnRpZXMsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCBSYXdNZXRob2RHdWFyZCA9IE0uY2FsbCgpLnJlc3QoTS5yYXcoKSkucmV0dXJucyhNLnJhdygpKTtcblxuY29uc3QgUkVEQUNURURfUkFXX0FSRyA9ICc8cmVkYWN0ZWQgcmF3IGFyZz4nO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgUGFzc2FibGVNZXRob2RHdWFyZCA9IE0uY2FsbCgpLnJlc3QoTS5hbnkoKSkucmV0dXJucyhNLmFueSgpKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWZlbmRTeW5jQXJncyA9IChzeW5jQXJncywgbWF0Y2hDb25maWcsIGxhYmVsID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNsYXJlZExlbixcbiAgICBoYXNSZXN0QXJnR3VhcmQsXG4gICAgcmVzdEFyZ0d1YXJkSXNSYXcsXG4gICAgcGFyYW1zUGF0dGVybixcbiAgICByZWRhY3RlZEluZGljZXNcbiAgfSA9IG1hdGNoQ29uZmlnO1xuXG4gIC8vXG4gIC8vXG4gIGxldCBtYXRjaGFibGVBcmdzID0gc3luY0FyZ3M7XG4gIGlmIChyZXN0QXJnR3VhcmRJc1JhdyAmJiBzeW5jQXJncy5sZW5ndGggPiBkZWNsYXJlZExlbikge1xuICAgIGNvbnN0IHJlc3RMZW4gPSBzeW5jQXJncy5sZW5ndGggLSBkZWNsYXJlZExlbjtcbiAgICBjb25zdCByZWRhY3RlZFJlc3QgPSBBcnJheShyZXN0TGVuKS5maWxsKFJFREFDVEVEX1JBV19BUkcpO1xuICAgIG1hdGNoYWJsZUFyZ3MgPSBbLi4uc3luY0FyZ3Muc2xpY2UoMCwgZGVjbGFyZWRMZW4pLCAuLi5yZWRhY3RlZFJlc3RdO1xuICB9IGVsc2UgaWYgKFxuICByZWRhY3RlZEluZGljZXMubGVuZ3RoID4gMCAmJlxuICByZWRhY3RlZEluZGljZXNbMF0gPCBzeW5jQXJncy5sZW5ndGgpXG4gIHtcbiAgICAvL1xuICAgIC8vXG4gICAgbWF0Y2hhYmxlQXJncyA9IFsuLi5zeW5jQXJnc107XG4gIH1cblxuICBmb3IgKGNvbnN0IGkgb2YgcmVkYWN0ZWRJbmRpY2VzKSB7XG4gICAgaWYgKGkgPj0gbWF0Y2hhYmxlQXJncy5sZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBtYXRjaGFibGVBcmdzW2ldID0gUkVEQUNURURfUkFXX0FSRztcbiAgfVxuXG4gIG11c3RNYXRjaChoYXJkZW4obWF0Y2hhYmxlQXJncyksIHBhcmFtc1BhdHRlcm4sIGxhYmVsKTtcblxuICBpZiAoaGFzUmVzdEFyZ0d1YXJkKSB7XG4gICAgcmV0dXJuIHN5bmNBcmdzO1xuICB9XG4gIHN5bmNBcmdzLmxlbmd0aCA8PSBkZWNsYXJlZExlbiB8fFxuICBGYWlsYCR7cShsYWJlbCl9IGFjY2VwdHMgYXQgbW9zdCAke3EoZGVjbGFyZWRMZW4pfSBhcmd1bWVudHMsIG5vdCAke3EoXG4gICAgc3luY0FyZ3MubGVuZ3RoXG4gICl9OiAke3N5bmNBcmdzfWA7XG4gIHJldHVybiBzeW5jQXJncztcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYnVpbGRNYXRjaENvbmZpZyA9IChtZXRob2RHdWFyZFBheWxvYWQpID0+IHtcbiAgY29uc3Qge1xuICAgIGFyZ0d1YXJkcyxcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgIHJlc3RBcmdHdWFyZFxuICB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuXG4gIGNvbnN0IG1hdGNoYWJsZUFyZ0d1YXJkcyA9IFsuLi5hcmdHdWFyZHMsIC4uLm9wdGlvbmFsQXJnR3VhcmRzXTtcblxuICBjb25zdCByZWRhY3RlZEluZGljZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaGFibGVBcmdHdWFyZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoaXNSYXdHdWFyZChtYXRjaGFibGVBcmdHdWFyZHNbaV0pKSB7XG4gICAgICBtYXRjaGFibGVBcmdHdWFyZHNbaV0gPSBSRURBQ1RFRF9SQVdfQVJHO1xuICAgICAgcmVkYWN0ZWRJbmRpY2VzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgbGV0IG1hdGNoYWJsZVJlc3RBcmdHdWFyZCA9IHJlc3RBcmdHdWFyZDtcbiAgaWYgKGlzUmF3R3VhcmQobWF0Y2hhYmxlUmVzdEFyZ0d1YXJkKSkge1xuICAgIG1hdGNoYWJsZVJlc3RBcmdHdWFyZCA9IE0uYXJyYXlPZihSRURBQ1RFRF9SQVdfQVJHKTtcbiAgfVxuICBjb25zdCBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQgPSBoYXJkZW4oe1xuICAgIC4uLm1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICBhcmdHdWFyZHM6IG1hdGNoYWJsZUFyZ0d1YXJkcy5zbGljZSgwLCBhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICBvcHRpb25hbEFyZ0d1YXJkczogbWF0Y2hhYmxlQXJnR3VhcmRzLnNsaWNlKGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgIHJlc3RBcmdHdWFyZDogbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkXG4gIH0pO1xuXG4gIGNvbnN0IHBhcmFtc1BhdHRlcm4gPSBNLnNwbGl0QXJyYXkoXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLmFyZ0d1YXJkcyxcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQub3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLnJlc3RBcmdHdWFyZFxuICApO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGRlY2xhcmVkTGVuOiBtYXRjaGFibGVBcmdHdWFyZHMubGVuZ3RoLFxuICAgIGhhc1Jlc3RBcmdHdWFyZDogcmVzdEFyZ0d1YXJkICE9PSB1bmRlZmluZWQsXG4gICAgcmVzdEFyZ0d1YXJkSXNSYXc6IHJlc3RBcmdHdWFyZCAhPT0gbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkLFxuICAgIHBhcmFtc1BhdHRlcm4sXG4gICAgcmVkYWN0ZWRJbmRpY2VzLFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZFxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBkZWZlbmRTeW5jTWV0aG9kID0gKFxuZ2V0Q29udGV4dCxcbmJlaGF2aW9yTWV0aG9kLFxubWV0aG9kR3VhcmRQYXlsb2FkLFxubGFiZWwpID0+XG57XG4gIGNvbnN0IHsgcmV0dXJuR3VhcmQgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgY29uc3QgaXNSYXdSZXR1cm4gPSBpc1Jhd0d1YXJkKHJldHVybkd1YXJkKTtcbiAgY29uc3QgbWF0Y2hDb25maWcgPSBidWlsZE1hdGNoQ29uZmlnKG1ldGhvZEd1YXJkUGF5bG9hZCk7XG4gIGNvbnN0IHsgc3luY01ldGhvZCB9ID0ge1xuICAgIC8vXG4gICAgc3luY01ldGhvZCguLi5zeW5jQXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQodGhpcyk7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHJlYWxBcmdzID0gZGVmZW5kU3luY0FyZ3Moc3luY0FyZ3MsIG1hdGNoQ29uZmlnLCBsYWJlbCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFwcGx5KGJlaGF2aW9yTWV0aG9kLCBjb250ZXh0LCByZWFsQXJncyk7XG4gICAgICAgIGlmICghaXNSYXdSZXR1cm4pIHtcbiAgICAgICAgICBtdXN0TWF0Y2goaGFyZGVuKHJlc3VsdCksIHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGNhdGNoICh0aHJvd25UaGluZykge1xuICAgICAgICB0aHJvdyB0b1Rocm93YWJsZSh0aHJvd25UaGluZyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gc3luY01ldGhvZDtcbn07XG5cbi8qXG5cbiAqL1xuY29uc3QgZGVzeW5jID0gKG1ldGhvZEd1YXJkUGF5bG9hZCkgPT4ge1xuICBjb25zdCB7XG4gICAgYXJnR3VhcmRzLFxuICAgIG9wdGlvbmFsQXJnR3VhcmRzID0gW10sXG4gICAgcmVzdEFyZ0d1YXJkXG4gIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG4gICFpc0F3YWl0QXJnR3VhcmQocmVzdEFyZ0d1YXJkKSB8fFxuICBGYWlsYFJlc3QgYXJncyBtYXkgbm90IGJlIGF3YWl0ZWQ6ICR7cmVzdEFyZ0d1YXJkfWA7XG4gIGNvbnN0IHJhd0FyZ0d1YXJkcyA9IFsuLi5hcmdHdWFyZHMsIC4uLm9wdGlvbmFsQXJnR3VhcmRzXTtcblxuICBjb25zdCBhd2FpdEluZGV4ZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXdBcmdHdWFyZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBhcmdHdWFyZCA9IHJhd0FyZ0d1YXJkc1tpXTtcbiAgICBpZiAoaXNBd2FpdEFyZ0d1YXJkKGFyZ0d1YXJkKSkge1xuICAgICAgcmF3QXJnR3VhcmRzW2ldID0gZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoYXJnR3VhcmQpLmFyZ0d1YXJkO1xuICAgICAgYXdhaXRJbmRleGVzLnB1c2goaSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgYXdhaXRJbmRleGVzLFxuICAgIHJhd01ldGhvZEd1YXJkUGF5bG9hZDoge1xuICAgICAgLi4ubWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgICAgYXJnR3VhcmRzOiByYXdBcmdHdWFyZHMuc2xpY2UoMCwgYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgICBvcHRpb25hbEFyZ0d1YXJkczogcmF3QXJnR3VhcmRzLnNsaWNlKGFyZ0d1YXJkcy5sZW5ndGgpXG4gICAgfVxuICB9O1xufTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZCA9IChcbmdldENvbnRleHQsXG5iZWhhdmlvck1ldGhvZCxcbm1ldGhvZEd1YXJkUGF5bG9hZCxcbmxhYmVsKSA9Plxue1xuICBjb25zdCB7IHJldHVybkd1YXJkIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG4gIGNvbnN0IGlzUmF3UmV0dXJuID0gaXNSYXdHdWFyZChyZXR1cm5HdWFyZCk7XG5cbiAgY29uc3QgeyBhd2FpdEluZGV4ZXMsIHJhd01ldGhvZEd1YXJkUGF5bG9hZCB9ID0gZGVzeW5jKG1ldGhvZEd1YXJkUGF5bG9hZCk7XG4gIGNvbnN0IG1hdGNoQ29uZmlnID0gYnVpbGRNYXRjaENvbmZpZyhyYXdNZXRob2RHdWFyZFBheWxvYWQpO1xuXG4gIGNvbnN0IHsgYXN5bmNNZXRob2QgfSA9IHtcbiAgICAvL1xuICAgIGFzeW5jTWV0aG9kKC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IGF3YWl0TGlzdCA9IFtdO1xuICAgICAgZm9yIChjb25zdCBpIG9mIGF3YWl0SW5kZXhlcykge1xuICAgICAgICBpZiAoaSA+PSBhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0TGlzdC5wdXNoKGFyZ3NbaV0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcCA9IFByb21pc2UuYWxsKGF3YWl0TGlzdCk7XG4gICAgICBjb25zdCBzeW5jQXJncyA9IFsuLi5hcmdzXTtcbiAgICAgIGNvbnN0IHJlc3VsdFAgPSBFLndoZW4oXG4gICAgICAgIHAsXG4gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyhhd2FpdGVkQXJncykgPT4ge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXdhaXRlZEFyZ3MubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgIHN5bmNBcmdzW2F3YWl0SW5kZXhlc1tqXV0gPSBhd2FpdGVkQXJnc1tqXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KHRoaXMpO1xuICAgICAgICAgIGNvbnN0IHJlYWxBcmdzID0gZGVmZW5kU3luY0FyZ3Moc3luY0FyZ3MsIG1hdGNoQ29uZmlnLCBsYWJlbCk7XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLCBjb250ZXh0LCByZWFsQXJncyk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm4gRS53aGVuKHJlc3VsdFAsIChmdWxmaWxsbWVudCkgPT4ge1xuICAgICAgICBpZiAoIWlzUmF3UmV0dXJuKSB7XG4gICAgICAgICAgbXVzdE1hdGNoKGhhcmRlbihmdWxmaWxsbWVudCksIHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxmaWxsbWVudDtcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIFByb21pc2UucmVqZWN0KHRvVGhyb3dhYmxlKHJlYXNvbikpXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGFzeW5jTWV0aG9kO1xufTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGRlZmVuZE1ldGhvZCA9IChnZXRDb250ZXh0LCBiZWhhdmlvck1ldGhvZCwgbWV0aG9kR3VhcmQsIGxhYmVsKSA9PiB7XG4gIGNvbnN0IG1ldGhvZEd1YXJkUGF5bG9hZCA9IGdldE1ldGhvZEd1YXJkUGF5bG9hZChtZXRob2RHdWFyZCk7XG4gIGNvbnN0IHsgY2FsbEtpbmQgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgaWYgKGNhbGxLaW5kID09PSAnc3luYycpIHtcbiAgICByZXR1cm4gZGVmZW5kU3luY01ldGhvZChcbiAgICAgIGdldENvbnRleHQsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGxhYmVsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoY2FsbEtpbmQgPT09ICdhc3luYycpO1xuICAgIHJldHVybiBkZWZlbmRBc3luY01ldGhvZChcbiAgICAgIGdldENvbnRleHQsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGxhYmVsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBiaW5kTWV0aG9kID0gKFxubWV0aG9kVGFnLFxuY29udGV4dFByb3ZpZGVyLFxuYmVoYXZpb3JNZXRob2QsXG5tZXRob2RHdWFyZCkgPT5cbntcbiAgYXNzZXJ0LnR5cGVvZihiZWhhdmlvck1ldGhvZCwgJ2Z1bmN0aW9uJyk7XG5cbiAgLypcbiAgICAgKi9cblxuXG4gIGNvbnN0IGdldENvbnRleHQgPSAocmVwcmVzZW50YXRpdmUpID0+IHtcbiAgICByZXByZXNlbnRhdGl2ZSB8fFxuICAgIC8vXG4gICAgRmFpbGBNZXRob2QgJHttZXRob2RUYWd9IGNhbGxlZCB3aXRob3V0ICd0aGlzJyBvYmplY3RgO1xuICAgIGNvbnN0IGNvbnRleHQgPSBjb250ZXh0UHJvdmlkZXIocmVwcmVzZW50YXRpdmUpO1xuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEZhaWxgJHtxKFxuICAgICAgICBtZXRob2RUYWdcbiAgICAgICl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtyZXByZXNlbnRhdGl2ZX1gO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbiAgfTtcblxuICBjb25zdCBtZXRob2QgPSBkZWZlbmRNZXRob2QoXG4gICAgZ2V0Q29udGV4dCxcbiAgICBiZWhhdmlvck1ldGhvZCxcbiAgICBtZXRob2RHdWFyZCxcbiAgICBtZXRob2RUYWdcbiAgKTtcblxuICBkZWZpbmVQcm9wZXJ0aWVzKG1ldGhvZCwge1xuICAgIG5hbWU6IHsgdmFsdWU6IG1ldGhvZFRhZyB9LFxuICAgIGxlbmd0aDogeyB2YWx1ZTogYmVoYXZpb3JNZXRob2QubGVuZ3RoIH1cbiAgfSk7XG4gIHJldHVybiBtZXRob2Q7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBkZWZlbmRQcm90b3R5cGUgPSAoXG50YWcsXG5jb250ZXh0UHJvdmlkZXIsXG5iZWhhdmlvck1ldGhvZHMsXG50aGlzZnVsTWV0aG9kcyA9IGZhbHNlLFxuaW50ZXJmYWNlR3VhcmQgPSB1bmRlZmluZWQpID0+XG57XG4gIGNvbnN0IHByb3RvdHlwZSA9IHt9O1xuICBjb25zdCBtZXRob2ROYW1lcyA9IGdldE1ldGhvZE5hbWVzKGJlaGF2aW9yTWV0aG9kcykuZmlsdGVyKFxuICAgIC8vXG4gICAgLy9cbiAgICAoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY29uc3RydWN0b3IgPSBiZWhhdmlvck1ldGhvZHMuY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gIShcbiAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSAmJlxuICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID09PSBjb25zdHJ1Y3RvclxuICAgICAgKTtcbiAgICB9XG4gICk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBtZXRob2RHdWFyZHM7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBkZWZhdWx0R3VhcmRzO1xuICBpZiAoaW50ZXJmYWNlR3VhcmQpIHtcbiAgICBjb25zdCB7XG4gICAgICBpbnRlcmZhY2VOYW1lLFxuICAgICAgbWV0aG9kR3VhcmRzOiBtZyxcbiAgICAgIHN5bWJvbE1ldGhvZEd1YXJkcyxcbiAgICAgIHNsb3BweSxcbiAgICAgIGRlZmF1bHRHdWFyZHM6IGRnID0gc2xvcHB5ID8gJ3Bhc3NhYmxlJyA6IGRlZmF1bHRHdWFyZHNcbiAgICB9ID0gZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGludGVyZmFjZUd1YXJkKTtcbiAgICBtZXRob2RHdWFyZHMgPSBoYXJkZW4oe1xuICAgICAgLi4ubWcsXG4gICAgICAuLi4oc3ltYm9sTWV0aG9kR3VhcmRzICYmXG4gICAgICBmcm9tRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyhzeW1ib2xNZXRob2RHdWFyZHMpKSlcbiAgICB9KTtcbiAgICBkZWZhdWx0R3VhcmRzID0gZGc7XG4gICAge1xuICAgICAgY29uc3QgbWV0aG9kR3VhcmROYW1lcyA9IG93bktleXMobWV0aG9kR3VhcmRzKTtcbiAgICAgIGNvbnN0IHVuaW1wbGVtZW50ZWQgPSBsaXN0RGlmZmVyZW5jZShtZXRob2RHdWFyZE5hbWVzLCBtZXRob2ROYW1lcyk7XG4gICAgICB1bmltcGxlbWVudGVkLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBtZXRob2RzICR7cSh1bmltcGxlbWVudGVkKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gICAgICBpZiAoZGVmYXVsdEd1YXJkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHVuZ3VhcmRlZCA9IGxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLCBtZXRob2RHdWFyZE5hbWVzKTtcbiAgICAgICAgdW5ndWFyZGVkLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBGYWlsYG1ldGhvZHMgJHtxKHVuZ3VhcmRlZCl9IG5vdCBndWFyZGVkIGJ5ICR7cShpbnRlcmZhY2VOYW1lKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcykge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gYmVoYXZpb3JNZXRob2RzW3Byb3BdO1xuICAgIGNvbnN0IHsgc2hpZnRlZE1ldGhvZCB9ID0ge1xuICAgICAgc2hpZnRlZE1ldGhvZCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGJlaGF2aW9yTWV0aG9kID0gdGhpc2Z1bE1ldGhvZHMgPyBvcmlnaW5hbE1ldGhvZCA6IHNoaWZ0ZWRNZXRob2Q7XG4gICAgLy9cbiAgICAvL1xuICAgIGxldCBtZXRob2RHdWFyZCA9IG1ldGhvZEd1YXJkcyAmJiBtZXRob2RHdWFyZHNbcHJvcF07XG4gICAgaWYgKCFtZXRob2RHdWFyZCkge1xuICAgICAgc3dpdGNoIChkZWZhdWx0R3VhcmRzKSB7XG4gICAgICAgIGNhc2UgdW5kZWZpbmVkOntcbiAgICAgICAgICAgIGlmICh0aGlzZnVsTWV0aG9kcykge1xuICAgICAgICAgICAgICBtZXRob2RHdWFyZCA9IFBhc3NhYmxlTWV0aG9kR3VhcmQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtZXRob2RHdWFyZCA9IFJhd01ldGhvZEd1YXJkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdwYXNzYWJsZSc6e1xuICAgICAgICAgICAgbWV0aG9kR3VhcmQgPSBQYXNzYWJsZU1ldGhvZEd1YXJkO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdyYXcnOntcbiAgICAgICAgICAgIG1ldGhvZEd1YXJkID0gUmF3TWV0aG9kR3VhcmQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6e1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgZGVmYXVsdEd1YXJkcyAke3EoZGVmYXVsdEd1YXJkcyl9YDtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByb3RvdHlwZVtwcm9wXSA9IGJpbmRNZXRob2QoXG4gICAgICBgSW4gJHtxKHByb3ApfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuICAgICAgY29udGV4dFByb3ZpZGVyLFxuICAgICAgYmVoYXZpb3JNZXRob2QsXG4gICAgICBtZXRob2RHdWFyZFxuICAgICk7XG4gIH1cblxuICBpZiAoIWhhc093blByb3BlcnR5T2YocHJvdG90eXBlLCBHRVRfSU5URVJGQUNFX0dVQVJEKSkge1xuICAgIGNvbnN0IGdldEludGVyZmFjZUd1YXJkTWV0aG9kID0ge1xuICAgICAgW0dFVF9JTlRFUkZBQ0VfR1VBUkRdKCkge1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gaW50ZXJmYWNlR3VhcmQ7XG4gICAgICB9XG4gICAgfVtHRVRfSU5URVJGQUNFX0dVQVJEXTtcbiAgICBwcm90b3R5cGVbR0VUX0lOVEVSRkFDRV9HVUFSRF0gPSBiaW5kTWV0aG9kKFxuICAgICAgYEluICR7cShHRVRfSU5URVJGQUNFX0dVQVJEKX0gbWV0aG9kIG9mICgke3RhZ30pYCxcbiAgICAgIGNvbnRleHRQcm92aWRlcixcbiAgICAgIGdldEludGVyZmFjZUd1YXJkTWV0aG9kLFxuICAgICAgUGFzc2FibGVNZXRob2RHdWFyZFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRmFyKFxuICAgIHRhZyxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyhcbiAgICBwcm90b3R5cGVcbiAgICApXG4gICk7XG59OyRozY9fb25jZS5kZWZlbmRQcm90b3R5cGUoZGVmZW5kUHJvdG90eXBlKTtcbmhhcmRlbihkZWZlbmRQcm90b3R5cGUpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBkZWZlbmRQcm90b3R5cGVLaXQgPSAoXG50YWcsXG5jb250ZXh0UHJvdmlkZXJLaXQsXG5iZWhhdmlvck1ldGhvZHNLaXQsXG50aGlzZnVsTWV0aG9kcyA9IGZhbHNlLFxuaW50ZXJmYWNlR3VhcmRLaXQgPSB1bmRlZmluZWQpID0+XG57XG4gIGNvbnN0IGZhY2V0TmFtZXMgPSBvd25LZXlzKGJlaGF2aW9yTWV0aG9kc0tpdCkuc29ydCgpO1xuICBmYWNldE5hbWVzLmxlbmd0aCA+IDEgfHwgRmFpbGBBIG11bHRpLWZhY2V0IG9iamVjdCBtdXN0IGhhdmUgbXVsdGlwbGUgZmFjZXRzYDtcbiAgaWYgKGludGVyZmFjZUd1YXJkS2l0KSB7XG4gICAgY29uc3QgaW50ZXJmYWNlTmFtZXMgPSBvd25LZXlzKGludGVyZmFjZUd1YXJkS2l0KTtcbiAgICBjb25zdCBleHRyYUludGVyZmFjZU5hbWVzID0gbGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcywgaW50ZXJmYWNlTmFtZXMpO1xuICAgIGV4dHJhSW50ZXJmYWNlTmFtZXMubGVuZ3RoID09PSAwIHx8XG4gICAgRmFpbGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gICAgY29uc3QgZXh0cmFGYWNldE5hbWVzID0gbGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsIGZhY2V0TmFtZXMpO1xuICAgIGV4dHJhRmFjZXROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG5vdCBndWFyZGVkIGJ5IGludGVyZmFjZXNgO1xuICB9XG4gIGNvbnN0IGNvbnRleHRNYXBOYW1lcyA9IG93bktleXMoY29udGV4dFByb3ZpZGVyS2l0KTtcbiAgY29uc3QgZXh0cmFDb250ZXh0TmFtZXMgPSBsaXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLCBjb250ZXh0TWFwTmFtZXMpO1xuICBleHRyYUNvbnRleHROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgRmFpbGBDb250ZXh0cyAke3EoZXh0cmFDb250ZXh0TmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbiAgY29uc3QgZXh0cmFGYWNldE5hbWVzID0gbGlzdERpZmZlcmVuY2UoY29udGV4dE1hcE5hbWVzLCBmYWNldE5hbWVzKTtcbiAgZXh0cmFGYWNldE5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICBGYWlsYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG1pc3NpbmcgY29udGV4dHNgO1xuICBjb25zdCBwcm90b0tpdCA9IG9iamVjdE1hcChiZWhhdmlvck1ldGhvZHNLaXQsIChiZWhhdmlvck1ldGhvZHMsIGZhY2V0TmFtZSkgPT5cbiAgZGVmZW5kUHJvdG90eXBlKFxuICAgIGAke3RhZ30gJHtTdHJpbmcoZmFjZXROYW1lKX1gLFxuICAgIGNvbnRleHRQcm92aWRlcktpdFtmYWNldE5hbWVdLFxuICAgIGJlaGF2aW9yTWV0aG9kcyxcbiAgICB0aGlzZnVsTWV0aG9kcyxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCAmJiBpbnRlcmZhY2VHdWFyZEtpdFtmYWNldE5hbWVdXG4gIClcbiAgKTtcbiAgcmV0dXJuIHByb3RvS2l0O1xufTskaM2PX29uY2UuZGVmZW5kUHJvdG90eXBlS2l0KGRlZmVuZFByb3RvdHlwZUtpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZlbmRQcm90b3R5cGUiOlsiZGVmZW5kUHJvdG90eXBlIl0sImRlZmVuZFByb3RvdHlwZUtpdCI6WyJkZWZlbmRQcm90b3R5cGVLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7ZLEFz8CAAA/AgAAJQAAAEBlbmRvL2V4by12MS41Ljgvc3JjL2dldC1pbnRlcmZhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IEdFVF9JTlRFUkZBQ0VfR1VBUkQgPSAnX19nZXRJbnRlcmZhY2VHdWFyZF9fJztcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLkdFVF9JTlRFUkZBQ0VfR1VBUkQoR0VUX0lOVEVSRkFDRV9HVUFSRCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJHRVRfSU5URVJGQUNFX0dVQVJEIjpbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAHQAAAEBlbmRvL2V4by12MS41Ljgvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACAAAABAZW5kby9mYXItdjEuMS4xMC9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpJtZQmAIAAJgCAAAeAAAAQGVuZG8vZmFyLXYxLjEuMTAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wYXNzLXN0eWxlIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiIsbnVsbF0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV0sW1wiLi9leHBvcnRzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGVuZG8vZXZlbnR1YWwtc2VuZCI6W1siRSIsIkUiXV0sIkBlbmRvL3Bhc3Mtc3R5bGUiOltbIkZhciIsIkZhciJdLFsiZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdLFsicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALdVQBoIHAACCBwAAHQAAAEBlbmRvL21hcnNoYWwtdjEuNi4zL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL21hcnNoYWwuanMiLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiLCIuL3NyYy9yYW5rT3JkZXIuanMiLCIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhcnNlIiwicGFyc2UiLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvcmFua09yZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6W1siUUNMQVNTIiwiUUNMQVNTIl1dLCIuL3NyYy9tYXJzaGFsLmpzIjpbWyJtYWtlTWFyc2hhbCIsIm1ha2VNYXJzaGFsIl1dLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6W1sic3RyaW5naWZ5Iiwic3RyaW5naWZ5Il0sWyJwYXJzZSIsInBhcnNlIl1dLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6W1siZGVjb2RlVG9KdXN0aW4iLCJkZWNvZGVUb0p1c3RpbiJdXSwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOltbIm1ha2VQYXNzYWJsZUtpdCIsIm1ha2VQYXNzYWJsZUtpdCJdLFsibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIl0sWyJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiXSxbImlzRW5jb2RlZFJlbW90YWJsZSIsImlzRW5jb2RlZFJlbW90YWJsZSJdLFsiemVyb1BhZCIsInplcm9QYWQiXSxbInJlY29yZE5hbWVzIiwicmVjb3JkTmFtZXMiXSxbInJlY29yZFZhbHVlcyIsInJlY29yZFZhbHVlcyJdXSwiLi9zcmMvcmFua09yZGVyLmpzIjpbWyJ0cml2aWFsQ29tcGFyYXRvciIsInRyaXZpYWxDb21wYXJhdG9yIl0sWyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCJdLFsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayJdLFsiaXNSYW5rU29ydGVkIiwiaXNSYW5rU29ydGVkIl0sWyJzb3J0QnlSYW5rIiwic29ydEJ5UmFuayJdLFsiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUFudGlSYW5rIl0sWyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il0sWyJnZXRQYXNzU3R5bGVDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIl0sWyJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaW50ZXJzZWN0UmFua0NvdmVycyJdLFsidW5pb25SYW5rQ292ZXJzIiwidW5pb25SYW5rQ292ZXJzIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJkZWVwbHlGdWxmaWxsZWQiLCJkZWVwbHlGdWxmaWxsZWQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOBYGPFbTwAAW08AACoAAABAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VQYXNzYWJsZUtpdCIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLGlzRXJyb3JMaWtlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsYixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJiXCIsWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IGZyb21FbnRyaWVzLCBpcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vL1xuY29uc3QgckMwID0gL1tcXHgwMC1cXHgxRl0vO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGdldFN1ZmZpeCA9IChzdHIsIGluZGV4KSA9PiAoaW5kZXggPT09IDAgPyBzdHIgOiBzdHIuc3Vic3RyaW5nKGluZGV4KSk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmVjb3JkTmFtZXMgPSAocmVjb3JkKSA9PlxuLy9cbi8vXG4vL1xuLy9cbi8vXG5oYXJkZW4oIC8qICAgICAgICAgICAgICAgICAgICovKG93bktleXMocmVjb3JkKSkuc29ydCgpLnJldmVyc2UoKSk7JGjNj19vbmNlLnJlY29yZE5hbWVzKHJlY29yZE5hbWVzKTtcbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmVjb3JkVmFsdWVzID0gKHJlY29yZCwgbmFtZXMpID0+XG5oYXJkZW4obmFtZXMubWFwKChuYW1lKSA9PiByZWNvcmRbbmFtZV0pKTskaM2PX29uY2UucmVjb3JkVmFsdWVzKHJlY29yZFZhbHVlcyk7XG5oYXJkZW4ocmVjb3JkVmFsdWVzKTtcblxuY29uc3QgemVyb2VzID0gQXJyYXkoMTYpLlxuZmlsbCh1bmRlZmluZWQpLlxubWFwKChfLCBpKSA9PiAnMCcucmVwZWF0KGkpKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgemVyb1BhZCA9IChuLCBzaXplKSA9PiB7XG4gIGNvbnN0IG5TdHIgPSBgJHtufWA7XG4gIGNvbnN0IGZpbGxMZW4gPSBzaXplIC0gblN0ci5sZW5ndGg7XG4gIGlmIChmaWxsTGVuID09PSAwKSByZXR1cm4gblN0cjtcbiAgYXNzZXJ0KGZpbGxMZW4gPiAwICYmIGZpbGxMZW4gPCB6ZXJvZXMubGVuZ3RoKTtcbiAgcmV0dXJuIGAke3plcm9lc1tmaWxsTGVuXX0ke25TdHJ9YDtcbn07JGjNj19vbmNlLnplcm9QYWQoemVyb1BhZCk7XG5oYXJkZW4oemVyb1BhZCk7XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgYXNOdW1iZXIgPSBuZXcgRmxvYXQ2NEFycmF5KDEpO1xuY29uc3QgYXNCaXRzID0gbmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLy9cbmNvbnN0IENhbm9uaWNhbE5hTkJpdHMgPSAnZmZmODAwMDAwMDAwMDAwMCc7XG5cbi8qXG5cblxuICovXG5jb25zdCBlbmNvZGVCaW5hcnk2NCA9IChuKSA9PiB7XG4gIC8vXG4gIGlmIChpcyhuLCAtMCkpIHtcbiAgICBuID0gMDtcbiAgfSBlbHNlIGlmIChpcyhuLCBOYU4pKSB7XG4gICAgcmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gIH1cbiAgYXNOdW1iZXJbMF0gPSBuO1xuICBsZXQgYml0cyA9IGFzQml0c1swXTtcbiAgaWYgKG4gPCAwKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICByZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksIDE2KX1gO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQmluYXJ5NjQgPSAoZW5jb2RlZCwgc2tpcCA9IDApID0+IHtcbiAgZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICdmJyB8fCBGYWlsYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IGJpdHMgPSBCaWdJbnQoYDB4JHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpfWApO1xuICBpZiAoZW5jb2RlZC5jaGFyQXQoc2tpcCArIDEpIDwgJzgnKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICBhc0JpdHNbMF0gPSBiaXRzO1xuICBjb25zdCByZXN1bHQgPSBhc051bWJlclswXTtcbiAgIWlzKHJlc3VsdCwgLTApIHx8XG4gIEZhaWxgVW5leHBlY3RlZCBuZWdhdGl2ZSB6ZXJvOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlQmlnSW50ID0gKG4pID0+IHtcbiAgY29uc3QgYWJzID0gbiA8IDBuID8gLW4gOiBuO1xuICBjb25zdCBuRGlnaXRzID0gYWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuICBjb25zdCBsRGlnaXRzID0gbkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbiAgaWYgKG4gPCAwbikge1xuICAgIHJldHVybiBgbiR7XG4gICAgLy9cbiAgICAvL1xuICAgICcjJy5yZXBlYXQobERpZ2l0cyAtIDEpXG4gICAgfSR7XG4gICAgLy9cbiAgICAoMTAgKiogbERpZ2l0cyAtIG5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywgJzAnKVxuICAgIH06JHtcbiAgICAvL1xuICAgICgxMG4gKiogQmlnSW50KG5EaWdpdHMpICsgbikudG9TdHJpbmcoKS5wYWRTdGFydChuRGlnaXRzLCAnMCcpXG4gICAgfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGBwJHtcbiAgICAvL1xuICAgIC8vXG4gICAgJ34nLnJlcGVhdChsRGlnaXRzIC0gMSlcbiAgICB9JHtcbiAgICAvL1xuICAgIG5EaWdpdHNcbiAgICB9OiR7XG4gICAgLy9cbiAgICBuXG4gICAgfWA7XG4gIH1cbn07XG5cbmNvbnN0IHJCaWdJbnRQYXlsb2FkID0gLyhbMC05XSspKDooWzAtOV0rJHwpfCkvcztcblxuLypcblxuXG4gKi9cbmNvbnN0IGRlY29kZUJpZ0ludCA9IChlbmNvZGVkKSA9PiB7XG4gIGNvbnN0IHR5cGVQcmVmaXggPSBlbmNvZGVkLmNoYXJBdCgwKTsgLy9cbiAgdHlwZVByZWZpeCA9PT0gJ3AnIHx8XG4gIHR5cGVQcmVmaXggPT09ICduJyB8fFxuICBGYWlsYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuICBjb25zdCB7XG4gICAgaW5kZXg6IGxEaWdpdHMsXG4gICAgMTogc25EaWdpdHMsXG4gICAgMjogdGFpbCxcbiAgICAzOiBkaWdpdHNcbiAgfSA9IGVuY29kZWQubWF0Y2gockJpZ0ludFBheWxvYWQpIHx8IEZhaWxgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG4gIHNuRGlnaXRzLmxlbmd0aCA9PT0gbERpZ2l0cyB8fFxuICBGYWlsYFVuYXJ5LXByZWZpeGVkIGRlY2ltYWwgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgbkRpZ2l0cyA9IHBhcnNlSW50KHNuRGlnaXRzLCAxMCk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgbkRpZ2l0cyA9IDEwICoqIC8qICAgICAgICAgICAgICAgICAqLyhsRGlnaXRzKSAtIG5EaWdpdHM7XG4gIH1cblxuICB0YWlsLmNoYXJBdCgwKSA9PT0gJzonIHx8IEZhaWxgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgZGlnaXRzLmxlbmd0aCA9PT0gbkRpZ2l0cyB8fFxuICBGYWlsYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBuID0gQmlnSW50KGRpZ2l0cyk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgbiA9IC0oMTBuICoqIEJpZ0ludChuRGlnaXRzKSAtIG4pO1xuICB9XG5cbiAgcmV0dXJuIG47XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHN0cmluZ0VzY2FwZXMgPSBBcnJheSgweDIyKS5cbmZpbGwodW5kZWZpbmVkKS5cbm1hcCgoXywgY3ApID0+IHtcbiAgc3dpdGNoIChTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKSkge1xuICAgIGNhc2UgJyAnOlxuICAgICAgcmV0dXJuICchXyc7XG4gICAgY2FzZSAnISc6XG4gICAgICByZXR1cm4gJyF8JztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGAhJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNwICsgMHgyMSl9YDtcbiAgfVxufSk7XG5zdHJpbmdFc2NhcGVzWydeJy5jaGFyQ29kZUF0KDApXSA9ICdfQCc7XG5zdHJpbmdFc2NhcGVzWydfJy5jaGFyQ29kZUF0KDApXSA9ICdfXyc7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXggPSAoc3RyKSA9Plxuc3RyLnJlcGxhY2UoL1tcXDAtIV5fXS9nLCAoY2gpID0+IHN0cmluZ0VzY2FwZXNbY2guY2hhckNvZGVBdCgwKV0pO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBkZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4ID0gKGVuY29kZWQpID0+IHtcbiAgcmV0dXJuIGVuY29kZWQucmVwbGFjZSgvKFtcXDAtIV9dKSgufFxcbik/L2csIChlc2MsIHByZWZpeCwgc3VmZml4KSA9PiB7XG4gICAgc3dpdGNoIChlc2MpIHtcbiAgICAgIGNhc2UgJyFfJzpcbiAgICAgICAgcmV0dXJuICcgJztcbiAgICAgIGNhc2UgJyF8JzpcbiAgICAgICAgcmV0dXJuICchJztcbiAgICAgIGNhc2UgJ19AJzpcbiAgICAgICAgcmV0dXJuICdeJztcbiAgICAgIGNhc2UgJ19fJzpcbiAgICAgICAgcmV0dXJuICdfJztcbiAgICAgIGRlZmF1bHQ6e1xuICAgICAgICAgIGNvbnN0IGNoID0gLyogICAgICAgICAgICAgICAgICovKHN1ZmZpeCk7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIChwcmVmaXggPT09ICchJyAmJiBzdWZmaXggIT09IHVuZGVmaW5lZCAmJiBjaCA+PSAnIScgJiYgY2ggPD0gJ0AnKSB8fFxuICAgICAgICAgIEZhaWxgaW52YWxpZCBzdHJpbmcgZXNjYXBlOiAke3EoZXNjKX1gO1xuICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoLmNoYXJDb2RlQXQoMCkgLSAweDIxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXggPSAoc3RyKSA9PiBzdHI7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCA9IChlbmNvZGVkKSA9PiBlbmNvZGVkO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RBcnJheSA9IChhcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgY2hhcnMgPSBbJ14nXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFycmF5KSB7XG4gICAgY29uc3QgZW5jID0gZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG4gICAgY2hhcnMucHVzaChlbmMsICcgJyk7XG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xufTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWNvZGVDb21wYWN0QXJyYXkgPSAoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gW107XG4gIGxldCBkZXB0aCA9IDA7XG4gIC8vXG4gIC8vXG4gIGxldCBuZXh0SW5kZXggPSBza2lwICsgMTtcbiAgbGV0IGN1cnJlbnRFbGVtZW50U3RhcnQgPSBza2lwICsgMTtcbiAgZm9yIChjb25zdCB7IDA6IGNoLCBpbmRleDogaSB9IG9mIGVuY29kZWQubWF0Y2hBbGwoL1tcXF4gXS9nKSkge1xuICAgIGNvbnN0IGluZGV4ID0gLyogICAgICAgICAgICAgICAgICovKGkpO1xuICAgIGlmIChpbmRleCA8PSBza2lwKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHNraXApIHtcbiAgICAgICAgY2ggPT09ICdeJyB8fCBGYWlsYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gJ14nKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGRlcHRoICs9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICBpZiAoaW5kZXggPT09IG5leHRJbmRleCkge1xuICAgICAgICAvL1xuICAgICAgICBkZXB0aCAtPSAxO1xuICAgICAgICBkZXB0aCA+PSAwIHx8XG4gICAgICAgIC8vXG4gICAgICAgIEZhaWxgdW5leHBlY3RlZCBhcnJheSBlbGVtZW50IHRlcm1pbmF0b3I6ICR7ZW5jb2RlZC5zbGljZShza2lwLCBpbmRleCArIDIpfWA7XG4gICAgICB9XG4gICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgLy9cbiAgICAgICAgZWxlbWVudHMucHVzaChcbiAgICAgICAgICBkZWNvZGVQYXNzYWJsZShlbmNvZGVkLnNsaWNlKGN1cnJlbnRFbGVtZW50U3RhcnQsIGluZGV4KSlcbiAgICAgICAgKTtcbiAgICAgICAgY3VycmVudEVsZW1lbnRTdGFydCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy9cbiAgICBuZXh0SW5kZXggPSBpbmRleCArIDE7XG4gIH1cbiAgZGVwdGggPT09IDAgfHwgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIG5leHRJbmRleCA9PT0gZW5jb2RlZC5sZW5ndGggfHxcbiAgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXkgZWxlbWVudDogJHtnZXRTdWZmaXgoXG4gICAgZW5jb2RlZCxcbiAgICBjdXJyZW50RWxlbWVudFN0YXJ0XG4gICl9YDtcbiAgcmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lBcnJheSA9IChhcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgY2hhcnMgPSBbJ1snXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFycmF5KSB7XG4gICAgY29uc3QgZW5jID0gZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG4gICAgZm9yIChjb25zdCBjIG9mIGVuYykge1xuICAgICAgaWYgKGMgPT09ICdcXHUwMDAwJyB8fCBjID09PSAnXFx1MDAwMScpIHtcbiAgICAgICAgY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuICAgICAgfVxuICAgICAgY2hhcnMucHVzaChjKTtcbiAgICB9XG4gICAgY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5QXJyYXkgPSAoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gW107XG4gIGNvbnN0IGVsZW1DaGFycyA9IFtdO1xuICAvL1xuICAvL1xuICBsZXQgc3RpbGxUb1NraXAgPSBza2lwICsgMTtcbiAgbGV0IGluRXNjYXBlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgYyBvZiBlbmNvZGVkKSB7XG4gICAgaWYgKHN0aWxsVG9Ta2lwID4gMCkge1xuICAgICAgc3RpbGxUb1NraXAgLT0gMTtcbiAgICAgIGlmIChzdGlsbFRvU2tpcCA9PT0gMCkge1xuICAgICAgICBjID09PSAnWycgfHwgRmFpbGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5Fc2NhcGUpIHtcbiAgICAgIGMgPT09ICdcXHUwMDAwJyB8fFxuICAgICAgYyA9PT0gJ1xcdTAwMDEnIHx8XG4gICAgICBGYWlsYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjfWA7XG4gICAgICBlbGVtQ2hhcnMucHVzaChjKTtcbiAgICB9IGVsc2UgaWYgKGMgPT09ICdcXHUwMDAwJykge1xuICAgICAgY29uc3QgZW5jb2RlZEVsZW1lbnQgPSBlbGVtQ2hhcnMuam9pbignJyk7XG4gICAgICBlbGVtQ2hhcnMubGVuZ3RoID0gMDtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG4gICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xcdTAwMDEnKSB7XG4gICAgICBpbkVzY2FwZSA9IHRydWU7XG4gICAgICAvL1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1DaGFycy5wdXNoKGMpO1xuICAgIH1cbiAgICBpbkVzY2FwZSA9IGZhbHNlO1xuICB9XG4gICFpbkVzY2FwZSB8fCBGYWlsYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGVsZW1DaGFycy5sZW5ndGggPT09IDAgfHxcbiAgRmFpbGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbn07XG5cbmNvbnN0IGVuY29kZVJlY29yZCA9IChyZWNvcmQsIGVuY29kZUFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICBjb25zdCBuYW1lcyA9IHJlY29yZE5hbWVzKHJlY29yZCk7XG4gIGNvbnN0IHZhbHVlcyA9IHJlY29yZFZhbHVlcyhyZWNvcmQsIG5hbWVzKTtcbiAgcmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLCB2YWx1ZXNdKSwgZW5jb2RlUGFzc2FibGUpfWA7XG59O1xuXG5jb25zdCBkZWNvZGVSZWNvcmQgPSAoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBhc3NlcnQoZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICcoJyk7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IHVuemlwcGVkRW50cmllcyA9IGRlY29kZUFycmF5KGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwICsgMSk7XG4gIHVuemlwcGVkRW50cmllcy5sZW5ndGggPT09IDIgfHxcbiAgRmFpbGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBba2V5cywgdmFsc10gPSB1bnppcHBlZEVudHJpZXM7XG5cbiAgKHBhc3NTdHlsZU9mKGtleXMpID09PSAnY29weUFycmF5JyAmJlxuICBwYXNzU3R5bGVPZih2YWxzKSA9PT0gJ2NvcHlBcnJheScgJiZcbiAga2V5cy5sZW5ndGggPT09IHZhbHMubGVuZ3RoICYmXG4gIGtleXMuZXZlcnkoKGtleSkgPT4gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycpKSB8fFxuICBGYWlsYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgbWFwRW50cmllcyA9IGtleXMubWFwKChrZXksIGkpID0+IFtrZXksIHZhbHNbaV1dKTtcbiAgY29uc3QgcmVjb3JkID0gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbiAgYXNzZXJ0UmVjb3JkKHJlY29yZCwgJ2RlY29kZWQgcmVjb3JkJyk7XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQgPSAodGFnZ2VkLCBlbmNvZGVBcnJheSwgZW5jb2RlUGFzc2FibGUpID0+XG5gOiR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtnZXRUYWcodGFnZ2VkKSwgdGFnZ2VkLnBheWxvYWRdKSwgZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZCA9IChlbmNvZGVkLCBkZWNvZGVBcnJheSwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJzonKTtcbiAgLy9cbiAgLy9cbiAgY29uc3QgdGFnZ2VkUGF5bG9hZCA9IGRlY29kZUFycmF5KGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwICsgMSk7XG4gIHRhZ2dlZFBheWxvYWQubGVuZ3RoID09PSAyIHx8XG4gIEZhaWxgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgW3RhZywgcGF5bG9hZF0gPSB0YWdnZWRQYXlsb2FkO1xuICBwYXNzU3R5bGVPZih0YWcpID09PSAnc3RyaW5nJyB8fFxuICBGYWlsYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVSZW1vdGFibGUgPSAodW5zYWZlRW5jb2RlUmVtb3RhYmxlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVSZW1vdGFibGUgPSAociwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVJlbW90YWJsZShyLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAncicpIHx8XG4gICAgRmFpbGBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdSZW1vdGFibGUnKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVSZW1vdGFibGU7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlUHJvbWlzZSA9ICh1bnNhZmVFbmNvZGVQcm9taXNlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVQcm9taXNlID0gKHAsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVQcm9taXNlKHAsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICc/JykgfHxcbiAgICBGYWlsYFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiP1wiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdQcm9taXNlJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlUHJvbWlzZTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVFcnJvciA9ICh1bnNhZmVFbmNvZGVFcnJvciwgdmVyaWZ5RW5jb2RpbmcpID0+IHtcbiAgY29uc3QgZW5jb2RlRXJyb3IgPSAoZXJyLCBpbm5lckVuY29kZSkgPT4ge1xuICAgIGNvbnN0IGVuY29kaW5nID0gdW5zYWZlRW5jb2RlRXJyb3IoZXJyLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAnIScpIHx8XG4gICAgRmFpbGBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ0Vycm9yJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlRXJyb3I7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VJbm5lckVuY29kZSA9IChlbmNvZGVTdHJpbmdTdWZmaXgsIGVuY29kZUFycmF5LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGU6IHVuc2FmZUVuY29kZVJlbW90YWJsZSxcbiAgICBlbmNvZGVQcm9taXNlOiB1bnNhZmVFbmNvZGVQcm9taXNlLFxuICAgIGVuY29kZUVycm9yOiB1bnNhZmVFbmNvZGVFcnJvcixcbiAgICB2ZXJpZnlFbmNvZGluZyA9ICgpID0+IHt9XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBlbmNvZGVSZW1vdGFibGUgPSBtYWtlRW5jb2RlUmVtb3RhYmxlKFxuICAgIHVuc2FmZUVuY29kZVJlbW90YWJsZSxcbiAgICB2ZXJpZnlFbmNvZGluZ1xuICApO1xuICBjb25zdCBlbmNvZGVQcm9taXNlID0gbWFrZUVuY29kZVByb21pc2UodW5zYWZlRW5jb2RlUHJvbWlzZSwgdmVyaWZ5RW5jb2RpbmcpO1xuICBjb25zdCBlbmNvZGVFcnJvciA9IG1ha2VFbmNvZGVFcnJvcih1bnNhZmVFbmNvZGVFcnJvciwgdmVyaWZ5RW5jb2RpbmcpO1xuXG4gIGNvbnN0IGlubmVyRW5jb2RlID0gKHBhc3NhYmxlKSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgIH1cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOntcbiAgICAgICAgICByZXR1cm4gJ3YnO1xuICAgICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOntcbiAgICAgICAgICByZXR1cm4gJ3onO1xuICAgICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOntcbiAgICAgICAgICByZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuICAgICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOntcbiAgICAgICAgICByZXR1cm4gYHMke2VuY29kZVN0cmluZ1N1ZmZpeChwYXNzYWJsZSl9YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnYm9vbGVhbic6e1xuICAgICAgICAgIHJldHVybiBgYiR7cGFzc2FibGV9YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzp7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6e1xuICAgICAgICAgIHJldHVybiBlbmNvZGVSZW1vdGFibGUocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOntcbiAgICAgICAgICByZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6e1xuICAgICAgICAgIHJldHVybiBlbmNvZGVQcm9taXNlKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6e1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgICAgcmV0dXJuIGB5JHtlbmNvZGVTdHJpbmdTdWZmaXgobmFtZSl9YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzp7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOntcbiAgICAgICAgICByZXR1cm4gZW5jb2RlUmVjb3JkKHBhc3NhYmxlLCBlbmNvZGVBcnJheSwgaW5uZXJFbmNvZGUpO1xuICAgICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOntcbiAgICAgICAgICByZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLCBlbmNvZGVBcnJheSwgaW5uZXJFbmNvZGUpO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OntcbiAgICAgICAgICB0aHJvdyBGYWlsYGEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sbGVjdGlvbiBwYXNzYWJsZWA7XG4gICAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBpbm5lckVuY29kZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBsaWJlcmFsRGVjb2RlcnMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyhcbi8qICAgICAgICAgICAgICAgICAgKi8oe1xuICBkZWNvZGVSZW1vdGFibGU6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICBkZWNvZGVQcm9taXNlOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgZGVjb2RlRXJyb3I6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkXG59KVxuKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBtYWtlSW5uZXJEZWNvZGUgPSAoZGVjb2RlU3RyaW5nU3VmZml4LCBkZWNvZGVBcnJheSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlY29kZVJlbW90YWJsZSwgZGVjb2RlUHJvbWlzZSwgZGVjb2RlRXJyb3IgfSA9IG9wdGlvbnM7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGlubmVyRGVjb2RlID0gKGVuY29kZWQsIHNraXAgPSAwKSA9PiB7XG4gICAgc3dpdGNoIChlbmNvZGVkLmNoYXJBdChza2lwKSkge1xuICAgICAgY2FzZSAndic6e1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICBjYXNlICd6Jzp7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnZic6e1xuICAgICAgICAgIHJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkLCBza2lwKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAncyc6e1xuICAgICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2InOntcbiAgICAgICAgICBjb25zdCBzdWJzdHJpbmcgPSBnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpO1xuICAgICAgICAgIGlmIChzdWJzdHJpbmcgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdWJzdHJpbmcgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRmFpbGBleHBlY3RlZCBlbmNvZGVkIGJvb2xlYW4gdG8gYmUgXCJidHJ1ZVwiIG9yIFwiYmZhbHNlXCI6ICR7c3Vic3RyaW5nfWA7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ24nOlxuICAgICAgY2FzZSAncCc6e1xuICAgICAgICAgIHJldHVybiBkZWNvZGVCaWdJbnQoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAncic6e1xuICAgICAgICAgIHJldHVybiBkZWNvZGVSZW1vdGFibGUoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJz8nOntcbiAgICAgICAgICByZXR1cm4gZGVjb2RlUHJvbWlzZShnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnISc6e1xuICAgICAgICAgIHJldHVybiBkZWNvZGVFcnJvcihnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAneSc6e1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgbmFtZSA9IGRlY29kZVN0cmluZ1N1ZmZpeChnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpKTtcbiAgICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICBjYXNlICdbJzpcbiAgICAgIGNhc2UgJ14nOntcbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJygnOntcbiAgICAgICAgICByZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJzonOntcbiAgICAgICAgICByZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6e1xuICAgICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBpbm5lckRlY29kZTtcbn07XG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VQYXNzYWJsZUtpdCA9IChvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZSA9IChyLCBfKSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3J9YCxcbiAgICBlbmNvZGVQcm9taXNlID0gKHAsIF8pID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3B9YCxcbiAgICBlbmNvZGVFcnJvciA9IChlcnIsIF8pID0+IEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YCxcbiAgICBmb3JtYXQgPSAnbGVnYWN5T3JkZXJlZCcsXG5cbiAgICBkZWNvZGVSZW1vdGFibGUgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YCxcbiAgICBkZWNvZGVQcm9taXNlID0gKGVuY29kaW5nLCBfKSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICAgIGRlY29kZUVycm9yID0gKGVuY29kaW5nLCBfKSA9PiBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YFxuICB9ID0gb3B0aW9ucztcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgZW5jb2RlUGFzc2FibGU7XG4gIGNvbnN0IGVuY29kZU9wdGlvbnMgPSB7IGVuY29kZVJlbW90YWJsZSwgZW5jb2RlUHJvbWlzZSwgZW5jb2RlRXJyb3IsIGZvcm1hdCB9O1xuICBpZiAoZm9ybWF0ID09PSAnY29tcGFjdE9yZGVyZWQnKSB7XG4gICAgY29uc3QgbGliZXJhbERlY29kZSA9IG1ha2VJbm5lckRlY29kZShcbiAgICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgICBsaWJlcmFsRGVjb2RlcnNcbiAgICApO1xuICAgIC8qXG4gICAgICAgICovXG5cblxuXG4gICAgY29uc3QgdmVyaWZ5RW5jb2RpbmcgPSAoZW5jb2RpbmcsIGxhYmVsKSA9PiB7XG4gICAgICAhZW5jb2RpbmcubWF0Y2gockMwKSB8fFxuICAgICAgRmFpbGAke2IoXG4gICAgICAgIGxhYmVsXG4gICAgICApfSBlbmNvZGluZyBtdXN0IG5vdCBjb250YWluIGEgQzAgY29udHJvbCBjaGFyYWN0ZXI6ICR7ZW5jb2Rpbmd9YDtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVDb21wYWN0QXJyYXkoYF52ICR7ZW5jb2Rpbmd9IHYgYCwgbGliZXJhbERlY29kZSk7XG4gICAgICAoaXNBcnJheShkZWNvZGVkKSAmJlxuICAgICAgZGVjb2RlZC5sZW5ndGggPT09IDMgJiZcbiAgICAgIGRlY29kZWRbMF0gPT09IG51bGwgJiZcbiAgICAgIGRlY29kZWRbMl0gPT09IG51bGwpIHx8XG4gICAgICBGYWlsYCR7YihsYWJlbCl9IGVuY29kaW5nIG11c3QgYmUgZW1iZWRkYWJsZTogJHtlbmNvZGluZ31gO1xuICAgIH07XG4gICAgY29uc3QgZW5jb2RlQ29tcGFjdCA9IG1ha2VJbm5lckVuY29kZShcbiAgICAgIGVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBlbmNvZGVDb21wYWN0QXJyYXksXG4gICAgICB7IC4uLmVuY29kZU9wdGlvbnMsIHZlcmlmeUVuY29kaW5nIH1cbiAgICApO1xuICAgIGVuY29kZVBhc3NhYmxlID0gKHBhc3NhYmxlKSA9PiBgfiR7ZW5jb2RlQ29tcGFjdChwYXNzYWJsZSl9YDtcbiAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdsZWdhY3lPcmRlcmVkJykge1xuICAgIGVuY29kZVBhc3NhYmxlID0gbWFrZUlubmVyRW5jb2RlKFxuICAgICAgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlTGVnYWN5QXJyYXksXG4gICAgICBlbmNvZGVPcHRpb25zXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBmb3JtYXQ6ICR7cShmb3JtYXQpfWA7XG4gIH1cblxuICBjb25zdCBkZWNvZGVPcHRpb25zID0geyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH07XG4gIGNvbnN0IGRlY29kZUNvbXBhY3QgPSBtYWtlSW5uZXJEZWNvZGUoXG4gICAgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbiAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgZGVjb2RlT3B0aW9uc1xuICApO1xuICBjb25zdCBkZWNvZGVMZWdhY3kgPSBtYWtlSW5uZXJEZWNvZGUoXG4gICAgZGVjb2RlTGVnYWN5U3RyaW5nU3VmZml4LFxuICAgIGRlY29kZUxlZ2FjeUFycmF5LFxuICAgIGRlY29kZU9wdGlvbnNcbiAgKTtcbiAgY29uc3QgZGVjb2RlUGFzc2FibGUgPSAoZW5jb2RlZCkgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGlmIChlbmNvZGVkLmNoYXJBdCgwKSA9PT0gJ34nKSB7XG4gICAgICByZXR1cm4gZGVjb2RlQ29tcGFjdChlbmNvZGVkLCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY29kZUxlZ2FjeShlbmNvZGVkKTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgZW5jb2RlUGFzc2FibGUsIGRlY29kZVBhc3NhYmxlIH0pO1xufTskaM2PX29uY2UubWFrZVBhc3NhYmxlS2l0KG1ha2VQYXNzYWJsZUtpdCk7XG5oYXJkZW4obWFrZVBhc3NhYmxlS2l0KTtcblxuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VFbmNvZGVQYXNzYWJsZSA9IChlbmNvZGVPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHsgZW5jb2RlUGFzc2FibGUgfSA9IG1ha2VQYXNzYWJsZUtpdChlbmNvZGVPcHRpb25zKTtcbiAgcmV0dXJuIGVuY29kZVBhc3NhYmxlO1xufTskaM2PX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VEZWNvZGVQYXNzYWJsZSA9IChkZWNvZGVPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHsgZGVjb2RlUGFzc2FibGUgfSA9IG1ha2VQYXNzYWJsZUtpdChkZWNvZGVPcHRpb25zKTtcbiAgcmV0dXJuIGRlY29kZVBhc3NhYmxlO1xufTskaM2PX29uY2UubWFrZURlY29kZVBhc3NhYmxlKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZURlY29kZVBhc3NhYmxlKTtcblxuY29uc3QgaXNFbmNvZGVkUmVtb3RhYmxlID0gKGVuY29kZWQpID0+IGVuY29kZWQuY2hhckF0KDApID09PSAncic7JGjNj19vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHBhc3NTdHlsZVByZWZpeGVzID0ge1xuICBlcnJvcjogJyEnLFxuICBjb3B5UmVjb3JkOiAnKCcsXG4gIHRhZ2dlZDogJzonLFxuICBwcm9taXNlOiAnPycsXG4gIGNvcHlBcnJheTogJ1teJyxcbiAgYm9vbGVhbjogJ2InLFxuICBudW1iZXI6ICdmJyxcbiAgYmlnaW50OiAnbnAnLFxuICByZW1vdGFibGU6ICdyJyxcbiAgc3RyaW5nOiAncycsXG4gIG51bGw6ICd2JyxcbiAgc3ltYm9sOiAneScsXG4gIC8vXG4gIC8vXG4gIC8vXG4gIHVuZGVmaW5lZDogJ3onXG59OyRozY9fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsIG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVByZWZpeGVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VQYXNzYWJsZUtpdCI6WyJtYWtlUGFzc2FibGVLaXQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGn61zCstAAArLQAAKwAAAEBlbmRvL21hcnNoYWwtdjEuNi4zL3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG4gIGRlZmluZVByb3BlcnRpZXMsXG4gIGlzLFxuICBlbnRyaWVzLFxuICBmcm9tRW50cmllcyxcbiAgZnJlZXplXG59ID0gT2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgUUNMQVNTID0gJ0BxY2xhc3MnOyRozY9fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKlxuXG5cbiAqL1xuY29uc3QgaGFzUUNsYXNzID0gKGVuY29kZWQpID0+IGhhc093blByb3BlcnR5T2YoZW5jb2RlZCwgUUNMQVNTKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcyA9IChlbmNvZGVkLCBxY2xhc3MpID0+XG5pc09iamVjdChlbmNvZGVkKSAmJlxuIWlzQXJyYXkoZW5jb2RlZCkgJiZcbmhhc1FDbGFzcyhlbmNvZGVkKSAmJlxuZW5jb2RlZFtRQ0xBU1NdID09PSBxY2xhc3M7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gKHJlbSkgPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEgPSAocHJvbSkgPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEgPSAoZXJyKSA9PiBGYWlsYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFrZUVuY29kZVRvQ2FwRGF0YSA9IChlbmNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG4gICAgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuICAgIGVuY29kZUVycm9yVG9DYXBEYXRhID0gZG9udEVuY29kZUVycm9yVG9DYXBEYXRhXG4gIH0gPSBlbmNvZGVPcHRpb25zO1xuXG4gIC8qXG4gIFxuICBcbiAgXG4gIFxuICBcbiAgXG4gIFxuICBcbiAgXG4gIFxuICAgICovXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gIGNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyID0gKHBhc3NhYmxlKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6e1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOntcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ3VuZGVmaW5lZCcgfTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzp7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdOYU4nIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAnSW5maW5pdHknIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJy1JbmZpbml0eScgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gaXMocGFzc2FibGUsIC0wKSA/IDAgOiBwYXNzYWJsZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzp7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFtRQ0xBU1NdOiAnYmlnaW50JyxcbiAgICAgICAgICAgIGRpZ2l0czogU3RyaW5nKHBhc3NhYmxlKVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6e1xuICAgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbiAgICAgICAgICBjb25zdCBuYW1lID0gLyogICAgICAgICAgICAgICAgICovKG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSkpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbUUNMQVNTXTogJ3N5bWJvbCcsXG4gICAgICAgICAgICBuYW1lXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6e1xuICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLCBRQ0xBU1MpKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgY29uc3QgeyBbUUNMQVNTXTogcWNsYXNzVmFsdWUsIC4uLnJlc3QgfSA9IHBhc3NhYmxlO1xuICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgW1FDTEFTU106ICdoaWxiZXJ0JyxcbiAgICAgICAgICAgICAgb3JpZ2luYWw6IGVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChvd25LZXlzKHJlc3QpLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIHJlc3VsdC5yZXN0ID0gZW5jb2RlVG9DYXBEYXRhUmVjdXIoZnJlZXplKHJlc3QpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xuICAgICAgICAgIHJldHVybiBmcm9tRW50cmllcyhcbiAgICAgICAgICAgIG5hbWVzLm1hcCgobmFtZSkgPT4gW25hbWUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzp7XG4gICAgICAgICAgcmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6e1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbUUNMQVNTXTogJ3RhZ2dlZCcsXG4gICAgICAgICAgICB0YWc6IGdldFRhZyhwYXNzYWJsZSksXG4gICAgICAgICAgICBwYXlsb2FkOiBlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZS5wYXlsb2FkKVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6e1xuICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG4gICAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICAgIGVuY29kZVRvQ2FwRGF0YVJlY3VyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnc2xvdCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgICBRQ0xBU1NcbiAgICAgICAgICApfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzp7XG4gICAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnc2xvdCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgICAgICdzbG90J1xuICAgICAgICAgICl9OiAke2VuY29kZWR9YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOntcbiAgICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnZXJyb3InKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgICAgUUNMQVNTLFxuICAgICAgICAgICAgJ2Vycm9yJ1xuICAgICAgICAgICl9OiAke2VuY29kZWR9YDtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDp7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICBYYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG4gICAgICAgICAgICBUeXBlRXJyb3JcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb0NhcERhdGEgPSAocGFzc2FibGUpID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIGhhcmRlbihlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YSk7XG59OyRozY9fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhID0gKHNsb3RFbmNvZGluZykgPT5cbkZhaWxgcmVtb3RhYmxlIG9yIHByb21pc2UgdW5leHBlY3RlZDogJHtzbG90RW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhID0gKGVycm9yRW5jb2RpbmcpID0+XG5GYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZURlY29kZUZyb21DYXBEYXRhID0gKGRlY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgPSBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhID0gZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgIGRlY29kZUVycm9yRnJvbUNhcERhdGEgPSBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YVxuICB9ID0gZGVjb2RlT3B0aW9ucztcblxuICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9PT0gZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIHx8XG4gIEZhaWxgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YVxuICApfSB2cyAke3EoZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhKX1gO1xuXG4gIC8qXG4gIFxuICBcbiAgICAgKi9cblxuXG5cblxuXG5cbiAgY29uc3QgZGVjb2RlRnJvbUNhcERhdGEgPSAoanNvbkVuY29kZWQpID0+IHtcbiAgICBpZiAoIWlzT2JqZWN0KGpzb25FbmNvZGVkKSkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBqc29uRW5jb2RlZDtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkoanNvbkVuY29kZWQpKSB7XG4gICAgICByZXR1cm4ganNvbkVuY29kZWQubWFwKChlbmNvZGVkVmFsKSA9PiBkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gICAgfSBlbHNlIGlmIChoYXNRQ2xhc3MoanNvbkVuY29kZWQpKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSBqc29uRW5jb2RlZFtRQ0xBU1NdO1xuICAgICAgdHlwZW9mIHFjbGFzcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgaW52YWxpZCAke3EoUUNMQVNTKX0gdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuICAgICAgc3dpdGNoIChxY2xhc3MpIHtcbiAgICAgICAgLy9cbiAgICAgICAgY2FzZSAndW5kZWZpbmVkJzp7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnTmFOJzp7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnSW5maW5pdHknOntcbiAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6e1xuICAgICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6e1xuICAgICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgICAgdHlwZW9mIGRpZ2l0cyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzp7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzp7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6e1xuICAgICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdzbG90Jzp7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG4gICAgICAgICAgICAgIGpzb25FbmNvZGVkLFxuICAgICAgICAgICAgICBkZWNvZGVGcm9tQ2FwRGF0YVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Vycm9yJzp7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbiAgICAgICAgICAgICAganNvbkVuY29kZWQsXG4gICAgICAgICAgICAgIGRlY29kZUZyb21DYXBEYXRhXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKGRlY29kZWQpID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6e1xuICAgICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCAnb3JpZ2luYWwnKSB8fFxuICAgICAgICAgICAgRmFpbGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgW1FDTEFTU106IGRlY29kZUZyb21DYXBEYXRhKG9yaWdpbmFsKSB9O1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsICdyZXN0JykpIHtcbiAgICAgICAgICAgICAgY29uc3QgaXNOb25FbXB0eU9iamVjdCA9XG4gICAgICAgICAgICAgIHR5cGVvZiByZXN0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICByZXN0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID49IDE7XG4gICAgICAgICAgICAgIGlmICghaXNOb25FbXB0eU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmVzdE9iaiA9IGRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAhaGFzT3duUHJvcGVydHlPZihyZXN0T2JqLCBRQ0xBU1MpIHx8XG4gICAgICAgICAgICAgIEZhaWxgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgY2FzZSAnaWJpZCc6e1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbiAgICAgICAgICAgICAgcWNsYXNzXG4gICAgICAgICAgICApfWA7XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OntcbiAgICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICBYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcbiAgICAgICAgICAgICAgVHlwZUVycm9yXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZCA9PT0gJ29iamVjdCcgJiYganNvbkVuY29kZWQgIT09IG51bGwpO1xuICAgICAgY29uc3QgZGVjb2RlRW50cnkgPSAoW25hbWUsIGVuY29kZWRWYWxdKSA9PiB7XG4gICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBGYWlsYFByb3BlcnR5ICR7cShuYW1lKX0gb2YgJHtqc29uRW5jb2RlZH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgIHJldHVybiBbbmFtZSwgZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGRlY29kZWRFbnRyaWVzID0gZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbiAgICAgIHJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbn07JGjNj19vbmNlLm1ha2VEZWNvZGVGcm9tQ2FwRGF0YShtYWtlRGVjb2RlRnJvbUNhcERhdGEpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC1bOZUFi4AABYuAAAtAAAAQGVuZG8vbWFyc2hhbC12MS42LjMvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxYLEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBpcywgZW50cmllcywgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuY29uc3QgQkFORyA9ICchJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgREFTSCA9ICctJy5jaGFyQ29kZUF0KDApO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsID0gKGVuY29kZWRTdHIpID0+IHtcbiAgaWYgKGVuY29kZWRTdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vXG4gIGNvbnN0IGNvZGUgPSBlbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4gIC8vXG4gIHJldHVybiBCQU5HIDw9IGNvZGUgJiYgY29kZSA8PSBEQVNIO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IChyZW0pID0+XG5GYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gKHByb20pID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSAoZXJyKSA9PlxuRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9IChlbmNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuICAgIGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG4gICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzXG4gIH0gPSBlbmNvZGVPcHRpb25zO1xuXG4gIGNvbnN0IGFzc2VydEVuY29kZWRFcnJvciA9IChlbmNvZGluZykgPT4ge1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdvYmplY3QnICYmIGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsICcjZXJyb3InKSkgfHxcbiAgICBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKFxuICAgICAgZW5jb2RpbmdcbiAgICApfWA7XG4gICAgLy9cbiAgICBjb25zdCBtZXNzYWdlID0gZW5jb2RpbmdbJyNlcnJvciddO1xuICAgICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAoIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSkgfHwgbWVzc2FnZS5jaGFyQXQoMCkgPT09ICchJykpIHx8XG4gICAgRmFpbGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIHN0cmluZyBtZXNzYWdlOiAke3EobWVzc2FnZSl9YDtcbiAgfTtcblxuICAvKlxuICBcbiAgXG4gIFxuICBcbiAgXG4gIFxuICBcbiAgXG4gIFxuICBcbiAgICAqL1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICBjb25zdCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyID0gKHBhc3NhYmxlKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzp7XG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6e1xuICAgICAgICAgIGlmIChzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOntcbiAgICAgICAgICByZXR1cm4gJyN1bmRlZmluZWQnO1xuICAgICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOntcbiAgICAgICAgICAvL1xuICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFzc2FibGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gJyNOYU4nO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gJyNJbmZpbml0eSc7XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gJyMtSW5maW5pdHknO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBpcyhwYXNzYWJsZSwgLTApID8gMCA6IHBhc3NhYmxlO1xuICAgICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOntcbiAgICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcocGFzc2FibGUpO1xuICAgICAgICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgKi8ocGFzc2FibGUpIDwgMG4gPyBzdHIgOiBgKyR7c3RyfWA7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6e1xuICAgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbiAgICAgICAgICBjb25zdCBuYW1lID0gLyogICAgICAgICAgICAgICAgICovKG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSkpO1xuICAgICAgICAgIHJldHVybiBgJSR7bmFtZX1gO1xuICAgICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzp7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG4gICAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKFxuICAgICAgICAgICAgbmFtZXMubWFwKChuYW1lKSA9PiBbXG4gICAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKG5hbWUpLFxuICAgICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZVtuYW1lXSldXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzp7XG4gICAgICAgICAgcmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzp7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICcjdGFnJzogZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihnZXRUYWcocGFzc2FibGUpKSxcbiAgICAgICAgICAgIHBheWxvYWQ6IGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZClcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOntcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbiAgICAgICAgICAgIHBhc3NhYmxlLFxuICAgICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1clxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnICYmIHJlc3VsdC5jaGFyQXQoMCkgPT09ICckJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJFwiOiAke3Jlc3VsdH1gO1xuICAgICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzp7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxuICAgICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PT0gJyYnKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOntcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OntcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICAgIFR5cGVFcnJvclxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzID0gKHBhc3NhYmxlKSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGhhcmRlbihcbiAgICAgICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSwgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cilcbiAgICAgICk7XG4gICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IChlbmNvZGluZykgPT5cbkZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IChlbmNvZGluZykgPT5cbkZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gKGVuY29kaW5nKSA9PlxuRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qXG5cblxuICovXG5jb25zdCBtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9IChkZWNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbiAgICBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbiAgICBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzXG4gIH0gPSBkZWNvZGVPcHRpb25zO1xuXG4gIC8qXG4gIFxuICBcbiAgICAgKi9cblxuXG5cblxuXG5cbiAgY29uc3QgZGVjb2RlRnJvbVNtYWxsY2FwcyA9IChlbmNvZGluZykgPT4ge1xuICAgIHN3aXRjaCAodHlwZW9mIGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6e1xuICAgICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzp7XG4gICAgICAgICAgaWYgKCFzdGFydHNTcGVjaWFsKGVuY29kaW5nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBjID0gZW5jb2RpbmcuY2hhckF0KDApO1xuICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgY2FzZSAnISc6e1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICclJzp7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJyMnOntcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlICcjdW5kZWZpbmVkJzp7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAnI05hTic6e1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgJyNJbmZpbml0eSc6e1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAnIy1JbmZpbml0eSc6e1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6e1xuICAgICAgICAgICAgICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICAgICAgICAgICAgWGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsXG4gICAgICAgICAgICAgICAgICAgICAgICBUeXBlRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgIGNhc2UgJy0nOntcbiAgICAgICAgICAgICAgICByZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnJCc6e1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG4gICAgICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKHJlc3VsdCkgIT09ICdyZW1vdGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnJic6e1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAocGFzc1N0eWxlT2YocmVzdWx0KSAhPT0gJ3Byb21pc2UnKSB7XG4gICAgICAgICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OntcbiAgICAgICAgICAgICAgICB0aHJvdyBGYWlsYFNwZWNpYWwgY2hhciAke3EoXG4gICAgICAgICAgICAgICAgICBjXG4gICAgICAgICAgICAgICAgKX0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgY2FzZSAnb2JqZWN0Jzp7XG4gICAgICAgICAgaWYgKGVuY29kaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGlzQXJyYXkoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RpbmcubWFwKCh2YWwpID0+IGRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsICcjdGFnJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgJyN0YWcnOiB0YWcsIHBheWxvYWQsIC4uLnJlc3QgfSA9IGVuY29kaW5nO1xuICAgICAgICAgICAgdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgVmFsdWUgb2YgXCIjdGFnXCIsIHRoZSB0YWcsIG11c3QgYmUgYSBzdHJpbmc6ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBGYWlsYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG4gICAgICAgICAgICByZXR1cm4gbWFrZVRhZ2dlZChcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuICAgICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCAnI2Vycm9yJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbiAgICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwYXNzU3R5bGVPZihyZXN1bHQpID09PSAnZXJyb3InIHx8XG4gICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBkZWNvZGVFbnRyeSA9IChbZW5jb2RlZE5hbWUsIGVuY29kZWRWYWxdKSA9PiB7XG4gICAgICAgICAgICB0eXBlb2YgZW5jb2RlZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYFByb3BlcnR5IG5hbWUgJHtxKFxuICAgICAgICAgICAgICBlbmNvZGVkTmFtZVxuICAgICAgICAgICAgKX0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICBlbmNvZGVkTmFtZS5jaGFyQXQoMCkgIT09ICcjJyB8fFxuICAgICAgICAgICAgRmFpbGBVbnJlY29nbml6ZWQgcmVjb3JkIHR5cGUgJHtxKGVuY29kZWROYW1lKX06ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbiAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBEZWNvZGVkIHByb3BlcnR5IG5hbWUgJHtuYW1lfSBmcm9tICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgICAgcmV0dXJuIFtuYW1lLCBkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWRWYWwpXTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGRlY29kZWRFbnRyaWVzID0gZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OntcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgIFhgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG4gICAgICAgICAgICAgIHR5cGVvZiBlbmNvZGluZ1xuICAgICAgICAgICAgKX06ICR7ZW5jb2Rpbmd9YCxcbiAgICAgICAgICAgIFR5cGVFcnJvclxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIyyqV6cMAAAnDAAACoAAABAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxwYXNzYWJsZVN5bWJvbEZvck5hbWUscSxYLEZhaWwsUUNMQVNTOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBzdHJpbmdpZnk6IHF1b3RlIH0gPSBKU09OO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlciA9ICgpID0+IHtcbiAgY29uc3Qgc3RyaW5ncyA9IFtdO1xuICBsZXQgbGV2ZWwgPSAwO1xuICBsZXQgbmVlZFNwYWNlID0gZmFsc2U7XG4gIGNvbnN0IGxpbmUgPSAoKSA9PiB7XG4gICAgbmVlZFNwYWNlID0gZmFsc2U7XG4gICAgcmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywgJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgb3BlbjogKG9wZW5CcmFja2V0KSA9PiB7XG4gICAgICBsZXZlbCArPSAxO1xuICAgICAgaWYgKG5lZWRTcGFjZSkge1xuICAgICAgICBzdHJpbmdzLnB1c2goJyAnKTtcbiAgICAgIH1cbiAgICAgIG5lZWRTcGFjZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gICAgfSxcbiAgICBsaW5lLFxuICAgIG5leHQ6ICh0b2tlbikgPT4ge1xuICAgICAgaWYgKG5lZWRTcGFjZSAmJiB0b2tlbiAhPT0gJywnKSB7XG4gICAgICAgIHN0cmluZ3MucHVzaCgnICcpO1xuICAgICAgfVxuICAgICAgbmVlZFNwYWNlID0gdHJ1ZTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuICAgIH0sXG4gICAgY2xvc2U6IChjbG9zZUJyYWNrZXQpID0+IHtcbiAgICAgIGFzc2VydChsZXZlbCA+PSAxKTtcbiAgICAgIGxldmVsIC09IDE7XG4gICAgICBsaW5lKCk7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gICAgfSxcbiAgICBkb25lOiAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwobGV2ZWwsIDApO1xuICAgICAgcmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybiA9IC9eKD86XFx3XFx3fDw8fD4+fFxcK1xcK3wtLXw8IXwtPikkLztcblxuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZU5vSW5kZW50ZXIgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0cmluZ3MgPSBbXTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgb3BlbjogKG9wZW5CcmFja2V0KSA9PiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpLFxuICAgIGxpbmU6ICgpID0+IHN0cmluZ3MubGVuZ3RoLFxuICAgIG5leHQ6ICh0b2tlbikgPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGxhc3QubGVuZ3RoID49IDEgJiYgdG9rZW4ubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICBjb25zdCBwYWlyID0gYCR7bGFzdFtsYXN0Lmxlbmd0aCAtIDFdfSR7dG9rZW5bMF19YDtcbiAgICAgICAgICBpZiAoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSkge1xuICAgICAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiAgICB9LFxuICAgIGNsb3NlOiAoY2xvc2VCcmFja2V0KSA9PiB7XG4gICAgICBpZiAoc3RyaW5ncy5sZW5ndGggPj0gMSAmJiBzdHJpbmdzW3N0cmluZ3MubGVuZ3RoIC0gMV0gPT09ICcsJykge1xuICAgICAgICBzdHJpbmdzLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuICAgIH0sXG4gICAgZG9uZTogKCkgPT4gc3RyaW5ncy5qb2luKCcnKVxuICB9KTtcbn07XG5cbmNvbnN0IGlkZW50UGF0dGVybiA9IC9eW2EtekEtWl1cXHcqJC87XG5oYXJkZW4oaWRlbnRQYXR0ZXJuKTtcbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuID0gL15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW4gPSAoZW5jb2RpbmcsIHNob3VsZEluZGVudCA9IGZhbHNlLCBzbG90cyA9IFtdKSA9PiB7XG4gIC8qXG4gIFxuICBcbiAgXG4gICAgKi9cblxuXG5cblxuXG5cblxuICBjb25zdCBwcmVwYXJlID0gKHJhd1RyZWUpID0+IHtcbiAgICBpZiAoIWlzT2JqZWN0KHJhd1RyZWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vXG4gICAgYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCAnb2JqZWN0Jyk7XG4gICAgYXNzZXJ0KHJhd1RyZWUgIT09IG51bGwpO1xuICAgIGlmIChRQ0xBU1MgaW4gcmF3VHJlZSkge1xuICAgICAgY29uc3QgcWNsYXNzID0gcmF3VHJlZVtRQ0xBU1NdO1xuICAgICAgdHlwZW9mIHFjbGFzcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzp7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOntcbiAgICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgICAgdHlwZW9mIGRpZ2l0cyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzp7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOntcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihzeW0sICdzeW1ib2wnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6e1xuICAgICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKHRhZywgJ3N0cmluZycpO1xuICAgICAgICAgICAgcHJlcGFyZShwYXlsb2FkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Nsb3QnOntcbiAgICAgICAgICAgIGNvbnN0IHsgaW5kZXgsIGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuICAgICAgICAgICAgTmF0KGluZGV4KTtcbiAgICAgICAgICAgIGlmIChpZmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGFzc2VydC50eXBlb2YoaWZhY2UsICdzdHJpbmcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOntcbiAgICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgICAnb3JpZ2luYWwnIGluIHJhd1RyZWUgfHxcbiAgICAgICAgICAgIEZhaWxgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xuICAgICAgICAgICAgcHJlcGFyZShvcmlnaW5hbCk7XG4gICAgICAgICAgICBpZiAoJ3Jlc3QnIGluIHJhd1RyZWUpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0YDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIG51bGxgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpc0FycmF5KHJlc3QpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgYW4gYXJyYXlgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChRQ0xBU1MgaW4gcmVzdCkge1xuICAgICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmVzdCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIEZhaWxgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgICAgcHJlcGFyZShyZXN0W25hbWVdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnZXJyb3InOntcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgbmFtZSl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdldEVycm9yQ29uc3RydWN0b3IobmFtZSkgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgRmFpbGBNdXN0IGJlIHRoZSBuYW1lIG9mIGFuIEVycm9yIGNvbnN0cnVjdG9yICR7bmFtZX1gO1xuICAgICAgICAgICAgdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OntcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmF3VHJlZSkpIHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSByYXdUcmVlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBwcmVwYXJlKHJhd1RyZWVbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmF3VHJlZSk7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IEZhaWxgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgIH1cbiAgICAgICAgcHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbWFrZUluZGVudGVyID0gc2hvdWxkSW5kZW50ID8gbWFrZVllc0luZGVudGVyIDogbWFrZU5vSW5kZW50ZXI7XG4gIGxldCBvdXQgPSBtYWtlSW5kZW50ZXIoKTtcblxuICAvKlxuICBcbiAgXG4gICAqL1xuXG5cblxuXG4gIGNvbnN0IGRlY29kZSA9IChyYXdUcmVlKSA9PiB7XG4gICAgLy9cbiAgICByZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gIH07XG5cbiAgY29uc3QgZGVjb2RlUHJvcGVydHkgPSAobmFtZSwgdmFsdWUpID0+IHtcbiAgICBvdXQubGluZSgpO1xuICAgIGlmIChuYW1lID09PSAnX19wcm90b19fJykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIG91dC5uZXh0KGBbXCJfX3Byb3RvX19cIl06YCk7XG4gICAgfSBlbHNlIGlmIChpZGVudFBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgb3V0Lm5leHQoYCR7bmFtZX06YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5uZXh0KGAke3F1b3RlKG5hbWUpfTpgKTtcbiAgICB9XG4gICAgZGVjb2RlKHZhbHVlKTtcbiAgICBvdXQubmV4dCgnLCcpO1xuICB9O1xuXG4gIC8qXG4gIFxuICAgICovXG5cblxuXG4gIGNvbnN0IHJlY3VyID0gKHJhd1RyZWUpID0+IHtcbiAgICBpZiAoIWlzT2JqZWN0KHJhd1RyZWUpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiAgICB9XG4gICAgLy9cbiAgICBhc3NlcnQudHlwZW9mKHJhd1RyZWUsICdvYmplY3QnKTtcbiAgICBhc3NlcnQocmF3VHJlZSAhPT0gbnVsbCk7XG4gICAgaWYgKFFDTEFTUyBpbiByYXdUcmVlKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSByYXdUcmVlW1FDTEFTU107XG4gICAgICBhc3NlcnQudHlwZW9mKHFjbGFzcywgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzp7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOntcbiAgICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihkaWdpdHMsICdzdHJpbmcnKTtcbiAgICAgICAgICAgIHJldHVybiBvdXQubmV4dChgJHtCaWdJbnQoZGlnaXRzKX1uYCk7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOntcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOntcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihzeW0sICdzeW1ib2wnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2lzdGVyZWROYW1lID0gU3ltYm9sLmtleUZvcihzeW0pO1xuICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBBdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuICAgICAgICAgICAgICBhc3NlcnQobWF0Y2ggIT09IG51bGwpO1xuICAgICAgICAgICAgICBjb25zdCBzdWZmaXggPSBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgYXNzZXJ0KFN5bWJvbFtzdWZmaXhdID09PSBzeW0pO1xuICAgICAgICAgICAgICBhc3NlcnQoaWRlbnRQYXR0ZXJuLnRlc3Qoc3VmZml4KSk7XG4gICAgICAgICAgICAgIHJldHVybiBvdXQubmV4dChgU3ltYm9sLiR7c3VmZml4fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBTeW1ib2wuZm9yKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6e1xuICAgICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgICBvdXQubmV4dChgbWFrZVRhZ2dlZCgke3F1b3RlKHRhZyl9LGApO1xuICAgICAgICAgICAgZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KCcpJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3Nsb3QnOntcbiAgICAgICAgICAgIGxldCB7IGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoTmF0KHJhd1RyZWUuaW5kZXgpKTtcbiAgICAgICAgICAgIGNvbnN0IG5lc3RlZFJlbmRlciA9IChhcmcpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgb2xkT3V0ID0gb3V0O1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG91dCA9IG1ha2VOb0luZGVudGVyKCk7XG4gICAgICAgICAgICAgICAgZGVjb2RlKGFyZyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dC5kb25lKCk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgb3V0ID0gb2xkT3V0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgc2xvdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNsb3QgPSBuZXN0ZWRSZW5kZXIoc2xvdHNbaW5kZXhdKTtcbiAgICAgICAgICAgICAgaWYgKGlmYWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYHNsb3RUb1ZhbCgke3Nsb3R9KWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmYWNlID0gbmVzdGVkUmVuZGVyKGlmYWNlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBzbG90VG9WYWwoJHtzbG90fSwke2lmYWNlfSlgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZmFjZSA9IG5lc3RlZFJlbmRlcihpZmFjZSk7XG4gICAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0sJHtpZmFjZX0pYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOntcbiAgICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgICBvdXQub3BlbigneycpO1xuICAgICAgICAgICAgZGVjb2RlUHJvcGVydHkoUUNMQVNTLCBvcmlnaW5hbCk7XG4gICAgICAgICAgICBpZiAoJ3Jlc3QnIGluIHJhd1RyZWUpIHtcbiAgICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihyZXN0LCAnb2JqZWN0Jyk7XG4gICAgICAgICAgICAgIGFzc2VydChyZXN0ICE9PSBudWxsKTtcbiAgICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJlc3QpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBGYWlsYFByb3BlcnR5IG5hbWUgJHtxKFxuICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgICApfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShuYW1lLCByZXN0W25hbWVdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnfScpO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlICdlcnJvcic6e1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICBjYXVzZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgZXJyb3JzID0gdW5kZWZpbmVkXG4gICAgICAgICAgICB9ID0gcmF3VHJlZTtcbiAgICAgICAgICAgIGNhdXNlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgZXJyb3IgY2F1c2Ugbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG4gICAgICAgICAgICBuYW1lICE9PSBgQWdncmVnYXRlRXJyb3JgIHx8XG4gICAgICAgICAgICBGYWlsYEFnZ3JlZ2F0ZUVycm9yIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgICAgZXJyb3JzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgZXJyb3IgZXJyb3JzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGAke25hbWV9KCR7cXVvdGUobWVzc2FnZSl9KWApO1xuICAgICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OntcbiAgICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICBYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcbiAgICAgICAgICAgICAgVHlwZUVycm9yXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmF3VHJlZSkpIHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSByYXdUcmVlO1xuICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQub3BlbignWycpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgb3V0LmxpbmUoKTtcbiAgICAgICAgICBkZWNvZGUocmF3VHJlZVtpXSk7XG4gICAgICAgICAgb3V0Lm5leHQoJywnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgbmFtZXMgPSAvKiAgICAgICAgICAgICAgICAgICAqLyhvd25LZXlzKHJhd1RyZWUpKTtcbiAgICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dC5uZXh0KCd7fScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0Lm9wZW4oJ3snKTtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgZGVjb2RlUHJvcGVydHkobmFtZSwgcmF3VHJlZVtuYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnfScpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcHJlcGFyZShlbmNvZGluZyk7XG4gIGRlY29kZShlbmNvZGluZyk7XG4gIHJldHVybiBvdXQuZG9uZSgpO1xufTskaM2PX29uY2UuZGVjb2RlVG9KdXN0aW4oZGVjb2RlVG9KdXN0aW4pO1xuaGFyZGVuKGRlY29kZVRvSnVzdGluKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALypBys1BwAANQcAAC0AAABAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3QgPSAodmFsKSA9PlxuRmFpbGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbCA9IChzbG90LCBfaWZhY2UpID0+XG5GYWlsYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXIgPSBoYXJkZW4oe1xuICBnZXQ6IChfdGFyZ2V0LCBuYW1lLCBfcmVjZWl2ZXIpID0+IHtcbiAgICBpZiAobmFtZSA9PT0gJ2xlbmd0aCcpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvL1xuICAgIHRocm93IEZhaWxgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gIH1cbn0pO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGFycmF5VGFyZ2V0ID0gZnJlZXplKCAvKiAgICAgICAgICAgICAgICAqLyhbXSkpO1xuY29uc3QgYmFkQXJyYXkgPSBuZXcgUHJveHkoYXJyYXlUYXJnZXQsIGJhZEFycmF5SGFuZGxlcik7XG5cbmNvbnN0IHsgc2VyaWFsaXplLCB1bnNlcmlhbGl6ZSB9ID0gbWFrZU1hcnNoYWwoXG4gIGRvTm90Q29udmVydFZhbFRvU2xvdCxcbiAgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxuICB7XG4gICAgZXJyb3JUYWdnaW5nOiAnb2ZmJyxcbiAgICAvL1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdjYXBkYXRhJ1xuICB9XG4pO1xuXG4vKlxuXG5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gKHZhbCkgPT4gc2VyaWFsaXplKHZhbCkuYm9keTskaM2PX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLypcblxuXG4gKi9cbmNvbnN0IHBhcnNlID0gKHN0cikgPT5cbnVuc2VyaWFsaXplKFxuICAvL1xuICAvL1xuICAvL1xuICBmcmVlemUoe1xuICAgIGJvZHk6IHN0cixcbiAgICBzbG90czogYmFkQXJyYXlcbiAgfSlcbik7JGjNj19vbmNlLnBhcnNlKHBhcnNlKTtcbmhhcmRlbihwYXJzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdpZnkiOlsic3RyaW5naWZ5Il0sInBhcnNlIjpbInBhcnNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJk7OoJELwAARC8AACMAAABAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlTWFyc2hhbCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5T2YsdG9QYXNzYWJsZUVycm9yLFgsRmFpbCxxLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yLG9iamVjdE1hcCxRQ0xBU1MsbWFrZUVuY29kZVRvQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbUNhcERhdGEsbWFrZURlY29kZUZyb21TbWFsbGNhcHMsbWFrZUVuY29kZVRvU21hbGxjYXBzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZU9mXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaM2PX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1widG9QYXNzYWJsZUVycm9yXCIsWyRozY9fYSA9PiAodG9QYXNzYWJsZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLFskaM2PX2EgPT4gKFFDTEFTUyA9ICRozY9fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsWyRozY9fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRozY9fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIixbJGjNj19hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLFskaM2PX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjNj19hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLFskaM2PX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG5jb25zdCB7IGRlZmluZVByb3BlcnRpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGVmYXVsdFZhbFRvU2xvdEZuID0gKHgpID0+IHg7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbiA9ICh4LCBfKSA9PiB4O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VNYXJzaGFsID0gKFxuY29udmVydFZhbFRvU2xvdCA9IGRlZmF1bHRWYWxUb1Nsb3RGbixcbmNvbnZlcnRTbG90VG9WYWwgPSBkZWZhdWx0U2xvdFRvVmFsRm4sXG57XG4gIGVycm9yVGFnZ2luZyA9ICdvbicsXG4gIG1hcnNoYWxOYW1lID0gJ2Fub24tbWFyc2hhbCcsXG4gIC8vXG4gIC8vXG4gIGVycm9ySWROdW0gPSAxMDAwMCxcbiAgLy9cbiAgLy9cbiAgbWFyc2hhbFNhdmVFcnJvciA9IChlcnIpID0+XG4gIGNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJywgZXJyKSxcbiAgLy9cbiAgLy9cbiAgc2VyaWFsaXplQm9keUZvcm1hdCA9ICdjYXBkYXRhJ1xufSA9IHt9KSA9Plxue1xuICBhc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCAnc3RyaW5nJyk7XG4gIGVycm9yVGFnZ2luZyA9PT0gJ29uJyB8fFxuICBlcnJvclRhZ2dpbmcgPT09ICdvZmYnIHx8XG4gIEZhaWxgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbiAgY29uc3QgbmV4dEVycm9ySWQgPSAoKSA9PiB7XG4gICAgZXJyb3JJZE51bSArPSAxO1xuICAgIHJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gIH07XG5cbiAgLypcbiAgICAqL1xuXG4gIGNvbnN0IHRvQ2FwRGF0YSA9IChyb290KSA9PiB7XG4gICAgY29uc3Qgc2xvdHMgPSBbXTtcbiAgICAvL1xuICAgIGNvbnN0IHNsb3RNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICAvKlxuICAgICAgICovXG5cblxuICAgIGNvbnN0IGVuY29kZVNsb3RDb21tb24gPSAocGFzc2FibGUpID0+IHtcbiAgICAgIGxldCBpbmRleCA9IHNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGluZGV4LCByZXBlYXQ6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIGluZGV4ID0gc2xvdHMubGVuZ3RoO1xuICAgICAgY29uc3Qgc2xvdCA9IGNvbnZlcnRWYWxUb1Nsb3QocGFzc2FibGUpO1xuICAgICAgc2xvdHMucHVzaChzbG90KTtcbiAgICAgIHNsb3RNYXAuc2V0KHBhc3NhYmxlLCBpbmRleCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgaW5kZXgsIHJlcGVhdDogZmFsc2UgfSk7XG4gICAgfTtcblxuICAgIC8qXG4gICAgXG4gICAgICAgICovXG5cblxuXG5cblxuXG5cbiAgICBjb25zdCBlbmNvZGVFcnJvckNvbW1vbiA9IChlcnIsIGVuY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZW5jb2RlUmVjdXIoYCR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICBhc3NlcnQudHlwZW9mKG1lc3NhZ2UsICdzdHJpbmcnKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbmNvZGVSZWN1cihgJHtlcnIubmFtZX1gKTtcbiAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKGVycm9yVGFnZ2luZyA9PT0gJ29uJykge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBlcnJvcklkID0gZW5jb2RlUmVjdXIobmV4dEVycm9ySWQoKSk7XG4gICAgICAgIGFzc2VydC50eXBlb2YoZXJyb3JJZCwgJ3N0cmluZycpO1xuICAgICAgICBhbm5vdGF0ZUVycm9yKGVyciwgWGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbiAgICAgICAgbWFyc2hhbFNhdmVFcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgZXJyb3JJZCwgbWVzc2FnZSwgbmFtZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBtZXNzYWdlLCBuYW1lIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoc2VyaWFsaXplQm9keUZvcm1hdCA9PT0gJ2NhcGRhdGEnKSB7XG4gICAgICAvKlxuICAgICAgICAgICovXG5cblxuXG4gICAgICBjb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhID0gKHBhc3NhYmxlLCBpZmFjZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCByZXBlYXQgfSA9IGVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4gICAgICAgIGlmIChyZXBlYXQgPT09IHRydWUgfHwgaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ3Nsb3QnLCBpbmRleCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdzbG90JywgaWZhY2UsIGluZGV4IH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9ICh2YWwsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgIGVuY29kZVNsb3RUb0NhcERhdGEodmFsLCBnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IChwcm9taXNlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICBlbmNvZGVTbG90VG9DYXBEYXRhKHByb21pc2UpO1xuXG4gICAgICAvKlxuICAgICAgXG4gICAgICAgICovXG5cblxuXG5cblxuXG5cbiAgICAgIGNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgICAgY29uc3QgZXJyRGF0YSA9IGVuY29kZUVycm9yQ29tbW9uKGVyciwgZW5jb2RlUmVjdXIpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdlcnJvcicsIC4uLmVyckRhdGEgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNvZGVUb0NhcERhdGEgPSBtYWtlRW5jb2RlVG9DYXBEYXRhKHtcbiAgICAgICAgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuICAgICAgICBlbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuICAgICAgICBlbmNvZGVFcnJvclRvQ2FwRGF0YVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUb0NhcERhdGEocm9vdCk7XG4gICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgc2xvdHNcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplQm9keUZvcm1hdCA9PT0gJ3NtYWxsY2FwcycpIHtcbiAgICAgIC8qXG4gICAgICAgICAgICovXG5cblxuXG5cbiAgICAgIGNvbnN0IGVuY29kZVNsb3RUb1NtYWxsY2FwcyA9IChwcmVmaXgsIHBhc3NhYmxlLCBpZmFjZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCByZXBlYXQgfSA9IGVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChyZXBlYXQgPT09IHRydWUgfHwgaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSAocmVtb3RhYmxlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICBlbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLCByZW1vdGFibGUsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSkpO1xuXG4gICAgICBjb25zdCBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSAocHJvbWlzZSwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJywgcHJvbWlzZSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgICBjb25zdCBlcnJEYXRhID0gZW5jb2RlRXJyb3JDb21tb24oZXJyLCBlbmNvZGVSZWN1cik7XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4ucmVzdCB9ID0gZXJyRGF0YTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7ICcjZXJyb3InOiBtZXNzYWdlLCAuLi5yZXN0IH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlVG9TbWFsbGNhcHMgPSBtYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuICAgICAgICBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbiAgICAgICAgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVRvU21hbGxjYXBzKHJvb3QpO1xuICAgICAgY29uc3Qgc21hbGxjYXBzQm9keSA9IEpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGJvZHk6IGAjJHtzbWFsbGNhcHNCb2R5fWAsXG4gICAgICAgIHNsb3RzXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlRnVsbFJldml2ZSA9IChzbG90cykgPT4ge1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgdmFsTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgLypcbiAgICAgICAqL1xuXG5cbiAgICBjb25zdCBkZWNvZGVTbG90Q29tbW9uID0gKHNsb3REYXRhKSA9PiB7XG4gICAgICBjb25zdCB7IGlmYWNlID0gdW5kZWZpbmVkLCBpbmRleCwgLi4ucmVzdCB9ID0gc2xvdERhdGE7XG4gICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGB1bmV4cGVjdGVkIGVuY29kZWQgc2xvdCBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuICAgICAgY29uc3QgZXh0YW50ID0gdmFsTWFwLmdldChpbmRleCk7XG4gICAgICBpZiAoZXh0YW50KSB7XG4gICAgICAgIHJldHVybiBleHRhbnQ7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHNsb3QgPSBzbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuICAgICAgY29uc3QgdmFsID0gY29udmVydFNsb3RUb1ZhbChzbG90LCBpZmFjZSk7XG4gICAgICB2YWxNYXAuc2V0KGluZGV4LCB2YWwpO1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9O1xuXG4gICAgLypcbiAgICBcbiAgICAgICAgICovXG5cblxuXG5cblxuXG5cblxuICAgIGNvbnN0IGRlY29kZUVycm9yQ29tbW9uID0gKGVyckRhdGEsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGVycm9ySWQgPSB1bmRlZmluZWQsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNhdXNlID0gdW5kZWZpbmVkLFxuICAgICAgICBlcnJvcnMgPSB1bmRlZmluZWQsXG4gICAgICAgIC4uLnJlc3RcbiAgICAgIH0gPSBlcnJEYXRhO1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGROYW1lID0gZGVjb2RlUmVjdXIobmFtZSk7XG4gICAgICBjb25zdCBkTWVzc2FnZSA9IGRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGRFcnJvcklkID0gLyogICAgICAgICAgICAgICAgICovKGVycm9ySWQgJiYgZGVjb2RlUmVjdXIoZXJyb3JJZCkpO1xuICAgICAgaWYgKHR5cGVvZiBkTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRNZXNzYWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSkgfHwgRXJyb3I7XG4gICAgICBjb25zdCBlcnJvck5hbWUgPVxuICAgICAgZEVycm9ySWQgPT09IHVuZGVmaW5lZCA/XG4gICAgICBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfWAgOlxuICAgICAgYFJlbW90ZSR7ZXJyQ29uc3RydWN0b3IubmFtZX0oJHtkRXJyb3JJZH0pYDtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGVycm9yTmFtZSxcbiAgICAgICAgc2FuaXRpemU6IGZhbHNlXG4gICAgICB9O1xuICAgICAgaWYgKGNhdXNlKSB7XG4gICAgICAgIG9wdGlvbnMuY2F1c2UgPSBkZWNvZGVSZWN1cihjYXVzZSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgIG9wdGlvbnMuZXJyb3JzID0gZGVjb2RlUmVjdXIoZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhd0Vycm9yID0gbWFrZUVycm9yKGRNZXNzYWdlLCBlcnJDb25zdHJ1Y3Rvciwgb3B0aW9ucyk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgZGVzY3MgPSBvYmplY3RNYXAocmVzdCwgKGRhdGEpID0+ICh7XG4gICAgICAgIHZhbHVlOiBkZWNvZGVSZWN1cihkYXRhKSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZVxuICAgICAgfSkpO1xuICAgICAgZGVmaW5lUHJvcGVydGllcyhyYXdFcnJvciwgZGVzY3MpO1xuICAgICAgaGFyZGVuKHJhd0Vycm9yKTtcbiAgICAgIHJldHVybiB0b1Bhc3NhYmxlRXJyb3IocmF3RXJyb3IpO1xuICAgIH07XG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEgPSAocmF3VHJlZSwgX2RlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7IFtRQ0xBU1NdOiBfLCAuLi5zbG90RGF0YSB9ID0gcmF3VHJlZTtcbiAgICAgIHJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IChyYXdUcmVlLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyBbUUNMQVNTXTogXywgLi4uZXJyRGF0YSB9ID0gcmF3VHJlZTtcbiAgICAgIHJldHVybiBkZWNvZGVFcnJvckNvbW1vbihlcnJEYXRhLCBkZWNvZGVSZWN1cik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldml2ZUZyb21DYXBEYXRhID0gbWFrZURlY29kZUZyb21DYXBEYXRhKHtcbiAgICAgIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhOiBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICAgIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTogZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgICBkZWNvZGVFcnJvckZyb21DYXBEYXRhXG4gICAgfSk7XG5cbiAgICBjb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMgPSAocHJlZml4KSA9PiB7XG4gICAgICAvKlxuICAgICAgICAgICovXG5cblxuXG4gICAgICByZXR1cm4gKHN0cmluZ0VuY29kaW5nLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KHN0cmluZ0VuY29kaW5nLmNoYXJBdCgwKSA9PT0gcHJlZml4KTtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgaSA9IHN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoc3RyaW5nRW5jb2Rpbmcuc2xpY2UoMSwgaSA8IDAgPyB1bmRlZmluZWQgOiBpKSk7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGlmYWNlID0gaSA8IDAgPyB1bmRlZmluZWQgOiBzdHJpbmdFbmNvZGluZy5zbGljZShpICsgMSk7XG4gICAgICAgIHJldHVybiBkZWNvZGVTbG90Q29tbW9uKHsgaWZhY2UsIGluZGV4IH0pO1xuICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbiAgICBjb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG4gICAgY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gKGVuY29kaW5nLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyAnI2Vycm9yJzogbWVzc2FnZSwgLi4ucmVzdEVyckRhdGEgfSA9IGVuY29kaW5nO1xuICAgICAgIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsICdtZXNzYWdlJykgfHxcbiAgICAgIEZhaWxgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG4gICAgICByZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oeyBtZXNzYWdlLCAuLi5yZXN0RXJyRGF0YSB9LCBkZWNvZGVSZWN1cik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyh7XG4gICAgICAvL1xuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbiAgICAgIC8vXG4gICAgICBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbiAgICAgIGRlY29kZUVycm9yRnJvbVNtYWxsY2Fwc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhhcmRlbih7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0pO1xuICB9O1xuXG4gIC8qXG4gICAgKi9cblxuICBjb25zdCBmcm9tQ2FwRGF0YSA9IChkYXRhKSA9PiB7XG4gICAgY29uc3QgeyBib2R5LCBzbG90cyB9ID0gZGF0YTtcbiAgICB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5ib2R5IGlzICR7Ym9keX0sIG5vdCBzdHJpbmcpYDtcbiAgICBpc0FycmF5KGRhdGEuc2xvdHMpIHx8XG4gICAgRmFpbGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguc2xvdHMgYXJlIG5vdCBBcnJheSlgO1xuICAgIGNvbnN0IHsgcmV2aXZlRnJvbUNhcERhdGEsIHJldml2ZUZyb21TbWFsbGNhcHMgfSA9IG1ha2VGdWxsUmV2aXZlKHNsb3RzKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIC8vXG4gICAgaWYgKGJvZHkuY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgIGNvbnN0IHNtYWxsY2Fwc0JvZHkgPSBib2R5LnNsaWNlKDEpO1xuICAgICAgY29uc3QgZW5jb2RpbmcgPSBoYXJkZW4oSlNPTi5wYXJzZShzbWFsbGNhcHNCb2R5KSk7XG4gICAgICByZXN1bHQgPSBoYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByYXdUcmVlID0gaGFyZGVuKEpTT04ucGFyc2UoYm9keSkpO1xuICAgICAgcmVzdWx0ID0gaGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiAgICB9XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgYXNzZXJ0UGFzc2FibGUocmVzdWx0KTtcbiAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgKi8ocmVzdWx0KTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICB0b0NhcERhdGEsXG4gICAgZnJvbUNhcERhdGEsXG5cbiAgICAvL1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgc2VyaWFsaXplOiB0b0NhcERhdGEsXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHVuc2VyaWFsaXplOiBmcm9tQ2FwRGF0YVxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEjU06mpLgAAqS4AACUAAABAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCIuL2VuY29kZVBhc3NhYmxlLmpzIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidHJpdmlhbENvbXBhcmF0b3IiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLEZhaWwscSxwYXNzU3R5bGVQcmVmaXhlcyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicGFzc1N0eWxlUHJlZml4ZXNcIixbJGjNj19hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IHsgZW50cmllcywgZnJvbUVudHJpZXMsIHNldFByb3RvdHlwZU9mLCBpcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvID0gKHgsIHkpID0+IHggPT09IHkgfHwgaXMoeCwgeSk7XG5cbmNvbnN0IHRyaXZpYWxDb21wYXJhdG9yID0gKGxlZnQsIHJpZ2h0KSA9PlxuLy9cbmxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA9PT0gcmlnaHQgPyAwIDogMTtcblxuLypcblxuICovJGjNj19vbmNlLnRyaXZpYWxDb21wYXJhdG9yKHRyaXZpYWxDb21wYXJhdG9yKTtcblxuY29uc3QgcGFzc1N0eWxlUmFua3MgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyhcbmZyb21FbnRyaWVzKFxuICBlbnRyaWVzKHBhc3NTdHlsZVByZWZpeGVzKVxuICAvL1xuICAuc29ydCgoW19sZWZ0U3R5bGUsIGxlZnRQcmVmaXhlc10sIFtfcmlnaHRTdHlsZSwgcmlnaHRQcmVmaXhlc10pID0+IHtcbiAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLCByaWdodFByZWZpeGVzKTtcbiAgfSkuXG4gIG1hcCgoW3Bhc3NTdHlsZSwgcHJlZml4ZXNdLCBpbmRleCkgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHByZWZpeGVzID09PSBbLi4ucHJlZml4ZXNdLnNvcnQoKS5qb2luKCcnKSB8fFxuICAgIEZhaWxgdW5zb3J0ZWQgcHJlZml4ZXMgZm9yIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7cShwcmVmaXhlcyl9YDtcbiAgICBjb25zdCBjb3ZlciA9IFtcbiAgICBwcmVmaXhlcy5jaGFyQXQoMCksXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShwcmVmaXhlcy5jaGFyQ29kZUF0KHByZWZpeGVzLmxlbmd0aCAtIDEpICsgMSldO1xuXG4gICAgcmV0dXJuIFtwYXNzU3R5bGUsIHsgaW5kZXgsIGNvdmVyIH1dO1xuICB9KVxuKVxuKTtcbnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVJhbmtzLCBudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGdldFBhc3NTdHlsZUNvdmVyID0gKHBhc3NTdHlsZSkgPT4gcGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaM2PX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLypcblxuICovXG5jb25zdCBtZW1vT2ZTb3J0ZWQgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VDb21wYXJhdG9yS2l0ID0gKGNvbXBhcmVSZW1vdGFibGVzID0gKF94LCBfeSkgPT4gTmFOKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNvbXBhcmF0b3IgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgICBpZiAoc2FtZVZhbHVlWmVybyhsZWZ0LCByaWdodCkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0U3R5bGUgPSBwYXNzU3R5bGVPZihsZWZ0KTtcbiAgICBjb25zdCByaWdodFN0eWxlID0gcGFzc1N0eWxlT2YocmlnaHQpO1xuICAgIGlmIChsZWZ0U3R5bGUgIT09IHJpZ2h0U3R5bGUpIHtcbiAgICAgIHJldHVybiB0cml2aWFsQ29tcGFyYXRvcihcbiAgICAgICAgcGFzc1N0eWxlUmFua3NbbGVmdFN0eWxlXS5pbmRleCxcbiAgICAgICAgcGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXhcbiAgICAgICk7XG4gICAgfVxuICAgIC8qXG4gICAgICAqL1xuXG4gICAgc3dpdGNoIChsZWZ0U3R5bGUpIHtcbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6e1xuICAgICAgICAgIHJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIGNhc2UgJ3Byb21pc2UnOntcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6e1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBpZiAobGVmdCA8IHJpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydChsZWZ0ID4gcmlnaHQpO1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOntcbiAgICAgICAgICByZXR1cm4gY29tcGFyYXRvcihcbiAgICAgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbiAgICAgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOntcbiAgICAgICAgICAvL1xuICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obGVmdCkpIHtcbiAgICAgICAgICAgIGFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKE51bWJlci5pc05hTihyaWdodCkpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGlmIChsZWZ0IDwgcmlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0KGxlZnQgPiByaWdodCk7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOntcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgbGVmdE5hbWVzID0gcmVjb3JkTmFtZXMobGVmdCk7XG4gICAgICAgICAgY29uc3QgcmlnaHROYW1lcyA9IHJlY29yZE5hbWVzKHJpZ2h0KTtcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdE5hbWVzLCByaWdodE5hbWVzKTtcbiAgICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBsZWZ0VmFsdWVzID0gcmVjb3JkVmFsdWVzKGxlZnQsIGxlZnROYW1lcyk7XG4gICAgICAgICAgY29uc3QgcmlnaHRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMocmlnaHQsIHJpZ2h0TmFtZXMpO1xuICAgICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnRWYWx1ZXMsIHJpZ2h0VmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzp7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJhdG9yKGxlZnRbaV0sIHJpZ2h0W2ldKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOntcbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IGxhYmVsQ29tcCA9IGNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLCBnZXRUYWcocmlnaHQpKTtcbiAgICAgICAgICBpZiAobGFiZWxDb21wICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbGFiZWxDb21wO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQsIHJpZ2h0LnBheWxvYWQpO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OntcbiAgICAgICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyogICAgICAgICAgICAgICAqL1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG91dGVyQ29tcGFyYXRvciA9ICh4LCB5KSA9PlxuICAvL1xuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovKGNvbXBhcmF0b3IoeCwgeSkgfHwgMCk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYW50aUNvbXBhcmF0b3IgPSAoeCwgeSkgPT4gb3V0ZXJDb21wYXJhdG9yKHksIHgpO1xuXG4gIG1lbW9PZlNvcnRlZC5zZXQob3V0ZXJDb21wYXJhdG9yLCBuZXcgV2Vha1NldCgpKTtcbiAgbWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvciwgbmV3IFdlYWtTZXQoKSk7XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KG91dGVyQ29tcGFyYXRvciwgYW50aUNvbXBhcmF0b3IpO1xuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvciwgb3V0ZXJDb21wYXJhdG9yKTtcblxuICByZXR1cm4gaGFyZGVuKHsgY29tcGFyYXRvcjogb3V0ZXJDb21wYXJhdG9yLCBhbnRpQ29tcGFyYXRvciB9KTtcbn07XG4vKlxuXG5cbiAqLyRozY9fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG5jb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2UgPSAoY29tcGFyYXRvcikgPT5cbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuY29uc3QgaXNSYW5rU29ydGVkID0gKHBhc3NhYmxlcywgY29tcGFyZSkgPT4ge1xuICBjb25zdCBzdWJNZW1vT2ZTb3J0ZWQgPSBtZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuICBhc3NlcnQoc3ViTWVtb09mU29ydGVkICE9PSB1bmRlZmluZWQpO1xuICBpZiAoc3ViTWVtb09mU29ydGVkLmhhcyhwYXNzYWJsZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcykgPT09ICdjb3B5QXJyYXknKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYXNzYWJsZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoY29tcGFyZShwYXNzYWJsZXNbaSAtIDFdLCBwYXNzYWJsZXNbaV0pID49IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3ViTWVtb09mU29ydGVkLmFkZChwYXNzYWJsZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn07JGjNj19vbmNlLmlzUmFua1NvcnRlZChpc1JhbmtTb3J0ZWQpO1xuaGFyZGVuKGlzUmFua1NvcnRlZCk7XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRSYW5rU29ydGVkID0gKHNvcnRlZCwgY29tcGFyZSkgPT5cbmlzUmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpIHx8XG4vL1xuLy9cbkZhaWxgTXVzdCBiZSByYW5rIHNvcnRlZDogJHtzb3J0ZWR9IHZzICR7c29ydEJ5UmFuayhzb3J0ZWQsIGNvbXBhcmUpfWA7JGjNj19vbmNlLmFzc2VydFJhbmtTb3J0ZWQoYXNzZXJ0UmFua1NvcnRlZCk7XG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3Qgc29ydEJ5UmFuayA9IChwYXNzYWJsZXMsIGNvbXBhcmUpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSkge1xuICAgIGhhcmRlbihwYXNzYWJsZXMpO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGlmIChpc1JhbmtTb3J0ZWQocGFzc2FibGVzLCBjb21wYXJlKSkge1xuICAgICAgcmV0dXJuIHBhc3NhYmxlcztcbiAgICB9XG4gIH1cbiAgY29uc3QgdW5zb3J0ZWQgPSBbLi4ucGFzc2FibGVzXTtcbiAgdW5zb3J0ZWQuZm9yRWFjaChoYXJkZW4pO1xuICBjb25zdCBzb3J0ZWQgPSB1bnNvcnRlZC5zb3J0KGNvbXBhcmUpO1xuICAvL1xuICAvL1xuICAvL1xuICBpZiAoY29tcGFyZSh0cnVlLCB1bmRlZmluZWQpID4gMCkge1xuICAgIGxldCBpID0gc29ydGVkLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKGkgPj0gMCAmJiBzb3J0ZWRbaV0gPT09IHVuZGVmaW5lZCkgaSAtPSAxO1xuICAgIGNvbnN0IG4gPSBzb3J0ZWQubGVuZ3RoIC0gaSAtIDE7XG4gICAgaWYgKG4gPiAwICYmIG4gPCBzb3J0ZWQubGVuZ3RoKSB7XG4gICAgICBzb3J0ZWQuY29weVdpdGhpbihuLCAwKTtcbiAgICAgIHNvcnRlZC5maWxsKCAvKiAgICAgICAgICAgICovKHVuZGVmaW5lZCksIDAsIG4pO1xuICAgIH1cbiAgfVxuICBoYXJkZW4oc29ydGVkKTtcbiAgY29uc3Qgc3ViTWVtb09mU29ydGVkID0gbWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbiAgYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCAhPT0gdW5kZWZpbmVkKTtcbiAgc3ViTWVtb09mU29ydGVkLmFkZChzb3J0ZWQpO1xuICByZXR1cm4gc29ydGVkO1xufTskaM2PX29uY2Uuc29ydEJ5UmFuayhzb3J0QnlSYW5rKTtcbmhhcmRlbihzb3J0QnlSYW5rKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHJhbmtTZWFyY2ggPSAoc29ydGVkLCBjb21wYXJlLCBrZXksIGJpYXMgPSAnbGVmdE1vc3QnKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgbGV0IGxlZnQgPSAwO1xuICBsZXQgcmlnaHQgPSBzb3J0ZWQubGVuZ3RoO1xuICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7XG4gICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcbiAgICBjb25zdCBjb21wID0gY29tcGFyZShzb3J0ZWRbbV0sIGtleSk7XG4gICAgaWYgKGNvbXAgPD0gLTEgfHwgKGNvbXAgPT09IDAgJiYgYmlhcyA9PT0gJ3JpZ2h0TW9zdCcpKSB7XG4gICAgICBsZWZ0ID0gbSArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChjb21wID49IDEgfHwgKGNvbXAgPT09IDAgJiYgYmlhcyA9PT0gJ2xlZnRNb3N0JykpO1xuICAgICAgcmlnaHQgPSBtO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYmlhcyA9PT0gJ2xlZnRNb3N0JyA/IGxlZnQgOiByaWdodCAtIDE7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGdldEluZGV4Q292ZXIgPSAoc29ydGVkLCBjb21wYXJlLCBbbGVmdEtleSwgcmlnaHRLZXldKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgY29uc3QgbGVmdEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIGxlZnRLZXksICdsZWZ0TW9zdCcpO1xuICBjb25zdCByaWdodEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIHJpZ2h0S2V5LCAncmlnaHRNb3N0Jyk7XG4gIHJldHVybiBbbGVmdEluZGV4LCByaWdodEluZGV4XTtcbn07JGjNj19vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgRnVsbFJhbmtDb3ZlciA9IGhhcmRlbihbJycsICd7J10pO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG5jb25zdCBjb3ZlcmVkRW50cmllcyA9IChzb3J0ZWQsIFtsZWZ0SW5kZXgsIHJpZ2h0SW5kZXhdKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaXRlcmFibGUgPSBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBsZXQgaSA9IGxlZnRJbmRleDtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKGkgPD0gcmlnaHRJbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHNvcnRlZFtpXTtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyB2YWx1ZTogW2ksIGVsZW1lbnRdLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gaXRlcmFibGU7XG59OyRozY9fb25jZS5jb3ZlcmVkRW50cmllcyhjb3ZlcmVkRW50cmllcyk7XG5oYXJkZW4oY292ZXJlZEVudHJpZXMpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWF4UmFuayA9IChjb21wYXJlLCBhLCBiKSA9PiAoY29tcGFyZShhLCBiKSA+PSAwID8gYSA6IGIpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWluUmFuayA9IChjb21wYXJlLCBhLCBiKSA9PiAoY29tcGFyZShhLCBiKSA8PSAwID8gYSA6IGIpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCB1bmlvblJhbmtDb3ZlcnMgPSAoY29tcGFyZSwgY292ZXJzKSA9PiB7XG4gIC8qXG4gIFxuICAgKi9cblxuXG4gIGNvbnN0IHVuaW9uUmFua0NvdmVyUGFpciA9IChbbGVmdEEsIHJpZ2h0QV0sIFtsZWZ0QiwgcmlnaHRCXSkgPT4gW1xuICBtaW5SYW5rKGNvbXBhcmUsIGxlZnRBLCBsZWZ0QiksXG4gIG1heFJhbmsoY29tcGFyZSwgcmlnaHRBLCByaWdodEIpXTtcblxuICByZXR1cm4gY292ZXJzLnJlZHVjZSh1bmlvblJhbmtDb3ZlclBhaXIsIFsneycsICcnXSk7XG59OyRozY9fb25jZS51bmlvblJhbmtDb3ZlcnModW5pb25SYW5rQ292ZXJzKTtcbmhhcmRlbih1bmlvblJhbmtDb3ZlcnMpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJzID0gKGNvbXBhcmUsIGNvdmVycykgPT4ge1xuICAvKlxuICBcbiAgICovXG5cblxuICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyID0gKFtsZWZ0QSwgcmlnaHRBXSwgW2xlZnRCLCByaWdodEJdKSA9PiBbXG4gIG1heFJhbmsoY29tcGFyZSwgbGVmdEEsIGxlZnRCKSxcbiAgbWluUmFuayhjb21wYXJlLCByaWdodEEsIHJpZ2h0QildO1xuXG4gIHJldHVybiBjb3ZlcnMucmVkdWNlKGludGVyc2VjdFJhbmtDb3ZlclBhaXIsIFsnJywgJ3snXSk7XG59OyRozY9fb25jZS5pbnRlcnNlY3RSYW5rQ292ZXJzKGludGVyc2VjdFJhbmtDb3ZlcnMpO1xuXG5jb25zdCB7IGNvbXBhcmF0b3I6IGNvbXBhcmVSYW5rLCBhbnRpQ29tcGFyYXRvcjogY29tcGFyZUFudGlSYW5rIH0gPVxubWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5jb21wYXJlUmFuayhjb21wYXJlUmFuayk7JGjNj19vbmNlLmNvbXBhcmVBbnRpUmFuayhjb21wYXJlQW50aVJhbmspO1xuY29uc3QgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAobG9uZ0xpdmVkID0gZmFsc2UpID0+IHtcbiAgbGV0IG51bVNlZW4gPSAwO1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBNYXBDb25zdHJ1Y3RvciA9IGxvbmdMaXZlZCA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbnN0IHNlZW4gPSBuZXcgTWFwQ29uc3RydWN0b3IoKTtcbiAgY29uc3QgdGFnID0gKHIpID0+IHtcbiAgICBpZiAoc2Vlbi5oYXMocikpIHtcbiAgICAgIHJldHVybiBzZWVuLmdldChyKTtcbiAgICB9XG4gICAgbnVtU2VlbiArPSAxO1xuICAgIHNlZW4uc2V0KHIsIG51bVNlZW4pO1xuICAgIHJldHVybiBudW1TZWVuO1xuICB9O1xuICBjb25zdCBjb21wYXJlUmVtb3RhYmxlcyA9ICh4LCB5KSA9PiBjb21wYXJlUmFuayh0YWcoeCksIHRhZyh5KSk7XG4gIHJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG59OyRozY9fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJpdmlhbENvbXBhcmF0b3IiOlsidHJpdmlhbENvbXBhcmF0b3IiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAABAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8F2+IcoFAADKBQAAHgAAAEBlbmRvL25hdC12NS4wLjE0L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzTmF0LCduYW1lJyx7dmFsdWU6XCJpc05hdFwifSk7JGjNj19vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCduYW1lJyx7dmFsdWU6XCJOYXRcIn0pOyRozY9fb25jZS5OYXQoTmF0KTsvL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSkge1xuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIGFsbGVnZWROdW0gPj0gMDtcbiAgfVxuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pICYmIGFsbGVnZWROdW0gPj0gMDtcbn1cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKSB7XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ2JpZ2ludCcpIHtcbiAgICBpZiAoYWxsZWdlZE51bSA8IDApIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbGVnZWROdW07XG4gIH1cblxuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSkge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtcbiAgICB9XG4gICAgaWYgKGFsbGVnZWROdW0gPCAwKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gICAgfVxuICAgIHJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gIH1cblxuICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmBcbiAgKTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzTmF0IjpbImlzTmF0Il0sIk5hdCI6WyJOYXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAvR2ak0KAABNCgAAIAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvZXJyb3IuanMiLCIuL3NyYy9yZW1vdGFibGUuanMiLCIuL3NyYy9zeW1ib2wuanMiLCIuL3NyYy9zdHJpbmcuanMiLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhciIsIkZhciIsImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiLCJpc09iamVjdCIsImlzT2JqZWN0IiwiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2l0ZXItaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL2Vycm9yLmpzXCIsIFtdXSxbXCIuL3NyYy9yZW1vdGFibGUuanNcIiwgW11dLFtcIi4vc3JjL3N5bWJvbC5qc1wiLCBbXV0sW1wiLi9zcmMvc3RyaW5nLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOltbIm1hcEl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSxbImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiXV0sIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjpbWyJQQVNTX1NUWUxFIiwiUEFTU19TVFlMRSJdLFsiaXNPYmplY3QiLCJpc09iamVjdCJdLFsiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENoZWNrZXIiXSxbImdldFRhZyIsImdldFRhZyJdLFsiaGFzT3duUHJvcGVydHlPZiIsImhhc093blByb3BlcnR5T2YiXV0sIi4vc3JjL2Vycm9yLmpzIjpbWyJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLFsiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSJdXSwiLi9zcmMvcmVtb3RhYmxlLmpzIjpbWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl1dLCIuL3NyYy9zeW1ib2wuanMiOltbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSxbImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIl0sWyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSxbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdXSwiLi9zcmMvc3RyaW5nLmpzIjpbWyJpc1dlbGxGb3JtZWRTdHJpbmciLCJpc1dlbGxGb3JtZWRTdHJpbmciXSxbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRQYXNzYWJsZVN0cmluZyIsImFzc2VydFBhc3NhYmxlU3RyaW5nIl1dLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6W1sicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdLFsiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiXSxbImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGUiXSxbInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciJdLFsidG9UaHJvd2FibGUiLCJ0b1Rocm93YWJsZSJdXSwiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6W1sibWFrZVRhZ2dlZCIsIm1ha2VUYWdnZWQiXV0sIi4vc3JjL21ha2UtZmFyLmpzIjpbWyJSZW1vdGFibGUiLCJSZW1vdGFibGUiXSxbIkZhciIsIkZhciJdLFsiVG9GYXJGdW5jdGlvbiIsIlRvRmFyRnVuY3Rpb24iXSxbIkdFVF9NRVRIT0RfTkFNRVMiLCJHRVRfTUVUSE9EX05BTUVTIl1dLCIuL3NyYy90eXBlR3VhcmRzLmpzIjpbWyJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZWNvcmQiXSxbImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSJdLFsiYXNzZXJ0UmVtb3RhYmxlIiwiYXNzZXJ0UmVtb3RhYmxlIl0sWyJpc1JlbW90YWJsZSIsImlzUmVtb3RhYmxlIl0sWyJpc1JlY29yZCIsImlzUmVjb3JkIl0sWyJpc0NvcHlBcnJheSIsImlzQ29weUFycmF5Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADFJpDt8AYAAPAGAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxhc3NlcnRDaGVja2VyLGdldE93bkRhdGFEZXNjcmlwdG9yOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGdldFByb3RvdHlwZU9mIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXksIHByb3RvdHlwZTogYXJyYXlQcm90b3R5cGUgfSA9IEFycmF5O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjYW5CZVZhbGlkID0gKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG5pc0FycmF5KGNhbmRpZGF0ZSkgfHxcbighIWNoZWNrICYmIGNoZWNrKGZhbHNlLCBYYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSk7XG5cbi8qXG5cblxuICovXG5jb25zdCBDb3B5QXJyYXlIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdjb3B5QXJyYXknLFxuXG4gIGNhbkJlVmFsaWQsXG5cbiAgYXNzZXJ0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBjYW5CZVZhbGlkKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlcik7XG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gYXJyYXlQcm90b3R5cGUgfHxcbiAgICBhc3NlcnQuZmFpbChYYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCwgVHlwZUVycm9yKTtcbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgbGVuID0gLyogICAgICAgICAgICAgICAgICovKFxuICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgJ2xlbmd0aCcsIGZhbHNlLCBhc3NlcnRDaGVja2VyKS52YWx1ZVxuICAgICk7XG4gICAgLy9cbiAgICAvL1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIoXG4gICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgaSwgdHJ1ZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICAgIC8vXG4gICAgb3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aCA9PT0gbGVuICsgMSB8fFxuICAgIGFzc2VydC5mYWlsKFhgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsIFR5cGVFcnJvcik7XG4gIH1cbn0pOyRozY9fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAckIJ/xIJAAASCQAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxnZXRPd25EYXRhRGVzY3JpcHRvcixDWDskaM2PX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImNhbkJlTWV0aG9kXCIsWyRozY9fYSA9PiAoY2FuQmVNZXRob2QgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNoZWNrT2JqZWN0UHJvdG90eXBlID0gKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIChcbiAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICghIWNoZWNrICYmXG4gIENYKGNoZWNrKWBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkID0gKGNhbmRpZGF0ZSwga2V5LCB2YWx1ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIChcbiAgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8XG4gICghIWNoZWNrICYmXG4gIENYKFxuICAgIGNoZWNrXG4gIClgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgKCFjYW5CZU1ldGhvZCh2YWx1ZSkgfHxcbiAgKCEhY2hlY2sgJiZcbiAgLy9cbiAgQ1goXG4gICAgY2hlY2tcbiAgKWBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKVxuICApO1xufTtcblxuLypcblxuXG4gKi9cbmNvbnN0IENvcHlSZWNvcmRIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdjb3B5UmVjb3JkJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgY2hlY2tPYmplY3RQcm90b3R5cGUoY2FuZGlkYXRlLCBjaGVjaykgJiZcbiAgICAvL1xuICAgIC8vXG4gICAgb3duS2V5cyhjYW5kaWRhdGUpLmV2ZXJ5KChrZXkpID0+XG4gICAgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQoY2FuZGlkYXRlLCBrZXksIGNhbmRpZGF0ZVtrZXldLCBjaGVjaylcbiAgICApXG4gICAgKTtcbiAgfSxcblxuICBhc3NlcnRWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIGNoZWNrT2JqZWN0UHJvdG90eXBlKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlcik7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSkge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gZ2V0T3duRGF0YURlc2NyaXB0b3IoXG4gICAgICAgIGNhbmRpZGF0ZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgYXNzZXJ0Q2hlY2tlclxuICAgICAgKTtcbiAgICAgIGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkKGNhbmRpZGF0ZSwgbmFtZSwgdmFsdWUsIGFzc2VydENoZWNrZXIpO1xuICAgICAgcGFzc1N0eWxlT2ZSZWN1cih2YWx1ZSk7XG4gICAgfVxuICB9XG59KTskaM2PX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD9CPPy1AsAANQLAAAuAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIi4vbWFrZVRhZ2dlZC5qcyJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgscSxFLGlzUHJvbWlzZSxnZXRUYWcsaXNPYmplY3QscGFzc1N0eWxlT2YsbWFrZVRhZ2dlZDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZGVlcGx5RnVsZmlsbGVkID0gYXN5bmMgKHZhbCkgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuXG4gIGlmICghaXNPYmplY3QodmFsKSkge1xuICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovKHZhbCk7XG4gIH1cbiAgaWYgKGlzUHJvbWlzZSh2YWwpKSB7XG4gICAgcmV0dXJuIEUud2hlbih2YWwsIChub25wKSA9PiBkZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuICB9XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgY2FzZSAnY29weVJlY29yZCc6e1xuICAgICAgICBjb25zdCByZWMgPSAvKiAgICAgICAgICAgICAgICAgICAgICovKHZhbCk7XG4gICAgICAgIGNvbnN0IG5hbWVzID0gLyogICAgICAgICAgICAgICAgICAgKi8ob3duS2V5cyhyZWMpKTtcbiAgICAgICAgY29uc3QgdmFsUHMgPSBuYW1lcy5tYXAoKG5hbWUpID0+IGRlZXBseUZ1bGZpbGxlZChyZWNbbmFtZV0pKTtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksICh2YWxzKSA9PlxuICAgICAgICBoYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsIGkpID0+IFtuYW1lc1tpXSwgY10pKSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOntcbiAgICAgICAgY29uc3QgYXJyID0gLyogICAgICAgICAgICAgICAgICAgICovKHZhbCk7XG4gICAgICAgIGNvbnN0IHZhbFBzID0gYXJyLm1hcCgocCkgPT4gZGVlcGx5RnVsZmlsbGVkKHApKTtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksICh2YWxzKSA9PiBoYXJkZW4odmFscykpO1xuICAgICAgfVxuICAgIGNhc2UgJ3RhZ2dlZCc6e1xuICAgICAgICBjb25zdCB0Z2QgPSAvKiAgICAgICAgICAgICAgICAgICAgICovKHZhbCk7XG4gICAgICAgIGNvbnN0IHRhZyA9IGdldFRhZyh0Z2QpO1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gRS53aGVuKGRlZXBseUZ1bGZpbGxlZCh0Z2QucGF5bG9hZCksIChwYXlsb2FkKSA9PlxuICAgICAgICBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICBjYXNlICdyZW1vdGFibGUnOntcbiAgICAgICAgY29uc3QgcmVtID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICovKHZhbCk7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiByZW07XG4gICAgICB9XG4gICAgY2FzZSAnZXJyb3InOntcbiAgICAgICAgY29uc3QgZXJyID0gLyogICAgICAgICAgICAgICAgKi8odmFsKTtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGVycjtcbiAgICAgIH1cbiAgICBjYXNlICdwcm9taXNlJzp7XG4gICAgICAgIGNvbnN0IHByb20gPSAvKiAgICAgICAgICAgICAgICAgICovKCAvKiAgICAgICAgICAgICAgICAgICovKHZhbCkpO1xuICAgICAgICByZXR1cm4gRS53aGVuKHByb20sIChub25wKSA9PiBkZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuICAgICAgfVxuICAgIGRlZmF1bHQ6e1xuICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChYYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsIFR5cGVFcnJvcik7XG4gICAgICB9XG4gIH1cbn07JGjNj19vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIdBwWNdFAAAXRQAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvZXJyb3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkVycm9ySGVscGVyIiwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyIsImdldEVycm9yQ29uc3RydWN0b3IiLCJpc0Vycm9yTGlrZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsYXNzZXJ0Q2hlY2tlcixDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IGdldFByb3RvdHlwZU9mLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBoYXNPd24sIGVudHJpZXMgfSA9IE9iamVjdDtcblxuLy9cbi8vXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycyA9IG5ldyBNYXAoXG4gIC8vXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAoW1xuICBbJ0Vycm9yJywgRXJyb3JdLFxuICBbJ0V2YWxFcnJvcicsIEV2YWxFcnJvcl0sXG4gIFsnUmFuZ2VFcnJvcicsIFJhbmdlRXJyb3JdLFxuICBbJ1JlZmVyZW5jZUVycm9yJywgUmVmZXJlbmNlRXJyb3JdLFxuICBbJ1N5bnRheEVycm9yJywgU3ludGF4RXJyb3JdLFxuICBbJ1R5cGVFcnJvcicsIFR5cGVFcnJvcl0sXG4gIFsnVVJJRXJyb3InLCBVUklFcnJvcl1cblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBdKVxuKTtcblxuaWYgKHR5cGVvZiBBZ2dyZWdhdGVFcnJvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy9cbiAgZXJyb3JDb25zdHJ1Y3RvcnMuc2V0KCdBZ2dyZWdhdGVFcnJvcicsIEFnZ3JlZ2F0ZUVycm9yKTtcbn1cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGdldEVycm9yQ29uc3RydWN0b3IgPSAobmFtZSkgPT4gZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRozY9fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8vXG4gIHJldHVybiAoXG4gIGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yIHx8XG4gICghIWNoZWNrICYmIENYKGNoZWNrKWBFcnJvciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YClcbiAgKTtcbn07XG5oYXJkZW4oY2hlY2tFcnJvckxpa2UpO1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBpc0Vycm9yTGlrZSA9IChjYW5kaWRhdGUpID0+IGNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjNj19vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9IChcbnByb3BOYW1lLFxuZGVzYyxcbnBhc3NTdHlsZU9mUmVjdXIsXG5jaGVjayA9IHVuZGVmaW5lZCkgPT5cbntcbiAgaWYgKGRlc2MuZW51bWVyYWJsZSkge1xuICAgIHJldHVybiAoXG4gICAgISFjaGVjayAmJlxuICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICBwcm9wTmFtZVxuICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlOiAke2Rlc2N9YFxuICAgICk7XG4gIH1cbiAgaWYgKCFoYXNPd24oZGVzYywgJ3ZhbHVlJykpIHtcbiAgICByZXR1cm4gKFxuICAgICEhY2hlY2sgJiZcbiAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgcHJvcE5hbWVcbiAgICApfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIGRhdGEgcHJvcGVydHk6ICR7ZGVzY31gXG4gICAgKTtcbiAgfVxuICBjb25zdCB7IHZhbHVlIH0gPSBkZXNjO1xuICBzd2l0Y2ggKHByb3BOYW1lKSB7XG4gICAgY2FzZSAnbWVzc2FnZSc6XG4gICAgY2FzZSAnc3RhY2snOntcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgIHByb3BOYW1lXG4gICAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3ZhbHVlfWApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgY2FzZSAnY2F1c2UnOntcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKHZhbHVlLCBwYXNzU3R5bGVPZlJlY3VyLCBjaGVjayk7XG4gICAgICB9XG4gICAgY2FzZSAnZXJyb3JzJzp7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgcGFzc1N0eWxlT2ZSZWN1cih2YWx1ZSkgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAhIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgICAgIHByb3BOYW1lXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7dmFsdWV9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlLmV2ZXJ5KChlcnIpID0+XG4gICAgICAgIC8vXG4gICAgICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVyciwgcGFzc1N0eWxlT2ZSZWN1ciwgY2hlY2spXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgZGVmYXVsdDp7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG4gIHJldHVybiAoXG4gICEhY2hlY2sgJiZcbiAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yIGhhcyBleHRyYSB1bnBhc3NlZCBwcm9wZXJ0eSAke3EocHJvcE5hbWUpfWBcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcbmhhcmRlbihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAoXG5jYW5kaWRhdGUsXG5wYXNzU3R5bGVPZlJlY3VyLFxuY2hlY2sgPSB1bmRlZmluZWQpID0+XG57XG4gIGlmICghY2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlLCBjaGVjaykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpO1xuICBjb25zdCB7IG5hbWUgfSA9IHByb3RvO1xuICBjb25zdCBlcnJDb25zdHJ1Y3RvciA9IGdldEVycm9yQ29uc3RydWN0b3IobmFtZSk7XG4gIGlmIChlcnJDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkIHx8IGVyckNvbnN0cnVjdG9yLnByb3RvdHlwZSAhPT0gcHJvdG8pIHtcbiAgICByZXR1cm4gKFxuICAgICEhY2hlY2sgJiZcbiAgICBDWChcbiAgICAgIGNoZWNrXG4gICAgKWBQYXNzYWJsZSBFcnJvciBtdXN0IGluaGVyaXQgZnJvbSBhbiBlcnJvciBjbGFzcyAucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gXG4gICAgKTtcbiAgfVxuICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgaWYgKCEoJ21lc3NhZ2UnIGluIGRlc2NzKSkge1xuICAgIHJldHVybiAoXG4gICAgISFjaGVjayAmJlxuICAgIENYKFxuICAgICAgY2hlY2tcbiAgICApYFBhc3NhYmxlIEVycm9yIG11c3QgaGF2ZSBhbiBvd24gXCJtZXNzYWdlXCIgc3RyaW5nIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzKGRlc2NzKS5ldmVyeSgoW3Byb3BOYW1lLCBkZXNjXSkgPT5cbiAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoXG4gICAgcHJvcE5hbWUsXG4gICAgZGVzYyxcbiAgICBwYXNzU3R5bGVPZlJlY3VyLFxuICAgIGNoZWNrXG4gIClcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKTtcbmhhcmRlbihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5cbi8qXG5cbiAqL1xuY29uc3QgRXJyb3JIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdlcnJvcicsXG5cbiAgY2FuQmVWYWxpZDogY2hlY2tFcnJvckxpa2UsXG5cbiAgYXNzZXJ0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+XG4gIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1ciwgYXNzZXJ0Q2hlY2tlcilcbn0pOyRozY9fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7/5qVFYGAABWBgAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYXBJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIGZ1bmMpID0+XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuRmFyKCdtYXBwZWQgaXRlcmFibGUnLCB7XG4gIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgY29uc3QgYmFzZUl0ZXJhdG9yID0gYmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICByZXR1cm4gRmFyKCdtYXBwZWQgaXRlcmF0b3InLCB7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWU6IGJhc2VWYWx1ZSwgZG9uZSB9ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkb25lID8gYmFzZVZhbHVlIDogZnVuYyhiYXNlVmFsdWUpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWUsIGRvbmUgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0pOyRozY9fb25jZS5tYXBJdGVyYWJsZShtYXBJdGVyYWJsZSk7XG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBmaWx0ZXJJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIHByZWQpID0+XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScsIHtcbiAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICBjb25zdCBiYXNlSXRlcmF0b3IgPSBiYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIHJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJywge1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSByZXN1bHQ7XG4gICAgICAgICAgaWYgKGRvbmUgfHwgcHJlZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0pOyRozY9fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoCAM4pgSAACYEgAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiR0VUX01FVEhPRF9OQU1FUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRNZXRob2ROYW1lcyxxLEZhaWwsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIixbJGjNj19hID0+IChhc3NlcnRJZmFjZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLFskaM2PX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgc2V0UHJvdG90eXBlT2YsXG4gIGNyZWF0ZSxcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlXG59ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VSZW1vdGFibGVQcm90byA9IChyZW1vdGFibGUsIGlmYWNlKSA9PiB7XG4gIGxldCBvbGRQcm90byA9IGdldFByb3RvdHlwZU9mKHJlbW90YWJsZSk7XG4gIGlmICh0eXBlb2YgcmVtb3RhYmxlID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChvbGRQcm90byA9PT0gbnVsbCkge1xuICAgICAgb2xkUHJvdG8gPSBvYmplY3RQcm90b3R5cGU7XG4gICAgfVxuICAgIG9sZFByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICBGYWlsYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByZW1vdGFibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvbGRQcm90byAhPT0gbnVsbCB8fFxuICAgIEZhaWxgT3JpZ2luYWwgZnVuY3Rpb24gbXVzdCBub3QgaW5oZXJpdCBmcm9tIG51bGw6ICR7cmVtb3RhYmxlfWA7XG4gICAgb2xkUHJvdG8gPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgZ2V0UHJvdG90eXBlT2Yob2xkUHJvdG8pID09PSBmdW5jdGlvblByb3RvdHlwZSB8fFxuICAgIEZhaWxgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFxuICAgIGNyZWF0ZShvbGRQcm90bywge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAncmVtb3RhYmxlJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IGlmYWNlIH1cbiAgICB9KVxuICApO1xufTtcblxuY29uc3QgYXNzZXJ0Q2FuQmVSZW1vdGFibGUgPSAoY2FuZGlkYXRlKSA9PlxuUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgUmVtb3RhYmxlID0gKFxuLy9cbmlmYWNlID0gJ1JlbW90YWJsZScsXG5wcm9wcyA9IHVuZGVmaW5lZCxcbnJlbW90YWJsZSA9IC8qICAgICAgICAgICAgKi8oe30pKSA9Plxue1xuICBhc3NlcnRJZmFjZShpZmFjZSk7XG4gIGFzc2VydChpZmFjZSk7XG4gIC8vXG4gIC8vXG4gIHByb3BzID09PSB1bmRlZmluZWQgfHwgRmFpbGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbiAgLy9cbiAgYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuICAvL1xuICAhKFBBU1NfU1RZTEUgaW4gcmVtb3RhYmxlKSB8fFxuICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG4gICAgcmVtb3RhYmxlW1BBU1NfU1RZTEVdXG4gICl9YDtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaGFyZGVuLmlzRmFrZSB8fFxuICAvL1xuICAhaXNGcm96ZW4ocmVtb3RhYmxlKSB8fFxuICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuICBjb25zdCByZW1vdGFibGVQcm90byA9IG1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsIGlmYWNlKTtcblxuICAvL1xuICAvL1xuICBjb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjayA9ICh0YXJnZXQpID0+IHtcbiAgICAvL1xuICAgIHNldFByb3RvdHlwZU9mKHRhcmdldCwgcmVtb3RhYmxlUHJvdG8pO1xuICAgIGhhcmRlbih0YXJnZXQpO1xuICAgIGFzc2VydENhbkJlUmVtb3RhYmxlKHRhcmdldCk7XG4gIH07XG5cbiAgLy9cbiAgbXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4gIC8vXG4gIG11dGF0ZUhhcmRlbkFuZENoZWNrKHJlbW90YWJsZSk7XG5cbiAgLy9cbiAgLy9cbiAgYXNzZXJ0KGlmYWNlICE9PSB1bmRlZmluZWQpOyAvL1xuICByZXR1cm4gLyogICAgICAgICAgICAgICovKHJlbW90YWJsZSk7XG59OyRozY9fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBHRVRfTUVUSE9EX05BTUVTID0gJ19fZ2V0TWV0aG9kTmFtZXNfXyc7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5HRVRfTUVUSE9EX05BTUVTKEdFVF9NRVRIT0RfTkFNRVMpO1xuY29uc3QgZ2V0TWV0aG9kTmFtZXNNZXRob2QgPSBoYXJkZW4oe1xuICBbR0VUX01FVEhPRF9OQU1FU10oKSB7XG4gICAgcmV0dXJuIGdldE1ldGhvZE5hbWVzKHRoaXMpO1xuICB9XG59KVtHRVRfTUVUSE9EX05BTUVTXTtcblxuY29uc3QgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yID0gaGFyZGVuKHtcbiAgdmFsdWU6IGdldE1ldGhvZE5hbWVzTWV0aG9kLFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgd3JpdGFibGU6IGZhbHNlXG59KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgRmFyID0gKGZhck5hbWUsIHJlbW90YWJsZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCByID0gcmVtb3RhYmxlID09PSB1bmRlZmluZWQgPyAvKiAgICAgICAgICAgICovKHt9KSA6IHJlbW90YWJsZTtcbiAgaWYgKHR5cGVvZiByID09PSAnb2JqZWN0JyAmJiAhKEdFVF9NRVRIT0RfTkFNRVMgaW4gcikpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBHRVRfTUVUSE9EX05BTUVTLCBnZXRNZXRob2ROYW1lc0Rlc2NyaXB0b3IpO1xuICB9XG4gIHJldHVybiBSZW1vdGFibGUoYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLCB1bmRlZmluZWQsIHIpO1xufTskaM2PX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgVG9GYXJGdW5jdGlvbiA9IChmYXJOYW1lLCBmdW5jKSA9PiB7XG4gIGlmIChnZXRJbnRlcmZhY2VPZihmdW5jKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy9cbiAgICByZXR1cm4gZnVuYztcbiAgfVxuICAvL1xuICByZXR1cm4gRmFyKGZhck5hbWUsICguLi5hcmdzKSA9PiBmdW5jKC4uLmFyZ3MpKTtcbn07JGjNj19vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkdFVF9NRVRIT0RfTkFNRVMiOlsiR0VUX01FVEhPRF9OQU1FUyJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAw9f0txAQAAMQEAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuY29uc3QgeyBjcmVhdGUsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlVGFnZ2VkID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyB8fFxuICBGYWlsYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG4gIGFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG4gIHJldHVybiBoYXJkZW4oXG4gICAgY3JlYXRlKG9iamVjdFByb3RvdHlwZSwge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAndGFnZ2VkJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IHRhZyB9LFxuICAgICAgcGF5bG9hZDogeyB2YWx1ZTogcGF5bG9hZCwgZW51bWVyYWJsZTogdHJ1ZSB9XG4gICAgfSlcbiAgKTtcbn07JGjNj19vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0mUJcXUWAAB1FgAAMAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJDWCIsIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2FuQmVNZXRob2QiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldE93bkRhdGFEZXNjcmlwdG9yIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBwcm90b3R5cGU6IGZ1bmN0aW9uUHJvdG90eXBlIH0gPSBGdW5jdGlvbjtcbmNvbnN0IHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBnZXRQcm90b3R5cGVPZixcbiAgaGFzT3duUHJvcGVydHk6IG9iamVjdEhhc093blByb3BlcnR5LFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGVcbn0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuY29uc3QgeyB0b1N0cmluZ1RhZzogdG9TdHJpbmdUYWdTeW1ib2wgfSA9IFN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gIHR5cGVkQXJyYXlQcm90b3R5cGUsXG4gIHRvU3RyaW5nVGFnU3ltYm9sXG4pO1xuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnID0gdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYy5nZXQ7XG5hc3NlcnQodHlwZW9mIGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyA9PT0gJ2Z1bmN0aW9uJyk7XG5cbmNvbnN0IGhhc093blByb3BlcnR5T2YgPSAob2JqLCBwcm9wKSA9PlxuYXBwbHkob2JqZWN0SGFzT3duUHJvcGVydHksIG9iaiwgW3Byb3BdKTskaM2PX29uY2UuaGFzT3duUHJvcGVydHlPZihoYXNPd25Qcm9wZXJ0eU9mKTtcbmhhcmRlbihoYXNPd25Qcm9wZXJ0eU9mKTtcblxuLy9cbmNvbnN0IGlzT2JqZWN0ID0gKHZhbCkgPT4gT2JqZWN0KHZhbCkgPT09IHZhbDskaM2PX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXNUeXBlZEFycmF5ID0gKG9iamVjdCkgPT4ge1xuICAvL1xuICBjb25zdCB0YWcgPSBhcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsIG9iamVjdCwgW10pO1xuICByZXR1cm4gdGFnICE9PSB1bmRlZmluZWQ7XG59OyRozY9fb25jZS5pc1R5cGVkQXJyYXkoaXNUeXBlZEFycmF5KTtcbmhhcmRlbihpc1R5cGVkQXJyYXkpO1xuXG5jb25zdCBQQVNTX1NUWUxFID0gU3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG5jb25zdCBjYW5CZU1ldGhvZCA9IChmdW5jKSA9PlxudHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicgJiYgIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRozY9fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBhc3NlcnRDaGVja2VyID0gKGNvbmQsIGRldGFpbHMpID0+IHtcbiAgYXNzZXJ0KGNvbmQsIGRldGFpbHMpO1xuICByZXR1cm4gdHJ1ZTtcbn07JGjNj19vbmNlLmFzc2VydENoZWNrZXIoYXNzZXJ0Q2hlY2tlcik7XG5oYXJkZW4oYXNzZXJ0Q2hlY2tlcik7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgQ1ggPSAoY2hlY2spID0+IHtcbiAgY29uc3QgcmVqZWN0ID0gKFQsIC4uLnN1YnMpID0+IGNoZWNrKGZhbHNlLCBYKFQsIC4uLnN1YnMpKTtcbiAgcmV0dXJuIHJlamVjdDtcbn07JGjNj19vbmNlLkNYKENYKTtcbmhhcmRlbihDWCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBnZXRPd25EYXRhRGVzY3JpcHRvciA9IChcbmNhbmRpZGF0ZSxcbnByb3BOYW1lLFxuc2hvdWxkQmVFbnVtZXJhYmxlLFxuY2hlY2spID0+XG57XG4gIGNvbnN0IGRlc2MgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8oXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUsIHByb3BOYW1lKVxuICApO1xuICByZXR1cm4gKGRlc2MgIT09IHVuZGVmaW5lZCB8fFxuICAoISFjaGVjayAmJiBDWChjaGVjaylgJHtxKHByb3BOYW1lKX0gcHJvcGVydHkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSAmJlxuICAoaGFzT3duUHJvcGVydHlPZihkZXNjLCAndmFsdWUnKSB8fFxuICAoISFjaGVjayAmJlxuICBDWChcbiAgICBjaGVja1xuICApYCR7cShwcm9wTmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgKHNob3VsZEJlRW51bWVyYWJsZSA/XG4gIGRlc2MuZW51bWVyYWJsZSB8fFxuICAoISFjaGVjayAmJlxuICBDWChcbiAgICBjaGVja1xuICApYCR7cShwcm9wTmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkgOlxuICAhZGVzYy5lbnVtZXJhYmxlIHx8XG4gICghIWNoZWNrICYmXG4gIENYKFxuICAgIGNoZWNrXG4gIClgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpID9cbiAgZGVzYyA6XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyggLyogICAgICAgICAgICAgICAgICAqLyh1bmRlZmluZWQpKTtcbn07JGjNj19vbmNlLmdldE93bkRhdGFEZXNjcmlwdG9yKGdldE93bkRhdGFEZXNjcmlwdG9yKTtcbmhhcmRlbihnZXRPd25EYXRhRGVzY3JpcHRvcik7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGdldFRhZyA9ICh0YWdSZWNvcmQpID0+IHRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRozY9fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG5jb25zdCBjaGVja1Bhc3NTdHlsZSA9IChvYmosIHBhc3NTdHlsZSwgZXhwZWN0ZWRQYXNzU3R5bGUsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gIHBhc3NTdHlsZSA9PT0gZXhwZWN0ZWRQYXNzU3R5bGUgfHxcbiAgKCEhY2hlY2sgJiZcbiAgQ1goY2hlY2spYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKHBhc3NTdHlsZSl9OiAke29ian1gKVxuICApO1xufTskaM2PX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkID0gKGNoZWNrUHJvdG8pID0+IHtcbiAgLypcbiAgXG4gICAgKi9cblxuXG5cbiAgY29uc3QgY2hlY2tUYWdSZWNvcmQgPSAodGFnUmVjb3JkLCBleHBlY3RlZFBhc3NTdHlsZSwgY2hlY2spID0+IHtcbiAgICByZXR1cm4gKFxuICAgIChpc09iamVjdCh0YWdSZWNvcmQpIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICBDWChjaGVjaylgQSBub24tb2JqZWN0IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgKGlzRnJvemVuKHRhZ1JlY29yZCkgfHxcbiAgICAoISFjaGVjayAmJiBDWChjaGVjaylgQSB0YWdSZWNvcmQgbXVzdCBiZSBmcm96ZW46ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgICghaXNBcnJheSh0YWdSZWNvcmQpIHx8XG4gICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgY2hlY2tQYXNzU3R5bGUoXG4gICAgICB0YWdSZWNvcmQsXG4gICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsIFBBU1NfU1RZTEUsIGZhbHNlLCBjaGVjaykudmFsdWUsXG4gICAgICBleHBlY3RlZFBhc3NTdHlsZSxcbiAgICAgIGNoZWNrXG4gICAgKSAmJlxuICAgICh0eXBlb2YgZ2V0T3duRGF0YURlc2NyaXB0b3IodGFnUmVjb3JkLCBTeW1ib2wudG9TdHJpbmdUYWcsIGZhbHNlLCBjaGVjaykuXG4gICAgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICBDWChcbiAgICAgIGNoZWNrXG4gICAgKWBBIFtTeW1ib2wudG9TdHJpbmdUYWddLW5hbWVkIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgIGNoZWNrUHJvdG8odGFnUmVjb3JkLCBnZXRQcm90b3R5cGVPZih0YWdSZWNvcmQpLCBjaGVjaylcbiAgICApO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbn07XG5cbmNvbnN0IGNoZWNrVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gIHByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgKCEhY2hlY2sgJiZcbiAgY2hlY2soZmFsc2UsIFhgQSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHt2YWx9YCkpXG4pOyRozY9fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuXG5jb25zdCBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gIHByb3RvID09PSBmdW5jdGlvblByb3RvdHlwZSB8fFxuICAocHJvdG8gIT09IG51bGwgJiYgZ2V0UHJvdG90eXBlT2YocHJvdG8pID09PSBmdW5jdGlvblByb3RvdHlwZSkgfHxcbiAgKCEhY2hlY2sgJiZcbiAgY2hlY2soXG4gICAgZmFsc2UsXG4gICAgWGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWBcbiAgKSlcbik7JGjNj19vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sIkNYIjpbIkNYIl0sImdldE93bkRhdGFEZXNjcmlwdG9yIjpbImdldE93bkRhdGFEZXNjcmlwdG9yIl0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKmC5KX2KgAA9ioAACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL3RhZ2dlZC5qcyIsIi4vZXJyb3IuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc3ltYm9sLmpzIiwiLi9zYWZlLXByb21pc2UuanMiLCIuL3N0cmluZy5qcyJdLCJleHBvcnRzIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIiwiYXNzZXJ0UGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwicGFzc1N0eWxlT2YiLCJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Rocm93YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGlzUHJvbWlzZSxYLEZhaWwscSxhbm5vdGF0ZUVycm9yLG1ha2VFcnJvcixpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxDb3B5QXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsRXJyb3JIZWxwZXIsY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MsY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc0Vycm9yTGlrZSxSZW1vdGFibGVIZWxwZXIsYXNzZXJ0UGFzc2FibGVTeW1ib2wsYXNzZXJ0U2FmZVByb21pc2UsYXNzZXJ0UGFzc2FibGVTdHJpbmc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcImlzVHlwZWRBcnJheVwiLFskaM2PX2EgPT4gKGlzVHlwZWRBcnJheSA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXV1dLFtcIi4vY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIixbJGjNj19hID0+IChDb3B5QXJyYXlIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIixbJGjNj19hID0+IChDb3B5UmVjb3JkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLFskaM2PX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsWyRozY9fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2NcIixbJGjNj19hID0+IChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9ICRozY9fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclwiLFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsWyRozY9fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIixbJGjNj19hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vc3RyaW5nLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN0cmluZ1wiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3RyaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzRnJvemVuLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cblxuY29uc3QgbWFrZUhlbHBlclRhYmxlID0gKHBhc3NTdHlsZUhlbHBlcnMpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IEhlbHBlclRhYmxlID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBjb3B5QXJyYXk6IHVuZGVmaW5lZCxcbiAgICBjb3B5UmVjb3JkOiB1bmRlZmluZWQsXG4gICAgdGFnZ2VkOiB1bmRlZmluZWQsXG4gICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICByZW1vdGFibGU6IHVuZGVmaW5lZFxuICB9O1xuICBmb3IgKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKSB7XG4gICAgY29uc3QgeyBzdHlsZU5hbWUgfSA9IGhlbHBlcjtcbiAgICBzdHlsZU5hbWUgaW4gSGVscGVyVGFibGUgfHwgRmFpbGBVbnJlY29nbml6ZWQgaGVscGVyOiAke3Eoc3R5bGVOYW1lKX1gO1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gPT09IHVuZGVmaW5lZCB8fFxuICAgIEZhaWxgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdID0gaGVscGVyO1xuICB9XG4gIGZvciAoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKSB7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgRmFpbGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiAgfVxuXG4gIHJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZiA9IChwYXNzU3R5bGVIZWxwZXJzKSA9PiB7XG4gIGNvbnN0IEhlbHBlclRhYmxlID0gbWFrZUhlbHBlclRhYmxlKHBhc3NTdHlsZUhlbHBlcnMpO1xuICBjb25zdCByZW1vdGFibGVIZWxwZXIgPSBIZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbiAgLypcbiAgXG4gIFxuICBcbiAgICAgKi9cblxuXG5cblxuXG5cblxuXG4gIGNvbnN0IHBhc3NTdHlsZU1lbW8gPSBuZXcgV2Vha01hcCgpO1xuXG4gIC8qXG4gICAgKi9cblxuICAvL1xuICBjb25zdCBwYXNzU3R5bGVPZiA9IChwYXNzYWJsZSkgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGluUHJvZ3Jlc3MgPSBuZXcgU2V0KCk7XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZlJlY3VyID0gKGlubmVyKSA9PiB7XG4gICAgICBjb25zdCBpbm5lcklzT2JqZWN0ID0gaXNPYmplY3QoaW5uZXIpO1xuICAgICAgaWYgKGlubmVySXNPYmplY3QpIHtcbiAgICAgICAgY29uc3QgaW5uZXJTdHlsZSA9IHBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbiAgICAgICAgaWYgKGlubmVyU3R5bGUpIHtcbiAgICAgICAgICByZXR1cm4gaW5uZXJTdHlsZTtcbiAgICAgICAgfVxuICAgICAgICAhaW5Qcm9ncmVzcy5oYXMoaW5uZXIpIHx8XG4gICAgICAgIEZhaWxgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG4gICAgICAgIGluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIHBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLCBwYXNzU3R5bGUpO1xuICAgICAgICBpblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFzc1N0eWxlO1xuICAgIH07XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZkludGVybmFsID0gKGlubmVyKSA9PiB7XG4gICAgICBjb25zdCB0eXBlc3RyID0gdHlwZW9mIGlubmVyO1xuICAgICAgc3dpdGNoICh0eXBlc3RyKSB7XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBjYXNlICdiaWdpbnQnOntcbiAgICAgICAgICAgIHJldHVybiB0eXBlc3RyO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RyaW5nJzp7XG4gICAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN0cmluZyhpbm5lcik7XG4gICAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOntcbiAgICAgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sKGlubmVyKTtcbiAgICAgICAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ29iamVjdCc6e1xuICAgICAgICAgICAgaWYgKGlubmVyID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzRnJvemVuKGlubmVyKSkge1xuICAgICAgICAgICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgaXNUeXBlZEFycmF5KGlubmVyKSA/XG4gICAgICAgICAgICAgICAgWGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmAgOlxuICAgICAgICAgICAgICAgIFhgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UoaW5uZXIpKSB7XG4gICAgICAgICAgICAgIGFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbiAgICAgICAgICAgICAgcmV0dXJuICdwcm9taXNlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHR5cGVvZiBpbm5lci50aGVuICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICBGYWlsYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG4gICAgICAgICAgICBjb25zdCBwYXNzU3R5bGVUYWcgPSBpbm5lcltQQVNTX1NUWUxFXTtcbiAgICAgICAgICAgIGlmIChwYXNzU3R5bGVUYWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBhc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywgJ3N0cmluZycpO1xuICAgICAgICAgICAgICBjb25zdCBoZWxwZXIgPSBIZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuICAgICAgICAgICAgICBoZWxwZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICBGYWlsYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG4gICAgICAgICAgICAgIGhlbHBlci5hc3NlcnRWYWxpZChpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgKi8ocGFzc1N0eWxlVGFnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpIHtcbiAgICAgICAgICAgICAgaWYgKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSkge1xuICAgICAgICAgICAgICAgIGhlbHBlci5hc3NlcnRWYWxpZChpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICByZXR1cm4gJ3JlbW90YWJsZSc7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdmdW5jdGlvbic6e1xuICAgICAgICAgICAgaXNGcm96ZW4oaW5uZXIpIHx8XG4gICAgICAgICAgICBGYWlsYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xuICAgICAgICAgICAgdHlwZW9mIGlubmVyLnRoZW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbiAgICAgICAgICAgIHJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICByZXR1cm4gJ3JlbW90YWJsZSc7XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OntcbiAgICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFhgVW5yZWNvZ25pemVkIHR5cGVvZiAke3EodHlwZXN0cil9YCwgVHlwZUVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG59O1xuXG5jb25zdCBQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCA9IFN5bWJvbC5mb3IoJ0BlbmRvIHBhc3NTdHlsZU9mJyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5QYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbChQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCk7XG5jb25zdCBwYXNzU3R5bGVPZiA9XG4oZ2xvYmFsVGhpcyAmJiBnbG9iYWxUaGlzW1Bhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sXSkgfHxcbm1ha2VQYXNzU3R5bGVPZihbXG5Db3B5QXJyYXlIZWxwZXIsXG5Db3B5UmVjb3JkSGVscGVyLFxuVGFnZ2VkSGVscGVyLFxuRXJyb3JIZWxwZXIsXG5SZW1vdGFibGVIZWxwZXJdXG4pOyRozY9fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cbmNvbnN0IGFzc2VydFBhc3NhYmxlID0gKHZhbCkgPT4ge1xuICBwYXNzU3R5bGVPZih2YWwpOyAvL1xufTskaM2PX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzUGFzc2FibGUgPSAoc3BlY2ltZW4pID0+IHtcbiAgdHJ5IHtcbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSAhPT0gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59OyRozY9fb25jZS5pc1Bhc3NhYmxlKGlzUGFzc2FibGUpO1xuaGFyZGVuKGlzUGFzc2FibGUpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAobmFtZSwgZGVzYykgPT5cbmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKG5hbWUsIGRlc2MsIHBhc3NTdHlsZU9mKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHRvUGFzc2FibGVFcnJvciA9IChlcnIpID0+IHtcbiAgaGFyZGVuKGVycik7XG4gIGlmIChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIsIHBhc3NTdHlsZU9mKSkge1xuICAgIHJldHVybiBlcnI7XG4gIH1cbiAgY29uc3QgeyBuYW1lLCBtZXNzYWdlIH0gPSBlcnI7XG4gIGNvbnN0IHsgY2F1c2U6IGNhdXNlRGVzYywgZXJyb3JzOiBlcnJvcnNEZXNjIH0gPVxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGVycik7XG4gIGxldCBjYXVzZTtcbiAgbGV0IGVycm9ycztcbiAgaWYgKGNhdXNlRGVzYyAmJiBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2NhdXNlJywgY2F1c2VEZXNjKSkge1xuICAgIGNhdXNlID0gY2F1c2VEZXNjLnZhbHVlO1xuICB9XG4gIGlmIChlcnJvcnNEZXNjICYmIGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnZXJyb3JzJywgZXJyb3JzRGVzYykpIHtcbiAgICBlcnJvcnMgPSBlcnJvcnNEZXNjLnZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKGAke25hbWV9YCkgfHwgRXJyb3I7XG4gIGNvbnN0IG5ld0Vycm9yID0gbWFrZUVycm9yKGAke21lc3NhZ2V9YCwgZXJyQ29uc3RydWN0b3IsIHtcbiAgICAvL1xuICAgIGNhdXNlLFxuICAgIGVycm9yc1xuICB9KTtcbiAgLy9cbiAgaGFyZGVuKG5ld0Vycm9yKTtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgYW5ub3RhdGVFcnJvcihuZXdFcnJvciwgWGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbiAgcGFzc1N0eWxlT2YobmV3RXJyb3IpID09PSAnZXJyb3InIHx8XG4gIEZhaWxgRXhwZWN0ZWQgJHtuZXdFcnJvcn0gdG8gYmUgYSBwYXNzYWJsZSBlcnJvcmA7XG4gIHJldHVybiBuZXdFcnJvcjtcbn07JGjNj19vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHRvVGhyb3dhYmxlID0gKHNwZWNpbWVuKSA9PiB7XG4gIGhhcmRlbihzcGVjaW1lbik7XG4gIGlmIChpc0Vycm9yTGlrZShzcGVjaW1lbikpIHtcbiAgICByZXR1cm4gdG9QYXNzYWJsZUVycm9yKCAvKiAgICAgICAgICAgICAgICAqLyhzcGVjaW1lbikpO1xuICB9XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbiAgaWYgKGlzT2JqZWN0KHNwZWNpbWVuKSkge1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdjb3B5QXJyYXknOntcbiAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IC8qICAgICAgICAgICAgICAgICAgICAqLyhzcGVjaW1lbik7XG4gICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICBlbGVtZW50ID09PSB0b1Rocm93YWJsZShlbGVtZW50KSB8fFxuICAgICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtlbGVtZW50fWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzp7XG4gICAgICAgICAgY29uc3QgcmVjID0gLyogICAgICAgICAgICAgICAgICAgICAqLyhzcGVjaW1lbik7XG4gICAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKHJlYykpIHtcbiAgICAgICAgICAgIHZhbCA9PT0gdG9UaHJvd2FibGUodmFsKSB8fFxuICAgICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHt2YWx9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6e1xuICAgICAgICAgIGNvbnN0IHRnID0gLyogICAgICAgICAgICAgICAgICAgICAqLyhzcGVjaW1lbik7XG4gICAgICAgICAgY29uc3QgeyBwYXlsb2FkIH0gPSB0ZztcbiAgICAgICAgICBwYXlsb2FkID09PSB0b1Rocm93YWJsZShwYXlsb2FkKSB8fFxuICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7cGF5bG9hZH1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6e1xuICAgICAgICAgIGNvbnN0IGVyID0gLyogICAgICAgICAgICAgICAgKi8oc3BlY2ltZW4pO1xuICAgICAgICAgIGVyID09PSB0b1Rocm93YWJsZShlcikgfHxcbiAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VyfWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6e1xuICAgICAgICAgIHRocm93IEZhaWxgQSAke3EocGFzc1N0eWxlKX0gaXMgbm90IHRocm93YWJsZTogJHtzcGVjaW1lbn1gO1xuICAgICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8oc3BlY2ltZW4pO1xufTskaM2PX29uY2UudG9UaHJvd2FibGUodG9UaHJvd2FibGUpO1xuaGFyZGVuKHRvVGhyb3dhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIl0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl0sImlzUGFzc2FibGUiOlsiaXNQYXNzYWJsZSJdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIl0sInRvVGhyb3dhYmxlIjpbInRvVGhyb3dhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGssDT9QGwAAUBsAACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImdldEludGVyZmFjZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsaGFzT3duUHJvcGVydHlPZixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNPYmplY3QsZ2V0VGFnLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImNhbkJlTWV0aG9kXCIsWyRozY9fYSA9PiAoY2FuQmVNZXRob2QgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja1RhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkXCIsWyRozY9fYSA9PiAoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHtcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc1xufSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2UgPSAoaWZhY2UsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gIC8vXG4gICh0eXBlb2YgaWZhY2UgPT09ICdzdHJpbmcnIHx8XG4gICghIWNoZWNrICYmXG4gIENYKFxuICAgIGNoZWNrXG4gIClgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkgJiZcbiAgKGlmYWNlID09PSAnUmVtb3RhYmxlJyB8fFxuICBpZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKSB8fFxuICBpZmFjZS5zdGFydHNXaXRoKCdEZWJ1Z05hbWU6ICcpIHx8XG4gICghIWNoZWNrICYmXG4gIENYKGNoZWNrKWBGb3Igbm93LCBpZmFjZSAke3EoXG4gICAgaWZhY2VcbiAgKX0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCI7IHVuaW1wbGVtZW50ZWRgKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBhc3NlcnRJZmFjZSA9IChpZmFjZSkgPT4gY2hlY2tJZmFjZShpZmFjZSwgYXNzZXJ0Q2hlY2tlcik7JGjNj19vbmNlLmFzc2VydElmYWNlKGFzc2VydElmYWNlKTtcbmhhcmRlbihhc3NlcnRJZmFjZSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlUHJvdG9PZiA9IChvcmlnaW5hbCwgY2hlY2spID0+IHtcbiAgaXNPYmplY3Qob3JpZ2luYWwpIHx8XG4gIEZhaWxgUmVtb3RhYmxlcyBtdXN0IGJlIG9iamVjdHMgb3IgZnVuY3Rpb25zOiAke29yaWdpbmFsfWA7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG4gIGlmIChcbiAgcHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICBwcm90byA9PT0gbnVsbCB8fFxuICBwcm90byA9PT0gRnVuY3Rpb24ucHJvdG90eXBlKVxuICB7XG4gICAgcmV0dXJuIChcbiAgICAhIWNoZWNrICYmXG4gICAgQ1goY2hlY2spYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBwcm90b1Byb3RvID0gZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIGlmIChwcm90b1Byb3RvICE9PSBvYmplY3RQcm90b3R5cGUgJiYgcHJvdG9Qcm90byAhPT0gbnVsbCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja1JlbW90YWJsZShwcm90bywgY2hlY2spO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCAncmVtb3RhYmxlJywgY2hlY2spKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICghY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywgJ3JlbW90YWJsZScsIGNoZWNrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vXG4gIGNvbnN0IHBhc3NTdHlsZUtleSA9IC8qICAgICAgICAgICAgICAgICAgKi8oUEFTU19TVFlMRSk7XG4gIGNvbnN0IHRhZ0tleSA9IC8qICAgICAgICAgICAgICAgICAgKi8oU3ltYm9sLnRvU3RyaW5nVGFnKTtcbiAgY29uc3Qge1xuICAgIC8vXG4gICAgWy8qICAgICAgICAgICAgICAgICAqLyhwYXNzU3R5bGVLZXkpXTogX3Bhc3NTdHlsZURlc2MsXG4gICAgWy8qICAgICAgICAgICAgICAgICAqLyh0YWdLZXkpXTogeyB2YWx1ZTogaWZhY2UgfSxcbiAgICAuLi5yZXN0RGVzY3NcbiAgfSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG4gIHJldHVybiAoXG4gIChvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoID09PSAwIHx8XG4gICghIWNoZWNrICYmXG4gIENYKFxuICAgIGNoZWNrXG4gIClgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkgJiZcbiAgY2hlY2tJZmFjZShpZmFjZSwgY2hlY2spXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXMgPSBuZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChjb25maXJtZWRSZW1vdGFibGVzLmhhcyh2YWwpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFpc0Zyb3plbih2YWwpKSB7XG4gICAgcmV0dXJuIChcbiAgICAhIWNoZWNrICYmIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWBcbiAgICApO1xuICB9XG4gIC8vXG4gIGlmICghUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLCBjaGVjaykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBnZXRJbnRlcmZhY2VPZiA9ICh2YWwpID0+IHtcbiAgaWYgKFxuICAhaXNPYmplY3QodmFsKSB8fFxuICB2YWxbUEFTU19TVFlMRV0gIT09ICdyZW1vdGFibGUnIHx8XG4gICFjaGVja1JlbW90YWJsZSh2YWwpKVxuICB7XG4gICAgLy9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8vXG4gIHJldHVybiBnZXRUYWcodmFsKTtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qXG5cblxuICovXG5jb25zdCBSZW1vdGFibGVIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdyZW1vdGFibGUnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgdmFsaWRUeXBlID1cbiAgICAoaXNPYmplY3QoY2FuZGlkYXRlKSB8fFxuICAgICghIWNoZWNrICYmXG4gICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICghaXNBcnJheShjYW5kaWRhdGUpIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBhcnJheXMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gb3duS2V5cyhkZXNjcykuZXZlcnkoKGtleSkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAvL1xuICAgICAgICAoaGFzT3duUHJvcGVydHlPZihkZXNjc1svKiAgICAgICAgICAgICAgICAgKi8oa2V5KV0sICd2YWx1ZScpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBhY2Nlc3NvcnMgbGlrZSAke3EoXG4gICAgICAgICAgU3RyaW5nKGtleSlcbiAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICgoa2V5ID09PSBTeW1ib2wudG9TdHJpbmdUYWcgJiYgY2hlY2tJZmFjZShjYW5kaWRhdGVba2V5XSwgY2hlY2spKSB8fFxuICAgICAgICAoKGNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggbm9uLW1ldGhvZHMgbGlrZSAke3EoXG4gICAgICAgICAgU3RyaW5nKGtleSlcbiAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgIChrZXkgIT09IFBBU1NfU1RZTEUgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goY2hlY2spYEEgcGFzcy1ieS1yZW1vdGUgY2Fubm90IHNoYWRvdyAke3EoUEFTU19TVFlMRSl9YCkpKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCB7XG4gICAgICAgIG5hbWU6IG5hbWVEZXNjLFxuICAgICAgICBsZW5ndGg6IGxlbmd0aERlc2MsXG4gICAgICAgIC8vXG4gICAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiB0b1N0cmluZ1RhZ0Rlc2MsXG4gICAgICAgIC4uLnJlc3REZXNjc1xuICAgICAgfSA9IGRlc2NzO1xuICAgICAgY29uc3QgcmVzdEtleXMgPSBvd25LZXlzKHJlc3REZXNjcyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgKChuYW1lRGVzYyAmJiB0eXBlb2YgbmFtZURlc2MudmFsdWUgPT09ICdzdHJpbmcnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBGYXIgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICgobGVuZ3RoRGVzYyAmJiB0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZSA9PT0gJ251bWJlcicpIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgQ1goXG4gICAgICAgIGNoZWNrXG4gICAgICApYEZhciBmdW5jdGlvbiBsZW5ndGggbXVzdCBiZSBhIG51bWJlciwgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAodG9TdHJpbmdUYWdEZXNjID09PSB1bmRlZmluZWQgfHxcbiAgICAgICgodHlwZW9mIHRvU3RyaW5nVGFnRGVzYy52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2tcbiAgICAgIClgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICBjaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSwgY2hlY2spKSkgJiZcbiAgICAgIChyZXN0S2V5cy5sZW5ndGggPT09IDAgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2tcbiAgICAgIClgRmFyIGZ1bmN0aW9ucyB1bmV4cGVjdGVkIHByb3BlcnRpZXMgYmVzaWRlcyAubmFtZSBhbmQgLmxlbmd0aCAke3Jlc3RLZXlzfWApKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuICEhY2hlY2sgJiYgQ1goY2hlY2spYHVucmVjb2duaXplZCB0eXBlb2YgJHtjYW5kaWRhdGV9YDtcbiAgfSxcblxuICBhc3NlcnRWYWxpZDogKGNhbmRpZGF0ZSkgPT4gY2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKSxcblxuICBldmVyeTogKF9wYXNzYWJsZSwgX2ZuKSA9PiB0cnVlXG59KTskaM2PX29uY2UuUmVtb3RhYmxlSGVscGVyKFJlbW90YWJsZUhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJZmFjZSI6WyJhc3NlcnRJZmFjZSJdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiJdLCJSZW1vdGFibGVIZWxwZXIiOlsiUmVtb3RhYmxlSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPAL0Cg7DgAAOw4AACsAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvc2FmZS1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbImFzc2VydFNhZmVQcm9taXNlIiwiaXNTYWZlUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGlzUHJvbWlzZSxxLGFzc2VydENoZWNrZXIsaGFzT3duUHJvcGVydHlPZixDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgaXNGcm96ZW4sIGdldFByb3RvdHlwZU9mLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgdG9TdHJpbmdUYWcgfSA9IFN5bWJvbDtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tQcm9taXNlT3duS2V5cyA9IChwciwgY2hlY2spID0+IHtcbiAgY29uc3Qga2V5cyA9IG93bktleXMocHIpO1xuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLypcbiAgXG4gIFxuICAgICovXG5cblxuXG5cblxuICBjb25zdCB1bmtub3duS2V5cyA9IGtleXMuZmlsdGVyKFxuICAgIChrZXkpID0+IHR5cGVvZiBrZXkgIT09ICdzeW1ib2wnIHx8ICFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLCBrZXkpXG4gICk7XG5cbiAgaWYgKHVua25vd25LZXlzLmxlbmd0aCAhPT0gMCkge1xuICAgIHJldHVybiBDWChcbiAgICAgIGNoZWNrXG4gICAgKWAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWA7XG4gIH1cblxuICAvKlxuICBcbiAgXG4gIFxuICBcbiAgXG4gIFxuICAgICovXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgY29uc3QgY2hlY2tTYWZlT3duS2V5ID0gKGtleSkgPT4ge1xuICAgIGlmIChrZXkgPT09IHRvU3RyaW5nVGFnKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHRhZ0Rlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHIsIHRvU3RyaW5nVGFnKTtcbiAgICAgIGFzc2VydCh0YWdEZXNjICE9PSB1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuIChcbiAgICAgIChoYXNPd25Qcm9wZXJ0eU9mKHRhZ0Rlc2MsICd2YWx1ZScpIHx8XG4gICAgICBDWChcbiAgICAgICAgY2hlY2tcbiAgICAgIClgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIGRhdGEgcHJvcGVydHksIG5vdCBhbiBhY2Nlc3NvcjogJHtxKHRhZ0Rlc2MpfWApICYmXG4gICAgICAodHlwZW9mIHRhZ0Rlc2MudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICBDWChcbiAgICAgICAgY2hlY2tcbiAgICAgIClgT3duIEBAdG9TdHJpbmdUYWcgdmFsdWUgbXVzdCBiZSBhIHN0cmluZzogJHtxKHRhZ0Rlc2MudmFsdWUpfWApICYmXG4gICAgICAoIXRhZ0Rlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgQ1goY2hlY2spYE93biBAQHRvU3RyaW5nVGFnIG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7cSh0YWdEZXNjKX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsID0gcHJba2V5XTtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWwgIT09IG51bGwgJiZcbiAgICBpc0Zyb3plbih2YWwpICYmXG4gICAgZ2V0UHJvdG90eXBlT2YodmFsKSA9PT0gT2JqZWN0LnByb3RvdHlwZSlcbiAgICB7XG4gICAgICBjb25zdCBzdWJLZXlzID0gb3duS2V5cyh2YWwpO1xuICAgICAgaWYgKHN1YktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICBzdWJLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgc3ViS2V5c1swXSA9PT0gJ2Rlc3Ryb3llZCcgJiZcbiAgICAgIHZhbC5kZXN0cm95ZWQgPT09IGZhbHNlKVxuICAgICAge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIENYKFxuICAgICAgY2hlY2tcbiAgICApYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuICAgICAgU3RyaW5nKGtleSlcbiAgICApfSBpcyAke3ZhbH1gO1xuICB9O1xuXG4gIHJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZU93bktleSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZSA9IChwciwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgKGlzRnJvemVuKHByKSB8fCBDWChjaGVjaylgJHtwcn0gLSBNdXN0IGJlIGZyb3plbmApICYmXG4gIChpc1Byb21pc2UocHIpIHx8IENYKGNoZWNrKWAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkgJiZcbiAgKGdldFByb3RvdHlwZU9mKHByKSA9PT0gUHJvbWlzZS5wcm90b3R5cGUgfHxcbiAgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbiAgICBnZXRQcm90b3R5cGVPZihwcilcbiAgKX1gKSAmJlxuICBjaGVja1Byb21pc2VPd25LZXlzKCAvKiAgICAgICAgICAgICAgICAgICovKHByKSwgY2hlY2spXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGlzU2FmZVByb21pc2UgPSAocHIpID0+IGNoZWNrU2FmZVByb21pc2UocHIsICh4KSA9PiB4KTskaM2PX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuY29uc3QgYXNzZXJ0U2FmZVByb21pc2UgPSAocHIpID0+IGNoZWNrU2FmZVByb21pc2UocHIsIGFzc2VydENoZWNrZXIpOyRozY9fb25jZS5hc3NlcnRTYWZlUHJvbWlzZShhc3NlcnRTYWZlUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1NhZmVQcm9taXNlIjpbImlzU2FmZVByb21pc2UiXSwiYXNzZXJ0U2FmZVByb21pc2UiOlsiYXNzZXJ0U2FmZVByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtzfHYxoIAAAaCAAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9zdHJpbmcuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN0cmluZyIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJpc1dlbGxGb3JtZWRTdHJpbmciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbixGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG4vL1xuY29uc3QgaGFzV2VsbEZvcm1lZFN0cmluZ01ldGhvZCA9ICEhU3RyaW5nLnByb3RvdHlwZS5pc1dlbGxGb3JtZWQ7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBpc1dlbGxGb3JtZWRTdHJpbmcgPSBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kID9cbihzdHIpID0+IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnICYmIHN0ci5pc1dlbGxGb3JtZWQoKSA6XG4oc3RyKSA9PiB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IGNoIG9mIHN0cikge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGNwID0gLyogICAgICAgICAgICAgICAgICovKGNoLmNvZGVQb2ludEF0KDApKTtcbiAgICBpZiAoY3AgPj0gMHhkODAwICYmIGNwIDw9IDB4ZGZmZikge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07JGjNj19vbmNlLmlzV2VsbEZvcm1lZFN0cmluZyhpc1dlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nID0gKHN0cikgPT4ge1xuICBpc1dlbGxGb3JtZWRTdHJpbmcoc3RyKSB8fCBGYWlsYEV4cGVjdGVkIHdlbGwtZm9ybWVkIHVuaWNvZGUgc3RyaW5nOiAke3N0cn1gO1xufTskaM2PX29uY2UuYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyhhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKTtcbmhhcmRlbihhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKTtcblxuY29uc3QgT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFID1cbmdldEVudmlyb25tZW50T3B0aW9uKCdPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUnLCAnZGlzYWJsZWQnLCBbXG4nZW5hYmxlZCddXG4pID09PSAnZW5hYmxlZCc7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFBhc3NhYmxlU3RyaW5nID0gKHN0cikgPT4ge1xuICB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyB8fCBGYWlsYEV4cGVjdGVkIHN0cmluZyAke3N0cn1gO1xuICAhT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFIHx8IGFzc2VydFdlbGxGb3JtZWRTdHJpbmcoc3RyKTtcbn07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3RyaW5nKGFzc2VydFBhc3NhYmxlU3RyaW5nKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1dlbGxGb3JtZWRTdHJpbmciOlsiaXNXZWxsRm9ybWVkU3RyaW5nIl0sImFzc2VydFdlbGxGb3JtZWRTdHJpbmciOlsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRQYXNzYWJsZVN0cmluZyI6WyJhc3NlcnRQYXNzYWJsZVN0cmluZyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADdfbtqrAoAAKwKAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL3N5bWJvbC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKlxuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzID0gbmV3IE1hcChcbiAgb3duS2V5cyhTeW1ib2wpLlxuICBmaWx0ZXIoXG4gICAgKG5hbWUpID0+IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgU3ltYm9sW25hbWVdID09PSAnc3ltYm9sJ1xuICApLlxuICBmaWx0ZXIoKG5hbWUpID0+IHtcbiAgICAvL1xuICAgICFuYW1lLnN0YXJ0c1dpdGgoJ0BAJykgfHxcbiAgICBGYWlsYERpZCBub3QgZXhwZWN0IFN5bWJvbCB0byBoYXZlIGEgc3ltYm9sLXZhbHVlZCBwcm9wZXJ0eSBuYW1lIHN0YXJ0aW5nIHdpdGggXCJAQFwiICR7cShcbiAgICAgIG5hbWVcbiAgICApfWA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pXG4gIC8vXG4gIC5tYXAoKG5hbWUpID0+IFtTeW1ib2xbbmFtZV0sIGBAQCR7bmFtZX1gXSlcbik7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzUGFzc2FibGVTeW1ib2wgPSAoc3ltKSA9PlxudHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcgJiZcbih0eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pID09PSAnc3RyaW5nJyB8fCB3ZWxsS25vd25TeW1ib2xOYW1lcy5oYXMoc3ltKSk7JGjNj19vbmNlLmlzUGFzc2FibGVTeW1ib2woaXNQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oaXNQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IGFzc2VydFBhc3NhYmxlU3ltYm9sID0gKHN5bSkgPT5cbmlzUGFzc2FibGVTeW1ib2woc3ltKSB8fFxuRmFpbGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9IChzeW0pID0+IHtcbiAgY29uc3QgbmFtZSA9IFN5bWJvbC5rZXlGb3Ioc3ltKTtcbiAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB3ZWxsS25vd25TeW1ib2xOYW1lcy5nZXQoc3ltKTtcbiAgfVxuICBpZiAobmFtZS5zdGFydHNXaXRoKCdAQCcpKSB7XG4gICAgcmV0dXJuIGBAQCR7bmFtZX1gO1xuICB9XG4gIHJldHVybiBuYW1lO1xufTskaM2PX29uY2UubmFtZUZvclBhc3NhYmxlU3ltYm9sKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4obmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgQXRBdFByZWZpeFBhdHRlcm4gPSAvXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9IChuYW1lKSA9PiB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gQXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gbWF0Y2hbMV07XG4gICAgaWYgKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKSB7XG4gICAgICByZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzeW0gPSBTeW1ib2xbc3VmZml4XTtcbiAgICAgIGlmICh0eXBlb2Ygc3ltID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gc3ltO1xuICAgICAgfVxuICAgICAgRmFpbGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG59OyRozY9fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZVN5bWJvbCI6WyJpc1Bhc3NhYmxlU3ltYm9sIl0sImFzc2VydFBhc3NhYmxlU3ltYm9sIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADWivwwpwcAAKcHAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsZ2V0T3duRGF0YURlc2NyaXB0b3IsY2hlY2tQYXNzU3R5bGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja1RhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsWyRozY9fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IFRhZ2dlZEhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ3RhZ2dlZCcsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gIGNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwgY2FuZGlkYXRlW1BBU1NfU1RZTEVdLCAndGFnZ2VkJywgY2hlY2spLFxuXG4gIGFzc2VydFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgY2hlY2tUYWdSZWNvcmQoY2FuZGlkYXRlLCAndGFnZ2VkJywgYXNzZXJ0Q2hlY2tlcik7XG5cbiAgICAvL1xuICAgIGNvbnN0IHBhc3NTdHlsZUtleSA9IC8qICAgICAgICAgICAgICAgICAgKi8oUEFTU19TVFlMRSk7XG4gICAgY29uc3QgdGFnS2V5ID0gLyogICAgICAgICAgICAgICAgICAqLyhTeW1ib2wudG9TdHJpbmdUYWcpO1xuICAgIGNvbnN0IHtcbiAgICAgIC8vXG4gICAgICBbLyogICAgICAgICAgICAgICAgICovKHBhc3NTdHlsZUtleSldOiBfcGFzc1N0eWxlRGVzYyxcbiAgICAgIFsvKiAgICAgICAgICAgICAgICAgKi8odGFnS2V5KV06IF9sYWJlbERlc2MsXG4gICAgICBwYXlsb2FkOiBfcGF5bG9hZERlc2MsIC8vXG4gICAgICAuLi5yZXN0RGVzY3NcbiAgICB9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICAgIG93bktleXMocmVzdERlc2NzKS5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgcGFzc1N0eWxlT2ZSZWN1cihcbiAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgJ3BheWxvYWQnLCB0cnVlLCBhc3NlcnRDaGVja2VyKS52YWx1ZVxuICAgICk7XG4gIH1cbn0pOyRozY9fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAs6HJjlIJAABSCQAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEscGFzc1N0eWxlT2Y7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dXSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzQ29weUFycmF5ID0gKGFycikgPT4gcGFzc1N0eWxlT2YoYXJyKSA9PT0gJ2NvcHlBcnJheSc7JGjNj19vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBpc1JlY29yZCA9IChyZWNvcmQpID0+IHBhc3NTdHlsZU9mKHJlY29yZCkgPT09ICdjb3B5UmVjb3JkJzskaM2PX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc1JlbW90YWJsZSA9IChyZW1vdGFibGUpID0+IHBhc3NTdHlsZU9mKHJlbW90YWJsZSkgPT09ICdyZW1vdGFibGUnOyRozY9fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRDb3B5QXJyYXkgPSAoYXJyLCBvcHROYW1lT2ZBcnJheSA9ICdBbGxlZ2VkIGFycmF5JykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihhcnIpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5QXJyYXknIHx8XG4gIEZhaWxgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJ9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG4gICAgcGFzc1N0eWxlXG4gICl9YDtcbn07JGjNj19vbmNlLmFzc2VydENvcHlBcnJheShhc3NlcnRDb3B5QXJyYXkpO1xuaGFyZGVuKGFzc2VydENvcHlBcnJheSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFJlY29yZCA9IChyZWNvcmQsIG9wdE5hbWVPZlJlY29yZCA9ICdBbGxlZ2VkIHJlY29yZCcpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmVjb3JkKTtcbiAgcGFzc1N0eWxlID09PSAnY29weVJlY29yZCcgfHxcbiAgRmFpbGAke3Eob3B0TmFtZU9mUmVjb3JkKX0gJHtyZWNvcmR9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBub3QgJHtxKFxuICAgIHBhc3NTdHlsZVxuICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGUgPSAoXG5yZW1vdGFibGUsXG5vcHROYW1lT2ZSZW1vdGFibGUgPSAnQWxsZWdlZCByZW1vdGFibGUnKSA9Plxue1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZW1vdGFibGUpO1xuICBwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnIHx8XG4gIEZhaWxgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxuICAgIHBhc3NTdHlsZVxuICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADRrBHjxQ4AAMUOAAAeAAAAQGVuZG8vcGF0dGVybnMtdjEuNC44L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiLCIuL3NyYy9rZXlzL2NvcHlTZXQuanMiLCIuL3NyYy9rZXlzL2NvcHlCYWcuanMiLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiYmFnVW5pb24iLCJiYWdVbmlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciIsInNldENvbXBhcmUiLCJzZXRDb21wYXJlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2tleXMvY2hlY2tLZXkuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weVNldC5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5QmFnLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjpbWyJpc0tleSIsImlzS2V5Il0sWyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiXSxbImFzc2VydFNjYWxhcktleSIsImFzc2VydFNjYWxhcktleSJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il0sWyJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0Q29weVNldCJdLFsibWFrZUNvcHlTZXQiLCJtYWtlQ29weVNldCJdLFsiZ2V0Q29weVNldEtleXMiLCJnZXRDb3B5U2V0S2V5cyJdLFsiaXNDb3B5QmFnIiwiaXNDb3B5QmFnIl0sWyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weUJhZyJdLFsibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZyJdLFsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLFsiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5QmFnRW50cmllcyJdLFsiaXNDb3B5TWFwIiwiaXNDb3B5TWFwIl0sWyJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weU1hcCJdLFsibWFrZUNvcHlNYXAiLCJtYWtlQ29weU1hcCJdLFsiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjpbWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdXSwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjpbWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXV0sIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOltbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSJdLFsiY29tcGFyZUtleXMiLCJjb21wYXJlS2V5cyJdLFsia2V5TFQiLCJrZXlMVCJdLFsia2V5TFRFIiwia2V5TFRFIl0sWyJrZXlFUSIsImtleUVRIl0sWyJrZXlHVEUiLCJrZXlHVEUiXSxbImtleUdUIiwia2V5R1QiXV0sIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6W1siZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOltbImJhZ0lzU3VwZXJiYWciLCJiYWdJc1N1cGVyYmFnIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOltbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJtdXN0TWF0Y2giLCJtdXN0TWF0Y2giXSxbImlzQXdhaXRBcmdHdWFyZCIsImlzQXdhaXRBcmdHdWFyZCJdLFsiYXNzZXJ0QXdhaXRBcmdHdWFyZCIsImFzc2VydEF3YWl0QXJnR3VhcmQiXSxbImlzUmF3R3VhcmQiLCJpc1Jhd0d1YXJkIl0sWyJhc3NlcnRSYXdHdWFyZCIsImFzc2VydFJhd0d1YXJkIl0sWyJhc3NlcnRNZXRob2RHdWFyZCIsImFzc2VydE1ldGhvZEd1YXJkIl0sWyJhc3NlcnRJbnRlcmZhY2VHdWFyZCIsImFzc2VydEludGVyZmFjZUd1YXJkIl0sWyJraW5kT2YiLCJraW5kT2YiXV0sIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiOltbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIiwiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSxbImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLFsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sWyJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIiwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdXSwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6W1sibGlzdERpZmZlcmVuY2UiLCJsaXN0RGlmZmVyZW5jZSJdXSwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOltbIm9iamVjdE1hcCIsIm9iamVjdE1hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHRh3fqU2AAClNgAAKgAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMva2V5cy9jaGVja0tleS5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlTZXQuanMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weU1hcCIsImFzc2VydENvcHlTZXQiLCJhc3NlcnRLZXkiLCJhc3NlcnRQcmltaXRpdmVLZXkiLCJhc3NlcnRTY2FsYXJLZXkiLCJjaGVja0NvcHlCYWciLCJjaGVja0NvcHlNYXAiLCJjaGVja0NvcHlTZXQiLCJjaGVja0tleSIsImNoZWNrU2NhbGFyS2V5IiwiY29weU1hcEtleVNldCIsImV2ZXJ5Q29weUJhZ0VudHJ5IiwiZXZlcnlDb3B5TWFwS2V5IiwiZXZlcnlDb3B5TWFwVmFsdWUiLCJldmVyeUNvcHlTZXRLZXkiLCJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJ5QXJyYXkiLCJnZXRDb3B5TWFwS2V5cyIsImdldENvcHlNYXBWYWx1ZXMiLCJnZXRDb3B5U2V0S2V5cyIsImlzQ29weUJhZyIsImlzQ29weU1hcCIsImlzQ29weVNldCIsImlzS2V5IiwiaXNQcmltaXRpdmVLZXkiLCJpc1NjYWxhcktleSIsIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weU1hcCIsIm1ha2VDb3B5U2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixhc3NlcnRQYXNzYWJsZSxGYXIsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssaWRlbnRDaGVja2VyLFgscSxGYWlsLGNoZWNrRWxlbWVudHMsbWFrZVNldE9mRWxlbWVudHMsY2hlY2tCYWdFbnRyaWVzLG1ha2VCYWdPZkVudHJpZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIixbJGjNj19hID0+IChjaGVja0VsZW1lbnRzID0gJGjNj19hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsWyRozY9fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLFskaM2PX2EgPT4gKGNoZWNrQmFnRW50cmllcyA9ICRozY9fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsWyRozY9fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLypcblxuXG5cbiAqL1xuXG4vL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja1ByaW1pdGl2ZUtleSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgcmV0dXJuIChcbiAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgY2hlY2soZmFsc2UsIFhgQSAke3EodHlwZW9mIHZhbCl9IGNhbm5vdCBiZSBhIHByaW1pdGl2ZTogJHt2YWx9YClcbiAgICApO1xuICB9XG4gIC8vXG4gIC8vXG4gIGFzc2VydFBhc3NhYmxlKHZhbCk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGlzUHJpbWl0aXZlS2V5ID0gKHZhbCkgPT4gY2hlY2tQcmltaXRpdmVLZXkodmFsLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc1ByaW1pdGl2ZUtleShpc1ByaW1pdGl2ZUtleSk7XG5oYXJkZW4oaXNQcmltaXRpdmVLZXkpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0UHJpbWl0aXZlS2V5ID0gKHZhbCkgPT4ge1xuICBjaGVja1ByaW1pdGl2ZUtleSh2YWwsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0UHJpbWl0aXZlS2V5KGFzc2VydFByaW1pdGl2ZUtleSk7XG5oYXJkZW4oYXNzZXJ0UHJpbWl0aXZlS2V5KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tTY2FsYXJLZXkgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoaXNQcmltaXRpdmVLZXkodmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIGlmIChwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIHNjYWxhciBrZXk6ICR7dmFsfWApO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuY2hlY2tTY2FsYXJLZXkoY2hlY2tTY2FsYXJLZXkpO1xuY29uc3QgaXNTY2FsYXJLZXkgPSAodmFsKSA9PiBjaGVja1NjYWxhcktleSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzU2NhbGFyS2V5KGlzU2NhbGFyS2V5KTtcbmhhcmRlbihpc1NjYWxhcktleSk7XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRTY2FsYXJLZXkgPSAodmFsKSA9PiB7XG4gIGNoZWNrU2NhbGFyS2V5KHZhbCwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRTY2FsYXJLZXkoYXNzZXJ0U2NhbGFyS2V5KTtcbmhhcmRlbihhc3NlcnRTY2FsYXJLZXkpO1xuXG4vL1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuY29uc3Qga2V5TWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrS2V5ID0gKHZhbCwgY2hlY2spID0+IHtcbiAgaWYgKCFpc09iamVjdCh2YWwpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIGFzc2VydFBhc3NhYmxlKHZhbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy9cbiAgaWYgKGtleU1lbW8uaGFzKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvL1xuICBjb25zdCByZXN1bHQgPSBjaGVja0tleUludGVybmFsKHZhbCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAga2V5TWVtby5hZGQodmFsKTtcbiAgfVxuICAvL1xuICAvL1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tLZXkoY2hlY2tLZXkpO1xuaGFyZGVuKGNoZWNrS2V5KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc0tleSA9ICh2YWwpID0+IGNoZWNrS2V5KHZhbCwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNLZXkoaXNLZXkpO1xuaGFyZGVuKGlzS2V5KTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGFzc2VydEtleSA9ICh2YWwpID0+IHtcbiAgY2hlY2tLZXkodmFsLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEtleShhc3NlcnRLZXkpO1xuaGFyZGVuKGFzc2VydEtleSk7XG5cbi8vXG5cbi8vXG4vL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb3B5U2V0TWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrQ29weVNldCA9IChzLCBjaGVjaykgPT4ge1xuICBpZiAoY29weVNldE1lbW8uaGFzKHMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID1cbiAgKChwYXNzU3R5bGVPZihzKSA9PT0gJ3RhZ2dlZCcgJiYgZ2V0VGFnKHMpID09PSAnY29weVNldCcpIHx8XG4gIGNoZWNrKGZhbHNlLCBYYE5vdCBhIGNvcHlTZXQ6ICR7c31gKSkgJiZcbiAgY2hlY2tFbGVtZW50cyhzLnBheWxvYWQsIGNoZWNrKSAmJlxuICBjaGVja0tleShzLnBheWxvYWQsIGNoZWNrKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvcHlTZXRNZW1vLmFkZChzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tDb3B5U2V0KGNoZWNrQ29weVNldCk7XG5oYXJkZW4oY2hlY2tDb3B5U2V0KTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGlzQ29weVNldCA9IChzKSA9PiBjaGVja0NvcHlTZXQocywgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNDb3B5U2V0KGlzQ29weVNldCk7XG5oYXJkZW4oaXNDb3B5U2V0KTtcblxuLypcblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBhc3NlcnRDb3B5U2V0ID0gKHMpID0+IHtcbiAgY2hlY2tDb3B5U2V0KHMsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weVNldChhc3NlcnRDb3B5U2V0KTtcbmhhcmRlbihhc3NlcnRDb3B5U2V0KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZ2V0Q29weVNldEtleXMgPSAocykgPT4ge1xuICBhc3NlcnRDb3B5U2V0KHMpO1xuICByZXR1cm4gcy5wYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0Q29weVNldEtleXMoZ2V0Q29weVNldEtleXMpO1xuaGFyZGVuKGdldENvcHlTZXRLZXlzKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBldmVyeUNvcHlTZXRLZXkgPSAocywgZm4pID0+XG5nZXRDb3B5U2V0S2V5cyhzKS5ldmVyeSgoa2V5LCBpbmRleCkgPT4gZm4oa2V5LCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlTZXRLZXkoZXZlcnlDb3B5U2V0S2V5KTtcbmhhcmRlbihldmVyeUNvcHlTZXRLZXkpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlQ29weVNldCA9IChlbGVtZW50SXRlcikgPT4ge1xuICBjb25zdCByZXN1bHQgPSBtYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50SXRlcik7XG4gIGFzc2VydENvcHlTZXQocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLm1ha2VDb3B5U2V0KG1ha2VDb3B5U2V0KTtcbmhhcmRlbihtYWtlQ29weVNldCk7XG5cbi8vXG5cbi8vXG4vL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb3B5QmFnTWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrQ29weUJhZyA9IChiLCBjaGVjaykgPT4ge1xuICBpZiAoY29weUJhZ01lbW8uaGFzKGIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID1cbiAgKChwYXNzU3R5bGVPZihiKSA9PT0gJ3RhZ2dlZCcgJiYgZ2V0VGFnKGIpID09PSAnY29weUJhZycpIHx8XG4gIGNoZWNrKGZhbHNlLCBYYE5vdCBhIGNvcHlCYWc6ICR7Yn1gKSkgJiZcbiAgY2hlY2tCYWdFbnRyaWVzKGIucGF5bG9hZCwgY2hlY2spICYmXG4gIGNoZWNrS2V5KGIucGF5bG9hZCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weUJhZ01lbW8uYWRkKGIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlCYWcoY2hlY2tDb3B5QmFnKTtcbmhhcmRlbihjaGVja0NvcHlCYWcpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgaXNDb3B5QmFnID0gKGIpID0+IGNoZWNrQ29weUJhZyhiLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0NvcHlCYWcoaXNDb3B5QmFnKTtcbmhhcmRlbihpc0NvcHlCYWcpO1xuXG4vKlxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGFzc2VydENvcHlCYWcgPSAoYikgPT4ge1xuICBjaGVja0NvcHlCYWcoYiwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRDb3B5QmFnKGFzc2VydENvcHlCYWcpO1xuaGFyZGVuKGFzc2VydENvcHlCYWcpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBnZXRDb3B5QmFnRW50cmllcyA9IChiKSA9PiB7XG4gIGFzc2VydENvcHlCYWcoYik7XG4gIHJldHVybiBiLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRDb3B5QmFnRW50cmllcyhnZXRDb3B5QmFnRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weUJhZ0VudHJpZXMpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGV2ZXJ5Q29weUJhZ0VudHJ5ID0gKGIsIGZuKSA9PlxuZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LCBpbmRleCkgPT4gZm4oZW50cnksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VDb3B5QmFnID0gKGJhZ0VudHJ5SXRlcikgPT4ge1xuICBjb25zdCByZXN1bHQgPSBtYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJ5SXRlcik7XG4gIGFzc2VydENvcHlCYWcocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLm1ha2VDb3B5QmFnKG1ha2VDb3B5QmFnKTtcbmhhcmRlbihtYWtlQ29weUJhZyk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzID0gKGVsZW1lbnRJdGVyKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IGZ1bGxDb21wYXJlID0gbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcbiAgY29uc3Qgc29ydGVkID0gc29ydEJ5UmFuayhlbGVtZW50SXRlciwgZnVsbENvbXBhcmUpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZW50cmllcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZC5sZW5ndGg7KSB7XG4gICAgY29uc3QgayA9IHNvcnRlZFtpXTtcbiAgICBsZXQgaiA9IGkgKyAxO1xuICAgIHdoaWxlIChqIDwgc29ydGVkLmxlbmd0aCAmJiBmdWxsQ29tcGFyZShrLCBzb3J0ZWRbal0pID09PSAwKSB7XG4gICAgICBqICs9IDE7XG4gICAgfVxuICAgIGVudHJpZXMucHVzaChbaywgQmlnSW50KGogLSBpKV0pO1xuICAgIGkgPSBqO1xuICB9XG4gIHJldHVybiBtYWtlQ29weUJhZyhlbnRyaWVzKTtcbn07JGjNj19vbmNlLm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcbmhhcmRlbihtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5cbi8vXG5cbi8vXG4vL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb3B5TWFwTWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrQ29weU1hcCA9IChtLCBjaGVjaykgPT4ge1xuICBpZiAoY29weU1hcE1lbW8uaGFzKG0pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCEocGFzc1N0eWxlT2YobSkgPT09ICd0YWdnZWQnICYmIGdldFRhZyhtKSA9PT0gJ2NvcHlNYXAnKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBOb3QgYSBjb3B5TWFwOiAke219YCk7XG4gIH1cbiAgY29uc3QgeyBwYXlsb2FkIH0gPSBtO1xuICBpZiAocGFzc1N0eWxlT2YocGF5bG9hZCkgIT09ICdjb3B5UmVjb3JkJykge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3QgYmUgYSByZWNvcmQ6ICR7bX1gKTtcbiAgfVxuICBjb25zdCB7IGtleXMsIHZhbHVlcywgLi4ucmVzdCB9ID0gcGF5bG9hZDtcbiAgY29uc3QgcmVzdWx0ID1cbiAgKG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gIGNoZWNrKFxuICAgIGZhbHNlLFxuICAgIFhgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IG9ubHkgaGF2ZSAua2V5cyBhbmQgLnZhbHVlczogJHttfWBcbiAgKSkgJiZcbiAgY2hlY2tFbGVtZW50cyhrZXlzLCBjaGVjaykgJiZcbiAgY2hlY2tLZXkoa2V5cywgY2hlY2spICYmXG4gIChwYXNzU3R5bGVPZih2YWx1ZXMpID09PSAnY29weUFycmF5JyB8fFxuICBjaGVjayhmYWxzZSwgWGBBIGNvcHlNYXAncyAudmFsdWVzIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7bX1gKSkgJiZcbiAgKGtleXMubGVuZ3RoID09PSB2YWx1ZXMubGVuZ3RoIHx8XG4gIGNoZWNrKFxuICAgIGZhbHNlLFxuICAgIFhgQSBjb3B5TWFwIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Yga2V5cyBhbmQgdmFsdWVzOiAke219YFxuICApKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvcHlNYXBNZW1vLmFkZChtKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tDb3B5TWFwKGNoZWNrQ29weU1hcCk7XG5oYXJkZW4oY2hlY2tDb3B5TWFwKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGlzQ29weU1hcCA9IChtKSA9PiBjaGVja0NvcHlNYXAobSwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNDb3B5TWFwKGlzQ29weU1hcCk7XG5oYXJkZW4oaXNDb3B5TWFwKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGFzc2VydENvcHlNYXAgPSAobSkgPT4ge1xuICBjaGVja0NvcHlNYXAobSwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRDb3B5TWFwKGFzc2VydENvcHlNYXApO1xuaGFyZGVuKGFzc2VydENvcHlNYXApO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGdldENvcHlNYXBLZXlzID0gKG0pID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgcmV0dXJuIG0ucGF5bG9hZC5rZXlzO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcEtleXMoZ2V0Q29weU1hcEtleXMpO1xuaGFyZGVuKGdldENvcHlNYXBLZXlzKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBnZXRDb3B5TWFwVmFsdWVzID0gKG0pID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgcmV0dXJuIG0ucGF5bG9hZC52YWx1ZXM7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwVmFsdWVzKGdldENvcHlNYXBWYWx1ZXMpO1xuaGFyZGVuKGdldENvcHlNYXBWYWx1ZXMpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBnZXRDb3B5TWFwRW50cnlBcnJheSA9IChtKSA9PiB7XG4gIGFzc2VydENvcHlNYXAobSk7XG4gIGNvbnN0IHtcbiAgICBwYXlsb2FkOiB7IGtleXMsIHZhbHVlcyB9XG4gIH0gPSBtO1xuICByZXR1cm4gaGFyZGVuKGtleXMubWFwKChrZXksIGkpID0+IFtrZXksIHZhbHVlc1tpXV0pKTtcbn07JGjNj19vbmNlLmdldENvcHlNYXBFbnRyeUFycmF5KGdldENvcHlNYXBFbnRyeUFycmF5KTtcbmhhcmRlbihnZXRDb3B5TWFwRW50cnlBcnJheSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZ2V0Q29weU1hcEVudHJpZXMgPSAobSkgPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICBjb25zdCB7XG4gICAgcGF5bG9hZDogeyBrZXlzLCB2YWx1ZXMgfVxuICB9ID0gbTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IC8qICAgICAgICAgICAgICAgICovKGtleXMpO1xuICByZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBba2V5c1tpXSwgdmFsdWVzW2ldXSB9KTtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJpZXMpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgZXZlcnlDb3B5TWFwS2V5ID0gKG0sIGZuKSA9PlxuZ2V0Q29weU1hcEtleXMobSkuZXZlcnkoKGtleSwgaW5kZXgpID0+IGZuKGtleSwgaW5kZXgpKTskaM2PX29uY2UuZXZlcnlDb3B5TWFwS2V5KGV2ZXJ5Q29weU1hcEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwS2V5KTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGV2ZXJ5Q29weU1hcFZhbHVlID0gKG0sIGZuKSA9PlxuZ2V0Q29weU1hcFZhbHVlcyhtKS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBmbih2YWx1ZSwgaW5kZXgpKTskaM2PX29uY2UuZXZlcnlDb3B5TWFwVmFsdWUoZXZlcnlDb3B5TWFwVmFsdWUpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcFZhbHVlKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBjb3B5TWFwS2V5U2V0ID0gKG0pID0+XG4vL1xubWFrZVRhZ2dlZCgnY29weVNldCcsIG0ucGF5bG9hZC5rZXlzKTskaM2PX29uY2UuY29weU1hcEtleVNldChjb3B5TWFwS2V5U2V0KTtcbmhhcmRlbihjb3B5TWFwS2V5U2V0KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBtYWtlQ29weU1hcCA9IChlbnRyaWVzKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHNvcnRlZEVudHJpZXMgPSBzb3J0QnlSYW5rKGVudHJpZXMsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGNvbnN0IGtleXMgPSBzb3J0ZWRFbnRyaWVzLm1hcCgoW2ssIF92XSkgPT4gayk7XG4gIGNvbnN0IHZhbHVlcyA9IHNvcnRlZEVudHJpZXMubWFwKChbX2ssIHZdKSA9PiB2KTtcbiAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnY29weU1hcCcsIHsga2V5cywgdmFsdWVzIH0pO1xuICBhc3NlcnRDb3B5TWFwKHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5tYWtlQ29weU1hcChtYWtlQ29weU1hcCk7XG5oYXJkZW4obWFrZUNvcHlNYXApO1xuXG4vL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja0tleUludGVybmFsID0gKHZhbCwgY2hlY2spID0+IHtcbiAgY29uc3QgY2hlY2tJdCA9IChjaGlsZCkgPT4gY2hlY2tLZXkoY2hpbGQsIGNoZWNrKTtcblxuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ2NvcHlSZWNvcmQnOntcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModmFsKS5ldmVyeShjaGVja0l0KTtcbiAgICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOntcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHZhbC5ldmVyeShjaGVja0l0KTtcbiAgICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOntcbiAgICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHZhbCk7XG4gICAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgICAgY2FzZSAnY29weVNldCc6e1xuICAgICAgICAgICAgICByZXR1cm4gY2hlY2tDb3B5U2V0KHZhbCwgY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2NvcHlCYWcnOntcbiAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrQ29weUJhZyh2YWwsIGNoZWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdjb3B5TWFwJzp7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIGNoZWNrQ29weU1hcCh2YWwsIGNoZWNrKSAmJlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBldmVyeUNvcHlNYXBWYWx1ZSh2YWwsIGNoZWNrSXQpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDp7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIGNoZWNrICE9PSBpZGVudENoZWNrZXIgJiZcbiAgICAgICAgICAgICAgY2hlY2soZmFsc2UsIFhgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHt2YWx9YClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIGNhc2UgJ3JlbW90YWJsZSc6e1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICBjYXNlICdlcnJvcic6XG4gICAgY2FzZSAncHJvbWlzZSc6e1xuICAgICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEga2V5YCk7XG4gICAgICB9XG4gICAgZGVmYXVsdDp7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHRocm93IEZhaWxgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3ZhbH1gO1xuICAgICAgfVxuICB9XG59O1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcmltaXRpdmVLZXkiOlsiaXNQcmltaXRpdmVLZXkiXSwiYXNzZXJ0UHJpbWl0aXZlS2V5IjpbImFzc2VydFByaW1pdGl2ZUtleSJdLCJjaGVja1NjYWxhcktleSI6WyJjaGVja1NjYWxhcktleSJdLCJpc1NjYWxhcktleSI6WyJpc1NjYWxhcktleSJdLCJhc3NlcnRTY2FsYXJLZXkiOlsiYXNzZXJ0U2NhbGFyS2V5Il0sImNoZWNrS2V5IjpbImNoZWNrS2V5Il0sImlzS2V5IjpbImlzS2V5Il0sImFzc2VydEtleSI6WyJhc3NlcnRLZXkiXSwiY2hlY2tDb3B5U2V0IjpbImNoZWNrQ29weVNldCJdLCJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0Il0sImFzc2VydENvcHlTZXQiOlsiYXNzZXJ0Q29weVNldCJdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyJdLCJldmVyeUNvcHlTZXRLZXkiOlsiZXZlcnlDb3B5U2V0S2V5Il0sIm1ha2VDb3B5U2V0IjpbIm1ha2VDb3B5U2V0Il0sImNoZWNrQ29weUJhZyI6WyJjaGVja0NvcHlCYWciXSwiaXNDb3B5QmFnIjpbImlzQ29weUJhZyJdLCJhc3NlcnRDb3B5QmFnIjpbImFzc2VydENvcHlCYWciXSwiZ2V0Q29weUJhZ0VudHJpZXMiOlsiZ2V0Q29weUJhZ0VudHJpZXMiXSwiZXZlcnlDb3B5QmFnRW50cnkiOlsiZXZlcnlDb3B5QmFnRW50cnkiXSwibWFrZUNvcHlCYWciOlsibWFrZUNvcHlCYWciXSwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiOlsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSwiY2hlY2tDb3B5TWFwIjpbImNoZWNrQ29weU1hcCJdLCJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIl0sImFzc2VydENvcHlNYXAiOlsiYXNzZXJ0Q29weU1hcCJdLCJnZXRDb3B5TWFwS2V5cyI6WyJnZXRDb3B5TWFwS2V5cyJdLCJnZXRDb3B5TWFwVmFsdWVzIjpbImdldENvcHlNYXBWYWx1ZXMiXSwiZ2V0Q29weU1hcEVudHJ5QXJyYXkiOlsiZ2V0Q29weU1hcEVudHJ5QXJyYXkiXSwiZ2V0Q29weU1hcEVudHJpZXMiOlsiZ2V0Q29weU1hcEVudHJpZXMiXSwiZXZlcnlDb3B5TWFwS2V5IjpbImV2ZXJ5Q29weU1hcEtleSJdLCJldmVyeUNvcHlNYXBWYWx1ZSI6WyJldmVyeUNvcHlNYXBWYWx1ZSJdLCJjb3B5TWFwS2V5U2V0IjpbImNvcHlNYXBLZXlTZXQiXSwibWFrZUNvcHlNYXAiOlsibWFrZUNvcHlNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxNS7/mYaAABmGgAALQAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMva2V5cy9jb21wYXJlS2V5cy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIiwiLi9jaGVja0tleS5qcyIsIi4va2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiXSwiZXhwb3J0cyI6WyJiYWdDb21wYXJlIiwiY29tcGFyZUtleXMiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiLCJzZXRDb21wYXJlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsZ2V0VGFnLGNvbXBhcmVSYW5rLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyx0cml2aWFsQ29tcGFyYXRvcixxLEZhaWwsYXNzZXJ0S2V5LGdldENvcHlCYWdFbnRyaWVzLGdldENvcHlNYXBFbnRyeUFycmF5LGdldENvcHlTZXRLZXlzLG1ha2VDb21wYXJlQ29sbGVjdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV0sW1widHJpdmlhbENvbXBhcmF0b3JcIixbJGjNj19hID0+ICh0cml2aWFsQ29tcGFyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIixbJGjNj19hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRozY9fYSldXSxbXCJnZXRDb3B5TWFwRW50cnlBcnJheVwiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyeUFycmF5ID0gJGjNj19hKV1dLFtcImdldENvcHlTZXRLZXlzXCIsWyRozY9fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaM2PX2EpXV1dXSxbXCIuL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzXCIsIFtbXCJtYWtlQ29tcGFyZUNvbGxlY3Rpb25cIixbJGjNj19hID0+IChtYWtlQ29tcGFyZUNvbGxlY3Rpb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBzZXRDb21wYXJlID0gbWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyhcbiAgKHMpID0+IGhhcmRlbihnZXRDb3B5U2V0S2V5cyhzKS5tYXAoKGtleSkgPT4gW2tleSwgMV0pKVxuICApLFxuICAwLFxuICB0cml2aWFsQ29tcGFyYXRvclxuKTskaM2PX29uY2Uuc2V0Q29tcGFyZShzZXRDb21wYXJlKTtcbmhhcmRlbihzZXRDb21wYXJlKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYmFnQ29tcGFyZSA9IG1ha2VDb21wYXJlQ29sbGVjdGlvbihcbiAgZ2V0Q29weUJhZ0VudHJpZXMsXG4gIDBuLFxuICB0cml2aWFsQ29tcGFyYXRvclxuKTskaM2PX29uY2UuYmFnQ29tcGFyZShiYWdDb21wYXJlKTtcbmhhcmRlbihiYWdDb21wYXJlKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8qXG5cblxuICovXG5jb25zdCBBQlNFTlQgPSBTeW1ib2woJ2Fic2VudCcpO1xuLypcblxuXG5cblxuXG5cbiAqL1xuLy9cbmNvbnN0IF9tYXBDb21wYXJlID0gbWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuICBnZXRDb3B5TWFwRW50cnlBcnJheSxcbiAgQUJTRU5ULFxuICAobGVmdFZhbHVlLCByaWdodFZhbHVlKSA9PiB7XG4gICAgaWYgKGxlZnRWYWx1ZSA9PT0gQUJTRU5UICYmIHJpZ2h0VmFsdWUgPT09IEFCU0VOVCkge1xuICAgICAgdGhyb3cgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBhYnNlbnQgZW50cnkgcGFpcmA7XG4gICAgfSBlbHNlIGlmIChsZWZ0VmFsdWUgPT09IEFCU0VOVCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gZWxzZSBpZiAocmlnaHRWYWx1ZSA9PT0gQUJTRU5UKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjb21wYXJlS2V5cyhsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpO1xuICAgIH1cbiAgfVxuKTtcbmhhcmRlbihfbWFwQ29tcGFyZSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNvbXBhcmVLZXlzID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGFzc2VydEtleShsZWZ0KTtcbiAgYXNzZXJ0S2V5KHJpZ2h0KTtcbiAgY29uc3QgbGVmdFN0eWxlID0gcGFzc1N0eWxlT2YobGVmdCk7XG4gIGNvbnN0IHJpZ2h0U3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodCk7XG4gIGlmIChsZWZ0U3R5bGUgIT09IHJpZ2h0U3R5bGUpIHtcbiAgICAvL1xuICAgIHJldHVybiBOYU47XG4gIH1cbiAgc3dpdGNoIChsZWZ0U3R5bGUpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgIGNhc2UgJ251bGwnOlxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdzeW1ib2wnOntcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICBjYXNlICdudW1iZXInOntcbiAgICAgICAgY29uc3QgcmFua0NvbXAgPSBjb21wYXJlUmFuayhsZWZ0LCByaWdodCk7XG4gICAgICAgIGlmIChyYW5rQ29tcCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4obGVmdCkgfHwgTnVtYmVyLmlzTmFOKHJpZ2h0KSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgYXNzZXJ0KCFOdW1iZXIuaXNOYU4obGVmdCkgfHwgIU51bWJlci5pc05hTihyaWdodCkpO1xuICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHJhbmtDb21wO1xuICAgICAgfVxuICAgIGNhc2UgJ3JlbW90YWJsZSc6e1xuICAgICAgICBpZiAobGVmdCA9PT0gcmlnaHQpIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6e1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyZUtleXMobGVmdFtpXSwgcmlnaHRbaV0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBjb21wYXJlUmFuayhsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICBjYXNlICdjb3B5UmVjb3JkJzp7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGxlZnROYW1lcyA9IHJlY29yZE5hbWVzKGxlZnQpO1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCByaWdodE5hbWVzID0gcmVjb3JkTmFtZXMocmlnaHQpO1xuXG4gICAgICAgIC8vXG4gICAgICAgIGlmICgha2V5RVEobGVmdE5hbWVzLCByaWdodE5hbWVzKSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGxlZnRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMobGVmdCwgbGVmdE5hbWVzKTtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgcmlnaHRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMocmlnaHQsIHJpZ2h0TmFtZXMpO1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWZ0VmFsdWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgY29tcCA9IGNvbXBhcmVLZXlzKGxlZnRWYWx1ZXNbaV0sIHJpZ2h0VmFsdWVzW2ldKTtcbiAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGNvbXApKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ICE9PSBjb21wICYmIGNvbXAgIT09IDApIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IDApIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgICAocmVzdWx0ID09PSAtMSAmJiBjb21wID09PSAxKSB8fCAocmVzdWx0ID09PSAxICYmIGNvbXAgPT09IC0xKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIGNhc2UgJ3RhZ2dlZCc6e1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBsZWZ0VGFnID0gZ2V0VGFnKGxlZnQpO1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCByaWdodFRhZyA9IGdldFRhZyhyaWdodCk7XG4gICAgICAgIGlmIChsZWZ0VGFnICE9PSByaWdodFRhZykge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKGxlZnRUYWcpIHtcbiAgICAgICAgICBjYXNlICdjb3B5U2V0Jzp7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIHJldHVybiBzZXRDb21wYXJlKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdjb3B5QmFnJzp7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIHJldHVybiBiYWdDb21wYXJlKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdjb3B5TWFwJzp7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIHRocm93IEZhaWxgTWFwIGNvbXBhcmlzb24gbm90IHlldCBpbXBsZW1lbnRlZDogJHtsZWZ0fSB2cyAke3JpZ2h0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDp7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgdW5leHBlY3RlZCB0YWcgJHtxKGxlZnRUYWcpfTogJHtsZWZ0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBkZWZhdWx0OntcbiAgICAgICAgdGhyb3cgRmFpbGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EobGVmdFN0eWxlKX06ICR7bGVmdH1gO1xuICAgICAgfVxuICB9XG59OyRozY9fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG5jb25zdCBrZXlMVCA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpIDwgMDskaM2PX29uY2Uua2V5TFQoa2V5TFQpO1xuaGFyZGVuKGtleUxUKTtcblxuY29uc3Qga2V5TFRFID0gKGxlZnQsIHJpZ2h0KSA9PiBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPD0gMDskaM2PX29uY2Uua2V5TFRFKGtleUxURSk7XG5oYXJkZW4oa2V5TFRFKTtcblxuY29uc3Qga2V5RVEgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA9PT0gMDskaM2PX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuY29uc3Qga2V5R1RFID0gKGxlZnQsIHJpZ2h0KSA9PiBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPj0gMDskaM2PX29uY2Uua2V5R1RFKGtleUdURSk7XG5oYXJkZW4oa2V5R1RFKTtcblxuY29uc3Qga2V5R1QgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA+IDA7JGjNj19vbmNlLmtleUdUKGtleUdUKTtcbmhhcmRlbihrZXlHVCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiXSwiYmFnQ29tcGFyZSI6WyJiYWdDb21wYXJlIl0sImNvbXBhcmVLZXlzIjpbImNvbXBhcmVLZXlzIl0sImtleUxUIjpbImtleUxUIl0sImtleUxURSI6WyJrZXlMVEUiXSwia2V5RVEiOlsia2V5RVEiXSwia2V5R1RFIjpbImtleUdURSJdLCJrZXlHVCI6WyJrZXlHVCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAhsRU2wQ4AAMEOAAApAAAAQGVuZG8vcGF0dGVybnMtdjEuNC44L3NyYy9rZXlzL2NvcHlCYWcuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydEJhZ0VudHJpZXMiLCJhc3NlcnROb0R1cGxpY2F0ZUtleXMiLCJjaGVja0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiLCJtYWtlQmFnT2ZFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlS2V5cyA9IChiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSwgY2hlY2spID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgZnVsbENvbXBhcmUgPSBmdWxsQ29tcGFyZSB8fCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGJhZ0VudHJpZXMgPSBzb3J0QnlSYW5rKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGJhZ0VudHJpZXM7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBrMCA9IGJhZ0VudHJpZXNbaSAtIDFdWzBdO1xuICAgIGNvbnN0IGsxID0gYmFnRW50cmllc1tpXVswXTtcbiAgICBpZiAoZnVsbENvbXBhcmUoazAsIGsxKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYHZhbHVlIGhhcyBkdXBsaWNhdGUga2V5czogJHtrMH1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydE5vRHVwbGljYXRlS2V5cyA9IChiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSwgYXNzZXJ0Q2hlY2tlcik7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmFzc2VydE5vRHVwbGljYXRlS2V5cyhhc3NlcnROb0R1cGxpY2F0ZUtleXMpO1xuY29uc3QgY2hlY2tCYWdFbnRyaWVzID0gKGJhZ0VudHJpZXMsIGNoZWNrKSA9PiB7XG4gIGlmIChwYXNzU3R5bGVPZihiYWdFbnRyaWVzKSAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7YmFnRW50cmllc31gXG4gICAgKTtcbiAgfVxuICBpZiAoIWlzUmFua1NvcnRlZChiYWdFbnRyaWVzLCBjb21wYXJlQW50aVJhbmspKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7YmFnRW50cmllc31gXG4gICAgKTtcbiAgfVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGJhZ0VudHJpZXMpIHtcbiAgICBpZiAoXG4gICAgcGFzc1N0eWxlT2YoZW50cnkpICE9PSAnY29weUFycmF5JyB8fFxuICAgIGVudHJ5Lmxlbmd0aCAhPT0gMiB8fFxuICAgIHR5cGVvZiBlbnRyeVsxXSAhPT0gJ2JpZ2ludCcpXG4gICAge1xuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGJlIHBhaXIgb2YgYSBrZXkgYW5kIGEgYmlnaW50IHJlcHJlc2VudGluZyBhIGNvdW50OiAke2VudHJ5fWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChlbnRyeVsxXSA8IDEpIHtcbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBoYXZlIGEgcG9zaXRpdmUgY291bnQ6ICR7ZW50cnl9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLy9cbiAgcmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsIHVuZGVmaW5lZCwgY2hlY2spO1xufTskaM2PX29uY2UuY2hlY2tCYWdFbnRyaWVzKGNoZWNrQmFnRW50cmllcyk7XG5oYXJkZW4oY2hlY2tCYWdFbnRyaWVzKTtcblxuLy9cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRCYWdFbnRyaWVzID0gKGJhZ0VudHJpZXMpID0+IHtcbiAgY2hlY2tCYWdFbnRyaWVzKGJhZ0VudHJpZXMsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0QmFnRW50cmllcyhhc3NlcnRCYWdFbnRyaWVzKTtcbmhhcmRlbihhc3NlcnRCYWdFbnRyaWVzKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNvZXJjZVRvQmFnRW50cmllcyA9IChiYWdFbnRyaWVzTGlzdCkgPT4ge1xuICBjb25zdCBiYWdFbnRyaWVzID0gc29ydEJ5UmFuayhiYWdFbnRyaWVzTGlzdCwgY29tcGFyZUFudGlSYW5rKTtcbiAgYXNzZXJ0QmFnRW50cmllcyhiYWdFbnRyaWVzKTtcbiAgcmV0dXJuIGJhZ0VudHJpZXM7XG59OyRozY9fb25jZS5jb2VyY2VUb0JhZ0VudHJpZXMoY29lcmNlVG9CYWdFbnRyaWVzKTtcbmhhcmRlbihjb2VyY2VUb0JhZ0VudHJpZXMpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlQmFnT2ZFbnRyaWVzID0gKGJhZ0VudHJ5SXRlcikgPT5cbm1ha2VUYWdnZWQoJ2NvcHlCYWcnLCBjb2VyY2VUb0JhZ0VudHJpZXMoYmFnRW50cnlJdGVyKSk7JGjNj19vbmNlLm1ha2VCYWdPZkVudHJpZXMobWFrZUJhZ09mRW50cmllcyk7XG5oYXJkZW4obWFrZUJhZ09mRW50cmllcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIl0sImNoZWNrQmFnRW50cmllcyI6WyJjaGVja0JhZ0VudHJpZXMiXSwiYXNzZXJ0QmFnRW50cmllcyI6WyJhc3NlcnRCYWdFbnRyaWVzIl0sImNvZXJjZVRvQmFnRW50cmllcyI6WyJjb2VyY2VUb0JhZ0VudHJpZXMiXSwibWFrZUJhZ09mRW50cmllcyI6WyJtYWtlQmFnT2ZFbnRyaWVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFY4YnlaDAAAWgwAACkAAABAZW5kby9wYXR0ZXJucy12MS40Ljgvc3JjL2tleXMvY29weVNldC5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0RWxlbWVudHMiLCJhc3NlcnROb0R1cGxpY2F0ZXMiLCJjaGVja0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyIsIm1ha2VTZXRPZkVsZW1lbnRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlcyA9IChlbGVtZW50cywgZnVsbENvbXBhcmUsIGNoZWNrKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGZ1bGxDb21wYXJlID0gZnVsbENvbXBhcmUgfHwgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuICBlbGVtZW50cyA9IHNvcnRCeVJhbmsoZWxlbWVudHMsIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGVsZW1lbnRzO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgazAgPSBlbGVtZW50c1tpIC0gMV07XG4gICAgY29uc3QgazEgPSBlbGVtZW50c1tpXTtcbiAgICBpZiAoZnVsbENvbXBhcmUoazAsIGsxKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYHZhbHVlIGhhcyBkdXBsaWNhdGUga2V5czogJHtrMH1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydE5vRHVwbGljYXRlcyA9IChlbGVtZW50cywgZnVsbENvbXBhcmUgPSB1bmRlZmluZWQpID0+IHtcbiAgY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsIGZ1bGxDb21wYXJlLCBhc3NlcnRDaGVja2VyKTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVzKGFzc2VydE5vRHVwbGljYXRlcyk7XG5jb25zdCBjaGVja0VsZW1lbnRzID0gKGVsZW1lbnRzLCBjaGVjaykgPT4ge1xuICBpZiAocGFzc1N0eWxlT2YoZWxlbWVudHMpICE9PSAnY29weUFycmF5Jykge1xuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGZhbHNlLFxuICAgICAgWGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIGEgY29weUFycmF5OiAke2VsZW1lbnRzfWBcbiAgICApO1xuICB9XG4gIGlmICghaXNSYW5rU29ydGVkKGVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmspKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtlbGVtZW50c31gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsIHVuZGVmaW5lZCwgY2hlY2spO1xufTskaM2PX29uY2UuY2hlY2tFbGVtZW50cyhjaGVja0VsZW1lbnRzKTtcbmhhcmRlbihjaGVja0VsZW1lbnRzKTtcblxuY29uc3QgYXNzZXJ0RWxlbWVudHMgPSAoZWxlbWVudHMpID0+IHtcbiAgY2hlY2tFbGVtZW50cyhlbGVtZW50cywgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRFbGVtZW50cyhhc3NlcnRFbGVtZW50cyk7XG5oYXJkZW4oYXNzZXJ0RWxlbWVudHMpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgY29lcmNlVG9FbGVtZW50cyA9IChlbGVtZW50c0xpc3QpID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBzb3J0QnlSYW5rKGVsZW1lbnRzTGlzdCwgY29tcGFyZUFudGlSYW5rKTtcbiAgYXNzZXJ0RWxlbWVudHMoZWxlbWVudHMpO1xuICByZXR1cm4gZWxlbWVudHM7XG59OyRozY9fb25jZS5jb2VyY2VUb0VsZW1lbnRzKGNvZXJjZVRvRWxlbWVudHMpO1xuaGFyZGVuKGNvZXJjZVRvRWxlbWVudHMpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlU2V0T2ZFbGVtZW50cyA9IChlbGVtZW50SXRlcikgPT5cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLCBjb2VyY2VUb0VsZW1lbnRzKGVsZW1lbnRJdGVyKSk7JGjNj19vbmNlLm1ha2VTZXRPZkVsZW1lbnRzKG1ha2VTZXRPZkVsZW1lbnRzKTtcbmhhcmRlbihtYWtlU2V0T2ZFbGVtZW50cyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVzIl0sImNoZWNrRWxlbWVudHMiOlsiY2hlY2tFbGVtZW50cyJdLCJhc3NlcnRFbGVtZW50cyI6WyJhc3NlcnRFbGVtZW50cyJdLCJjb2VyY2VUb0VsZW1lbnRzIjpbImNvZXJjZVRvRWxlbWVudHMiXSwibWFrZVNldE9mRWxlbWVudHMiOlsibWFrZVNldE9mRWxlbWVudHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdU+R0x0WAAAdFgAAOQAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vY29tbW9uL21ha2UtaXRlcmF0b3IuanMiLCJAZW5kby9jb21tb24vbWFrZS1hcnJheS1pdGVyYXRvci5qcyIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIiwibWFrZUNvbXBhcmVDb2xsZWN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxtYWtlSXRlcmF0b3IsbWFrZUFycmF5SXRlcmF0b3IscSxGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUl0ZXJhdG9yXCIsWyRozY9fYSA9PiAobWFrZUl0ZXJhdG9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL21ha2UtYXJyYXktaXRlcmF0b3IuanNcIiwgW1tcIm1ha2VBcnJheUl0ZXJhdG9yXCIsWyRozY9fYSA9PiAobWFrZUFycmF5SXRlcmF0b3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyA9IChlbnRyaWVzLCByYW5rQ29tcGFyZSwgZnVsbENvbXBhcmUpID0+IHtcbiAgLy9cbiAgYXNzZXJ0UmFua1NvcnRlZChlbnRyaWVzLCByYW5rQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBlbnRyaWVzO1xuICBsZXQgaSA9IDA7XG4gIGxldCBzYW1lUmFua0l0ZXJhdG9yO1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHtcbiAgICBpZiAoc2FtZVJhbmtJdGVyYXRvcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gc2FtZVJhbmtJdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoIXJlc3VsdC5kb25lKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBzYW1lUmFua0l0ZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldO1xuICAgICAgLy9cbiAgICAgIGxldCBqID0gaSArIDE7XG4gICAgICB3aGlsZSAoaiA8IGxlbmd0aCAmJiByYW5rQ29tcGFyZShlbnRyeVswXSwgZW50cmllc1tqXVswXSkgPT09IDApIHtcbiAgICAgICAgaiArPSAxO1xuICAgICAgfVxuICAgICAgaWYgKGogPT09IGkgKyAxKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGkgPSBqO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBlbnRyeSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRpZXMgPSBlbnRyaWVzLnNsaWNlKGksIGopO1xuICAgICAgaSA9IGo7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHNvcnRlZFRpZXMgPSBzb3J0QnlSYW5rKHRpZXMsIGZ1bGxDb21wYXJlKTtcbiAgICAgIGZvciAobGV0IGsgPSAxOyBrIDwgc29ydGVkVGllcy5sZW5ndGg7IGsgKz0gMSkge1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBba2V5MF0gPSBzb3J0ZWRUaWVzW2sgLSAxXTtcbiAgICAgICAgY29uc3QgW2tleTFdID0gc29ydGVkVGllc1trXTtcbiAgICAgICAgTWF0aC5zaWduKGZ1bGxDb21wYXJlKGtleTAsIGtleTEpKSB8fFxuICAgICAgICBGYWlsYER1cGxpY2F0ZSBlbnRyeSBrZXk6ICR7a2V5MH1gO1xuICAgICAgfVxuICAgICAgc2FtZVJhbmtJdGVyYXRvciA9IG1ha2VBcnJheUl0ZXJhdG9yKHNvcnRlZFRpZXMpO1xuICAgICAgcmV0dXJuIHNhbWVSYW5rSXRlcmF0b3IubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgfSk7XG59O1xuaGFyZGVuKGdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyA9IChcbmMxLFxuYzIsXG5nZXRFbnRyaWVzLFxuYWJzZW50VmFsdWUpID0+XG57XG4gIGNvbnN0IGUxID0gZ2V0RW50cmllcyhjMSk7XG4gIGNvbnN0IGUyID0gZ2V0RW50cmllcyhjMik7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuICBjb25zdCB4ID0gZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyhlMSwgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHkgPSBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKGUyLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcblxuICAvL1xuICAvL1xuICBsZXQgeERvbmU7XG4gIGxldCB4S2V5O1xuICBsZXQgeFZhbHVlO1xuICBsZXQgeURvbmU7XG4gIGxldCB5S2V5O1xuICBsZXQgeVZhbHVlO1xuICBjb25zdCBub25FbnRyeSA9IFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG4gIGNvbnN0IG5leHRYID0gKCkgPT4ge1xuICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICBjb25zdCByZXN1bHQgPSB4VmFsdWU7XG4gICAgKCgoeyBkb25lOiB4RG9uZSwgdmFsdWU6IFt4S2V5LCB4VmFsdWVdID0gbm9uRW50cnkgfSA9IHgubmV4dCgpKSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG5leHRYKCk7XG4gIGNvbnN0IG5leHRZID0gKCkgPT4ge1xuICAgICF5RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WSBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICBjb25zdCByZXN1bHQgPSB5VmFsdWU7XG4gICAgKCgoeyBkb25lOiB5RG9uZSwgdmFsdWU6IFt5S2V5LCB5VmFsdWVdID0gbm9uRW50cnkgfSA9IHkubmV4dCgpKSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG5leHRZKCk7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4ge1xuICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgbGV0IHZhbHVlO1xuICAgIGlmICh4RG9uZSAmJiB5RG9uZSkge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICB2YWx1ZSA9IFt1bmRlZmluZWQsIGFic2VudFZhbHVlLCBhYnNlbnRWYWx1ZV07XG4gICAgfSBlbHNlIGlmICh4RG9uZSkge1xuICAgICAgdmFsdWUgPSBbeUtleSwgYWJzZW50VmFsdWUsIG5leHRZKCldO1xuICAgIH0gZWxzZSBpZiAoeURvbmUpIHtcbiAgICAgIHZhbHVlID0gW3hLZXksIG5leHRYKCksIGFic2VudFZhbHVlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCBjb21wID0gZnVsbENvbXBhcmUoeEtleSwgeUtleSk7XG4gICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICB2YWx1ZSA9IFt4S2V5LCBuZXh0WCgpLCBuZXh0WSgpXTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgdmFsdWUgPSBbeEtleSwgbmV4dFgoKSwgYWJzZW50VmFsdWVdO1xuICAgICAgfSBlbHNlIGlmIChjb21wID4gMCkge1xuICAgICAgICB2YWx1ZSA9IFt5S2V5LCBhYnNlbnRWYWx1ZSwgbmV4dFkoKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBGYWlsYFVuZXhwZWN0ZWQga2V5IGNvbXBhcmlzb24gJHtxKGNvbXApfSBmb3IgJHt4S2V5fSB2cyAke3lLZXl9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmUsIHZhbHVlIH0pO1xuICB9KTtcbn07JGjNj19vbmNlLmdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKTtcbmhhcmRlbihnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlQ29tcGFyZUNvbGxlY3Rpb24gPSAoZ2V0RW50cmllcywgYWJzZW50VmFsdWUsIGNvbXBhcmVWYWx1ZXMpID0+XG5oYXJkZW4oKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGNvbnN0IG1lcmdlZCA9IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKFxuICAgIGxlZnQsXG4gICAgcmlnaHQsXG4gICAgZ2V0RW50cmllcyxcbiAgICBhYnNlbnRWYWx1ZVxuICApO1xuICBsZXQgbGVmdElzQmlnZ2VyID0gZmFsc2U7XG4gIGxldCByaWdodElzQmlnZ2VyID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW19rZXksIGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZV0gb2YgbWVyZ2VkKSB7XG4gICAgY29uc3QgY29tcCA9IGNvbXBhcmVWYWx1ZXMobGVmdFZhbHVlLCByaWdodFZhbHVlKTtcbiAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgLy9cbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgIC8vXG4gICAgICByaWdodElzQmlnZ2VyID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGNvbXAgPiAwKSB7XG4gICAgICAvL1xuICAgICAgbGVmdElzQmlnZ2VyID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgTnVtYmVyLmlzTmFOKGNvbXApIHx8XG4gICAgICAvL1xuICAgICAgRmFpbGBVbmV4cGVjdGVkIHZhbHVlIGNvbXBhcmlzb24gJHtxKGNvbXApfSBmb3IgJHtsZWZ0VmFsdWV9IHZzICR7cmlnaHRWYWx1ZX1gO1xuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG4gICAgaWYgKGxlZnRJc0JpZ2dlciAmJiByaWdodElzQmlnZ2VyKSB7XG4gICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgfVxuICAvL1xuICByZXR1cm4gbGVmdElzQmlnZ2VyID8gMSA6IHJpZ2h0SXNCaWdnZXIgPyAtMSA6IDA7XG59KTskaM2PX29uY2UubWFrZUNvbXBhcmVDb2xsZWN0aW9uKG1ha2VDb21wYXJlQ29sbGVjdGlvbik7XG5oYXJkZW4obWFrZUNvbXBhcmVDb2xsZWN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIjpbImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIl0sIm1ha2VDb21wYXJlQ29sbGVjdGlvbiI6WyJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEONRgSEcAAAhHAAANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNEaXNqb2ludCIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmsscSxGYWlsLGFzc2VydE5vRHVwbGljYXRlS2V5cyxtYWtlQmFnT2ZFbnRyaWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZUtleXNcIixbJGjNj19hID0+IChhc3NlcnROb0R1cGxpY2F0ZUtleXMgPSAkaM2PX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLFskaM2PX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGJhZ1dpbmRvd1Jlc29ydCA9IChiYWdFbnRyaWVzLCByYW5rQ29tcGFyZSwgZnVsbENvbXBhcmUpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChiYWdFbnRyaWVzLCByYW5rQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBiYWdFbnRyaWVzO1xuICBsZXQgaSA9IDA7XG4gIGxldCBvcHRJbm5lckl0ZXJhdG9yO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT5cbiAgICBoYXJkZW4oe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICBpZiAob3B0SW5uZXJJdGVyYXRvcikge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBiYWdFbnRyaWVzW2ldO1xuICAgICAgICAgIGxldCBqID0gaSArIDE7XG4gICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgIGogPCBsZW5ndGggJiZcbiAgICAgICAgICByYW5rQ29tcGFyZShlbnRyeVswXSwgYmFnRW50cmllc1tqXVswXSkgPT09IDApXG4gICAgICAgICAge1xuICAgICAgICAgICAgaiArPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogZW50cnkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNpbWlsYXJSdW4gPSBiYWdFbnRyaWVzLnNsaWNlKGksIGopO1xuICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgIGNvbnN0IHJlc29ydGVkID0gc29ydEJ5UmFuayhzaW1pbGFyUnVuLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKHJlc29ydGVkLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIG9wdElubmVySXRlcmF0b3IgPSByZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgICAgcmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogW251bGwsIDBuXSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1lcmdlID0gKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgY29uc3QgeHMgPSBiYWdXaW5kb3dSZXNvcnQoeGJhZ0VudHJpZXMsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB5cyA9IGJhZ1dpbmRvd1Jlc29ydCh5YmFnRW50cmllcywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvKiAgICAgICAgICAgICovXG4gICAgICBsZXQgeDtcbiAgICAgIGxldCB4YztcbiAgICAgIGxldCB4RG9uZTtcbiAgICAgIC8qICAgICAgICAgICAgKi9cbiAgICAgIGxldCB5O1xuICAgICAgbGV0IHljO1xuICAgICAgbGV0IHlEb25lO1xuXG4gICAgICBjb25zdCB4aSA9IHhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IG5leHRYID0gKCkgPT4ge1xuICAgICAgICAheERvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICAgICAgKCgoe1xuICAgICAgICAgIGRvbmU6IHhEb25lLFxuICAgICAgICAgIHZhbHVlOiBbeCwgeGNdXG4gICAgICAgIH0gPSB4aS5uZXh0KCkpKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFgoKTtcblxuICAgICAgY29uc3QgeWkgPSB5c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBuZXh0WSA9ICgpID0+IHtcbiAgICAgICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgICAgICgoKHtcbiAgICAgICAgICBkb25lOiB5RG9uZSxcbiAgICAgICAgICB2YWx1ZTogW3ksIHljXVxuICAgICAgICB9ID0geWkubmV4dCgpKSkpO1xuICAgICAgfTtcbiAgICAgIG5leHRZKCk7XG5cbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgaWYgKHhEb25lICYmIHlEb25lKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB2YWx1ZSA9IFtudWxsLCAwbiwgMG5dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeERvbmUpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB2YWx1ZSA9IFt5LCAwbiwgeWNdO1xuICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHlEb25lKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIDBuXTtcbiAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBmdWxsQ29tcGFyZSh4LCB5KTtcbiAgICAgICAgICAgIGlmIChjb21wID09PSAwKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIHZhbHVlID0gW3gsIHhjLCB5Y107XG4gICAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIHZhbHVlID0gW3gsIHhjLCAwbl07XG4gICAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBjb21wID4gMCB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG4gICAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCB5Y107XG4gICAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lLCB2YWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn07XG5oYXJkZW4obWVyZ2UpO1xuXG4vL1xuLy9cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc1N1cGVyYmFnID0gKHh5aSkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPCB5Yykge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vL1xuLy9cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc0Rpc2pvaW50ID0gKHh5aSkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMW4gJiYgeWMgPj0gMW4pIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYmFnSXRlclVuaW9uID0gKHh5aSkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgcmVzdWx0LnB1c2goW20sIHhjICsgeWNdKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYmFnSXRlckludGVyc2VjdGlvbiA9ICh4eWkpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGNvbnN0IG1jID0geGMgPD0geWMgPyB4YyA6IHljO1xuICAgIHJlc3VsdC5wdXNoKFttLCBtY10pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdCA9ICh4eWkpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGNvbnN0IG1jID0geGMgLSB5YztcbiAgICBtYyA+PSAwbiB8fCBGYWlsYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuICAgIGlmIChtYyA+PSAxbikge1xuICAgICAgLy9cbiAgICAgIHJlc3VsdC5wdXNoKFttLCBtY10pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgbWVyZ2VpZnkgPSAoYmFnSXRlck9wKSA9PiAoeGJhZ0VudHJpZXMsIHliYWdFbnRyaWVzKSA9PlxuYmFnSXRlck9wKG1lcmdlKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykpO1xuXG5jb25zdCBiYWdFbnRyaWVzSXNTdXBlcmJhZyA9IG1lcmdlaWZ5KGJhZ0l0ZXJJc1N1cGVyYmFnKTtcbmNvbnN0IGJhZ0VudHJpZXNJc0Rpc2pvaW50ID0gbWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uID0gbWVyZ2VpZnkoYmFnSXRlclVuaW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24gPSBtZXJnZWlmeShiYWdJdGVySW50ZXJzZWN0aW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0ID0gbWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnkgPSAoYmFnRW50cmllc09wKSA9PiAoeGJhZywgeWJhZykgPT5cbmJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQsIHliYWcucGF5bG9hZCk7XG5cbmNvbnN0IGJhZ2lmeSA9IChiYWdFbnRyaWVzT3ApID0+ICh4YmFnLCB5YmFnKSA9PlxubWFrZUJhZ09mRW50cmllcyhiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLCB5YmFnLnBheWxvYWQpKTtcblxuY29uc3QgYmFnSXNTdXBlcmJhZyA9IHJhd0JhZ2lmeShiYWdFbnRyaWVzSXNTdXBlcmJhZyk7JGjNj19vbmNlLmJhZ0lzU3VwZXJiYWcoYmFnSXNTdXBlcmJhZyk7XG5jb25zdCBiYWdJc0Rpc2pvaW50ID0gcmF3QmFnaWZ5KGJhZ0VudHJpZXNJc0Rpc2pvaW50KTskaM2PX29uY2UuYmFnSXNEaXNqb2ludChiYWdJc0Rpc2pvaW50KTtcbmNvbnN0IGJhZ1VuaW9uID0gYmFnaWZ5KGJhZ0VudHJpZXNVbmlvbik7JGjNj19vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbmNvbnN0IGJhZ0ludGVyc2VjdGlvbiA9IGJhZ2lmeShiYWdFbnRyaWVzSW50ZXJzZWN0aW9uKTskaM2PX29uY2UuYmFnSW50ZXJzZWN0aW9uKGJhZ0ludGVyc2VjdGlvbik7XG5jb25zdCBiYWdEaXNqb2ludFN1YnRyYWN0ID0gYmFnaWZ5KGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2UuYmFnRGlzam9pbnRTdWJ0cmFjdChiYWdEaXNqb2ludFN1YnRyYWN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyJdLCJiYWdJc0Rpc2pvaW50IjpbImJhZ0lzRGlzam9pbnQiXSwiYmFnVW5pb24iOlsiYmFnVW5pb24iXSwiYmFnSW50ZXJzZWN0aW9uIjpbImJhZ0ludGVyc2VjdGlvbiJdLCJiYWdEaXNqb2ludFN1YnRyYWN0IjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAhs/QG64iAACuIgAANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlTZXQuanMiXSwiZXhwb3J0cyI6WyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzVW5pb24iLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLHEsRmFpbCxhc3NlcnROb0R1cGxpY2F0ZXMsbWFrZVNldE9mRWxlbWVudHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlc1wiLFskaM2PX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlcyA9ICRozY9fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLFskaM2PX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHdpbmRvd1Jlc29ydCA9IChlbGVtZW50cywgcmFua0NvbXBhcmUsIGZ1bGxDb21wYXJlKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoZWxlbWVudHMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGVsZW1lbnRzO1xuICBsZXQgaSA9IDA7XG4gIGxldCBvcHRJbm5lckl0ZXJhdG9yO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT5cbiAgICBoYXJkZW4oe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICBpZiAob3B0SW5uZXJJdGVyYXRvcikge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50c1tpXTtcbiAgICAgICAgICBsZXQgaiA9IGkgKyAxO1xuICAgICAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICYmIHJhbmtDb21wYXJlKHZhbHVlLCBlbGVtZW50c1tqXSkgPT09IDApIHtcbiAgICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGogPT09IGkgKyAxKSB7XG4gICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNpbWlsYXJSdW4gPSBlbGVtZW50cy5zbGljZShpLCBqKTtcbiAgICAgICAgICBpID0gajtcbiAgICAgICAgICBjb25zdCByZXNvcnRlZCA9IHNvcnRCeVJhbmsoc2ltaWxhclJ1biwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlcyhyZXNvcnRlZCwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gcmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICAgIHJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtZXJnZSA9ICh4ZWxlbWVudHMsIHllbGVtZW50cykgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgY29uc3QgeHMgPSB3aW5kb3dSZXNvcnQoeGVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeXMgPSB3aW5kb3dSZXNvcnQoeWVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8qICAgICAgICAgICAgKi9cbiAgICAgIGxldCB4O1xuICAgICAgbGV0IHhEb25lO1xuICAgICAgLyogICAgICAgICAgICAqL1xuICAgICAgbGV0IHk7XG4gICAgICBsZXQgeURvbmU7XG5cbiAgICAgIGNvbnN0IHhpID0geHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoKCh7IGRvbmU6IHhEb25lLCB2YWx1ZTogeCB9ID0geGkubmV4dCgpKSkpO1xuICAgICAgfTtcbiAgICAgIG5leHRYKCk7XG5cbiAgICAgIGNvbnN0IHlpID0geXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFkgPSAoKSA9PiB7XG4gICAgICAgICF5RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoKCh7IGRvbmU6IHlEb25lLCB2YWx1ZTogeSB9ID0geWkubmV4dCgpKSkpO1xuICAgICAgfTtcbiAgICAgIG5leHRZKCk7XG5cbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgaWYgKHhEb25lICYmIHlEb25lKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB2YWx1ZSA9IFtudWxsLCAwbiwgMG5dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeERvbmUpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB2YWx1ZSA9IFt5LCAwbiwgMW5dO1xuICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHlEb25lKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgdmFsdWUgPSBbeCwgMW4sIDBuXTtcbiAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBmdWxsQ29tcGFyZSh4LCB5KTtcbiAgICAgICAgICAgIGlmIChjb21wID09PSAwKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIHZhbHVlID0gW3gsIDFuLCAxbl07XG4gICAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIHZhbHVlID0gW3gsIDFuLCAwbl07XG4gICAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBjb21wID4gMCB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG4gICAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCAxbl07XG4gICAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lLCB2YWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn07XG5oYXJkZW4obWVyZ2UpO1xuXG5jb25zdCBpdGVySXNTdXBlcnNldCA9ICh4eWkpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCBfeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA9PT0gMG4pIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXRlcklzRGlzam9pbnQgPSAoeHlpKSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA+PSAxbiAmJiB5YyA+PSAxbikge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVyQ29tcGFyZSA9ICh4eWkpID0+IHtcbiAgbGV0IGxvbmVZID0gZmFsc2U7XG4gIGxldCBsb25lWCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPT09IDBuKSB7XG4gICAgICAvL1xuICAgICAgbG9uZVkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoeWMgPT09IDBuKSB7XG4gICAgICAvL1xuICAgICAgbG9uZVggPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobG9uZVggJiYgbG9uZVkpIHtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICB9XG4gIGlmIChsb25lWCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2UgaWYgKGxvbmVZKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2Uge1xuICAgICghbG9uZVggJiYgIWxvbmVZKSB8fFxuICAgIEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsIGxvbmVZXSl9YDtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXRlclVuaW9uID0gKHh5aSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMG4pIHtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB5YyA+PSAwbiB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVyRGlzam9pbnRVbmlvbiA9ICh4eWkpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgeGMgPT09IDBuIHx8IHljID09PSAwbiB8fCBGYWlsYFNldHMgbXVzdCBub3QgaGF2ZSBjb21tb24gZWxlbWVudHM6ICR7bX1gO1xuICAgIGlmICh4YyA+PSAxbikge1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHljID49IDFuIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVySW50ZXJzZWN0aW9uID0gKHh5aSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMW4gJiYgeWMgPj0gMW4pIHtcbiAgICAgIC8vXG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFN1YnRyYWN0ID0gKHh5aSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICB4YyA+PSAxbiB8fCBGYWlsYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuICAgIGlmICh5YyA9PT0gMG4pIHtcbiAgICAgIC8vXG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IG1lcmdlaWZ5ID0gKGl0ZXJPcCkgPT4gKHhlbGVtZW50cywgeWVsZW1lbnRzKSA9PlxuaXRlck9wKG1lcmdlKHhlbGVtZW50cywgeWVsZW1lbnRzKSk7XG5cbmNvbnN0IGVsZW1lbnRzSXNTdXBlcnNldCA9IG1lcmdlaWZ5KGl0ZXJJc1N1cGVyc2V0KTskaM2PX29uY2UuZWxlbWVudHNJc1N1cGVyc2V0KGVsZW1lbnRzSXNTdXBlcnNldCk7XG5jb25zdCBlbGVtZW50c0lzRGlzam9pbnQgPSBtZXJnZWlmeShpdGVySXNEaXNqb2ludCk7JGjNj19vbmNlLmVsZW1lbnRzSXNEaXNqb2ludChlbGVtZW50c0lzRGlzam9pbnQpO1xuY29uc3QgZWxlbWVudHNDb21wYXJlID0gbWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRozY9fb25jZS5lbGVtZW50c0NvbXBhcmUoZWxlbWVudHNDb21wYXJlKTtcbmNvbnN0IGVsZW1lbnRzVW5pb24gPSBtZXJnZWlmeShpdGVyVW5pb24pOyRozY9fb25jZS5lbGVtZW50c1VuaW9uKGVsZW1lbnRzVW5pb24pO1xuY29uc3QgZWxlbWVudHNEaXNqb2ludFVuaW9uID0gbWVyZ2VpZnkoaXRlckRpc2pvaW50VW5pb24pOyRozY9fb25jZS5lbGVtZW50c0Rpc2pvaW50VW5pb24oZWxlbWVudHNEaXNqb2ludFVuaW9uKTtcbmNvbnN0IGVsZW1lbnRzSW50ZXJzZWN0aW9uID0gbWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjNj19vbmNlLmVsZW1lbnRzSW50ZXJzZWN0aW9uKGVsZW1lbnRzSW50ZXJzZWN0aW9uKTtcbmNvbnN0IGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9IG1lcmdlaWZ5KGl0ZXJEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2UuZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd1NldGlmeSA9IChlbGVtZW50c09wKSA9PiAoeHNldCwgeXNldCkgPT5cbmVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLCB5c2V0LnBheWxvYWQpO1xuXG5jb25zdCBzZXRpZnkgPSAoZWxlbWVudHNPcCkgPT4gKHhzZXQsIHlzZXQpID0+XG5tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50c09wKHhzZXQucGF5bG9hZCwgeXNldC5wYXlsb2FkKSk7XG5cbmNvbnN0IHNldElzU3VwZXJzZXQgPSByYXdTZXRpZnkoZWxlbWVudHNJc1N1cGVyc2V0KTskaM2PX29uY2Uuc2V0SXNTdXBlcnNldChzZXRJc1N1cGVyc2V0KTtcbmNvbnN0IHNldElzRGlzam9pbnQgPSByYXdTZXRpZnkoZWxlbWVudHNJc0Rpc2pvaW50KTskaM2PX29uY2Uuc2V0SXNEaXNqb2ludChzZXRJc0Rpc2pvaW50KTtcbmNvbnN0IHNldFVuaW9uID0gc2V0aWZ5KGVsZW1lbnRzVW5pb24pOyRozY9fb25jZS5zZXRVbmlvbihzZXRVbmlvbik7XG5jb25zdCBzZXREaXNqb2ludFVuaW9uID0gc2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRVbmlvbik7JGjNj19vbmNlLnNldERpc2pvaW50VW5pb24oc2V0RGlzam9pbnRVbmlvbik7XG5jb25zdCBzZXRJbnRlcnNlY3Rpb24gPSBzZXRpZnkoZWxlbWVudHNJbnRlcnNlY3Rpb24pOyRozY9fb25jZS5zZXRJbnRlcnNlY3Rpb24oc2V0SW50ZXJzZWN0aW9uKTtcbmNvbnN0IHNldERpc2pvaW50U3VidHJhY3QgPSBzZXRpZnkoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2Uuc2V0RGlzam9pbnRTdWJ0cmFjdChzZXREaXNqb2ludFN1YnRyYWN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCJdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIl0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiJdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0Il0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCJdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiJdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiJdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAimaBUfAaAADwGgAANgAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIi4vcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4va2V5cy9jaGVja0tleS5qcyJdLCJleHBvcnRzIjpbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG9iamVjdE1hcCxBcmdHdWFyZExpc3RTaGFwZSxBd2FpdEFyZ0d1YXJkU2hhcGUsSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsSW50ZXJmYWNlR3VhcmRTaGFwZSxNLE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLE1ldGhvZEd1YXJkU2hhcGUsUmF3R3VhcmRTaGFwZSxTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxTeW5jVmFsdWVHdWFyZFNoYXBlLGFzc2VydEF3YWl0QXJnR3VhcmQsbWF0Y2hlcyxtdXN0TWF0Y2gsZ2V0Q29weU1hcEtleXMsbWFrZUNvcHlNYXA7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiLi9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIkFyZ0d1YXJkTGlzdFNoYXBlXCIsWyRozY9fYSA9PiAoQXJnR3VhcmRMaXN0U2hhcGUgPSAkaM2PX2EpXV0sW1wiQXdhaXRBcmdHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoQXdhaXRBcmdHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlXCIsWyRozY9fYSA9PiAoSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUgPSAkaM2PX2EpXV0sW1wiSW50ZXJmYWNlR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKEludGVyZmFjZUd1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGVcIixbJGjNj19hID0+IChNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9ICRozY9fYSldXSxbXCJNZXRob2RHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoTWV0aG9kR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJSYXdHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoUmF3R3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZVwiLFskaM2PX2EgPT4gKFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlID0gJGjNj19hKV1dLFtcIlN5bmNWYWx1ZUd1YXJkU2hhcGVcIixbJGjNj19hID0+IChTeW5jVmFsdWVHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcImFzc2VydEF3YWl0QXJnR3VhcmRcIixbJGjNj19hID0+IChhc3NlcnRBd2FpdEFyZ0d1YXJkID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImdldENvcHlNYXBLZXlzXCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEtleXMgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlNYXBcIixbJGjNj19hID0+IChtYWtlQ29weU1hcCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuICovXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSA9IGhhcmRlbih7XG4gIGtsYXNzOiAnYXdhaXRBcmcnLFxuICBhcmdHdWFyZDogTS5wYXR0ZXJuKClcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCA9IChhd2FpdEFyZ0d1YXJkKSA9PiB7XG4gIGlmIChtYXRjaGVzKGF3YWl0QXJnR3VhcmQsIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSkpIHtcbiAgICAvL1xuICAgIGNvbnN0IHsga2xhc3M6IF8sIC4uLnBheWxvYWQgfSA9IGF3YWl0QXJnR3VhcmQ7XG4gICAgLy9cbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuICBhc3NlcnRBd2FpdEFyZ0d1YXJkKGF3YWl0QXJnR3VhcmQpO1xuICByZXR1cm4gYXdhaXRBcmdHdWFyZC5wYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKTtcblxuLy9cbi8vXG4vL1xuY29uc3QgTGVnYWN5U3luY01ldGhvZEd1YXJkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAga2xhc3M6ICdtZXRob2RHdWFyZCcsXG4gICAgY2FsbEtpbmQ6ICdzeW5jJyxcbiAgICBhcmdHdWFyZHM6IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFxuICAgIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlXG4gIH0sXG4gIHtcbiAgICBvcHRpb25hbEFyZ0d1YXJkczogU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG4gICAgcmVzdEFyZ0d1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlXG4gIH1cbik7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeUFyZ0d1YXJkU2hhcGUgPSBNLm9yKFxuICBSYXdHdWFyZFNoYXBlLFxuICBBd2FpdEFyZ0d1YXJkU2hhcGUsXG4gIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSxcbiAgTS5wYXR0ZXJuKClcbik7XG4vL1xuLy9cbi8vXG5jb25zdCBMZWdhY3lBcmdHdWFyZExpc3RTaGFwZSA9IE0uYXJyYXlPZihMZWdhY3lBcmdHdWFyZFNoYXBlKTtcblxuLy9cbi8vXG4vL1xuY29uc3QgTGVnYWN5QXN5bmNNZXRob2RHdWFyZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGtsYXNzOiAnbWV0aG9kR3VhcmQnLFxuICAgIGNhbGxLaW5kOiAnYXN5bmMnLFxuICAgIGFyZ0d1YXJkczogTGVnYWN5QXJnR3VhcmRMaXN0U2hhcGUsXG4gICAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGVcbiAgfSxcbiAge1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzOiBBcmdHdWFyZExpc3RTaGFwZSxcbiAgICByZXN0QXJnR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGVcbiAgfVxuKTtcblxuLy9cbi8vXG4vL1xuY29uc3QgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSA9IE0ub3IoXG4gIExlZ2FjeVN5bmNNZXRob2RHdWFyZFNoYXBlLFxuICBMZWdhY3lBc3luY01ldGhvZEd1YXJkU2hhcGVcbik7XG5cbmNvbnN0IGFkYXB0TGVnYWN5QXJnR3VhcmQgPSAoYXJnR3VhcmQpID0+XG5tYXRjaGVzKGFyZ0d1YXJkLCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUpID9cbk0uYXdhaXQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoYXJnR3VhcmQpLmFyZ0d1YXJkKSA6XG5hcmdHdWFyZDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGdldE1ldGhvZEd1YXJkUGF5bG9hZCA9IChtZXRob2RHdWFyZCkgPT4ge1xuICBpZiAobWF0Y2hlcyhtZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRTaGFwZSkpIHtcbiAgICByZXR1cm4gbWV0aG9kR3VhcmQucGF5bG9hZDtcbiAgfVxuICBtdXN0TWF0Y2gobWV0aG9kR3VhcmQsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUsICdsZWdhY3lNZXRob2RHdWFyZCcpO1xuICBjb25zdCB7XG4gICAgLy9cbiAgICBrbGFzczogXyxcbiAgICAvL1xuICAgIGNhbGxLaW5kLFxuICAgIC8vXG4gICAgcmV0dXJuR3VhcmQsXG4gICAgLy9cbiAgICByZXN0QXJnR3VhcmRcbiAgfSA9IG1ldGhvZEd1YXJkO1xuICBsZXQge1xuICAgIC8vXG4gICAgYXJnR3VhcmRzLFxuICAgIC8vXG4gICAgb3B0aW9uYWxBcmdHdWFyZHNcbiAgfSA9IG1ldGhvZEd1YXJkO1xuICBpZiAoY2FsbEtpbmQgPT09ICdhc3luYycpIHtcbiAgICBhcmdHdWFyZHMgPSBhcmdHdWFyZHMubWFwKGFkYXB0TGVnYWN5QXJnR3VhcmQpO1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzID1cbiAgICBvcHRpb25hbEFyZ0d1YXJkcyAmJiBvcHRpb25hbEFyZ0d1YXJkcy5tYXAoYWRhcHRMZWdhY3lBcmdHdWFyZCk7XG4gIH1cbiAgY29uc3QgcGF5bG9hZCA9IGhhcmRlbih7XG4gICAgY2FsbEtpbmQsXG4gICAgYXJnR3VhcmRzLFxuICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICAgIHJlc3RBcmdHdWFyZCxcbiAgICByZXR1cm5HdWFyZFxuICB9KTtcbiAgLy9cbiAgbXVzdE1hdGNoKHBheWxvYWQsIE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLCAnaW50ZXJuYWxNZXRob2RHdWFyZEFkYXB0b3InKTtcbiAgcmV0dXJuIHBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRNZXRob2RHdWFyZFBheWxvYWQoZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKTtcbmhhcmRlbihnZXRNZXRob2RHdWFyZFBheWxvYWQpO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGtsYXNzOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VOYW1lOiBNLnN0cmluZygpLFxuICAgIG1ldGhvZEd1YXJkczogTS5yZWNvcmRPZihcbiAgICAgIE0uc3RyaW5nKCksXG4gICAgICBNLm9yKE1ldGhvZEd1YXJkU2hhcGUsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUpXG4gICAgKVxuICB9LFxuICB7XG4gICAgZGVmYXVsdEd1YXJkczogTS5vcihNLnVuZGVmaW5lZCgpLCAncGFzc2FibGUnLCAncmF3JyksXG4gICAgc2xvcHB5OiBNLmJvb2xlYW4oKSxcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBzeW1ib2xNZXRob2RHdWFyZHM6IE0ubWFwT2YoTS5zeW1ib2woKSwgTWV0aG9kR3VhcmRTaGFwZSlcbiAgfVxuKTtcblxuY29uc3QgYWRhcHRNZXRob2RHdWFyZCA9IChtZXRob2RHdWFyZCkgPT4ge1xuICBpZiAobWF0Y2hlcyhtZXRob2RHdWFyZCwgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSkpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsS2luZCxcbiAgICAgIGFyZ0d1YXJkcyxcbiAgICAgIG9wdGlvbmFsQXJnR3VhcmRzID0gW10sXG4gICAgICByZXN0QXJnR3VhcmQgPSBNLmFueSgpLFxuICAgICAgcmV0dXJuR3VhcmRcbiAgICB9ID0gZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKG1ldGhvZEd1YXJkKTtcbiAgICBjb25zdCBtQ2FsbCA9IGNhbGxLaW5kID09PSAnc3luYycgPyBNLmNhbGwgOiBNLmNhbGxXaGVuO1xuICAgIHJldHVybiBtQ2FsbCguLi5hcmdHdWFyZHMpLlxuICAgIG9wdGlvbmFsKC4uLm9wdGlvbmFsQXJnR3VhcmRzKS5cbiAgICByZXN0KHJlc3RBcmdHdWFyZCkuXG4gICAgcmV0dXJucyhyZXR1cm5HdWFyZCk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZEd1YXJkO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gKGludGVyZmFjZUd1YXJkKSA9PiB7XG4gIGlmIChtYXRjaGVzKGludGVyZmFjZUd1YXJkLCBJbnRlcmZhY2VHdWFyZFNoYXBlKSkge1xuICAgIHJldHVybiBpbnRlcmZhY2VHdWFyZC5wYXlsb2FkO1xuICB9XG4gIG11c3RNYXRjaChpbnRlcmZhY2VHdWFyZCwgTGVnYWN5SW50ZXJmYWNlR3VhcmRTaGFwZSwgJ2xlZ2FjeUludGVyZmFjZUd1YXJkJyk7XG4gIC8vXG4gIC8vXG4gIGxldCB7IGtsYXNzOiBfLCBpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIC4uLnJlc3QgfSA9IGludGVyZmFjZUd1YXJkO1xuICBtZXRob2RHdWFyZHMgPSBvYmplY3RNYXAobWV0aG9kR3VhcmRzLCBhZGFwdE1ldGhvZEd1YXJkKTtcbiAgY29uc3QgcGF5bG9hZCA9IGhhcmRlbih7XG4gICAgaW50ZXJmYWNlTmFtZSxcbiAgICBtZXRob2RHdWFyZHMsXG4gICAgLi4ucmVzdFxuICB9KTtcbiAgbXVzdE1hdGNoKFxuICAgIHBheWxvYWQsXG4gICAgSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsXG4gICAgJ2ludGVybmFsSW50ZXJmYWNlR3VhcmRBZGFwdG9yJ1xuICApO1xuICByZXR1cm4gcGF5bG9hZDtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZUd1YXJkUGF5bG9hZChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCk7XG5cbmNvbnN0IGVtcHR5Q29weU1hcCA9IG1ha2VDb3B5TWFwKFtdKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGdldEludGVyZmFjZU1ldGhvZEtleXMgPSAoaW50ZXJmYWNlR3VhcmQpID0+IHtcbiAgY29uc3QgeyBtZXRob2RHdWFyZHMsIHN5bWJvbE1ldGhvZEd1YXJkcyA9IGVtcHR5Q29weU1hcCB9ID1cbiAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGludGVyZmFjZUd1YXJkKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvL1xuICAvL1xuICByZXR1cm4gaGFyZGVuKFtcbiAgLi4uUmVmbGVjdC5vd25LZXlzKG1ldGhvZEd1YXJkcyksXG4gIC4uLmdldENvcHlNYXBLZXlzKHN5bWJvbE1ldGhvZEd1YXJkcyldXG4gICk7XG59OyRozY9fb25jZS5nZXRJbnRlcmZhY2VNZXRob2RLZXlzKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xuaGFyZGVuKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiOlsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIjpbImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiOlsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sImdldEludGVyZmFjZU1ldGhvZEtleXMiOlsiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACC4bnjZdYAAGXWAAA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNC44L3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIiwiQGVuZG8vY29tbW9uL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIiwiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi4va2V5cy9jb21wYXJlS2V5cy5qcyIsIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIl0sImV4cG9ydHMiOlsiQXJnR3VhcmRMaXN0U2hhcGUiLCJBd2FpdEFyZ0d1YXJkU2hhcGUiLCJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSIsIkludGVyZmFjZUd1YXJkU2hhcGUiLCJNIiwiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiLCJNZXRob2RHdWFyZFNoYXBlIiwiUmF3R3VhcmRTaGFwZSIsIlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlIiwiU3luY1ZhbHVlR3VhcmRTaGFwZSIsImFzc2VydEF3YWl0QXJnR3VhcmQiLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCIsImFzc2VydE1ldGhvZEd1YXJkIiwiYXNzZXJ0UGF0dGVybiIsImFzc2VydFJhd0d1YXJkIiwiY2hlY2tNYXRjaGVzIiwiZGVmYXVsdExpbWl0cyIsImdldFJhbmtDb3ZlciIsImlzQXdhaXRBcmdHdWFyZCIsImlzUGF0dGVybiIsImlzUmF3R3VhcmQiLCJraW5kT2YiLCJtYXRjaGVzIiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaGFzT3duUHJvcGVydHlPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsY29tcGFyZVJhbmssZ2V0UGFzc1N0eWxlQ292ZXIsaW50ZXJzZWN0UmFua0NvdmVycyx1bmlvblJhbmtDb3ZlcnMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLGlkZW50Q2hlY2tlcixhcHBseUxhYmVsaW5nRXJyb3IsZnJvbVVuaXF1ZUVudHJpZXMsbGlzdERpZmZlcmVuY2UscSxiLFgsRmFpbCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixrZXlFUSxrZXlHVCxrZXlHVEUsa2V5TFQsa2V5TFRFLGFzc2VydEtleSxjaGVja0tleSxpc0tleSxjaGVja1NjYWxhcktleSxjaGVja0NvcHlTZXQsY2hlY2tDb3B5TWFwLGNvcHlNYXBLZXlTZXQsY2hlY2tDb3B5QmFnLGdldENvcHlNYXBFbnRyeUFycmF5LG1ha2VDb3B5TWFwLGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJjb21wYXJlUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dLFtcImdldFBhc3NTdHlsZUNvdmVyXCIsWyRozY9fYSA9PiAoZ2V0UGFzc1N0eWxlQ292ZXIgPSAkaM2PX2EpXV0sW1wiaW50ZXJzZWN0UmFua0NvdmVyc1wiLFskaM2PX2EgPT4gKGludGVyc2VjdFJhbmtDb3ZlcnMgPSAkaM2PX2EpXV0sW1widW5pb25SYW5rQ292ZXJzXCIsWyRozY9fYSA9PiAodW5pb25SYW5rQ292ZXJzID0gJGjNj19hKV1dLFtcInJlY29yZE5hbWVzXCIsWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsWyRozY9fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qc1wiLCBbW1wiYXBwbHlMYWJlbGluZ0Vycm9yXCIsWyRozY9fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanNcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzXCIsIFtbXCJsaXN0RGlmZmVyZW5jZVwiLFskaM2PX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJiXCIsWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcImtleUdUXCIsWyRozY9fYSA9PiAoa2V5R1QgPSAkaM2PX2EpXV0sW1wia2V5R1RFXCIsWyRozY9fYSA9PiAoa2V5R1RFID0gJGjNj19hKV1dLFtcImtleUxUXCIsWyRozY9fYSA9PiAoa2V5TFQgPSAkaM2PX2EpXV0sW1wia2V5TFRFXCIsWyRozY9fYSA9PiAoa2V5TFRFID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImNoZWNrS2V5XCIsWyRozY9fYSA9PiAoY2hlY2tLZXkgPSAkaM2PX2EpXV0sW1wiaXNLZXlcIixbJGjNj19hID0+IChpc0tleSA9ICRozY9fYSldXSxbXCJjaGVja1NjYWxhcktleVwiLFskaM2PX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcImNoZWNrQ29weVNldFwiLFskaM2PX2EgPT4gKGNoZWNrQ29weVNldCA9ICRozY9fYSldXSxbXCJjaGVja0NvcHlNYXBcIixbJGjNj19hID0+IChjaGVja0NvcHlNYXAgPSAkaM2PX2EpXV0sW1wiY29weU1hcEtleVNldFwiLFskaM2PX2EgPT4gKGNvcHlNYXBLZXlTZXQgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsWyRozY9fYSA9PiAoY2hlY2tDb3B5QmFnID0gJGjNj19hKV1dLFtcImdldENvcHlNYXBFbnRyeUFycmF5XCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJ5QXJyYXkgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlNYXBcIixbJGjNj19hID0+IChtYWtlQ29weU1hcCA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNcIiwgW1tcImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbmNvbnN0IHsgZW50cmllcywgdmFsdWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHBhdHRlcm5NZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLy9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgTU07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBkZWZhdWx0TGltaXRzID0gaGFyZGVuKHtcbiAgZGVjaW1hbERpZ2l0c0xpbWl0OiAxMDAsXG4gIHN0cmluZ0xlbmd0aExpbWl0OiAxMDBfMDAwLFxuICBzeW1ib2xOYW1lTGVuZ3RoTGltaXQ6IDEwMCxcbiAgbnVtUHJvcGVydGllc0xpbWl0OiA4MCxcbiAgcHJvcGVydHlOYW1lTGVuZ3RoTGltaXQ6IDEwMCxcbiAgYXJyYXlMZW5ndGhMaW1pdDogMTBfMDAwLFxuICBudW1TZXRFbGVtZW50c0xpbWl0OiAxMF8wMDAsXG4gIG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQ6IDEwXzAwMCxcbiAgbnVtTWFwRW50cmllc0xpbWl0OiA1MDAwXG59KTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWZhdWx0TGltaXRzKGRlZmF1bHRMaW1pdHMpO1xuY29uc3QgbGltaXQgPSAobGltaXRzID0ge30pID0+XG4vKiAgICAgICAgICAgICAgICAgICAgKi8oaGFyZGVuKHsgX19wcm90b19fOiBkZWZhdWx0TGltaXRzLCAuLi5saW1pdHMgfSkpO1xuXG5jb25zdCBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdCA9IChcbnBheWxvYWQsXG5tYWluUGF5bG9hZFNoYXBlLFxuY2hlY2ssXG5sYWJlbCkgPT5cbntcbiAgYXNzZXJ0KEFycmF5LmlzQXJyYXkobWFpblBheWxvYWRTaGFwZSkpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHtcbiAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgJHtxKGxhYmVsKX0gcGF5bG9hZCBtdXN0IGJlIGFuIGFycmF5OiAke3BheWxvYWR9YCk7XG4gIH1cblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuXG4gIGNvbnN0IG1haW5MZW5ndGggPSBtYWluUGF5bG9hZFNoYXBlLmxlbmd0aDtcbiAgaWYgKCEocGF5bG9hZC5sZW5ndGggPT09IG1haW5MZW5ndGggfHwgcGF5bG9hZC5sZW5ndGggPT09IG1haW5MZW5ndGggKyAxKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuICB9XG4gIGNvbnN0IGxpbWl0cyA9IHBheWxvYWRbbWFpbkxlbmd0aF07XG4gIHBheWxvYWQgPSBoYXJkZW4ocGF5bG9hZC5zbGljZSgwLCBtYWluTGVuZ3RoKSk7XG4gIC8vXG4gIGlmICghY2hlY2tNYXRjaGVzKHBheWxvYWQsIG1haW5QYXlsb2FkU2hhcGUsIGNoZWNrLCBsYWJlbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGxpbWl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIChcbiAgKHBhc3NTdHlsZU9mKGxpbWl0cykgPT09ICdjb3B5UmVjb3JkJyB8fFxuICBjaGVjayhmYWxzZSwgWGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpICYmXG4gIGVudHJpZXMobGltaXRzKS5ldmVyeShcbiAgICAoW2tleSwgdmFsdWVdKSA9PlxuICAgIHBhc3NTdHlsZU9mKHZhbHVlKSA9PT0gJ251bWJlcicgfHxcbiAgICBjaGVjayhmYWxzZSwgWGBWYWx1ZSBvZiBsaW1pdCAke3Eoa2V5KX0gYnV0IGJlIGEgbnVtYmVyOiAke3EodmFsdWUpfWApXG4gIClcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0ID0gKHNwZWNpbWVuLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrKSA9PiB7XG4gIGlmIChcbiAgTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKE51bWJlcihzcGVjaW1lbikpKSkgKyAxIDw9XG4gIGRlY2ltYWxEaWdpdHNMaW1pdClcbiAge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBjaGVjayhcbiAgICBmYWxzZSxcbiAgICBYYGJpZ2ludCAke3NwZWNpbWVufSBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke2RlY2ltYWxEaWdpdHNMaW1pdH0gZGlnaXRzYFxuICApO1xufTtcblxuLypcblxuICovXG5jb25zdCBtYWtlUGF0dGVybktpdCA9ICgpID0+IHtcbiAgLypcbiAgXG4gICAgICovXG5cblxuXG5cbiAgY29uc3QgbWF5YmVNYXRjaEhlbHBlciA9ICh0YWcpID0+XG4gIC8vXG4gIEhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbiAgLypcbiAgXG4gIFxuICAgKi9cblxuXG5cblxuICBjb25zdCBtYXliZVBheWxvYWRTaGFwZSA9ICh0YWcpID0+XG4gIC8vXG4gIEd1YXJkUGF5bG9hZFNoYXBlc1t0YWddO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzaW5nbGV0b25LaW5kcyA9IG5ldyBNYXAoW1xuICBbJ251bGwnLCBudWxsXSxcbiAgWyd1bmRlZmluZWQnLCB1bmRlZmluZWRdXVxuICApO1xuXG4gIC8qXG4gIFxuICAgKi9cblxuXG4gIGNvbnN0IHRhZ01lbW8gPSBuZXcgV2Vha01hcCgpO1xuXG4gIC8qXG4gIFxuICBcbiAgICAqL1xuXG5cblxuXG5cbiAgY29uc3QgY2hlY2tUYWdnZWQgPSAodGFnZ2VkLCB0YWcsIGNoZWNrKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hIZWxwZXIgPSBtYXliZU1hdGNoSGVscGVyKHRhZyk7XG4gICAgaWYgKG1hdGNoSGVscGVyKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBtYXRjaEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCh0YWdnZWQucGF5bG9hZCwgY2hlY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXlsb2FkU2hhcGUgPSBtYXliZVBheWxvYWRTaGFwZSh0YWcpO1xuICAgICAgaWYgKHBheWxvYWRTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBjaGVja01hdGNoZXModGFnZ2VkLnBheWxvYWQsIHBheWxvYWRTaGFwZSwgY2hlY2ssIHRhZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdjb3B5U2V0Jzp7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrQ29weVNldCh0YWdnZWQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnY29weUJhZyc6e1xuICAgICAgICAgIHJldHVybiBjaGVja0NvcHlCYWcodGFnZ2VkLCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlNYXAnOntcbiAgICAgICAgICByZXR1cm4gY2hlY2tDb3B5TWFwKHRhZ2dlZCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OntcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9OiAke3RhZ2dlZH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKlxuICBcbiAgXG4gICAgKi9cblxuXG5cblxuXG4gIGNvbnN0IGtpbmRPZiA9IChzcGVjaW1lbiwgY2hlY2sgPSBpZGVudENoZWNrZXIpID0+IHtcbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihzcGVjaW1lbik7XG4gICAgaWYgKHBhc3NTdHlsZSAhPT0gJ3RhZ2dlZCcpIHtcbiAgICAgIHJldHVybiBwYXNzU3R5bGU7XG4gICAgfVxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGlmICh0YWdNZW1vLmhhcyhzcGVjaW1lbikpIHtcbiAgICAgIHJldHVybiB0YWdNZW1vLmdldChzcGVjaW1lbik7XG4gICAgfVxuICAgIGNvbnN0IHRhZyA9IGdldFRhZyhzcGVjaW1lbik7XG4gICAgaWYgKGNoZWNrVGFnZ2VkKHNwZWNpbWVuLCB0YWcsIGNoZWNrKSkge1xuICAgICAgdGFnTWVtby5zZXQoc3BlY2ltZW4sIHRhZyk7XG4gICAgICByZXR1cm4gdGFnO1xuICAgIH1cbiAgICBpZiAoY2hlY2sgIT09IGlkZW50Q2hlY2tlcikge1xuICAgICAgY2hlY2soZmFsc2UsIFhgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9YCk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG4gIGhhcmRlbihraW5kT2YpO1xuXG4gIC8qXG4gIFxuICBcbiAgICAqL1xuXG5cblxuXG5cbiAgY29uc3QgY2hlY2tLaW5kID0gKHNwZWNpbWVuLCBraW5kLCBjaGVjaykgPT4ge1xuICAgIC8vXG4gICAgaWYgKHNpbmdsZXRvbktpbmRzLmhhcyhraW5kKSkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgc2luZ2xldG9uS2luZHMuZ2V0KGtpbmQpLCBjaGVjayk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhbEtpbmQgPSBraW5kT2Yoc3BlY2ltZW4sIGNoZWNrKTtcbiAgICBpZiAoa2luZCA9PT0gcmVhbEtpbmQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY2hlY2sgIT09IGlkZW50Q2hlY2tlcikge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjaGVjayhmYWxzZSwgWGAke2IocmVhbEtpbmQpfSAke3NwZWNpbWVufSAtIE11c3QgYmUgYSAke2Ioa2luZCl9YCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKlxuICBcbiAgXG4gICAqL1xuXG5cblxuXG4gIGNvbnN0IGlzS2luZCA9IChzcGVjaW1lbiwga2luZCkgPT4gY2hlY2tLaW5kKHNwZWNpbWVuLCBraW5kLCBpZGVudENoZWNrZXIpO1xuXG4gIC8qXG4gIFxuICAgICovXG5cblxuXG4gIGNvbnN0IGNoZWNrQXNLZXlQYXR0ID0gKHNwZWNpbWVuLCBrZXlBc1BhdHRlcm4sIGNoZWNrKSA9PiB7XG4gICAgaWYgKGlzS2V5KHNwZWNpbWVuKSAmJiBrZXlFUShzcGVjaW1lbiwga2V5QXNQYXR0ZXJuKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgY2hlY2sgIT09IGlkZW50Q2hlY2tlciAmJlxuICAgIC8vXG4gICAgLy9cbiAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmU6ICR7a2V5QXNQYXR0ZXJufWApXG4gICAgKTtcbiAgfTtcblxuICAvL1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjaGVja1BhdHRlcm4gPSAocGF0dCwgY2hlY2spID0+IHtcbiAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vXG4gICAgY29uc3QgcmVzdWx0ID0gY2hlY2tQYXR0ZXJuSW50ZXJuYWwocGF0dCwgY2hlY2spO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKlxuICBcbiAgICAqL1xuXG5cblxuICBjb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbCA9IChwYXR0LCBjaGVjaykgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGNoZWNrSXQgPSAoY2hpbGQpID0+IGNoZWNrUGF0dGVybihjaGlsZCwgY2hlY2spO1xuXG4gICAgY29uc3Qga2luZCA9IGtpbmRPZihwYXR0LCBjaGVjayk7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDp7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzp7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiB2YWx1ZXMocGF0dCkuZXZlcnkoY2hlY2tJdCk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6e1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gcGF0dC5ldmVyeShjaGVja0l0KTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnY29weU1hcCc6e1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBjaGVja1BhdHRlcm4ocGF0dC52YWx1ZXMsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgY2FzZSAncHJvbWlzZSc6e1xuICAgICAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBBICR7cShraW5kKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OntcbiAgICAgICAgICBpZiAobWF5YmVNYXRjaEhlbHBlcihraW5kKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKlxuICAgICAqL1xuXG5cbiAgY29uc3QgaXNQYXR0ZXJuID0gKHBhdHQpID0+IGNoZWNrUGF0dGVybihwYXR0LCBpZGVudENoZWNrZXIpO1xuXG4gIC8qXG4gICAgKi9cblxuICBjb25zdCBhc3NlcnRQYXR0ZXJuID0gKHBhdHQpID0+IHtcbiAgICBjaGVja1BhdHRlcm4ocGF0dCwgYXNzZXJ0Q2hlY2tlcik7XG4gIH07XG5cbiAgLy9cblxuICAvKlxuICBcbiAgICAgKi9cblxuXG5cblxuICBjb25zdCBjaGVja01hdGNoZXMgPSAoc3BlY2ltZW4sIHBhdHRlcm4sIGNoZWNrLCBsYWJlbCA9IHVuZGVmaW5lZCkgPT5cbiAgLy9cbiAgYXBwbHlMYWJlbGluZ0Vycm9yKGNoZWNrTWF0Y2hlc0ludGVybmFsLCBbc3BlY2ltZW4sIHBhdHRlcm4sIGNoZWNrXSwgbGFiZWwpO1xuXG4gIC8qXG4gIFxuICAgICovXG5cblxuXG4gIGNvbnN0IGNoZWNrTWF0Y2hlc0ludGVybmFsID0gKHNwZWNpbWVuLCBwYXR0LCBjaGVjaykgPT4ge1xuICAgIC8vXG4gICAgY29uc3QgcGF0dGVybktpbmQgPSBraW5kT2YocGF0dCwgY2hlY2spO1xuICAgIGNvbnN0IHNwZWNpbWVuS2luZCA9IGtpbmRPZihzcGVjaW1lbik7IC8vXG4gICAgc3dpdGNoIChwYXR0ZXJuS2luZCkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6e1xuICAgICAgICAgIHJldHVybiBGYWlsYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuICAgICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzp7XG4gICAgICAgICAgcmV0dXJuIEZhaWxgcHJvbWlzZXMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOntcbiAgICAgICAgICByZXR1cm4gRmFpbGBlcnJvcnMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgY2FzZSAnY29weVNldCc6XG4gICAgICBjYXNlICdjb3B5QmFnJzpcbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6e1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6e1xuICAgICAgICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNwZWNpbWVuS2luZCAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weUFycmF5IHRvIG1hdGNoIGEgY29weUFycmF5IHBhdHRlcm46ICR7cShcbiAgICAgICAgICAgICAgICBwYXR0XG4gICAgICAgICAgICAgICl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHBhdHQ7XG4gICAgICAgICAgaWYgKHNwZWNpbWVuLmxlbmd0aCAhPT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICBYYEFycmF5ICR7c3BlY2ltZW59IC0gTXVzdCBiZSBhcyBsb25nIGFzIGNvcHlBcnJheSBwYXR0ZXJuOiAke3EoXG4gICAgICAgICAgICAgICAgcGF0dFxuICAgICAgICAgICAgICApfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYXR0LmV2ZXJ5KChwLCBpKSA9PiBjaGVja01hdGNoZXMoc3BlY2ltZW5baV0sIHAsIGNoZWNrLCBpKSk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOntcbiAgICAgICAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5UmVjb3JkJykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5UmVjb3JkIHRvIG1hdGNoIGEgY29weVJlY29yZCBwYXR0ZXJuOiAke3EoXG4gICAgICAgICAgICAgICAgcGF0dFxuICAgICAgICAgICAgICApfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBzcGVjaW1lbk5hbWVzID0gcmVjb3JkTmFtZXMoc3BlY2ltZW4pO1xuICAgICAgICAgIGNvbnN0IHBhdHROYW1lcyA9IHJlY29yZE5hbWVzKHBhdHQpO1xuICAgICAgICAgIGNvbnN0IG1pc3NpbmcgPSBsaXN0RGlmZmVyZW5jZShwYXR0TmFtZXMsIHNwZWNpbWVuTmFtZXMpO1xuICAgICAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBoYXZlIG1pc3NpbmcgcHJvcGVydGllcyAke3EobWlzc2luZyl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdW5leHBlY3RlZCA9IGxpc3REaWZmZXJlbmNlKHNwZWNpbWVuTmFtZXMsIHBhdHROYW1lcyk7XG4gICAgICAgICAgaWYgKHVuZXhwZWN0ZWQubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IG5vdCBoYXZlIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKFxuICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRcbiAgICAgICAgICAgICAgKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzcGVjaW1lblZhbHVlcyA9IHJlY29yZFZhbHVlcyhzcGVjaW1lbiwgc3BlY2ltZW5OYW1lcyk7XG4gICAgICAgICAgY29uc3QgcGF0dFZhbHVlcyA9IHJlY29yZFZhbHVlcyhwYXR0LCBwYXR0TmFtZXMpO1xuICAgICAgICAgIHJldHVybiBwYXR0TmFtZXMuZXZlcnkoKGxhYmVsLCBpKSA9PlxuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlc1tpXSwgcGF0dFZhbHVlc1tpXSwgY2hlY2ssIGxhYmVsKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlNYXAnOntcbiAgICAgICAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5TWFwJykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5TWFwIHRvIG1hdGNoIGEgY29weU1hcCBwYXR0ZXJuOiAke3EoXG4gICAgICAgICAgICAgICAgcGF0dFxuICAgICAgICAgICAgICApfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgcGF0dEtleVNldCA9IGNvcHlNYXBLZXlTZXQocGF0dCk7XG4gICAgICAgICAgY29uc3Qgc3BlY2ltZW5LZXlTZXQgPSBjb3B5TWFwS2V5U2V0KHNwZWNpbWVuKTtcbiAgICAgICAgICBpZiAoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCwgcGF0dEtleVNldCwgY2hlY2spKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IHBhdHRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICBjb25zdCBzcGVjaW1lblZhbHVlcyA9IFtdO1xuICAgICAgICAgIGNvbnN0IGVudHJ5UGFpcnMgPSBnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhcbiAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICBzcGVjaW1lbixcbiAgICAgICAgICAgIGdldENvcHlNYXBFbnRyeUFycmF5LFxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtfa2V5LCBwYXR0VmFsdWUsIHNwZWNpbWVuVmFsdWVdIG9mIGVudHJ5UGFpcnMpIHtcbiAgICAgICAgICAgIHBhdHRWYWx1ZXMucHVzaChwYXR0VmFsdWUpO1xuICAgICAgICAgICAgc3BlY2ltZW5WYWx1ZXMucHVzaChzcGVjaW1lblZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNoZWNrTWF0Y2hlcyhoYXJkZW4oc3BlY2ltZW5WYWx1ZXMpLCBoYXJkZW4ocGF0dFZhbHVlcyksIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDp7XG4gICAgICAgICAgY29uc3QgbWF0Y2hIZWxwZXIgPSBtYXliZU1hdGNoSGVscGVyKHBhdHRlcm5LaW5kKTtcbiAgICAgICAgICBpZiAobWF0Y2hIZWxwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaEhlbHBlci5jaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQucGF5bG9hZCwgY2hlY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBzaG91bGQgaGF2ZSByZWNvZ25pemVkICR7cShwYXR0ZXJuS2luZCl9IGA7XG4gICAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLypcbiAgXG4gICAqL1xuXG5cbiAgY29uc3QgbWF0Y2hlcyA9IChzcGVjaW1lbiwgcGF0dCkgPT5cbiAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBpZGVudENoZWNrZXIpO1xuXG4gIC8qXG4gIFxuICBcbiAgICovXG5cblxuXG5cbiAgY29uc3QgbXVzdE1hdGNoID0gKHNwZWNpbWVuLCBwYXR0LCBsYWJlbCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGxldCBpbm5lckVycm9yO1xuICAgIHRyeSB7XG4gICAgICBpZiAoY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBpZGVudENoZWNrZXIsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICBpbm5lckVycm9yID0gZXI7XG4gICAgfVxuICAgIC8vXG4gICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBhc3NlcnRDaGVja2VyLCBsYWJlbCk7XG4gICAgY29uc3Qgb3V0ZXJFcnJvciA9IG1ha2VFcnJvcihcbiAgICAgIFhgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxKHBhdHQpfWBcbiAgICApO1xuICAgIGlmIChpbm5lckVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFubm90YXRlRXJyb3Iob3V0ZXJFcnJvciwgWGBjYXVzZWQgYnkgJHtpbm5lckVycm9yfWApO1xuICAgIH1cbiAgICB0aHJvdyBvdXRlckVycm9yO1xuICB9O1xuXG4gIC8vXG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGdldFJhbmtDb3ZlciA9IChwYXR0LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVBhc3NhYmxlKHBhdHQpO1xuICAgICAgaWYgKGVuY29kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW2VuY29kZWQsIGAke2VuY29kZWR9fmBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXR0KTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnY29weUFycmF5Jzp7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOntcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzp7XG4gICAgICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHBhdHQpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoSGVscGVyID0gbWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuICAgICAgICAgIGlmIChtYXRjaEhlbHBlcikge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hIZWxwZXIuZ2V0UmFua0NvdmVyKHBhdHQucGF5bG9hZCwgZW5jb2RlUGFzc2FibGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgICAgY2FzZSAnY29weVNldCc6e1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2NvcHlNYXAnOntcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6e1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvL1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrOyAvL1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OntcbiAgICAgICAgICBicmVhazsgLy9cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbiAgfTtcblxuICAvKlxuICBcbiAgICAgKi9cblxuXG5cblxuICBjb25zdCBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuID0gKGFycmF5LCBwYXR0LCBjaGVjaywgbGFiZWxQcmVmaXggPSAnJykgPT4ge1xuICAgIGlmIChpc0tpbmQocGF0dCwgJ21hdGNoOmFueScpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhcnJheS5ldmVyeSgoZWwsIGkpID0+XG4gICAgY2hlY2tNYXRjaGVzKGVsLCBwYXR0LCBjaGVjaywgYCR7bGFiZWxQcmVmaXh9WyR7aX1dYClcbiAgICApO1xuICB9O1xuXG4gIC8vXG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hBbnlIZWxwZXIgPSBGYXIoJ21hdGNoOmFueSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoX3NwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIF9jaGVjaykgPT4gdHJ1ZSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAobWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgIG1hdGNoZXJQYXlsb2FkID09PSB1bmRlZmluZWQgfHxcbiAgICBjaGVjayhmYWxzZSwgWGBtYXRjaDphbnkgcGF5bG9hZDogJHttYXRjaGVyUGF5bG9hZH0gLSBNdXN0IGJlIHVuZGVmaW5lZGApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJycsICd7J11cbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hBbmRIZWxwZXIgPSBGYXIoJ21hdGNoOmFuZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHBhdHRzLCBjaGVjaykgPT4ge1xuICAgICAgcmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KSA9PiBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZFBhdHRzLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgY2hlY2tJdCA9IChwYXR0KSA9PiBjaGVja1BhdHRlcm4ocGF0dCwgY2hlY2spO1xuICAgICAgcmV0dXJuIChcbiAgICAgIChwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpID09PSAnY29weUFycmF5JyB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgTmVlZHMgYXJyYXkgb2Ygc3ViLXBhdHRlcm5zOiAke3EoYWxsZWdlZFBhdHRzKX1gKSkgJiZcbiAgICAgIGFsbGVnZWRQYXR0cy5ldmVyeShjaGVja0l0KVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocGF0dHMsIGVuY29kZVBhc3NhYmxlKSA9PlxuICAgIGludGVyc2VjdFJhbmtDb3ZlcnMoXG4gICAgICBjb21wYXJlUmFuayxcbiAgICAgIHBhdHRzLm1hcCgocCkgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSlcbiAgICApXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoT3JIZWxwZXIgPSBGYXIoJ21hdGNoOm9yIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcGF0dHMsIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcGF0dHM7XG4gICAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gbm8gcGF0dGVybiBkaXNqdW5jdHMgdG8gbWF0Y2g6ICR7cShwYXR0cyl9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgcGF0dHMubGVuZ3RoID09PSAyICYmXG4gICAgICAhbWF0Y2hlcyhzcGVjaW1lbiwgcGF0dHNbMF0pICYmXG4gICAgICBpc0tpbmQocGF0dHNbMF0sICdtYXRjaDpraW5kJykgJiZcbiAgICAgIHBhdHRzWzBdLnBheWxvYWQgPT09ICd1bmRlZmluZWQnKVxuICAgICAge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0c1sxXSwgY2hlY2spO1xuICAgICAgfVxuICAgICAgaWYgKHBhdHRzLnNvbWUoKHBhdHQpID0+IG1hdGNoZXMoc3BlY2ltZW4sIHBhdHQpKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgbWF0Y2ggb25lIG9mICR7cShwYXR0cyl9YCk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFuZEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKHBhdHRzLCBlbmNvZGVQYXNzYWJsZSkgPT5cbiAgICB1bmlvblJhbmtDb3ZlcnMoXG4gICAgICBjb21wYXJlUmFuayxcbiAgICAgIHBhdHRzLm1hcCgocCkgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSlcbiAgICApXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoTm90SGVscGVyID0gRmFyKCdtYXRjaDpub3QgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBwYXR0LCBjaGVjaykgPT4ge1xuICAgICAgaWYgKG1hdGNoZXMoc3BlY2ltZW4sIHBhdHQpKSB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBmYWlsIG5lZ2F0ZWQgcGF0dGVybjogJHtxKHBhdHQpfWBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tQYXR0ZXJuLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX3BhdHQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWycnLCAneyddXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoU2NhbGFySGVscGVyID0gRmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgIGNoZWNrU2NhbGFyS2V5KHNwZWNpbWVuLCBjaGVjayksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogbWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+IFsnYScsICd6fiddXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoS2V5SGVscGVyID0gRmFyKCdtYXRjaDprZXkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgIGNoZWNrS2V5KHNwZWNpbWVuLCBjaGVjayksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogbWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+IFsnYScsICd6fiddXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoUGF0dGVybkhlbHBlciA9IEZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgY2hlY2tQYXR0ZXJuKHNwZWNpbWVuLCBjaGVjayksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogbWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+IFsnYScsICd6fiddXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoS2luZEhlbHBlciA9IEZhcignbWF0Y2g6a2luZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiBjaGVja0tpbmQsXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKGFsbGVnZWRLZXlLaW5kLCBjaGVjaykgPT5cbiAgICB0eXBlb2YgYWxsZWdlZEtleUtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgbWF0Y2g6a2luZDogcGF5bG9hZDogJHthbGxlZ2VkS2V5S2luZH0gLSBBIGtpbmQgbmFtZSBtdXN0IGJlIGEgc3RyaW5nYFxuICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChraW5kLCBfZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICAgIGxldCBzdHlsZTtcbiAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICBjYXNlICdjb3B5U2V0JzpcbiAgICAgICAgY2FzZSAnY29weU1hcCc6e1xuICAgICAgICAgICAgc3R5bGUgPSAndGFnZ2VkJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDp7XG4gICAgICAgICAgICBzdHlsZSA9IGtpbmQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIoc3R5bGUpO1xuICAgIH1cbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hUYWdnZWRIZWxwZXIgPSBGYXIoJ21hdGNoOnRhZ2dlZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFt0YWdQYXR0LCBwYXlsb2FkUGF0dF0sIGNoZWNrKSA9PiB7XG4gICAgICBpZiAocGFzc1N0eWxlT2Yoc3BlY2ltZW4pICE9PSAndGFnZ2VkJykge1xuICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgWGBFeHBlY3RlZCB0YWdnZWQgb2JqZWN0LCBub3QgJHtxKFxuICAgICAgICAgICAgcGFzc1N0eWxlT2Yoc3BlY2ltZW4pXG4gICAgICAgICAgKX06ICR7c3BlY2ltZW59YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgIGNoZWNrTWF0Y2hlcyhnZXRUYWcoc3BlY2ltZW4pLCB0YWdQYXR0LCBjaGVjaywgJ3RhZycpICYmXG4gICAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4ucGF5bG9hZCwgcGF5bG9hZFBhdHQsIGNoZWNrLCAncGF5bG9hZCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgIHBheWxvYWQsXG4gICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0ucGF0dGVybigpXSksXG4gICAgICBjaGVjayxcbiAgICAgICdtYXRjaDp0YWdnZWQgcGF5bG9hZCdcbiAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX2tpbmQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoQmlnaW50SGVscGVyID0gRmFyKCdtYXRjaDpiaWdpbnQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2JpZ2ludCcsIGNoZWNrKSAmJlxuICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2spXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgcGF5bG9hZCxcbiAgICAgIGhhcmRlbihbXSksXG4gICAgICBjaGVjayxcbiAgICAgICdtYXRjaDpiaWdpbnQgcGF5bG9hZCdcbiAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgIGdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKVxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaE5hdEhlbHBlciA9IEZhcignbWF0Y2g6bmF0IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGRlY2ltYWxEaWdpdHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdiaWdpbnQnLCBjaGVjaykgJiZcbiAgICAgIGNoZWNrKFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgKi8oc3BlY2ltZW4pID49IDBuLFxuICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBub24tbmVnYXRpdmVgXG4gICAgICApICYmXG4gICAgICBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbiwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVjaylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICBwYXlsb2FkLFxuICAgICAgaGFyZGVuKFtdKSxcbiAgICAgIGNoZWNrLFxuICAgICAgJ21hdGNoOm5hdCBwYXlsb2FkJ1xuICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgLy9cbiAgICBnZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JylcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hTdHJpbmdIZWxwZXIgPSBGYXIoJ21hdGNoOnN0cmluZyBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBzdHJpbmdMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gKFxuICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnc3RyaW5nJywgY2hlY2spICYmXG4gICAgICAvL1xuICAgICAgKCAvKiAgICAgICAgICAgICAgICAgKi8oc3BlY2ltZW4pLmxlbmd0aCA8PSBzdHJpbmdMZW5ndGhMaW1pdCB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYHN0cmluZyAke3NwZWNpbWVufSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N0cmluZ0xlbmd0aExpbWl0fWBcbiAgICAgICkpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgcGF5bG9hZCxcbiAgICAgIGhhcmRlbihbXSksXG4gICAgICBjaGVjayxcbiAgICAgICdtYXRjaDpzdHJpbmcgcGF5bG9hZCdcbiAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgIGdldFBhc3NTdHlsZUNvdmVyKCdzdHJpbmcnKVxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaFN5bWJvbEhlbHBlciA9IEZhcignbWF0Y2g6c3ltYm9sIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IHN5bWJvbE5hbWVMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIGlmICghY2hlY2tLaW5kKHNwZWNpbWVuLCAnc3ltYm9sJywgY2hlY2spKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN5bWJvbE5hbWUgPSBuYW1lRm9yUGFzc2FibGVTeW1ib2woc3BlY2ltZW4pO1xuXG4gICAgICBpZiAodHlwZW9mIHN5bWJvbE5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFBhc3NhYmxlIHN5bWJvbCAke3NwZWNpbWVufSBtdXN0IGhhdmUgYSBwYXNzYWJsZSBuYW1lYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgc3ltYm9sTmFtZS5sZW5ndGggPD0gc3ltYm9sTmFtZUxlbmd0aExpbWl0LFxuICAgICAgICBYYFN5bWJvbCBuYW1lICR7cShcbiAgICAgICAgICBzeW1ib2xOYW1lXG4gICAgICAgICl9IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3ltYm9sTmFtZUxlbmd0aExpbWl0fWBcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICBwYXlsb2FkLFxuICAgICAgaGFyZGVuKFtdKSxcbiAgICAgIGNoZWNrLFxuICAgICAgJ21hdGNoOnN5bWJvbCBwYXlsb2FkJ1xuICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ3N5bWJvbCcpXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoUmVtb3RhYmxlSGVscGVyID0gRmFyKCdtYXRjaDpyZW1vdGFibGUgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByZW1vdGFibGVEZXNjLCBjaGVjaykgPT4ge1xuICAgICAgaWYgKGlzS2luZChzcGVjaW1lbiwgJ3JlbW90YWJsZScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoZWNrID09PSBpZGVudENoZWNrZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBsYWJlbCB9ID0gcmVtb3RhYmxlRGVzYztcbiAgICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbiAgICAgIGNvbnN0IGtpbmREZXRhaWxzID1cbiAgICAgIHBhc3NTdHlsZSAhPT0gJ3RhZ2dlZCcgP1xuICAgICAgLy9cbiAgICAgIGIocGFzc1N0eWxlKSA6XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHEoZ2V0VGFnKHNwZWNpbWVuKSk7XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIHJlbW90YWJsZSAke2IobGFiZWwpfSwgbm90ICR7a2luZERldGFpbHN9YFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChhbGxlZ2VkUmVtb3RhYmxlRGVzYywgY2hlY2spID0+XG4gICAgY2hlY2tNYXRjaGVzKFxuICAgICAgYWxsZWdlZFJlbW90YWJsZURlc2MsXG4gICAgICBoYXJkZW4oeyBsYWJlbDogTU0uc3RyaW5nKCkgfSksXG4gICAgICBjaGVjayxcbiAgICAgICdtYXRjaDpyZW1vdGFibGUgcGF5bG9hZCdcbiAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX3JlbW90YWJsZURlc2MsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICBnZXRQYXNzU3R5bGVDb3ZlcigncmVtb3RhYmxlJylcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hMVEVIZWxwZXIgPSBGYXIoJ21hdGNoOmx0ZSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCwgY2hlY2spID0+XG4gICAga2V5TFRFKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDw9ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocmlnaHRPcGVyYW5kLCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxldCBbbGVmdEJvdW5kLCByaWdodEJvdW5kXSA9IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gICAgICBjb25zdCBuZXdSaWdodEJvdW5kID0gYCR7ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKX1+YDtcbiAgICAgIGlmIChuZXdSaWdodEJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmlnaHRCb3VuZCA9IG5ld1JpZ2h0Qm91bmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF07XG4gICAgfVxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaExUSGVscGVyID0gRmFyKCdtYXRjaDpsdCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCwgY2hlY2spID0+XG4gICAga2V5TFQoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPCAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogbWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoR1RFSGVscGVyID0gRmFyKCdtYXRjaDpndGUgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgIGtleUdURShzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogKHJpZ2h0T3BlcmFuZCwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBsZXQgW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF0gPSBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuICAgICAgY29uc3QgbmV3TGVmdEJvdW5kID0gZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKTtcbiAgICAgIGlmIChuZXdMZWZ0Qm91bmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZWZ0Qm91bmQgPSBuZXdMZWZ0Qm91bmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF07XG4gICAgfVxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaEdUSGVscGVyID0gRmFyKCdtYXRjaDpndCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCwgY2hlY2spID0+XG4gICAga2V5R1Qoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPiAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogbWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoUmVjb3JkT2ZIZWxwZXIgPSBGYXIoJ21hdGNoOnJlY29yZE9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICBzcGVjaW1lbixcbiAgICBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgIGNoZWNrKSA9PlxuICAgIHtcbiAgICAgIGNvbnN0IHsgbnVtUHJvcGVydGllc0xpbWl0LCBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5UmVjb3JkJywgY2hlY2spICYmXG4gICAgICBjaGVjayhcbiAgICAgICAgb3duS2V5cyhzcGVjaW1lbikubGVuZ3RoIDw9IG51bVByb3BlcnRpZXNMaW1pdCxcbiAgICAgICAgWGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG4gICAgICAgICAgbnVtUHJvcGVydGllc0xpbWl0XG4gICAgICAgICl9IHByb3BlcnRpZXM6ICR7c3BlY2ltZW59YFxuICAgICAgKSAmJlxuICAgICAgZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4gICAgICAgIChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcihcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgICBbXG4gICAgICAgICAga2V5Lmxlbmd0aCA8PSBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCxcbiAgICAgICAgICBYYFByb3BlcnR5IG5hbWUgbXVzdCBub3QgYmUgbG9uZ2VyIHRoYW4gJHtxKFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lTGVuZ3RoTGltaXRcbiAgICAgICAgICApfWBdLFxuXG4gICAgICAgICAga2V5XG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICAgIGhhcmRlbihba2V5LCB2YWx1ZV0pLFxuICAgICAgICAgIGhhcmRlbihba2V5UGF0dCwgdmFsdWVQYXR0XSksXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgICAga2V5XG4gICAgICAgIClcbiAgICAgIClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICBwYXlsb2FkLFxuICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgY2hlY2ssXG4gICAgICAnbWF0Y2g6cmVjb3JkT2YgcGF5bG9hZCdcbiAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX2VudHJ5UGF0dCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKVxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaEFycmF5T2ZIZWxwZXIgPSBGYXIoJ21hdGNoOmFycmF5T2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbc3ViUGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgYXJyYXlMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gKFxuICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUFycmF5JywgY2hlY2spICYmXG4gICAgICAoIC8qICAgICAgICAgICAgICAgICovKHNwZWNpbWVuKS5sZW5ndGggPD0gYXJyYXlMZW5ndGhMaW1pdCB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YFxuICAgICAgKSkgJiZcbiAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4sIHN1YlBhdHQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgIHBheWxvYWQsXG4gICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuICAgICAgY2hlY2ssXG4gICAgICAnbWF0Y2g6YXJyYXlPZiBwYXlsb2FkJ1xuICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6ICgpID0+IGdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKVxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaFNldE9mSGVscGVyID0gRmFyKCdtYXRjaDpzZXRPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtrZXlQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBudW1TZXRFbGVtZW50c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlTZXQnLCBjaGVjaykgJiZcbiAgICAgIGNoZWNrKFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAqLyhzcGVjaW1lbi5wYXlsb2FkKS5sZW5ndGggPCBudW1TZXRFbGVtZW50c0xpbWl0LFxuICAgICAgICBYYFNldCBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EobnVtU2V0RWxlbWVudHNMaW1pdCl9IGVsZW1lbnRzOiAke1xuICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLmxlbmd0aFxuICAgICAgICB9YFxuICAgICAgKSAmJlxuICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLCBrZXlQYXR0LCBjaGVjaywgJ3NldCBlbGVtZW50cycpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgcGF5bG9hZCxcbiAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpXSksXG4gICAgICBjaGVjayxcbiAgICAgICdtYXRjaDpzZXRPZiBwYXlsb2FkJ1xuICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6ICgpID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKVxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaEJhZ09mSGVscGVyID0gRmFyKCdtYXRjaDpiYWdPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgc3BlY2ltZW4sXG4gICAgW2tleVBhdHQsIGNvdW50UGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSxcbiAgICBjaGVjaykgPT5cbiAgICB7XG4gICAgICBjb25zdCB7IG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsIGRlY2ltYWxEaWdpdHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5QmFnJywgY2hlY2spICYmXG4gICAgICBjaGVjayhcbiAgICAgICAgLyogICAgICAgICAgICAgICAgKi8oc3BlY2ltZW4ucGF5bG9hZCkubGVuZ3RoIDw9XG4gICAgICAgIG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsXG4gICAgICAgIFhgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbiAgICAgICAgICBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0XG4gICAgICAgICl9IHVuaXF1ZSBlbGVtZW50czogJHtzcGVjaW1lbn1gXG4gICAgICApICYmXG4gICAgICBzcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuICAgICAgICAoW2tleSwgY291bnRdLCBpKSA9PlxuICAgICAgICBjaGVja01hdGNoZXMoa2V5LCBrZXlQYXR0LCBjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkgJiZcbiAgICAgICAgYXBwbHlMYWJlbGluZ0Vycm9yKFxuICAgICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuICAgICAgICAgIFtjb3VudCwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVja10sXG4gICAgICAgICAgYGJhZyBjb3VudHNbJHtpfV1gXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKGNvdW50LCBjb3VudFBhdHQsIGNoZWNrLCBgYmFnIGNvdW50c1ske2l9XWApXG4gICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgcGF5bG9hZCxcbiAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgIGNoZWNrLFxuICAgICAgJ21hdGNoOmJhZ09mIHBheWxvYWQnXG4gICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoTWFwT2ZIZWxwZXIgPSBGYXIoJ21hdGNoOm1hcE9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICBzcGVjaW1lbixcbiAgICBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgIGNoZWNrKSA9PlxuICAgIHtcbiAgICAgIGNvbnN0IHsgbnVtTWFwRW50cmllc0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlNYXAnLCBjaGVjaykgJiZcbiAgICAgIGNoZWNrKFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAqLyhzcGVjaW1lbi5wYXlsb2FkLmtleXMpLmxlbmd0aCA8PVxuICAgICAgICBudW1NYXBFbnRyaWVzTGltaXQsXG4gICAgICAgIFhgQ29weU1hcCBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuICR7cShcbiAgICAgICAgICBudW1NYXBFbnRyaWVzTGltaXRcbiAgICAgICAgKX0gZW50cmllczogJHtzcGVjaW1lbn1gXG4gICAgICApICYmXG4gICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLmtleXMsXG4gICAgICAgIGtleVBhdHQsXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWFwIGtleXMnXG4gICAgICApICYmXG4gICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLnZhbHVlcyxcbiAgICAgICAgdmFsdWVQYXR0LFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hcCB2YWx1ZXMnXG4gICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgcGF5bG9hZCxcbiAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgIGNoZWNrLFxuICAgICAgJ21hdGNoOm1hcE9mIHBheWxvYWQnXG4gICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9lbnRyeVBhdHQpID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKVxuICB9KTtcblxuICAvKlxuICBcbiAgXG4gICAgICovXG5cblxuXG5cblxuXG4gIGNvbnN0IHNwbGl0QXJyYXlQYXJ0cyA9IChzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpID0+IHtcbiAgICBjb25zdCBudW1SZXF1aXJlZCA9IHJlcXVpcmVkUGF0dC5sZW5ndGg7XG4gICAgY29uc3QgbnVtT3B0aW9uYWwgPSBvcHRpb25hbFBhdHQubGVuZ3RoO1xuICAgIGNvbnN0IHJlcXVpcmVkU3BlY2ltZW4gPSBzcGVjaW1lbi5zbGljZSgwLCBudW1SZXF1aXJlZCk7XG4gICAgY29uc3Qgb3B0aW9uYWxTcGVjaW1lbiA9IHNwZWNpbWVuLnNsaWNlKFxuICAgICAgbnVtUmVxdWlyZWQsXG4gICAgICBudW1SZXF1aXJlZCArIG51bU9wdGlvbmFsXG4gICAgKTtcbiAgICBjb25zdCByZXN0U3BlY2ltZW4gPSBzcGVjaW1lbi5zbGljZShudW1SZXF1aXJlZCArIG51bU9wdGlvbmFsKTtcbiAgICByZXR1cm4gaGFyZGVuKHsgcmVxdWlyZWRTcGVjaW1lbiwgb3B0aW9uYWxTcGVjaW1lbiwgcmVzdFNwZWNpbWVuIH0pO1xuICB9O1xuXG4gIC8qXG4gIFxuICBcbiAgICAqL1xuXG5cblxuXG5cbiAgY29uc3QgYWRhcHRBcnJheVBhdHRlcm4gPSAob3B0aW9uYWxQYXR0LCBsZW5ndGgpID0+XG4gIGhhcmRlbihvcHRpb25hbFBhdHQuc2xpY2UoMCwgbGVuZ3RoKS5tYXAoKHBhdHQpID0+IE1NLm9wdChwYXR0KSkpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoU3BsaXRBcnJheUhlbHBlciA9IEZhcignbWF0Y2g6c3BsaXRBcnJheSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgc3BlY2ltZW4sXG4gICAgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0gW10sIHJlc3RQYXR0ID0gTU0uYW55KCldLFxuICAgIGNoZWNrKSA9PlxuICAgIHtcbiAgICAgIGlmICghY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUFycmF5JywgY2hlY2spKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgcmVxdWlyZWRTcGVjaW1lbiwgb3B0aW9uYWxTcGVjaW1lbiwgcmVzdFNwZWNpbWVuIH0gPVxuICAgICAgc3BsaXRBcnJheVBhcnRzKHNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCk7XG4gICAgICBjb25zdCBwYXJ0aWFsUGF0dCA9IGFkYXB0QXJyYXlQYXR0ZXJuKFxuICAgICAgICBvcHRpb25hbFBhdHQsXG4gICAgICAgIG9wdGlvbmFsU3BlY2ltZW4ubGVuZ3RoXG4gICAgICApO1xuICAgICAgbGV0IGFyZ051bSA9IDA7XG4gICAgICByZXR1cm4gKFxuICAgICAgKHJlcXVpcmVkU3BlY2ltZW4ubGVuZ3RoID09PSByZXF1aXJlZFBhdHQubGVuZ3RoIHx8XG4gICAgICBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgRXhwZWN0ZWQgYXQgbGVhc3QgJHtxKFxuICAgICAgICAgIHJlcXVpcmVkUGF0dC5sZW5ndGhcbiAgICAgICAgKX0gYXJndW1lbnRzOiAke3NwZWNpbWVufWBcbiAgICAgICkpICYmXG4gICAgICByZXF1aXJlZFBhdHQuZXZlcnkoKHAsIGkpID0+XG4gICAgICAvL1xuICAgICAgY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0sIHAsIGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9YClcbiAgICAgICkgJiZcbiAgICAgIHBhcnRpYWxQYXR0LmV2ZXJ5KChwLCBpKSA9PlxuICAgICAgLy9cbiAgICAgIGNoZWNrTWF0Y2hlcyhvcHRpb25hbFNwZWNpbWVuW2ldLCBwLCBjaGVjaywgYGFyZyAke2FyZ051bSsrfT9gKVxuICAgICAgKSAmJlxuICAgICAgY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbiwgcmVzdFBhdHQsIGNoZWNrLCAnLi4ucmVzdCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICAvKlxuICAgICAgICovXG5cblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoc3BsaXRBcnJheSwgY2hlY2spID0+IHtcbiAgICAgIGlmIChcbiAgICAgIHBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgKHNwbGl0QXJyYXkubGVuZ3RoID49IDEgfHwgc3BsaXRBcnJheS5sZW5ndGggPD0gMykpXG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCwgcmVzdFBhdHQgPSB1bmRlZmluZWRdID1cbiAgICAgICAgc3BsaXRBcnJheTtcbiAgICAgICAgaWYgKFxuICAgICAgICBpc1BhdHRlcm4ocmVxdWlyZWRQYXR0KSAmJlxuICAgICAgICBwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAob3B0aW9uYWxQYXR0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgKGlzUGF0dGVybihvcHRpb25hbFBhdHQpICYmXG4gICAgICAgIHBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCkgPT09ICdjb3B5QXJyYXknKSkgJiZcbiAgICAgICAgKHJlc3RQYXR0ID09PSB1bmRlZmluZWQgfHwgaXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IGFycmF5LCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgYXJyYXksIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuICAgICAgICAgIHNwbGl0QXJyYXlcbiAgICAgICAgKX1gXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChbXG4gICAgX3JlcXVpcmVkUGF0dCxcbiAgICBfb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLFxuICAgIF9yZXN0UGF0dCA9IHVuZGVmaW5lZF0pID0+XG4gICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpXG4gIH0pO1xuXG4gIC8qXG4gIFxuICBcbiAgICAgKi9cblxuXG5cblxuXG5cbiAgY29uc3Qgc3BsaXRSZWNvcmRQYXJ0cyA9IChzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpID0+IHtcbiAgICAvL1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcmVxdWlyZWRFbnRyaWVzID0gW107XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBvcHRpb25hbEVudHJpZXMgPSBbXTtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IHJlc3RFbnRyaWVzID0gW107XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIGVudHJpZXMoc3BlY2ltZW4pKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHlPZihyZXF1aXJlZFBhdHQsIG5hbWUpKSB7XG4gICAgICAgIHJlcXVpcmVkRW50cmllcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIGlmIChoYXNPd25Qcm9wZXJ0eU9mKG9wdGlvbmFsUGF0dCwgbmFtZSkpIHtcbiAgICAgICAgb3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0RW50cmllcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHJlcXVpcmVkU3BlY2ltZW46IGZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG4gICAgICBvcHRpb25hbFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhvcHRpb25hbEVudHJpZXMpLFxuICAgICAgcmVzdFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhyZXN0RW50cmllcylcbiAgICB9KTtcbiAgfTtcblxuICAvKlxuICBcbiAgXG4gICAgKi9cblxuXG5cblxuXG4gIGNvbnN0IGFkYXB0UmVjb3JkUGF0dGVybiA9IChvcHRpb25hbFBhdHQsIG5hbWVzKSA9PlxuICBmcm9tVW5pcXVlRW50cmllcyhuYW1lcy5tYXAoKG5hbWUpID0+IFtuYW1lLCBNTS5vcHQob3B0aW9uYWxQYXR0W25hbWVdKV0pKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaFNwbGl0UmVjb3JkSGVscGVyID0gRmFyKCdtYXRjaDpzcGxpdFJlY29yZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgc3BlY2ltZW4sXG4gICAgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0ge30sIHJlc3RQYXR0ID0gTU0uYW55KCldLFxuICAgIGNoZWNrKSA9PlxuICAgIHtcbiAgICAgIGlmICghY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weVJlY29yZCcsIGNoZWNrKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHJlcXVpcmVkU3BlY2ltZW4sIG9wdGlvbmFsU3BlY2ltZW4sIHJlc3RTcGVjaW1lbiB9ID1cbiAgICAgIHNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KTtcblxuICAgICAgY29uc3QgcGFydGlhbE5hbWVzID0gLyogICAgICAgICAgICAgICAgICAgKi8ob3duS2V5cyhvcHRpb25hbFNwZWNpbWVuKSk7XG4gICAgICBjb25zdCBwYXJ0aWFsUGF0dCA9IGFkYXB0UmVjb3JkUGF0dGVybihvcHRpb25hbFBhdHQsIHBhcnRpYWxOYW1lcyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgY2hlY2spICYmXG4gICAgICBwYXJ0aWFsTmFtZXMuZXZlcnkoKG5hbWUpID0+XG4gICAgICBjaGVja01hdGNoZXMoXG4gICAgICAgIG9wdGlvbmFsU3BlY2ltZW5bbmFtZV0sXG4gICAgICAgIHBhcnRpYWxQYXR0W25hbWVdLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgYCR7bmFtZX0/YFxuICAgICAgKVxuICAgICAgKSAmJlxuICAgICAgY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbiwgcmVzdFBhdHQsIGNoZWNrLCAnLi4ucmVzdCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICAvKlxuICAgICAgICovXG5cblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoc3BsaXRBcnJheSwgY2hlY2spID0+IHtcbiAgICAgIGlmIChcbiAgICAgIHBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgKHNwbGl0QXJyYXkubGVuZ3RoID49IDEgfHwgc3BsaXRBcnJheS5sZW5ndGggPD0gMykpXG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCwgcmVzdFBhdHQgPSB1bmRlZmluZWRdID1cbiAgICAgICAgc3BsaXRBcnJheTtcbiAgICAgICAgaWYgKFxuICAgICAgICBpc1BhdHRlcm4ocmVxdWlyZWRQYXR0KSAmJlxuICAgICAgICBwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpID09PSAnY29weVJlY29yZCcgJiZcbiAgICAgICAgKG9wdGlvbmFsUGF0dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIChpc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSAmJlxuICAgICAgICBwYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpID09PSAnY29weVJlY29yZCcpKSAmJlxuICAgICAgICAocmVzdFBhdHQgPT09IHVuZGVmaW5lZCB8fCBpc1BhdHRlcm4ocmVzdFBhdHQpKSlcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgcmVjb3JkLCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgcmVjb3JkLCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbiAgICAgICAgICBzcGxpdEFycmF5XG4gICAgICAgICl9YFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoW1xuICAgIHJlcXVpcmVkUGF0dCxcbiAgICBfb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLFxuICAgIF9yZXN0UGF0dCA9IHVuZGVmaW5lZF0pID0+XG4gICAgZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSlcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnID0gaGFyZGVuKHtcbiAgICAnbWF0Y2g6YW55JzogbWF0Y2hBbnlIZWxwZXIsXG4gICAgJ21hdGNoOmFuZCc6IG1hdGNoQW5kSGVscGVyLFxuICAgICdtYXRjaDpvcic6IG1hdGNoT3JIZWxwZXIsXG4gICAgJ21hdGNoOm5vdCc6IG1hdGNoTm90SGVscGVyLFxuXG4gICAgJ21hdGNoOnNjYWxhcic6IG1hdGNoU2NhbGFySGVscGVyLFxuICAgICdtYXRjaDprZXknOiBtYXRjaEtleUhlbHBlcixcbiAgICAnbWF0Y2g6cGF0dGVybic6IG1hdGNoUGF0dGVybkhlbHBlcixcbiAgICAnbWF0Y2g6a2luZCc6IG1hdGNoS2luZEhlbHBlcixcbiAgICAnbWF0Y2g6dGFnZ2VkJzogbWF0Y2hUYWdnZWRIZWxwZXIsXG4gICAgJ21hdGNoOmJpZ2ludCc6IG1hdGNoQmlnaW50SGVscGVyLFxuICAgICdtYXRjaDpuYXQnOiBtYXRjaE5hdEhlbHBlcixcbiAgICAnbWF0Y2g6c3RyaW5nJzogbWF0Y2hTdHJpbmdIZWxwZXIsXG4gICAgJ21hdGNoOnN5bWJvbCc6IG1hdGNoU3ltYm9sSGVscGVyLFxuICAgICdtYXRjaDpyZW1vdGFibGUnOiBtYXRjaFJlbW90YWJsZUhlbHBlcixcblxuICAgICdtYXRjaDpsdCc6IG1hdGNoTFRIZWxwZXIsXG4gICAgJ21hdGNoOmx0ZSc6IG1hdGNoTFRFSGVscGVyLFxuICAgICdtYXRjaDpndGUnOiBtYXRjaEdURUhlbHBlcixcbiAgICAnbWF0Y2g6Z3QnOiBtYXRjaEdUSGVscGVyLFxuXG4gICAgJ21hdGNoOmFycmF5T2YnOiBtYXRjaEFycmF5T2ZIZWxwZXIsXG4gICAgJ21hdGNoOnJlY29yZE9mJzogbWF0Y2hSZWNvcmRPZkhlbHBlcixcbiAgICAnbWF0Y2g6c2V0T2YnOiBtYXRjaFNldE9mSGVscGVyLFxuICAgICdtYXRjaDpiYWdPZic6IG1hdGNoQmFnT2ZIZWxwZXIsXG4gICAgJ21hdGNoOm1hcE9mJzogbWF0Y2hNYXBPZkhlbHBlcixcbiAgICAnbWF0Y2g6c3BsaXRBcnJheSc6IG1hdGNoU3BsaXRBcnJheUhlbHBlcixcbiAgICAnbWF0Y2g6c3BsaXRSZWNvcmQnOiBtYXRjaFNwbGl0UmVjb3JkSGVscGVyXG4gIH0pO1xuXG4gIGNvbnN0IG1ha2VNYXRjaGVyID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICAgIGNvbnN0IG1hdGNoZXIgPSBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZCk7XG4gICAgYXNzZXJ0UGF0dGVybihtYXRjaGVyKTtcbiAgICByZXR1cm4gbWF0Y2hlcjtcbiAgfTtcblxuICBjb25zdCBtYWtlS2luZE1hdGNoZXIgPSAoa2luZCkgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmtpbmQnLCBraW5kKTtcblxuICBjb25zdCBBbnlTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDphbnknLCB1bmRlZmluZWQpO1xuICBjb25zdCBTY2FsYXJTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDpzY2FsYXInLCB1bmRlZmluZWQpO1xuICBjb25zdCBLZXlTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDprZXknLCB1bmRlZmluZWQpO1xuICBjb25zdCBQYXR0ZXJuU2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IEJvb2xlYW5TaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcignYm9vbGVhbicpO1xuICBjb25zdCBOdW1iZXJTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG4gIGNvbnN0IEJpZ0ludFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6YmlnaW50JywgW10pO1xuICBjb25zdCBOYXRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsIFtdKTtcbiAgY29uc3QgU3RyaW5nU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpzdHJpbmcnLCBbXSk7XG4gIGNvbnN0IFN5bWJvbFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6c3ltYm9sJywgW10pO1xuICBjb25zdCBSZWNvcmRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJywgW0FueVNoYXBlLCBBbnlTaGFwZV0pO1xuICBjb25zdCBBcnJheVNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsIFtBbnlTaGFwZV0pO1xuICBjb25zdCBTZXRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnNldE9mJywgW0FueVNoYXBlXSk7XG4gIGNvbnN0IEJhZ1NoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6YmFnT2YnLCBbQW55U2hhcGUsIEFueVNoYXBlXSk7XG4gIGNvbnN0IE1hcFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6bWFwT2YnLCBbQW55U2hhcGUsIEFueVNoYXBlXSk7XG4gIGNvbnN0IFJlbW90YWJsZVNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdyZW1vdGFibGUnKTtcbiAgY29uc3QgRXJyb3JTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcignZXJyb3InKTtcbiAgY29uc3QgUHJvbWlzZVNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdwcm9taXNlJyk7XG4gIGNvbnN0IFVuZGVmaW5lZFNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCd1bmRlZmluZWQnKTtcblxuICAvKlxuICBcbiAgXG4gICAqL1xuXG5cblxuXG4gIGNvbnN0IG1ha2VMaW1pdHNNYXRjaGVyID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICAgIGlmIChwYXlsb2FkW3BheWxvYWQubGVuZ3RoIC0gMV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGF5bG9hZCA9IGhhcmRlbihwYXlsb2FkLnNsaWNlKDAsIHBheWxvYWQubGVuZ3RoIC0gMSkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZU1hdGNoZXIodGFnLCBwYXlsb2FkKTtcbiAgfTtcblxuICBjb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlciA9IChsYWJlbCA9IHVuZGVmaW5lZCkgPT5cbiAgbGFiZWwgPT09IHVuZGVmaW5lZCA/XG4gIFJlbW90YWJsZVNoYXBlIDpcbiAgbWFrZU1hdGNoZXIoJ21hdGNoOnJlbW90YWJsZScsIGhhcmRlbih7IGxhYmVsIH0pKTtcblxuICAvKlxuICBcbiAgXG4gICAqL1xuXG5cblxuXG4gIGNvbnN0IG1ha2VTcGxpdFBheWxvYWQgPSAoXG4gIGVtcHR5LFxuICBiYXNlLFxuICBvcHRpb25hbCA9IHVuZGVmaW5lZCxcbiAgcmVzdCA9IHVuZGVmaW5lZCkgPT5cbiAge1xuICAgIGlmIChyZXN0KSB7XG4gICAgICByZXR1cm4gW2Jhc2UsIG9wdGlvbmFsIHx8IGVtcHR5LCByZXN0XTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICByZXR1cm4gW2Jhc2UsIG9wdGlvbmFsXTtcbiAgICB9XG4gICAgcmV0dXJuIFtiYXNlXTtcbiAgfTtcblxuICAvL1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgTSA9IGhhcmRlbih7XG4gICAgYW55OiAoKSA9PiBBbnlTaGFwZSxcbiAgICBhbmQ6ICguLi5wYXR0cykgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmFuZCcsIHBhdHRzKSxcbiAgICBvcjogKC4uLnBhdHRzKSA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6b3InLCBwYXR0cyksXG4gICAgbm90OiAoc3ViUGF0dCkgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOm5vdCcsIHN1YlBhdHQpLFxuXG4gICAgc2NhbGFyOiAoKSA9PiBTY2FsYXJTaGFwZSxcbiAgICBrZXk6ICgpID0+IEtleVNoYXBlLFxuICAgIHBhdHRlcm46ICgpID0+IFBhdHRlcm5TaGFwZSxcbiAgICBraW5kOiBtYWtlS2luZE1hdGNoZXIsXG4gICAgdGFnZ2VkOiAodGFnUGF0dCA9IE0uc3RyaW5nKCksIHBheWxvYWRQYXR0ID0gTS5hbnkoKSkgPT5cbiAgICBtYWtlTWF0Y2hlcignbWF0Y2g6dGFnZ2VkJywgaGFyZGVuKFt0YWdQYXR0LCBwYXlsb2FkUGF0dF0pKSxcbiAgICBib29sZWFuOiAoKSA9PiBCb29sZWFuU2hhcGUsXG4gICAgbnVtYmVyOiAoKSA9PiBOdW1iZXJTaGFwZSxcbiAgICBiaWdpbnQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJpZ2ludCcsIFtsaW1pdHNdKSA6IEJpZ0ludFNoYXBlLFxuICAgIG5hdDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bmF0JywgW2xpbWl0c10pIDogTmF0U2hhcGUsXG4gICAgc3RyaW5nOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzdHJpbmcnLCBbbGltaXRzXSkgOiBTdHJpbmdTaGFwZSxcbiAgICBzeW1ib2w6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN5bWJvbCcsIFtsaW1pdHNdKSA6IFN5bWJvbFNoYXBlLFxuICAgIHJlY29yZDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICBsaW1pdHMgPyBNLnJlY29yZE9mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBSZWNvcmRTaGFwZSxcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGFycmF5OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgIGxpbWl0cyA/IE0uYXJyYXlPZihNLmFueSgpLCBsaW1pdHMpIDogQXJyYXlTaGFwZSxcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBzZXQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+IChsaW1pdHMgPyBNLnNldE9mKE0uYW55KCksIGxpbWl0cykgOiBTZXRTaGFwZSksXG4gICAgYmFnOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgIGxpbWl0cyA/IE0uYmFnT2YoTS5hbnkoKSwgTS5hbnkoKSwgbGltaXRzKSA6IEJhZ1NoYXBlLFxuICAgIG1hcDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICBsaW1pdHMgPyBNLm1hcE9mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBNYXBTaGFwZSxcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHJlbW90YWJsZTogbWFrZVJlbW90YWJsZU1hdGNoZXIsXG4gICAgZXJyb3I6ICgpID0+IEVycm9yU2hhcGUsXG4gICAgcHJvbWlzZTogKCkgPT4gUHJvbWlzZVNoYXBlLFxuICAgIHVuZGVmaW5lZDogKCkgPT4gVW5kZWZpbmVkU2hhcGUsXG4gICAgbnVsbDogKCkgPT4gbnVsbCxcblxuICAgIGx0OiAocmlnaHRPcGVyYW5kKSA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6bHQnLCByaWdodE9wZXJhbmQpLFxuICAgIGx0ZTogKHJpZ2h0T3BlcmFuZCkgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmx0ZScsIHJpZ2h0T3BlcmFuZCksXG4gICAgZXE6IChrZXkpID0+IHtcbiAgICAgIGFzc2VydEtleShrZXkpO1xuICAgICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gTS51bmRlZmluZWQoKSA6IGtleTtcbiAgICB9LFxuICAgIG5lcTogKGtleSkgPT4gTS5ub3QoTS5lcShrZXkpKSxcbiAgICBndGU6IChyaWdodE9wZXJhbmQpID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpndGUnLCByaWdodE9wZXJhbmQpLFxuICAgIGd0OiAocmlnaHRPcGVyYW5kKSA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6Z3QnLCByaWdodE9wZXJhbmQpLFxuXG4gICAgcmVjb3JkT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgdmFsdWVQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpyZWNvcmRPZicsIFtrZXlQYXR0LCB2YWx1ZVBhdHQsIGxpbWl0c10pLFxuICAgIGFycmF5T2Y6IChzdWJQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDphcnJheU9mJywgW3N1YlBhdHQsIGxpbWl0c10pLFxuICAgIHNldE9mOiAoa2V5UGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c2V0T2YnLCBba2V5UGF0dCwgbGltaXRzXSksXG4gICAgYmFnT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgY291bnRQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiYWdPZicsIFtrZXlQYXR0LCBjb3VudFBhdHQsIGxpbWl0c10pLFxuICAgIG1hcE9mOiAoa2V5UGF0dCA9IE0uYW55KCksIHZhbHVlUGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bWFwT2YnLCBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHNdKSxcbiAgICBzcGxpdEFycmF5OiAoYmFzZSwgb3B0aW9uYWwgPSB1bmRlZmluZWQsIHJlc3QgPSB1bmRlZmluZWQpID0+XG4gICAgbWFrZU1hdGNoZXIoXG4gICAgICAnbWF0Y2g6c3BsaXRBcnJheScsXG4gICAgICBtYWtlU3BsaXRQYXlsb2FkKFtdLCBiYXNlLCBvcHRpb25hbCwgcmVzdClcbiAgICApLFxuICAgIHNwbGl0UmVjb3JkOiAoYmFzZSwgb3B0aW9uYWwgPSB1bmRlZmluZWQsIHJlc3QgPSB1bmRlZmluZWQpID0+XG4gICAgbWFrZU1hdGNoZXIoXG4gICAgICAnbWF0Y2g6c3BsaXRSZWNvcmQnLFxuICAgICAgbWFrZVNwbGl0UGF5bG9hZCh7fSwgYmFzZSwgb3B0aW9uYWwsIHJlc3QpXG4gICAgKSxcbiAgICBzcGxpdDogKGJhc2UsIHJlc3QgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpID09PSAnY29weUFycmF5Jykge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gTS5zcGxpdEFycmF5KGJhc2UsIHJlc3QgJiYgW10sIHJlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE0uc3BsaXRSZWNvcmQoYmFzZSwgcmVzdCAmJiB7fSwgcmVzdCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBwYXJ0aWFsOiAoYmFzZSwgcmVzdCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSkgPT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBNLnNwbGl0QXJyYXkoW10sIGJhc2UsIHJlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sIGJhc2UsIHJlc3QpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBlcmVmOiAodCkgPT4gTS5vcih0LCBNLnByb21pc2UoKSksXG4gICAgb3B0OiAodCkgPT4gTS5vcihNLnVuZGVmaW5lZCgpLCB0KSxcblxuICAgIGludGVyZmFjZTogKGludGVyZmFjZU5hbWUsIG1ldGhvZEd1YXJkcywgb3B0aW9ucykgPT5cbiAgICAvL1xuICAgIG1ha2VJbnRlcmZhY2VHdWFyZChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMpLFxuICAgIGNhbGw6ICguLi5hcmdQYXR0ZXJucykgPT5cbiAgICAvL1xuICAgIG1ha2VNZXRob2RHdWFyZE1ha2VyKCdzeW5jJywgYXJnUGF0dGVybnMpLFxuICAgIGNhbGxXaGVuOiAoLi4uYXJnR3VhcmRzKSA9PlxuICAgIC8vXG4gICAgbWFrZU1ldGhvZEd1YXJkTWFrZXIoJ2FzeW5jJywgYXJnR3VhcmRzKSxcblxuICAgIGF3YWl0OiAoYXJnUGF0dGVybikgPT5cbiAgICAvL1xuICAgIG1ha2VBd2FpdEFyZ0d1YXJkKGFyZ1BhdHRlcm4pLFxuICAgIHJhdzogKCkgPT5cbiAgICAvL1xuICAgIG1ha2VSYXdHdWFyZCgpXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGNoZWNrTWF0Y2hlcyxcbiAgICBtYXRjaGVzLFxuICAgIG11c3RNYXRjaCxcbiAgICBhc3NlcnRQYXR0ZXJuLFxuICAgIGlzUGF0dGVybixcbiAgICBnZXRSYW5rQ292ZXIsXG4gICAgTSxcbiAgICBraW5kT2ZcbiAgfSk7XG59O1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCB7XG4gIGNoZWNrTWF0Y2hlcyxcbiAgbWF0Y2hlcyxcbiAgbXVzdE1hdGNoLFxuICBhc3NlcnRQYXR0ZXJuLFxuICBpc1BhdHRlcm4sXG4gIGdldFJhbmtDb3ZlcixcbiAgTSxcbiAga2luZE9mXG59ID0gbWFrZVBhdHRlcm5LaXQoKTskaM2PX29uY2UuY2hlY2tNYXRjaGVzKGNoZWNrTWF0Y2hlcyk7JGjNj19vbmNlLm1hdGNoZXMobWF0Y2hlcyk7JGjNj19vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpOyRozY9fb25jZS5hc3NlcnRQYXR0ZXJuKGFzc2VydFBhdHRlcm4pOyRozY9fb25jZS5pc1BhdHRlcm4oaXNQYXR0ZXJuKTskaM2PX29uY2UuZ2V0UmFua0NvdmVyKGdldFJhbmtDb3Zlcik7JGjNj19vbmNlLk0oTSk7JGjNj19vbmNlLmtpbmRPZihraW5kT2YpO1xuXG5NTSA9IE07XG5cbi8vXG5cbi8vXG5jb25zdCBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgYXJnR3VhcmQ6IE0ucGF0dGVybigpXG59KTtcblxuY29uc3QgQXdhaXRBcmdHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDphd2FpdEFyZ0d1YXJkJyk7XG5cbi8qXG5cblxuICovJGjNj19vbmNlLkF3YWl0QXJnR3VhcmRTaGFwZShBd2FpdEFyZ0d1YXJkU2hhcGUpO1xuY29uc3QgaXNBd2FpdEFyZ0d1YXJkID0gKHNwZWNpbWVuKSA9PlxubWF0Y2hlcyhzcGVjaW1lbiwgQXdhaXRBcmdHdWFyZFNoYXBlKTskaM2PX29uY2UuaXNBd2FpdEFyZ0d1YXJkKGlzQXdhaXRBcmdHdWFyZCk7XG5oYXJkZW4oaXNBd2FpdEFyZ0d1YXJkKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGFzc2VydEF3YWl0QXJnR3VhcmQgPSAoc3BlY2ltZW4pID0+IHtcbiAgbXVzdE1hdGNoKHNwZWNpbWVuLCBBd2FpdEFyZ0d1YXJkU2hhcGUsICdhd2FpdEFyZ0d1YXJkJyk7XG59OyRozY9fb25jZS5hc3NlcnRBd2FpdEFyZ0d1YXJkKGFzc2VydEF3YWl0QXJnR3VhcmQpO1xuaGFyZGVuKGFzc2VydEF3YWl0QXJnR3VhcmQpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFrZUF3YWl0QXJnR3VhcmQgPSAoYXJnUGF0dGVybikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOmF3YWl0QXJnR3VhcmQnLCB7XG4gICAgYXJnR3VhcmQ6IGFyZ1BhdHRlcm5cbiAgfSk7XG4gIGFzc2VydEF3YWl0QXJnR3VhcmQocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vXG5cbmNvbnN0IFJhd0d1YXJkUGF5bG9hZFNoYXBlID0gTS5yZWNvcmQoKTtcblxuY29uc3QgUmF3R3VhcmRTaGFwZSA9IE0ua2luZCgnZ3VhcmQ6cmF3R3VhcmQnKTskaM2PX29uY2UuUmF3R3VhcmRTaGFwZShSYXdHdWFyZFNoYXBlKTtcblxuY29uc3QgaXNSYXdHdWFyZCA9IChzcGVjaW1lbikgPT4gbWF0Y2hlcyhzcGVjaW1lbiwgUmF3R3VhcmRTaGFwZSk7JGjNj19vbmNlLmlzUmF3R3VhcmQoaXNSYXdHdWFyZCk7XG5cbmNvbnN0IGFzc2VydFJhd0d1YXJkID0gKHNwZWNpbWVuKSA9PlxubXVzdE1hdGNoKHNwZWNpbWVuLCBSYXdHdWFyZFNoYXBlLCAncmF3R3VhcmQnKTtcblxuLypcblxuICovJGjNj19vbmNlLmFzc2VydFJhd0d1YXJkKGFzc2VydFJhd0d1YXJkKTtcbmNvbnN0IG1ha2VSYXdHdWFyZCA9ICgpID0+IG1ha2VUYWdnZWQoJ2d1YXJkOnJhd0d1YXJkJywge30pO1xuXG4vL1xuLy9cblxuY29uc3QgU3luY1ZhbHVlR3VhcmRTaGFwZSA9IE0ub3IoUmF3R3VhcmRTaGFwZSwgTS5wYXR0ZXJuKCkpOyRozY9fb25jZS5TeW5jVmFsdWVHdWFyZFNoYXBlKFN5bmNWYWx1ZUd1YXJkU2hhcGUpO1xuXG5jb25zdCBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSA9IE0uYXJyYXlPZihTeW5jVmFsdWVHdWFyZFNoYXBlKTskaM2PX29uY2UuU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUoU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUpO1xuXG5jb25zdCBBcmdHdWFyZFNoYXBlID0gTS5vcihSYXdHdWFyZFNoYXBlLCBBd2FpdEFyZ0d1YXJkU2hhcGUsIE0ucGF0dGVybigpKTtcbmNvbnN0IEFyZ0d1YXJkTGlzdFNoYXBlID0gTS5hcnJheU9mKEFyZ0d1YXJkU2hhcGUpOyRozY9fb25jZS5BcmdHdWFyZExpc3RTaGFwZShBcmdHdWFyZExpc3RTaGFwZSk7XG5cbmNvbnN0IFN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9IGhhcmRlbih7XG4gIGNhbGxLaW5kOiAnc3luYycsXG4gIGFyZ0d1YXJkczogU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG4gIG9wdGlvbmFsQXJnR3VhcmRzOiBNLm9wdChTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSksXG4gIHJlc3RBcmdHdWFyZDogTS5vcHQoU3luY1ZhbHVlR3VhcmRTaGFwZSksXG4gIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlXG59KTtcblxuY29uc3QgQXN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9IGhhcmRlbih7XG4gIGNhbGxLaW5kOiAnYXN5bmMnLFxuICBhcmdHdWFyZHM6IEFyZ0d1YXJkTGlzdFNoYXBlLFxuICBvcHRpb25hbEFyZ0d1YXJkczogTS5vcHQoQXJnR3VhcmRMaXN0U2hhcGUpLFxuICByZXN0QXJnR3VhcmQ6IE0ub3B0KFN5bmNWYWx1ZUd1YXJkU2hhcGUpLFxuICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZVxufSk7XG5cbmNvbnN0IE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlID0gTS5vcihcbiAgU3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLFxuICBBc3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlXG4pOyRozY9fb25jZS5NZXRob2RHdWFyZFBheWxvYWRTaGFwZShNZXRob2RHdWFyZFBheWxvYWRTaGFwZSk7XG5cbmNvbnN0IE1ldGhvZEd1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOm1ldGhvZEd1YXJkJyk7XG5cbi8qXG5cblxuICovJGjNj19vbmNlLk1ldGhvZEd1YXJkU2hhcGUoTWV0aG9kR3VhcmRTaGFwZSk7XG5jb25zdCBhc3NlcnRNZXRob2RHdWFyZCA9IChzcGVjaW1lbikgPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIE1ldGhvZEd1YXJkU2hhcGUsICdtZXRob2RHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0TWV0aG9kR3VhcmQoYXNzZXJ0TWV0aG9kR3VhcmQpO1xuaGFyZGVuKGFzc2VydE1ldGhvZEd1YXJkKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VNZXRob2RHdWFyZE1ha2VyID0gKFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyA9IHVuZGVmaW5lZCxcbnJlc3RBcmdHdWFyZCA9IHVuZGVmaW5lZCkgPT5cblxuaGFyZGVuKHtcbiAgb3B0aW9uYWw6ICguLi5vcHRBcmdHdWFyZHMpID0+IHtcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgRmFpbGBDYW4gb25seSBoYXZlIG9uZSBzZXQgb2Ygb3B0aW9uYWwgZ3VhcmRzYDtcbiAgICByZXN0QXJnR3VhcmQgPT09IHVuZGVmaW5lZCB8fFxuICAgIEZhaWxgb3B0aW9uYWwgYXJnIGd1YXJkcyBtdXN0IGNvbWUgYmVmb3JlIHJlc3QgYXJnYDtcbiAgICByZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoY2FsbEtpbmQsIGFyZ0d1YXJkcywgb3B0QXJnR3VhcmRzKTtcbiAgfSxcbiAgcmVzdDogKHJBcmdHdWFyZCkgPT4ge1xuICAgIHJlc3RBcmdHdWFyZCA9PT0gdW5kZWZpbmVkIHx8IEZhaWxgQ2FuIG9ubHkgaGF2ZSBvbmUgcmVzdCBhcmdgO1xuICAgIHJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihcbiAgICAgIGNhbGxLaW5kLFxuICAgICAgYXJnR3VhcmRzLFxuICAgICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgICByQXJnR3VhcmRcbiAgICApO1xuICB9LFxuICByZXR1cm5zOiAocmV0dXJuR3VhcmQgPSBNLnVuZGVmaW5lZCgpKSA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCByZXN1bHQgPSBtYWtlVGFnZ2VkKCdndWFyZDptZXRob2RHdWFyZCcsIHtcbiAgICAgIGNhbGxLaW5kLFxuICAgICAgYXJnR3VhcmRzLFxuICAgICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgICByZXN0QXJnR3VhcmQsXG4gICAgICByZXR1cm5HdWFyZFxuICAgIH0pO1xuICAgIGFzc2VydE1ldGhvZEd1YXJkKHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cbmNvbnN0IEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGludGVyZmFjZU5hbWU6IE0uc3RyaW5nKCksXG4gICAgbWV0aG9kR3VhcmRzOiBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE1ldGhvZEd1YXJkU2hhcGUpXG4gIH0sXG4gIHtcbiAgICBkZWZhdWx0R3VhcmRzOiBNLm9yKE0udW5kZWZpbmVkKCksICdwYXNzYWJsZScsICdyYXcnKSxcbiAgICBzbG9wcHk6IE0uYm9vbGVhbigpLFxuICAgIHN5bWJvbE1ldGhvZEd1YXJkczogTS5tYXBPZihNLnN5bWJvbCgpLCBNZXRob2RHdWFyZFNoYXBlKVxuICB9XG4pOyRozY9fb25jZS5JbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZShJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSk7XG5cbmNvbnN0IEludGVyZmFjZUd1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOmludGVyZmFjZUd1YXJkJyk7XG5cbi8qXG5cblxuICovJGjNj19vbmNlLkludGVyZmFjZUd1YXJkU2hhcGUoSW50ZXJmYWNlR3VhcmRTaGFwZSk7XG5jb25zdCBhc3NlcnRJbnRlcmZhY2VHdWFyZCA9IChzcGVjaW1lbikgPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIEludGVyZmFjZUd1YXJkU2hhcGUsICdpbnRlcmZhY2VHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0SW50ZXJmYWNlR3VhcmQoYXNzZXJ0SW50ZXJmYWNlR3VhcmQpO1xuaGFyZGVuKGFzc2VydEludGVyZmFjZUd1YXJkKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VJbnRlcmZhY2VHdWFyZCA9IChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7IHNsb3BweSA9IGZhbHNlLCBkZWZhdWx0R3VhcmRzID0gc2xvcHB5ID8gJ3Bhc3NhYmxlJyA6IHVuZGVmaW5lZCB9ID1cbiAgb3B0aW9ucztcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0cmluZ01ldGhvZEd1YXJkcyA9IHt9O1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMgPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygb3duS2V5cyhtZXRob2RHdWFyZHMpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtZXRob2RHdWFyZHNbLyogICAgICAgICAgICAgICAgICovKGtleSldO1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3ltYm9sJykge1xuICAgICAgc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmluZ01ldGhvZEd1YXJkc1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOmludGVyZmFjZUd1YXJkJywge1xuICAgIGludGVyZmFjZU5hbWUsXG4gICAgbWV0aG9kR3VhcmRzOiBzdHJpbmdNZXRob2RHdWFyZHMsXG4gICAgLi4uKHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMubGVuZ3RoID9cbiAgICB7IHN5bWJvbE1ldGhvZEd1YXJkczogbWFrZUNvcHlNYXAoc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcykgfSA6XG4gICAge30pLFxuICAgIGRlZmF1bHRHdWFyZHNcbiAgfSk7XG4gIGFzc2VydEludGVyZmFjZUd1YXJkKHJlc3VsdCk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyhyZXN1bHQpO1xufTtcblxuY29uc3QgR3VhcmRQYXlsb2FkU2hhcGVzID0gaGFyZGVuKHtcbiAgJ2d1YXJkOmF3YWl0QXJnR3VhcmQnOiBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlLFxuICAnZ3VhcmQ6cmF3R3VhcmQnOiBSYXdHdWFyZFBheWxvYWRTaGFwZSxcbiAgJ2d1YXJkOm1ldGhvZEd1YXJkJzogTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4gICdndWFyZDppbnRlcmZhY2VHdWFyZCc6IEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlXG59KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRMaW1pdHMiOlsiZGVmYXVsdExpbWl0cyJdLCJjaGVja01hdGNoZXMiOlsiY2hlY2tNYXRjaGVzIl0sIm1hdGNoZXMiOlsibWF0Y2hlcyJdLCJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiJdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIl0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiXSwiTSI6WyJNIl0sImtpbmRPZiI6WyJraW5kT2YiXSwiQXdhaXRBcmdHdWFyZFNoYXBlIjpbIkF3YWl0QXJnR3VhcmRTaGFwZSJdLCJpc0F3YWl0QXJnR3VhcmQiOlsiaXNBd2FpdEFyZ0d1YXJkIl0sImFzc2VydEF3YWl0QXJnR3VhcmQiOlsiYXNzZXJ0QXdhaXRBcmdHdWFyZCJdLCJSYXdHdWFyZFNoYXBlIjpbIlJhd0d1YXJkU2hhcGUiXSwiaXNSYXdHdWFyZCI6WyJpc1Jhd0d1YXJkIl0sImFzc2VydFJhd0d1YXJkIjpbImFzc2VydFJhd0d1YXJkIl0sIlN5bmNWYWx1ZUd1YXJkU2hhcGUiOlsiU3luY1ZhbHVlR3VhcmRTaGFwZSJdLCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSI6WyJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSJdLCJBcmdHdWFyZExpc3RTaGFwZSI6WyJBcmdHdWFyZExpc3RTaGFwZSJdLCJNZXRob2RHdWFyZFBheWxvYWRTaGFwZSI6WyJNZXRob2RHdWFyZFBheWxvYWRTaGFwZSJdLCJNZXRob2RHdWFyZFNoYXBlIjpbIk1ldGhvZEd1YXJkU2hhcGUiXSwiYXNzZXJ0TWV0aG9kR3VhcmQiOlsiYXNzZXJ0TWV0aG9kR3VhcmQiXSwiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUiOlsiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUiXSwiSW50ZXJmYWNlR3VhcmRTaGFwZSI6WyJJbnRlcmZhY2VHdWFyZFNoYXBlIl0sImFzc2VydEludGVyZmFjZUd1YXJkIjpbImFzc2VydEludGVyZmFjZUd1YXJkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACIAAABAZW5kby9wYXR0ZXJucy12MS40Ljgvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGSRG3FUBgAAVAYAACEAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjkvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRozY9fYSldXV1dLFtcIi4vc3JjL21lbW8tcmFjZS5qc1wiLCBbW1wibWVtb1JhY2VcIixbJGjNj19hID0+IChtZW1vUmFjZSA9ICRozY9fYSldXV1dLFtcIi4vc3JjL2lzLXByb21pc2UuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlUHJvbWlzZUtpdCwnbmFtZScse3ZhbHVlOlwibWFrZVByb21pc2VLaXRcIn0pOyRozY9fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywnbmFtZScse3ZhbHVlOlwicmFjZVByb21pc2VzXCJ9KTskaM2PX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7XG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlID0gZ2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZSB8fCBQcm9taXNlO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiBtYWtlUHJvbWlzZUtpdCgpIHtcbiAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0gPSBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuICBjb25zdCBwcm9taXNlID0gbmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfSk7XG59XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIHJhY2VQcm9taXNlcyh2YWx1ZXMpIHtcbiAgcmV0dXJuIGhhcmRlbihtZW1vUmFjZS5jYWxsKEJlc3RQaXBlbGluYWJsZVByb21pc2UsIHZhbHVlcykpO1xufVxuaGFyZGVuKHJhY2VQcm9taXNlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZUtpdCI6WyJtYWtlUHJvbWlzZUtpdCJdLCJyYWNlUHJvbWlzZXMiOlsicmFjZVByb21pc2VzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKllt9pdAgAAXQIAACoAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjkvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCduYW1lJyx7dmFsdWU6XCJpc1Byb21pc2VcIn0pOyRozY9fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsvKlxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvbWlzZShtYXliZVByb21pc2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpID09PSBtYXliZVByb21pc2U7XG59XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASA5LJWgJAABoCQAAKQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOS9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuKi9cblxuY29uc3QgaXNPYmplY3QgPSAodmFsdWUpID0+IE9iamVjdCh2YWx1ZSkgPT09IHZhbHVlO1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qga25vd25Qcm9taXNlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuICovXG5jb25zdCBtYXJrU2V0dGxlZCA9IChyZWNvcmQpID0+IHtcbiAgaWYgKCFyZWNvcmQgfHwgcmVjb3JkLnNldHRsZWQpIHtcbiAgICByZXR1cm4gbmV3IFNldCgpO1xuICB9XG5cbiAgY29uc3QgeyBkZWZlcnJlZHMgfSA9IHJlY29yZDtcbiAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIHtcbiAgICBkZWZlcnJlZHM6IHVuZGVmaW5lZCxcbiAgICBzZXR0bGVkOiB0cnVlXG4gIH0pO1xuICBPYmplY3QuZnJlZXplKHJlY29yZCk7XG4gIHJldHVybiBkZWZlcnJlZHM7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkID0gKHZhbHVlKSA9PiB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgc2V0dGxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIGxldCByZWNvcmQgPSBrbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZWNvcmQgPSB7IGRlZmVycmVkczogbmV3IFNldCgpLCBzZXR0bGVkOiBmYWxzZSB9O1xuICAgIGtub3duUHJvbWlzZXMuc2V0KHZhbHVlLCByZWNvcmQpO1xuICAgIC8vXG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuICAgICAgKHZhbCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHsgcmVzb2x2ZSB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZXNvbHZlKHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeyByZWplY3QgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCB7IHJhY2UgfSA9IHtcbiAgLypcbiAgXG4gIFxuICBcbiAgICAgKi9cblxuXG5cblxuXG5cblxuXG4gIHJhY2UodmFsdWVzKSB7XG4gICAgbGV0IGRlZmVycmVkO1xuICAgIC8qICAgICAgICAgICAgICAgICAqL1xuICAgIC8vXG4gICAgY29uc3QgY2FjaGVkVmFsdWVzID0gW107XG4gICAgY29uc3QgQyA9IHRoaXM7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEMoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZGVmZXJyZWQgPSB7IHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICBjb25zdCB7IHNldHRsZWQsIGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChzZXR0bGVkKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIEMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIHJlc3VsdC5maW5hbGx5KCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgY2FjaGVkVmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IHsgZGVmZXJyZWRzIH0gPSBnZXRNZW1vUmVjb3JkKHZhbHVlKTtcbiAgICAgICAgaWYgKGRlZmVycmVkcykge1xuICAgICAgICAgIGRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07JGjNj19vbmNlLnJhY2UocmFjZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH/FDJAcBgAAHAYAADQAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjkvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICgpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbnRlcm5hbFJlc29sdmU7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGludGVybmFsUmVqZWN0O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc29sdmUgPSAodmFsdWUpID0+IHtcbiAgICBpZiAoaW50ZXJuYWxSZXNvbHZlKSB7XG4gICAgICBpbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVzb2x2ZSA9PT0gbnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCByZWplY3QgPSAocmVhc29uKSA9PiB7XG4gICAgaWYgKGludGVybmFsUmVqZWN0KSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChyZWFzb24pO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVqZWN0ID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZXhlY3V0b3IgPSAocmVzLCByZWopID0+IHtcbiAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSB1bmRlZmluZWQgJiYgaW50ZXJuYWxSZWplY3QgPT09IHVuZGVmaW5lZCk7XG4gICAgaW50ZXJuYWxSZXNvbHZlID0gcmVzO1xuICAgIGludGVybmFsUmVqZWN0ID0gcmVqO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0pO1xufTskaM2PX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAv3xlY1oUAABaFAAAHAAAAEBlbmRvL3N0cmVhbS12MS4yLjkvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZVBpcGUiLCJtYWtlUXVldWUiLCJtYWtlU3RyZWFtIiwibWFwUmVhZGVyIiwibWFwV3JpdGVyIiwicHJpbWUiLCJwdW1wIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxtYWtlUHJvbWlzZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLy9cbi8vXG4vL1xuY29uc3QgZnJlZXplID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyhPYmplY3QuZnJlZXplKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VRdWV1ZSA9ICgpID0+IHtcbiAgbGV0IHsgcHJvbWlzZTogdGFpbFByb21pc2UsIHJlc29sdmU6IHRhaWxSZXNvbHZlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICByZXR1cm4ge1xuICAgIHB1dCh2YWx1ZSkge1xuICAgICAgY29uc3QgeyByZXNvbHZlLCBwcm9taXNlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgdGFpbFJlc29sdmUoZnJlZXplKHsgdmFsdWUsIHByb21pc2UgfSkpO1xuICAgICAgdGFpbFJlc29sdmUgPSByZXNvbHZlO1xuICAgIH0sXG4gICAgZ2V0KCkge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IHRhaWxQcm9taXNlLnRoZW4oKG5leHQpID0+IG5leHQudmFsdWUpO1xuICAgICAgdGFpbFByb21pc2UgPSB0YWlsUHJvbWlzZS50aGVuKChuZXh0KSA9PiBuZXh0LnByb21pc2UpO1xuICAgICAgcmV0dXJuIGhhcmRlbihwcm9taXNlKTtcbiAgICB9XG4gIH07XG59OyRozY9fb25jZS5tYWtlUXVldWUobWFrZVF1ZXVlKTtcbmhhcmRlbihtYWtlUXVldWUpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlU3RyZWFtID0gKGFja3MsIGRhdGEpID0+IHtcbiAgY29uc3Qgc3RyZWFtID0gaGFyZGVuKHtcbiAgICAvKlxuICAgICAgKi9cblxuICAgIG5leHQodmFsdWUpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgZGF0YS5wdXQoZnJlZXplKHsgdmFsdWUsIGRvbmU6IGZhbHNlIH0pKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgLypcbiAgICAgICovXG5cbiAgICByZXR1cm4odmFsdWUpIHtcbiAgICAgIGRhdGEucHV0KGZyZWV6ZSh7IHZhbHVlLCBkb25lOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgLypcbiAgICAgICovXG5cbiAgICB0aHJvdyhlcnJvcikge1xuICAgICAgZGF0YS5wdXQoaGFyZGVuKFByb21pc2UucmVqZWN0KGVycm9yKSkpO1xuICAgICAgcmV0dXJuIGFja3MuZ2V0KCk7XG4gICAgfSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufTskaM2PX29uY2UubWFrZVN0cmVhbShtYWtlU3RyZWFtKTtcbmhhcmRlbihtYWtlU3RyZWFtKTtcblxuLy9cbi8vXG4vL1xuY29uc3QgbWFrZVBpcGUgPSAoKSA9PiB7XG4gIGNvbnN0IGRhdGEgPSBtYWtlUXVldWUoKTtcbiAgY29uc3QgYWNrcyA9IG1ha2VRdWV1ZSgpO1xuICBjb25zdCByZWFkZXIgPSBtYWtlU3RyZWFtKGFja3MsIGRhdGEpO1xuICBjb25zdCB3cml0ZXIgPSBtYWtlU3RyZWFtKGRhdGEsIGFja3MpO1xuICByZXR1cm4gaGFyZGVuKFt3cml0ZXIsIHJlYWRlcl0pO1xufTskaM2PX29uY2UubWFrZVBpcGUobWFrZVBpcGUpO1xuaGFyZGVuKG1ha2VQaXBlKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBwdW1wID0gYXN5bmMgKHdyaXRlciwgcmVhZGVyLCBwcmltZXIpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB0aWNrID0gKHByb21pc2UpID0+XG4gIEUud2hlbihcbiAgICBwcm9taXNlLFxuICAgIChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICByZXR1cm4gd3JpdGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHRvY2sod3JpdGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAoIC8qICAgICAgICAgICAgICAgICovZXJyb3IpID0+IHtcbiAgICAgIHJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuICAgIH1cbiAgKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHRvY2sgPSAocHJvbWlzZSkgPT5cbiAgRS53aGVuKFxuICAgIHByb21pc2UsXG4gICAgKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgIHJldHVybiByZWFkZXIucmV0dXJuKHJlc3VsdC52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGljayhyZWFkZXIubmV4dChyZXN1bHQudmFsdWUpKTtcbiAgICAgIH1cbiAgICB9LFxuICAgICggLyogICAgICAgICAgICAgICAgKi9lcnJvcikgPT4ge1xuICAgICAgcmV0dXJuIHJlYWRlci50aHJvdyhlcnJvcik7XG4gICAgfVxuICApO1xuICBhd2FpdCB0aWNrKHJlYWRlci5uZXh0KHByaW1lcikpO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufTskaM2PX29uY2UucHVtcChwdW1wKTtcbmhhcmRlbihwdW1wKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IHByaW1lID0gKGdlbmVyYXRvciwgcHJpbWVyKSA9PiB7XG4gIC8vXG4gIGNvbnN0IGZpcnN0ID0gZ2VuZXJhdG9yLm5leHQocHJpbWVyKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgcmVzdWx0O1xuICBjb25zdCBwcmltZWQgPSBoYXJkZW4oe1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBhc3luYyBuZXh0KHZhbHVlKSB7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmlyc3Q7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBnZW5lcmF0b3IubmV4dCh2YWx1ZSk7XG4gICAgfSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGFzeW5jIHJldHVybih2YWx1ZSkge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGZpcnN0O1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLnJldHVybih2YWx1ZSk7XG4gICAgfSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBhc3luYyB0aHJvdyhlcnJvcikge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGZpcnN0O1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdlbmVyYXRvci50aHJvdyhlcnJvcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHByaW1lZDtcbn07JGjNj19vbmNlLnByaW1lKHByaW1lKTtcbmhhcmRlbihwcmltZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYXBSZWFkZXIgPSAocmVhZGVyLCB0cmFuc2Zvcm0pID0+IHtcbiAgYXN5bmMgZnVuY3Rpb24qIHRyYW5zZm9ybUdlbmVyYXRvcigpIHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIHJlYWRlcikge1xuICAgICAgeWllbGQgdHJhbnNmb3JtKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBoYXJkZW4odHJhbnNmb3JtR2VuZXJhdG9yKTtcbiAgcmV0dXJuIGhhcmRlbih0cmFuc2Zvcm1HZW5lcmF0b3IoKSk7XG59OyRozY9fb25jZS5tYXBSZWFkZXIobWFwUmVhZGVyKTtcbmhhcmRlbihtYXBSZWFkZXIpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFwV3JpdGVyID0gKHdyaXRlciwgdHJhbnNmb3JtKSA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybWVkV3JpdGVyID0gaGFyZGVuKHtcbiAgICAvKlxuICAgICAgKi9cblxuICAgIGFzeW5jIG5leHQodmFsdWUpIHtcbiAgICAgIHJldHVybiB3cml0ZXIubmV4dCh0cmFuc2Zvcm0odmFsdWUpKTtcbiAgICB9LFxuICAgIC8qXG4gICAgICAqL1xuXG4gICAgYXN5bmMgdGhyb3coZXJyb3IpIHtcbiAgICAgIHJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuICAgIH0sXG4gICAgLypcbiAgICAgICovXG5cbiAgICBhc3luYyByZXR1cm4odmFsdWUpIHtcbiAgICAgIHJldHVybiB3cml0ZXIucmV0dXJuKHZhbHVlKTtcbiAgICB9LFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRyYW5zZm9ybWVkV3JpdGVyO1xufTskaM2PX29uY2UubWFwV3JpdGVyKG1hcFdyaXRlcik7XG5oYXJkZW4obWFwV3JpdGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VRdWV1ZSI6WyJtYWtlUXVldWUiXSwibWFrZVN0cmVhbSI6WyJtYWtlU3RyZWFtIl0sIm1ha2VQaXBlIjpbIm1ha2VQaXBlIl0sInB1bXAiOlsicHVtcCJdLCJwcmltZSI6WyJwcmltZSJdLCJtYXBSZWFkZXIiOlsibWFwUmVhZGVyIl0sIm1hcFdyaXRlciI6WyJtYXBXcml0ZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7lv2v9EBAADRAQAAHAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL21haW4uanN7ImltcG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vcmluZzAvbWFpbi5qc1wiLCBbXV0sW1wiLi9yaW5nMS9tYWluLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPZgJeSBAQAAgQEAAB8AAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9FLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIkBlbmRvL2ZhciJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAG7X0JJ8CAACfAgAALAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhc3luY0dlbmVyYXRlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGFzeW5jR2VuZXJhdGUgPSAobmV4dCkgPT4ge1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogYXN5bmMgKCkgPT4gaGFyZGVuKG5leHQoKSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59OyRozY9fb25jZS5hc3luY0dlbmVyYXRlKGFzeW5jR2VuZXJhdGUpO1xuaGFyZGVuKGFzeW5jR2VuZXJhdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNHZW5lcmF0ZSI6WyJhc3luY0dlbmVyYXRlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP56+f30AQAA9AEAACIAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWluLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyIsIi4vbWFrZXJzLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vRS5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiLCIuL21ha2Vycy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL0UuanNcIiwgW11dLFtcIi4vbWFrZXJzLmpzXCIsIFtdXSxbXCIuL2FzeW5jLWdlbmVyYXRlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABQli5nLBwAAywcAACQAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWtlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VNYXAiLCJtYWtlUHJvbWlzZSIsIm1ha2VTZXQiLCJtYWtlV2Vha01hcCIsIm1ha2VXZWFrU2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vL1xuLy9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBtYWtlUHJvbWlzZSA9IChleGVjdXRvcikgPT4gaGFyZGVuKG5ldyBQcm9taXNlKGV4ZWN1dG9yKSk7JGjNj19vbmNlLm1ha2VQcm9taXNlKG1ha2VQcm9taXNlKTtcbmhhcmRlbihtYWtlUHJvbWlzZSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1ha2VNYXAgPSAoZW50cmllc09ySXRlcmFibGUpID0+IGhhcmRlbihuZXcgTWFwKGVudHJpZXNPckl0ZXJhYmxlKSk7JGjNj19vbmNlLm1ha2VNYXAobWFrZU1hcCk7XG5oYXJkZW4obWFrZU1hcCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYWtlU2V0ID0gKHZhbHVlcykgPT4gaGFyZGVuKG5ldyBTZXQodmFsdWVzKSk7JGjNj19vbmNlLm1ha2VTZXQobWFrZVNldCk7XG5oYXJkZW4obWFrZVNldCk7XG5cbi8qXG5cblxuXG4gKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1ha2VXZWFrTWFwID0gKGVudHJpZXMpID0+IGhhcmRlbihuZXcgV2Vha01hcChlbnRyaWVzKSk7JGjNj19vbmNlLm1ha2VXZWFrTWFwKG1ha2VXZWFrTWFwKTtcbmhhcmRlbihtYWtlV2Vha01hcCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWFrZVdlYWtTZXQgPSAodmFsdWVzKSA9PiBoYXJkZW4obmV3IFdlYWtTZXQodmFsdWVzKSk7JGjNj19vbmNlLm1ha2VXZWFrU2V0KG1ha2VXZWFrU2V0KTtcbmhhcmRlbihtYWtlV2Vha1NldCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZSI6WyJtYWtlUHJvbWlzZSJdLCJtYWtlTWFwIjpbIm1ha2VNYXAiXSwibWFrZVNldCI6WyJtYWtlU2V0Il0sIm1ha2VXZWFrTWFwIjpbIm1ha2VXZWFrTWFwIl0sIm1ha2VXZWFrU2V0IjpbIm1ha2VXZWFrU2V0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALgt19enAwAApwMAACkAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMS9hc3luYy10b29scy5qc3siaW1wb3J0cyI6WyIuLi9yaW5nMC9tYWluLmpzIl0sImV4cG9ydHMiOlsiYXN5bmNEb1doaWxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVByb21pc2U7JGjNj19pbXBvcnRzKFtbXCIuLi9yaW5nMC9tYWluLmpzXCIsIFtbXCJtYWtlUHJvbWlzZVwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBhc3luY0RvV2hpbGUgPSAoYm9keSkgPT4ge1xuICByZXR1cm4gbWFrZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGxvb3AgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkb0NvbnRpbnVlID0gYXdhaXQgYm9keSgpO1xuICAgICAgaWYgKCFkb0NvbnRpbnVlKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxvb3AoKS5jYXRjaChyZWplY3QpO1xuICAgIH07XG5cbiAgICBsb29wKCkuY2F0Y2gocmVqZWN0KTtcbiAgfSk7XG59OyRozY9fb25jZS5hc3luY0RvV2hpbGUoYXN5bmNEb1doaWxlKTtcbmhhcmRlbihhc3luY0RvV2hpbGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNEb1doaWxlIjpbImFzeW5jRG9XaGlsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAbaDcDlgEAAJYBAAAiAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvbWFpbi5qc3siaW1wb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2FzeW5jLXRvb2xzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAAhZUwD8EWAQDBFgEAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAMYBI+I0BAACNAQAAIAAAAAAAAAAAAAAApIHzFgEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL2hlYXAuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIG+GAEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAEykkf/GCgAAxgoAACQAAAAAAAAAAAAAAKSBWxoBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAAAVbrH6eQIAAHkCAAAlAAAAAAAAAAAAAACkgWMlAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAL5TX1dvAgAAbwIAACsAAAAAAAAAAAAAAKSBHygBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaXMtcGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAA1iu6nJ4DAACeAwAAJAAAAAAAAAAAAAAApIHXKgEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9rZXlzLmpzUEsBAh4DCgAAAAAAAAAAAGwo0rquBwAArgcAACkAAAAAAAAAAAAAAKSBty4BAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvbWFrZS1vbmNlLmpzUEsBAh4DCgAAAAAAAAAAABAMGTuYDAAAmAwAADEAAAAAAAAAAAAAAKSBrDYBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvcHJlcGFyZS1yZXZvY2FibGUuanNQSwECHgMKAAAAAAAAAAAAqlg51LQJAAC0CQAALQAAAAAAAAAAAAAApIGTQwEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy93YXRjaC1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAPo8pgO0AQAAtAEAACgAAAAAAAAAAAAAAKSBkk0BAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC96b25lLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAACI3vaoEfAACBHwAAJgAAAAAAAAAAAAAApIGMTwEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudE1hdGguanNQSwECHgMKAAAAAAAAAAAAf+5UfC0EAAAtBAAAJwAAAAAAAAAAAAAApIFRbwEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAJ6YVUT8BQAA/AUAACcAAAAAAAAAAAAAAKSBw3MBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9kaXNwbGF5SW5mby5qc1BLAQIeAwoAAAAAAAAAAADzX00DTQIAAE0CAAAhAAAAAAAAAAAAAACkgQR6AQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA+lZ1Z5IXAACSFwAAJQAAAAAAAAAAAAAApIGQfAEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2lzc3VlcktpdC5qc1BLAQIeAwoAAAAAAAAAAAAj0rcoDgYAAA4GAAA6AAAAAAAAAAAAAACkgWWUAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAEk/yVXMBQAAzAUAADoAAAAAAAAAAAAAAKSBy5oBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAExElqrcEAAC3BAAANgAAAAAAAAAAAAAApIHvoAEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAIvD1yOUBgAAlAYAADYAAAAAAAAAAAAAAKSB+qUBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAw8Vd8wAMAAMADAAAjAAAAAAAAAAAAAACkgeKsAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudC5qc1BLAQIeAwoAAAAAAAAAAAA3HR5IUSUAAFElAAApAAAAAAAAAAAAAACkgeOwAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudExlZGdlci5qc1BLAQIeAwoAAAAAAAAAAAAmB6u45hQAAOYUAAAhAAAAAAAAAAAAAACkgXvWAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcHVyc2UuanNQSwECHgMKAAAAAAAAAAAAswC9wCUGAAAlBgAALQAAAAAAAAAAAAAApIGg6wEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAADLRhfnSGQAA0hkAACYAAAAAAAAAAAAAAKSBEPIBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAAAAAAAAAAAAAKSBJgwCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAD/AS0vkgMAAJIDAAArAAAAAAAAAAAAAACkgcMNAgBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29uc3RhbnRzLmpzUEsBAh4DCgAAAAAAAAAAAJTyhvowDAAAMAwAAD8AAAAAAAAAAAAAAKSBnhECAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvYXNzZXJ0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAACC/IC0xg8AAMYPAAA+AAAAAAAAAAAAAACkgSseAgBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qc1BLAQIeAwoAAAAAAAAAAABnsGuuxw0AAMcNAABBAAAAAAAAAAAAAACkgU0uAgBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc1BLAQIeAwoAAAAAAAAAAADkXmmCDhQAAA4UAABAAAAAAAAAAAAAAACkgXM8AgBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzUEsBAh4DCgAAAAAAAAAAAGrBhdq8NwAAvDcAAEEAAAAAAAAAAAAAAKSB31ACAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzUEsBAh4DCgAAAAAAAAAAANKpUgixDgAAsQ4AAEYAAAAAAAAAAAAAAKSB+ogCAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanNQSwECHgMKAAAAAAAAAAAA07mJoSETAAAhEwAAMgAAAAAAAAAAAAAApIEPmAIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJub3IuanNQSwECHgMKAAAAAAAAAAAARl5o3/YpAAD2KQAANQAAAAAAAAAAAAAApIGAqwIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanNQSwECHgMKAAAAAAAAAAAAKqULgtYhAADWIQAAMAAAAAAAAAAAAAAApIHJ1QIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0SGVscGVyLmpzUEsBAh4DCgAAAAAAAAAAAOxRY/A9CQAAPQkAACcAAAAAAAAAAAAAAKSB7fcCAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAD85vRilwwAAJcMAAAqAAAAAAAAAAAAAACkgW8BAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvcXVlc3Rpb24uanNQSwECHgMKAAAAAAAAAAAAGOwXfFE9AABRPQAALAAAAAAAAAAAAAAApIFODgMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAA5Mm0FroJAAC6CQAALAAAAAAAAAAAAAAApIHpSwMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3ZhbGlkYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAhbropTUEAAA1BAAAMQAAAAAAAAAAAAAApIHtVQMAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9jb2xsZWN0RmVlcy5qc1BLAQIeAwoAAAAAAAAAAAAOwQcGaw0AAGsNAAA1AAAAAAAAAAAAAACkgXFaAwBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL2NvbnRyYWN0U3VwcG9ydC5qc1BLAQIeAwoAAAAAAAAAAABGVsYPTTYAAE02AAAtAAAAAAAAAAAAAACkgS9oAwBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3BzbS9wc20uanNQSwECHgMKAAAAAAAAAAAAeDHUL+McAADjHAAAJwAAAAAAAAAAAAAApIHHngMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NhbGxiYWNrLmpzUEsBAh4DCgAAAAAAAAAAANLK05RRBgAAUQYAACUAAAAAAAAAAAAAAKSB77sDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanNQSwECHgMKAAAAAAAAAAAAmYszw1sFAABbBQAAJAAAAAAAAAAAAAAApIGDwgMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzUEsBAh4DCgAAAAAAAAAAACqpPNiqAgAAqgIAACUAAAAAAAAAAAAAAKSBIMgDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9lcnJvcnMuanNQSwECHgMKAAAAAAAAAAAAtVyY078DAAC/AwAAJAAAAAAAAAAAAAAApIENywMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHlXbMunDwAApw8AACcAAAAAAAAAAAAAAKSBDs8DAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9qcy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAD/Ln+sAxgAAAMYAAAvAAAAAAAAAAAAAACkgfreAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1BLAQIeAwoAAAAAAAAAAADchL469BAAAPQQAAAmAAAAAAAAAAAAAACkgUr3AwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC5qc1BLAQIeAwoAAAAAAAAAAAAfjh3AfQkAAH0JAAArAAAAAAAAAAAAAACkgYIIBABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAOTffjz/KwAA/ysAACgAAAAAAAAAAAAAAKSBSBIEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9zZXMtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAYyfouK4GAACuBgAALAAAAAAAAAAAAAAApIGNPgQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3Rlc3RpbmctdXRpbHMuanNQSwECHgMKAAAAAAAAAAAA7dpMhg0DAAANAwAAKAAAAAAAAAAAAAAApIGFRQQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVDaGVjay5qc1BLAQIeAwoAAAAAAAAAAABBTNfKJAQAACQEAAApAAAAAAAAAAAAAACkgdhIBABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAAAAAAAAAAACkgUNNBABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAAokoYYDMHAAAzBwAAKgAAAAAAAAAAAAAApIHjTgQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3VwZ3JhZGUtYXBpLmpzUEsBAh4DCgAAAAAAAAAAAP16ULHQCAAA0AgAADMAAAAAAAAAAAAAAKSBXlYEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAADCPu246wcAAOsHAAAkAAAAAAAAAAAAAACkgX9fBABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAg93X6xITAAASEwAAJwAAAAAAAAAAAAAApIGsZwQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAMQtoiNlMgAAZTIAACoAAAAAAAAAAAAAAKSBA3sEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAA/vs2dkggAAJIIAAAuAAAAAAAAAAAAAACkgbCtBABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAACQ4C37MFwAAzBcAACcAAAAAAAAAAAAAAKSBjrYEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc1BLAQIeAwoAAAAAAAAAAACRfA0UDxYAAA8WAAAoAAAAAAAAAAAAAACkgZ/OBABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlLmpzUEsBAh4DCgAAAAAAAAAAAJk8xWBFCAAARQgAACkAAAAAAAAAAAAAAKSB9OQEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmVyLmpzUEsBAh4DCgAAAAAAAAAAAIIRdwZGBAAARgQAACQAAAAAAAAAAAAAAKSBgO0EAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90b3BpYy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAAAAAAAAAAACkgQjyBABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAAXb30c/8GAAD/BgAALQAAAAAAAAAAAAAApIGo8wQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAFnT/DycDQAAnA0AACEAAAAAAAAAAAAAAKSB8voEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABR/fNp+AUAAPgFAAAsAAAAAAAAAAAAAACkgc0IBQBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc1BLAQIeAwoAAAAAAAAAAABK8dlNnwUAAJ8FAAAwAAAAAAAAAAAAAACkgQ8PBQBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNQSwECHgMKAAAAAAAAAAAA8HAajLgSAAC4EgAAMQAAAAAAAAAAAAAApIH8FAUAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAAnfMYU1wwAANcMAAAxAAAAAAAAAAAAAACkgQMoBQBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAG53WIilDwAApQ8AADUAAAAAAAAAAAAAAKSBKTUFAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAP2echGyCwAAsgsAADUAAAAAAAAAAAAAAKSBIUUFAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAEcwlJFrEAAAaxAAAC4AAAAAAAAAAAAAAKSBJlEFAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIQAAAAAAAAAAAAAApIHdYQUAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAO31mJswAgAAMAIAABwAAAAAAAAAAAAAAKSBdGMFAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAADt7QjLEVAACxFQAAIwAAAAAAAAAAAAAApIHeZQUAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdGltZU1hdGguanNQSwECHgMKAAAAAAAAAAAAep/6yAIJAAACCQAAJQAAAAAAAAAAAAAApIHQewUAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAAAAAAAAAAACkgRWFBQBAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAi9gY+DxkAAA8ZAAAoAAAAAAAAAAAAAACkgbGGBQBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAM+c6+m2CAAAtggAACQAAAAAAAAAAAAAAKSBBqAFAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADrZyWszxcAAM8XAAAwAAAAAAAAAAAAAACkgf6oBQBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAA4zMxAX4UAAB+FAAAKAAAAAAAAAAAAAAApIEbwQUAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY2xlYW5Qcm9wb3NhbC5qc1BLAQIeAwoAAAAAAAAAAADr1+zkWwYAAFsGAAA0AAAAAAAAAAAAAACkgd/VBQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzUEsBAh4DCgAAAAAAAAAAAJjc6VNXBwAAVwcAADkAAAAAAAAAAAAAAKSBjNwFAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qc1BLAQIeAwoAAAAAAAAAAADqgwqHeBAAAHgQAAA4AAAAAAAAAAAAAACkgTrkBQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qc1BLAQIeAwoAAAAAAAAAAADLOQ2VkAoAAJAKAAA1AAAAAAAAAAAAAACkgQj1BQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qc1BLAQIeAwoAAAAAAAAAAADdDckzUAoAAFAKAAAwAAAAAAAAAAAAAACkgev/BQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNQSwECHgMKAAAAAAAAAAAArr+Fc30JAAB9CQAAOgAAAAAAAAAAAAAApIGJCgYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByZXBhcmUtb3duYWJsZS5qc1BLAQIeAwoAAAAAAAAAAAALVPyNLCsAACwrAAA5AAAAAAAAAAAAAACkgV4UBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanNQSwECHgMKAAAAAAAAAAAAugSoV0YJAABGCQAANQAAAAAAAAAAAAAApIHhPwYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanNQSwECHgMKAAAAAAAAAAAA0GpsuWQsAABkLAAAMAAAAAAAAAAAAAAApIF6SQYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzUEsBAh4DCgAAAAAAAAAAANMXGnEXHAAAFxwAADMAAAAAAAAAAAAAAKSBLHYGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qc1BLAQIeAwoAAAAAAAAAAADl7gszkgUAAJIFAAAzAAAAAAAAAAAAAACkgZSSBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc2FmZU1hdGguanNQSwECHgMKAAAAAAAAAAAAMrGGcAwEAAAMBAAANwAAAAAAAAAAAAAApIF3mAYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRlTWFjaGluZS5qc1BLAQIeAwoAAAAAAAAAAAD9bnjQ/AMAAPwDAAA1AAAAAAAAAAAAAACkgdicBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qc1BLAQIeAwoAAAAAAAAAAAD6815PigYAAIoGAAAxAAAAAAAAAAAAAACkgSehBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzUEsBAh4DCgAAAAAAAAAAADgwUjjyJAAA8iQAADUAAAAAAAAAAAAAAKSBAKgGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAPrxR92CBgAAggYAACUAAAAAAAAAAAAAAKSBRc0GAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL21ha2VIYW5kbGUuanNQSwECHgMKAAAAAAAAAAAAw/RkBThHAAA4RwAAJQAAAAAAAAAAAAAApIEK1AYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAADZ9JO0lgEAAJYBAAAeAAAAAAAAAAAAAACkgYUbBwBAYWdvcmljL3pvbmUtdjAuMi4yL2R1cmFibGUuanNQSwECHgMKAAAAAAAAAAAAozR9odgRAADYEQAAIgAAAAAAAAAAAAAApIFXHQcAQGFnb3JpYy96b25lLXYwLjIuMi9zcmMvZHVyYWJsZS5qc1BLAQIeAwoAAAAAAAAAAAB63APlKwUAACsFAAArAAAAAAAAAAAAAACkgW8vBwBAZW5kby9jb21tb24tdjEuMi45L2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzUEsBAh4DCgAAAAAAAAAAAJeozBCgBAAAoAQAACoAAAAAAAAAAAAAAKSB4zQHAEBlbmRvL2NvbW1vbi12MS4yLjkvZnJvbS11bmlxdWUtZW50cmllcy5qc1BLAQIeAwoAAAAAAAAAAAARhrgsQwIAAEMCAAAkAAAAAAAAAAAAAACkgcs5BwBAZW5kby9jb21tb24tdjEuMi45L2lkZW50LWNoZWNrZXIuanNQSwECHgMKAAAAAAAAAAAADiqeqIsCAACLAgAAJgAAAAAAAAAAAAAApIFQPAcAQGVuZG8vY29tbW9uLXYxLjIuOS9saXN0LWRpZmZlcmVuY2UuanNQSwECHgMKAAAAAAAAAAAAQlYEPa8DAACvAwAAKgAAAAAAAAAAAAAApIEfPwcAQGVuZG8vY29tbW9uLXYxLjIuOS9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzUEsBAh4DCgAAAAAAAAAAANXp4eNWAgAAVgIAACQAAAAAAAAAAAAAAKSBFkMHAEBlbmRvL2NvbW1vbi12MS4yLjkvbWFrZS1pdGVyYXRvci5qc1BLAQIeAwoAAAAAAAAAAADwcybJKgMAACoDAAAhAAAAAAAAAAAAAACkga5FBwBAZW5kby9jb21tb24tdjEuMi45L29iamVjdC1tYXAuanNQSwECHgMKAAAAAAAAAAAA4LHdvxoEAAAaBAAAJgAAAAAAAAAAAAAApIEXSQcAQGVuZG8vY29tbW9uLXYxLjIuOS9vYmplY3QtbWV0YS1tYXAuanNQSwECHgMKAAAAAAAAAAAAc1HEzgwEAAAMBAAAJAAAAAAAAAAAAAAApIF1TQcAQGVuZG8vY29tbW9uLXYxLjIuOS90aHJvdy1sYWJlbGVkLmpzUEsBAh4DCgAAAAAAAAAAADSioamiAQAAogEAACEAAAAAAAAAAAAAAKSBw1EHAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACPjvjegg8AAIIPAAArAAAAAAAAAAAAAACkgaRTBwBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvc3JjL2Vudi1vcHRpb25zLmpzUEsBAh4DCgAAAAAAAAAAACfFJmw5CAAAOQgAABwAAAAAAAAAAAAAAKSBb2MHAEBlbmRvL2Vycm9ycy12MS4yLjkvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAUUg0vVcVAABXFQAAIwAAAAAAAAAAAAAApIHiawcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKQAAAAAAAAAAAAAApIF6gQcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAUMfJoGIOAABiDgAAJwAAAAAAAAAAAAAApIEZgwcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAvc3JjL2xvY2FsLmpzUEsBAh4DCgAAAAAAAAAAAN8er60LDwAACw8AADUAAAAAAAAAAAAAAKSBwJEHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzUEsBAh4DCgAAAAAAAAAAAAfWAo09AwAAPQMAACkAAAAAAAAAAAAAAKSBHqEHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wL3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAELHZlNeCgAAXgoAAC0AAAAAAAAAAAAAAKSBoqQHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wL3NyYy90cmFjay10dXJucy5qc1BLAQIeAwoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAAAAAAAAAAACkgUuvBwBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMC91dGlscy5qc1BLAQIeAwoAAAAAAAAAAADcRdmjYAIAAGACAAAZAAAAAAAAAAAAAACkgfCxBwBAZW5kby9leG8tdjEuNS44L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALEPXgqQFwAAkBcAACIAAAAAAAAAAAAAAKSBh7QHAEBlbmRvL2V4by12MS41Ljgvc3JjL2V4by1tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAADq9w1ZI3AACSNwAAIQAAAAAAAAAAAAAApIFXzAcAQGVuZG8vZXhvLXYxLjUuOC9zcmMvZXhvLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAO2SxBc/AgAAPwIAACUAAAAAAAAAAAAAAKSBKAQIAEBlbmRvL2V4by12MS41Ljgvc3JjL2dldC1pbnRlcmZhY2UuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAHQAAAAAAAAAAAAAApIGqBggAQGVuZG8vZXhvLXYxLjUuOC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIAAAAAAAAAAAAAAApIE9CAgAQGVuZG8vZmFyLXYxLjEuMTAvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAqSbWUJgCAACYAgAAHgAAAAAAAAAAAAAApIHTCQgAQGVuZG8vZmFyLXYxLjEuMTAvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAC3VUAaCBwAAggcAAB0AAAAAAAAAAAAAAKSBpwwIAEBlbmRvL21hcnNoYWwtdjEuNi4zL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAOBYGPFbTwAAW08AACoAAAAAAAAAAAAAAKSBZBQIAEBlbmRvL21hcnNoYWwtdjEuNi4zL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAAAafrXMKy0AACstAAArAAAAAAAAAAAAAACkgQdkCABAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzUEsBAh4DCgAAAAAAAAAAALVs5lQWLgAAFi4AAC0AAAAAAAAAAAAAAKSBe5EIAEBlbmRvL21hcnNoYWwtdjEuNi4zL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc1BLAQIeAwoAAAAAAAAAAACMsqlenDAAAJwwAAAqAAAAAAAAAAAAAACkgdy/CABAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvbWFyc2hhbC1qdXN0aW4uanNQSwECHgMKAAAAAAAAAAAAvKkHKzUHAAA1BwAALQAAAAAAAAAAAAAApIHA8AgAQGVuZG8vbWFyc2hhbC12MS42LjMvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAAJk7OoJELwAARC8AACMAAAAAAAAAAAAAAKSBQPgIAEBlbmRvL21hcnNoYWwtdjEuNi4zL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAEjU06mpLgAAqS4AACUAAAAAAAAAAAAAAKSBxScJAEBlbmRvL21hcnNoYWwtdjEuNi4zL3NyYy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIQAAAAAAAAAAAAAApIGxVgkAQGVuZG8vbWFyc2hhbC12MS42LjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAPBdviHKBQAAygUAAB4AAAAAAAAAAAAAAKSBSFgJAEBlbmRvL25hdC12NS4wLjE0L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAC9HZqTQoAAE0KAAAgAAAAAAAAAAAAAACkgU5eCQBAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADFJpDt8AYAAPAGAAAoAAAAAAAAAAAAAACkgdloCQBAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAAHJCCf8SCQAAEgkAACkAAAAAAAAAAAAAAKSBD3AJAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAP0I8/LUCwAA1AsAAC4AAAAAAAAAAAAAAKSBaHkJAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAh0HBY10UAABdFAAAJAAAAAAAAAAAAAAApIGIhQkAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAAO/+alRWBgAAVgYAACsAAAAAAAAAAAAAAKSBJ5oJAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAoCAM4pgSAACYEgAAJwAAAAAAAAAAAAAApIHGoAkAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAADD1/S3EBAAAxAQAACkAAAAAAAAAAAAAAKSBo7MJAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAANJlCXF1FgAAdRYAADAAAAAAAAAAAAAAAKSBrrgJAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAACpguSl9ioAAPYqAAAqAAAAAAAAAAAAAACkgXHPCQBAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAaywNP1AbAABQGwAAKAAAAAAAAAAAAAAApIGv+gkAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAADwC9AoOw4AADsOAAArAAAAAAAAAAAAAACkgUUWCgBAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAALc3x2MaCAAAGggAACUAAAAAAAAAAAAAAKSBySQKAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9zdHJpbmcuanNQSwECHgMKAAAAAAAAAAAA3X27aqwKAACsCgAAJQAAAAAAAAAAAAAApIEmLQoAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAADWivwwpwcAAKcHAAAlAAAAAAAAAAAAAACkgRU4CgBAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAALOhyY5SCQAAUgkAACkAAAAAAAAAAAAAAKSB/z8KAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAAAAAAAAAAAAAKSBmEkKAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADRrBHjxQ4AAMUOAAAeAAAAAAAAAAAAAACkgTJLCgBAZW5kby9wYXR0ZXJucy12MS40LjgvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAHRh3fqU2AAClNgAAKgAAAAAAAAAAAAAApIEzWgoAQGVuZG8vcGF0dGVybnMtdjEuNC44L3NyYy9rZXlzL2NoZWNrS2V5LmpzUEsBAh4DCgAAAAAAAAAAAMTUu/5mGgAAZhoAAC0AAAAAAAAAAAAAAKSBIJEKAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1BLAQIeAwoAAAAAAAAAAAAhsRU2wQ4AAMEOAAApAAAAAAAAAAAAAACkgdGrCgBAZW5kby9wYXR0ZXJucy12MS40Ljgvc3JjL2tleXMvY29weUJhZy5qc1BLAQIeAwoAAAAAAAAAAABWOGJ5WgwAAFoMAAApAAAAAAAAAAAAAACkgdm6CgBAZW5kby9wYXR0ZXJucy12MS40Ljgvc3JjL2tleXMvY29weVNldC5qc1BLAQIeAwoAAAAAAAAAAAB1T5HTHRYAAB0WAAA5AAAAAAAAAAAAAACkgXrHCgBAZW5kby9wYXR0ZXJucy12MS40Ljgvc3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAEONRgSEcAAAhHAAANQAAAAAAAAAAAAAApIHu3QoAQGVuZG8vcGF0dGVybnMtdjEuNC44L3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAhs/QG64iAACuIgAANQAAAAAAAAAAAAAApIFi+goAQGVuZG8vcGF0dGVybnMtdjEuNC44L3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAimaBUfAaAADwGgAANgAAAAAAAAAAAAAApIFjHQsAQGVuZG8vcGF0dGVybnMtdjEuNC44L3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzUEsBAh4DCgAAAAAAAAAAAILhueNl1gAAZdYAADUAAAAAAAAAAAAAAKSBpzgLAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACIAAAAAAAAAAAAAAKSBXw8MAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAZJEbcVQGAABUBgAAIQAAAAAAAAAAAAAApIH3EAwAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS45L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKllt9pdAgAAXQIAACoAAAAAAAAAAAAAAKSBihcMAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOS9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAABIDkslaAkAAGgJAAApAAAAAAAAAAAAAACkgS8aDABAZW5kby9wcm9taXNlLWtpdC12MS4xLjkvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAAB/xQyQHAYAABwGAAA0AAAAAAAAAAAAAACkgd4jDABAZW5kby9wcm9taXNlLWtpdC12MS4xLjkvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACUAAAAAAAAAAAAAAKSBTCoMAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAv3xlY1oUAABaFAAAHAAAAAAAAAAAAAAApIHnKwwAQGVuZG8vc3RyZWFtLXYxLjIuOS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADuW/a/0QEAANEBAAAcAAAAAAAAAAAAAACkgXtADABqZXNzaWUuanMtdjAuMy40L3NyYy9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAPZgJeSBAQAAgQEAAB8AAAAAAAAAAAAAAKSBhkIMAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL0UuanNQSwECHgMKAAAAAAAAAAAAG7X0JJ8CAACfAgAALAAAAAAAAAAAAAAApIFERAwAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanNQSwECHgMKAAAAAAAAAAAA/nr5/fQBAAD0AQAAIgAAAAAAAAAAAAAApIEtRwwAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAAAUJYuZywcAAMsHAAAkAAAAAAAAAAAAAACkgWFJDABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAuC3X16cDAACnAwAAKQAAAAAAAAAAAAAApIFuUQwAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAG2g3A5YBAACWAQAAIgAAAAAAAAAAAAAApIFcVQwAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvbWFpbi5qc1BLBQYAAAAAtgC2AJ8+AAAyVwwAAAA=","endoZipBase64Sha512":"9744ee87766719e5b65af888edd5a92aeae6b95a782927b73ea4d6ef38ee5cfd5063d58a3a98a0c090b3de496406c9fa6643cdf52c1533bdd05d4692e9f70830"};
|