@agoric/builders 0.3.0-u23.0 → 0.3.0-u23.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 -0
- package/package.json +17 -17
- package/scripts/bundles/bundle-binaryVoteCounter-js-meta.json +0 -790
- package/scripts/bundles/bundle-binaryVoteCounter.js +0 -1
- package/scripts/bundles/bundle-committee-js-meta.json +0 -810
- package/scripts/bundles/bundle-committee.js +0 -1
- package/scripts/bundles/bundle-contractGovernor-js-meta.json +0 -805
- package/scripts/bundles/bundle-contractGovernor.js +0 -1
- package/scripts/bundles/bundle-econCommitteeCharter-js-meta.json +0 -765
- package/scripts/bundles/bundle-econCommitteeCharter.js +0 -1
- package/scripts/bundles/bundle-feeDistributor-js-meta.json +0 -770
- package/scripts/bundles/bundle-feeDistributor.js +0 -1
- package/scripts/bundles/bundle-fluxAggregatorKit-js-meta.json +0 -960
- package/scripts/bundles/bundle-fluxAggregatorKit.js +0 -1
- package/scripts/bundles/bundle-mintHolder-js-meta.json +0 -740
- package/scripts/bundles/bundle-mintHolder.js +0 -1
- package/scripts/bundles/bundle-priceAggregator-js-meta.json +0 -990
- package/scripts/bundles/bundle-priceAggregator.js +0 -1
- package/scripts/bundles/bundle-provisionPool-js-meta.json +0 -915
- package/scripts/bundles/bundle-provisionPool.js +0 -1
- package/scripts/bundles/bundle-psm-js-meta.json +0 -980
- package/scripts/bundles/bundle-psm.js +0 -1
- package/scripts/bundles/bundle-reserve-js-meta.json +0 -975
- package/scripts/bundles/bundle-reserve.js +0 -1
- package/scripts/bundles/bundle-scaledPriceAuthority-js-meta.json +0 -880
- package/scripts/bundles/bundle-scaledPriceAuthority.js +0 -1
- package/scripts/bundles/bundle-vaultFactory-js-meta.json +0 -1045
- package/scripts/bundles/bundle-vaultFactory.js +0 -1
- package/scripts/bundles/bundle-walletFactory-js-meta.json +0 -990
- package/scripts/bundles/bundle-walletFactory.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAAiX4xC3eYAAN3mAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICJtb2R1bGUiOiAiLi9zcmMvZmVlRGlzdHJpYnV0b3IuanMiCiAgfSwKICAiY29tcGFydG1lbnRzIjogewogICAgIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9iYXNlLXpvbmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9oZWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImhlYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMmZjOTZhZTJmZTA4NjZlNjdkN2EyODZiNTIzNDMxOTU4ZWRkYTY2ZTYwMGIyYmM0YzQ1Y2ZjMWQyYzYyMWY2NDQwM2ZhMDJhYjU1YWY2NzcwODdmMjI2MGQyYjRlNmQ2NWQzNjZmOTg3OGFkZTU5NjdlOWUwOWE1ZjY2MjhkYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVhcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVhcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUyZjZhODY4NjRjYjUxN2Y5ZWU1ZTBlOTczNWUzZGIxOGM3MmFiNTEyNTg0OGZiOGZiNWZiYjI3NDZkMmFhMjQ1MjNhZGRhMjkyNGNhY2UxNWU3NmViMzEyOWYyMDc1NjFlYWE0YjhmODFiMDhhODI5OTFmNWM5MzFjMDk0Mjk4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ1YmE3OTE1M2RiODgzZGVhMDgwOGE5MDYzNmQ3MTZkZjAzNGE3MDZiN2Y4NWRhZDM3NzczMjg1MDlhYzZmZGY5ZTk1NGFjZjk5OTk5MzA5NTc0ZjEzYzNmN2FjYzk2MTAzOWI5NDQ5YjgzNTg0M2RkOWQ5OTQ1NTNhZDc3MDIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg3ODE4MzdlNGFhNWUxMmYyYmZlOTJhYzIyZmNkN2ZjYmNiY2JhNDk0YzJjMzBjNTI1NTYyOWM3ODM2MDQzMDFmZGNmN2FhYTdlMmFlOWE2NWFhOTgxMmY5Y2M0ZWRkMjQ0OTRiM2JmNDJmMDU1NjdiY2ZjNzM5Y2JlMWU2YTMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNDFjZDYxZTQzOWE0YTczNzFkZTNlM2UxZmMzZjFhMmJmNDM4YWQ5MDFhYzJjYmQ0YzFjZTBiYmUyZjFiNDJlMmVkNDdlYjBmMWI1OGQyNWUzMjYxZmU1ZGE2OWE2NjI2NjA5MGMwOTE4ZjdjNDE5YzBmMDQ2OGYyNWRkMDRjMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLW9uY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2Utb25jZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmZTIxNDMyYmFiZjlhMzg1MjNiZmNjMjczZDlhNGFhNzUzNTI0MzJkOTBmMzdlOGIyYTY0YWJlM2UwYmYwOGJiODNkZGMyOTRkNmM5NTY3MDMxOGQ1NTQwNTNlYTQ4ZTY0N2U5NjllYThjMzAxZTY0MjQzNzdkZDIzNDkzNTdkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3dhdGNoLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dhdGNoLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNGQ4OThlODU3ZWU5ZDhmNjcwZTcyZGM5MGM4NmRhYTZhNGQ5NWIwMDFjMjEwNzlmN2UwNDY5MDYwNGNiOWJmNjllNmIyN2MxNGRmN2M2ZDQ4MjhlN2ExODQ4YmQ5M2MyMDVjNjI2OGJjNWQ3ZDNiNzI2Y2Q4ZjJkODM4MDZkOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvZXJ0cCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kdXJhYmxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudE1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudE1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MjFmOGNhNWEyZGJkNGFlNTZlYTA5NzEzYjM3ZDlhNTE1MzY3MmY4OGQxYjFhYjk5MTRjYTJiOTkyOGE0NDdjYWQ2YTJjZGU0OTI1MTJhYjVlOGIwMWNmODRhOTA5N2Y3NTdhNmY1ZmJjYjU1YjUzNjgwZDU5NWZhMGZjOTZlNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hbW91bnRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZjU5OTUxOTMzYzU2MmRlZGRiMzk1NDg5ZTU3OTkyNjNlNjAwNTRiNGE3NmE1Yjg2OWM2NDUyMTg4YTA0OWZhMTM4ODdiZmE4MzY4MjY2OWMzNDJjNGFiZjcyMWI2YzhkNGY3ZmMwZmYxNWNmNzE4NzhhOTZjZDJkOTc0NGU4YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kaXNwbGF5SW5mby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGlzcGxheUluZm8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxOGM1NjFlMjk0NmEyNzJhNjlhM2FmMDYzZjI1OTUzMjgwODAyYzdiNDE0MGRiNmMzZjE5ZjhmMmVlMzNhOWMyNWRjMDgxYmEwM2U5MjAzYTE4MDlkNzZhZWI3MzYzMTNkN2MzZmExOGJkYzgxZDBhMmVlMGQ1Y2ZkZGIyOTRjZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYWU0NjFlMDZhYTc5NDEwZWFhNzBlMTY1YzM1NDE2N2VkYWU3NTM0YmU5MjcwYWM0NTZmZDc5MjcwYmY3ZDhjYjIwNjE0MDEyYzUyODMzNTJjODI0MmRhMTdlYzVhYTc3ZmUwMmVkZDc3ZjlmOWIxNTkxOTUxOWRhY2ZkNDlhOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlcktpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFkNjg5ZTFmZWY0Yjk1MzBmMzJiOWI5MTFjMTVlZmMxNjU2ZjQ0YWEwZDQ1YjEyYTFkMjRkODA5ZTcwM2EzY2U0MWEwMjViNjNiODlmM2I3ZjRlOWNhZjc1ZDM4YTdlYzYzZmQ1OTg1MzBiZGU1MWM2ZjY0YzU2YzViYzU3MTAwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS1wYXltZW50LWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS1wYXltZW50LWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZjAwNzM2Y2M2MGI2ZmQ4ZmNjYzdjYzM2YWQ0YWVlMWM0YWQ2OGVkMGNhNjZmMDNhMGQ1MGQ1NDZiZTQxOGMyYWI0MmRjZDBmNDZiNmI4YTIyYmJjOGE4Y2QwMGNjNzY1ZmM0MmIxMGM2NGEyODk2MGU0ZmZmZDY1NTVjMzZmMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRiNWRkNTY1MWY5NDJlZmZhMGE2ZmM5NmI0ZDc0MzczODU4YzAwYzMzZGMxNmNlNTMzMzRkMzIwNmQzZTk5MTVlMzUyYzBmNmQ3YTQ4ZTlhNzY0N2NhOGUwNzgwNzNhNWQ3ZGZjNWYzNjU5ODI4YjFiNDAxNWMyZWUzODZiNWJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2RlZWY5YjAwNTc5ZjFhYTZiYzZiYjkwYTZhM2U2MjllZjc5YTdkYjgwNWNjNTEyYWQ5ZDVhZWIwNTYwNzhiY2UwZTQ1Y2VkZWEyMWFiMGJlNzhiMGU2MGMwMWJmNTEwM2Q0ZjliMTExMDZiNzVlZGZkMTgxZTMyMjhlYWMxNzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTYyNDc2NDMzYTU0N2I3ZDY5YzE5YWIwZDAxMjA4NTgxZDg4ZmRiNWRhMjYxOTkwMWU2MTNiMTU3YmIyNDA1ZjlmZWU5ZGVhZjkxYjdhY2RiMTg2ZDQyNjgxNzQzNTczNDYwZTBlYzY0YmMxNDlmNzI0Y2Q3M2U0NmU4ZTBjYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjY4N2ZkMzkxZjM1Nzg1MTdhOGFhYTMyMmJjNTg0NGI2MGU1YWQ5Y2UxMzExMWJmMDY5YmFlYTE2MDFmODg4NjljZjc5MmQ4YjcwZTNmZTE2NWVkZTExYTc5ZWU1ZTQ0NmRhNmI5ZGMxYjFjNGEyMDU1OGM0ZTdlYTU0ZTU0MzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2MzEyMDlkZTM4NmViZTMzZjRlMDZhOGM4YjFiOWYyM2YwZTRlZjg1MDhmNGRhZTI0ZjA5ZmIxOTExNjA2Mzg0NTZjODViNGE1OWVlNzIzYWY4NzIyYzc5ZWY5ZGM2MmY5NThkN2U4NTNiMDU4YzZiNjQ0NDFjYmZmYWYyNjQ5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnRMZWRnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnRMZWRnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYTViMTI0MWNhMDU0NTYwMGJlNzRhMDIwMWY5ODczMjI2NjVmMzVlMDZmN2JhZGRjMjIwY2RjYTQ3OTQzYzZjMGZjZWMxYTYyOWFkMTY5YzYyNTRhMTgxY2E3MjZjMzAwYTg5YTA1ZTRjODYwNzBmZmYwZWRlN2Q3NjNiYTY3MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wdXJzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHVyc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZWY1Nzg3OTQxNWQ3OGI4ODMzNjBmZTkxYmRiNzQ1MTFhMjczNDFiNDhjMzlmZmJmOTYxYjFlNzg2Nzk0MmU0NWNhNTg5MTk0NDViNThiMDcwY2Y0ZWE3ZWMzM2VhMDM0NWNhMGVlOTE1MTQyYzI4OGM5MDYxYzQzZjQyMTU2MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFuc2llbnROb3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MGY2NGFkM2RkNjhiM2FkNGFhZjcxYmViOTA1YWE3MTk2MzYwYzc0NTk1YjZkZjRiNjRlOTdmMWE4OTE4NzkzYmRiNjI4ZWYzNzZhZWVkYTI5MWViMTI4MDg4OGI4Mjc4YjQwMWM2YWUxODZiYzBlZDY1NzkyZjI2Y2I0MzY1NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQwNDdmNTgzMjQ3MDFhOWIyMjJjNzk4OGI4NzQ3MDA0YjE3ZThjMjY1YTY3ZmVjNTQwYWFmNTU4ZjEwNTMxNDQ5MWEzMzMzNDM5ODdmNTk0NjAzMzU4MGI1MjAxZTJkY2EwNjc1YmY1NzliMDcwMzhiZmZmYjcyYWZmNjcwMmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cC9zcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xlZ2FjeS1wYXltZW50LWhlbHBlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3R5cGVHdWFyZHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mZWVEaXN0cmlidXRvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZmVlRGlzdHJpYnV0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYzVkZGQzMDc4Y2RlMTEyYjY2ODU5MWRmZjZjOGMxNTJiNTgxNGEzNTM4YzhkYTc3ZTE4YTI2MTNmNjBmZGRiOGZjZjUyODU2MGE4NGYxNDA1YWE0ZjczMGM1MTc2MDg0ZDlkNGU1YzY5YjgzMjg3YTI2ZGNkZWVmN2QzMWU0ZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXJuYWwiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2hlYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1ldGEtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0cmVhbSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdHJlYW0tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NhbGxiYWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jYWxsYmFjay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIwZWQyNmQzODZjNGU2NmNiNmUzYjkwNzE1Yzk3YWU2ZDBkYTZlYzMzMmYzNjg0ODllNjM1MGI2OTM3N2MwYmRhNjBlMDEwYzY0MWMxZGY3OGJiZjFmYWU4ZGJjMWUzOTJkYTczMmZiYTNjM2E3YjM2ZjhiNWQ2MTI2M2NlNzEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NsaS11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2xpLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjMyMjgxZGZiMmM4NDE0ZjUxNjg4YTNkZmQ5NjFjNjI3ZTg5N2M5ZDdlZjA0NWNjNmQzY2U0NTcxMGJkMDcxY2I4ZTU2ZWQ1Y2Q5YzAzY2I4MDc3NjQ5ZTk1Mzc0OTllYmM4OWRkZjU2N2YxNjQ0NTRlYzZlZjRlMWZmMDMwNWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uZmlnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25maWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMGIxMGI3YTVhZjI0MWFhMGFlMmQ2Y2M5MWIwY2EwZmQxZDJiZTVmM2ViNmY0YmNjYTQ2OTZmYjk0OWVhMDBlMDM5Y2MzMDAwMTNhNjQ1NWRjZDU4NTJhMTE3MGY1MmYzODIwNzYxN2RiYjEzMmY3NDM4ODQwZjk3ZjhmNWUxZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVidWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MmRmMzQ4MTliZWI4ZmY3MjJjNzhhZjFiNzkxZWY4MDkxZTU4MzA4OWFhYjc0NmFmNDlmZWRhODA0ZDhkYzZlMmVlMjBkNThjMjZhZjI2MjY3MTRjZGMyZWM1MzEwYTY0MTA4N2M2Mjg1MjkwOWI1M2FlNDliMTBjZDE0ZjU1OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0MjI0YjU5ZjhkNjVlN2FkMjMzNTMwMzY4NGIxYTgxZjUzMGFkNzUzOGI1MTNkM2IwNGExNWY4ZGRmZGQzNjFhOTc3YTU3ZGU4YjI3MTY5ZTJlNzI0OTk1Nzk2ODdjMjgyZDUzYTMxZTdhM2U4NTUzYTM2ZDFkZDUwZDJhNGM0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQyYWQ0N2M2NjMyNWE2YzUwMDI5ODAxMTI4OWYyMzIxNzI1YzZmNjZjNGZlZmU3OWM2ODZmODVmN2NiNjU2MzJjMjUyNDQ1YTQyMWRjNTljYWY1MjcyNGFkMmIxNzQ5NTFjY2QxZWVjYzc3MGUzZTZiYWM2OWZmMTlmNDJlMTUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2pzLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qcy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVjYTI1NDAwY2U3MmNhODEwOTA0OWMzOGNkOTc0YTgyODI0MDAxODc5MDc3ODI2ZGFkZDJkZGM2ZWEzNGU2YTA1ZDY3ODc4ZWZlYWI0ZmRjYjQ3NjYyODc1NmY0YjI5OGRlZDgwYjhhNDk4M2Q1NjUyMDhhYzg0MDU2NTVmNDkyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleU1pcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5TWlycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzcyY2RlZjgyMzA0Y2E0ZWE2NDA2ZmYzNGJhMWU3M2ZhNzQ3MjcwMDlmYmIwZDA3ZjAzMGQxZDZlYzdkYzM3MjY4NTcwYjE1NzdiYmU1Y2NkYjhiOGQ3ODBjNzY2YzJhNWIwZWJkNjc4OTM4ZjA1MmYzMzU2ZDZhMTdkMTdlYTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFmMjIwYTFjOWQ4YmI5MDI5NDZkMjk0ZDNiYzc4ZjFjYWZlYTZlNzdmNzljYzA2NzAzNzkzODFlMTg5NmI0ZDE2MDcwOWM1ZGMwZTI4YzY5ZWI3ZmJkY2NlODZkMjBkODdmNDIzYTc0Mjc4OGM3ZjRhNWIxMDI3NzRjMzAzNTc2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwvcHVyZS1kYXRhLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsL3B1cmUtZGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE0MGEzOWZlZTJmZGZkNmJlMjU5NzMzOTlhYmM2NjlmNmMxOTBlNzY3ZGIxN2I2NDMxZmJjY2Q3MzdjZGFjOTJlZmFmOWJlMDQ2NDYzNzY2MzQxM2UxNjMzYWJhYjRhMjUzZTk2Y2ZhNTg4MjBiY2E3ZTg1ZDUxY2RlZmVjOGViIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ldGhvZC10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWV0aG9kLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzQyZmM2MjRkODk4MDU2ZmQ2YTQ1NmZiYTYwZjA0M2FhZGRlOTRhMGZjOTM2ZWQ3ZmFjNzZjYTdhYWJlMDZjNjY4MGQ5ODBjNzU0MTZlYjlkNzQwOGQzYTIwYWE0YzczZDE3ZjQwMjZiOGE2YzI3YWQ5OWQ0NzU5NGI1NzIyZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWV0cmljcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWV0cmljcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmM2FhYWVhNzM1MmY0YjIzZTI2ZDEyMDk4Y2Y1M2Y3YmUwNWU5NzMxYTkzOTY0Mzg2YzU5NmUyMmMwMmFiYzU5OGVkMWQ0MmU0NDFjNjRiYjFkMTA3ZjlkNDA1OTY5YWI1YTViYjZjOGRmMDU0ODIwNmIxNDRkNTIyMjViIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25hdHVyYWwtc29ydC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbmF0dXJhbC1zb3J0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2IxNGUxMzBiN2E0NzE1YjgxOTI3NmJiZDVlMzg2OTNiYTMwNzYwODU4ZTY4YzBmMzU4ZmNlOTAyNTljZjY2MTNlZWY5YTg3ODgyNDc4YWM0YTQyYTgzYWQ3NjY0NzVkMWY1NzYwMjQ4MGZjOGVhY2VkMjUzZGU1YjMwNGJiMGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2VzLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zZXMtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MGM3OWVkYjJkZDE4N2EzNTFhMjk5M2VmOGE5YTU5ZmZkNTM1YTJkMzZiOTYzZTdmM2ZlZGRiZDBmYmMwOGY5OWRlNzkyMTJhMTdjYjVkYWZhMWIzNmU2YzIyZDBmMmU2NDkwNDJjMTRiNzJhZTc5MGY2ZmE0NWYwZjJkYmNiMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90bXBEaXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RtcERpci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmNTVjMTVmN2ZhZmQ2ZmFlYzkyZDAzZjM3Y2YyNDYzNzM3Y2U0MWRjOWEwNzNlNjRhODVjMGU5OTk1ZTZmMGIwNGYwZDJkYjIyNzY1NDRkYTE0MGNjM2M2MzU5ODA5OTY0NDdmODgyNDUzNzUzZTFkODBhNmExNjBmYWFmYzhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVDaGVjay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUNoZWNrLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWYzYmM3ZDI0MDgwMjMzYzUxNzk2YzVkMDk0NzZjMjljZTcyMWM3ZmIyMTYxNWViZTkzMjNiN2JhZDk1YzEwOTMyNDRkYWMyNjA1YjhmMWJkOGJlN2ZlMTAyNTdlZjRiYmZjNzI3ZDM0NDAwYjYyNjVjN2IyNDNkMGJkMDYyMmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFiYjRmMjZkNjQzNTFiYTY2YWEzMjc4ZDUwNjA5MDFhYzliYzA2YWJkOWI1MDJhNTZjMmJjZTgzMTU4N2FhYWY5ODlhYmM5MDdkYWMwMzk2ZjU1MDA1Njg1MGI1ZDUwMTMzMjEwNDRjM2U5MTMyMmFhYzRkZTBmYTRkNTNhYzBlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91cGdyYWRlLWFwaS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE1MjhlZjA0NTVjZTM3NzNiNjUwNzk3NGQ2NGU0MzM0Zjk2MTQ4YzlmMTEzNzQ5M2FjMjk0ZTFmMGM4NGM0OTk0ODYyM2ZhMDczZjY3Y2QyOTI4Njk4YjU3MmM4MzQ1YmQwNDgxZTQzYjZmYTJkZmMwYjRiYzhlMDFhNWE5MmI2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9ub3RpZmllciIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy91cGdyYWRlLWFwaS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxMWMwZWRhMGU2YmM0MzIxMDllZTY1MDEyYTY1OGVmOWYxMzU4MmY5MTZmODliM2ZjZWEzNzM2MzMyMGJiNWU5NmFkNDI0ZjgxMmZlNjYwZDQwNWZhYmYwN2EzN2IxM2I2NDEwODBhOWZmMzM0NjliZjA5MDJjNTc4ZDY0MDAxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyN2RlZGE0MWY0ZWZmZDQxZDJjOWNlYmI3ZWY5MTQ3MTZlODAzOTI1MGEzZmM2NGUzMmFmZGE2NWZjZDJlYjE1M2JjMmVmODc0NjVmODkwZDMxYTlmOTQwYzBkNDAwN2RkODg1Njg2ZDVmYzI1YmMwY2NlNzFkMWUyZjcwZWQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhYWNlYjE3YzdiNGJmMDAxMzAyODJlOWFjNDc5NGFiYjVkNTE5NTIyNjczM2I3ODZiNmZkZjYwNTA1NTBkZGExYWVkMjNkNmUxNjMwZTMwMGYzZDg1NzhhYWQ5M2ZhM2Q4NjdmNDkwMDgwYTdlZmViMjQ3ZjI2YThjMzMzMDU2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkzMDE4MDRkZmM0YzM1MDY4NjZmODA5MzNmZjNmZmE2ZDc0M2UzY2UwNTJkYmNjMzc5NDdmNjRkYzY3OTRlYzdmNTgzNzJhYTc5NzliNjA5ZDc2NjFiY2FmMjljZDk5YzE2M2NkOWQ1ODNiNDA0ZTI0N2Y1NjViMGUxOGRiMTQ0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC1ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLW5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzVkYjBkMTU5MzcwNDE4OGJjNjc5ZWQ0ZDUyMTZlZmEyMzg4Yjg3M2FkYWFiZTNlNjM1NGFiMzU1Y2M4NDdmNjQ0NWQ5OGE1ZTA4YTc1NmYzZTk4YzJkMjE0NzM4OTY4M2VkNTExMjQzYmMwMWY4OWE1NWJmNGMwNWJhMWNkZTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGIyNzhlNDUxNjkxNDU1Y2NhMWJiYzlhODNiM2QzNzg1YTg0MmJmY2FjYzA1MDM5NzlhMDQ0ZTNkNWM2MWM2ZGMwOWQzYTAxODdmZjk1MTkyYjQwYTQ4NzJmOThjMWE4MWM3NzQ5MzVhZDEyZDM3NGVhZDJmYzk4YWQ5MGFmMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTRhZjE3ZGUwYzAxYmNkZjEzNmFlYjYwNjEyMmY1OGM5ZDYzNGZlZjEzNTdkNmRmOGNkZGNkMDUyN2Y3N2U5NTEwZTdkYjJlN2IxNDhjMjcyYTlhMjE5NmRhZDYwZmJmYjEzOWMzMmUxYmM5MDdkYmJiMjdhN2QzODEzYTA5ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjI3OTI2MmI0Yzc5YzcwYzQ4MjhmMTliMDlmNDVmY2FhZGFjNTgxZDZhMWQ1NDA1MGRlZTExMjYyNGI2MDViOTRhNzJmZTY1YjhkMTQ2MWZiMGE1YjdkNzQ1MjhhNTQ5ZjAwN2Q4NDI2YmYzNTkzNzU4ZWMzZjJkYmE0YzE5MmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdG9waWMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RvcGljLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU4N2QyZTEyNDY5NTRlNWM0MTQ0ZTU4ZGM3NjZlNTYwMDE5YjdjNzEwNGFhMzcyMTQ4MjRhMmQ4Y2FmMDgwN2IwYmVhNDc1OGQ1OGFlYjU3NWZjN2ZmY2FhYjYxODIxYzhlZTYwNTgxMGY2NGU2ZTliYTM2MTExOGE2MjVlZGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3RvcmUtdjAuOS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N0b3JlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MS41LjEyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1OGM3OTZhNjdkNzk0Mjg3OWZkNzJjYmZkODA5YjhlNjAxMjYxZjVlODQyNmQwZDAzMzNjYmQwMzQ5NWFjZmQyZDgxZjk0NmMwOWNkMjcwYjZjNmFhZjlkZWRmOTc5YzRlYjhmMmNiNTQzZDcyNDdkYjliZGIyM2I0MTEyNmIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYzAzZDVhODBmNzM5ZDRlYWY2ZjI2ODQ1MDE2YTI0MjBkNjJkMjRkYTc3MjliODA5ZDcwMjRmYjY4ZDE0ODQ0OWU1YjE1ZTc4MDJlODQ2YmU1OTVlNjBjZDk1MTQ3ODMzNjg2NGRhYzZkYjNkMjIyZDcxMzI3MGNiYWE3MGVjMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYzdlM2IyOTcxOTRhMDA1MTEzYTFhNjNmNTg2YzYzMTdhZTI0NGIwNmQ0OTliNzVkYmYxMzkxYmE4NTYxN2NkZTIyM2U4NzVhYTQ1MTJkZmE0YzJjNGRjNDQxM2UyNWE5Njg3YzBkZDU1MTcxNjdkYTM4NDg0M2ZlMjE0YTU3OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEzMTRjNGVhNDI0ODBiNTBhNDk4MWRjOGM2YjQ4OTIzZDA4OTk1NDg1NWM3M2Y2YTM4YzhhNGQ2M2I1ZGQ1MjlhMjY4ZGQ4MzdkZDBhZTE3NTk5Y2NlYzEwODNmMjAyOWUwODcyMzJiZDMyZDc2ZjcyNzIyOWMyMmI4MTM4M2U0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2VlOTlmZGFkMTVkYWE5NGJkMzE4NTEzMjY5Yjc5MmVhZmFlY2E3MGU2NDQ4NTc5YTI0NmYzYzM1NWQwYmUwMDI1ZmYyOTBkNzZjZDhkZGZkM2MzMWEyNGJmYzM3ZjdlZTVhM2M4OGQ1N2RiYWE1MmYxZjY3NTYwYTMzNDMxMDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcyNGY0OWYyZjQwNDM0MzRiODM3OTk2ZDQ1NjhhMmE2MDY1M2U2ZTNiMTUxNTVjMGFmODJiMTNkNDIwYjIwNTc5ZTkxY2UwMmUyMmYxNDBhNGQ1MjU5ODQ3YzE5ZTcyOGIzZmYyNGU4YTBkYmQ3N2FjN2M3YmQ0NDE3NjNlYmE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMzBkZThjZTkzOWNlMjAwZDBjMTA2MTQ2ZGJmMTllM2ZjZDhhZWFhMWFlZGQzYjEzZWQwMzk3ODJlOTlmNjdmZTBhYmQyNmZjNDFhYzIzODExMjkxNzI2MzRkOTBhNGY2NTRmZDE4MDU4ZTMzYTdiMjA1N2VkMjAzZTY1YzNkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI3Y2ZlZGMyMmNlOTQ4MjhjNGU4ZDkwN2FiN2Q0MGUxODIyYmVlZjg1NTllMzE2YmMwODgzZTA2YmQ4M2FiZTBlMWUyY2Q3NWEyN2EyODA1ODdhMTIxMGUxZDFiMjZiZWQ3NTQ5YTVkMmY1N2QwYTZjYWQ1ZWU5YWQwZDViNmRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3RpbWUtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3RpbWUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDBiYzRiMjFhMjhjM2E1Yjc2ZjQ3ZmFkYTRlYzE3NjFlMTE1OWM0MWUxZmViYmYwOTVlYWVkNjExOGUxNzM2ZTU5NDYwM2MxOGVmMDI0YWM1NmY2YTVhYjNmM2NmMDg2YzVmNWI1NDRlZGUxMDAzMDFmYjM1ODI5YzUxYWIyN2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGltZU1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RpbWVNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDcwNWE0OGE5MzI3NmNiMjMxNmUzYzZiODBmYzFiZDQzOWY2ZmVjNTc2YjUyYTg0NWRjOTg4YjZlMmJlOTRhMWVkZTkyMjZjNmEyMmM2ZmI4ODA4N2FmZDFhMjM1YWM4MGFjYmMyYTE5ZDI5YWU5OTE4MmZkMWQ4Y2ViMDY4Y2UiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM2MWIwNjAyNGMyZGQzMmY3Y2UxYzg0YzNmZWMzY2ZiNTdhZjhkMjkyZjIxZTdiOGYyNDAxNTM3MWMxN2YyMzFjMWFlMmQ0ZDE3YTBkMzQ4NjZhMWM2ZjgwNzMyOGNlZmFmMjg5YWFlOWNhYjViYjFhYzBiZTYyNDJiOTNiOTE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy92YXQtZGF0YSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2OWJiMTU3MjgyNDk5NmU4Y2M2OTdjZWJhYjU0YTIwYWNjMTljYmVhZDBmYmVhMDUzOGU2NDYxNjMyYmYyOTE3ZGNhNGU3NDM5YWRhNGMyZDhiNjNmMDFlNzkyYmE3NDA1OTc1OTdkYzM3ZTdjMzZhNDJiYTdlNzY0ZTk1NWM2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3MmZlM2E2ODM4ODNlODVjYzRkZDNiODZhOGI1ZmMxZjJiYTFmNjc3ZWI4MDMzMTk5MGZkNTQ1MDU2ZjhmMWEzMWJkNGU2OTM1OGViYTEzY2U5MGQxYTJjNWNjMWMzMmZmOTU5MGQyOTBmNGNkODc0NTk4ZTg3ZDAyNzk3MzkyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgzNDRmMWRhZDhmMmE2NTA1M2Q3YWVlYTBiOTZjZWMwZmZkMDJiOTlhNjFhYzcyMTc1MGJmYmNmY2FjYzRjYmNjZDBjY2RhZWNkODM0ODQzNWMzYWY3MWNlMzg2YzY4MGEzMGMzNDI4Zjc0YmExNWYzMTA5Nzc3NjI2NjQ4YzUzIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1MDYwOWM3ZjhjNTc4NjY4MzhhZTBjNDIwNWUzNzdlNzM2MTI3OTNjMTU4MmYyZjg3MDQyMWJjZjczYTBlYWQxOTcwNjY0YzNlMzQ4MWQ2YjQwNDQ2MTVkNzYwMTM4OWViNWIzNmU3MTkxNjJjODYyNjEyMDg2MzcwY2U2MmY1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvbmUtdjAuMi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvbmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYmFzZS16b25lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJkdXJhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjIwOGRlZjhkZjFjYmUxNDE4NjY5ZGVkZjgwYmRmNTk1MzU4ZjUzNjZkMTE4OGFjMDRmZTRhMmNiOWM1M2NhODg0ZDg1MjE1YzkwZjFiODdmOTQ5YmIwNDhhNzk2ZWU1YjZmZGExM2Q1MWEyNTllMjU3NDQ2NDgxOWQ2MjJjZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZHVyYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxMzAxNTJlZjQxZTAzNTAwNTRkNTA2OWE1ZjQzN2UxZjJhMTQzZmI2ZjhkZTZhY2I0N2YwOTRkMTc5M2IxZDNjM2RiMDcxMDA4ODhkZjc1NTliNGRiN2MzN2U3NjNmYjk4OGI5MzRlZTE4YmYwNDJiNmNjYTAyOTNkMjk3ZDM3IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi4xMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tbW9uIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJhcHBseS1sYWJlbGluZy1lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ5NzQ5Y2QzNzg1ODg3Y2RlZTZmYzZkYjgwZmViOWZjZWY3MWY1MmRmMzViMzI3NGE5Yzc0YmIyOGVlMzZjODMwZTVlNzkyNGExMmU5NzNmM2ZhNGI2YjI2MGI1YWQ5ZDUxNDNkZThmODNlZWZiMTlhMGEyOGUzMTNiN2Q0MGI3IgogICAgICAgIH0sCiAgICAgICAgIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJmcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTVmMmU1NTY1Y2E0MWM4YjJmMWEwYjIxZjczMzU3MmJiMGU2Zjk3NTUwM2Y3YzI2ZDdjMTgxNzVjYTU5NmIxOWJiYmUyODEzMzQwN2JiNzYzZjgwZjQ0ODVjMDYzYTAyNGVlNWNmZDllMDgxNjlkNzU2MGRjNDg5OWM2N2FiNWUiCiAgICAgICAgfSwKICAgICAgICAiLi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImlkZW50LWNoZWNrZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjOTkwNDAyOGYxYzU2MTE2YTQ2NzM1Yzc1NGU1NmJmMzkxZjU4YTJmYTJkMzBiNTE1N2E4ZDljOWQ1ODUxNzIzZDY3MWZiZjUyMjdkYzJjYmYzYzFiYjU3NjQ0N2FjZjBkNGQ5MDlhZWViMWY4MWFjMjQ5Mjc4YTU2NjBmYmYyYiIKICAgICAgICB9LAogICAgICAgICIuL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJsaXN0LWRpZmZlcmVuY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNzdjMGVmYTk5ZjI4YWM3N2Y0YzA5NDljODQ0ODM5YjE2ZWFiMjM2Y2I5MTllOGVhNDhiNjQ5YzQ4ZDc5MThiZWRkY2QwYzJjZDhhYTQwMTc4MjU0YzRjNjAxZGJmZWExNjc5YWY4MWUyNjYyYTc5YjZjMTMwOTg0Njk2NDJiYiIKICAgICAgICB9LAogICAgICAgICIuL21ha2UtYXJyYXktaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibWFrZS1hcnJheS1pdGVyYXRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1OWVlM2FlOTkyYWFhODg4YmJlNDFiMzMwMmIyMDRkMWZkZjM2MDBmY2RlN2Q4NmU0NGY5NGJmYTUzNDE0MjM0OTg4YjI5MjQ5ZjI3YTY0Njg5OWIzZWZhOWMxYWJhMWNhYjk0MDMzODlhNmI5ZjQ1ODk4OTRhZjI4MDQ5ZTk4IgogICAgICAgIH0sCiAgICAgICAgIi4vbWFrZS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJtYWtlLWl0ZXJhdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTA5MmRkODE4ZThlMGNiYzZlYTFiNmFmMGMyMWRmNWEyZTg2ZWQxODk2ZTFlN2I3MTJhNzliZGIxMDg0YmUwNjk4OWRiMWJiYjk4NGVhOTQ0MzU1YjkxZmI2NjRlNDFhMTY3ZDMzYWI1MGNhMWVhMDI4MThmZDkyNGY3MTVlMzMiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm9iamVjdC1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZGY1OTJjYWM3MWM4NWMzMWViOTc1YzkyMTc2NmYwZmMxYWMwMjUxMTEyOGM5YWYzNWYyMTU1ODNmNjk0OGE4NThiNzliOGZmZWMzMWQ0ZTk4ODBhMzVlZjliYWI3YjJjMmUwNmIxMzhhMDYzMmIxMThmNTg4ZjExODcyM2MzYyIKICAgICAgICB9LAogICAgICAgICIuL29iamVjdC1tZXRhLW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWV0YS1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNzgwM2U5MDg1ZjE2Y2EwMWJjYWY1NTA2YjRlNTViOWViMTRmNzdmZDlhMzA3NTlhMjk4ODIyY2JjNDhmMTI1NTk5M2JhNjFmZGYyMTEzYmExOTljMTBjMGY1MzQ4MzE4MWM3YjdhYTNlY2Y4ZTE3YjFmM2Y4MGFhNTMwN2Q1ZSIKICAgICAgICB9LAogICAgICAgICIuL3Rocm93LWxhYmVsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidGhyb3ctbGFiZWxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3YTEwNTU4YzY1NmE5OGI1ZjlkMDM4NGM3OWY5NGRmOTgyMTE4MGQwMGU5YzI2OTc3YjAxZjlhYmI2OGM1MTk2YmRlNTFjMzBmMTI2MTVmZGM5NTdhNTA4MDU3NTkzM2QwOTNiMjdmZTM5NWQyMDAxMjBlMzRhYjNkODliZDAyIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIjogewogICAgICAibmFtZSI6ICJAZW5kby9lbnYtb3B0aW9ucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJiYWNhNzZlZDdjNmI2NTY3MWY3MGIyNjQ2ZjY4OTQzNTcyNGQ4Yjk5MzBhNWZmMjlkMWZiMzI3ZWQ5NmZkNDE0NDY5NTI1ODk2MmRhZmI5ODI4NjJhMmVmYzFiMDNkMGFkOTZiMzNjMmNhZTViZWJmYTM3MjY4ODZhMDZmNjY0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vudi1vcHRpb25zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbnYtb3B0aW9ucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBjODMxMzkxNjdmYjUyNDY2ODBjZjNiNjA4OWFlNmZlMjJjZTJhZDgxNjg1YzYzZmRjNjNlYjY5YzY1MjI5ODE0YTdmOGJkNWJhYmExNjBjMjY1YmRiNDU5NTJhMzE1MzkxZGM1MzdiZTMwMzk1NjVlYTdmMDFjODg5NmRkYmNmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lcnJvcnMtdjEuMi4xMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXJyb3JzIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMGQ3ZmYxN2IzZDIyYjVlM2NkOTI5Y2FiMmJmYTFhNTFjNzcxMjM3MDIwNTZmZGM2NjRlNzdmZDYwODE1MzMzNjMwNjA3MDk4MDdkOTkxNGFhMGVkOGNhOGVhODI0OWYwMWM1ODE0NWE0MmQyN2JkYWY3YzNkNzExZDhkMzE4MiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ5MjQ5YWE3MmFiZTA1YTEyMDEyZDkzZmU1MjVlMGRmZmU0MzllNzc2ZWJjZmViMTljMjIxYWRkNjc5YmEyZDhjZmUwYzE1MTdmZTI3ZjgzMGUxYWRhOTY5MDVhYTZiYTg2MTQwYzVkOTBiMjljOWU1NmI0YTM0ZDYyZDQ4OWZhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sb2NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbG9jYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmOGY4MzI3NWZjNzVmMTgxMDhmYWU0ODYwN2RhMGJkMzlmMjVhODBkMWMyNTkyM2QzNjYyZTYyZGI0ZmZlYTIwMGU4YjVhZDg1OTczNmFhMWY0YTFiZmNmMTBmNTYxNjc1ODMyNTFmOWYxOGYwZDliZWQxOWQyNzUyZTAzNmJlMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTAyZWMzZGNkYzYxNzM0OWFmOWYyZTI1Y2FkZTA5YzhkZTI4YTJhMTBiYjM2YTlmMzNlMWE3ODRlOGQxYmQ3NGFkZThhMDIyOGM3MmIwZTU1MTBlYmRlOGFhZmZlODc2NmY3ZGUyOTcxOGQxZDc1OGU1M2VlMTYwMWVlNmRmMjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU4YjMxNTkwNTk0ZDllNzU2NGM5ZDYxNTU0ZTU2NzBlMzUwMDVlMmFkZjIwYzE0MDUzNTM0MjRlMDA5ZGUxNzQ2MjI3ZTEyY2ZlYjA3NTljODE4MzkxMGNkMmFjMTBmODIwMWFlMGJiN2UwYjM4NDhmZTY3Mjc2MGI2M2FkYTRkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBkODIzMTA5OWRjMzU1MzAxODViM2U2MzYyOTYzY2M5ZTIyODVjNDQ0ODc1Yzk5N2Q1MDdhYTEzMTNhODY5ZjdlNTVjOTZjZTdkNjFmMTgxODYxYjE2OGIyNjcxNWRjYWQ4NzA4NjExNzFlMjYzYjk4ZDNmZTUzNjc3Mzg1NDExIgogICAgICAgIH0sCiAgICAgICAgIi4vdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NjA3MTIzOGIyNWQzMDc2NmY0NDczYjM2MDc1ZGIwNTAwNGEzMDk1YjdiYTZhZGQwNDRkOTg2NjVjN2UwYzNjMzA5ZDA0ZDQzNThhYWQ4YjA1ZGQ4ZmNmMDBmN2RmMjk2MTU1YzVmODI5YjJmOGJmMzhkZGJlZmIxMGQ1ODM0OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXhvLXYxLjUuMTIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V4byIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9leG8tdjEuNS4xMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9leG8tdjEuNS4xMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saXN0LWRpZmZlcmVuY2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjOTQxNDczYzMwNWJlNTdlNzc4MzFiODQ2YjVkZDcyZjA1YjAzZTk3NzA2OTg0MTc0YWNkMWYzYTEzZmY4Y2NhNDZjMmQ1MTAwZjM1ZmNhN2Q4ZjA3MTRhNWRiZDkzZGQwOWI3ZTZkYjZkYjRjNjA4OTM5OWMyNDRlYzQ2Y2NiNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tbWFrZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDQ0NzRmNzFmNjdjNzc4M2M3N2JhZTI2MzlkYTk2NDAxY2FiN2ZiZGY2ZTUwNjA3MjYxMjU5MDY3MTY2MDllN2Y4NzBmOTIxYzIyZmE4YzM0OWJkYmRiNGI4NDMzZDE4OGUyZWFmOTdmOWVmMjA0MjkwNTQyMmI1MDdhYWQ3ZGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOWVlOWJhYzJmYTYzZTgzZDVlZTdiOTZkMWNmOTA2ZDljYTJmMmY1YTgyYmNhODRmZmM2MzZjYmMwOTg1MmYwMmIyYmI5ZThjNWQ5MmU1ODUyMjcyMTM1NmE3ZmRjZWQ1ZGNkZTA0ODE1ZDRmMzgyNWYyYWMzY2I1ODMyNDg5NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9nZXQtaW50ZXJmYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzZiYWNjZWJiM2I2Y2Y0ZTU2NGMyMDZhMjVkOWYzODcxYzY1ZGU2ZjcyNzQ2OGY0ZTdkMGI0ZTEwMTJkYWEzNzZjYThlOTM2MDUwYzVhMmJiOWQ0OGFhMjhhYzExYWYxYzIwZjc2ZmNlYWI0MDE1ZTBlZmVmMjgyODE3NTM2ZTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Zhci12MS4xLjE0IjogewogICAgICAibmFtZSI6ICJAZW5kby9mYXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhwb3J0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRhYmNlNWIwNTg0NjAxYWI1NTA2OTkwNDJkMTZlNjZkMDc0YzI1NWIwNDE5MzZkMmIwNzg3MzJhNjQ5MjdjMzUxNWEzZDRmOTUwZWU5NjA5OWVhMDRlZDFkYzE2ZTRmNGE4OGFlYjBkODExYjRlZWI0ZDk3YTQ5MmRmNTA0ZDNiIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9tYXJzaGFsLXYxLjguMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbWFyc2hhbCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4ODQzMGZjYjc4NmI1NjFjZjAzZWNmNjU5ZGE4ODBmYzhjNGE2YmUyMWVjNmEyNTZmZDg4NDNjOTJiYzY2YzFmMTBmOTgzNzFjYzg1YzM2NzBlYTdjY2Y3NDQwMGFiMTEyZTRkMTBiY2MzOWI2NWNlMDViNDg3NTJhMjhkMmNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ4ZDQwMDEzMmUxZTM1YzFhOWYyNjMwMWQwODgxOGIyZGQyMGJlNmE4OWU4NzQ5MzdiM2JjOTFkNzZiOTA4NmExMDNjM2I3YmJhYjJiNTMyNTc2NWEwMTI4NWJhZDJjZDYyMzljYjMwOTlkMzk4MzdmMzc0NmNmYjdhNTQ5MmEyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmM4YjQyNjk3ZGJlZTAyMzI5OTQyNDllYmIwOWQyYTdkMjlkM2M4NzlhMWEzOWMwNjI4YzA3MjBkZDJhZTViNThhMTU3ZjQ2MjExZjk1MzlmMTZkYzJjNjEyNTliYmJhYzVmMzA0MjAyNjIyZDdmYWQ3NTcwOGRiMDA0OWFmNzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzQ0YTI5NjUzZGQxMjUyNGJiNzgxZWM2ZTc5NGVkMGY1NTRlMjFiODFjM2U5N2IzOWI2ZWM1YjM5OTdkZGFhYzA1YWU1Yzc2NzdjYjNiZjMwMzRjODc2ZTkxYjA4ZWYyMTYxOWQ1NTViZTFlYmRlZTAzMDZjYWQ3NGRhNTc0ZDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDg2YWU5ZjNmZmY5ZWMwOGUwNGMxMzI2MGI4YTczNjcwZDhmY2Y1N2U2YmVlOTc0NGM2MjcyZDFhMDYwNzA3Y2UzNGZlNGQ1ZDQ5OTA3NjRlZjRmZjE0Yzk5MjMzNzY1YjU3NzU2NDQxMzhiY2UxMzI1NjA3OGVjZmFmYzE3MzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTIyODkxZTRjMDY0MzFiNTc4NDEwZDM3NmMyOWVlMTc1NjM4OWQ5ZTY3MjUxNTkwMmNmYWEwN2ZjYWU4ZGIyNDZmNGY0NDBkZGYwNTliNzlmNGViNjJmMWM3NTc3N2ZkZDViZmE4ZmNjZDVhYWY0MTgxNjc0MmVkYTc2M2NiNzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4MGNiNWYwNjdjZTIyYTcxMzM0MDJkMjcyMGI3M2Y0MTgzYTU3ODFmMjI4ZGFjMjBhNmE0MzU0ODg3MmVlZDViM2MyNGUwZmI1MzhlM2FhMmQzODM5MWZlYjhjZWQ4NDYwNDBjODc2YTgyZmNjNjhhNzRkM2E3NDU5NmI1NzVmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjcwNTI5ZWI0MWVlNDg4NDAxMjdiYzJkZDdhYjdmOGEyMjQ0ZGUzZjFmYTMzNGU0ZjU4ZWVhNDIxY2MzMDVmNTQyZjJlN2EzYTE3Nzg2Yzg3ZmM5MDQzMDE3ZTdkN2M2Mzc1ZGE0ZTUxNGMxNjYwYmI4MzAzMDBlZTZkMzhhMWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NS4xLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL25hdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDg3MGIxMWUwZDk1ODQ2OTE1NmViMDcxMWNmMWEwYThhOGRmNDA3OTdiMjIyNWYxNGI2YjRhZTc2Yzk5ODVjMjc0MjI0MDZiMDc5NjEwOTQyMzQ2MDMzOTZiMGI1Y2FhOGFiYTc2YTkyY2RlNmJlNDJkODViMTg2Zjg0N2MwMGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIjogewogICAgICAibmFtZSI6ICJAZW5kby9wYXNzLXN0eWxlIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pZGVudC1jaGVja2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllMjQ0ZDk0MDhjZWRiNWYwOGQwMmIxMWViYzNkOTIwNTM0NTIwNmRhOGEyZTA4ZDZlMWI2YWY1MGVjOThmYTA0ZDAyYTdjMDg1MWM5ZWUwNTJjMWU3ZjJkYzA4NmY0OWQ1OGY4MGNmY2M0YmQ5NmEyOTM4ZDgxZDRkOTJhYzIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J5dGVBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnl0ZUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWY3YWRmOTRkZDFiMTY5YjAzNzBiOTRhYWM0Y2I5Yzg2YTQwOGFjZmEyMDRhNjllZjY0ZjE0YzQ2ZWQwNDJmODQ4MDNjMzliNGQ4MTU1NzkxMGMxZDZlOTNkMzA0YTIyMTQ5NmJkNzBlZjhhYjg4YjNlN2JkMWM5ZTk0YTRiZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYzRmMWM2NmNjZGNmMTAyNWQ1NWUyNDFkNTU5OWQzYThhOThiMDAyNmFiMTJmYWNhNTRhMDE1YzQxODFmZDM2ZTFmMmRlYTY0ODg5YmI2ZDk3MWJmZmIyYzUwNmI3OTAyODJmNWI3NGRlZTZmNmM0MjUwNzZjZGFhNTNmZWMyYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTZiNDYwMTJjYjgwZjUxZGY2ZDZkNjIwMDMyZTM1OTcxYmRhM2I5NTEwNTJiODAyZDdhNTUzNzNiYzBhNjVlZGY4MWM3YjJkZGMzNzk5MjdmMTJlZWJhZjFkYzRjOTBiZDc0ZTQxNDk2YzQ5ZmJlM2UzOGY0NDliMzAxMzBlMjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNzI5NzI0ZTEwM2QzMTdhMTY2YjYzODRlYWJmZTBhNDFkZjcyMmVlODhlMDhmY2IwMmVhMTczZmQxNjc2Y2M3ZWM0NTc3MzVlN2JmMDJjOTUyNDBhNjVkYzk1YjkxMjFkNTRhMjA3MWQ0OGFhZWFiYmY0ZDQ0M2FlYTUxZjU4YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkZDIyY2JkZjk5ZDQ1MjFkMmUxN2JiOWQ1YzFjZmUwZDU5ZTc1NGIxNWQxYTg1OWE4YWI5YmUxMmUxY2ZjMjMzMDA0ODM4Y2QzNjk5ZWE0MDc2ZjcyZTlmMjg0Y2Q5YWJjZDk2NmI3YWQ4MmYwODdkM2NhYzI4ZDZiMTMyZmExYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRhNWRmMDY2ZDgwMjY2NWNiY2ZjODEwNzBmY2RhYmZkMTNjNzMwOWFhNTQ5NGU1OGU1YWM5ZDIwM2M2MDFjN2RlNWYxMDJhNGNjNjdhMmMzNDBmNzAwYjZkNGNjZGFmMDE5YTRhMmNjYzljZmExZmQ4NzRkMjUyYzhiNDdhMWU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEyMjAwYWM1OTBjNmRmYjFjMTMyYWI4NDVjZGQ0M2EzNjAyMGYwODJkN2IxYzliNzRjMWNiM2Y1YWI0NWFjNWExNDU1YzA2ZTk4NDlhM2ZkNGU2MjIwMTRhMjk5NDEzYzU3NTdhYzA2MjBhN2JiMzhkMzc5YWM3ODcyMjFkMzE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjY2Q1MmIwODRjMjJhYTE5NzFlZTA0ZmJlYWQyODVkN2FiNDNjODA2ZmE1M2RlOWIyYmRjODg4ZTc1NzY4ODU0NzQ1ZTVhNzAxN2RjNDQ0M2YzYWEzODQ3OGNkM2ZiM2MxYWRiMzE5ZGQzODE3ZjIxM2I5YmU3MjcyY2EwMjc3ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZTVlZTIyZjk1MTcwOTVjOTg2YjQ0ZGU5N2UzNzdhZWRlNTFmNmI2MjVkOTkwY2M4NDFmMTI5MGU1NzkxMmY4YzFhMTRiZTRjMGM2YWRiYjNkOTY2MjBmZmZmZTFhMmE4NzcyOGFmNmRkODA3OGU0YjM5ODk4MDJlODU5ODRiMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlT2YuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYTgyNDNkYWQ3NTk0ZjMzMTNhY2QzMjgzNDBmNjc2YzNjYmI4NThmZmI1YjZmZDQ5NDRlYjdjNDYyOTJmZjYyNTQ2NjlmYmU1Nzc1MTM2MTMyNzczNjFiZjU2ODg5ZjAxNDUwZDU4YWUyNTIwN2QzNzYzYTk4OGE4NmNhMGUyYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZW1vdGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI5OGE4MjAyZjkxYzQ3ZmZhOGFmYTgzMDExNmI4MDFhNGMwYjMyYWJjOTg2MTQyNmY0M2I5ZDJhZjk4MzQyMDM4MDI4MWY3ZmFhYTRkZmYzZGMxNzBiOWNmMDQ5OTExNTM4MThiNGFkOGFiMGNkOTBkN2ZhNGYyM2U4Y2I4YTU3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZS1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGE3MGYyMTNkYzIyNTExZmYzNWVhNDQ4ZTQwZDJhMWYyODEzMTg2ODA1MGMzMWVkMzQyZjc2NTJjMTkyMTRhYjc2ODRhZmRhYjdhMDBkYWY0NzEwOThlMTI5M2Q2NjUxYmU4ODU2MmEwZDFiOTQxZTc4OThkOTUzNzU4ZjcyZmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RyaW5nLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdHJpbmcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjYWI5MjYwOGU1MTRhZTA3MjQ3YjQ1N2EyODZiNTU5MWNiYWI0MmFhN2I0YTMwOTY2YmNiNTg3NzgyOTYwZTczNTgxODQ1ZjQ2OTg0NGRlZTQ2ZGM3MWJlOTkzMWFkOWJmNTczOTcxNzA2NWFjMzI2N2I5NWJmN2QzMmJhYjZlYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zeW1ib2wuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N5bWJvbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRkMmYxZjhjNDg2NzFkNjk0YTM5MzdjYjcwNTg3MDZmYzkzYmQ2NjE2ZmE5NjZjY2NjNDUyYWFjMzk0ZTljZTAyMmZjYzQ4MDM0YjM3NDY1OTk3NDI0MjkxOTcwMjFmNWZhOGFiYjUzZTljMGY5N2RhZjI2ZjhmODkwYzdkOGFmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTU4M2RlZDE4MDgxNTM5ZjQxYTgxMTk3MTU3Y2MwNWFlOGRjMWJhZTk1YzJhNjc4NzY4YTgyYWNlMTE4OTU0MjcyMzFhMzZlOWIyYWFhNzlhZGJlNWVkNThjM2VjNTgwMjZiMmU3ZmY1ODU2NjYwNjE3OGZiODkxYmViNTc1YTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNiMThlM2JiZDFmNmEwZDIzMGIwNDIwZWUxMjY2ZjY3ZjFjYjUzYTFhMjZiYzFmMTQ5NjRkNmFlZDQxOTk5NmEyYWNiZTQ0NWUwODJmYWE3MzRhZmQ4NzYyMTkxZTkyNWUyZDFkNTgxNTI0MWM4MjkwZTViZDE5YjdjOWU3YzI5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXR0ZXJucy12MS43LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3BhdHRlcm5zIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaWRlbnQtY2hlY2tlci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saXN0LWRpZmZlcmVuY2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL21ha2UtYXJyYXktaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL21ha2UtYXJyYXktaXRlcmF0b3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL21ha2UtaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL21ha2UtaXRlcmF0b3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGM5YjdhYmEzMjViM2E5NDA4YmI5NzczZDJiODIzNDhlMGVjNWM4YThlZmRkNDdmY2NjZTUxZDRjNTJhYmYyZmQ1MDIwZmRhYjllYWYwZDBkMDUyOGI3OTE3MGJmMDNmYzI5MDZjMzI2MmNjZDAyYjExZWZhMzJlZTIyMzdjNzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jaGVja0tleS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiYmEzYWQzNTJiYzVkNDM5ZjA3ZjI5OGE0YjlhOTI2ZjFkMGJjNTMzN2FhYjg4ZTg2MDlkNWM0NjUxNjI1MTY1ZTE0N2I0Nzk3YjExNzU0YjlhZTEwNDJiNmJlMDg5N2MxNzhhOWQ2ZmIzZGZhMTM3YTg5NmI5YjNiODIzNWMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29tcGFyZUtleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0Nzk4YTA3MDQ5ZGU5ZTg3MTYyYmE1MzJiMjMwMDdhYWExNzgyY2UyOWE4Nzk3NDkyYTQzODAzODQyNDdiOGFjNDljZjFkZWEyYWQzMDU0NjU0MjA2OTdmMjNlZWE0NWY2NDdhOWQyMmVkNDJhMmZhMDA5OTA4Mjg1YzU2OTIyYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weUJhZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNiYzRjZjhjNDEzNWUxZDJlMTg3NjJkZThiNjdhYWMzMWM5NmUzYWEzMWNjNGFiNGQ2MTE5ODdlMzdkZjg2OGMyYmQ5MmQwY2M3M2JiNDc3NGJkYjMxY2I2YmFiMTFiYWFhODgyNmNjMjFlOGNhNzFjZmM3Zjk0NTc2MTEwMjU3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29weVNldC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb3B5U2V0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzE3ZjgzZjUzZjkxMmFhOTNlOGRlZDhlOTc2NmNkYzNhMjY3MTczZWVkMzVkNTFmMDU0ODJhYzVkNzYxMDJjNmNkNDAzNWZlOTk5Y2I4ZjUwM2JjYWQyODg1MmJjN2I0MDgxNDhhMzk3ZmY3NGY5MjViMjljMzg1OTVjYTgwZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJkMWNlZDVmMTM3NTRjY2ZmNDlkYzBmODEwYzhlNmQ1MjcyN2JmMmM0ZWM3N2E4ZGQ5YTVmZjU3NzQ5NWM0YWZjZjRkYTJiOGFmNDM2Yzg0MzM2YWY5OWE3MWMxY2NiNzQ5MGY2YmEyOTdlYzE5NWYzZjM3Y2M3ODAxZWFkZjZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGUwOTVmN2M0NTg1NzJiNTEwZmEzMzYwM2MyMDczZDMxMjkxNTJkZjNmNzRkM2U2MjdiMzkzMTkxOWY2Njk0YTU2ZmViODQ5NzlmOGFlOTU0MGRkNDYyYzA2ODRiNmU1YmI4OWJiZDBhODdkZWYyMmVhOTM3NTNkZWY3OTM0YTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MzQxZDhmNTY1ZGQ2YWEwMzA4MmEzNmUxMjVhYzk4YzUwY2RlYTljMzIzYTYzM2RhOGNjNDJlNmJjZTkwZjRkMDA2MDdkNDUxNjQ5NDExMGUxYmZlZGE0Y2YzYjIyMWUwM2IzZWVjZjQ2OTZlY2E5ZGJhNmQ2ZTk4YTIyNGQ4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTM1YTZkMGIzMGFjNzhlZWMzODI3YWEwZjkxOWU5NmU5MmY1M2QxNmE3NTM5ZmJhNjgyZjczOWUxNmRmMWNmM2I3MjA4NmZkNjc1NDJmNzkwMDJiYjc3NmI2YTBmNDg5ODdmNGMwOTQ1ZTVjNmQzOWVjMDljYTYxOTc4MzNlZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlODM5ZjkzMzY2ZjY4ZjA4ZDNlNTk2MWI5NDUxODVjMDk0MTAxYjdiNzMwN2I1ZGZmN2YzNDU4ODg4Njk0NDhkMTcyMDZkNjE4ODk3NDU4MGExNzg5ZDc0YTdjODQ5ZGZlNzY1ZTQzZTQ0NTUzMzZhZWQxMzdiOGIwY2Y5ZDQ0ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZGIzMjQwMDM0YzkxYWYxYzBiNGQ1OWNlNWMwOWNkOGZiMjIzZmM1MWIxNTcwMTJlZWZlMmQzMzJiZGY3YTQzOTIwNTQ2ZmU1NzEzMmYwYzUxMzYzMmE5MDk1M2ZmMzcxMDA0Mjk0OTZiN2IxYzBjMDljNTc3NDVlMzNmN2FmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzdlMzUyZmRjNWZjYTM3N2I0MDFhYzE0YTAzNDY4ZTE0NmUzNTcyYTAwOTE0YWYyMDI5MzFlNThmZmI5ZTFhNDMyNDYwNmZiYmQxZjIxNGQzZjU3NjgxOTVkY2RjYzk0YjcyMWUxMGZlYWZkYTMwYTM3ODU4ZTJmMzQxNDc3YzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYmFjNDc2MDE1NjkzMjE5M2IxMGUxZTUxYmQ1YTgxNWEzYTcxMTA4MTA3YjVlY2UzMmQ1OGRmMmQxNDgyNmYwYmY4NWFlNzg4MTljNjM3NDc5NzY3NDA0ODhiZmFjODQ4NWNiMGYyYTRkOTc3NWU2YTI1YmYzZmViMzFjNDE2MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMTE3ODZhMGE1Y2E4MDljY2FjMWYxOTgwN2EzYjYxMGM0MTEzMDE4MTc5NmFlZDJlMzdkY2JlMWNkOGU0NTc4YmQyMDU1MTJhNWZjOWZiMzEwZjRmY2Q1OTQ1ZDk2MmVmMjQ5M2MzMTIzNDE1N2E5MzRjNWQ1YWMzNDViZTdhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vc3RyZWFtLXYxLjIuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3N0cmVhbSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9zdHJlYW0tdjEuMi4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9zdHJlYW0tdjEuMi4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTEwMWRmMTYwOThiNzhhNmEzMWNjMzZhZDA3NmY5M2ZlMjVkOTQ2MTYxZDc2MzViODk4NTQ2ZTZjMGZmOWQ5ODhmYzk3MThlOWQ0OGViZjdiM2VkZDg5ZTRmMjczNGI4OGMwOTRkODE3ODhmMDU0N2M5M2ZhOGFhMzdjOTcxYjQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgImplc3NpZS5qcy12MC4zLjQiOiB7CiAgICAgICJuYW1lIjogImplc3NpZS5qcyIsCiAgICAgICJsYWJlbCI6ICJqZXNzaWUuanMtdjAuMy40IiwKICAgICAgImxvY2F0aW9uIjogImplc3NpZS5qcy12MC4zLjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBhZjEwOTk3MjkwMWVlYzNlN2Q5YzAxZGFlMjZhZWQ2NzlmZjEwYzZiOGMyZWFiOWY3Yjg1MDJhMjdkOTE1ZjRmYzBkODhjZmYyNWYxNWI2OTg1ZjRlMWNlMmJkNDUzYjc4MzEwYmY2YzNjNmEyNTgzM2M1MWIwNzA2NWIwMzI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkN2RlNmNiYjUxZTE2YTJkZDUyMGY3ZTU2NjBhZGZhM2QzNmI5ZDIwZWViYTdjZDNkMDM2YTBkNWJmZDZkMTRhZDg1ZjU2MzkwMGYxNmM2YTA3YmM1NzJmZjg0MzZjM2ZkMWFmZGM3NTY3NzIzNzA5ODM3NDNlNmQyNGQ3NDdjMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNTdlOGNhOWY1MDQwM2UwZDQ2OTYyZmM4NDUzOTU4ZWZkYzUzMDM1YWQ4OWJiMGY0NmNmMTI2MzY3ZDc2OTI5ZTliM2JlMTNlZjk1YzQ1Mjc2ZmNiODQ2MDc5YTY0MTVkNzNiZDM1MzkxZmE2NjBkZjE2MjA3OWJhNzE5YjJkZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGZkNTJlZjMwMmMxZjE0YzYyMGZkZGQ0MzcyN2Q4MjMyNDAzYjliZDM1NjFlMWYxMjNkY2U5ZDRlOWExM2I1NWEyZDFlZTRhZDgwNzAyZjI1MTExOWU5ZDQ5MmE4YzdhMzQ1ZmU1NzFhNDc5ZDM5MWUyYjc4MWZmYjEzOGMwMDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhOGQzYzVkYzdkNDJiYTcyZmZjNmZlYjJkOTkxMzFhNzkzYzM0MTkyYzU5MTc4MzMwOWUwZGE5MWQxMDI5MjFkOGVkNTA2ZDk3OTVjZjNiZWZjNmE3OTNmYzZhYjE4MDMxZmYyYmJhZGRiZGI0NzY0YzZmNDlmZjhlOTAzYmJlMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9hc3luYy10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMjJjZDIzMGRjMjFmNmE5MTc0Mjc0NWM1OGRmNTkyODA2YWRlOGYxM2I4N2YyOTBmMDg2ODliY2NjYzRlNjE0NzQ0Y2RmNDNmOGQ5ZjNlZTZhMWM1NmQ5MTA4MzFlMzk3YjY2NmJjYjgwOThhMTEyNjIwMDI1Mzg0MGZlNjUwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzQ2YjZhYmJjZWE3MGI1MTIwYTA1NDI2MzlhOTg1ZDg5OGEyNWYyNWEyMzk0MGVjYzBmYTI2ZTZlZmM4ZDY1MmE1ZGI5YWU1YTc1ZWMyNzhmNzljNDRkODgwMGQ5N2E3YmRlZWJmZTY1NzMzYjNhYjY2NGJiMjM1M2M0NjU1ZWUiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAAAxgEj4jQEAAI0BAAAgAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL2hlYXAuanN7ImltcG9ydHMiOlsiLi9zcmMvaGVhcC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2hlYXAuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvaGVhcC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABMzBZHzCwAA8wsAACQAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2hlYXAuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2V4byIsIkBhZ29yaWMvc3RvcmUiLCIuL21ha2Utb25jZS5qcyIsIi4va2V5cy5qcyIsIi4vd2F0Y2gtcHJvbWlzZS5qcyJdLCJleHBvcnRzIjpbIm1ha2VIZWFwWm9uZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhcixpc1Bhc3NhYmxlLG1ha2VFeG8sZGVmaW5lRXhvQ2xhc3MsZGVmaW5lRXhvQ2xhc3NLaXQsbWFrZVNjYWxhck1hcFN0b3JlLG1ha2VTY2FsYXJTZXRTdG9yZSxtYWtlU2NhbGFyV2Vha01hcFN0b3JlLG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUsbWFrZU9uY2VLaXQsa2V5cyx3YXRjaFByb21pc2U7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiaXNQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGlzUGFzc2FibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9leG9cIiwgW1tcIm1ha2VFeG9cIixbJGjNj19hID0+IChtYWtlRXhvID0gJGjNj19hKV1dLFtcImRlZmluZUV4b0NsYXNzXCIsWyRozY9fYSA9PiAoZGVmaW5lRXhvQ2xhc3MgPSAkaM2PX2EpXV0sW1wiZGVmaW5lRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChkZWZpbmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyU2V0U3RvcmUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUgPSAkaM2PX2EpXV1dXSxbXCIuL21ha2Utb25jZS5qc1wiLCBbW1wibWFrZU9uY2VLaXRcIixbJGjNj19hID0+IChtYWtlT25jZUtpdCA9ICRozY9fYSldXV1dLFtcIi4va2V5cy5qc1wiLCBbW1wiYWdvcmljVmF0RGF0YUtleXNcIixbJGjNj19hID0+IChrZXlzID0gJGjNj19hKV1dXV0sW1wiLi93YXRjaC1wcm9taXNlLmpzXCIsIFtbXCJ3YXRjaFByb21pc2VcIixbJGjNj19hID0+ICh3YXRjaFByb21pc2UgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtTdG9yZXN9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAdHlwZSB7U3RvcmVzfVxuICovXG5jb25zdCBkZXRhY2hlZEhlYXBTdG9yZXMgPSBGYXIoJ2hlYXBTdG9yZXMnLCB7XG4gIGRldGFjaGVkOiAoKSA9PiBkZXRhY2hlZEhlYXBTdG9yZXMsXG4gIGlzU3RvcmFibGU6IGlzUGFzc2FibGUsXG5cbiAgc2V0U3RvcmU6IG1ha2VTY2FsYXJTZXRTdG9yZSxcbiAgbWFwU3RvcmU6IG1ha2VTY2FsYXJNYXBTdG9yZSxcbiAgd2Vha01hcFN0b3JlOiBtYWtlU2NhbGFyV2Vha01hcFN0b3JlLFxuICB3ZWFrU2V0U3RvcmU6IG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUsXG59KTtcblxuLyoqXG4gKiBDcmVhdGUgYSBoZWFwIChpbi1tZW1vcnkpIHpvbmUgdGhhdCB1c2VzIHRoZSBkZWZhdWx0IGV4byBhbmQgc3RvcmUgaW1wbGVtZW50YXRpb25zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZUxhYmVsXVxuICogQHJldHVybnMge1pvbmV9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlSGVhcFpvbmUgPSAoYmFzZUxhYmVsID0gJ2hlYXBab25lJykgPT4ge1xuICBjb25zdCB7IG1ha2VPbmNlLCB3cmFwUHJvdmlkZXIgfSA9IG1ha2VPbmNlS2l0KGJhc2VMYWJlbCwgZGV0YWNoZWRIZWFwU3RvcmVzKTtcblxuICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHBhcmFtIHthbnl9IF9vcHRpb25zXG4gKi9cbiAgY29uc3QgbWFrZVN1YlpvbmUgPSAobGFiZWwsIF9vcHRpb25zKSA9PlxuICAgIG1ha2VIZWFwWm9uZShgJHtiYXNlTGFiZWx9LiR7bGFiZWx9YCk7XG5cbiAgcmV0dXJuIEZhcignaGVhcFpvbmUnLCB7XG4gICAgZXhvOiB3cmFwUHJvdmlkZXIobWFrZUV4bywga2V5cy5leG8pLFxuICAgIGV4b0NsYXNzOiB3cmFwUHJvdmlkZXIoZGVmaW5lRXhvQ2xhc3MsIGtleXMuZXhvQ2xhc3MpLFxuICAgIGV4b0NsYXNzS2l0OiB3cmFwUHJvdmlkZXIoZGVmaW5lRXhvQ2xhc3NLaXQsIGtleXMuZXhvQ2xhc3NLaXQpLFxuICAgIHN1YlpvbmU6IHdyYXBQcm92aWRlcihtYWtlU3ViWm9uZSksXG5cbiAgICBtYWtlT25jZSxcbiAgICB3YXRjaFByb21pc2UsXG4gICAgZGV0YWNoZWQ6IGRldGFjaGVkSGVhcFN0b3Jlcy5kZXRhY2hlZCxcbiAgICBpc1N0b3JhYmxlOiBkZXRhY2hlZEhlYXBTdG9yZXMuaXNTdG9yYWJsZSxcblxuICAgIG1hcFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLm1hcFN0b3JlKSxcbiAgICBzZXRTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy5zZXRTdG9yZSksXG4gICAgd2Vha01hcFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLndlYWtNYXBTdG9yZSksXG4gICAgd2Vha1NldFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLndlYWtTZXRTdG9yZSksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUhlYXBab25lKG1ha2VIZWFwWm9uZSk7XG5oYXJkZW4obWFrZUhlYXBab25lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VIZWFwWm9uZSI6WyJtYWtlSGVhcFpvbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFW6x+nkCAAB5AgAAJQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9leHBvcnRzLmpzIiwiLi9tYWtlLW9uY2UuanMiLCIuL2tleXMuanMiLCIuL2lzLXBhc3NhYmxlLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIiwiLi9pcy1wYXNzYWJsZS5qcyIsIi4va2V5cy5qcyIsIi4vbWFrZS1vbmNlLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vZXhwb3J0cy5qc1wiLCBbXV0sW1wiLi9tYWtlLW9uY2UuanNcIiwgW11dLFtcIi4va2V5cy5qc1wiLCBbXV0sW1wiLi9pcy1wYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi93YXRjaC1wcm9taXNlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC1M1ZEhAwAAIQMAACsAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2lzLXBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJpc1Bhc3NhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcmVhbElzUGFzc2FibGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJpc1Bhc3NhYmxlXCIsWyRozY9fYSA9PiAocmVhbElzUGFzc2FibGUgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIEltcG9ydCBgaXNQYXNzYWJsZWAgZGlyZWN0bHkgZnJvbSBgQGVuZG8vcGFzcy1zdHlsZWBcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge3NwZWNpbWVuIGlzIFBhc3NhYmxlfVxuICovXG4gICAgICAgY29uc3QgaXNQYXNzYWJsZSA9IHNwZWNpbWVuID0+IHJlYWxJc1Bhc3NhYmxlKHNwZWNpbWVuKTskaM2PX29uY2UuaXNQYXNzYWJsZShpc1Bhc3NhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGUiOlsiaXNQYXNzYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABsFac/IgQAACIEAAAkAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9rZXlzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhZ29yaWNWYXREYXRhS2V5cyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIEBpbXBvcnQge0tleU1ha2Vyc30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAqL1xuY29uc3Qga2luZCA9IGxhYmVsID0+IGAke2xhYmVsfV9raW5kSGFuZGxlYDtcblxuLyoqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAqL1xuY29uc3Qgc2luZ2xldG9uID0gbGFiZWwgPT4gYCR7bGFiZWx9X3NpbmdsZXRvbmA7XG5cbi8qKlxuICogS2V5TWFrZXJzIGNvbXBhdGlibGUgd2l0aCBgQGFnb3JpYy92YXQtZGF0YWAuXG4gKlxuICogQHR5cGUge0tleU1ha2Vyc31cbiAqL1xuICAgICAgIGNvbnN0IGFnb3JpY1ZhdERhdGFLZXlzID0ge1xuICBleG9DbGFzczogbGFiZWwgPT4gaGFyZGVuKFtraW5kKGxhYmVsKV0pLFxuICBleG9DbGFzc0tpdDogbGFiZWwgPT4gaGFyZGVuKFtraW5kKGxhYmVsKV0pLFxuICBleG86IGxhYmVsID0+IGhhcmRlbihba2luZChsYWJlbCksIHNpbmdsZXRvbihsYWJlbCldKSxcbiAgc3RvcmU6IGxhYmVsID0+IGhhcmRlbihbbGFiZWxdKSxcbiAgem9uZTogbGFiZWwgPT4gaGFyZGVuKFtsYWJlbF0pLFxufTskaM2PX29uY2UuYWdvcmljVmF0RGF0YUtleXMoYWdvcmljVmF0RGF0YUtleXMpO1xuaGFyZGVuKGFnb3JpY1ZhdERhdGFLZXlzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFnb3JpY1ZhdERhdGFLZXlzIjpbImFnb3JpY1ZhdERhdGFLZXlzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKkbjar6DgAA+g4AACkAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL21ha2Utb25jZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlT25jZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBpbXBvcnQge1N0b3Jlc30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtNYXBTdG9yZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICovXG5cbi8qKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgKi9cbmNvbnN0IGRlZmF1bHRMYWJlbFRvS2V5cyA9IGxhYmVsID0+IGhhcmRlbihbbGFiZWxdKTtcbmhhcmRlbihkZWZhdWx0TGFiZWxUb0tleXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWJ1Z05hbWUgT25seSB1c2VkIGludGVybmFsbHkgZm9yIGRpYWdub3N0aWNzLCBub3QgYXZhaWxhYmxlIHRvIHVzZXIgY29kZVxuICogQHBhcmFtIHtTdG9yZXN9IHN0b3Jlc1xuICogQHBhcmFtIHtNYXBTdG9yZTxzdHJpbmcsIGFueT59IFtiYWNraW5nU3RvcmVdXG4gKi9cbiAgICAgICBjb25zdCBtYWtlT25jZUtpdCA9IChkZWJ1Z05hbWUsIHN0b3JlcywgYmFja2luZ1N0b3JlID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8qIFdlIG5lZWQgYSBkZXRhY2hlZCBzZXRTdG9yZSBzbyB0aGF0IGl0IGlzbid0IHBlcnNpc3RlZCBhcyBwYXJ0IG9mIHRoZSB6b25lLiovXG4gIC8qIFRoYXQgd2F5LCBvdXIgdXNlZEtleXMgYXJlIG9ubHkgdHJhY2tlZCBmb3IgdGhlIGN1cnJlbnQgaW5jYXJuYXRpb24sIHdoaWNoKi9cbiAgLyogaXMgd2hhdCB3ZSB3YW50LiAgVXNpbmcgYGRlYnVnTmFtZWAgaW4gdGhlIGxhYmVsIGlzIGdvb2QgZm9yIGRpYWdub3N0aWNzLCovXG4gIC8qIGFuZCBzaW5jZSBpdCBpcyBvbmx5IGZvciBhIGRldGFjaGVkIHN0b3JlLCBpdCBzaG91bGQgbm90IGJlIHZpc2libGUgdG8gdGhlKi9cbiAgLyogYmFja2luZyBzdG9yZS4qL1xuICBjb25zdCB1c2VkS2V5cyA9IHN0b3Jlcy5kZXRhY2hlZCgpLnNldFN0b3JlKGAke2RlYnVnTmFtZX0gdXNlZCBrZXlzYCk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKi9cbiAgY29uc3QgYXNzZXJ0T25seU9uY2UgPSBrZXkgPT4ge1xuICAgIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8IEZhaWxga2V5ICR7a2V5fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAhdXNlZEtleXMuaGFzKGtleSkgfHxcbiAgICAgIEZhaWxga2V5ICR7a2V5fSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gdGhpcyB6b25lIGFuZCBpbmNhcm5hdGlvbmA7XG5cbiAgICAvKiBNYXJrIHRoaXMga2V5IGFzIHVzZWQuICBXZSBtYWtlIG5vIGF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIGludmFsaWQgbWFrZXJzKi9cbiAgICAvKiBvciBiYWNraW5nU3RvcmVzLiovXG4gICAgdXNlZEtleXMuYWRkKGtleSk7XG4gIH07XG5cbiAgLyoqXG4gKiBFbnN1cmUgdGhlIHdyYXBwZWQgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgb25jZSBwZXIgaW5jYXJuYXRpb24uICBJdCBpc1xuICogZXhwZWN0ZWQgdG8gdXBkYXRlIHRoZSBiYWNraW5nIHN0b3JlIGRpcmVjdGx5LlxuICpcbiAqIEB0ZW1wbGF0ZSB7KGtleTogc3RyaW5nLCAuLi5yZXN0OiBhbnlbXSkgPT4gYW55fSBUXG4gKiBAcGFyYW0ge1R9IHByb3ZpZGVyXG4gKiBAcGFyYW0geyhsYWJlbDogc3RyaW5nKSA9PiBzdHJpbmdbXX0gW2xhYmVsVG9LZXlzXVxuICogQHJldHVybnMge1R9XG4gKi9cbiAgY29uc3Qgd3JhcFByb3ZpZGVyID0gKHByb3ZpZGVyLCBsYWJlbFRvS2V5cyA9IGRlZmF1bHRMYWJlbFRvS2V5cykgPT4ge1xuICAgIC8qKiBAdHlwZSB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFJldHVyblR5cGU8VD59ICovXG4gICAgY29uc3Qgd3JhcHBlciA9IChsYWJlbCwgLi4ucmVzdCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgbGFiZWxUb0tleXMobGFiZWwpKSB7XG4gICAgICAgIGFzc2VydE9ubHlPbmNlKGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvdmlkZXIobGFiZWwsIC4uLnJlc3QpO1xuICAgIH07XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKHdyYXBwZXIpO1xuICB9O1xuXG4gIC8qKlxuICogVGhlIGJlc3Qgd2F5IHRvIHVuZGVyc3RhbmQgdGhlIHB1cnBvc2Ugb2YgYG1ha2VPbmNlYCBpcyB0byBmaXJzdCB1bmRlcnN0YW5kXG4gKiB3aGF0IGBtYWtlT25jZWAgZG9lcyBvbiBhIGR1cmFibGUgem9uZS4gVXNlZCBjb3JyZWN0bHksIGBtYWtlT25jZWAgc2hvdWxkIG9ubHlcbiAqIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2Ugb24gYW55IHpvbmUsa2V5IHBhaXIgZHVyaW5nIGFueSB2YXQgaW5jYXJuYXRpb24uXG4gKiBHaXZlbiB0aGF0IGNvbnN0cmFpbnQsIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB2YWx1ZSBib3VuZCB0byB0aGF0XG4gKiB6b25lLGtleSBwYWlyLCBpdCBtdXN0IGhhdmUgYmVlbiBsZWZ0IHRoZXJlIGJ5IGEgcHJldmlvdXMgaW5jYXJuYXRpb24gYW5kXG4gKiBgbWFrZU9uY2VgIHdpbGwgc2ltcGx5IHJldHVybiBpdC4gSWYgbm90LCB0aGVuIGBtYWtlcihrZXkpYCBpcyBjYWxsZWQgdG9cbiAqIGRldGVybWluZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGF0IHNsb3QsIHdoaWNoIHdpbGwgbm9ybWFsbHkgYmUgcHJlc2VydmVkXG4gKiBieSBzaW1pbGFyIGNhbGxzIHRvIGBtYWtlT25jZWAgaW4gZnV0dXJlIGluY2FybmF0aW9ucyAtLS0gdGhvdWdoIHRoYXQgd2lsbCBiZVxuICogdXAgdG8gdGhlbS5cbiAqXG4gKiBBbHNvIGVuc3VyZXMgdGhlIG1ha2VyIHJldHVybnMgYSBzdG9yYWJsZSB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgc3RyaW5nIG5hbWUgb2YgdGhlIFpvbmUgc2xvdCB0byBwcm92aWRlLlxuICogQHBhcmFtIHsoa2V5OiBzdHJpbmcpID0+IFZ9IG1ha2VyIENhbGxlZCB0byBjcmVhdGUgYSBmcmVzaCB2YWx1ZSB0byBmaWxsIGFuIGVtcHR5IHNsb3QuXG4gKiBAcmV0dXJucyB7Vn0gVGhlIHZhbHVlIG9mIHRoZSBrZXkncyBzbG90LlxuICovXG4gIGNvbnN0IG1ha2VPbmNlID0gKGtleSwgbWFrZXIpID0+IHtcbiAgICBhc3NlcnRPbmx5T25jZShrZXkpO1xuICAgIGlmIChiYWNraW5nU3RvcmUgJiYgYmFja2luZ1N0b3JlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gYmFja2luZ1N0b3JlLmdldChrZXkpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IG1ha2VyKGtleSk7XG4gICAgc3RvcmVzLmlzU3RvcmFibGUodmFsdWUpIHx8XG4gICAgICBGYWlsYG1ha2VyIHJldHVybiB2YWx1ZSAke3ZhbHVlfSBpcyBub3Qgc3RvcmFibGVgO1xuICAgIGJhY2tpbmdTdG9yZSAmJiBiYWNraW5nU3RvcmUuaW5pdChrZXksIHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IG1ha2VPbmNlLCB3cmFwUHJvdmlkZXIgfSk7XG59OyRozY9fb25jZS5tYWtlT25jZUtpdChtYWtlT25jZUtpdCk7XG5oYXJkZW4obWFrZU9uY2VLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU9uY2VLaXQiOlsibWFrZU9uY2VLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYL/aGKsNAACrDQAALQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvd2F0Y2gtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXR0ZXJucyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSIsIlByb21pc2VXYXRjaGVySGFuZGxlciIsIlByb21pc2VXYXRjaGVySSIsIlByb21pc2VXYXRjaGVyUmVqZWN0ZWRJIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxNLEU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qKlxuICogQSBQcm9taXNlV2F0Y2hlciBtZXRob2QgZ3VhcmQgY2FsbGFibGUgd2l0aCBvciBtb3JlIGFyZ3VtZW50cywgcmV0dXJuaW5nIHZvaWQuXG4gKi9cbiAgICAgICBjb25zdCBQcm9taXNlV2F0Y2hlckhhbmRsZXIgPSBNLmNhbGwoTS5yYXcoKSkucmVzdChNLnJhdygpKS5yZXR1cm5zKCk7XG5cbi8qKlxuICogQSBQcm9taXNlV2F0Y2hlciBpbnRlcmZhY2UgdGhhdCBoYXMgYm90aCBvbkZ1bGZpbGxlZCBhbmQgb25SZWplY3RlZCBoYW5kbGVycy5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlckhhbmRsZXIoUHJvbWlzZVdhdGNoZXJIYW5kbGVyKTtcbiAgICAgICBjb25zdCBQcm9taXNlV2F0Y2hlckkgPSBNLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXInLCB7XG4gIG9uRnVsZmlsbGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXIsXG4gIG9uUmVqZWN0ZWQ6IFByb21pc2VXYXRjaGVySGFuZGxlcixcbn0pO1xuXG4vKipcbiAqIEEgUHJvbWlzZVdhdGNoZXIgaW50ZXJmYWNlIHRoYXQgaGFzIG9ubHkgYW4gb25GdWxmaWxsZWQgaGFuZGxlci5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlckkoUHJvbWlzZVdhdGNoZXJJKTtcbiAgICAgICBjb25zdCBQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkgPSBNLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWQnLCB7XG4gIG9uRnVsZmlsbGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXIsXG59KTtcblxuLyoqXG4gKiBBIFByb21pc2VXYXRjaGVyIGludGVyZmFjZSB0aGF0IGhhcyBvbmx5IGFuIG9uUmVqZWN0ZWQgaGFuZGxlci5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkoUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJKTtcbiAgICAgICBjb25zdCBQcm9taXNlV2F0Y2hlclJlamVjdGVkSSA9IE0uaW50ZXJmYWNlKCdQcm9taXNlV2F0Y2hlclJlamVjdGVkJywge1xuICBvblJlamVjdGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXIsXG59KTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcm9taXNlV2F0Y2hlclxuICogQHByb3BlcnR5IHsoZnVsZmlsbWVudDogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkfSBbb25GdWxmaWxsZWRdXG4gKiBAcHJvcGVydHkgeyhyZWFzb246IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZH0gW29uUmVqZWN0ZWRdXG4gKi9cblxuLyoqXG4gKiBBZGFwdCBhIHByb21pc2Ugd2F0Y2hlciBtZXRob2QgdG8gRS53aGVuLlxuICogQHBhcmFtIHtSZWNvcmQ8UHJvcGVydHlLZXksICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24+fSB0aGF0XG4gKiBAcGFyYW0ge1Byb3BlcnR5S2V5fSBwcm9wXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gcG9zdEFyZ3NcbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlclJlamVjdGVkSShQcm9taXNlV2F0Y2hlclJlamVjdGVkSSk7XG5jb25zdCBjYWxsTWVNYXliZSA9ICh0aGF0LCBwcm9wLCBwb3N0QXJncykgPT4ge1xuICBjb25zdCBmbiA9IHRoYXRbcHJvcF07XG4gIGlmICghZm4pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGFzc2VydC50eXBlb2YoZm4sICdmdW5jdGlvbicpO1xuICAvKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJnIHZhbHVlIG9yIHJlYXNvblxuICovXG4gIGNvbnN0IHdyYXBwZWQgPSBhcmcgPT4ge1xuICAgIC8qIERvbid0IHJldHVybiBhIHZhbHVlLCB0byBwcmV2ZW50IEUud2hlbiBmcm9tIHN1YnNjcmliaW5nIHRvIGEgcmVzdWx0aW5nKi9cbiAgICAvKiBwcm9taXNlLiovXG4gICAgYXBwbHkoZm4sIHRoYXQsIFthcmcsIC4uLnBvc3RBcmdzXSk7XG4gIH07XG4gIHJldHVybiB3cmFwcGVkO1xufTtcblxuLyoqXG4gKiBTaGltIHRoZSBwcm9taXNlIHdhdGNoZXIgYmVoYXZpb3VyIHdoZW4gVmF0RGF0YS53YXRjaFByb21pc2UgaXMgbm90IGF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Byb21pc2U8YW55Pn0gcFxuICogQHBhcmFtIHtQcm9taXNlV2F0Y2hlcn0gd2F0Y2hlclxuICogQHBhcmFtIHsuLi51bmtub3dufSB3YXRjaGVyQXJnc1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgICAgICBjb25zdCB3YXRjaFByb21pc2UgPSAocCwgd2F0Y2hlciwgLi4ud2F0Y2hlckFyZ3MpID0+IHtcbiAgUHJvbWlzZS5yZXNvbHZlKHApID09PSBwIHx8IEZhaWxgd2F0Y2hQcm9taXNlIG9ubHkgd2F0Y2hlcyBwcm9taXNlc2A7XG4gIGNvbnN0IG9uRnVsZmlsbGVkID0gY2FsbE1lTWF5YmUod2F0Y2hlciwgJ29uRnVsZmlsbGVkJywgd2F0Y2hlckFyZ3MpO1xuICBjb25zdCBvblJlamVjdGVkID0gY2FsbE1lTWF5YmUod2F0Y2hlciwgJ29uUmVqZWN0ZWQnLCB3YXRjaGVyQXJncyk7XG4gIG9uRnVsZmlsbGVkIHx8XG4gICAgb25SZWplY3RlZCB8fFxuICAgIEZhaWxgcHJvbWlzZSB3YXRjaGVyIG11c3QgaW1wbGVtZW50IGF0IGxlYXN0IG9uZSBoYW5kbGVyIG1ldGhvZGA7XG4gIHZvaWQgRS53aGVuKHAsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbn07JGjNj19vbmNlLndhdGNoUHJvbWlzZSh3YXRjaFByb21pc2UpO1xuaGFyZGVuKHdhdGNoUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQcm9taXNlV2F0Y2hlckhhbmRsZXIiOlsiUHJvbWlzZVdhdGNoZXJIYW5kbGVyIl0sIlByb21pc2VXYXRjaGVySSI6WyJQcm9taXNlV2F0Y2hlckkiXSwiUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJIjpbIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSJdLCJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSI6WyJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSJdLCJ3YXRjaFByb21pc2UiOlsid2F0Y2hQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOGDnYDnPAAA5zwAACYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50TWF0aC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSIsIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkFtb3VudE1hdGgiLCJBc3NldEtpbmQiLCJhc3NlcnRBc3NldEtpbmQiLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiLCJnZXRBc3NldEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwscGFzc1N0eWxlT2YsYXNzZXJ0UmVtb3RhYmxlLGFzc2VydFJlY29yZCxNLG1hdGNoZXMsbmF0TWF0aEhlbHBlcnMsc2V0TWF0aEhlbHBlcnMsY29weVNldE1hdGhIZWxwZXJzLGNvcHlCYWdNYXRoSGVscGVyczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImFzc2VydFJlbW90YWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFJlbW90YWJsZSA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNcIiwgW1tcIm5hdE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAobmF0TWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJzZXRNYXRoSGVscGVyc1wiLFskaM2PX2EgPT4gKHNldE1hdGhIZWxwZXJzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlTZXRNYXRoSGVscGVyc1wiLFskaM2PX2EgPT4gKGNvcHlTZXRNYXRoSGVscGVycyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5QmFnTWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChjb3B5QmFnTWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q29weUJhZywgQ29weVNldH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7QW1vdW50LCBBbW91bnRWYWx1ZSwgQXNzZXRWYWx1ZUZvcktpbmQsIEJyYW5kLCBDb3B5QmFnQW1vdW50LCBDb3B5U2V0QW1vdW50LCBNYXRoSGVscGVycywgTmF0QW1vdW50LCBOYXRWYWx1ZSwgU2V0QW1vdW50LCBTZXRWYWx1ZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyogTkI6IEFzc2V0S2luZCBpcyBib3RoIGEgY29uc3RhbnQgZm9yIGVudW1lcmF0ZWQgdmFsdWVzIGFuZCBhIHR5cGUgZm9yIHRob3NlIHZhbHVlcy4qL1xuLyoqXG4gKiBDb25zdGFudHMgZm9yIHRoZSBraW5kcyBvZiBhc3NldHMgd2Ugc3VwcG9ydC5cbiAqXG4gKiBAZW51bSB7KHR5cGVvZiBBc3NldEtpbmQpW2tleW9mIHR5cGVvZiBBc3NldEtpbmRdfVxuICovXG4gICAgICAgY29uc3QgQXNzZXRLaW5kID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgTkFUOiAnbmF0JyxcbiAgU0VUOiAnc2V0JyxcbiAgQ09QWV9TRVQ6ICdjb3B5U2V0JyxcbiAgQ09QWV9CQUc6ICdjb3B5QmFnJyxcbn0pOyRozY9fb25jZS5Bc3NldEtpbmQoQXNzZXRLaW5kKTtcbmhhcmRlbihBc3NldEtpbmQpO1xuY29uc3QgYXNzZXRLaW5kTmFtZXMgPSBoYXJkZW4oT2JqZWN0LnZhbHVlcyhBc3NldEtpbmQpLnNvcnQoKSk7XG5cbi8qKiBAcGFyYW0ge0Fzc2V0S2luZH0gYWxsZWdlZEFLICovXG4gICAgICAgY29uc3QgYXNzZXJ0QXNzZXRLaW5kID0gYWxsZWdlZEFLID0+IHtcbiAgYXNzZXRLaW5kTmFtZXMuaW5jbHVkZXMoYWxsZWdlZEFLKSB8fFxuICAgIEZhaWxgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0QXNzZXRLaW5kKGFzc2VydEFzc2V0S2luZCk7XG5oYXJkZW4oYXNzZXJ0QXNzZXRLaW5kKTtcblxuLyoqXG4gKiBBbW91bnRzIGRlc2NyaWJlIGRpZ2l0YWwgYXNzZXRzLiBGcm9tIGFuIGFtb3VudCwgeW91IGNhbiBsZWFybiB0aGUgYnJhbmQgb2ZcbiAqIGRpZ2l0YWwgYXNzZXQgYXMgd2VsbCBhcyBcImhvdyBtdWNoXCIgb3IgXCJob3cgbWFueVwiLiBBbW91bnRzIGhhdmUgdHdvIHBhcnRzOiBhXG4gKiBicmFuZCAobG9vc2VseSBzcGVha2luZywgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCkgYW5kIHRoZSB2YWx1ZSAodGhlIGFuc3dlclxuICogdG8gXCJob3cgbXVjaFwiKS4gRm9yIGV4YW1wbGUsIGluIHRoZSBwaHJhc2UgXCI1IGJ1Y2tzXCIsIFwiYnVja3NcIiB0YWtlcyB0aGUgcm9sZVxuICogb2YgdGhlIGJyYW5kIGFuZCB0aGUgdmFsdWUgaXMgNS4gQW1vdW50cyBjYW4gZGVzY3JpYmUgZnVuZ2libGUgYW5kXG4gKiBub24tZnVuZ2libGUgZGlnaXRhbCBhc3NldHMuIEFtb3VudHMgYXJlIHBhc3MtYnktY29weSBhbmQgY2FuIGJlIG1hZGUgYnkgYW5kXG4gKiBzZW50IHRvIGFueW9uZS5cbiAqXG4gKiBUaGUgaXNzdWVyIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBvZiB0aGUgYW1vdW50IGluIHBheW1lbnRzIGFuZCBwdXJzZXMuXG4gKiBUaGUgaXNzdWVyIG11c3QgYmUgYWJsZSB0byBkbyB0aGluZ3Mgc3VjaCBhcyBhZGQgZGlnaXRhbCBhc3NldHMgdG8gYSBwdXJzZVxuICogYW5kIHdpdGhkcmF3IGRpZ2l0YWwgYXNzZXRzIGZyb20gYSBwdXJzZS4gVG8gZG8gc28sIGl0IG11c3Qga25vdyBob3cgdG8gYWRkXG4gKiBhbmQgc3VidHJhY3QgZGlnaXRhbCBhc3NldHMuIFJhdGhlciB0aGFuIGhhcmQtY29kaW5nIGEgcGFydGljdWxhciBzb2x1dGlvbixcbiAqIHdlIGNob3NlIHRvIHBhcmFtZXRlcml6ZSB0aGUgaXNzdWVyIHdpdGggYSBjb2xsZWN0aW9uIG9mIHBvbHltb3JwaGljXG4gKiBmdW5jdGlvbnMsIHdoaWNoIHdlIGNhbGwgYEFtb3VudE1hdGhgLiBUaGVzZSBtYXRoIGZ1bmN0aW9ucyBpbmNsdWRlIGNvbmNlcHRzXG4gKiBsaWtlIGFkZGl0aW9uLCBzdWJ0cmFjdGlvbiwgYW5kIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0by5cbiAqXG4gKiBXZSBhbHNvIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGNvbmZ1c2lvbiBhcyB0byB3aGF0IGtpbmQgb2YgYXNzZXQgd2VcbiAqIGFyZSB1c2luZy4gVGh1cywgQW1vdW50TWF0aCBpbmNsdWRlcyBjaGVja3Mgb2YgdGhlIGBicmFuZGAsIHRoZSB1bmlxdWVcbiAqIGlkZW50aWZpZXIgZm9yIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQuIElmIHRoZSB3cm9uZyBicmFuZCBpcyB1c2VkIGluXG4gKiBBbW91bnRNYXRoLCBhbiBlcnJvciBpcyB0aHJvd24gYW5kIHRoZSBvcGVyYXRpb24gZG9lcyBub3Qgc3VjY2VlZC5cbiAqXG4gKiBBbW91bnRNYXRoIHVzZXMgbWF0aEhlbHBlcnMgdG8gZG8gbW9zdCBvZiB0aGUgd29yaywgYnV0IHRoZW4gYWRkcyB0aGUgYnJhbmRcbiAqIHRvIHRoZSByZXN1bHQuIFRoZSBmdW5jdGlvbiBgdmFsdWVgIGdldHMgdGhlIHZhbHVlIGZyb20gdGhlIGFtb3VudCBieVxuICogcmVtb3ZpbmcgdGhlIGJyYW5kIChhbW91bnQgLT4gdmFsdWUpLCBhbmQgdGhlIGZ1bmN0aW9uIGBtYWtlYCBhZGRzIHRoZSBicmFuZFxuICogdG8gcHJvZHVjZSBhbiBhbW91bnQgKHZhbHVlIC0+IGFtb3VudCkuIFRoZSBmdW5jdGlvbiBgY29lcmNlYCB0YWtlcyBhbiBhbW91bnRcbiAqIGFuZCBjaGVja3MgaXQsIHJldHVybmluZyBhbiBhbW91bnQgKGFtb3VudCAtPiBhbW91bnQpLlxuICpcbiAqIEVhY2ggaXNzdWVyIG9mIGRpZ2l0YWwgYXNzZXRzIGhhcyBhbiBhc3NvY2lhdGVkIGJyYW5kIGluIGEgb25lLXRvLW9uZVxuICogbWFwcGluZy4gSW4gdW50cnVzdGVkIGNvbnRleHRzLCBzdWNoIGFzIGluIGFuYWx5emluZyBwYXltZW50cyBhbmQgYW1vdW50cywgd2VcbiAqIGNhbiBnZXQgdGhlIGJyYW5kIGFuZCBmaW5kIHRoZSBpc3N1ZXIgd2hpY2ggbWF0Y2hlcyB0aGUgYnJhbmQuIFRoZSBpc3N1ZXIgYW5kXG4gKiB0aGUgYnJhbmQgbXV0dWFsbHkgdmFsaWRhdGUgZWFjaCBvdGhlci5cbiAqL1xuXG5jb25zdCBoZWxwZXJzID0ge1xuICBuYXQ6IG5hdE1hdGhIZWxwZXJzLFxuICBzZXQ6IHNldE1hdGhIZWxwZXJzLFxuICBjb3B5U2V0OiBjb3B5U2V0TWF0aEhlbHBlcnMsXG4gIGNvcHlCYWc6IGNvcHlCYWdNYXRoSGVscGVycyxcbn07XG5cbi8qKiBAdHlwZSB7KHZhbHVlOiB1bmtub3duKSA9PiAnbmF0JyB8ICdzZXQnIHwgJ2NvcHlTZXQnIHwgJ2NvcHlCYWcnfSB9ICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCA9IHZhbHVlID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsdWUpO1xuICBpZiAocGFzc1N0eWxlID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiAnbmF0JztcbiAgfVxuICBpZiAocGFzc1N0eWxlID09PSAnY29weUFycmF5Jykge1xuICAgIHJldHVybiAnc2V0JztcbiAgfVxuICBpZiAobWF0Y2hlcyh2YWx1ZSwgTS5zZXQoKSkpIHtcbiAgICByZXR1cm4gJ2NvcHlTZXQnO1xuICB9XG4gIGlmIChtYXRjaGVzKHZhbHVlLCBNLmJhZygpKSkge1xuICAgIHJldHVybiAnY29weUJhZyc7XG4gIH1cbiAgLyogVE9ETyBUaGlzIGlzbid0IHF1aXRlIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLCBpbiBjYXNlIHZhbHVlUGFzc1N0eWxlKi9cbiAgLyogaXMgJ3RhZ2dlZCcuIFdlIHdvdWxkIG5lZWQgdG8gZGlzdGluZ3Vpc2ggd2hhdCBraW5kIG9mIHRhZ2dlZCovXG4gIC8qIG9iamVjdCBpdCBpcy4qL1xuICAvKiBBbHNvLCB0aGlzIGtpbmQgb2YgbWFudWFsIGxpc3RpbmcgaXMgYSBtYWludGVuYW5jZSBoYXphcmQgd2UqL1xuICAvKiAoVE9ETykgd2lsbCBlbmNvdW50ZXIgd2hlbiB3ZSBleHRlbmQgdGhlIG1hdGggaGVscGVycyBmdXJ0aGVyLiovXG4gIHRocm93IEZhaWxgdmFsdWUgJHt2YWx1ZX0gbXVzdCBiZSBhIGJpZ2ludCwgY29weVNldCwgY29weUJhZywgb3IgYW4gYXJyYXksIG5vdCAke3EoXG4gICAgcGFzc1N0eWxlLFxuICApfWA7XG59O1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCB2YWx1ZSBpcyBhIHZhbGlkIEFtb3VudE1hdGggYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGhlbHBlcnMuXG4gKlxuICogTWFkZSBhdmFpbGFibGUgb25seSBmb3IgdGVzdGluZywgYnV0IGl0IGlzIGhhcm1sZXNzIGZvciBvdGhlciB1c2VzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczxWPn1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFZhbHVlR2V0SGVscGVycyA9IHZhbHVlID0+XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIGhlbHBlcnNbYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpXTtcblxuLyoqXG4gKiBAdHlwZSB7KGFsbGVnZWRCcmFuZDogQnJhbmQ8YW55PiwgYnJhbmQ/OiBCcmFuZDxhbnk+KSA9PiB2b2lkfVxuICovJGjNj19vbmNlLmFzc2VydFZhbHVlR2V0SGVscGVycyhhc3NlcnRWYWx1ZUdldEhlbHBlcnMpO1xuY29uc3Qgb3B0aW9uYWxCcmFuZENoZWNrID0gKGFsbGVnZWRCcmFuZCwgYnJhbmQpID0+IHtcbiAgaWYgKGJyYW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGFsbGVnZWRCcmFuZCA9PT0gYnJhbmQgfHxcbiAgICAgIEZhaWxgYW1vdW50J3MgYnJhbmQgJHtxKGFsbGVnZWRCcmFuZCl9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgYnJhbmQgJHtxKFxuICAgICAgICBicmFuZCxcbiAgICAgICl9YDtcbiAgfVxufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPiB8IHVuZGVmaW5lZH0gYnJhbmRcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczxhbnk+fVxuICovXG5jb25zdCBjaGVja0xSQW5kR2V0SGVscGVycyA9IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgYXNzZXJ0UmVjb3JkKGxlZnRBbW91bnQsICdsZWZ0QW1vdW50Jyk7XG4gIGFzc2VydFJlY29yZChyaWdodEFtb3VudCwgJ3JpZ2h0QW1vdW50Jyk7XG4gIGNvbnN0IHsgdmFsdWU6IGxlZnRWYWx1ZSwgYnJhbmQ6IGxlZnRCcmFuZCB9ID0gbGVmdEFtb3VudDtcbiAgY29uc3QgeyB2YWx1ZTogcmlnaHRWYWx1ZSwgYnJhbmQ6IHJpZ2h0QnJhbmQgfSA9IHJpZ2h0QW1vdW50O1xuICBhc3NlcnRSZW1vdGFibGUobGVmdEJyYW5kLCAnbGVmdEJyYW5kJyk7XG4gIGFzc2VydFJlbW90YWJsZShyaWdodEJyYW5kLCAncmlnaHRCcmFuZCcpO1xuICBvcHRpb25hbEJyYW5kQ2hlY2sobGVmdEJyYW5kLCBicmFuZCk7XG4gIG9wdGlvbmFsQnJhbmRDaGVjayhyaWdodEJyYW5kLCBicmFuZCk7XG4gIGxlZnRCcmFuZCA9PT0gcmlnaHRCcmFuZCB8fFxuICAgIEZhaWxgQnJhbmRzIGluIGxlZnQgJHtxKGxlZnRCcmFuZCl9IGFuZCByaWdodCAke3EoXG4gICAgICByaWdodEJyYW5kLFxuICAgICl9IHNob3VsZCBtYXRjaCBidXQgZG8gbm90YDtcbiAgY29uc3QgbGVmdEhlbHBlcnMgPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnMobGVmdFZhbHVlKTtcbiAgY29uc3QgcmlnaHRIZWxwZXJzID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHJpZ2h0VmFsdWUpO1xuICBsZWZ0SGVscGVycyA9PT0gcmlnaHRIZWxwZXJzIHx8XG4gICAgRmFpbGBUaGUgbGVmdCAke2xlZnRBbW91bnR9IGFuZCByaWdodCBhbW91bnQgJHtyaWdodEFtb3VudH0gaGFkIGRpZmZlcmVudCBhc3NldEtpbmRzYDtcbiAgcmV0dXJuIGxlZnRIZWxwZXJzO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtNYXRoSGVscGVyczxBc3NldFZhbHVlRm9yS2luZDxLPj59IGhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEByZXR1cm5zIHtbQXNzZXRWYWx1ZUZvcktpbmQ8Sz4sIEFzc2V0VmFsdWVGb3JLaW5kPEs+XX1cbiAqL1xuY29uc3QgY29lcmNlTFIgPSAoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpID0+IHtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBhcmJpdHJhcnkgc3VidHlwZSovXG4gIHJldHVybiBbaC5kb0NvZXJjZShsZWZ0QW1vdW50LnZhbHVlKSwgaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSByaWdodEFtb3VudC5cbiAqIFRoZSBub3Rpb24gb2YgXCJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cIiBkZXBlbmRzIG9uIHRoZSBraW5kIG9mIGFtb3VudCwgYXNcbiAqIGRlZmluZWQgYnkgdGhlIE1hdGhIZWxwZXJzLiBGb3IgZXhhbXBsZSwgd2hldGhlciByZWN0YW5nbGUgQSBpcyBncmVhdGVyIHRoYW5cbiAqIHJlY3RhbmdsZSBCIGRlcGVuZHMgb24gd2hldGhlciByZWN0YW5nbGUgQSBpbmNsdWRlcyByZWN0YW5nbGUgQiBhcyBkZWZpbmVkIGJ5XG4gKiB0aGUgbG9naWMgaW4gTWF0aEhlbHBlcnMuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc0dURSA9IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gIHJldHVybiBoLmRvSXNHVEUoLi4uY29lcmNlTFIoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpKTtcbn07XG5cbi8qKlxuICogTG9naWMgZm9yIG1hbmlwdWxhdGluZyBhbW91bnRzLlxuICpcbiAqIEFtb3VudHMgYXJlIHRoZSBjYW5vbmljYWwgZGVzY3JpcHRpb24gb2YgdHJhZGFibGUgZ29vZHMuIFRoZXkgYXJlIG1hbmlwdWxhdGVkXG4gKiBieSBpc3N1ZXJzIGFuZCBtaW50cywgYW5kIHJlcHJlc2VudCB0aGUgZ29vZHMgYW5kIGN1cnJlbmN5IGNhcnJpZWQgYnkgcHVyc2VzXG4gKiBhbmQgcGF5bWVudHMuIFRoZXkgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoaW5ncyBsaWtlIGN1cnJlbmN5LCBzdG9jaywgYW5kXG4gKiB0aGUgYWJzdHJhY3QgcmlnaHQgdG8gcGFydGljaXBhdGUgaW4gYSBwYXJ0aWN1bGFyIGV4Y2hhbmdlLlxuICovXG4gICAgICAgY29uc3QgQW1vdW50TWF0aCA9IHtcbiAgLyogVE9ETyB1c2Ugb3ZlcmxvYWRpbmcgdG8gaGFuZGxlIHdoZW4gQnJhbmQgaGFzIGFuIEFzc2V0S2luZCBhbmQgd2hlbiBpdCBkb2Vzbid0LiovXG4gIC8qIGEgQW1vdW50Rm9yVmFsdWUgdXRpbGl0eSBjb3VsZCBoZWxwIERSWSB0aG9zZSBjYXNlcy4qL1xuICAvKipcbiAqIE1ha2UgYW4gYW1vdW50IGZyb20gYSB2YWx1ZSBieSBhZGRpbmcgdGhlIGJyYW5kLlxuICpcbiAqIERvZXMgbm90IHZlcmlmeSB0aGF0IHRoZSBCcmFuZCdzIEFzc2V0S2luZCBtYXRjaGVzIHRoZSB2YWx1ZSdzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QnJhbmQ8YW55Pn0gQlxuICogQHRlbXBsYXRlIHtOYXRWYWx1ZSB8IENvcHlTZXQgfCBDb3B5QmFnIHwgU2V0VmFsdWV9IFZcbiAqIEBwYXJhbSB7Qn0gYnJhbmRcbiAqIEBwYXJhbSB7Vn0gYWxsZWdlZFZhbHVlXG4gKiBAcmV0dXJucyB7QiBleHRlbmRzIEJyYW5kPCduYXQnPlxuICogICAgID8gTmF0QW1vdW50XG4gKiAgICAgOiBWIGV4dGVuZHMgTmF0VmFsdWVcbiAqICAgICAgID8gTmF0QW1vdW50XG4gKiAgICAgICA6IFYgZXh0ZW5kcyBDb3B5U2V0XG4gKiAgICAgICAgID8gQ29weVNldEFtb3VudDxWWydwYXlsb2FkJ11bMF0+XG4gKiAgICAgICAgIDogViBleHRlbmRzIENvcHlCYWdcbiAqICAgICAgICAgICA/IENvcHlCYWdBbW91bnQ8VlsncGF5bG9hZCddWzBdWzBdPlxuICogICAgICAgICAgIDogViBleHRlbmRzIFNldFZhbHVlXG4gKiAgICAgICAgICAgICA/IFNldEFtb3VudDxWWzBdPlxuICogICAgICAgICAgICAgOiBuZXZlcn1cbiAqL1xuICBtYWtlOiAoYnJhbmQsIGFsbGVnZWRWYWx1ZSkgPT4ge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgY29uc3QgaCA9IGFzc2VydFZhbHVlR2V0SGVscGVycyhhbGxlZ2VkVmFsdWUpO1xuICAgIGNvbnN0IHZhbHVlID0gaC5kb0NvZXJjZShhbGxlZ2VkVmFsdWUpO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gICAgcmV0dXJuIGhhcmRlbih7IGJyYW5kLCB2YWx1ZSB9KTtcbiAgfSxcbiAgLyoqXG4gKiBNYWtlIHN1cmUgdGhpcyBhbW91bnQgaXMgdmFsaWQgZW5vdWdoLCBhbmQgcmV0dXJuIGEgY29ycmVzcG9uZGluZyB2YWxpZFxuICogYW1vdW50IGlmIHNvLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBBXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHBhcmFtIHtBfSBhbGxlZ2VkQW1vdW50XG4gKiBAcmV0dXJucyB7QX1cbiAqL1xuICBjb2VyY2U6IChicmFuZCwgYWxsZWdlZEFtb3VudCkgPT4ge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgYXNzZXJ0UmVjb3JkKGFsbGVnZWRBbW91bnQsICdhbW91bnQnKTtcbiAgICBjb25zdCB7IGJyYW5kOiBhbGxlZ2VkQnJhbmQsIHZhbHVlOiBhbGxlZ2VkVmFsdWUgfSA9IGFsbGVnZWRBbW91bnQ7XG4gICAgYnJhbmQgPT09IGFsbGVnZWRCcmFuZCB8fFxuICAgICAgRmFpbGBUaGUgYnJhbmQgaW4gdGhlIGFsbGVnZWRBbW91bnQgJHthbGxlZ2VkQW1vdW50fSBpbiAnY29lcmNlJyBkaWRuJ3QgbWF0Y2ggdGhlIHNwZWNpZmllZCBicmFuZCAke2JyYW5kfS5gO1xuICAgIC8qIFdpbGwgdGhyb3cgb24gaW5hcHByb3ByaWF0ZSB2YWx1ZSovXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICByZXR1cm4gQW1vdW50TWF0aC5tYWtlKGJyYW5kLCBhbGxlZ2VkVmFsdWUpO1xuICB9LFxuICAvKipcbiAqIEV4dHJhY3QgYW5kIHJldHVybiB0aGUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge0F9IGFtb3VudFxuICogQHJldHVybnMge0FbJ3ZhbHVlJ119XG4gKi9cbiAgZ2V0VmFsdWU6IChicmFuZCwgYW1vdW50KSA9PiBBbW91bnRNYXRoLmNvZXJjZShicmFuZCwgYW1vdW50KS52YWx1ZSxcbiAgLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LiBUaGlzIGlzIHRoZSBpZGVudGl0eVxuICogZWxlbWVudCBmb3IgTWF0aEhlbHBlcnMuYWRkIGFuZCBNYXRIZWxwZXJzLnN1YnRyYWN0LlxuICpcbiAqIEB0eXBlIHt7XG4gKiAgIChicmFuZDogQnJhbmQpOiBBbW91bnQ8J25hdCc+O1xuICogICA8SyBleHRlbmRzIEFzc2V0S2luZD4oYnJhbmQ6IEJyYW5kPEs+LCBhc3NldEtpbmQ6IEspOiBBbW91bnQ8Sz47XG4gKiB9fVxuICovXG4gIG1ha2VFbXB0eTogKGJyYW5kLCBhc3NldEtpbmQgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoJ25hdCcpKSA9PiB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBhc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcbiAgICBjb25zdCB2YWx1ZSA9IGhlbHBlcnNbYXNzZXRLaW5kXS5kb01ha2VFbXB0eSgpO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIG5hcnJvd2luZyBmcm9tIGZ1bmN0aW9uIG92ZXJsb2FkKi9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQsIHVzaW5nIGFub3RoZXIgYW1vdW50IGFzIHRoZVxuICogdGVtcGxhdGUgZm9yIHRoZSBicmFuZCBhbmQgYXNzZXRLaW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBBXG4gKiBAcGFyYW0ge0F9IGFtb3VudFxuICogQHJldHVybnMge0F9XG4gKi9cbiAgbWFrZUVtcHR5RnJvbUFtb3VudDogYW1vdW50ID0+IHtcbiAgICBhc3NlcnRSZWNvcmQoYW1vdW50LCAnYW1vdW50Jyk7XG4gICAgY29uc3QgeyBicmFuZCwgdmFsdWUgfSA9IGFtb3VudDtcbiAgICBjb25zdCBhc3NldEtpbmQgPSBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBkaWZmZXJlbnQgc3VidHlwZSovXG4gICAgcmV0dXJuIEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLCBhc3NldEtpbmQpO1xuICB9LFxuICAvKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBBbW91bnQgaXMgZW1wdHkuIE90aGVyd2lzZSBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kfSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBpc0VtcHR5OiAoYW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFzc2VydFJlY29yZChhbW91bnQsICdhbW91bnQnKTtcbiAgICBjb25zdCB7IGJyYW5kOiBhbGxlZ2VkQnJhbmQsIHZhbHVlIH0gPSBhbW91bnQ7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGFsbGVnZWRCcmFuZCwgJ2JyYW5kJyk7XG4gICAgb3B0aW9uYWxCcmFuZENoZWNrKGFsbGVnZWRCcmFuZCwgYnJhbmQpO1xuICAgIGNvbnN0IGggPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnModmFsdWUpO1xuICAgIHJldHVybiBoLmRvSXNFbXB0eShoLmRvQ29lcmNlKHZhbHVlKSk7XG4gIH0sXG4gIGlzR1RFLFxuICAvKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBlcXVhbHMgdGhlIHJpZ2h0QW1vdW50LiBXZSBhc3N1bWUgdGhhdCBpZlxuICogaXNHVEUgaXMgdHJ1ZSBpbiBib3RoIGRpcmVjdGlvbnMsIGlzRXF1YWwgaXMgYWxzbyB0cnVlXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QX0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBfSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgaXNFcXVhbDogKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IGggPSBjaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQpO1xuICAgIHJldHVybiBoLmRvSXNFcXVhbCguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xuICB9LFxuICAvKipcbiAqIFJldHVybnMgYSBuZXcgYW1vdW50IHRoYXQgaXMgdGhlIHVuaW9uIG9mIGJvdGggbGVmdEFtb3VudCBhbmQgcmlnaHRBbW91bnQuXG4gKlxuICogRm9yIGZ1bmdpYmxlIGFtb3VudCB0aGlzIG1lYW5zIGFkZGluZyB0aGUgdmFsdWVzLiBGb3Igb3RoZXIga2luZHMgb2ZcbiAqIGFtb3VudCwgaXQgdXN1YWxseSBtZWFucyBpbmNsdWRpbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIGJvdGggbGVmdCBhbmRcbiAqIHJpZ2h0LlxuICpcbiAqIEB0eXBlIHt7XG4gKiAgIDxBIGV4dGVuZHMgQ29weUJhZywgQiBleHRlbmRzIENvcHlCYWc+KFxuICogICAgIGxlZnRBbW91bnQ6IENvcHlCYWdBbW91bnQ8QT4sXG4gKiAgICAgcmlnaHRBbW91bnQ6IENvcHlCYWdBbW91bnQ8Qj4sXG4gKiAgICAgYnJhbmQ/OiBCcmFuZCxcbiAqICAgKTogQ29weUJhZ0Ftb3VudDxBIHwgQj47XG4gKiAgIDxBIGV4dGVuZHMgQW1vdW50PihsZWZ0QW1vdW50OiBBLCByaWdodEFtb3VudDogQSwgYnJhbmQ/OiBCcmFuZCk6IEE7XG4gKiB9fVxuICovXG4gIGFkZDogKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IGggPSBjaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQpO1xuICAgIGNvbnN0IHZhbHVlID0gaC5kb0FkZCguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xuICAgIHJldHVybiBoYXJkZW4oeyBicmFuZDogbGVmdEFtb3VudC5icmFuZCwgdmFsdWUgfSk7XG4gIH0sXG4gIC8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgbGVmdEFtb3VudCBtaW51cyB0aGUgcmlnaHRBbW91bnQgKGkuZS5cbiAqIGV2ZXJ5dGhpbmcgaW4gdGhlIGxlZnRBbW91bnQgdGhhdCBpcyBub3QgaW4gdGhlIHJpZ2h0QW1vdW50KS4gSWYgbGVmdEFtb3VudFxuICogZG9lc24ndCBpbmNsdWRlIHJpZ2h0QW1vdW50IChzdWJ0cmFjdGlvbiByZXN1bHRzIGluIGEgbmVnYXRpdmUpLCB0aHJvdyBhblxuICogZXJyb3IuIEJlY2F1c2UgdGhlIGxlZnQgYW1vdW50IG11c3QgaW5jbHVkZSB0aGUgcmlnaHQgYW1vdW50LCB0aGlzIGlzIE5PVFxuICogZXF1aXZhbGVudCB0byBzZXQgc3VidHJhY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IExcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBSXG4gKiBAcGFyYW0ge0x9IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7Un0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtMIGV4dGVuZHMgUiA/IEwgOiBuZXZlcn1cbiAqL1xuICBzdWJ0cmFjdDogKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IGggPSBjaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQpO1xuICAgIGNvbnN0IHZhbHVlID0gaC5kb1N1YnRyYWN0KC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBkaWZmZXJlbnQgc3VidHlwZSovXG4gICAgcmV0dXJuIGhhcmRlbih7IGJyYW5kOiBsZWZ0QW1vdW50LmJyYW5kLCB2YWx1ZSB9KTtcbiAgfSxcbiAgLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW4gdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QX0geFxuICogQHBhcmFtIHtBfSB5XG4gKiBAcGFyYW0ge0JyYW5kfSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QX1cbiAqL1xuICBtaW46ICh4LCB5LCBicmFuZCA9IHVuZGVmaW5lZCkgPT5cbiAgICBpc0dURSh4LCB5LCBicmFuZClcbiAgICAgID8geVxuICAgICAgOiBpc0dURSh5LCB4LCBicmFuZClcbiAgICAgICAgPyB4XG4gICAgICAgIDogRmFpbGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgLFxuICAvKipcbiAqIFJldHVybnMgdGhlIG1heCB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtBfSB4XG4gKiBAcGFyYW0ge0F9IHlcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtBfVxuICovXG4gIG1heDogKHgsIHksIGJyYW5kID0gdW5kZWZpbmVkKSA9PlxuICAgIGlzR1RFKHgsIHksIGJyYW5kKVxuICAgICAgPyB4XG4gICAgICA6IGlzR1RFKHksIHgpXG4gICAgICAgID8geVxuICAgICAgICA6IEZhaWxgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYCxcbn07JGjNj19vbmNlLkFtb3VudE1hdGgoQW1vdW50TWF0aCk7XG5oYXJkZW4oQW1vdW50TWF0aCk7XG5cbi8qKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50ICovXG4gICAgICAgY29uc3QgZ2V0QXNzZXRLaW5kID0gYW1vdW50ID0+IHtcbiAgYXNzZXJ0UmVjb3JkKGFtb3VudCwgJ2Ftb3VudCcpO1xuICBjb25zdCB7IHZhbHVlIH0gPSBhbW91bnQ7XG4gIHJldHVybiBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG59OyRozY9fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQXNzZXRLaW5kIjpbIkFzc2V0S2luZCJdLCJhc3NlcnRBc3NldEtpbmQiOlsiYXNzZXJ0QXNzZXRLaW5kIl0sImFzc2VydFZhbHVlR2V0SGVscGVycyI6WyJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiXSwiQW1vdW50TWF0aCI6WyJBbW91bnRNYXRoIl0sImdldEFzc2V0S2luZCI6WyJnZXRBc3NldEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAX+m9XnoFAAB6BQAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRTdG9yZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiXSwiZXhwb3J0cyI6WyJtYWtlQW1vdW50U3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRNYXRoOyRozY9faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dXSk7XG5cbi8qKiBAaW1wb3J0IHtBbW91bnQsIEFzc2V0S2luZH0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gQW1vdW50U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSBnZXRBbW91bnRcbiAqIEBwcm9wZXJ0eSB7KGRlbHRhOiBBbW91bnQ8Sz4pID0+IHZvaWR9IGluY3JlbWVudFxuICogQHByb3BlcnR5IHsoZGVsdGE6IEFtb3VudDxLPikgPT4gYm9vbGVhbn0gZGVjcmVtZW50XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtvYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJucyB7QW1vdW50U3RvcmU8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQW1vdW50U3RvcmUgPSAoc3RhdGUsIGtleSkgPT4ge1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBnZXRBbW91bnQ6ICgpID0+IHN0YXRlW2tleV0sXG4gICAgaW5jcmVtZW50OiBkZWx0YSA9PiB7XG4gICAgICBzdGF0ZVtrZXldID0gQW1vdW50TWF0aC5hZGQoc3RhdGVba2V5XSwgZGVsdGEpO1xuICAgIH0sXG4gICAgZGVjcmVtZW50OiBkZWx0YSA9PiB7XG4gICAgICBpZiAoQW1vdW50TWF0aC5pc0dURShzdGF0ZVtrZXldLCBkZWx0YSkpIHtcbiAgICAgICAgc3RhdGVba2V5XSA9IEFtb3VudE1hdGguc3VidHJhY3Qoc3RhdGVba2V5XSwgZGVsdGEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VBbW91bnRTdG9yZShtYWtlQW1vdW50U3RvcmUpO1xuaGFyZGVuKG1ha2VBbW91bnRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQW1vdW50U3RvcmUiOlsibWFrZUFtb3VudFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEO9e9l0BgAAdAYAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbImNvZXJjZURpc3BsYXlJbmZvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtdXN0TWF0Y2gsRGlzcGxheUluZm9TaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkRpc3BsYXlJbmZvU2hhcGVcIixbJGjNj19hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtBZGRpdGlvbmFsRGlzcGxheUluZm8sIEFzc2V0S2luZCwgRGlzcGxheUluZm99IGZyb20gJy4vdHlwZXMuanMnICovXG5cbi8qKlxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGFsbGVnZWREaXNwbGF5SW5mb1xuICogQHBhcmFtIHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHJldHVybnMge0Rpc3BsYXlJbmZvfVxuICovXG4gICAgICAgY29uc3QgY29lcmNlRGlzcGxheUluZm8gPSAoYWxsZWdlZERpc3BsYXlJbmZvLCBhc3NldEtpbmQpID0+IHtcbiAgbXVzdE1hdGNoKGFsbGVnZWREaXNwbGF5SW5mbywgRGlzcGxheUluZm9TaGFwZSwgJ2Rpc3BsYXlJbmZvJyk7XG5cbiAgaWYgKGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQgPT09IGFzc2V0S2luZCB8fFxuICAgICAgRmFpbGBkaXNwbGF5SW5mby5hc3NldEtpbmQgd2FzIHByZXNlbnQgKCR7YWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZH0pIGFuZCBkaWQgbm90IG1hdGNoIHRoZSBhc3NldEtpbmQgYXJndW1lbnQgKCR7YXNzZXRLaW5kfSlgO1xuICB9XG4gIGNvbnN0IGRpc3BsYXlJbmZvID0gaGFyZGVuKHsgLi4uYWxsZWdlZERpc3BsYXlJbmZvLCBhc3NldEtpbmQgfSk7XG5cbiAgaWYgKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMpIHx8XG4gICAgICBGYWlsYGRlY2ltYWxQbGFjZXMgJHtkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzfSBpcyBub3QgYSBzYWZlIGludGVnZXJgO1xuICB9XG5cbiAgcmV0dXJuIGRpc3BsYXlJbmZvO1xufTskaM2PX29uY2UuY29lcmNlRGlzcGxheUluZm8oY29lcmNlRGlzcGxheUluZm8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29lcmNlRGlzcGxheUluZm8iOlsiY29lcmNlRGlzcGxheUluZm8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA819NA00CAABNAgAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGg+kHPHPAAAxzwAACUAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaXNzdWVyS2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b25lL2R1cmFibGUuanMiLCIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIl0sImV4cG9ydHMiOlsiaGFzSXNzdWVyIiwibWFrZUR1cmFibGVJc3N1ZXJLaXQiLCJtYWtlSXNzdWVyS2l0IiwicHJlcGFyZUlzc3VlcktpdCIsInVwZ3JhZGVJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQsRmFpbCxhc3NlcnRQYXR0ZXJuLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxtYWtlRHVyYWJsZVpvbmUsQXNzZXRLaW5kLGFzc2VydEFzc2V0S2luZCxjb2VyY2VEaXNwbGF5SW5mbyxwcmVwYXJlUGF5bWVudExlZGdlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvbmUvZHVyYWJsZS5qc1wiLCBbW1wibWFrZUR1cmFibGVab25lXCIsWyRozY9fYSA9PiAobWFrZUR1cmFibGVab25lID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBc3NldEtpbmRcIixbJGjNj19hID0+IChBc3NldEtpbmQgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0QXNzZXRLaW5kXCIsWyRozY9fYSA9PiAoYXNzZXJ0QXNzZXRLaW5kID0gJGjNj19hKV1dXV0sW1wiLi9kaXNwbGF5SW5mby5qc1wiLCBbW1wiY29lcmNlRGlzcGxheUluZm9cIixbJGjNj19hID0+IChjb2VyY2VEaXNwbGF5SW5mbyA9ICRozY9fYSldXV1dLFtcIi4vcGF5bWVudExlZGdlci5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRMZWRnZXJcIixbJGjNj19hID0+IChwcmVwYXJlUGF5bWVudExlZGdlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7S2V5LCBQYXR0ZXJufSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKiBAaW1wb3J0IHtTaHV0ZG93bldpdGhGYWlsdXJlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LXZhdCc7XG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm59IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy92YXQtZGF0YSc7XG4gKiBAaW1wb3J0IHtBZGRpdGlvbmFsRGlzcGxheUluZm8sIFJlY292ZXJ5U2V0c09wdGlvbiwgSXNzdWVyS2l0LCBQYXltZW50TGVkZ2VyfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge0t9IGFzc2V0S2luZFxuICogQHByb3BlcnR5IHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGRpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICovXG5cbi8qKlxuICogVXNlZCBfb25seV8gaW50ZXJuYWxseSwgdG8gbWFrZSBhIG5ldyBpc3N1ZXJLaXQgb3IgdG8gcmV2aXZlIGFuIG9sZCBvbmUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7SXNzdWVyUmVjb3JkPEs+fSBpc3N1ZXJSZWNvcmRcbiAqIEBwYXJhbSB7Wm9uZX0gaXNzdWVyWm9uZVxuICogQHBhcmFtIHtSZWNvdmVyeVNldHNPcHRpb259IHJlY292ZXJ5U2V0c1N0YXRlIE9taXR0ZWQgZnJvbSBpc3N1ZXJSZWNvcmRcbiAqICAgYmVjYXVzZSBpdCB3YXMgYWRkZWQgaW4gYW4gdXBncmFkZS5cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCBzZXR1cElzc3VlcktpdCA9IChcbiAgeyBuYW1lLCBhc3NldEtpbmQsIGRpc3BsYXlJbmZvLCBlbGVtZW50U2hhcGUgfSxcbiAgaXNzdWVyWm9uZSxcbiAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gIGFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuXG4gIC8qIEFkZCBhc3NldEtpbmQgdG8gZGlzcGxheUluZm8sIG9yIG92ZXJyaWRlIGlmIHByZXNlbnQqL1xuICBjb25zdCBjbGVhbkRpc3BsYXlJbmZvID0gY29lcmNlRGlzcGxheUluZm8oZGlzcGxheUluZm8sIGFzc2V0S2luZCk7XG4gIGlmIChvcHRTaHV0ZG93bldpdGhGYWlsdXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKG9wdFNodXRkb3duV2l0aEZhaWx1cmUsICdmdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKGVsZW1lbnRTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihlbGVtZW50U2hhcGUpO1xuICB9XG5cbiAgLyogQXR0ZW51YXRlIHRoZSBwb3dlcmZ1bCBhdXRob3JpdHkgdG8gbWludCBhbmQgY2hhbmdlIGJhbGFuY2VzKi9cbiAgLyoqIEB0eXBlIHtQYXltZW50TGVkZ2VyPEs+fSAqL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUqL1xuICBjb25zdCB7IGlzc3VlciwgbWludCwgYnJhbmQsIG1pbnRSZWNvdmVyeVB1cnNlIH0gPSBwcmVwYXJlUGF5bWVudExlZGdlcihcbiAgICBpc3N1ZXJab25lLFxuICAgIG5hbWUsXG4gICAgYXNzZXRLaW5kLFxuICAgIGNsZWFuRGlzcGxheUluZm8sXG4gICAgZWxlbWVudFNoYXBlLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgYnJhbmQsXG4gICAgaXNzdWVyLFxuICAgIG1pbnQsXG4gICAgbWludFJlY292ZXJ5UHVyc2UsXG4gICAgZGlzcGxheUluZm86IGNsZWFuRGlzcGxheUluZm8sXG4gIH0pO1xufTtcbmhhcmRlbihzZXR1cElzc3VlcktpdCk7XG5cbi8qKiBUaGUga2V5IGF0IHdoaWNoIHRoZSBpc3N1ZXIgcmVjb3JkIGlzIHN0b3JlZC4gKi9cbmNvbnN0IElOU1RBTkNFX0tFWSA9ICdpc3N1ZXInO1xuLyoqXG4gKiBUaGUga2V5IGF0IHdoaWNoIHRoZSBpc3N1ZXJLaXQncyBgUmVjb3ZlcnlTZXRzT3B0aW9uYCBzdGF0ZSBpcyBzdG9yZWQuXG4gKiBJbnRyb2R1Y2VkIGJ5IGFuIHVwZ3JhZGUsIHNvIG1heSBiZSBhYnNlbnQgb24gYSBwcmVkZWNlc3NvciBpbmNhcm5hdGlvbi4gU2VlXG4gKiBgUmVjb3ZlcnlTZXRzT3B0aW9uYCBmb3IgZGVmYXVsdGluZyBiZWhhdmlvci5cbiAqL1xuY29uc3QgUkVDT1ZFUllfU0VUU19TVEFURSA9ICdyZWNvdmVyeVNldHNTdGF0ZSc7XG5cbi8qKlxuICogVXNlZCBfb25seV8gdG8gdXBncmFkZSBhIHByZWRlY2Vzc29yIGlzc3VlcktpdC4gVXNlIGBtYWtlRHVyYWJsZUlzc3VlcktpdGAgdG9cbiAqIG1ha2UgYSBuZXcgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge1JlY292ZXJ5U2V0c09wdGlvbn0gW3JlY292ZXJ5U2V0c09wdGlvbl0gQWRkZWQgaW4gdXBncmFkZSwgc28gbGFzdFxuICogICBhbmQgb3B0aW9uYWwuIFNlZSBgUmVjb3ZlcnlTZXRzT3B0aW9uYCBmb3IgZGVmYXVsdGluZyBiZWhhdmlvci5cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbiAgICAgICBjb25zdCB1cGdyYWRlSXNzdWVyS2l0ID0gKFxuICBpc3N1ZXJCYWdnYWdlLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuICByZWNvdmVyeVNldHNPcHRpb24gPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgY29uc3QgaXNzdWVyUmVjb3JkID0gaXNzdWVyQmFnZ2FnZS5nZXQoSU5TVEFOQ0VfS0VZKTtcbiAgY29uc3QgaXNzdWVyWm9uZSA9IG1ha2VEdXJhYmxlWm9uZShpc3N1ZXJCYWdnYWdlKTtcbiAgY29uc3Qgb2xkUmVjb3ZlcnlTZXRzU3RhdGUgPSBpc3N1ZXJCYWdnYWdlLmhhcyhSRUNPVkVSWV9TRVRTX1NUQVRFKVxuICAgID8gaXNzdWVyQmFnZ2FnZS5nZXQoUkVDT1ZFUllfU0VUU19TVEFURSlcbiAgICA6ICdoYXNSZWNvdmVyeVNldHMnO1xuICBpZiAoXG4gICAgb2xkUmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cycgJiZcbiAgICByZWNvdmVyeVNldHNPcHRpb24gPT09ICdoYXNSZWNvdmVyeVNldHMnXG4gICkge1xuICAgIEZhaWxgQ2Fubm90ICh5ZXQ/KSB1cGdyYWRlIGZyb20gJ25vUmVjb3ZlcnlTZXRzJyB0byAnaGFzUmVjb3ZlcnlTZXRzJ2A7XG4gIH1cbiAgLyogRXh0YW50IHNldHMgYXJlIG5vdCBjdXJyZW50bHkgZGVsZXRlZC4gSWYgdGhlIG5ldyBvcHRpb24gaXMqL1xuICAvKiAnbm9SZWNvdmVyeVNldHMnLCB0aGV5IHdvbid0IGJlIHVzZWQgYnV0IGV4dGFudCBvbmVzIHdpbGwgcmVtYWluLiBGdXR1cmUqL1xuICAvKiB1cGdyYWRlcyBtYXkgbWFrZSBpdCBwb3NzaWJsZSB0byBkZWxldGUgZWxlbWVudHMgZnJvbSB0aGVtLiovXG4gIGNvbnN0IHJlY292ZXJ5U2V0c1N0YXRlID0gcmVjb3ZlcnlTZXRzT3B0aW9uIHx8IG9sZFJlY292ZXJ5U2V0c1N0YXRlO1xuICByZXR1cm4gc2V0dXBJc3N1ZXJLaXQoXG4gICAgaXNzdWVyUmVjb3JkLFxuICAgIGlzc3VlclpvbmUsXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgKTtcbn07JGjNj19vbmNlLnVwZ3JhZGVJc3N1ZXJLaXQodXBncmFkZUlzc3VlcktpdCk7XG5oYXJkZW4odXBncmFkZUlzc3VlcktpdCk7XG5cbi8qKlxuICogRG9lcyBiYWdnYWdlIGFscmVhZHkgaGF2ZSBhbiBpc3N1ZXJLaXQ/XG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKi9cbiAgICAgICBjb25zdCBoYXNJc3N1ZXIgPSBiYWdnYWdlID0+IGJhZ2dhZ2UuaGFzKElOU1RBTkNFX0tFWSk7XG5cbi8qKlxuICogYGVsZW1lbnRTaGFwZWAsIG1heSBvbmx5IGJlIHByZXNlbnQgZm9yIGNvbGxlY3Rpb24tc3R5bGUgYW1vdW50cy4gSWYgcHJlc2VudCxcbiAqIGl0IGlzIGEgYFBhdHRlcm5gIHRoYXQgZXZlcnkgZWxlbWVudCBvZiB0aGlzIGlzc3VlcktpdHMncyBhbW91bnRzIG11c3RcbiAqIHNhdGlzZnkuIEZvciBleGFtcGxlLCB0aGUgWm9lIEludml0YXRpb24gaXNzdWVyS2l0IHVzZXMgYW4gZWxlbWVudFNoYXBlXG4gKiBkZXNjcmliaW5nIHRoZSBpbnZpdGF0aW9uIGRldGFpbHMgZm9yIGFuIGluZGl2aWR1YWwgaW52aXRhdGlvbi4gQW4gaW52aXRhdGlvblxuICogcHVyc2Ugb3IgcGF5bWVudCBoYXMgYW4gYW1vdW50IHRoYXQgY2FuIG9ubHkgYmUgYSBzZXQgb2YgdGhlc2UuIChUaG91Z2hcbiAqIHR5cGljYWxseSwgdGhlIGFtb3VudCBvZiBhbiBpbnZpdGF0aW9uIHBheW1lbnQgaXMgYSBzaW5nbGV0b24gc2V0LiBTdWNoIGFcbiAqIHBheW1lbnQgaXMgb2Z0ZW4gcmVmZXJyZWQgdG8gaW4gdGhlIHNpbmd1bGFyIGFzIFwiYW4gaW52aXRhdGlvblwiLilcbiAqXG4gKiBgcmVjb3ZlcnlTZXRzT3B0aW9uYCBhZGRlZCBpbiB1cGdyYWRlLiBOb3RlIHRoYXQgYElzc3Vlck9wdGlvbnNSZWNvcmRgIGlzXG4gKiBuZXZlciBzdG9yZWQsIHNvIHdlIG5ldmVyIG5lZWQgdG8gd29ycnkgYWJvdXQgaW5oZXJpdGluZyBvbmUgZnJvbSBhXG4gKiBwcmVkZWNlc3NvciBwcmVkYXRpbmcgdGhlIGludHJvZHVjdGlvbiBvZiByZWNvdmVyeSBzZXRzLiBTZWVcbiAqIGBSZWNvdmVyeVNldHNPcHRpb25gIGZvciBkZWZhdWx0aW5nIGJlaGF2aW9yLlxuICpcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPHtcbiAqICAgZWxlbWVudFNoYXBlOiBQYXR0ZXJuO1xuICogICByZWNvdmVyeVNldHNPcHRpb246IFJlY292ZXJ5U2V0c09wdGlvbjtcbiAqIH0+fSBJc3N1ZXJPcHRpb25zUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBVc2VkIF9vbmx5XyB0byBtYWtlIGEgX25ld18gZHVyYWJsZSBpc3N1ZXIsIGkuZS4sIHRoZSBpbml0aWFsIGluY2FybmF0aW9uIG9mXG4gKiB0aGF0IGlzc3Vlci5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gSyBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0XG4gKiAgIGRlc2NyaXB0aW9ucy4gVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogICBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS4gRm9yXG4gKiAgIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dCBpdCBpc1xuICogICBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nIHRvIHRoYXQgaXNzdWVyXG4gKiAgIGFuZCBicmFuZC5cbiAqXG4gKiAgIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzIGZyb20gdGhlXG4gKiAgIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlIGRlZmF1bHQsIGlzIHVzZWQgZm9yXG4gKiAgIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvXVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovJGjNj19vbmNlLmhhc0lzc3VlcihoYXNJc3N1ZXIpO1xuICAgICAgIGNvbnN0IG1ha2VEdXJhYmxlSXNzdWVyS2l0ID0gKFxuICBpc3N1ZXJCYWdnYWdlLFxuICBuYW1lLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIEsgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuICBhc3NldEtpbmQgPSBBc3NldEtpbmQuTkFULFxuICBkaXNwbGF5SW5mbyA9IGhhcmRlbih7fSksXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIHsgZWxlbWVudFNoYXBlID0gdW5kZWZpbmVkLCByZWNvdmVyeVNldHNPcHRpb24gPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGlzc3VlckRhdGEgPSBoYXJkZW4oe1xuICAgIG5hbWUsXG4gICAgYXNzZXRLaW5kLFxuICAgIGRpc3BsYXlJbmZvLFxuICAgIGVsZW1lbnRTaGFwZSxcbiAgfSk7XG4gIGlzc3VlckJhZ2dhZ2UuaW5pdChJTlNUQU5DRV9LRVksIGlzc3VlckRhdGEpO1xuICBjb25zdCBpc3N1ZXJab25lID0gbWFrZUR1cmFibGVab25lKGlzc3VlckJhZ2dhZ2UpO1xuICBjb25zdCByZWNvdmVyeVNldHNTdGF0ZSA9IHJlY292ZXJ5U2V0c09wdGlvbiB8fCAnaGFzUmVjb3ZlcnlTZXRzJztcbiAgaXNzdWVyQmFnZ2FnZS5pbml0KFJFQ09WRVJZX1NFVFNfU1RBVEUsIHJlY292ZXJ5U2V0c1N0YXRlKTtcbiAgcmV0dXJuIHNldHVwSXNzdWVyS2l0KFxuICAgIGlzc3VlckRhdGEsXG4gICAgaXNzdWVyWm9uZSxcbiAgICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICApO1xufTskaM2PX29uY2UubWFrZUR1cmFibGVJc3N1ZXJLaXQobWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBVc2VkIHRvIGVpdGhlciByZXZpdmUgYSBwcmVkZWNlc3NvciBpc3N1ZXJLaXQsIG9yIHRvIG1ha2UgYSBuZXcgZHVyYWJsZSBvbmVcbiAqIGlmIGl0IGlzIGFic2VudCwgYW5kIHRvIHBsYWNlIGl0IGluIGJhZ2dhZ2UgZm9yIHRoZSBuZXh0IHN1Y2Nlc3Nvci5cbiAqXG4gKiBAdGVtcGxhdGUge0lzc3Vlck9wdGlvbnNSZWNvcmR9IE9cbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXRcbiAqICAgZGVzY3JpcHRpb25zLiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiAgIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLiBGb3JcbiAqICAgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0IGl0IGlzXG4gKiAgIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmcgdG8gdGhhdCBpc3N1ZXJcbiAqICAgYW5kIGJyYW5kLlxuICpcbiAqICAgVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnMgZnJvbSB0aGVcbiAqICAgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGUgZGVmYXVsdCwgaXMgdXNlZCBmb3JcbiAqICAgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm9dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtPfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtPWydlbGVtZW50U2hhcGUnXSBleHRlbmRzIFR5cGVkUGF0dGVybjxpbmZlciBUIGV4dGVuZHMgS2V5PlxuICogICAgID8gSXNzdWVyS2l0PEssIFQ+XG4gKiAgICAgOiBJc3N1ZXJLaXQ8Sz59XG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlSXNzdWVyS2l0ID0gKFxuICBpc3N1ZXJCYWdnYWdlLFxuICBuYW1lLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIEsgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuICBhc3NldEtpbmQgPSBBc3NldEtpbmQuTkFULFxuICBkaXNwbGF5SW5mbyA9IGhhcmRlbih7fSksXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgaGF2ZSBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIElzc3Vlck9wdGlvbnNSZWNvcmQqL1xuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgaWYgKGhhc0lzc3Vlcihpc3N1ZXJCYWdnYWdlKSkge1xuICAgIGNvbnN0IHsgZWxlbWVudFNoYXBlOiBfID0gdW5kZWZpbmVkLCByZWNvdmVyeVNldHNPcHRpb24gPSB1bmRlZmluZWQgfSA9XG4gICAgICBvcHRpb25zO1xuICAgIGNvbnN0IGlzc3VlcktpdCA9IHVwZ3JhZGVJc3N1ZXJLaXQoXG4gICAgICBpc3N1ZXJCYWdnYWdlLFxuICAgICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgICAgIHJlY292ZXJ5U2V0c09wdGlvbixcbiAgICApO1xuXG4gICAgLyogVE9ETyBjaGVjayBjb25zaXN0ZW5jeSB3aXRoIG5hbWUsIGFzc2V0S2luZCwgZGlzcGxheUluZm8sIGVsZW1lbnRTaGFwZS4qL1xuICAgIC8qIENvbnNpc3RlbmN5IGVpdGhlciBtZWFucyB0aGF0IHRoZXNlIGFyZSB0aGUgc2FtZSwgb3IgdGhhdCB0aGV5IGRpZmZlciovXG4gICAgLyogaW4gYSBkaXJlY3Rpb24gd2UgYXJlIHByZXBhcmVkIHRvIHVwZ3JhZGUuIE5vdGUgdGhhdCBpdCBpcyB0aGUqL1xuICAgIC8qIHJlc3BvbnNpYmlsaXR5IG9mIGB1cGdyYWRlSXNzdWVyS2l0YCB0byBjaGVjayBjb25zaXN0ZW5jeSBvZiovXG4gICAgLyogYHJlY292ZXJ5U2V0c09wdGlvbmAsIHNvIGNvbnRpbnVlIHRvIG5vdCBkbyB0aGF0IGhlcmUuKi9cblxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgVHlwZSBwYXJhbWV0ZXIgY29uZnVzaW9uLiovXG4gICAgcmV0dXJuIGlzc3VlcktpdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpc3N1ZXJLaXQgPSBtYWtlRHVyYWJsZUlzc3VlcktpdChcbiAgICAgIGlzc3VlckJhZ2dhZ2UsXG4gICAgICBuYW1lLFxuICAgICAgYXNzZXRLaW5kLFxuICAgICAgZGlzcGxheUluZm8sXG4gICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCB0byB0aGUgdHlwZSBwYXJhbWV0ZXIqL1xuICAgIHJldHVybiBpc3N1ZXJLaXQ7XG4gIH1cbn07JGjNj19vbmNlLnByZXBhcmVJc3N1ZXJLaXQocHJlcGFyZUlzc3VlcktpdCk7XG5oYXJkZW4ocHJlcGFyZUlzc3VlcktpdCk7XG5cbi8qKlxuICogVXNlZCBfb25seV8gdG8gbWFrZSBhIG5ldyBpc3N1ZXJLaXQgdGhhdCBpcyBlZmZlY3RpdmVseSBub24tZHVyYWJsZS4gVGhpcyBpc1xuICogY3VycmVudGx5IGRvbmUgYnkgbWFraW5nIGEgZHVyYWJsZSBvbmUgaW4gYSBiYWdnYWdlIG5vdCByZWFjaGFibGUgZnJvbVxuICogYW55d2hlcmUuIFRPRE8gT25jZSByZWJ1aWx0IG9uIHpvbmVzLCB0aGlzIHNob3VsZCBpbnN0ZWFkIGp1c3QgYnVpbGQgb24gdGhlXG4gKiB2aXJ0dWFsIHpvbmUuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC83MTE2XG4gKlxuICogQ3VycmVudGx5IHVzZWQgZm9yIHRlc3Rpbmcgb25seS4gU2hvdWxkIHByb2JhYmx5IGNvbnRpbnVlIHRvIGJlIHVzZWQgZm9yXG4gKiB0ZXN0aW5nIG9ubHkuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPSduYXQnXVxuICogQHRlbXBsYXRlIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBbTz17fV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXRcbiAqICAgZGVzY3JpcHRpb25zLiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiAgIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLiBGb3JcbiAqICAgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0IGl0IGlzXG4gKiAgIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmcgdG8gdGhhdCBpc3N1ZXJcbiAqICAgYW5kIGJyYW5kLlxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kXSBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpY1xuICogICBtYXRoSGVscGVycyBmcm9tIHRoZSBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZVxuICogICBkZWZhdWx0LCBpcyB1c2VkIGZvciBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvXSBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uXG4gKiAgIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7T30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7T1snZWxlbWVudFNoYXBlJ10gZXh0ZW5kcyBUeXBlZFBhdHRlcm48aW5mZXIgVCBleHRlbmRzIEtleT5cbiAqICAgICA/IElzc3VlcktpdDxLLCBUPlxuICogICAgIDogSXNzdWVyS2l0PEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUlzc3VlcktpdCA9IChcbiAgbmFtZSxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbiAgYXNzZXRLaW5kID0gQXNzZXRLaW5kLk5BVCxcbiAgZGlzcGxheUluZm8gPSBoYXJkZW4oe30pLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIE8gY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSovXG4gIHsgZWxlbWVudFNoYXBlID0gdW5kZWZpbmVkLCByZWNvdmVyeVNldHNPcHRpb24gPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PlxuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICBtYWtlRHVyYWJsZUlzc3VlcktpdChcbiAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ2Ryb3BwZWQgaXNzdWVyIGtpdCcsIHsgZHVyYWJsZTogdHJ1ZSB9KSxcbiAgICBuYW1lLFxuICAgIGFzc2V0S2luZCxcbiAgICBkaXNwbGF5SW5mbyxcbiAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICAgIHsgZWxlbWVudFNoYXBlLCByZWNvdmVyeVNldHNPcHRpb24gfSxcbiAgKTskaM2PX29uY2UubWFrZUlzc3VlcktpdChtYWtlSXNzdWVyS2l0KTtcbmhhcmRlbihtYWtlSXNzdWVyS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InVwZ3JhZGVJc3N1ZXJLaXQiOlsidXBncmFkZUlzc3VlcktpdCJdLCJoYXNJc3N1ZXIiOlsiaGFzSXNzdWVyIl0sIm1ha2VEdXJhYmxlSXNzdWVyS2l0IjpbIm1ha2VEdXJhYmxlSXNzdWVyS2l0Il0sInByZXBhcmVJc3N1ZXJLaXQiOlsicHJlcGFyZUlzc3VlcktpdCJdLCJtYWtlSXNzdWVyS2l0IjpbIm1ha2VJc3N1ZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuKF0QB8ZAAAfGQAAMgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9sZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBhZ29yaWMvc3RvcmUiLCIuL2Ftb3VudE1hdGguanMiXSwiZXhwb3J0cyI6WyJjbGFpbSIsImNvbWJpbmUiLCJzcGxpdCIsInNwbGl0TWFueSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRSxtdXN0TWF0Y2gsQW1vdW50TWF0aDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtLZXksIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge0Ftb3VudCwgQXNzZXRLaW5kLCBQYXltZW50LCBQdXJzZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAZmlsZSBUaGlzIGZpbGUgY29udGFpbnMgc2FmZXIgaGVscGVyIGZ1bmN0aW9uIGFsdGVybmF0aXZlcyB0byB0aGUgc2ltaWxhcmx5XG4gKiAgIG5hbWVkIG1ldGhvZHMgb24gaXNzdWVyLiBUaGVzZSBhcmUgcGFyYW1ldGVyaXplZCBieSBhIHB1cnNlIHVzZWQgZm9yXG4gKiAgIHJlY292ZXJpbmcgbG9zdCBwYXltZW50cywgd2hpY2ggd2UgY2FsbCBhIGByZWNvdmVyeVB1cnNlYC4gQW55IHBheW1lbnRzXG4gKiAgIGNyZWF0ZWQgYnkgdGhlc2UgaGVscGVyIGZ1bmN0aW9ucyBhcmUgaW4gdGhlIHJlY292ZXJ5IHNldCBvZiB0aGF0XG4gKiAgIGByZWNvdmVyeVB1cnNlYCB1bnRpbCBvdGhlcndpc2UgdXNlZCB1cC5cbiAqXG4gKiAgIE9uZSBvZiB0aGVzZSBoZWxwZXIgZnVuY3Rpb25zIGlzIGxlc3Mgc2FmZSBpbiBvbmUgd2F5OiBgY29tYmluZWAgaXMgbm90XG4gKiAgIGZhaWx1cmUgYXRvbWljLiBJZiB0aGUgYGNvbWJpbmVgIGhlbHBlciBmdW5jdGlvbiBmYWlscywgc29tZSBvZiB0aGUgaW5wdXRcbiAqICAgcGF5bWVudHMgbWF5IGhhdmUgYmVlbiB1c2VkIHVwLiBIb3dldmVyLCBldmVuIGluIHRoYXQgY2FzZSwgbm8gYXNzZXRzIHdvdWxkXG4gKiAgIGJlIGxvc3QuIFRoZSBhc3NldHMgZnJvbSB0aGUgdXNlZCB1cCBwYXltZW50cyB3aWxsIGJlIGluIHRoZSBhcmd1bWVudFxuICogICBgcmVjb3ZlcnlQdXJzZWAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHRlbXBsYXRlIHtLZXl9IFQgdHlwZSBvZiB2YWx1ZXMgaW4gc2V0LWxpa2Uga2luZFxuICogQHBhcmFtIHtFUmVmPFB1cnNlPEssIFQ+Pn0gcmVjb3ZlcnlQdXJzZVxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8SywgVD4+fSBzcmNQYXltZW50UFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEssIFQ+Pn1cbiAqL1xuICAgICAgIGNvbnN0IGNsYWltID0gYXN5bmMgKFxuICByZWNvdmVyeVB1cnNlLFxuICBzcmNQYXltZW50UCxcbiAgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgY29uc3Qgc3JjUGF5bWVudCA9IGF3YWl0IHNyY1BheW1lbnRQO1xuICByZXR1cm4gRS53aGVuKEUocmVjb3ZlcnlQdXJzZSkuZGVwb3NpdChzcmNQYXltZW50LCBvcHRBbW91bnRTaGFwZSksIGFtb3VudCA9PlxuICAgIEUocmVjb3ZlcnlQdXJzZSkud2l0aGRyYXcoYW1vdW50KSxcbiAgKTtcbn07JGjNj19vbmNlLmNsYWltKGNsYWltKTtcbmhhcmRlbihjbGFpbSk7XG5cbi8qKlxuICogTm90ZTogTm90IGZhaWx1cmUgYXRvbWljLiBCdXQgYXMgbG9uZyBhcyB5b3UgZG9uJ3QgbG9zZSB0aGUgYXJndW1lbnRcbiAqIGByZWNvdmVyeVB1cnNlYCwgbm8gYXNzZXRzIGFyZSBsb3N0LiBJZiBhbnkgb2YgdGhlIGRlcG9zaXRzIGZhaWwsIG9yIHRoZVxuICogdG90YWwgZG9lcyBub3QgbWF0Y2ggb3B0VG90YWxBbW91bnQsIHNvbWUgcGF5bWVudHMgbWF5IHN0aWxsIGhhdmUgYmVlblxuICogZGVwb3NpdGVkLiBUaG9zZSBhc3NldHMgd2lsbCBiZSBpbiB0aGUgYXJndW1lbnQgYHJlY292ZXJ5UHVyc2VgLiBBbGxcbiAqIHVuZGVwb3NpdGVkIHBheW1lbnRzIHdpbGwgc3RpbGwgYmUgaW4gdGhlIHJlY292ZXJ5IHNldHMgb2YgdGhlaXIgcHVyc2VzIG9mXG4gKiBvcmlnaW4uXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBUIHR5cGUgb2YgdmFsdWVzIGluIHNldC1saWtlIGtpbmRcbiAqIEBwYXJhbSB7RVJlZjxQdXJzZTxLLCBUPj59IHJlY292ZXJ5UHVyc2VcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEssIFQ+PltdfSBzcmNQYXltZW50c1BzXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRUb3RhbEFtb3VudF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8SywgVD4+fVxuICovXG4gICAgICAgY29uc3QgY29tYmluZSA9IGFzeW5jIChcbiAgcmVjb3ZlcnlQdXJzZSxcbiAgc3JjUGF5bWVudHNQcyxcbiAgb3B0VG90YWxBbW91bnQgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgY29uc3QgYnJhbmRQID0gRShyZWNvdmVyeVB1cnNlKS5nZXRBbGxlZ2VkQnJhbmQoKTtcbiAgY29uc3QgW2JyYW5kLCBkaXNwbGF5SW5mbywgLi4uc3JjUGF5bWVudHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGJyYW5kUCxcbiAgICBFKGJyYW5kUCkuZ2V0RGlzcGxheUluZm8oKSxcbiAgICAuLi5zcmNQYXltZW50c1BzLFxuICBdKTtcblxuICAvKiBYWFggQnJhbmQgbGFja3MgTSovXG4gIGNvbnN0IGVtcHR5QW1vdW50ID0gLyoqIEB0eXBlIHtBbW91bnQ8SywgVD59ICovIChcbiAgICBBbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCwgZGlzcGxheUluZm8uYXNzZXRLaW5kKVxuICApO1xuICBjb25zdCBhbW91bnRQcyA9IHNyY1BheW1lbnRzLm1hcChzcmNQYXltZW50ID0+XG4gICAgRShyZWNvdmVyeVB1cnNlKS5kZXBvc2l0KHNyY1BheW1lbnQpLFxuICApO1xuICBjb25zdCBhbW91bnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoYW1vdW50UHMpO1xuICBjb25zdCB0b3RhbCA9IGFtb3VudHMucmVkdWNlKFxuICAgICh4LCB5KSA9PiBBbW91bnRNYXRoLmFkZCh4LCB5LCBicmFuZCksXG4gICAgZW1wdHlBbW91bnQsXG4gICk7XG4gIGlmIChvcHRUb3RhbEFtb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbXVzdE1hdGNoKHRvdGFsLCBvcHRUb3RhbEFtb3VudCwgJ2Ftb3VudCcpO1xuICB9XG4gIHJldHVybiBFKHJlY292ZXJ5UHVyc2UpLndpdGhkcmF3KHRvdGFsKTtcbn07JGjNj19vbmNlLmNvbWJpbmUoY29tYmluZSk7XG5oYXJkZW4oY29tYmluZSk7XG5cbi8qKlxuICogTm90ZTogTm90IGZhaWx1cmUgYXRvbWljLiBCdXQgYXMgbG9uZyBhcyB5b3UgZG9uJ3QgbG9zZSB0aGUgYXJndW1lbnRcbiAqIGByZWNvdmVyeVB1cnNlYCwgbm8gYXNzZXRzIGFyZSBsb3N0LiBJZiB0aGUgYW1vdW50IGluIGBzcmNQYXltZW50UGAgaXMgbm90ID49XG4gKiBgcGF5bWVudEFtb3VudEFgLCB0aGUgcGF5bWVudCBtYXkgc3RpbGwgYmUgZGVwb3NpdGVkIGFueXdheSwgYmVmb3JlIGZhaWxpbmdcbiAqIGluIHRoZSBzdWJzZXF1ZW50IHN1YnRyYWN0LiBJbiB0aGF0IGNhc2UsIHRob3NlIGFzc2V0cyB3aWxsIGJlIGluIHRoZVxuICogYXJndW1lbnQgYHJlY292ZXJ5UHVyc2VgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0VSZWY8UHVyc2U8Sz4+fSByZWNvdmVyeVB1cnNlXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHNyY1BheW1lbnRQXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcGF5bWVudEFtb3VudEFcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz5bXT59XG4gKi9cbiAgICAgICBjb25zdCBzcGxpdCA9IGFzeW5jIChyZWNvdmVyeVB1cnNlLCBzcmNQYXltZW50UCwgcGF5bWVudEFtb3VudEEpID0+IHtcbiAgY29uc3Qgc3JjUGF5bWVudCA9IGF3YWl0IHNyY1BheW1lbnRQO1xuICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy83MTkzIHdoaWNoIGV4cGxhaW5zKi9cbiAgLyogaG93IHdlIHdvdWxkIGxpa2UgdG8gd3JpdGUgdGhlIGZvbGxvd2luZyBsaW5lLCBhbmQgd2h5IHdlIGNhbm5vdCB5ZXQgZG8gc28uKi9cbiAgY29uc3Qgc3JjQW1vdW50ID0gYXdhaXQgRShyZWNvdmVyeVB1cnNlKS5kZXBvc2l0KHNyY1BheW1lbnQpO1xuICBjb25zdCBwYXltZW50QW1vdW50QiA9IEFtb3VudE1hdGguc3VidHJhY3Qoc3JjQW1vdW50LCBwYXltZW50QW1vdW50QSk7XG4gIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgRShyZWNvdmVyeVB1cnNlKS53aXRoZHJhdyhwYXltZW50QW1vdW50QSksXG4gICAgRShyZWNvdmVyeVB1cnNlKS53aXRoZHJhdyhwYXltZW50QW1vdW50QiksXG4gIF0pO1xufTskaM2PX29uY2Uuc3BsaXQoc3BsaXQpO1xuaGFyZGVuKHNwbGl0KTtcblxuLyoqXG4gKiBOb3RlOiBOb3QgZmFpbHVyZSBhdG9taWMuIEJ1dCBhcyBsb25nIGFzIHlvdSBkb24ndCBsb3NlIHRoZSBhcmd1bWVudFxuICogYHJlY292ZXJ5UHVyc2VgLCBubyBhc3NldHMgYXJlIGxvc3QuIElmIHRoZSBhbW91bnQgaW4gYHNyY1BheW1lbnRQYCBpc1xuICogZXhhY3RseSB0aGUgc3VtIG9mIHRoZSBhbW91bnRzLCB0aGUgcGF5bWVudCBtYXkgc3RpbGwgYmUgZGVwb3NpdGVkIGFueXdheSxcbiAqIGJlZm9yZSBmYWlsaW5nIGluIHRoZSBzdWJzZXF1ZW50IGVxdWFsaXR5IGNoZWNrLiBJbiB0aGF0IGNhc2UsIHRob3NlIGFzc2V0c1xuICogd2lsbCBiZSBpbiB0aGUgYXJndW1lbnQgYHJlY292ZXJ5UHVyc2VgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0VSZWY8UHVyc2U8Sz4+fSByZWNvdmVyeVB1cnNlXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHNyY1BheW1lbnRQXG4gKiBAcGFyYW0ge0Ftb3VudDxLPltdfSBhbW91bnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50W10+fVxuICovXG4gICAgICAgY29uc3Qgc3BsaXRNYW55ID0gYXN5bmMgKHJlY292ZXJ5UHVyc2UsIHNyY1BheW1lbnRQLCBhbW91bnRzKSA9PiB7XG4gIGNvbnN0IHNyY1BheW1lbnQgPSBhd2FpdCBzcmNQYXltZW50UDtcbiAgLyogSWYgd2UgY291bGQgY2FsY3VsYXRlIGB0b3RhbGAgYmVmb3JlIHRoZSBgZGVwb3NpdGAsIHRoZW4gd2UqL1xuICAvKiBjb3VsZCB1c2UgdGhlIGB0b3RhbGAgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZGVwb3NpdGAgYW5kIGJlKi9cbiAgLyogZmFpbHVyZSBhdG9taWMuIEJ1dCB0aGlzIHdvdWxkIHJlcXVpcmUgbWFraW5nIGFuIGVtcHR5IGFtb3VudCBmaXJzdCwqL1xuICAvKiB3aGljaCBpcyBwb3NzaWJsZSwgYnV0IHRvbyBtdWNoIHRyb3VibGUgZm9yIGEgZGVwcmVjYXRlZCBsZWdhY3kgc3VwcG9ydCovXG4gIC8qIG1ldGhvZC4qL1xuICBjb25zdCBzcmNBbW91bnQgPSBhd2FpdCBFKHJlY292ZXJ5UHVyc2UpLmRlcG9zaXQoc3JjUGF5bWVudCk7XG4gIGNvbnN0IGJyYW5kID0gc3JjQW1vdW50LmJyYW5kO1xuICBjb25zdCBlbXB0eUFtb3VudCA9IEFtb3VudE1hdGgubWFrZUVtcHR5RnJvbUFtb3VudChzcmNBbW91bnQpO1xuICBjb25zdCB0b3RhbCA9IGFtb3VudHMucmVkdWNlKFxuICAgICh4LCB5KSA9PiBBbW91bnRNYXRoLmFkZCh4LCB5LCBicmFuZCksXG4gICAgZW1wdHlBbW91bnQsXG4gICk7XG4gIEFtb3VudE1hdGguaXNFcXVhbChzcmNBbW91bnQsIHRvdGFsKSB8fFxuICAgIEZhaWxgcmlnaHRzIHdlcmUgbm90IGNvbnNlcnZlZDogJHt0b3RhbH0gdnMgJHtzcmNBbW91bnR9YDtcblxuICByZXR1cm4gUHJvbWlzZS5hbGwoYW1vdW50cy5tYXAoYW1vdW50ID0+IEUocmVjb3ZlcnlQdXJzZSkud2l0aGRyYXcoYW1vdW50KSkpO1xufTskaM2PX29uY2Uuc3BsaXRNYW55KHNwbGl0TWFueSk7XG5oYXJkZW4oc3BsaXRNYW55KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNsYWltIjpbImNsYWltIl0sImNvbWJpbmUiOlsiY29tYmluZSJdLCJzcGxpdCI6WyJzcGxpdCJdLCJzcGxpdE1hbnkiOlsic3BsaXRNYW55Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFTn3CUTBgAAEwYAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBrZXlFUSxtYWtlQ29weUJhZyxtdXN0TWF0Y2gsTSxnZXRDb3B5QmFnRW50cmllcyxiYWdJc1N1cGVyYmFnLGJhZ1VuaW9uLGJhZ0Rpc2pvaW50U3VidHJhY3Q7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5QmFnXCIsWyRozY9fYSA9PiAobWFrZUNvcHlCYWcgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLFskaM2PX2EgPT4gKGJhZ0lzU3VwZXJiYWcgPSAkaM2PX2EpXV0sW1wiYmFnVW5pb25cIixbJGjNj19hID0+IChiYWdVbmlvbiA9ICRozY9fYSldXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsWyRozY9fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01hdGhIZWxwZXJzfSBmcm9tICcuLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge0NvcHlCYWd9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqL1xuXG4vKiogQHR5cGUge0NvcHlCYWd9ICovXG5jb25zdCBlbXB0eSA9IG1ha2VDb3B5QmFnKFtdKTtcblxuLyoqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5QmFnPn0gKi9cbiAgICAgICBjb25zdCBjb3B5QmFnTWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogYmFnID0+IHtcbiAgICBtdXN0TWF0Y2goYmFnLCBNLmJhZygpLCAnYmFnIG9mIGFtb3VudCcpO1xuICAgIHJldHVybiBiYWc7XG4gIH0sXG4gIGRvTWFrZUVtcHR5OiAoKSA9PiBlbXB0eSxcbiAgZG9Jc0VtcHR5OiBiYWcgPT4gZ2V0Q29weUJhZ0VudHJpZXMoYmFnKS5sZW5ndGggPT09IDAsXG4gIGRvSXNHVEU6IGJhZ0lzU3VwZXJiYWcsXG4gIGRvSXNFcXVhbDoga2V5RVEsXG4gIGRvQWRkOiBiYWdVbmlvbixcbiAgZG9TdWJ0cmFjdDogYmFnRGlzam9pbnRTdWJ0cmFjdCxcbn0pOyRozY9fb25jZS5jb3B5QmFnTWF0aEhlbHBlcnMoY29weUJhZ01hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlCYWdNYXRoSGVscGVycyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWh3vSSYGAAAmBgAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGtleUVRLG1ha2VDb3B5U2V0LG11c3RNYXRjaCxNLGdldENvcHlTZXRLZXlzLHNldElzU3VwZXJzZXQsc2V0RGlzam9pbnRVbmlvbixzZXREaXNqb2ludFN1YnRyYWN0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dLFtcInNldElzU3VwZXJzZXRcIixbJGjNj19hID0+IChzZXRJc1N1cGVyc2V0ID0gJGjNj19hKV1dLFtcInNldERpc2pvaW50VW5pb25cIixbJGjNj19hID0+IChzZXREaXNqb2ludFVuaW9uID0gJGjNj19hKV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIixbJGjNj19hID0+IChzZXREaXNqb2ludFN1YnRyYWN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7TWF0aEhlbHBlcnN9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7Q29weVNldH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnXG4gKi9cblxuLyoqIEB0eXBlIHtDb3B5U2V0fSAqL1xuY29uc3QgZW1wdHkgPSBtYWtlQ29weVNldChbXSk7XG5cbi8qKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weVNldD59ICovXG4gICAgICAgY29uc3QgY29weVNldE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IHNldCA9PiB7XG4gICAgbXVzdE1hdGNoKHNldCwgTS5zZXQoKSwgJ3NldCBvZiBhbW91bnQnKTtcbiAgICByZXR1cm4gc2V0O1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogc2V0ID0+IGdldENvcHlTZXRLZXlzKHNldCkubGVuZ3RoID09PSAwLFxuICBkb0lzR1RFOiBzZXRJc1N1cGVyc2V0LFxuICBkb0lzRXF1YWw6IGtleUVRLFxuICBkb0FkZDogc2V0RGlzam9pbnRVbmlvbixcbiAgZG9TdWJ0cmFjdDogc2V0RGlzam9pbnRTdWJ0cmFjdCxcbn0pOyRozY9fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlTZXRNYXRoSGVscGVycyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGfMtfs8GAADPBgAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJuYXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTmF0LGlzTmF0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dLFtcImlzTmF0XCIsWyRozY9fYSA9PiAoaXNOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiogQGltcG9ydCB7TWF0aEhlbHBlcnMsIE5hdFZhbHVlfSBmcm9tICcuLi90eXBlcy5qcycgKi9cblxuY29uc3QgZW1wdHkgPSAwbjtcblxuLyoqXG4gKiBGdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB1c2UgdGhlIG5hdE1hdGhIZWxwZXJzIHRvIG1hbmFnZSBiYWxhbmNlcyAtIHRoZVxuICogb3BlcmF0aW9ucyBhcmUgbWVyZWx5IGFyaXRobWV0aWMgb24gbmF0dXJhbCwgbm9uLW5lZ2F0aXZlIG51bWJlcnMuXG4gKlxuICogTmF0dXJhbCBudW1iZXJzIGFyZSB1c2VkIGZvciBmdW5naWJsZSBlcmlnaHRzIHN1Y2ggYXMgbW9uZXkgYmVjYXVzZSByb3VuZGluZ1xuICogaXNzdWVzIG1ha2UgZmxvYXRzIHByb2JsZW1hdGljLiBBbGwgb3BlcmF0aW9ucyBzaG91bGQgYmUgZG9uZSB3aXRoIHRoZVxuICogc21hbGxlc3Qgd2hvbGUgdW5pdCBzdWNoIHRoYXQgdGhlIGBuYXRNYXRoSGVscGVyc2AgbmV2ZXIgZGVhbHMgd2l0aFxuICogZnJhY3Rpb25hbCBwYXJ0cy5cbiAqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8TmF0VmFsdWU+fVxuICovXG4gICAgICAgY29uc3QgbmF0TWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogbmF0ID0+IHtcbiAgICAvKiBUT0RPOiB0aWdodGVuIHRoZSBkZWZpbml0aW9uIG9mIE5hdCBpbiBAYWdvcmljL25hdCB0byB0aHJvdyBvbiBgbnVtYmVyYCovXG4gICAgYXNzZXJ0LnR5cGVvZihuYXQsICdiaWdpbnQnKTtcbiAgICBpc05hdChuYXQpIHx8IEZhaWxgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmA7XG4gICAgcmV0dXJuIE5hdChuYXQpO1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogbmF0ID0+IG5hdCA9PT0gZW1wdHksXG4gIGRvSXNHVEU6IChsZWZ0LCByaWdodCkgPT4gbGVmdCA+PSByaWdodCxcbiAgZG9Jc0VxdWFsOiAobGVmdCwgcmlnaHQpID0+IGxlZnQgPT09IHJpZ2h0LFxuICAvKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuICBkb0FkZDogKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ICsgcmlnaHQsXG4gIGRvU3VidHJhY3Q6IChsZWZ0LCByaWdodCkgPT4gTmF0KGxlZnQgLSByaWdodCksXG59KTskaM2PX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0TWF0aEhlbHBlcnMiOlsibmF0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPdw1//0HAAD9BwAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbInNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0S2V5LGVsZW1lbnRzSXNTdXBlcnNldCxlbGVtZW50c0Rpc2pvaW50VW5pb24sZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LGNvZXJjZVRvRWxlbWVudHMsZWxlbWVudHNDb21wYXJlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydEtleVwiLFskaM2PX2EgPT4gKGFzc2VydEtleSA9ICRozY9fYSldXSxbXCJlbGVtZW50c0lzU3VwZXJzZXRcIixbJGjNj19hID0+IChlbGVtZW50c0lzU3VwZXJzZXQgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsWyRozY9fYSA9PiAoZWxlbWVudHNEaXNqb2ludFVuaW9uID0gJGjNj19hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLFskaM2PX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXSxbXCJjb2VyY2VUb0VsZW1lbnRzXCIsWyRozY9fYSA9PiAoY29lcmNlVG9FbGVtZW50cyA9ICRozY9fYSldXSxbXCJlbGVtZW50c0NvbXBhcmVcIixbJGjNj19hID0+IChlbGVtZW50c0NvbXBhcmUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtNYXRoSGVscGVycywgU2V0VmFsdWV9IGZyb20gJy4uL3R5cGVzLmpzJyAqL1xuXG4vKiBPcGVyYXRpb25zIGZvciBhcnJheXMgd2l0aCB1bmlxdWUgb2JqZWN0cyBpZGVudGlmeWluZyBhbmQgcHJvdmlkaW5nKi9cbi8qIGluZm9ybWF0aW9uIGFib3V0IGRpZ2l0YWwgYXNzZXRzLiBVc2VkIGZvciBab2UgaW52aXRlcy4qL1xuLyoqIEB0eXBlIHtTZXRWYWx1ZX0gKi9cbmNvbnN0IGVtcHR5ID0gaGFyZGVuKFtdKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlIGFycmF5LWJhc2VkIFNldE1hdGggd2l0aCBDb3B5U2V0LWJhc2VkIENvcHlTZXRNYXRoXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8U2V0VmFsdWU+fVxuICovXG4gICAgICAgY29uc3Qgc2V0TWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogbGlzdCA9PiB7XG4gICAgbGlzdCA9IGNvZXJjZVRvRWxlbWVudHMobGlzdCk7XG4gICAgLyogQXNzZXJ0IHRoYXQgbGlzdCBjb250YWlucyBvbmx5Ki9cbiAgICAvKiAqIHBhc3MtYnktY29weSBwcmltaXRpdmVzLCovXG4gICAgLyogKiBwYXNzLWJ5LWNvcHkgY29udGFpbmVycyBjb250YWluaW5nIGtleXMsKi9cbiAgICAvKiAqIHJlbW90YWJsZXMuKi9cbiAgICBhc3NlcnRLZXkobGlzdCk7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH0sXG4gIGRvTWFrZUVtcHR5OiAoKSA9PiBlbXB0eSxcbiAgZG9Jc0VtcHR5OiBsaXN0ID0+IHBhc3NTdHlsZU9mKGxpc3QpID09PSAnY29weUFycmF5JyAmJiBsaXN0Lmxlbmd0aCA9PT0gMCxcbiAgZG9Jc0dURTogZWxlbWVudHNJc1N1cGVyc2V0LFxuICBkb0lzRXF1YWw6ICh4LCB5KSA9PiBlbGVtZW50c0NvbXBhcmUoeCwgeSkgPT09IDAsXG4gIGRvQWRkOiBlbGVtZW50c0Rpc2pvaW50VW5pb24sXG4gIGRvU3VidHJhY3Q6IGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCxcbn0pOyRozY9fb25jZS5zZXRNYXRoSGVscGVycyhzZXRNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRNYXRoSGVscGVycyI6WyJzZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAycsRKWAUAAFgFAAAjAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbInByZXBhcmVQYXltZW50S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGluaXRFbXB0eTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLFskaM2PX2EgPT4gKGluaXRFbXB0eSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0Fzc2V0S2luZCwgQnJhbmQsIFBheW1lbnR9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL3pvbmUnO1xuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqL1xuXG4vKiBUT0RPIFR5cGUgSW50ZXJmYWNlR3VhcmQgYmV0dGVyIHRoYW4gSW50ZXJmYWNlR3VhcmQ8YW55PiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge1pvbmV9IGlzc3VlclpvbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZDxhbnk+fSBQYXltZW50SVxuICogQHJldHVybnMgeygpID0+IFBheW1lbnQ8SywgYW55Pn1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVQYXltZW50S2luZCA9IChpc3N1ZXJab25lLCBuYW1lLCBicmFuZCwgUGF5bWVudEkpID0+IHtcbiAgY29uc3QgbWFrZVBheW1lbnQgPSBpc3N1ZXJab25lLmV4b0NsYXNzKFxuICAgIGAke25hbWV9IHBheW1lbnRgLFxuICAgIFBheW1lbnRJLFxuICAgIGluaXRFbXB0eSxcbiAgICB7XG4gICAgICBnZXRBbGxlZ2VkQnJhbmQoKSB7XG4gICAgICAgIHJldHVybiBicmFuZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBbdGFnXSBmb3IgdGFnZ2VkIHR5cGUgbm90IGRlZmluZWQgaW4gcnVudGltZSovXG4gIHJldHVybiBtYWtlUGF5bWVudDtcbn07JGjNj19vbmNlLnByZXBhcmVQYXltZW50S2luZChwcmVwYXJlUGF5bWVudEtpbmQpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50S2luZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUGF5bWVudEtpbmQiOlsicHJlcGFyZVBheW1lbnRLaW5kIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANgnSHa+NgAAvjYAACkAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudExlZGdlci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9hbW91bnRNYXRoLmpzIiwiLi9wYXltZW50LmpzIiwiLi9wdXJzZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbInByZXBhcmVQYXltZW50TGVkZ2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLGFubm90YXRlRXJyb3IsWCxpc1Byb21pc2UsbXVzdE1hdGNoLE0sa2V5RVEsQW1vdW50TWF0aCxwcmVwYXJlUGF5bWVudEtpbmQscHJlcGFyZVB1cnNlS2luZCxCcmFuZEksbWFrZUlzc3VlckludGVyZmFjZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCIuL3BheW1lbnQuanNcIiwgW1tcInByZXBhcmVQYXltZW50S2luZFwiLFskaM2PX2EgPT4gKHByZXBhcmVQYXltZW50S2luZCA9ICRozY9fYSldXV1dLFtcIi4vcHVyc2UuanNcIiwgW1tcInByZXBhcmVQdXJzZUtpbmRcIixbJGjNj19hID0+IChwcmVwYXJlUHVyc2VLaW5kID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJCcmFuZElcIixbJGjNj19hID0+IChCcmFuZEkgPSAkaM2PX2EpXV0sW1wibWFrZUlzc3VlckludGVyZmFjZXNcIixbJGjNj19hID0+IChtYWtlSXNzdWVySW50ZXJmYWNlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0tleSwgUGF0dGVybn0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICogQGltcG9ydCB7VHlwZWRQYXR0ZXJufSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge1NodXRkb3duV2l0aEZhaWx1cmV9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JztcbiAqIEBpbXBvcnQge0Ftb3VudFN0b3JlfSBmcm9tICcuL2Ftb3VudFN0b3JlLmpzJztcbiAqIEBpbXBvcnQge0Ftb3VudCwgQXNzZXRLaW5kLCBEaXNwbGF5SW5mbywgUGF5bWVudExlZGdlciwgUGF5bWVudCwgQnJhbmQsIFJlY292ZXJ5U2V0c09wdGlvbiwgUHVyc2UsIElzc3VlciwgTWludH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtXZWFrTWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICogQGltcG9ydCB7U2V0U3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge0t9IGFzc2V0S2luZFxuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqIEByZXR1cm5zIHtUeXBlZFBhdHRlcm48QW1vdW50PEs+Pn1cbiAqL1xuY29uc3QgYW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlID0gKGJyYW5kLCBhc3NldEtpbmQsIGVsZW1lbnRTaGFwZSkgPT4ge1xuICBsZXQgdmFsdWVTaGFwZTtcbiAgc3dpdGNoIChhc3NldEtpbmQpIHtcbiAgICBjYXNlICduYXQnOiB7XG4gICAgICB2YWx1ZVNoYXBlID0gTS5uYXQoKTtcbiAgICAgIGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgRnVuZ2libGUgYXNzZXRzIGNhbm5vdCBoYXZlIGFuIGVsZW1lbnRTaGFwZTogJHtxKGVsZW1lbnRTaGFwZSl9YDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdzZXQnOiB7XG4gICAgICBpZiAoZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYXJyYXlPZihNLmtleSgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLmFycmF5T2YoTS5hbmQoTS5rZXkoKSwgZWxlbWVudFNoYXBlKSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgIGlmIChlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5zZXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLnNldE9mKGVsZW1lbnRTaGFwZSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgIGlmIChlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5iYWcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLmJhZ09mKGVsZW1lbnRTaGFwZSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgRmFpbGB1bmV4cGVjdGVkIGFzc2V0IGtpbmQgJHtxKGFzc2V0S2luZCl9YDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhbW91bnRTaGFwZSA9IGhhcmRlbih7XG4gICAgYnJhbmQsIC8qIG1hdGNoZXMgb25seSB0aGlzIGV4YWN0IGJyYW5kKi9cbiAgICB2YWx1ZTogdmFsdWVTaGFwZSxcbiAgfSk7XG4gIHJldHVybiBhbW91bnRTaGFwZTtcbn07XG5cbi8qKlxuICogTWFrZSB0aGUgcGF5bWVudExlZGdlciwgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGJhbGFuY2VzIG9mIHBheW1lbnRzLiBBbGxcbiAqIG1pbnRpbmcgYW5kIHRyYW5zZmVyIGF1dGhvcml0eSBvcmlnaW5hdGVzIGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7Wm9uZX0gaXNzdWVyWm9uZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge0Rpc3BsYXlJbmZvPEs+fSBkaXNwbGF5SW5mb1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqIEBwYXJhbSB7UmVjb3ZlcnlTZXRzT3B0aW9ufSByZWNvdmVyeVNldHNTdGF0ZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV1cbiAqIEByZXR1cm5zIHtQYXltZW50TGVkZ2VyPEs+fVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVBheW1lbnRMZWRnZXIgPSAoXG4gIGlzc3VlclpvbmUsXG4gIG5hbWUsXG4gIGFzc2V0S2luZCxcbiAgZGlzcGxheUluZm8sXG4gIGVsZW1lbnRTaGFwZSxcbiAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtCcmFuZDxLPn0gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggY2FsbFdoZW4qL1xuICBjb25zdCBicmFuZCA9IGlzc3VlclpvbmUuZXhvKGAke25hbWV9IGJyYW5kYCwgQnJhbmRJLCB7XG4gICAgaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKSB7XG4gICAgICAvKiBCcmFuZEkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYGFsbGVnZWRJc3N1ZXJgIGlzIGEgUmVtb3RhYmxlKi9cbiAgICAgIHJldHVybiBhbGxlZ2VkSXNzdWVyID09PSBpc3N1ZXI7XG4gICAgfSxcbiAgICBnZXRBbGxlZ2VkTmFtZSgpIHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH0sXG4gICAgLyogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LiovXG4gICAgZ2V0RGlzcGxheUluZm8oKSB7XG4gICAgICByZXR1cm4gZGlzcGxheUluZm87XG4gICAgfSxcbiAgICBnZXRBbW91bnRTaGFwZSgpIHtcbiAgICAgIHJldHVybiBhbW91bnRTaGFwZTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBhbW91bnRTaGFwZSA9IGFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZShcbiAgICBicmFuZCxcbiAgICBhc3NldEtpbmQsXG4gICAgZWxlbWVudFNoYXBlLFxuICApO1xuXG4gIGNvbnN0IHsgSXNzdWVySSwgTWludEksIFBheW1lbnRJLCBQdXJzZUlLaXQgfSA9IG1ha2VJc3N1ZXJJbnRlcmZhY2VzKFxuICAgIGJyYW5kLFxuICAgIGFzc2V0S2luZCxcbiAgICBhbW91bnRTaGFwZSxcbiAgKTtcblxuICBjb25zdCBtYWtlUGF5bWVudCA9IHByZXBhcmVQYXltZW50S2luZChpc3N1ZXJab25lLCBuYW1lLCBicmFuZCwgUGF5bWVudEkpO1xuXG4gIC8qKiBAdHlwZSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gKi9cbiAgY29uc3Qgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZSA9IHJlYXNvbiA9PiB7XG4gICAgLyogVE9ETyBUaGlzIHNob3VsZCBhbHNvIGRlc3Ryb3kgbGVkZ2VyIHN0YXRlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNCovXG4gICAgaWYgKG9wdFNodXRkb3duV2l0aEZhaWx1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pO1xuICAgICAgfSBjYXRjaCAoZXJySW5TaHV0ZG93bikge1xuICAgICAgICBhbm5vdGF0ZUVycm9yKGVyckluU2h1dGRvd24sIFhgQ2F1c2VkIGJ5OiAke3JlYXNvbn1gKTtcbiAgICAgICAgdGhyb3cgZXJySW5TaHV0ZG93bjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgcmVhc29uO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcFN0b3JlPFBheW1lbnQsIEFtb3VudD59ICovXG4gIGNvbnN0IHBheW1lbnRMZWRnZXIgPSBpc3N1ZXJab25lLndlYWtNYXBTdG9yZSgncGF5bWVudExlZGdlcicsIHtcbiAgICB2YWx1ZVNoYXBlOiBhbW91bnRTaGFwZSxcbiAgfSk7XG5cbiAgLyoqXG4gKiBBIChub24tZW1wdHkpIHdpdGhkcmF3biBsaXZlIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNvdmVyeSBzZXQgb2ZcbiAqIHRoZSBwdXJzZSBpdCB3YXMgd2l0aGRyYXduIGZyb20uIExldCdzIGNhbGwgdGhlc2UgXCJyZWNvdmVyYWJsZVwiIHBheW1lbnRzLlxuICogQWxsIHJlY292ZXJhYmxlIHBheW1lbnRzIGFyZSBsaXZlLCBidXQgbm90IGFsbCBsaXZlIHBheW1lbnRzIGFyZVxuICogcmVjb3ZlcmFibGUuIFdlIGRvIHRoZSBib29ra2VlcGluZyBmb3IgcGF5bWVudCByZWNvdmVyeSB3aXRoIHRoaXMgd2Vha21hcFxuICogZnJvbSByZWNvdmVyYWJsZSBwYXltZW50cyB0byB0aGUgcmVjb3Zlcnkgc2V0IHRoZXkgYXJlIGluLiBBIGJ1bmNoIG9mXG4gKiBpbnRlcmVzdGluZyBpbnZhcmlhbnRzIGhlcmU6XG4gKlxuICogLSBFdmVyeSBwYXltZW50IHRoYXQgaXMgYSBrZXkgaW4gdGhlIG91dGVyIGBwYXltZW50UmVjb3ZlcnlTZXRzYCB3ZWFrTWFwIGlzXG4gKiAgIGFsc28gaW4gdGhlIHJlY292ZXJ5IHNldCBpbmRleGVkIGJ5IHRoYXQgcGF5bWVudC5cbiAqIC0gSW1wbGllZCBieSB0aGUgYWJvdmUgYnV0IHdvcnRoIHN0YXRpbmc6IHRoZSBwYXltZW50IGlzIG9ubHkgaW4gYXQgbW9zdCBvbmVcbiAqICAgcmVjb3Zlcnkgc2V0LlxuICogLSBBIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHN1Y2ggcGF5bWVudHMuXG4gKiAtIEV2ZXJ5IHB1cnNlIGlzIGFzc29jaWF0ZWQgd2l0aCBleGFjdGx5IG9uZSByZWNvdmVyeSBzZXQgdW5pcXVlIHRvIGl0LlxuICogLSBBIHB1cnNlJ3MgcmVjb3Zlcnkgc2V0IG9ubHkgY29udGFpbnMgcGF5bWVudHMgd2l0aGRyYXduIGZyb20gdGhhdCBwdXJzZSBhbmRcbiAqICAgbm90IHlldCBjb25zdW1lZC5cbiAqXG4gKiBJZiBgcmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cydgLCB0aGVuIG5vdGhpbmcgc2hvdWxkIGV2ZXIgYmVcbiAqIGFkZGVkIHRvIHRoaXMgV2Vha1N0b3JlLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fVxuICovXG4gIGNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHMgPSBpc3N1ZXJab25lLndlYWtNYXBTdG9yZSgncGF5bWVudFJlY292ZXJ5U2V0cycpO1xuXG4gIC8qKlxuICogVG8gbWFpbnRhaW4gdGhlIGludmFyaWFudHMgbGlzdGVkIGluIHRoZSBgcGF5bWVudFJlY292ZXJ5U2V0c2AgY29tbWVudCxcbiAqIGBpbml0UGF5bWVudGAgc2hvdWxkIGNvbnRhaW4gdGhlIG9ubHkgY2FsbCB0byBgcGF5bWVudExlZGdlci5pbml0YC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IFtvcHRSZWNvdmVyeVNldF1cbiAqL1xuICBjb25zdCBpbml0UGF5bWVudCA9IChwYXltZW50LCBhbW91bnQsIG9wdFJlY292ZXJ5U2V0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnKSB7XG4gICAgICBvcHRSZWNvdmVyeVNldCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgd2hlbiByZWNvdmVyU2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnLCBvcHRSZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcbiAgICB9XG4gICAgaWYgKG9wdFJlY292ZXJ5U2V0ICE9PSB1bmRlZmluZWQgJiYgIUFtb3VudE1hdGguaXNFbXB0eShhbW91bnQpKSB7XG4gICAgICBvcHRSZWNvdmVyeVNldC5hZGQocGF5bWVudCk7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzLmluaXQocGF5bWVudCwgb3B0UmVjb3ZlcnlTZXQpO1xuICAgIH1cbiAgICBwYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCwgYW1vdW50KTtcbiAgfTtcblxuICAvKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgZGVsZXRlUGF5bWVudGAgc2hvdWxkIGNvbnRhaW4gdGhlIG9ubHkgY2FsbCB0byBgcGF5bWVudExlZGdlci5kZWxldGVgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICovXG4gIGNvbnN0IGRlbGV0ZVBheW1lbnQgPSBwYXltZW50ID0+IHtcbiAgICBwYXltZW50TGVkZ2VyLmRlbGV0ZShwYXltZW50KTtcbiAgICBpZiAocGF5bWVudFJlY292ZXJ5U2V0cy5oYXMocGF5bWVudCkpIHtcbiAgICAgIGNvbnN0IHJlY292ZXJ5U2V0ID0gcGF5bWVudFJlY292ZXJ5U2V0cy5nZXQocGF5bWVudCk7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzLmRlbGV0ZShwYXltZW50KTtcbiAgICAgIHJlY292ZXJ5U2V0LmRlbGV0ZShwYXltZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsoYWxsZWdlZEFtb3VudDogQW1vdW50KSA9PiBBbW91bnR9ICovXG4gIGNvbnN0IGNvZXJjZSA9IGFsbGVnZWRBbW91bnQgPT4gQW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsIGFsbGVnZWRBbW91bnQpO1xuICAvKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IGJvb2xlYW59ICovXG5cbiAgLyoqXG4gKiBNZXRob2RzIGxpa2UgZGVwb3NpdCgpIGhhdmUgYW4gb3B0aW9uYWwgc2Vjb25kIHBhcmFtZXRlciBgb3B0QW1vdW50U2hhcGVgXG4gKiB3aGljaCwgaWYgcHJlc2VudCwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggdGhlIGJhbGFuY2Ugb2YgdGhlIHBheW1lbnQuIFRoaXNcbiAqIGhlbHBlciBmdW5jdGlvbiBkb2VzIHRoYXQgY2hlY2suXG4gKlxuICogTm90ZTogYG9wdEFtb3VudFNoYXBlYCBpcyB1c2VyLXN1cHBsaWVkIHdpdGggbm8gcHJldmlvdXMgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gcGF5bWVudEJhbGFuY2VcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgY29uc3QgYXNzZXJ0QW1vdW50Q29uc2lzdGVudCA9IChwYXltZW50QmFsYW5jZSwgb3B0QW1vdW50U2hhcGUpID0+IHtcbiAgICBpZiAob3B0QW1vdW50U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSwgJ2Ftb3VudCcpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgY29uc3QgYXNzZXJ0TGl2ZVBheW1lbnQgPSBwYXltZW50ID0+IHtcbiAgICBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KSB8fFxuICAgICAgRmFpbGAke3BheW1lbnR9IHdhcyBub3QgYSBsaXZlIHBheW1lbnQgZm9yIGJyYW5kICR7cShcbiAgICAgICAgYnJhbmQsXG4gICAgICApfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiAgfTtcblxuICAvKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLmRlcG9zaXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFN0b3JlfSBiYWxhbmNlU3RvcmVcbiAqIEBwYXJhbSB7UGF5bWVudH0gc3JjUGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG4gIGNvbnN0IGRlcG9zaXRJbnRlcm5hbCA9IChcbiAgICBiYWxhbmNlU3RvcmUsXG4gICAgc3JjUGF5bWVudCxcbiAgICBvcHRBbW91bnRTaGFwZSA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgIWlzUHJvbWlzZShzcmNQYXltZW50KSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgIGBkZXBvc2l0IGRvZXMgbm90IGFjY2VwdCBwcm9taXNlcyBhcyBmaXJzdCBhcmd1bWVudC4gSW5zdGVhZCBvZiBwYXNzaW5nIHRoZSBwcm9taXNlIChkZXBvc2l0KHBheW1lbnRQcm9taXNlKSksIGNvbnNpZGVyIHVud3JhcHBpbmcgdGhlIHByb21pc2UgZmlyc3Q6IEUud2hlbihwYXltZW50UHJvbWlzZSwgKGFjdHVhbFBheW1lbnQgPT4gZGVwb3NpdChhY3R1YWxQYXltZW50KSlgLFxuICAgICAgICBUeXBlRXJyb3IsXG4gICAgICApO1xuICAgIGFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuICAgIGNvbnN0IHNyY1BheW1lbnRCYWxhbmNlID0gcGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG4gICAgYXNzZXJ0QW1vdW50Q29uc2lzdGVudChzcmNQYXltZW50QmFsYW5jZSwgb3B0QW1vdW50U2hhcGUpO1xuICAgIHRyeSB7XG4gICAgICAvKiBDT01NSVQgUE9JTlQqL1xuICAgICAgLyogTW92ZSB0aGUgYXNzZXRzIGluIGBzcmNQYXltZW50YCBpbnRvIHRoaXMgcHVyc2UsIHVzaW5nIHVwIHRoZSovXG4gICAgICAvKiBzb3VyY2UgcGF5bWVudCwgc3VjaCB0aGF0IHRvdGFsIGFzc2V0cyBhcmUgY29uc2VydmVkLiovXG4gICAgICBkZWxldGVQYXltZW50KHNyY1BheW1lbnQpO1xuICAgICAgYmFsYW5jZVN0b3JlLmluY3JlbWVudChzcmNQYXltZW50QmFsYW5jZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBzcmNQYXltZW50QmFsYW5jZTtcbiAgfTtcblxuICAvKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLndpdGhkcmF3XG4gKlxuICogQHBhcmFtIHtBbW91bnRTdG9yZX0gYmFsYW5jZVN0b3JlXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50IC0gdGhlIGFtb3VudCB0byBiZSB3aXRoZHJhd25cbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IFtyZWNvdmVyeVNldF1cbiAqIEByZXR1cm5zIHtQYXltZW50fVxuICovXG4gIGNvbnN0IHdpdGhkcmF3SW50ZXJuYWwgPSAoYmFsYW5jZVN0b3JlLCBhbW91bnQsIHJlY292ZXJ5U2V0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgYW1vdW50ID0gY29lcmNlKGFtb3VudCk7XG4gICAgY29uc3QgcGF5bWVudCA9IG1ha2VQYXltZW50KCk7XG4gICAgLyogQ09NTUlUIFBPSU5UIE1vdmUgdGhlIHdpdGhkcmF3biBhc3NldHMgZnJvbSB0aGlzIHB1cnNlIGludG8qL1xuICAgIC8qIHBheW1lbnQuIFRvdGFsIGFzc2V0cyBtdXN0IHJlbWFpbiBjb25zZXJ2ZWQuKi9cbiAgICBiYWxhbmNlU3RvcmUuZGVjcmVtZW50KGFtb3VudCkgfHxcbiAgICAgIEZhaWxgV2l0aGRyYXdhbCBvZiAke2Ftb3VudH0gZmFpbGVkIGJlY2F1c2UgdGhlIHB1cnNlIG9ubHkgY29udGFpbmVkICR7YmFsYW5jZVN0b3JlLmdldEFtb3VudCgpfWA7XG4gICAgdHJ5IHtcbiAgICAgIGluaXRQYXltZW50KHBheW1lbnQsIGFtb3VudCwgcmVjb3ZlcnlTZXQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bWVudDtcbiAgfTtcblxuICAvKiogQHR5cGUgeygpID0+IFB1cnNlPEs+fSAqL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBhbW91bnQga2luZHMqL1xuICBjb25zdCBtYWtlRW1wdHlQdXJzZSA9IHByZXBhcmVQdXJzZUtpbmQoXG4gICAgaXNzdWVyWm9uZSxcbiAgICBuYW1lLFxuICAgIGFzc2V0S2luZCxcbiAgICBicmFuZCxcbiAgICBQdXJzZUlLaXQsXG4gICAgaGFyZGVuKHtcbiAgICAgIGRlcG9zaXRJbnRlcm5hbCxcbiAgICAgIHdpdGhkcmF3SW50ZXJuYWwsXG4gICAgfSksXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgcGF5bWVudFJlY292ZXJ5U2V0cyxcbiAgKTtcblxuICAvKiogQHR5cGUge0lzc3VlcjxLPn0gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggY2FsbFdoZW4qL1xuICBjb25zdCBpc3N1ZXIgPSBpc3N1ZXJab25lLmV4byhgJHtuYW1lfSBpc3N1ZXJgLCBJc3N1ZXJJLCB7XG4gICAgZ2V0QnJhbmQoKSB7XG4gICAgICByZXR1cm4gYnJhbmQ7XG4gICAgfSxcbiAgICBnZXRBbGxlZ2VkTmFtZSgpIHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH0sXG4gICAgZ2V0QXNzZXRLaW5kKCkge1xuICAgICAgcmV0dXJuIGFzc2V0S2luZDtcbiAgICB9LFxuICAgIGdldERpc3BsYXlJbmZvKCkge1xuICAgICAgcmV0dXJuIGRpc3BsYXlJbmZvO1xuICAgIH0sXG4gICAgbWFrZUVtcHR5UHVyc2UoKSB7XG4gICAgICByZXR1cm4gbWFrZUVtcHR5UHVyc2UoKTtcbiAgICB9LFxuICAgIC8qKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlbiAqL1xuICAgIGlzTGl2ZShwYXltZW50KSB7XG4gICAgICAvKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG4gICAgICByZXR1cm4gcGF5bWVudExlZGdlci5oYXMocGF5bWVudCk7XG4gICAgfSxcbiAgICAvKiogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW4gKi9cbiAgICBnZXRBbW91bnRPZihwYXltZW50KSB7XG4gICAgICAvKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG4gICAgICBhc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbiAgICAgIHJldHVybiBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gb3B0QW1vdW50U2hhcGVcbiAqL1xuICAgIGJ1cm4ocGF5bWVudCwgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbiAgICAgIGFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xuICAgICAgY29uc3QgcGF5bWVudEJhbGFuY2UgPSBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiAgICAgIGFzc2VydEFtb3VudENvbnNpc3RlbnQocGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8qIENPTU1JVCBQT0lOVC4qL1xuICAgICAgICBkZWxldGVQYXltZW50KHBheW1lbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBheW1lbnRCYWxhbmNlO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKlxuICogUHJvdmlkZXMgZm9yIHRoZSByZWNvdmVyeSBvZiBuZXdseSBtaW50ZWQgYnV0IG5vdC15ZXQtZGVwb3NpdGVkIHBheW1lbnRzLlxuICpcbiAqIEJlY2F1c2UgdGhlIGBtaW50UmVjb3ZlcnlQdXJzZWAgaXMgcGxhY2VkIGluIGJhZ2dhZ2UsIGV2ZW4gaWYgdGhlIGNhbGxlciBvZlxuICogYG1ha2VJc3N1ZXJLaXRgIGRyb3BzIGl0IG9uIHRoZSBmbG9vciwgaXQgY2FuIHN0aWxsIGJlIHJlY292ZXJlZCBpbiBhblxuICogZW1lcmdlbmN5IHVwZ3JhZGUuXG4gKi9cbiAgY29uc3QgbWludFJlY292ZXJ5UHVyc2UgPSAvKiogQHR5cGUge1B1cnNlPEs+fSAqLyAoXG4gICAgaXNzdWVyWm9uZS5tYWtlT25jZSgnbWludFJlY292ZXJ5UHVyc2UnLCAoKSA9PiBtYWtlRW1wdHlQdXJzZSgpKVxuICApO1xuXG4gIC8qKiBAdHlwZSB7TWludDxLPn0gKi9cbiAgY29uc3QgbWludCA9IGlzc3VlclpvbmUuZXhvKGAke25hbWV9IG1pbnRgLCBNaW50SSwge1xuICAgIGdldElzc3VlcigpIHtcbiAgICAgIHJldHVybiBpc3N1ZXI7XG4gICAgfSxcbiAgICBtaW50UGF5bWVudChuZXdBbW91bnQpIHtcbiAgICAgIG5ld0Ftb3VudCA9IGNvZXJjZShuZXdBbW91bnQpO1xuICAgICAgbXVzdE1hdGNoKG5ld0Ftb3VudCwgYW1vdW50U2hhcGUsICdtaW50ZWQgYW1vdW50Jyk7XG4gICAgICAvKiBgcmF3UGF5bWVudGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgcmVjb3Zlcnkgc2V0LCBhbmQqL1xuICAgICAgLyogc28gbXVzdCBub3QgZXNjYXBlLiovXG4gICAgICBjb25zdCByYXdQYXltZW50ID0gbWFrZVBheW1lbnQoKTtcbiAgICAgIGluaXRQYXltZW50KHJhd1BheW1lbnQsIG5ld0Ftb3VudCwgdW5kZWZpbmVkKTtcblxuICAgICAgY29uc3QgbWludFJlY292ZXJ5UHVyc2VCZWZvcmUgPSBtaW50UmVjb3ZlcnlQdXJzZS5nZXRDdXJyZW50QW1vdW50KCk7XG4gICAgICBtaW50UmVjb3ZlcnlQdXJzZS5kZXBvc2l0KHJhd1BheW1lbnQsIG5ld0Ftb3VudCk7XG4gICAgICBjb25zdCBwYXltZW50ID0gbWludFJlY292ZXJ5UHVyc2Uud2l0aGRyYXcobmV3QW1vdW50KTtcbiAgICAgIGNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlQWZ0ZXIgPSBtaW50UmVjb3ZlcnlQdXJzZS5nZXRDdXJyZW50QW1vdW50KCk7XG4gICAgICBhc3NlcnQoa2V5RVEobWludFJlY292ZXJ5UHVyc2VCZWZvcmUsIG1pbnRSZWNvdmVyeVB1cnNlQWZ0ZXIpKTtcbiAgICAgIHJldHVybiBwYXltZW50O1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGlzc3VlcktpdCA9IGhhcmRlbih7IGlzc3VlciwgbWludCwgYnJhbmQsIG1pbnRSZWNvdmVyeVB1cnNlIH0pO1xuICByZXR1cm4gaXNzdWVyS2l0O1xufTskaM2PX29uY2UucHJlcGFyZVBheW1lbnRMZWRnZXIocHJlcGFyZVBheW1lbnRMZWRnZXIpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50TGVkZ2VyIjpbInByZXBhcmVQYXltZW50TGVkZ2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD4gnomXHAAAlxwAACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcHVyc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIi4vYW1vdW50TWF0aC5qcyIsIi4vdHJhbnNpZW50Tm90aWZpZXIuanMiLCIuL2Ftb3VudFN0b3JlLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVB1cnNlS2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTSxtYWtlQ29weVNldCxBbW91bnRNYXRoLG1ha2VUcmFuc2llbnROb3RpZmllcktpdCxtYWtlQW1vdW50U3RvcmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlTZXRcIixbJGjNj19hID0+IChtYWtlQ29weVNldCA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzXCIsIFtbXCJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXRcIixbJGjNj19hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudFN0b3JlLmpzXCIsIFtbXCJtYWtlQW1vdW50U3RvcmVcIixbJGjNj19hID0+IChtYWtlQW1vdW50U3RvcmUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7QXNzZXRLaW5kLCBSZWNvdmVyeVNldHNPcHRpb24sIEJyYW5kLCBQYXltZW50fSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy96b25lJztcbiAqIEBpbXBvcnQge0ludGVyZmFjZUd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtXZWFrTWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICogQGltcG9ydCB7U2V0U3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICovXG5cbmNvbnN0IEVNUFRZX0NPUFlfU0VUID0gbWFrZUNvcHlTZXQoW10pO1xuXG4vKiBUT0RPIFR5cGUgSW50ZXJmYWNlR3VhcmQgYmV0dGVyIHRoYW4gSW50ZXJmYWNlR3VhcmQ8YW55PiovXG4vKipcbiAqIEBwYXJhbSB7Wm9uZX0gaXNzdWVyWm9uZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge3tcbiAqICAgcHVyc2U6IEludGVyZmFjZUd1YXJkPGFueT47XG4gKiAgIGRlcG9zaXRGYWNldDogSW50ZXJmYWNlR3VhcmQ8YW55PjtcbiAqIH19IFB1cnNlSUtpdFxuICogQHBhcmFtIHt7XG4gKiAgIGRlcG9zaXRJbnRlcm5hbDogYW55O1xuICogICB3aXRoZHJhd0ludGVybmFsOiBhbnk7XG4gKiB9fSBwdXJzZU1ldGhvZHNcbiAqIEBwYXJhbSB7UmVjb3ZlcnlTZXRzT3B0aW9ufSByZWNvdmVyeVNldHNTdGF0ZVxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fSBwYXltZW50UmVjb3ZlcnlTZXRzXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUHVyc2VLaW5kID0gKFxuICBpc3N1ZXJab25lLFxuICBuYW1lLFxuICBhc3NldEtpbmQsXG4gIGJyYW5kLFxuICBQdXJzZUlLaXQsXG4gIHB1cnNlTWV0aG9kcyxcbiAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gIHBheW1lbnRSZWNvdmVyeVNldHMsXG4pID0+IHtcbiAgY29uc3QgYW1vdW50U2hhcGUgPSBicmFuZC5nZXRBbW91bnRTaGFwZSgpO1xuXG4gIC8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuICAvKiBicm9rZW4gYWNyb3NzIGFuIHVwZ3JhZGUuKi9cbiAgLyogVE9ETyBwcm9wYWdhdGUgem9uaWZ5aW5nIHRvIG5vdGlmaWVycywgbWF5YmU/Ki9cbiAgY29uc3QgeyBwcm92aWRlTm90aWZpZXIsIHVwZGF0ZTogdXBkYXRlQmFsYW5jZSB9ID0gbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KCk7XG5cbiAgLyoqXG4gKiBJZiBgcmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdoYXNSZWNvdmVyeVNldHMnYCAodGhlIG5vcm1hbCBzdGF0ZSksIHRoZW4ganVzdFxuICogcmV0dXJuIGBzdGF0ZS5yZWNvdmVyeVNldGAuXG4gKlxuICogSWYgYHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnYCwgcmV0dXJuIGB1bmRlZmluZWRgLiBDYWxsZXJzXG4gKiBtdXN0IGJlIGF3YXJlIHRoYXQgdGhlIGB1bmRlZmluZWRgIHJldHVybiBoYXBwZW5zIGlmZiBgcmVjb3ZlcnlTZXRzU3RhdGVcbiAqID09PSAnbm9SZWNvdmVyeVNldHMnYCwgYW5kIHRvIGF2b2lkIHN0b3Jpbmcgb3IgcmV0cmlldmluZyBhbnl0aGluZyBmcm9tIHRoZVxuICogYWN0dWFsIHJlY292ZXJ5IHNldC5cbiAqXG4gKiBAcGFyYW0ge3sgcmVjb3ZlcnlTZXQ6IFNldFN0b3JlPFBheW1lbnQ+IH19IHN0YXRlXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8UGF5bWVudD4gfCB1bmRlZmluZWR9XG4gKi9cbiAgY29uc3QgbWF5YmVSZWNvdmVyeVNldCA9IHN0YXRlID0+IHtcbiAgICBjb25zdCB7IHJlY292ZXJ5U2V0IH0gPSBzdGF0ZTtcbiAgICBpZiAocmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdoYXNSZWNvdmVyeVNldHMnKSB7XG4gICAgICByZXR1cm4gcmVjb3ZlcnlTZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnIHx8XG4gICAgICAgIEZhaWxgcmVjb3ZlclNldHNTdGF0ZSBtdXN0IGJlIG5vUmVjb3ZlcnlTZXRzIGlmIGl0IGlzbid0IGhhc1JlY292ZXJTZXRzYDtcbiAgICAgIHBheW1lbnRSZWNvdmVyeVNldHMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYHBheW1lbnRSZWNvdmVyeVNldHMgbXVzdCBhbHdheXMgYmUgZGVmaW5lZGA7XG4gICAgICByZWNvdmVyeVNldC5nZXRTaXplKCkgPT09IDAgfHxcbiAgICAgICAgRmFpbGBXaXRoIG5vUmVjb3ZlcnlTZXRzLCByZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgLyogLSBUaGlzIGtpbmQgaXMgYSBwYWlyIG9mIHB1cnNlIGFuZCBkZXBvc2l0RmFjZXQgdGhhdCBoYXZlIGEgMToxKi9cbiAgLyogY29ycmVzcG9uZGVuY2UuKi9cbiAgLyogLSBUaGV5IGFyZSB2aXJ0dWFsaXplZCB0b2dldGhlciB0byBzaGFyZSBhIHNpbmdsZSBzdGF0ZSByZWNvcmQuKi9cbiAgLyogLSBBbiBhbHRlcm5hdGl2ZSBkZXNpZ24gY29uc2lkZXJlZCB3YXMgdG8gaGF2ZSB0aGlzIHJldHVybiBhIFB1cnNlIGFsb25lKi9cbiAgLyogdGhhdCBjcmVhdGVkIGRlcG9zaXRGYWNldCBhcyBuZWVkZWQuIEJ1dCB0aGlzIGFwcHJvYWNoIGVuc3VyZXMgYSBjb25zdGFudCovXG4gIC8qIGlkZW50aXR5IGZvciB0aGUgZmFjZXQgYW5kIGV4ZXJjaXNlcyB0aGUgbXVsdGktZmFjZXRlZCBvYmplY3Qgc3R5bGUuKi9cbiAgY29uc3QgeyBkZXBvc2l0SW50ZXJuYWwsIHdpdGhkcmF3SW50ZXJuYWwgfSA9IHB1cnNlTWV0aG9kcztcbiAgY29uc3QgbWFrZVB1cnNlS2l0ID0gaXNzdWVyWm9uZS5leG9DbGFzc0tpdChcbiAgICBgJHtuYW1lfSBQdXJzZWAsXG4gICAgUHVyc2VJS2l0LFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRCYWxhbmNlID0gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG5cbiAgICAgIC8qKiBAdHlwZSB7U2V0U3RvcmU8UGF5bWVudD59ICovXG4gICAgICBjb25zdCByZWNvdmVyeVNldCA9IGlzc3VlclpvbmUuZGV0YWNoZWQoKS5zZXRTdG9yZSgncmVjb3Zlcnkgc2V0Jyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbnRCYWxhbmNlLFxuICAgICAgICByZWNvdmVyeVNldCxcbiAgICAgIH07XG4gICAgfSxcbiAgICB7XG4gICAgICBwdXJzZToge1xuICAgICAgICBkZXBvc2l0KHNyY1BheW1lbnQsIG9wdEFtb3VudFNoYXBlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbiAgICAgICAgICAvKiBTZWUgdGhlIGNvbW1lbnRzIG9uIFB1cnNlSS5kZXBvc2l0IGluIHR5cGVHdWFyZHMuanMqL1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdXJzZSB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgY29uc3QgYmFsYW5jZVN0b3JlID0gbWFrZUFtb3VudFN0b3JlKHN0YXRlLCAnY3VycmVudEJhbGFuY2UnKTtcbiAgICAgICAgICAvKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gZGVwb3NpdC4qL1xuICAgICAgICAgIGNvbnN0IHNyY1BheW1lbnRCYWxhbmNlID0gZGVwb3NpdEludGVybmFsKFxuICAgICAgICAgICAgYmFsYW5jZVN0b3JlLFxuICAgICAgICAgICAgc3JjUGF5bWVudCxcbiAgICAgICAgICAgIG9wdEFtb3VudFNoYXBlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQmFsYW5jZShwdXJzZSwgYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpKTtcbiAgICAgICAgICByZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIHdpdGhkcmF3KGFtb3VudCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdXJzZSB9ID0gdGhpcy5mYWNldHM7XG5cbiAgICAgICAgICBjb25zdCBvcHRSZWNvdmVyeVNldCA9IG1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2VTdG9yZSA9IG1ha2VBbW91bnRTdG9yZShzdGF0ZSwgJ2N1cnJlbnRCYWxhbmNlJyk7XG4gICAgICAgICAgLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIHdpdGhkcmF3LiovXG4gICAgICAgICAgY29uc3QgcGF5bWVudCA9IHdpdGhkcmF3SW50ZXJuYWwoXG4gICAgICAgICAgICBiYWxhbmNlU3RvcmUsXG4gICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICBvcHRSZWNvdmVyeVNldCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZUJhbGFuY2UocHVyc2UsIGJhbGFuY2VTdG9yZS5nZXRBbW91bnQoKSk7XG4gICAgICAgICAgcmV0dXJuIHBheW1lbnQ7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEN1cnJlbnRBbW91bnQoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBiYWxhbmNlU3RvcmUgPSBtYWtlQW1vdW50U3RvcmUoc3RhdGUsICdjdXJyZW50QmFsYW5jZScpO1xuICAgICAgICAgIHJldHVybiBiYWxhbmNlU3RvcmUuZ2V0QW1vdW50KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEN1cnJlbnRBbW91bnROb3RpZmllcigpIHtcbiAgICAgICAgICByZXR1cm4gcHJvdmlkZU5vdGlmaWVyKHRoaXMuZmFjZXRzLnB1cnNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0QWxsZWdlZEJyYW5kKCkge1xuICAgICAgICAgIHJldHVybiBicmFuZDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXREZXBvc2l0RmFjZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLmRlcG9zaXRGYWNldDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRSZWNvdmVyeVNldCgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IG9wdFJlY292ZXJ5U2V0ID0gbWF5YmVSZWNvdmVyeVNldChzdGF0ZSk7XG4gICAgICAgICAgaWYgKG9wdFJlY292ZXJ5U2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWV9DT1BZX1NFVDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9wdFJlY292ZXJ5U2V0LnNuYXBzaG90KCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlY292ZXJBbGwoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuICAgICAgICAgIGxldCBhbW91bnQgPSBBbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCwgYXNzZXRLaW5kKTtcbiAgICAgICAgICBjb25zdCBvcHRSZWNvdmVyeVNldCA9IG1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuICAgICAgICAgIGlmIChvcHRSZWNvdmVyeVNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYW1vdW50OyAvKiBlbXB0eSBhdCB0aGlzIHRpbWUqL1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHBheW1lbnQgb2Ygb3B0UmVjb3ZlcnlTZXQua2V5cygpKSB7XG4gICAgICAgICAgICAvKiBUaGlzIGRvZXMgY2F1c2UgZGVsZXRpb25zIGZyb20gdGhlIHNldCB3aGlsZSBpdGVyYXRpbmcsKi9cbiAgICAgICAgICAgIC8qIGJ1dCB0aGlzIHNwZWNpYWwgY2FzZSBpcyBhbGxvd2VkLiovXG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGZhY2V0cy5wdXJzZS5kZXBvc2l0KHBheW1lbnQpO1xuICAgICAgICAgICAgYW1vdW50ID0gQW1vdW50TWF0aC5hZGQoYW1vdW50LCBkZWx0YSwgYnJhbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcHRSZWNvdmVyeVNldC5nZXRTaXplKCkgPT09IDAgfHxcbiAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IFJlbWFpbmluZyB1bnJlY292ZXJlZCBwYXltZW50czogJHtmYWNldHMucHVyc2UuZ2V0UmVjb3ZlcnlTZXQoKX1gO1xuICAgICAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGVwb3NpdEZhY2V0OiB7XG4gICAgICAgIHJlY2VpdmUoLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5wdXJzZS5kZXBvc2l0KC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN0YXRlU2hhcGU6IHtcbiAgICAgICAgY3VycmVudEJhbGFuY2U6IGFtb3VudFNoYXBlLFxuICAgICAgICByZWNvdmVyeVNldDogTS5yZW1vdGFibGUoJ3JlY292ZXJ5U2V0JyksXG4gICAgICB9LFxuICAgIH0sXG4gICk7XG4gIHJldHVybiAoKSA9PiBtYWtlUHVyc2VLaXQoKS5wdXJzZTtcbn07JGjNj19vbmNlLnByZXBhcmVQdXJzZUtpbmQocHJlcGFyZVB1cnNlS2luZCk7XG5oYXJkZW4ocHJlcGFyZVB1cnNlS2luZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUHVyc2VLaW5kIjpbInByZXBhcmVQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYOSsWxkHAAAZBwAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvbm90aWZpZXIiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLHByb3ZpZGVMYXp5LG1ha2VOb3RpZmllcktpdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIixbJGjNj19hID0+IChwcm92aWRlTGF6eSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllcktpdFwiLFskaM2PX2EgPT4gKG1ha2VOb3RpZmllcktpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQdXJzZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtOb3RpZmllclJlY29yZH0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtXZWFrTWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICovXG5cbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG4gICAgICAgY29uc3QgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gKCkgPT4ge1xuICAvKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQdXJzZSwgTm90aWZpZXJSZWNvcmQ8YW55Pj59ICovXG4gIGNvbnN0IHRyYW5zaWVudE5vdGlmZXJLaXRzID0gbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShcbiAgICAndHJhbnNpZW50Tm90aWZlcktpdHMnLFxuICApO1xuXG4gIGNvbnN0IHByb3ZpZGVOb3RpZmllcktpdCA9IGtleSA9PlxuICAgIHByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLCBrZXksICgpID0+XG4gICAgICBtYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSksXG4gICAgKTtcblxuICBjb25zdCBwcm92aWRlTm90aWZpZXIgPSBrZXkgPT4gcHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG4gIGNvbnN0IHVwZGF0ZSA9IChrZXksIG5ld1ZhbHVlKSA9PiB7XG4gICAgaWYgKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKSB7XG4gICAgICBjb25zdCB7IHVwZGF0ZXIgfSA9IHRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xuICAgICAgdXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7IHByb3ZpZGVOb3RpZmllciwgdXBkYXRlIH07XG59OyRozY9fb25jZS5tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbmhhcmRlbihtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADl+t+rQC0AAEAtAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJBbW91bnRQYXR0ZXJuU2hhcGUiLCJBbW91bnRTaGFwZSIsIkFzc2V0S2luZFNoYXBlIiwiQnJhbmRJIiwiQnJhbmRTaGFwZSIsIkRlcG9zaXRGYWNldFNoYXBlIiwiRGlzcGxheUluZm9TaGFwZSIsIklzc3VlcktpdFNoYXBlIiwiSXNzdWVyU2hhcGUiLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiLCJNaW50U2hhcGUiLCJOb3RpZmllclNoYXBlIiwiUGF5bWVudFNoYXBlIiwiUHVyc2VTaGFwZSIsIlJhdGlvU2hhcGUiLCJpc0NvcHlCYWdWYWx1ZSIsImlzQ29weVNldFZhbHVlIiwiaXNOYXRWYWx1ZSIsImlzU2V0VmFsdWUiLCJtYWtlSXNzdWVySW50ZXJmYWNlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sbWF0Y2hlcyxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBpbXBvcnQge0Ftb3VudFZhbHVlLCBSYXRpb30gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCdcbiAqIEBpbXBvcnQge0NvcHlCYWcsIENvcHlTZXQsIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge05hdFZhbHVlLCBTZXRWYWx1ZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuICAgICAgIGNvbnN0IEJyYW5kU2hhcGUgPSBNLnJlbW90YWJsZSgnQnJhbmQnKTskaM2PX29uY2UuQnJhbmRTaGFwZShCcmFuZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdJc3N1ZXInKTskaM2PX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuICAgICAgIGNvbnN0IFBheW1lbnRTaGFwZSA9IE0ucmVtb3RhYmxlKCdQYXltZW50Jyk7JGjNj19vbmNlLlBheW1lbnRTaGFwZShQYXltZW50U2hhcGUpO1xuICAgICAgIGNvbnN0IFB1cnNlU2hhcGUgPSBNLnJlbW90YWJsZSgnUHVyc2UnKTskaM2PX29uY2UuUHVyc2VTaGFwZShQdXJzZVNoYXBlKTtcbiAgICAgICBjb25zdCBEZXBvc2l0RmFjZXRTaGFwZSA9IE0ucmVtb3RhYmxlKCdEZXBvc2l0RmFjZXQnKTskaM2PX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuICAgICAgIGNvbnN0IE5vdGlmaWVyU2hhcGUgPSBNLnJlbW90YWJsZSgnTm90aWZpZXInKTskaM2PX29uY2UuTm90aWZpZXJTaGFwZShOb3RpZmllclNoYXBlKTtcbiAgICAgICBjb25zdCBNaW50U2hhcGUgPSBNLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBOYXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzIGFcbiAqIG5vbi1uZWdhdGl2ZSBiaWdpbnQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGF0IG1hbnkgdW5pdHMgb2YgdGhlIGZ1bmdpYmxlIGFzc2V0XG4gKiByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudC4gVGhlIGJyYW5kIG9mIHRoYXQgYW1vdW50IHNob3VsZCBpbmRlZWQgcmVwcmVzZW50XG4gKiBhIGtpbmQgb2YgYXNzZXQgY29uc2lzdGluZyBvZiBhIGNvdW50YWJsZSBzZXQgb2YgZnVuZ2libGUgdW5pdHMuXG4gKi8kaM2PX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlID0gTS5uYXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weVNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weVNldCwgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhvc2Uga2V5cywgd2hlcmUgZWFjaCBrZXlcbiAqIHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIG5vbi1mdW5naWJsZSBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsIGZyb20gdGhlXG4gKiBub24tZnVuZ2libGUgYXNzZXQgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIGFtb3VudFxuICogaXRzZWxmIHJlcHJlc2VudHMgdGhlIHNldCBvZiB0aGVzZSBpdGVtcywgYXMgb3Bwb3NlZCB0byBhbnkgb2YgdGhlIG90aGVyXG4gKiBpdGVtcyBmcm9tIHRoZSBzYW1lIGFzc2V0IGNsYXNzLlxuICpcbiAqIElmIGEgZ2l2ZW4gdmFsdWUgY2xhc3MgcmVwcmVzZW50cyBjb25jZXJ0IHRpY2tldHMsIGl0IHNlZW1zIGJpemFycmUgdGhhdCB3ZVxuICogY2FuIGZvcm0gYW1vdW50cyBvZiBhbnkga2V5LiBUaGUgaGFyZCBjb25zdHJhaW50IGlzIHRoYXQgdGhlIGNvZGUgdGhhdCBob2xkc1xuICogdGhlIG1pbnQgZm9yIHRoYXQgYXNzZXQgY2xhc3MtLS10aGUgb25lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGJyYW5kLCBvbmx5XG4gKiBtaW50cyB0aGUgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSByZWFsIHVuaXRzIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieVxuICogaXQuIEFueW9uZSBlbHNlIGNhbiBwdXQgdG9nZXRoZXIgYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXlcbiAqIFwid2FudFwiIHNvbWUgaXRlbXMgdGhhdCB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmVcbiAqIHNhdGlzZmllZC4gXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlTZXRWYWx1ZVNoYXBlID0gTS5zZXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgU2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdCBpcyBhXG4gKiBDb3B5QXJyYXkgb2YgcGFzc2FibGUgS2V5cy4gVGhpcyByZXByZXNlbnRhdGlvbiBpcyBkZXByZWNhdGVkLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogICBDb3B5U2V0VmFsdWVzLlxuICovXG5jb25zdCBTZXRWYWx1ZVNoYXBlID0gTS5hcnJheU9mKE0ua2V5KCkpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5QmFnVmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QmFnLCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIGJhZyAobXVsdGlzZXQpIG9mIHRob3NlIGtleXMsIHdoZXJlIGVhY2hcbiAqIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBzZW1pLWZ1bmdpYmxlIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCxcbiAqIGZyb20gdGhlIHNlbWktZnVuZ2libGUgYXNzZXQgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlXG4gKiBudW1iZXIgb2YgdGltZXMgdGhhdCBrZXkgYXBwZWFycyBpbiB0aGUgYmFnIGlzIHRoZSBudW1iZXIgb2YgZnVuZ2libGUgdW5pdHNcbiAqIG9mIHRoYXQga2V5LiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzIHRoZSBiYWcgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWRcbiAqIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXMgZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlIHRoYXQgd2VcbiAqIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0IHRoZSBjb2RlIHRoYXQgaG9sZHNcbiAqIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBicmFuZCwgb25seVxuICogbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0cyBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnlcbiAqIGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5XG4gKiBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXQgd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlXG4gKiBzYXRpc2ZpZWQuIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5QmFnVmFsdWVTaGFwZSA9IE0uYmFnKCk7XG5cbmNvbnN0IEFtb3VudFZhbHVlU2hhcGUgPSBNLm9yKFxuICBOYXRWYWx1ZVNoYXBlLFxuICBDb3B5U2V0VmFsdWVTaGFwZSxcbiAgU2V0VmFsdWVTaGFwZSxcbiAgQ29weUJhZ1ZhbHVlU2hhcGUsXG4pO1xuXG4gICAgICAgY29uc3QgQW1vdW50U2hhcGUgPSB7IGJyYW5kOiBCcmFuZFNoYXBlLCB2YWx1ZTogQW1vdW50VmFsdWVTaGFwZSB9OyRozY9fb25jZS5BbW91bnRTaGFwZShBbW91bnRTaGFwZSk7XG5oYXJkZW4oQW1vdW50U2hhcGUpO1xuXG4vKipcbiAqIFRvIGJlIHVzZWQgdG8gZ3VhcmQgYW4gYW1vdW50IHBhdHRlcm4gYXJndW1lbnQsIGkuZS4sIGFuIGFyZ3VtZW50IHdoaWNoIGlzIGFcbiAqIHBhdHRlcm4gdGhhdCBjYW4gYmUgdXNlZCB0byB0ZXN0IGFtb3VudHMuIFNpbmNlIGFtb3VudHMgYXJlIGtleXMsIGFueXdoZXJlIGFuXG4gKiBhbW91bnQgcGF0dGVybiBpcyBleHBlY3RlZCwgYW4gYW1vdW50IGNhbiBiZSBwcm92aWRlZCBhbmQgd2lsbCBtYXRjaCBvbmx5XG4gKiB0aGF0IGNvbmNyZXRlIGFtb3VudCwgaS5lLiwgYW1vdW50cyB0aGF0IGFyZSBga2V5RVFgIHRvIHRoYXQgYW1vdW50LlxuICpcbiAqIFRoZSBgQW1vdW50U2hhcGVgIGd1YXJkIGFib3ZlIGlzIGFuIGFtb3VudCBwYXR0ZXJuLiBCdXQgbm90IGFsbCBhbW91bnRcbiAqIHBhdHRlcm5zIGFyZSBsaWtlIGBBbW91bnRTaGFwZWAuIEZvciBleGFtcGxlLCBgTS5hbnkoKWAgaXMgYSB2YWxpZCBhbW91bnRcbiAqIHBhdHRlcm4gdGhhdCB3aWxsIGFkbWl0IGFueSBhbW91bnQsIGJ1dCBpcyBkb2VzIG5vdCByZXNlbWJsZSB0aGVcbiAqIGBBbW91bnRTaGFwZWAgcGF0dGVybiBhYm92ZS5cbiAqL1xuICAgICAgIGNvbnN0IEFtb3VudFBhdHRlcm5TaGFwZSA9IE0ucGF0dGVybigpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxSYXRpbz59ICovJGjNj19vbmNlLkFtb3VudFBhdHRlcm5TaGFwZShBbW91bnRQYXR0ZXJuU2hhcGUpO1xuICAgICAgIGNvbnN0IFJhdGlvU2hhcGUgPSB7IG51bWVyYXRvcjogQW1vdW50U2hhcGUsIGRlbm9taW5hdG9yOiBBbW91bnRTaGFwZSB9OyRozY9fb25jZS5SYXRpb1NoYXBlKFJhdGlvU2hhcGUpO1xuaGFyZGVuKFJhdGlvU2hhcGUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIE5hdCBiaWdpbnQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBOYXRWYWx1ZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzTmF0VmFsdWUgPSB2YWx1ZSA9PiBtYXRjaGVzKHZhbHVlLCBOYXRWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNOYXRWYWx1ZShpc05hdFZhbHVlKTtcbmhhcmRlbihpc05hdFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5U2V0XG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5U2V0fVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5U2V0VmFsdWUgPSB2YWx1ZSA9PiBtYXRjaGVzKHZhbHVlLCBDb3B5U2V0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzQ29weVNldFZhbHVlKGlzQ29weVNldFZhbHVlKTtcbmhhcmRlbihpc0NvcHlTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgcGFzcyBieSBjb3B5IGFycmF5IHN0cnVjdHVyZS4gRG9lcyBub3QgY2hlY2sgZm9yXG4gKiBkdXBsaWNhdGVzLiBUbyBjaGVjayBmb3IgZHVwbGljYXRlcywgdXNlIHNldE1hdGhIZWxwZXJzLmNvZXJjZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqICAgQ29weVNldFZhbHVlcy5cbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgU2V0VmFsdWV9XG4gKi9cbiAgICAgICBjb25zdCBpc1NldFZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgU2V0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzU2V0VmFsdWUoaXNTZXRWYWx1ZSk7XG5oYXJkZW4oaXNTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgQ29weUJhZ1xuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgQ29weUJhZ31cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weUJhZ1ZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgQ29weUJhZ1ZhbHVlU2hhcGUpOyRozY9fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vKiBPbmUgR09PR09MdGggc2hvdWxkIGJlIGVub3VnaCBkZWNpbWFsIHBsYWNlcyBmb3IgYW55Ym9keS4qL1xuICAgICAgIGNvbnN0IE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyA9IDEwMDskaM2PX29uY2UuTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyk7XG5cbiAgICAgICBjb25zdCBBc3NldEtpbmRTaGFwZSA9IE0ub3IoJ25hdCcsICdzZXQnLCAnY29weVNldCcsICdjb3B5QmFnJyk7JGjNj19vbmNlLkFzc2V0S2luZFNoYXBlKEFzc2V0S2luZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IERpc3BsYXlJbmZvU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7fSxcbiAge1xuICAgIGRlY2ltYWxQbGFjZXM6IE0uYW5kKFxuICAgICAgTS5ndGUoLU1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyksXG4gICAgICBNLmx0ZShNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuICAgICksXG4gICAgYXNzZXRLaW5kOiBBc3NldEtpbmRTaGFwZSxcbiAgfSxcbiAge1xuICAgIC8qIEluY2x1ZGluZyB0aGlzIGVtcHR5IGByZXN0YCBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyKi9cbiAgICAvKiBwcm9wZXJ0aWVzIGJleW9uZCB0aG9zZSBpbiB0aGUgYGJhc2VgIHJlY29yZC4qL1xuICB9LFxuKTskaM2PX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtcblxuICAgICAgIGNvbnN0IElzc3VlcktpdFNoYXBlID0ge1xuICBicmFuZDogQnJhbmRTaGFwZSxcbiAgbWludDogTWludFNoYXBlLFxuICBtaW50UmVjb3ZlcnlQdXJzZTogUHVyc2VTaGFwZSxcbiAgaXNzdWVyOiBJc3N1ZXJTaGFwZSxcbiAgZGlzcGxheUluZm86IERpc3BsYXlJbmZvU2hhcGUsXG59OyRozY9fb25jZS5Jc3N1ZXJLaXRTaGFwZShJc3N1ZXJLaXRTaGFwZSk7XG5oYXJkZW4oSXNzdWVyS2l0U2hhcGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgICAgICBjb25zdCBCcmFuZEkgPSBNLmludGVyZmFjZSgnQnJhbmQnLCB7XG4gIGlzTXlJc3N1ZXI6IE0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICBnZXRBbGxlZ2VkTmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0RGlzcGxheUluZm86IE0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG4gIGdldEFtb3VudFNoYXBlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKSxcbn0pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2JyYW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthc3NldEtpbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Ftb3VudFNoYXBlXVxuICovJGjNj19vbmNlLkJyYW5kSShCcmFuZEkpO1xuICAgICAgIGNvbnN0IG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gKFxuICBicmFuZFNoYXBlID0gQnJhbmRTaGFwZSxcbiAgYXNzZXRLaW5kU2hhcGUgPSBBc3NldEtpbmRTaGFwZSxcbiAgYW1vdW50U2hhcGUgPSBBbW91bnRTaGFwZSxcbikgPT4ge1xuICBjb25zdCBJc3N1ZXJJID0gTS5pbnRlcmZhY2UoJ0lzc3VlcicsIHtcbiAgICBnZXRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbiAgICBnZXRBbGxlZ2VkTmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgICBnZXRBc3NldEtpbmQ6IE0uY2FsbCgpLnJldHVybnMoYXNzZXRLaW5kU2hhcGUpLFxuICAgIGdldERpc3BsYXlJbmZvOiBNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxuICAgIG1ha2VFbXB0eVB1cnNlOiBNLmNhbGwoKS5yZXR1cm5zKFB1cnNlU2hhcGUpLFxuXG4gICAgaXNMaXZlOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gICAgZ2V0QW1vdW50T2Y6IE0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgICBidXJuOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSlcbiAgICAgIC5vcHRpb25hbChBbW91bnRQYXR0ZXJuU2hhcGUpXG4gICAgICAucmV0dXJucyhhbW91bnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IE1pbnRJID0gTS5pbnRlcmZhY2UoJ01pbnQnLCB7XG4gICAgZ2V0SXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgICBtaW50UGF5bWVudDogTS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IFBheW1lbnRJID0gTS5pbnRlcmZhY2UoJ1BheW1lbnQnLCB7XG4gICAgZ2V0QWxsZWdlZEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBQdXJzZUkgPSBNLmludGVyZmFjZSgnUHVyc2UnLCB7XG4gICAgZ2V0QWxsZWdlZEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICAgIGdldEN1cnJlbnRBbW91bnQ6IE0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICAgIGdldEN1cnJlbnRBbW91bnROb3RpZmllcjogTS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbiAgICAvKiBQdXJzZUkgZG9lcyAqbm90KiBkZWxheSBgZGVwb3NpdGAgdW50aWwgYHNyY1BheW1lbnRgIGlzIGZ1bGZ1bGxlZC4qL1xuICAgIC8qIFJhdGhlciwgdGhlIHNlbWFudGljcyBvZiBgZGVwb3NpdGAgcmVxdWlyZSBpdCB0byBwcm92aWRlIGl0cyovXG4gICAgLyogY2FsbGVycyB3aXRoIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGBkZXBvc2l0YCBtZXNzYWdlcyBhcmUqL1xuICAgIC8qIHByb2Nlc3NlZCB3aXRob3V0IGZ1cnRoZXIgZGVsYXkgaW4gdGhlIG9yZGVyIHRoZXkgYXJyaXZlLiovXG4gICAgLyogUHVyc2VJIHRoZXJlZm9yZSByZXF1aXJlcyB0aGF0IHRoZSBgc3JjUGF5bWVudGAgYXJndW1lbnQgYWxyZWFkeSovXG4gICAgLyogYmUgYSByZW1vdGFibGUsIG5vdCBhIHByb21pc2UuKi9cbiAgICAvKiBQdXJzZUkgb25seSBjYWxscyB0aGlzIHJhdyBtZXRob2QgYWZ0ZXIgdmFsaWRhdGluZyB0aGF0Ki9cbiAgICAvKiBgc3JjUGF5bWVudGAgaXMgYSByZW1vdGFibGUsIGxlYXZpbmcgaXQqL1xuICAgIC8qIHRvIHRoaXMgcmF3IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgcmVtb3RhYmxlIGlzIGFjdHVhbGx5Ki9cbiAgICAvKiBhIGxpdmUgcGF5bWVudCBvZiB0aGUgY29ycmVjdCBicmFuZCB3aXRoIHN1ZmZpY2llbnQgZnVuZHMuKi9cbiAgICBkZXBvc2l0OiBNLmNhbGwoUGF5bWVudFNoYXBlKVxuICAgICAgLm9wdGlvbmFsKEFtb3VudFBhdHRlcm5TaGFwZSlcbiAgICAgIC5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgICBnZXREZXBvc2l0RmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoRGVwb3NpdEZhY2V0U2hhcGUpLFxuICAgIHdpdGhkcmF3OiBNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbiAgICBnZXRSZWNvdmVyeVNldDogTS5jYWxsKCkucmV0dXJucyhNLnNldE9mKFBheW1lbnRTaGFwZSkpLFxuICAgIHJlY292ZXJBbGw6IE0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBEZXBvc2l0RmFjZXRJID0gTS5pbnRlcmZhY2UoJ0RlcG9zaXRGYWNldCcsIHtcbiAgICByZWNlaXZlOiBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoUHVyc2VJKS5tZXRob2RHdWFyZHMuZGVwb3NpdCxcbiAgfSk7XG5cbiAgY29uc3QgUHVyc2VJS2l0ID0ge1xuICAgIHB1cnNlOiBQdXJzZUksXG4gICAgZGVwb3NpdEZhY2V0OiBEZXBvc2l0RmFjZXRJLFxuICB9O1xuICBoYXJkZW4oUHVyc2VJS2l0KTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBJc3N1ZXJJLFxuICAgIE1pbnRJLFxuICAgIFBheW1lbnRJLFxuICAgIFB1cnNlSUtpdCxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlSXNzdWVySW50ZXJmYWNlcyhtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG5oYXJkZW4obWFrZUlzc3VlckludGVyZmFjZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJhbmRTaGFwZSI6WyJCcmFuZFNoYXBlIl0sIklzc3VlclNoYXBlIjpbIklzc3VlclNoYXBlIl0sIlBheW1lbnRTaGFwZSI6WyJQYXltZW50U2hhcGUiXSwiUHVyc2VTaGFwZSI6WyJQdXJzZVNoYXBlIl0sIkRlcG9zaXRGYWNldFNoYXBlIjpbIkRlcG9zaXRGYWNldFNoYXBlIl0sIk5vdGlmaWVyU2hhcGUiOlsiTm90aWZpZXJTaGFwZSJdLCJNaW50U2hhcGUiOlsiTWludFNoYXBlIl0sIkFtb3VudFNoYXBlIjpbIkFtb3VudFNoYXBlIl0sIkFtb3VudFBhdHRlcm5TaGFwZSI6WyJBbW91bnRQYXR0ZXJuU2hhcGUiXSwiUmF0aW9TaGFwZSI6WyJSYXRpb1NoYXBlIl0sImlzTmF0VmFsdWUiOlsiaXNOYXRWYWx1ZSJdLCJpc0NvcHlTZXRWYWx1ZSI6WyJpc0NvcHlTZXRWYWx1ZSJdLCJpc1NldFZhbHVlIjpbImlzU2V0VmFsdWUiXSwiaXNDb3B5QmFnVmFsdWUiOlsiaXNDb3B5QmFnVmFsdWUiXSwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIjpbIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyJdLCJBc3NldEtpbmRTaGFwZSI6WyJBc3NldEtpbmRTaGFwZSJdLCJEaXNwbGF5SW5mb1NoYXBlIjpbIkRpc3BsYXlJbmZvU2hhcGUiXSwiSXNzdWVyS2l0U2hhcGUiOlsiSXNzdWVyS2l0U2hhcGUiXSwiQnJhbmRJIjpbIkJyYW5kSSJdLCJtYWtlSXNzdWVySW50ZXJmYWNlcyI6WyJtYWtlSXNzdWVySW50ZXJmYWNlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGu/8vf/MgAA/zIAADQAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL2ZlZURpc3RyaWJ1dG9yLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvZXJ0cC9zcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qcyIsIkBlbmRvL2ZhciIsIkBlbmRvL25hdCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIiwiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlQ29udHJhY3RGZWVDb2xsZWN0b3IiLCJtYWtlRmVlRGlzdHJpYnV0b3IiLCJtYWtlU2hhcmVDb25maWciLCJtZXRhIiwic2hhcmVQYXltZW50Iiwic3RhcnQiLCJzdGFydERpc3RyaWJ1dGluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEFtb3VudE1hdGgsc3BsaXRNYW55LEUsRmFyLE5hdCxvYnNlcnZlTm90aWZpZXIsbXVzdE1hdGNoLG1ha2VTY2FsYXJTZXRTdG9yZSxNLFJlbGF0aXZlVGltZVNoYXBlLEtleXdvcmRTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHAvc3JjL2xlZ2FjeS1wYXltZW50LWhlbHBlcnMuanNcIiwgW1tcInNwbGl0TWFueVwiLFskaM2PX2EgPT4gKHNwbGl0TWFueSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJvYnNlcnZlTm90aWZpZXJcIixbJGjNj19hID0+IChvYnNlcnZlTm90aWZpZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhclNldFN0b3JlID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJSZWxhdGl2ZVRpbWVTaGFwZVwiLFskaM2PX2EgPT4gKFJlbGF0aXZlVGltZVNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanNcIiwgW1tcIktleXdvcmRTaGFwZVwiLFskaM2PX2EgPT4gKEtleXdvcmRTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtNYXBTdG9yZSwgU2V0U3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICogQGltcG9ydCB7RU9ubHl9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtBbW91bnQsIERlcG9zaXRGYWNldCwgSXNzdWVyLCBOYXRWYWx1ZSwgUGF5bWVudH0gZnJvbSAnQGFnb3JpYy9lcnRwL3NyYy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtDb250cmFjdE1ldGEsIEludml0YXRpb24sIEtleXdvcmQsIFpDRiwgWm9lU2VydmljZX0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbmNvbnN0IEtleXdvcmRTaGFyZXNTaGFwZSA9IE0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLCBNLm5hdCgpKTtcblxuLyoqIEB0eXBlIHtDb250cmFjdE1ldGE8dHlwZW9mIHN0YXJ0Pn0gKi9cbiAgICAgICBjb25zdCBtZXRhID0ge1xuICBjdXN0b21UZXJtc1NoYXBlOiB7XG4gICAga2V5d29yZFNoYXJlczogS2V5d29yZFNoYXJlc1NoYXBlLFxuICAgIHRpbWVyU2VydmljZTogTS5lcmVmKE0ucmVtb3RhYmxlKCdUaW1lclNlcnZpY2UnKSksXG4gICAgY29sbGVjdGlvbkludGVydmFsOiBSZWxhdGl2ZVRpbWVTaGFwZSxcbiAgfSxcbn07JGjNj19vbmNlLm1ldGEobWV0YSk7XG5oYXJkZW4obWV0YSk7XG5cbi8qKlxuICogQGltcG9ydCB7UmVsYXRpdmVUaW1lfSBmcm9tICdAYWdvcmljL3RpbWUnXG4gKiBAaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gJ0BhZ29yaWMvdGltZSdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZlZUNvbGxlY3RvclxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPFBheW1lbnQ8J25hdCc+Pn0gY29sbGVjdEZlZXNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBlcmlvZGljRmVlQ29sbGVjdG9yXG4gKiBAcHJvcGVydHkgeygpID0+IEZlZUNvbGxlY3Rvcn0gZ2V0Q29sbGVjdG9yXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8dm9pZD59IGNvbGxlY3RBbmREaXN0cmlidXRlTm93XG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IHN0b3BcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbGxlY3RpYmxlQ29udHJhY3RGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb248c3RyaW5nLCBuZXZlcj4+fSBtYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiB3cmFwcGVyIHRvIHRha2UgdGhlIGEgY3JlYXRvckZhY2V0IChlLmcuIHZhdWx0RmFjdG9yeSkgYW5kIG1ha2UgYSBjYWxsIHRoYXRcbiAqIHdpbGwgcmVxdWVzdCBhbiBpbnZpdGF0aW9uIGFuZCByZXR1cm4gYSBwcm9taXNlIGZvciBhIHBheW1lbnQuXG4gKlxuICogQHBhcmFtIHtFUmVmPFpvZVNlcnZpY2U+fSB6b2VcbiAqIEBwYXJhbSB7RVJlZjxDb2xsZWN0aWJsZUNvbnRyYWN0RmFjZXQ+fSBjcmVhdG9yRmFjZXRcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb250cmFjdEZlZUNvbGxlY3RvciA9ICh6b2UsIGNyZWF0b3JGYWNldCkgPT4ge1xuICAvKiogQHR5cGUge0ZlZUNvbGxlY3Rvcn0gKi9cbiAgcmV0dXJuIEZhcignZmVlQ29sbGVjdG9yJywge1xuICAgIGNvbGxlY3RGZWVzOiAoKSA9PiB7XG4gICAgICBjb25zdCBpbnZpdGF0aW9uID0gRShjcmVhdG9yRmFjZXQpLm1ha2VDb2xsZWN0RmVlc0ludml0YXRpb24oKTtcbiAgICAgIGNvbnN0IGNvbGxlY3RGZWVzU2VhdCA9IEUoem9lKS5vZmZlcihpbnZpdGF0aW9uLCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm4gRShjb2xsZWN0RmVlc1NlYXQpLmdldFBheW91dCgnRmVlJyk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEEgZGlzdHJpYnV0b3Igb2YgZmVlcyBmcm9tIEludGVyIFByb3RvY29sIHNvdXJjZXMgdG8gZGVwb3NpdCBmYWNldHMuIEVhY2hcbiAqIHRpbWUgdGhlIGVwb2NoVGltZXIgc2lnbmFscyB0aGUgZW5kIG9mIGFuIEVwb2NoLCBpdCB3aWxsIGFzayB0aGUgY29udHJhY3RzXG4gKiBmb3IgZmVlcyB0aGF0IGhhdmUgYmVlbiBjb2xsZWN0ZWQgdG8gZGF0ZSBhbmQgc2VuZCB0aGF0IHBheW1lbnQgdG8gdGhlXG4gKiBkZXBvc2l0RmFjZXQuXG4gKlxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHVua25vd24+fSBzY2hlZHVsZVBheW1lbnRzIC0gZGlzdHJpYnV0ZSB0byB0aGVcbiAqICAgZGVzdGluYXRpb25zXG4gKiBAcGFyYW0ge0VSZWY8VGltZXJTZXJ2aWNlPn0gdGltZXJTZXJ2aWNlIC0gdGltZXIgdGhhdCBpcyB1c2VkIHRvIHNjaGVkdWxlXG4gKiAgIGNvbGxlY3Rpb25zXG4gKiBAcGFyYW0ge1JlbGF0aXZlVGltZX0gW2NvbGxlY3Rpb25JbnRlcnZhbF0gLSBob3cgb2Z0ZW4gdG8gY29sbGVjdCBmZWVzIGluIHRoZVxuICogICBgdGltZXJTZXJ2aWNlYCB1bml0XG4gKi8kaM2PX29uY2UubWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yKG1ha2VDb250cmFjdEZlZUNvbGxlY3Rvcik7XG4gICAgICAgY29uc3Qgc3RhcnREaXN0cmlidXRpbmcgPSAoXG4gIHNjaGVkdWxlUGF5bWVudHMsXG4gIHRpbWVyU2VydmljZSxcbiAgY29sbGVjdGlvbkludGVydmFsID0gMW4sXG4pID0+IHtcbiAgY29uc3QgdGltZU9ic2VydmVyID0ge1xuICAgIHVwZGF0ZVN0YXRlOiBfID0+XG4gICAgICBzY2hlZHVsZVBheW1lbnRzKCkuY2F0Y2goZSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCB3aXRoJywgZSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9KSxcbiAgICBmYWlsOiByZWFzb24gPT4ge1xuICAgICAgdGhyb3cgRXJyb3IoYGZlZSBkaXN0cmlidXRvciB0aW1lciBmYWlsZWQ6ICR7cmVhc29ufWApO1xuICAgIH0sXG4gICAgZmluaXNoOiBkb25lID0+IHtcbiAgICAgIHRocm93IEVycm9yKGBmZWUgZGlzdHJpYnV0b3IgdGltZXIgZGllZDogJHtkb25lfWApO1xuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgY29sbGVjdGlvbk5vdGlmaWVyID0gRSh0aW1lclNlcnZpY2UpLm1ha2VOb3RpZmllcihcbiAgICAwbixcbiAgICBjb2xsZWN0aW9uSW50ZXJ2YWwsXG4gICk7XG4gIG9ic2VydmVOb3RpZmllcihjb2xsZWN0aW9uTm90aWZpZXIsIHRpbWVPYnNlcnZlcikuY2F0Y2goZSA9PiB7XG4gICAgY29uc29sZS5lcnJvcignZmVlIGRpc3RyaWJ1dG9yIGZhaWxlZCB3aXRoJywgZSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBwdXNoUGF5bWVudDogKHBheW1lbnQ6IFBheW1lbnQsIGlzc3VlcjogRVJlZjxJc3N1ZXI+KSA9PiBQcm9taXNlPEFtb3VudD47XG4gKiB9fSBGZWVEZXN0aW5hdGlvblxuICogQHBhcmFtIHtSZWNvcmQ8S2V5d29yZCwgRVJlZjxGZWVEZXN0aW5hdGlvbj4+fSBbZGVzdGluYXRpb25zXVxuICogQHBhcmFtIHtSZWNvcmQ8S2V5d29yZCwgTmF0VmFsdWU+fSBba2V5d29yZFNoYXJlc11cbiAqLyRozY9fb25jZS5zdGFydERpc3RyaWJ1dGluZyhzdGFydERpc3RyaWJ1dGluZyk7XG4gICAgICAgY29uc3QgbWFrZVNoYXJlQ29uZmlnID0gKGRlc3RpbmF0aW9ucyA9IHt9LCBrZXl3b3JkU2hhcmVzID0ge30pID0+IHtcbiAgbGV0IHRvdGFsU2hhcmVzID0gMG47XG4gIGNvbnN0IHNoYXJlcyA9IE9iamVjdC5lbnRyaWVzKGRlc3RpbmF0aW9ucylcbiAgICAuZmlsdGVyKChbXywgZHN0XSkgPT4gZHN0KVxuICAgIC5tYXAoKFtrdywgZGVzdGluYXRpb25dKSA9PiB7XG4gICAgICBjb25zdCBzaGFyZSA9IE5hdChrZXl3b3JkU2hhcmVzW2t3XSk7XG4gICAgICB0b3RhbFNoYXJlcyArPSBzaGFyZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNoYXJlLFxuICAgICAgICBkZXN0aW5hdGlvbixcbiAgICAgIH07XG4gICAgfSk7XG4gIHJldHVybiB7IHNoYXJlcywgdG90YWxTaGFyZXMgfTtcbn07XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgbWFrZVNoYXJlQ29uZmlnPn0gU2hhcmVDb25maWcgKi9cblxuLyoqXG4gKiBTcGxpdCBhbmQgZGVwb3NpdCBhIHBheW1lbnQgZ2l2ZW4gYSBzaGFyZSBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudDwnbmF0Jz59IHBheW1lbnRcbiAqIEBwYXJhbSB7RVJlZjxJc3N1ZXI8J25hdCc+Pn0gaXNzdWVyXG4gKiBAcGFyYW0ge1NoYXJlQ29uZmlnfSBzaGFyZUNvbmZpZ1xuICovJGjNj19vbmNlLm1ha2VTaGFyZUNvbmZpZyhtYWtlU2hhcmVDb25maWcpO1xuICAgICAgIGNvbnN0IHNoYXJlUGF5bWVudCA9IGFzeW5jIChcbiAgcGF5bWVudCxcbiAgaXNzdWVyLFxuICB7IHNoYXJlcywgdG90YWxTaGFyZXMgfSxcbikgPT4ge1xuICAvKiBEaXZpZGUgdGhlIHBheW1lbnQgaW50byBzaGFyZXMuKi9cbiAgaWYgKCFzaGFyZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqIEB0eXBlIHtBbW91bnQ8J25hdCc+fSAqL1xuICBjb25zdCBwYXltZW50QW1vdW50ID0gYXdhaXQgRShpc3N1ZXIpLmdldEFtb3VudE9mKHBheW1lbnQpO1xuICBpZiAoQW1vdW50TWF0aC5pc0VtcHR5KHBheW1lbnRBbW91bnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHsgdmFsdWU6IHRvdGFsVmFsdWUsIGJyYW5kIH0gPSBwYXltZW50QW1vdW50O1xuXG4gIGxldCByZW1haW5kZXIgPSB0b3RhbFZhbHVlO1xuICBjb25zdCBkZXN0aW5lZEFtb3VudEVudHJpZXMgPSBzaGFyZXNcbiAgICAubWFwKCh7IHNoYXJlLCBkZXN0aW5hdGlvbiB9LCBpKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIGkgPT09IHNoYXJlcy5sZW5ndGggLSAxXG4gICAgICAgICAgPyByZW1haW5kZXJcbiAgICAgICAgICA6ICh0b3RhbFZhbHVlICogc2hhcmUpIC8gdG90YWxTaGFyZXM7XG4gICAgICByZW1haW5kZXIgLT0gdmFsdWU7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtcbiAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgIEFtb3VudE1hdGgubWFrZShicmFuZCwgdmFsdWUpLFxuICAgICAgXSk7XG4gICAgfSlcbiAgICAuZmlsdGVyKChbXywgYW10XSkgPT4gIUFtb3VudE1hdGguaXNFbXB0eShhbXQpKTtcblxuICAvKipcbiAqIElmIHRoZSBgc2hhcmVkUGF5bWVudFtpXWAgcGF5bWVudHMgdGhhdCBhcmUgc2VudCB0byB0aGUgZmVlIGBkZXN0aW5hdGlvbmBcbiAqIHdpdGggYHB1c2hQYXltZW50YCBuZXZlciBhcnJpdmUsIG9yIG5ldmVyIGdldCBkZXBvc2l0ZWQgKG9yIG90aGVyd2lzZSB1c2VkXG4gKiB1cCksIHRoZW4gdGhleSByZW1haW4gaW4gdGhlIHJlY292ZXJ5IHNldCBvZiB0aGUgYHJlY292ZXJ5UHVyc2VgLiBUaGVcbiAqIHB1cnBvc2Ugb2YgdGhpcywgYW5kIG9mIHJlY292ZXJ5IHNldHMgaW4gZ2VuZXJhbCwgaXMgdG8gYmUgYWJsZSwgaW5cbiAqIGVtZXJnZW5jaWVzLCB0byByZWNvdmVyIHRoZSBhc3NldHMgb2YgcGF5bWVudHMgaW4gZmxpZ2h0IHRoYXQgc2VlbSB0byBiZVxuICogc3R1Y2suIFRoaXMgaXMgbXVjaCBsaWtlIGNhbmNlbGxpbmcgYSBjaGVjayB0aGF0IG1heSBzdGlsbCBiZSB1bmRlcG9zaXRlZC5cbiAqXG4gKiBUT0RPOiBIb3dldmVyLCBmb3IgdGhpcyB0byBiZSBwb3NzaWJsZSwgdGhlIGByZWNvdmVyeVB1cnNlYCBob2xkaW5nIHRoYXRcbiAqIHJlY292ZXJ5IHNldCBtdXN0IHJlbWFpbiBhY2Nlc3NpYmxlIHRvIHNvbWVvbmUgdGhhdCBzaG91bGQgbGVnaXRpbWF0ZWx5IGJlXG4gKiBhYmxlIHRvIHJlY292ZXIgdGhvc2UgcGF5bWVudHMuIEJ1dCB0aGlzIGByZWNvdmVyeVB1cnNlYCBpcyBjdXJyZW50bHlcbiAqIGRyb3BwZWQgb24gdGhlIGZsb29yIGluc3RlYWQuXG4gKi9cbiAgY29uc3QgcmVjb3ZlcnlQdXJzZSA9IEUoaXNzdWVyKS5tYWtlRW1wdHlQdXJzZSgpO1xuXG4gIC8qIFNwbGl0IHRoZSBwYXltZW50LCB3aGljaCBhc3NlcnRzIGNvbnNlcnZhdGlvbiBvZiB0aGUgdG90YWwuKi9cbiAgY29uc3Qgc2hhcmVkUGF5bWVudCA9IGF3YWl0IHNwbGl0TWFueShcbiAgICByZWNvdmVyeVB1cnNlLFxuICAgIHBheW1lbnQsXG4gICAgZGVzdGluZWRBbW91bnRFbnRyaWVzLm1hcCgoW19kc3QsIGFtdF0pID0+IGFtdCksXG4gICk7XG5cbiAgLyogU2VuZCBlYWNoIG5vbmVtcHR5IHBheW1lbnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGVzdGluYXRpb24uKi9cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZGVzdGluZWRBbW91bnRFbnRyaWVzLm1hcCgoW2Rlc3RpbmF0aW9uXSwgaSkgPT5cbiAgICAgIEUoZGVzdGluYXRpb24pLnB1c2hQYXltZW50KHNoYXJlZFBheW1lbnRbaV0sIGlzc3VlciksXG4gICAgKSxcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFUmVmPElzc3VlcjwnbmF0Jz4+fSBmZWVJc3N1ZXJcbiAqIEBwYXJhbSB7e1xuICogICBrZXl3b3JkU2hhcmVzOiBSZWNvcmQ8S2V5d29yZCwgTmF0VmFsdWU+O1xuICogICB0aW1lclNlcnZpY2U6IEVSZWY8VGltZXJTZXJ2aWNlPjtcbiAqICAgY29sbGVjdGlvbkludGVydmFsOiBSZWxhdGl2ZVRpbWU7XG4gKiB9fSB0ZXJtc1xuICovJGjNj19vbmNlLnNoYXJlUGF5bWVudChzaGFyZVBheW1lbnQpO1xuICAgICAgIGNvbnN0IG1ha2VGZWVEaXN0cmlidXRvciA9IChmZWVJc3N1ZXIsIHRlcm1zKSA9PiB7XG4gIGNvbnN0IHsgdGltZXJTZXJ2aWNlLCBjb2xsZWN0aW9uSW50ZXJ2YWwgfSA9IHRlcm1zO1xuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgRVJlZjxGZWVEZXN0aW5hdGlvbj4+fSAqL1xuICBsZXQgZGVzdGluYXRpb25zID0ge307XG4gIGxldCB7IGtleXdvcmRTaGFyZXMgfSA9IHRlcm1zO1xuICBsZXQgc2hhcmVDb25maWcgPSBtYWtlU2hhcmVDb25maWcoZGVzdGluYXRpb25zLCBrZXl3b3JkU2hhcmVzKTtcblxuICAvKiogQHR5cGUge1NldFN0b3JlPEZlZUNvbGxlY3Rvcj59ICovXG4gIGNvbnN0IGNvbGxlY3RvcnMgPSBtYWtlU2NhbGFyU2V0U3RvcmUoKTtcblxuICAvKiogQHBhcmFtIHtQYXltZW50PCduYXQnPn0gcGF5bWVudCAqL1xuICBjb25zdCBkaXN0cmlidXRlRmVlcyA9IHBheW1lbnQgPT5cbiAgICBzaGFyZVBheW1lbnQocGF5bWVudCwgZmVlSXNzdWVyLCBzaGFyZUNvbmZpZyk7XG5cbiAgY29uc3Qgc2NoZWR1bGVQYXltZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoc2hhcmVDb25maWcudG90YWxTaGFyZXMgPD0gMG4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBbLi4uY29sbGVjdG9ycy52YWx1ZXMoKV0ubWFwKGNvbGxlY3RvciA9PlxuICAgICAgICBFKGNvbGxlY3RvcikuY29sbGVjdEZlZXMoKS50aGVuKGRpc3RyaWJ1dGVGZWVzKSxcbiAgICAgICksXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBwdWJsaWNGYWNldCA9IEZhcignZmVlRGlzdHJpYnV0b3IgcHVibGljRmFjZXQnLCB7XG4gICAgZGlzdHJpYnV0ZUZlZXMsXG4gICAgZ2V0S2V5d29yZFNoYXJlczogKCkgPT4ga2V5d29yZFNoYXJlcyxcbiAgfSk7XG5cbiAgY29uc3QgY3JlYXRvckZhY2V0ID0gRmFyKCdmZWVEaXN0cmlidXRvciBjcmVhdG9yRmFjZXQnLCB7XG4gICAgbWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yLFxuICAgIC8qKlxuICogU3RhcnQgZGlzdHJpYnV0aW5nIGZlZXMgZnJvbSB0aGlzIGNvbGxlY3Rvci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVidWdOYW1lXG4gKiBAcGFyYW0ge0VSZWY8RmVlQ29sbGVjdG9yPn0gY29sbGVjdG9yUFxuICovXG4gICAgc3RhcnRQZXJpb2RpY0NvbGxlY3Rpb246IGFzeW5jIChkZWJ1Z05hbWUsIGNvbGxlY3RvclApID0+IHtcbiAgICAgIGNvbnN0IGNvbGxlY3RvciA9IGF3YWl0IGNvbGxlY3RvclA7XG5cbiAgICAgIC8qKiBAdHlwZSB7UGVyaW9kaWNGZWVDb2xsZWN0b3J9ICovXG4gICAgICBjb25zdCBwZXJpb2RpY0NvbGxlY3RvciA9IEZhcignUGVyaW9kaWNGZWVDb2xsZWN0b3InLCB7XG4gICAgICAgIGdldERlYnVnTmFtZTogKCkgPT4gZGVidWdOYW1lLFxuICAgICAgICBnZXRDb2xsZWN0b3I6ICgpID0+IGNvbGxlY3RvcixcbiAgICAgICAgY29sbGVjdEFuZERpc3RyaWJ1dGVOb3c6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoc2hhcmVDb25maWcudG90YWxTaGFyZXMgPD0gMG4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcGF5bWVudCA9IGF3YWl0IEUoY29sbGVjdG9yKS5jb2xsZWN0RmVlcygpO1xuICAgICAgICAgIGF3YWl0IGRpc3RyaWJ1dGVGZWVzKHBheW1lbnQpO1xuICAgICAgICB9LFxuICAgICAgICBzdG9wOiAoKSA9PiB7XG4gICAgICAgICAgY29sbGVjdG9ycy5kZWxldGUoY29sbGVjdG9yKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvKiBSdW4gb25jZSBpbW1lZGlhdGVseSBmb3IgdGhpcyBjb2xsZWN0b3IsIHRvIHRlc3QgdGhhdCB0aGUgcmVnaXN0cmF0aW9uKi9cbiAgICAgIC8qIHdpbGwgd29yay4qL1xuICAgICAgYXdhaXQgRShwZXJpb2RpY0NvbGxlY3RvcikuY29sbGVjdEFuZERpc3RyaWJ1dGVOb3coKTtcblxuICAgICAgY29sbGVjdG9ycy5hZGQoY29sbGVjdG9yKTtcbiAgICAgIHJldHVybiBwZXJpb2RpY0NvbGxlY3RvcjtcbiAgICB9LFxuXG4gICAgLyoqXG4gKiBAcGFyYW0ge0VPbmx5PERlcG9zaXRGYWNldD59IGRlcG9zaXRGYWNldFxuICovXG4gICAgbWFrZURlcG9zaXRGYWNldERlc3RpbmF0aW9uOiBkZXBvc2l0RmFjZXQgPT4ge1xuICAgICAgcmV0dXJuIEZhcihgRGVwb3NpdEZhY2V0RGVzdGluYXRpb25gLCB7XG4gICAgICAgIHB1c2hQYXltZW50OiBhc3luYyAocGF5bWVudCwgX2lzc3VlcikgPT4ge1xuICAgICAgICAgIHJldHVybiBFKGRlcG9zaXRGYWNldCkucmVjZWl2ZShwYXltZW50KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgLyoqXG4gKiBDcmVhdGUgYSBkZXN0aW5hdGlvbiB0aGF0IGdlbmVyYXRlcyBpbnZpdGF0aW9ucyBhbmQgbWFrZXMgWm9lIG9mZmVycy5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleXdvcmRcbiAqIEBwYXJhbSB7dW5rbm93bn0gdGFyZ2V0XG4gKiBAcGFyYW0ge1Byb3BlcnR5S2V5fSBtYWtlSW52aXRhdGlvbk1ldGhvZFxuICogQHBhcmFtIHt1bmtub3duW119IFthcmdzXVxuICovXG4gICAgbWFrZU9mZmVyRGVzdGluYXRpb246IChcbiAgICAgIHpvZSxcbiAgICAgIGtleXdvcmQsXG4gICAgICB0YXJnZXQsXG4gICAgICBtYWtlSW52aXRhdGlvbk1ldGhvZCxcbiAgICAgIGFyZ3MgPSBbXSxcbiAgICApID0+IHtcbiAgICAgIHJldHVybiBGYXIoYCR7U3RyaW5nKG1ha2VJbnZpdGF0aW9uTWV0aG9kKX0gT2ZmZXJEZXN0aW5hdGlvbmAsIHtcbiAgICAgICAgcHVzaFBheW1lbnQ6IGFzeW5jIChwYXltZW50LCBpc3N1ZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXltZW50QW1vdW50ID0gYXdhaXQgRShpc3N1ZXIpLmdldEFtb3VudE9mKHBheW1lbnQpO1xuXG4gICAgICAgICAgLyogR2l2ZSB0aGUgcGF5bWVudCB0byB0aGUgY29udHJhY3QgdmlhIGl0cyBpbnZpdGF0aW9uLiovXG4gICAgICAgICAgY29uc3QgaW52aXRhdGlvbiA9IEUodGFyZ2V0KVttYWtlSW52aXRhdGlvbk1ldGhvZF0oLi4uYXJncyk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gRSh6b2UpLm9mZmVyKFxuICAgICAgICAgICAgaW52aXRhdGlvbixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZ2l2ZToge1xuICAgICAgICAgICAgICAgIFtrZXl3b3JkXTogcGF5bWVudEFtb3VudCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFtrZXl3b3JkXTogcGF5bWVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8qIEFzc2VydCB0aGF0IHRoZSBvZmZlciBjb21wbGV0ZWQuKi9cbiAgICAgICAgICBhd2FpdCBFKHJlc3VsdCkuZ2V0T2ZmZXJSZXN1bHQoKTtcblxuICAgICAgICAgIC8qIFdlIGRlbGliZXJhdGVseSBkcm9wIG91ciBwYXlvdXRzIG9uIHRoZSBmbG9vciwgc2luY2UgdGhlIEVSVFAgcHVyc2UqL1xuICAgICAgICAgIC8qIHJlY292ZXJ5IG1lY2hhbmlzbSBjYW4gZ2V0IHRoZW0gYmFjayB0byB0aGUgZGlzdHJpYnV0b3IgY29udHJhY3QuKi9cbiAgICAgICAgICByZXR1cm4gcGF5bWVudEFtb3VudDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKiogQHBhcmFtIHtSZWNvcmQ8S2V5d29yZCwgRVJlZjxGZWVEZXN0aW5hdGlvbj4+fSBuZXdEZXN0aW5hdGlvbnMgKi9cbiAgICBzZXREZXN0aW5hdGlvbnM6IGFzeW5jIG5ld0Rlc3RpbmF0aW9ucyA9PiB7XG4gICAgICBkZXN0aW5hdGlvbnMgPSBuZXdEZXN0aW5hdGlvbnM7XG4gICAgICBzaGFyZUNvbmZpZyA9IG1ha2VTaGFyZUNvbmZpZyhkZXN0aW5hdGlvbnMsIGtleXdvcmRTaGFyZXMpO1xuICAgICAgLyogUnVuIG9uY2UgaW1tZWRpYXRlbHkgZm9yIHRoZXNlIGRlc3RpbmF0aW9ucy4qL1xuICAgICAgYXdhaXQgc2NoZWR1bGVQYXltZW50cygpO1xuICAgIH0sXG5cbiAgICAvKiogQHBhcmFtIHtSZWNvcmQ8S2V5d29yZCwgYmlnaW50Pn0gbmV3U2hhcmVzICovXG4gICAgc2V0S2V5d29yZFNoYXJlczogbmV3U2hhcmVzID0+IHtcbiAgICAgIG11c3RNYXRjaChuZXdTaGFyZXMsIEtleXdvcmRTaGFyZXNTaGFwZSk7XG4gICAgICBrZXl3b3JkU2hhcmVzID0gbmV3U2hhcmVzO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qIFN0YXJ0IHByb2Nlc3NpbmcgY29sbGVjdGlvbnMuKi9cbiAgc3RhcnREaXN0cmlidXRpbmcoc2NoZWR1bGVQYXltZW50cywgdGltZXJTZXJ2aWNlLCBjb2xsZWN0aW9uSW50ZXJ2YWwpO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGNyZWF0b3JGYWNldCxcbiAgICBwdWJsaWNGYWNldCxcbiAgfSk7XG59O1xuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VGZWVEaXN0cmlidXRvcj5bJ2NyZWF0b3JGYWNldCddfSBGZWVEaXN0cmlidXRvckNyZWF0b3JGYWNldCAqL1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlRmVlRGlzdHJpYnV0b3I+WydwdWJsaWNGYWNldCddfSBGZWVEaXN0cmlidXRvclB1YmxpY0ZhY2V0ICovXG5cbi8qKiBAcGFyYW0ge1pDRjxQYXJhbWV0ZXJzPHR5cGVvZiBtYWtlRmVlRGlzdHJpYnV0b3I+WzFdPn0gemNmICovJGjNj19vbmNlLm1ha2VGZWVEaXN0cmlidXRvcihtYWtlRmVlRGlzdHJpYnV0b3IpO1xuICAgICAgIGNvbnN0IHN0YXJ0ID0gYXN5bmMgemNmID0+IHtcbiAgY29uc3QgZmVlSXNzdWVyID0gRSh6Y2YuZ2V0Wm9lU2VydmljZSgpKS5nZXRGZWVJc3N1ZXIoKTtcbiAgcmV0dXJuIG1ha2VGZWVEaXN0cmlidXRvcihmZWVJc3N1ZXIsIHpjZi5nZXRUZXJtcygpKTtcbn07JGjNj19vbmNlLnN0YXJ0KHN0YXJ0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ldGEiOlsibWV0YSJdLCJtYWtlQ29udHJhY3RGZWVDb2xsZWN0b3IiOlsibWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yIl0sInN0YXJ0RGlzdHJpYnV0aW5nIjpbInN0YXJ0RGlzdHJpYnV0aW5nIl0sIm1ha2VTaGFyZUNvbmZpZyI6WyJtYWtlU2hhcmVDb25maWciXSwic2hhcmVQYXltZW50IjpbInNoYXJlUGF5bWVudCJdLCJtYWtlRmVlRGlzdHJpYnV0b3IiOlsibWFrZUZlZURpc3RyaWJ1dG9yIl0sInN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAUYC9zZLAAA2SwAACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2FsbGJhY2suanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiY2FsbEUiLCJjYWxsU3luYyIsImlzQ2FsbGJhY2siLCJtYWtlRnVuY3Rpb25DYWxsYmFjayIsIm1ha2VNZXRob2RDYWxsYmFjayIsIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayIsIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siLCJwcmVwYXJlQXR0ZW51YXRvciIsInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbWFrZUVycm9yLHEsRSxpc1ByaW1pdGl2ZSxpc1Bhc3NhYmxlU3ltYm9sLGdldEludGVyZmFjZU1ldGhvZEtleXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChpc1Bhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldEludGVyZmFjZU1ldGhvZEtleXNcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VNZXRob2RLZXlzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2ZhcidcbiAqIEBpbXBvcnQge01ldGhvZHN9IGZyb20gJ0BlbmRvL2V4byc7XG4gKiBAaW1wb3J0IHtGYXJhYmxlfSBmcm9tICdAZW5kby9leG8nO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge01ldGhvZEd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKi9cbi8qKiBAaW1wb3J0IHtDYWxsYmFjaywgU3luY0NhbGxiYWNrfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IHsgb3duS2V5czogcmF3T3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IG93bktleXMgPVxuICAvKiogQHR5cGUgezxUIGV4dGVuZHMgUHJvcGVydHlLZXk+KG9iajogeyBbSyBpbiBUXT86IHVua25vd24gfSkgPT4gVFtdfSAqLyAoXG4gICAgcmF3T3duS2V5c1xuICApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gVFxuICogQHR5cGVkZWYgeyhcbiAqICAgLi4uYXJnczogUGFyYW1ldGVyczxSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlQXR0ZW51YXRvcj4+XG4gKiApID0+IEZhcmFibGU8VD59IE1ha2VBdHRlbnVhdG9yXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGtleVxuICogQHJldHVybnMge2tleSBpcyBQcm9wZXJ0eUtleX0gRklYTUU6IHNob3VsZCBiZSBqdXN0IGBQcm9wZXJ0eUtleWAgYnV0IFRTXG4gKiAgIGNvbXBsYWlucyBpdCBjYW4ndCBiZSB1c2VkIGFzIGFuIGluZGV4IHR5cGUuXG4gKi9cbmNvbnN0IGlzUHJvcGVydHlLZXkgPSBrZXkgPT4ge1xuICBzd2l0Y2ggKHR5cGVvZiBrZXkpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogU3luY2hyb25vdXNseSBjYWxsIGEgY2FsbGJhY2suXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHBhcmFtIHtTeW5jQ2FsbGJhY2s8ST59IGNhbGxiYWNrXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPEk+fVxuICovXG4gICAgICAgY29uc3QgY2FsbFN5bmMgPSAoY2FsbGJhY2ssIC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kIH0gPSBjYWxsYmFjaztcbiAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0YXJnZXQoLi4uYm91bmQsIC4uLmFyZ3MpO1xuICB9XG4gIHJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oLi4uYm91bmQsIC4uLmFyZ3MpO1xufTskaM2PX29uY2UuY2FsbFN5bmMoY2FsbFN5bmMpO1xuaGFyZGVuKGNhbGxTeW5jKTtcblxuLyoqXG4gKiBFdmVudHVhbCBzZW5kIHRvIGEgY2FsbGJhY2suXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHBhcmFtIHtDYWxsYmFjazxJPn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPEk+Pj59XG4gKi9cbiAgICAgICBjb25zdCBjYWxsRSA9IChjYWxsYmFjaywgLi4uYXJncykgPT4ge1xuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIEUodGFyZ2V0KSguLi5ib3VuZCwgLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIEUodGFyZ2V0KVttZXRob2ROYW1lXSguLi5ib3VuZCwgLi4uYXJncyk7XG59OyRozY9fb25jZS5jYWxsRShjYWxsRSk7XG5oYXJkZW4oY2FsbEUpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPn0gW1Q9SV1cbiAqIEB0ZW1wbGF0ZSB7YW55W119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sgPSAodGFyZ2V0LCAuLi5ib3VuZCkgPT4ge1xuICB0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nIHx8XG4gICAgRmFpbGBzeW5jIGZ1bmN0aW9uIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGEgZnVuY3Rpb246ICR7dGFyZ2V0fWA7XG4gIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgY29uc3QgY2IgPSBoYXJkZW4oeyB0YXJnZXQsIGJvdW5kLCBpc1N5bmM6IHRydWUgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge1N5bmNDYWxsYmFjazxJPn0gKi8gKGNiKTtcbn07JGjNj19vbmNlLm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayhtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIHBvdGVudGlhbGx5IGZhciBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge0VSZWY8KC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPj59IFtUPUVSZWY8ST5dXG4gKiBAdGVtcGxhdGUge2FueVtdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7Q2FsbGJhY2s8ST59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRnVuY3Rpb25DYWxsYmFjayA9ICh0YXJnZXQsIC4uLmJvdW5kKSA9PiB7XG4gICFpc1ByaW1pdGl2ZSh0YXJnZXQpIHx8XG4gICAgRmFpbGBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uIHByZXNlbmNlOiAke3RhcmdldH1gO1xuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBib3VuZCB9KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7Q2FsbGJhY2s8ST59ICovIChjYik7XG59OyRozY9fb25jZS5tYWtlRnVuY3Rpb25DYWxsYmFjayhtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZUZ1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIG1ldGhvZC5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge3tcbiAqICAgW3ggaW4gUF06ICguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST47XG4gKiB9fSBbVD17IFt4IGluIFBdOiBJIH1dXG4gKiBAdGVtcGxhdGUge2FueVtdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3luY01ldGhvZENhbGxiYWNrID0gKHRhcmdldCwgbWV0aG9kTmFtZSwgLi4uYm91bmQpID0+IHtcbiAgIWlzUHJpbWl0aXZlKHRhcmdldCkgfHxcbiAgICBGYWlsYHN5bmMgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbiAgdHlwZW9mIG1ldGhvZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKSB8fFxuICAgIEZhaWxgbWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBwYXNzYWJsZSBzeW1ib2w6ICR7bWV0aG9kTmFtZX1gO1xuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCwgaXNTeW5jOiB0cnVlIH0pO1xuICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovIChjYik7XG59OyRozY9fb25jZS5tYWtlU3luY01ldGhvZENhbGxiYWNrKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgbWV0aG9kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IFBcbiAqIEB0ZW1wbGF0ZSB7RVJlZjx7XG4gKiAgIFt4IGluIFBdOiAoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+O1xuICogfT59IFtUPUVSZWY8eyBbeCBpbiBQXTogSSB9Pl1cbiAqIEB0ZW1wbGF0ZSB7YW55W119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UH0gbWV0aG9kTmFtZVxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge0NhbGxiYWNrPEk+fVxuICovXG4gICAgICAgY29uc3QgbWFrZU1ldGhvZENhbGxiYWNrID0gKHRhcmdldCwgbWV0aG9kTmFtZSwgLi4uYm91bmQpID0+IHtcbiAgIWlzUHJpbWl0aXZlKHRhcmdldCkgfHxcbiAgICBGYWlsYG1ldGhvZCBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3Q6ICR7dGFyZ2V0fWA7XG4gIHR5cGVvZiBtZXRob2ROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgIGlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkgfHxcbiAgICBGYWlsYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge0NhbGxiYWNrPEk+fSAqLyAoY2IpO1xufTskaM2PX29uY2UubWFrZU1ldGhvZENhbGxiYWNrKG1ha2VNZXRob2RDYWxsYmFjayk7XG5oYXJkZW4obWFrZU1ldGhvZENhbGxiYWNrKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtjYWxsYmFjayBpcyBDYWxsYmFjazxhbnk+fVxuICovXG4gICAgICAgY29uc3QgaXNDYWxsYmFjayA9IGNhbGxiYWNrID0+IHtcbiAgaWYgKGlzUHJpbWl0aXZlKGNhbGxiYWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICByZXR1cm4gKFxuICAgICFpc1ByaW1pdGl2ZSh0YXJnZXQpICYmXG4gICAgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdHlwZW9mIG1ldGhvZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICBpc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpKSAmJlxuICAgIEFycmF5LmlzQXJyYXkoYm91bmQpXG4gICk7XG59OyRozY9fb25jZS5pc0NhbGxiYWNrKGlzQ2FsbGJhY2spO1xuaGFyZGVuKGlzQ2FsbGJhY2spO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciBjbGFzcyB3aG9zZSBtZXRob2RzIGNhbiBiZSByZWRpcmVjdGVkIHZpYSBjYWxsYmFja3MuXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gTVxuICogQHBhcmFtIHtab25lfSB6b25lIFRoZSB6b25lIGluIHdoaWNoIHRvIGFsbG9jYXRlIGF0dGVudWF0b3JzLlxuICogQHBhcmFtIHtNW119IG1ldGhvZE5hbWVzIE1ldGhvZHMgdG8gZm9yd2FyZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkPHtcbiAqICAgW0sgaW4gTV06IE1ldGhvZEd1YXJkO1xuICogfT59IFtvcHRzLmludGVyZmFjZUd1YXJkXVxuICogICBBbiBpbnRlcmZhY2UgZ3VhcmQgZm9yIHRoZSBuZXcgYXR0ZW51YXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy50YWddIEEgdGFnIGZvciB0aGUgbmV3IGF0dGVudWF0b3IgZXhvQ2xhc3MuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlQXR0ZW51YXRvciA9IChcbiAgem9uZSxcbiAgbWV0aG9kTmFtZXMsXG4gIHsgaW50ZXJmYWNlR3VhcmQsIHRhZyA9ICdBdHRlbnVhdG9yJyB9ID0ge30sXG4pID0+IHtcbiAgLyoqXG4gKiBAdHlwZWRlZiB7KHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pID0+IGFueX0gTWV0aG9kXG4gKlxuICogQHR5cGVkZWYge3sgW0sgaW4gTV0/OiBDYWxsYmFjazxhbnk+IHwgbnVsbCB9fSBPdmVycmlkZXNcbiAqXG4gKiBAdHlwZWRlZiB7eyBbSyBpbiBNXTogKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pID0+IGFueSB9fSBNZXRob2RzXG4gKi9cbiAgY29uc3QgbWV0aG9kcyA9IC8qKiBAdHlwZSB7TWV0aG9kc30gKi8gKFxuICAgIGZyb21FbnRyaWVzKFxuICAgICAgbWV0aG9kTmFtZXMubWFwKGtleSA9PiB7XG4gICAgICAgIC8qIE9ubHkgYWxsb3cgdGhlIGBQcm9wZXJ0eUtleWAgdHlwZSBmb3IgdGhlIHRhcmdldCBtZXRob2Qga2V5LiovXG4gICAgICAgIGlmICghaXNQcm9wZXJ0eUtleShrZXkpKSB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBrZXkgJHtxKGtleSl9IGlzIG5vdCBhIFByb3BlcnR5S2V5YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG0gPSAvKiogQHR5cGUge01ldGhvZHN9ICovICh7XG4gICAgICAgICAgLyogRXhwbGljaXRseSB1c2UgY29uY2lzZSBtZXRob2Qgc3ludGF4IHRvIHByZXNlcnZlIGB0aGlzYCBidXQgcHJldmVudCovXG4gICAgICAgICAgLyogY29uc3RydWN0b3IgYmVoYXZpb3IuKi9cbiAgICAgICAgICAvKiogQHR5cGUge01ldGhvZH0gKi9cbiAgICAgICAgICBba2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICAvKiBTdXBwb3J0IGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jIGNhbGxiYWNrcy4qL1xuICAgICAgICAgICAgY29uc3QgY2IgPSB0aGlzLnN0YXRlLmNic1trZXldO1xuICAgICAgICAgICAgaWYgKCFjYikge1xuICAgICAgICAgICAgICBjb25zdCBlcnIgPSBtYWtlRXJyb3IoYHVuaW1wbGVtZW50ZWQgJHtxKHRhZyl9IG1ldGhvZCAke3Eoa2V5KX1gKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUuaXNTeW5jKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNiLmlzU3luYykge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbFN5bmMoY2IsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNhbGxFKGNiLCAuLi5hcmdzKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KVtrZXldO1xuICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtrZXksIG1dKTtcbiAgICAgIH0pLFxuICAgIClcbiAgKTtcblxuICAvKipcbiAqIENyZWF0ZSBhbiBleG8gb2JqZWN0IHdob3NlIGJlaGF2aW9yIGlzIGNvbXBvc2VkIGZyb20gYSBkZWZhdWx0IHRhcmdldFxuICogYW5kL29yIGluZGl2aWR1YWwgbWV0aG9kIG92ZXJyaWRlIGNhbGxiYWNrcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHt1bmtub3dufSBbb3B0cy50YXJnZXRdIFRoZSB0YXJnZXQgZm9yIGFueSBtZXRob2RzIHRoYXQgd2VyZW4ndFxuICogICBzcGVjaWZpZWQgaW4gYG9wdHMub3ZlcnJpZGVzYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaXNTeW5jPWZhbHNlXSBXaGV0aGVyIHRoZSB0YXJnZXQgc2hvdWxkIGJlIHRyZWF0ZWRcbiAqICAgYXMgc3luY2hyb25vdXNseSBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge092ZXJyaWRlc30gW29wdHMub3ZlcnJpZGVzXSBTZXQgaW5kaXZpZHVhbCBjYWxsYmFja3MgZm9yIG1ldGhvZHNcbiAqICAgKHdob3NlIG5hbWVzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgYHByZXBhcmVBdHRlbnVhdG9yYCBvclxuICogICBgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yYCBjYWxsKS4gTnVsbGlzaCBvdmVycmlkZXMgbWVhbiB0byB0aHJvdy5cbiAqL1xuICBjb25zdCBtYWtlQXR0ZW51YXRvciA9IHpvbmUuZXhvQ2xhc3MoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIC8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7YW55fSBbb3B0cy50YXJnZXRdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmlzU3luY11cbiAqIEBwYXJhbSB7T3ZlcnJpZGVzfSBbb3B0cy5vdmVycmlkZXNdXG4gKi9cbiAgICAoe1xuICAgICAgdGFyZ2V0ID0gbnVsbCxcbiAgICAgIGlzU3luYyA9IGZhbHNlLFxuICAgICAgb3ZlcnJpZGVzID0gLyoqIEB0eXBlIHtPdmVycmlkZXN9ICovICh7fSksXG4gICAgfSkgPT4ge1xuICAgICAgY29uc3QgY2JzID0gLyoqIEB0eXBlIHtPdmVycmlkZXN9ICovICh7fSk7XG5cbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBTZXQobWV0aG9kTmFtZXMpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Ygb3duS2V5cyhvdmVycmlkZXMpKSB7XG4gICAgICAgIHJlbWFpbmluZy5oYXMoa2V5KSB8fFxuICAgICAgICAgIEZhaWxgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIG5vdCBhbGxvd2VkIGJ5IG1ldGhvZE5hbWVzYDtcblxuICAgICAgICByZW1haW5pbmcuZGVsZXRlKGtleSk7XG4gICAgICAgIGNvbnN0IGNiID0gb3ZlcnJpZGVzW2tleV07XG4gICAgICAgIGNiID09IG51bGwgfHxcbiAgICAgICAgICBpc0NhbGxiYWNrKGNiKSB8fFxuICAgICAgICAgIEZhaWxgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIGlzIG5vdCBhIGNhbGxiYWNrOyBnb3QgJHtjYn1gO1xuICAgICAgICBjYnNba2V5XSA9IGNiO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVtYWluaW5nKSB7XG4gICAgICAgIGlmIChpc1N5bmMpIHtcbiAgICAgICAgICBjYnNba2V5XSA9IG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2sodGFyZ2V0LCBrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNic1trZXldID0gbWFrZU1ldGhvZENhbGxiYWNrKHRhcmdldCwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGhhcmRlbih7IGNicywgaXNTeW5jIH0pO1xuICAgIH0sXG4gICAgLyoqIEB0eXBlIHtNZXRob2RzfSAqLyAobWV0aG9kcyksXG4gICk7XG4gIHJldHVybiBtYWtlQXR0ZW51YXRvcjtcbn07JGjNj19vbmNlLnByZXBhcmVBdHRlbnVhdG9yKHByZXBhcmVBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlQXR0ZW51YXRvcik7XG5cbi8qKlxuICogUHJlcGFyZSBhbiBhdHRlbnVhdG9yIHdob3NlIG1ldGhvZE5hbWVzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGludGVyZmFjZUd1YXJkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7SW50ZXJmYWNlR3VhcmR9IEdcbiAqIEBwYXJhbSB7Wm9uZX0gem9uZVxuICogQHBhcmFtIHtHfSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLnRhZ11cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciA9ICh6b25lLCBpbnRlcmZhY2VHdWFyZCwgb3B0cyA9IHt9KSA9PiB7XG4gIGNvbnN0IG1ldGhvZE5hbWVzID0gZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyhpbnRlcmZhY2VHdWFyZCk7XG4gIGNvbnN0IG1ha2VBdHRlbnVhdG9yID0gcHJlcGFyZUF0dGVudWF0b3Ioem9uZSwgbWV0aG9kTmFtZXMsIHtcbiAgICAuLi5vcHRzLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICB9KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7TWFrZUF0dGVudWF0b3I8YW55Pn0gKi8gKG1ha2VBdHRlbnVhdG9yKTtcbn07JGjNj19vbmNlLnByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xuaGFyZGVuKHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYWxsU3luYyI6WyJjYWxsU3luYyJdLCJjYWxsRSI6WyJjYWxsRSJdLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siOlsibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VGdW5jdGlvbkNhbGxiYWNrIjpbIm1ha2VGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siOlsibWFrZVN5bmNNZXRob2RDYWxsYmFjayJdLCJtYWtlTWV0aG9kQ2FsbGJhY2siOlsibWFrZU1ldGhvZENhbGxiYWNrIl0sImlzQ2FsbGJhY2siOlsiaXNDYWxsYmFjayJdLCJwcmVwYXJlQXR0ZW51YXRvciI6WyJwcmVwYXJlQXR0ZW51YXRvciJdLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiOlsicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKM2T6b1BAAA9QQAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2xpLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJ0b0NMSU9wdGlvbnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nLWtleWVkIG9iamVjdCBpbnRvIGFuIGFycmF5IG9mIENMSSBvcHRpb25zLCB1c2luZyBlYWNoIGtleSBhc1xuICogdGhlIG5hbWUgb2YgYSBHTlUtc3R5bGUgbG9uZyBvcHRpb24gYC0tJHtrZXl9YCwgaWdub3JpbmcgZWFjaCBrZXkgd2l0aCBhblxuICogdW5kZWZpbmVkIHZhbHVlIGFuZCBjb252ZXJ0aW5nIGJvb2xlYW4gdmFsdWVzIGludG8gbm8tYXJndW1lbnQgYC0tJHtrZXl9YCBvclxuICogYC0tbm8tJHtrZXl9YCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5kZWZpbmVkIHwgYm9vbGVhbiB8IHN0cmluZyB8IHN0cmluZ1tdPn0gcmVjb3JkIC1cbiAqICAgZS5nLiB7IGNvbG9yOiAnYmx1ZScgfVxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIGUuZy4gWyctLWNvbG9yJywgJ2JsdWUnXVxuICovXG4gICAgICAgY29uc3QgdG9DTElPcHRpb25zID0gcmVjb3JkID0+XG4gIE9iamVjdC5lbnRyaWVzKHJlY29yZCkuZmxhdE1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiBbYC0tJHtrZXl9YF07XG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkgcmV0dXJuIFtgLS1uby0ke2tleX1gXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8qIFJlcHJlc2VudCBhcyBhIHJlcGVhdGVkIG9wdGlvbi4qL1xuICAgICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAodiA9PiBbYC0tJHtrZXl9YCwgdl0pO1xuICAgIH1cbiAgICByZXR1cm4gW2AtLSR7a2V5fWAsIHZhbHVlXTtcbiAgfSk7JGjNj19vbmNlLnRvQ0xJT3B0aW9ucyh0b0NMSU9wdGlvbnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidG9DTElPcHRpb25zIjpbInRvQ0xJT3B0aW9ucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABtDXgVygwAAMoMAAAlAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NvbmZpZy5qc3siaW1wb3J0cyI6WyIuL2tleU1pcnJvci5qcyJdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQiLCJWQmFua0FjY291bnQiLCJXYWxsZXROYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQga2V5TWlycm9yOyRozY9faW1wb3J0cyhbW1wiLi9rZXlNaXJyb3IuanNcIiwgW1tcImtleU1pcnJvclwiLFskaM2PX2EgPT4gKGtleU1pcnJvciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGZpbGVcbiAqXG4gKiAgIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiAgIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAgYW5kIG91ciBsYXggcGFja2FnZVxuICogICBkZXBlbmRlbmN5IGdyYXBoLCBzb21ldGltZXMgcmF0aW9uYWwgcGxhY2VtZW50cyBjYXVzZSB0eXBlIHJlc29sdXRpb25cbiAqICAgZXJyb3JzLlxuICpcbiAqICAgU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZVxuICogICBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIENsdXN0ZXJOYW1lIHNwZWNpZmllcyBhIGNvbGxlY3Rpb24gb2YgbmV0d29ya3MuIFRoZSBzcGVjaWZpYyBuZXR3b3Jrc1xuICogYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBuYW1lIG1heSB2YXJ5IGZyb20gY29udGV4dCB0byBjb250ZXh0LCBhbmQgbWF5XG4gKiBhbHNvIG92ZXJsYXAgKGUuZy4gYSBcImxvY2FsXCIgY2x1c3RlciBtYXkgY29ubmVjdCB0byB0aGUgc2FtZSByZW1vdGUgbmV0d29ya3NcbiAqIGFzIGEgXCJ0ZXN0bmV0XCIgY2x1c3RlciksIGJ1dCB0aGlzIHR5cGUgbmV2ZXJ0aGVsZXNzIHN1cHBvcnRzIGNyb3NzLXBhY2thZ2VcbiAqIGNvb3JkaW5hdGlvbiB3aGVyZSB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBzdGF0aWMgbGFiZWxzIGFyZSBzdWJqZWN0IHRvXG4gKiBjaG9pY2Ugb2YgY2x1c3Rlci4gU29tZSBleGFtcGxlczpcbiAqXG4gKiAtIHRoZSBjaGFpbiBJRCBmb3IgYSBzdGF0aWMgbGFiZWwgbGlrZSBcIkFnb3JpY1wiIG9yIFwiRXRoZXJldW1cIlxuICogLSB0aGUgY3J5cHRvZ3JhcGhpYyBoYXNoIGZvciBhIHN0YXRpYyBsYWJlbCBsaWtlIFwiQkxEXCIgb3IgXCJVU0RDXCJcbiAqIC0gdGhlIFVSTCBmb3IgYSBzZXJ2aWNlIGxpa2UgXCJBZ29yaWMgUlBDXCIgb3IgXCJBeGVsYXJcIiBvciBcIlNwZWN0cnVtXCJcbiAqXG4gKiBcIm1haW5uZXRcIiBzaG91bGQgYWx3YXlzIGluY2x1ZGUgdGhlIEFnb3JpYyBuZXR3b3JrIGRlc2NyaWJlZCBieVxuICogaHR0cHM6Ly9tYWluLmFnb3JpYy5uZXQvbmV0d29yay1jb25maWcgcmF0aGVyIHRoYW4gc29tZSBvdGhlciBhbHRlcm5hdGl2ZS5cbiAqXG4gKiBYWFggVGhpcyBhY3R1YWxseSBiZWxvbmdzIHNvbWV3aGVyZSBlbHNlLCBwb3NzaWJseSB3aXRoIHJlZmFjdG9yaW5nLlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMTIxODUjZGlzY3Vzc2lvbl9yMjUwMDEyMzIyNlxuICpcbiAqIEB0eXBlZGVmIHsnbG9jYWwnIHwgJ3Rlc3RuZXQnIHwgJ21haW5uZXQnfSBDbHVzdGVyTmFtZVxuICovXG5cbi8qKlxuICogRXZlbnQgc291cmNlIGlkcyB1c2VkIGJ5IHRoZSBicmlkZ2UgZGV2aWNlLlxuICpcbiAqIEBlbnVtIHsodHlwZW9mIEJyaWRnZUlkKVtrZXlvZiB0eXBlb2YgQnJpZGdlSWRdfVxuICovXG4gICAgICAgY29uc3QgQnJpZGdlSWQgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBCQU5LOiAnYmFuaycsXG4gIENPUkU6ICdjb3JlJyxcbiAgRElCQzogJ2RpYmMnLFxuICBTVE9SQUdFOiAnc3RvcmFnZScsXG4gIFBST1ZJU0lPTjogJ3Byb3Zpc2lvbicsXG4gIFBST1ZJU0lPTl9TTUFSVF9XQUxMRVQ6ICdwcm92aXNpb25XYWxsZXQnLFxuICBWTE9DQUxDSEFJTjogJ3Zsb2NhbGNoYWluJyxcbiAgVlRSQU5TRkVSOiAndnRyYW5zZmVyJyxcbiAgV0FMTEVUOiAnd2FsbGV0Jyxcbn0pOyRozY9fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5oYXJkZW4oQnJpZGdlSWQpO1xuXG4vKiogQHNhdGlzZmllcyB7UmVjb3JkPHN0cmluZywgQnJpZGdlSWQ+fSAqL1xuICAgICAgIGNvbnN0IENvc21vc0luaXRLZXlUb0JyaWRnZUlkID0ge1xuICB2YmFua1BvcnQ6ICdiYW5rJyxcbiAgdmliY1BvcnQ6ICdkaWJjJyxcbn07JGjNj19vbmNlLkNvc21vc0luaXRLZXlUb0JyaWRnZUlkKENvc21vc0luaXRLZXlUb0JyaWRnZUlkKTtcbmhhcmRlbihDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCk7XG5cbiAgICAgICBjb25zdCBXYWxsZXROYW1lID0ga2V5TWlycm9yKHtcbiAgZGVwb3NpdEZhY2V0OiBudWxsLFxufSk7JGjNj19vbmNlLldhbGxldE5hbWUoV2FsbGV0TmFtZSk7XG5oYXJkZW4oV2FsbGV0TmFtZSk7XG5cbi8qIGRlZmluZWQgaW4gZ29sYW5nL2Nvc21vcy94L3ZiYW5rKi9cbiAgICAgICBjb25zdCBWQmFua0FjY291bnQgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICByZXNlcnZlOiB7XG4gICAgbW9kdWxlOiAndmJhbmsvcmVzZXJ2ZScsXG4gICAgYWRkcmVzczogJ2Fnb3JpYzFhZTBsbXR6bGdyY25sYTl4amtwYWFycTVkNWRmZXo2M2gzbnVjbCcsXG4gIH0sXG4gIHByb3Zpc2lvbjoge1xuICAgIG1vZHVsZTogJ3ZiYW5rL3Byb3Zpc2lvbicsXG4gICAgYWRkcmVzczogJ2Fnb3JpYzFtZWd6eXRnNjVjeXJnenM2ZnZ6eGdyY3F2d3dsN3VncHQ2MjM0NicsXG4gIH0sXG59KTskaM2PX29uY2UuVkJhbmtBY2NvdW50KFZCYW5rQWNjb3VudCk7XG5oYXJkZW4oVkJhbmtBY2NvdW50KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyaWRnZUlkIjpbIkJyaWRnZUlkIl0sIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIjpbIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIl0sIldhbGxldE5hbWUiOlsiV2FsbGV0TmFtZSJdLCJWQmFua0FjY291bnQiOlsiVkJhbmtBY2NvdW50Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI29pgGuCAAArggAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvZGVidWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VUcmFjZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQGplc3NpZS1jaGVjayovXG5cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzExODQ0Ki9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzExODQ1Ki9cbmxldCBkZWJ1Z0luc3RhbmNlID0gMTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8ICd2ZXJib3NlJ30gZW5hYmxlXG4gKi9cbiAgICAgICBjb25zdCBtYWtlVHJhY2VyID0gKGxhYmVsLCBlbmFibGUgPSB0cnVlKSA9PiB7XG4gIGNvbnN0IHN1YiA9IChzdWJMYWJlbCwgc3ViRW5hYmxlID0gZW5hYmxlKSA9PlxuICAgIG1ha2VUcmFjZXIoYCR7bGFiZWx9LiR7c3ViTGFiZWx9YCwgc3ViRW5hYmxlKTtcbiAgY29uc3Qga2V5ID0gYC0tLS0tICR7bGFiZWx9LCR7ZGVidWdJbnN0YW5jZX0gYDtcbiAgZGVidWdJbnN0YW5jZSArPSAxO1xuICAvKiB0aGUgY2FzZXMgYmVsb3cgZGVmaW5lIGEgbmFtZWQgdmFyaWFibGUgdG8gcHJvdmlkZSBiZXR0ZXIgZGVidWcgaW5mbyovXG4gIHN3aXRjaCAoZW5hYmxlKSB7XG4gICAgY2FzZSBmYWxzZToge1xuICAgICAgY29uc3QgbG9nRGlzYWJsZWQgPSAoLi4uX2FyZ3MpID0+IHt9O1xuICAgICAgcmV0dXJuIGhhcmRlbihPYmplY3QuYXNzaWduKGxvZ0Rpc2FibGVkLCB7IHN1YiB9KSk7XG4gICAgfVxuICAgIGNhc2UgJ3ZlcmJvc2UnOiB7XG4gICAgICBjb25zdCBpbmZvVGljayA9IChvcHRMb2csIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgLyogWFhYIFNuaWZmIHRlc3RzIHN1Y2ggYXMgdGhpcyBhcmUgaW5oZXJlbnRseSB1bnJlbGlhYmxlIGFuZCBzbWVsbCBiYWQuKi9cbiAgICAgICAgLyogRXZlbiBhc2lkZSBmcm9tIHRoZSBzZWN1cml0eSBoYXphcmQgb2YqL1xuICAgICAgICAvKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzExODQ1Ki9cbiAgICAgICAgLyogYW4gb2JqZWN0IGludGVuZGVkIGFzIGEgbm9ybWFsIGxvZ2dpbmcgYXJndW1lbnQgbWF5IGFjY2lkZW50YWxseSovXG4gICAgICAgIC8qIHBhc3MgdGhpcyBzbmlmZiB0ZXN0LCBjYXVzaW5nIGNvbmZ1c2lvbi4qL1xuICAgICAgICBpZiAodHlwZW9mIG9wdExvZz8ubG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgLi4uYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgb3B0TG9nLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBoYXJkZW4oT2JqZWN0LmFzc2lnbihpbmZvVGljaywgeyBzdWIgfSkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBkZWJ1Z1RpY2sgPSAob3B0TG9nLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgIC8qIEFub3RoZXIgdW5yZWxpYWJsZSBzbmlmZiB0ZXN0IGxpa2UgdGhlIG9uZSBhYm92ZSovXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0TG9nPy5sb2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvcHRMb2cubG9nKGtleSwgLi4uYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgb3B0TG9nLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBoYXJkZW4oT2JqZWN0LmFzc2lnbihkZWJ1Z1RpY2ssIHsgc3ViIH0pKTtcbiAgICB9XG4gIH1cbn07JGjNj19vbmNlLm1ha2VUcmFjZXIobWFrZVRyYWNlcik7XG5oYXJkZW4obWFrZVRyYWNlcik7XG5cbi8qKlxuICogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VUcmFjZXI+fSBUcmFjZUxvZ2dlclxuICovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhY2VyIjpbIm1ha2VUcmFjZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsZPVjl4DAABeAwAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9lcnJvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiTm9uTnVsbGlzaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuICAgICAgIGNvbnN0IE5vbk51bGxpc2ggPSAodmFsLCBvcHREZXRhaWxzID0gYHVuZXhwZWN0ZWQgJHtxKHZhbCl9YCkgPT4ge1xuICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAvKiBUaGlzIGAhPSBudWxsYCBpZGlvbSBjaGVja3MgdGhhdCBgdmFsYCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuKi9cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIGFzc2VydC5mYWlsKG9wdERldGFpbHMpO1xufTskaM2PX29uY2UuTm9uTnVsbGlzaChOb25OdWxsaXNoKTtcbmhhcmRlbihOb25OdWxsaXNoKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Ik5vbk51bGxpc2giOlsiTm9uTnVsbGlzaCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABoHOwa/gQAAP4EAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY2xpLXV0aWxzLmpzIiwiLi9jb25maWcuanMiLCIuL2RlYnVnLmpzIiwiLi9lcnJvcnMuanMiLCIuL2pzLXV0aWxzLmpzIiwiLi9rZXlNaXJyb3IuanMiLCIuL21hcnNoYWwvcHVyZS1kYXRhLmpzIiwiLi9tZXRob2QtdG9vbHMuanMiLCIuL21ldHJpY3MuanMiLCIuL25hdHVyYWwtc29ydC5qcyIsIi4vc2VzLXV0aWxzLmpzIiwiLi90bXBEaXIuanMiLCIuL3R5cGVDaGVjay5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOlsiLi9jbGktdXRpbHMuanMiLCIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL2Vycm9ycy5qcyIsIi4vanMtdXRpbHMuanMiLCIuL2tleU1pcnJvci5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi9tZXRyaWNzLmpzIiwiLi9uYXR1cmFsLXNvcnQuanMiLCIuL3Nlcy11dGlscy5qcyIsIi4vdG1wRGlyLmpzIiwiLi90eXBlQ2hlY2suanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vY2xpLXV0aWxzLmpzXCIsIFtdXSxbXCIuL2NvbmZpZy5qc1wiLCBbXV0sW1wiLi9kZWJ1Zy5qc1wiLCBbXV0sW1wiLi9lcnJvcnMuanNcIiwgW11dLFtcIi4vanMtdXRpbHMuanNcIiwgW11dLFtcIi4va2V5TWlycm9yLmpzXCIsIFtdXSxbXCIuL21hcnNoYWwvcHVyZS1kYXRhLmpzXCIsIFtdXSxbXCIuL21ldGhvZC10b29scy5qc1wiLCBbXV0sW1wiLi9tZXRyaWNzLmpzXCIsIFtdXSxbXCIuL25hdHVyYWwtc29ydC5qc1wiLCBbXV0sW1wiLi9zZXMtdXRpbHMuanNcIiwgW11dLFtcIi4vdG1wRGlyLmpzXCIsIFtdXSxbXCIuL3R5cGVDaGVjay5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9tYXJzaGFsL3B1cmUtZGF0YS5qcyI6W1sicHVyZURhdGFNYXJzaGFsbGVyIiwicHVyZURhdGFNYXJzaGFsbGVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACq1a+NpiUAAKYlAAAnAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2pzLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJUUlVFIiwiZGVlcENvcHlKc29uYWJsZSIsImRlZXBNYXBPYmplY3QiLCJkZWZpbmVOYW1lIiwiZnJvbVR5cGVkRW50cmllcyIsImxvZ0xldmVscyIsIm1ha2VNZWFzdXJlU2Vjb25kcyIsIm9iamVjdE1hcE11dGFibGUiLCJwYXJ0aWFsTWFwIiwicHJvdmlkZUxhenlNYXAiLCJ0eXBlZEVudHJpZXMiLCJ0eXBlZE1hcCIsInVucHJlZml4ZWRQcm9wZXJ0aWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG4vKiBAamVzc2llLWNoZWNrKi9cbi8qKlxuICogQGZpbGUgUHVyZSBKYXZhU2NyaXB0IHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBidXQgbm90XG4gKiAgIGRlcGVuZGVudCB1cG9uIGEgaGFyZGVuZWQgZW52aXJvbm1lbnQuXG4gKi9cblxuY29uc3QgeyBkZWZpbmVQcm9wZXJ0eSB9ID0gT2JqZWN0O1xuXG4vKiogRm9yIG92ZXJyaWRpbmcgVHlwZVNjcmlwdCBpbmZlcnJpbmcgdGhlIHR5cGUgb2YgYHRydWVgIGFzIGJvb2xlYW4uICovXG4gICAgICAgY29uc3QgVFJVRSA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh0cnVlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7PE8gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gKiAgIG9iajogTyxcbiAqICkgPT4gRXhjbHVkZTxcbiAqICAgeyBbSyBpbiBrZXlvZiBPXTogSyBleHRlbmRzIHN0cmluZyA/IFtLLCBPW0tdXSA6IG5ldmVyIH1ba2V5b2YgT10sXG4gKiAgIHVuZGVmaW5lZFxuICogPltdfSBUeXBlZEVudHJpZXNcbiAqLyRozY9fb25jZS5UUlVFKFRSVUUpO1xuICAgICAgIGNvbnN0IHR5cGVkRW50cmllcyA9IC8qKiBAdHlwZSB7VHlwZWRFbnRyaWVzfSAqLyAoT2JqZWN0LmVudHJpZXMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8XG4gKiAgIGNvbnN0IEVudHJpZXMgZXh0ZW5kcyBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtQcm9wZXJ0eUtleSwgdW5rbm93bl0+LFxuICogPihcbiAqICAgZW50cmllczogRW50cmllcyxcbiAqICkgPT4geyBbRW50cnkgaW4gRW50cmllc1tudW1iZXJdIGFzIEVudHJ5WzBdXTogRW50cnlbMV0gfX0gRnJvbVR5cGVkRW50cmllc1xuICovJGjNj19vbmNlLnR5cGVkRW50cmllcyh0eXBlZEVudHJpZXMpO1xuICAgICAgIGNvbnN0IGZyb21UeXBlZEVudHJpZXMgPSAvKiogQHR5cGUge0Zyb21UeXBlZEVudHJpZXN9ICovIChcbiAgT2JqZWN0LmZyb21FbnRyaWVzXG4pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8QSBleHRlbmRzIHVua25vd25bXSwgVj4oXG4gKiAgIGFycjogQSxcbiAqICAgbWFwcGVyOiA8SyBleHRlbmRzIG51bWJlcj4oZWw6IEFbS10sIGlkeDogSywgYXJyOiBBKSA9PiBWLFxuICogKSA9PiBWW119IFR5cGVkTWFwXG4gKi8kaM2PX29uY2UuZnJvbVR5cGVkRW50cmllcyhmcm9tVHlwZWRFbnRyaWVzKTtcbiAgICAgICBjb25zdCB0eXBlZE1hcCA9IC8qKiBAdHlwZSB7VHlwZWRNYXB9ICovIChcbiAgRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUubWFwKVxuKTskaM2PX29uY2UudHlwZWRNYXAodHlwZWRNYXApO1xuXG4gICAgICAgY29uc3QgbG9nTGV2ZWxzID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtcbiAgJ2RlYnVnJyxcbiAgJ2xvZycsXG4gICdpbmZvJyxcbiAgJ3dhcm4nLFxuICAnZXJyb3InLFxuXSk7JGjNj19vbmNlLmxvZ0xldmVscyhsb2dMZXZlbHMpO1xuT2JqZWN0LmZyZWV6ZShsb2dMZXZlbHMpO1xuXG4vKiogQHR5cGVkZWYgeyh0eXBlb2YgbG9nTGV2ZWxzKVtrZXlvZiBsb2dMZXZlbHMgJiBudW1iZXJdfSBMb2dMZXZlbCAqL1xuXG4vKiogQHR5cGVkZWYge1BpY2s8Q29uc29sZSwgTG9nTGV2ZWw+fSBMaW1pdGVkQ29uc29sZSAqL1xuXG4vKipcbiAqIERlZXAtY29weSBhIHZhbHVlIGJ5IHJvdW5kLXRyaXBwaW5nIGl0IHRocm91Z2ggSlNPTiAod2hpY2ggZHJvcHNcbiAqIGZ1bmN0aW9uL3N5bWJvbC91bmRlZmluZWQgdmFsdWVzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vbi1lbnVtZXJhYmxlXG4gKiBhbmQvb3Igc3ltYm9sLWtleWVkLCBhbmQgcmVqZWN0cyBiaWdpbnQgdmFsdWVzKS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZVxuICogQHJldHVybnMge1R9XG4gKi9cbiAgICAgICBjb25zdCBkZWVwQ29weUpzb25hYmxlID0gdmFsdWUgPT4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPn0gT1xuICogQHRlbXBsYXRlIHtzdHJpbmcgJiBrZXlvZiBPfSBLXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHtPW0tdfSB2YWx1ZVxuICogQHBhcmFtIHtLIHwgdW5kZWZpbmVkfSBuYW1lXG4gKiBAcGFyYW0ge08gfCB1bmRlZmluZWR9IGNvbnRhaW5lclxuICogQHBhcmFtIHsodmFsdWU6IE9bS10sIG5hbWU6IHN0cmluZywgcmVjb3JkOiBPKSA9PiBPW0tdIHwgTX0gbWFwcGVyXG4gKiBAcmV0dXJucyB7T1tLXSB8IE0gfCB7IFtLMiBpbiBrZXlvZiBPW0tdXTogT1tLXVtLMl0gfCBNIH19XG4gKi8kaM2PX29uY2UuZGVlcENvcHlKc29uYWJsZShkZWVwQ29weUpzb25hYmxlKTtcbmNvbnN0IGRlZXBNYXBPYmplY3RJbnRlcm5hbCA9ICh2YWx1ZSwgbmFtZSwgY29udGFpbmVyLCBtYXBwZXIpID0+IHtcbiAgaWYgKGNvbnRhaW5lciAmJiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBtYXBwZWQgPSBtYXBwZXIodmFsdWUsIG5hbWUsIGNvbnRhaW5lcik7XG4gICAgaWYgKG1hcHBlZCAhPT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgbGV0IHdhc01hcHBlZCA9IGZhbHNlO1xuICBjb25zdCB2YWx1ZU9iaiA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSk7XG4gIC8qKlxuICogQHR5cGUgezxUIGV4dGVuZHMgdHlwZW9mIHZhbHVlLCBLMiBleHRlbmRzIHN0cmluZyAmIGtleW9mIFQ+KFxuICogICBlbnRyeTogW0syLCBUW0syXV0sXG4gKiApID0+IFtLMiwgVFtLMl0gfCBNXX1cbiAqL1xuICBjb25zdCBtYXBFbnRyeSA9IChbaW5uZXJOYW1lLCBpbm5lclZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IG1hcHBlZElubmVyVmFsdWUgPSBkZWVwTWFwT2JqZWN0SW50ZXJuYWwoXG4gICAgICBpbm5lclZhbHVlLFxuICAgICAgaW5uZXJOYW1lLFxuICAgICAgdmFsdWVPYmosXG4gICAgICBtYXBwZXIsXG4gICAgKTtcbiAgICB3YXNNYXBwZWQgfHw9IG1hcHBlZElubmVyVmFsdWUgIT09IGlubmVyVmFsdWU7XG4gICAgcmV0dXJuIFtpbm5lck5hbWUsIC8qKiBAdHlwZSB7YW55fSAqLyAobWFwcGVkSW5uZXJWYWx1ZSldO1xuICB9O1xuICBjb25zdCBtYXBwZWRFbnRyaWVzID0gdHlwZWRFbnRyaWVzKHZhbHVlT2JqKS5tYXAobWFwRW50cnkpO1xuXG4gIGlmICghd2FzTWFwcGVkKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3QgbWFwcGVkT2JqID0gZnJvbVR5cGVkRW50cmllcyhtYXBwZWRFbnRyaWVzKTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAobWFwcGVkT2JqKTtcbn07XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgdHJhdmVyc2VzIGEgcmVjb3JkIG9iamVjdCBzdHJ1Y3R1cmUsIGNhbGxpbmcgYSBtYXBwZXIgZnVuY3Rpb25cbiAqIGZvciBlYWNoIGVudW1lcmFibGUgc3RyaW5nLWtleWVkIHByb3BlcnR5IGFuZCByZXR1cm5pbmcgYSByZWNvcmQgY29tcG9zZWQgb2ZcbiAqIHRoZSByZXN1bHRzLiBJZiBub25lIG9mIHRoZSB2YWx1ZXMgYXJlIGNoYW5nZWQsIHRoZSBvcmlnaW5hbCBvYmplY3QgaXNcbiAqIHJldHVybmVkLCBtYWludGFpbmluZyBpdHMgaWRlbnRpdHkuXG4gKlxuICogV2hlbiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgYW4gb2JqZWN0LCBpdCBpcyBzZW50IHRvIHRoZSBtYXBwZXIgbGlrZSBhbnkgb3RoZXJcbiAqIHZhbHVlLCBhbmQgdGhlbiByZWN1cnNpdmVseSB0cmF2ZXJzZWQgdW5sZXNzIHJlcGxhY2VkIHdpdGggYSBkaXN0aW5jdCB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBPXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHtPfSBvYmpcbiAqIEBwYXJhbSB7PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgSyBleHRlbmRzIHN0cmluZyAmIGtleW9mIFQ+KFxuICogICB2YWx1ZTogVFtLXSxcbiAqICAgbmFtZTogSyxcbiAqICAgcmVjb3JkOiBULFxuICogKSA9PiBUW0tdIHwgTX0gbWFwcGVyXG4gKiBAcmV0dXJucyB7TyB8IHsgW0sgaW4ga2V5b2YgT106IEsgZXh0ZW5kcyBzdHJpbmcgPyBPW0tdIHwgTSA6IG5ldmVyIH19XG4gKi9cbiAgICAgICBjb25zdCBkZWVwTWFwT2JqZWN0ID0gKG9iaiwgbWFwcGVyKSA9PlxuICAvKiogQHR5cGUge2FueX0gKi8gKGRlZXBNYXBPYmplY3RJbnRlcm5hbChvYmosIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBtYXBwZXIpKTtcblxuLyoqXG4gKiBFeHBsaWNpdGx5IHNldCBhIGZ1bmN0aW9uJ3MgbmFtZSwgc3VwcG9ydGluZyB1c2Ugb2YgYXJyb3cgZnVuY3Rpb25zIGZvciB3aGljaFxuICogc291cmNlIHRleHQgZG9lc24ndCBpbmNsdWRlIGEgbmFtZSBhbmQgbm8gaW5pdGlhbCBuYW1lIGlzIHNldCBieVxuICogTmFtZWRFdmFsdWF0aW9uXG4gKiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi9tdWx0aXBhZ2Uvc3ludGF4LWRpcmVjdGVkLW9wZXJhdGlvbnMuaHRtbCNzZWMtcnVudGltZS1zZW1hbnRpY3MtbmFtZWRldmFsdWF0aW9uXG4gKlxuICogYG5hbWVgIGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgZm9yIGJldHRlciByZWFkYWJpbGl0eSBhdCBjYWxsIHNpdGVzIChlLmcuLFxuICogYHJldHVybiBkZWZpbmVOYW1lKCdmb28nLCAoKSA9PiB7IC4uLiB9KWApLlxuICpcbiAqIEB0ZW1wbGF0ZSB7RnVuY3Rpb259IEZcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Z9IGZuXG4gKiBAcmV0dXJucyB7Rn1cbiAqLyRozY9fb25jZS5kZWVwTWFwT2JqZWN0KGRlZXBNYXBPYmplY3QpO1xuICAgICAgIGNvbnN0IGRlZmluZU5hbWUgPSAobmFtZSwgZm4pID0+XG4gIGRlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHsgdmFsdWU6IG5hbWUgfSk7XG5cbi8qKlxuICogQnkgYW5hbG9neSB3aXRoIGhvdyBgQXJyYXkucHJvdG90eXBlLm1hcGAgd2lsbCBtYXAgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5XG4gKiB0byB0cmFuc2Zvcm1lZCBlbGVtZW50cyBvZiBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSwgYG9iamVjdE1hcE11dGFibGVgXG4gKiB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgZW51bWVyYWJsZSBzdHJpbmcta2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVW5saWtlIGVuZG8ncyBgb2JqZWN0TWFwYCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbm9uLWhhcmRlbmVkIG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBPXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHtPfSBvYmpcbiAqIEBwYXJhbSB7PEsgZXh0ZW5kcyBrZXlvZiBPPih2YWx1ZTogT1tLXSwga2V5OiBLKSA9PiBNfSBtYXBwZXJcbiAqIEByZXR1cm5zIHt7IFtLIGluIGtleW9mIE9dOiBLIGV4dGVuZHMgc3RyaW5nID8gTSA6IG5ldmVyIH19XG4gKi8kaM2PX29uY2UuZGVmaW5lTmFtZShkZWZpbmVOYW1lKTtcbiAgICAgICBjb25zdCBvYmplY3RNYXBNdXRhYmxlID0gKG9iaiwgbWFwcGVyKSA9PiB7XG4gIGNvbnN0IG9sZEVudHJpZXMgPSB0eXBlZEVudHJpZXMob2JqKTtcbiAgLyoqIEB0eXBlIHs8SyBleHRlbmRzIGtleW9mIE8+KGVudHJ5OiBbSywgT1tLXV0pID0+IFtLLCBNXX0gKi9cbiAgY29uc3QgbWFwRW50cnkgPSAoW2ssIHZdKSA9PiBbaywgbWFwcGVyKHYsIGspXTtcbiAgY29uc3QgbmV3RW50cmllcyA9IHR5cGVkTWFwKG9sZEVudHJpZXMsIG1hcEVudHJ5KTtcbiAgY29uc3QgbmV3T2JqID0gZnJvbVR5cGVkRW50cmllcyhuZXdFbnRyaWVzKTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAobmV3T2JqKTtcbn07XG5cbi8qKlxuICogTWFwIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheSB0byBuZXcgdmFsdWVzLCBza2lwcGluZyBlbGVtZW50cyBmb3Igd2hpY2ggdGhlXG4gKiBtYXBwaW5nIHJlc3VsdHMgaW4gZWl0aGVyIGB1bmRlZmluZWRgIG9yIGBmYWxzZWAuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAcGFyYW0ge1RbXX0gYXJyXG4gKiBAcGFyYW0geyh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyOiBUW10pID0+IFUgfCB1bmRlZmluZWQgfCBmYWxzZX0gbWFwT3JEcm9wXG4gKiBAcmV0dXJucyB7VVtdfVxuICovJGjNj19vbmNlLm9iamVjdE1hcE11dGFibGUob2JqZWN0TWFwTXV0YWJsZSk7XG4gICAgICAgY29uc3QgcGFydGlhbE1hcCA9IChhcnIsIG1hcE9yRHJvcCkgPT5cbiAgYXJyLnJlZHVjZSgocmVzdWx0cywgZWwsIGksIGFyckFyZykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IG1hcE9yRHJvcChlbCwgaSwgYXJyQXJnKTtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9LCAvKiogQHR5cGUge1VbXX0gKi8gKFtdKSk7XG5cbi8qKlxuICogUmV0dXJuIHRoZSB2YWx1ZSBmcm9tIGBtYXBgIGFzc29jaWF0ZWQgd2l0aCBga2V5YC4gSWYgdGhlcmUgaXMgbm90IHlldCBzdWNoIGFcbiAqIHZhbHVlLCBnZXQgb25lIGZyb20gYG1ha2VWYWx1ZShrZXkpYCBhbmQgdXBkYXRlIGBtYXBgIGJlZm9yZSByZXR1cm5pbmcgdGhlXG4gKiBuZXcgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1tLXSBleHRlbmRzIFtXZWFrS2V5XSA/IFdlYWtNYXA8SywgVj4gOiBNYXA8SywgVj59IG1hcFxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqLyRozY9fb25jZS5wYXJ0aWFsTWFwKHBhcnRpYWxNYXApO1xuICAgICAgIGNvbnN0IHByb3ZpZGVMYXp5TWFwID0gKG1hcCwga2V5LCBtYWtlVmFsdWUpID0+IHtcbiAgY29uc3QgZm91bmQgPSBtYXAuZ2V0KGtleSk7XG4gIGlmIChmb3VuZCAhPT0gdW5kZWZpbmVkIHx8IG1hcC5oYXMoa2V5KSkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1Z9ICovIChmb3VuZCk7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBtYWtlVmFsdWUoa2V5KTtcbiAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB1c2VzIGEgbWlsbGlzZWNvbmQtYmFzZWQgY3VycmVudC10aW1lIGNhcGFiaWxpdHlcbiAqIChzdWNoIGFzIGBwZXJmb3JtYW5jZS5ub3dgKSB0byBtZWFzdXJlIGV4ZWN1dGlvbiBkdXJhdGlvbiBvZiBhbiBhc3luY1xuICogZnVuY3Rpb24gYW5kIHJlcG9ydCB0aGUgcmVzdWx0IGluIHNlY29uZHMgdG8gbWF0Y2ggb3VyIHRlbGVtZXRyeSBzdGFuZGFyZC5cbiAqXG4gKiBAcGFyYW0geygpID0+IG51bWJlcn0gY3VycmVudFRpbWVNaWxsaXNlY1xuICovJGjNj19vbmNlLnByb3ZpZGVMYXp5TWFwKHByb3ZpZGVMYXp5TWFwKTtcbiAgICAgICBjb25zdCBtYWtlTWVhc3VyZVNlY29uZHMgPSBjdXJyZW50VGltZU1pbGxpc2VjID0+IHtcbiAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBmblxuICogQHJldHVybnMge1Byb21pc2U8eyByZXN1bHQ6IFQ7IGR1cmF0aW9uOiBudW1iZXIgfT59XG4gKi9cbiAgY29uc3QgbWVhc3VyZVNlY29uZHMgPSBhc3luYyBmbiA9PiB7XG4gICAgY29uc3QgdDAgPSBjdXJyZW50VGltZU1pbGxpc2VjKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oKTtcbiAgICBjb25zdCBkdXJhdGlvbk1pbGxpc2VjID0gY3VycmVudFRpbWVNaWxsaXNlYygpIC0gdDA7XG4gICAgcmV0dXJuIHsgcmVzdWx0LCBkdXJhdGlvbjogZHVyYXRpb25NaWxsaXNlYyAvIDEwMDAgfTtcbiAgfTtcbiAgcmV0dXJuIG1lYXN1cmVTZWNvbmRzO1xufTtcblxuLyoqXG4gKiBGaW5kIGFsbCBvZiBhbiBvYmplY3QncyBwcm9wZXJ0aWVzIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBwcmVmaXgsIGFuZFxuICogcmV0dXJuIGEgbmV3IG9iamVjdCBjb25zaXN0aW5nIG9mIHRob3NlIHByb3BlcnRpZXMgd2l0aG91dCB0aGF0IHByZWZpeC5cbiAqIFVzZWZ1bCBmb3IgZmlsdGVyaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxldmFudCB0byBhIHBhcnRpY3VsYXIgcHVycG9zZS5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gUFxuICogQHRlbXBsYXRlIHtzdHJpbmd9IEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1JlY29yZDxgJHtQfSR7S31gLCBWPn0gb2JqXG4gKiBAcGFyYW0ge1B9IHByZWZpeFxuICovJGjNj19vbmNlLm1ha2VNZWFzdXJlU2Vjb25kcyhtYWtlTWVhc3VyZVNlY29uZHMpO1xuICAgICAgIGNvbnN0IHVucHJlZml4ZWRQcm9wZXJ0aWVzID0gKG9iaiwgcHJlZml4KSA9PlxuICAvKiogQHR5cGUge1JlY29yZDxLLCBWPn0gKi8gKFxuICAgIGZyb21UeXBlZEVudHJpZXMoXG4gICAgICB0eXBlZEVudHJpZXMob2JqKVxuICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4ga2V5LnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpLCB2YWx1ZV0pLFxuICAgIClcbiAgKTskaM2PX29uY2UudW5wcmVmaXhlZFByb3BlcnRpZXModW5wcmVmaXhlZFByb3BlcnRpZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVFJVRSI6WyJUUlVFIl0sInR5cGVkRW50cmllcyI6WyJ0eXBlZEVudHJpZXMiXSwiZnJvbVR5cGVkRW50cmllcyI6WyJmcm9tVHlwZWRFbnRyaWVzIl0sInR5cGVkTWFwIjpbInR5cGVkTWFwIl0sImxvZ0xldmVscyI6WyJsb2dMZXZlbHMiXSwiZGVlcENvcHlKc29uYWJsZSI6WyJkZWVwQ29weUpzb25hYmxlIl0sImRlZXBNYXBPYmplY3QiOlsiZGVlcE1hcE9iamVjdCJdLCJkZWZpbmVOYW1lIjpbImRlZmluZU5hbWUiXSwib2JqZWN0TWFwTXV0YWJsZSI6WyJvYmplY3RNYXBNdXRhYmxlIl0sInBhcnRpYWxNYXAiOlsicGFydGlhbE1hcCJdLCJwcm92aWRlTGF6eU1hcCI6WyJwcm92aWRlTGF6eU1hcCJdLCJtYWtlTWVhc3VyZVNlY29uZHMiOlsibWFrZU1lYXN1cmVTZWNvbmRzIl0sInVucHJlZml4ZWRQcm9wZXJ0aWVzIjpbInVucHJlZml4ZWRQcm9wZXJ0aWVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACL1UtWsBwAArAcAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMva2V5TWlycm9yLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJrZXlNaXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cblxuY29uc3QgeyBmcmVlemUsIGVudHJpZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ICYgUmVjb3JkPEV4Y2x1ZGU8UHJvcGVydHlLZXksIHN0cmluZz4sIG5ldmVyPn0gSW5pdFxuICogQHR5cGVkZWYge3sgcmVhZG9ubHkgW0sgaW4ga2V5b2YgSW5pdF06IEsgfX0gS2V5TWlycm9yUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBNaXJyb3IgdGhlIGtleXMgb2YgYW4gb2JqZWN0IHRvIHN0cmluZyB2YWx1ZXMgdGhhdCBtYXRjaCB0aGUga2V5IG5hbWVzLiBUaGlzXG4gKiB3b3JrcyB3ZWxsIHRvIGRlZmluZSBhIFR5cGVTY3JpcHQgZW51bSB0eXBlIGNvbXBhdGlibGUgd2l0aCBlcmFzYWJsZSBzeW50YXg6XG4gKlxuICogICAgYEBlbnVtIHsodHlwZW9mIE15RW51bSlba2V5b2YgdHlwZW9mIE15RW51bV19YFxuICpcbiAqIFRoZSBwcm92aWRlZCByZWNvcmQgbXVzdCBvbmx5IG1hcCBwcm9wZXJ0eSBuYW1lcyB0byBlaXRoZXIgYG51bGxgIG9yIHRoZVxuICogcHJvcGVydHkgbmFtZSBpdHNlbGYuIFRoZSByZXR1cm5lZCBvYmplY3QgaGFzIGlkZW50aWNhbCBrZXlzIHdob3NlIHZhbHVlcyBhcmVcbiAqIHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUga2V5LlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gJiBSZWNvcmQ8RXhjbHVkZTxQcm9wZXJ0eUtleSwgc3RyaW5nPiwgbmV2ZXI+fSBJbml0XG4gKiBAcGFyYW0ge0luaXQgJiB7IHJlYWRvbmx5IFtLIGluIGtleW9mIEluaXRdOiBJbml0W0tdIGV4dGVuZHMgbnVsbCA/IG51bGwgOiBLIH19IHJlY29yZFxuICogQHJldHVybnMge0tleU1pcnJvclJlc3VsdDxJbml0Pn1cbiAqL1xuICAgICAgIGNvbnN0IGtleU1pcnJvciA9IHJlY29yZCA9PiB7XG4gIGlmIChyZWNvcmQgPT09IG51bGwgfHwgdHlwZW9mIHJlY29yZCAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2tleU1pcnJvciBleHBlY3RzIGEgcmVjb3JkIG9mIHN0cmluZyBrZXlzLicpO1xuICB9XG5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBtaXJyb3JlZCA9IHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFJlY29yZCBjb25mdXNlZCBieSBudWxsIHByb3RvdHlwZSovXG4gICAgX19wcm90b19fOiBudWxsLFxuICB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKHJlY29yZCkpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IGtleSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKFxuICAgICAgICBgVmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiIG11c3QgYmUgbnVsbCBvciB0aGUga2V5IHN0cmluZzsgZ290ICR7U3RyaW5nKHZhbHVlKX0uYCxcbiAgICAgICk7XG4gICAgfVxuICAgIG1pcnJvcmVkW2tleV0gPSBrZXk7XG4gIH1cbiAgcmV0dXJuIC8qKiBAdHlwZSB7S2V5TWlycm9yUmVzdWx0PEluaXQ+fSAqLyAoZnJlZXplKG1pcnJvcmVkKSk7XG59OyRozY9fb25jZS5rZXlNaXJyb3Ioa2V5TWlycm9yKTtcblxuZnJlZXplKGtleU1pcnJvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJrZXlNaXJyb3IiOlsia2V5TWlycm9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKVsHvRVLQAAVS0AAC8AAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbGliLWNoYWluU3RvcmFnZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wYXR0ZXJucyIsIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanMiLCIuL2NhbGxiYWNrLmpzIl0sImV4cG9ydHMiOlsiU3RyZWFtQ2VsbFNoYXBlIiwiYXNzZXJ0UGF0aFNlZ21lbnQiLCJpc1N0cmVhbUNlbGwiLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCIsIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCIsInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxFLEZhcixNLG1ha2VIZWFwWm9uZSxjYjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanNcIiwgW1tcIm1ha2VIZWFwWm9uZVwiLFskaM2PX2EgPT4gKG1ha2VIZWFwWm9uZSA9ICRozY9fYSldXV1dLFtcIi4vY2FsbGJhY2suanNcIiwgW1tcIipcIixbJGjNj19hID0+IChjYiA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VDaGFpblN0b3JhZ2VSb290LCduYW1lJyx7dmFsdWU6XCJtYWtlQ2hhaW5TdG9yYWdlUm9vdFwifSk7JGjNj19vbmNlLm1ha2VDaGFpblN0b3JhZ2VSb290KG1ha2VDaGFpblN0b3JhZ2VSb290KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVN0b3JhZ2VOb2RlQ2hpbGQsJ25hbWUnLHt2YWx1ZTpcIm1ha2VTdG9yYWdlTm9kZUNoaWxkXCJ9KTskaM2PX29uY2UubWFrZVN0b3JhZ2VOb2RlQ2hpbGQobWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtNYXJzaGFsLCBQYXNzYWJsZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKiBAaW1wb3J0IHtSZW1vdGUsIEVSZW1vdGUsIFR5cGVkUGF0dGVybn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtFTWFyc2hhbGxlcn0gZnJvbSAnLi9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKiBAaW1wb3J0IHtDYWxsYmFja30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqIEB0eXBlZGVmIHtNYXJzaGFsPHVua25vd24+fSBNYXJzaGFsbGVyICovXG4vKiogQHR5cGVkZWYge1BpY2s8TWFyc2hhbGxlciwgJ2Zyb21DYXBEYXRhJz59IFVuc2VyaWFsaXplciAqL1xuXG4vKipcbiAqIERlZmluZWQgYnkgdnN0b3JhZ2VTdG9yZUtleSBpbiB2c3RvcmFnZS5nb1xuICpcbiAqIEB0eXBlZGVmIFZTdG9yYWdlS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVTdWJrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhUHJlZml4Qnl0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9EYXRhVmFsdWVdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIFN0cmVhbUNlbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBibG9ja0hlaWdodCBjb3JyZXNwb25kaW5nIHdpdGggdGhlIHdyaXRlIG9mIGB2YWx1ZXNgXG4gKiAgIChkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbmF0dXJhbCBudW1iZXIpXG4gKiBAcHJvcGVydHkge1RbXX0gdmFsdWVzXG4gKi9cblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48U3RyZWFtQ2VsbD59ICovXG4gICAgICAgY29uc3QgU3RyZWFtQ2VsbFNoYXBlID0gaGFyZGVuKHtcbiAgYmxvY2tIZWlnaHQ6IE0uc3RyaW5nKCksXG4gIHZhbHVlczogTS5hcnJheSgpLFxufSk7XG5cbi8qKlxuICogVGhpcyByZXByZXNlbnRzIGEgbm9kZSBpbiBhbiBJQVZMIHRyZWUuXG4gKlxuICogVGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB4L3ZzdG9yYWdlLCBhbiBBZ29yaWMgZXh0ZW5zaW9uIG9mIHRoZSBDb3Ntb3NcbiAqIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhc1xuICogICBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoXG4gKiAgIHN1YlBhdGg6IHN0cmluZyxcbiAqICAgb3B0aW9ucz86IHsgc2VxdWVuY2U/OiBib29sZWFuIH0sXG4gKiApID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi8kaM2PX29uY2UuU3RyZWFtQ2VsbFNoYXBlKFN0cmVhbUNlbGxTaGFwZSk7XG5cbmNvbnN0IENoYWluU3RvcmFnZU5vZGVJID0gTS5pbnRlcmZhY2UoJ1N0b3JhZ2VOb2RlJywge1xuICBzZXRWYWx1ZTogTS5jYWxsV2hlbihNLnN0cmluZygpKS5yZXR1cm5zKCksXG4gIGdldFBhdGg6IE0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG4gIGdldFN0b3JlS2V5OiBNLmNhbGxXaGVuKCkucmV0dXJucyhNLnJlY29yZCgpKSxcbiAgbWFrZUNoaWxkTm9kZTogTS5jYWxsKE0uc3RyaW5nKCkpXG4gICAgLm9wdGlvbmFsKE0uc3BsaXRSZWNvcmQoe30sIHsgc2VxdWVuY2U6IE0uYm9vbGVhbigpIH0sIHt9KSlcbiAgICAucmV0dXJucyhNLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKSksXG59KTtcblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGVyZmVjdCBoZXVyaXN0aWMgdG8gbmF2aWdhdGUgdGhlIG1pZ3JhdGlvbiBmcm9tIHZhbHVlIGNlbGxzIHRvXG4gKiBzdHJlYW0gY2VsbHMuIEF0IHRpbWUgb2Ygd3JpdGluZywgbm8gbGVnYWN5IGNlbGxzIGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgYVxuICogc3RyZWFtIGNlbGwsIGFuZCB3ZSBkbyBub3QgaW50ZW5kIHRvIGNyZWF0ZSBhbnkgbW9yZSBsZWdhY3kgdmFsdWUgY2VsbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IGNlbGxcbiAqIEByZXR1cm5zIHtjZWxsIGlzIFN0cmVhbUNlbGx9XG4gKi9cbiAgICAgICBjb25zdCBpc1N0cmVhbUNlbGwgPSBjZWxsID0+XG4gIGNlbGwgJiZcbiAgdHlwZW9mIGNlbGwgPT09ICdvYmplY3QnICYmXG4gIEFycmF5LmlzQXJyYXkoY2VsbC52YWx1ZXMpICYmXG4gIHR5cGVvZiBjZWxsLmJsb2NrSGVpZ2h0ID09PSAnc3RyaW5nJyAmJlxuICAvXjAkfF5bMS05XVswLTldKiQvLnRlc3QoY2VsbC5ibG9ja0hlaWdodCk7JGjNj19vbmNlLmlzU3RyZWFtQ2VsbChpc1N0cmVhbUNlbGwpO1xuaGFyZGVuKGlzU3RyZWFtQ2VsbCk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlXG4gKiAgIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGVcbiAqICAgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKiBUT0RPOiBGb3JtYWxpemUgc2VnbWVudCBjb25zdHJhaW50cy4qL1xuLyogTXVzdCBiZSBub25lbXB0eSBhbmQgZGlzYWxsb3cgKHVuZXNjYXBlZCkgYC5gLCBhbmQgZm9yIHNpbXBsaWNpdHkqL1xuLyogKGFuZCBmdXR1cmUgcG9zc2liaWxpdHkgb2YgZS5nLiBlc2NhcGluZykgd2UgY3VycmVudGx5IGxpbWl0IHRvKi9cbi8qIEFTQ0lJIGFscGhhbnVtZXJpYyBwbHVzIHVuZGVyc2NvcmUgYW5kIGRhc2guKi9cbi8qIFNob3VsZCByZW1haW4gY29uc2lzdGVudCB3aXRoIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS90eXBlcy9wYXRoX2tleXMuZ28qL1xuY29uc3QgcGF0aFNlZ21lbnRQYXR0ZXJuID0gL15bYS16QS1aMC05Xy1dezEsMTAwfSQvO1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcpID0+IHZvaWR9ICovXG4gICAgICAgY29uc3QgYXNzZXJ0UGF0aFNlZ21lbnQgPSBuYW1lID0+IHtcbiAgcGF0aFNlZ21lbnRQYXR0ZXJuLnRlc3QobmFtZSkgfHxcbiAgICBGYWlsYFBhdGggc2VnbWVudCBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgMSB0byAxMDAgY2hhcmFjdGVycyBsaW1pdGVkIHRvIEFTQ0lJIGFscGhhbnVtZXJpY3MsIHVuZGVyc2NvcmVzLCBhbmQvb3IgZGFzaGVzOiAke25hbWV9YDtcbn07JGjNj19vbmNlLmFzc2VydFBhdGhTZWdtZW50KGFzc2VydFBhdGhTZWdtZW50KTtcbmhhcmRlbihhc3NlcnRQYXRoU2VnbWVudCk7XG5cbi8qKlxuICogTXVzdCBtYXRjaCB0aGUgc3dpdGNoIGluIHZzdG9yYWdlLmdvIHVzaW5nIGB2c3RvcmFnZU1lc3NhZ2VgIHR5cGVcbiAqXG4gKiBAdHlwZWRlZiB7J2dldCdcbiAqICAgfCAnZ2V0U3RvcmVLZXknXG4gKiAgIHwgJ2hhcydcbiAqICAgfCAnY2hpbGRyZW4nXG4gKiAgIHwgJ2VudHJpZXMnXG4gKiAgIHwgJ3ZhbHVlcydcbiAqICAgfCAnc2l6ZSd9IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kXG4gKlxuICpcbiAqIEB0eXBlZGVmIHsnc2V0JyB8ICdzZXRXaXRob3V0Tm90aWZ5JyB8ICdhcHBlbmQnfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2RcbiAqXG4gKlxuICogQHR5cGVkZWYge1N0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kXG4gKiAgIHwgU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlTWV0aG9kfSBTdG9yYWdlTWVzc2FnZU1ldGhvZFxuICpcbiAqXG4gKiBAdHlwZWRlZiB7W3BhdGg6IHN0cmluZ119IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlQXJnc1xuICpcbiAqIEB0eXBlZGVmIHtbcGF0aDogc3RyaW5nLCB2YWx1ZT86IHN0cmluZyB8IG51bGxdfSBTdG9yYWdlRW50cnlcbiAqXG4gKiBAdHlwZWRlZiB7U3RvcmFnZUVudHJ5W119IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZUFyZ3NcbiAqXG4gKiBAdHlwZWRlZiB7e1xuICogICAgICAgbWV0aG9kOiBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZDtcbiAqICAgICAgIGFyZ3M6IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlQXJncztcbiAqICAgICB9XG4gKiAgIHwge1xuICogICAgICAgbWV0aG9kOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2Q7XG4gKiAgICAgICBhcmdzOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VBcmdzO1xuICogICAgIH19IFN0b3JhZ2VNZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1pvbmV9IHpvbmVcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlID0gem9uZSA9PiB7XG4gIC8qKlxuICogQ3JlYXRlIGEgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgc3RvcmFnZSBpbnRlcmZhY2UgYW5kIHBhdGguXG4gKlxuICogQHBhcmFtIHtDYWxsYmFjazwobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueT59IG1lc3NlbmdlciBhIGNhbGxiYWNrXG4gKiAgIGZvciBzZW5kaW5nIGEgc3RvcmFnZU1lc3NhZ2Ugb2JqZWN0IHRvIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9uIChjZi5cbiAqICAgZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VxdWVuY2VdIHNldCB2YWx1ZXMgd2l0aCBgYXBwZW5kYCBtZXNzYWdlc1xuICogICByYXRoZXIgdGhhbiBgc2V0YCBtZXNzYWdlcyBzbyB0aGUgYmFja2luZyBpbXBsZW1lbnRhdGlvbiBlbXBsb3lzIGFcbiAqICAgd3JhcHBpbmcgc3RydWN0dXJlIHRoYXQgcHJlc2VydmVzIGVhY2ggdmFsdWUgc2V0IHdpdGhpbiBhIHNpbmdsZSBibG9jay5cbiAqICAgQ2hpbGQgbm9kZXMgZGVmYXVsdCB0byBpbmhlcml0aW5nIHRoaXMgb3B0aW9uIGZyb20gdGhlaXIgcGFyZW50LlxuICogQHJldHVybnMge1N0b3JhZ2VOb2RlfVxuICovXG4gIGNvbnN0IG1ha2VDaGFpblN0b3JhZ2VOb2RlID0gem9uZS5leG9DbGFzcyhcbiAgICAnQ2hhaW5TdG9yYWdlTm9kZScsXG4gICAgQ2hhaW5TdG9yYWdlTm9kZUksXG4gICAgLyoqXG4gKiBAcGFyYW0ge0NhbGxiYWNrPChtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55Pn0gbWVzc2VuZ2VyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW5jZV1cbiAqL1xuICAgIChtZXNzZW5nZXIsIHBhdGgsIHsgc2VxdWVuY2UgPSBmYWxzZSB9ID0ge30pID0+IHtcbiAgICAgIGFzc2VydC50eXBlb2YocGF0aCwgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0LnR5cGVvZihzZXF1ZW5jZSwgJ2Jvb2xlYW4nKTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBwYXRoLCBtZXNzZW5nZXIsIHNlcXVlbmNlIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgZ2V0UGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucGF0aDtcbiAgICAgIH0sXG4gICAgICAvKipcbiAqIEBkZXByZWNhdGVkIHVzZSBnZXRQYXRoXG4gKiBAdHlwZSB7KCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleT59XG4gKi9cbiAgICAgIGFzeW5jIGdldFN0b3JlS2V5KCkge1xuICAgICAgICBjb25zdCB7IHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgcmV0dXJuIGNiLmNhbGxFKG1lc3Nlbmdlciwge1xuICAgICAgICAgIG1ldGhvZDogJ2dldFN0b3JlS2V5JyxcbiAgICAgICAgICBhcmdzOiBbcGF0aF0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICogQHR5cGUgeyhcbiAqICAgbmFtZTogc3RyaW5nLFxuICogICBjaGlsZE5vZGVPcHRpb25zPzogeyBzZXF1ZW5jZT86IGJvb2xlYW4gfSxcbiAqICkgPT4gU3RvcmFnZU5vZGV9XG4gKi9cbiAgICAgIG1ha2VDaGlsZE5vZGUobmFtZSwgY2hpbGROb2RlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc2VxdWVuY2UsIHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgYXNzZXJ0UGF0aFNlZ21lbnQobmFtZSk7XG4gICAgICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IHNlcXVlbmNlLCAuLi5jaGlsZE5vZGVPcHRpb25zIH07XG4gICAgICAgIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZShcbiAgICAgICAgICBtZXNzZW5nZXIsXG4gICAgICAgICAgYCR7cGF0aH0uJHtuYW1lfWAsXG4gICAgICAgICAgbWVyZ2VkT3B0aW9ucyxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICAvKiogQHR5cGUgeyh2YWx1ZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSAqL1xuICAgICAgYXN5bmMgc2V0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBzZXF1ZW5jZSwgcGF0aCwgbWVzc2VuZ2VyIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBhc3NlcnQudHlwZW9mKHZhbHVlLCAnc3RyaW5nJyk7XG4gICAgICAgIC8qKiBAdHlwZSB7U3RvcmFnZUVudHJ5fSAqL1xuICAgICAgICBsZXQgZW50cnk7XG4gICAgICAgIGlmICghc2VxdWVuY2UgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgZW50cnkgPSBbcGF0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW50cnkgPSBbcGF0aCwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNiLmNhbGxFKG1lc3Nlbmdlciwge1xuICAgICAgICAgIG1ldGhvZDogc2VxdWVuY2UgPyAnYXBwZW5kJyA6ICdzZXQnLFxuICAgICAgICAgIGFyZ3M6IFtlbnRyeV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLyogUG9zc2libGUgZXh0ZW5zaW9uczoqL1xuICAgICAgLyogKiBnZXRWYWx1ZSgpKi9cbiAgICAgIC8qICogZ2V0Q2hpbGROYW1lcygpIGFuZC9vciBtYWtlQ2hpbGROb2RlcygpKi9cbiAgICAgIC8qICogZ2V0TmFtZSgpKi9cbiAgICAgIC8qICogcmVjdXJzaXZlIGRlbGV0ZSovXG4gICAgICAvKiAqIGJhdGNoIG9wZXJhdGlvbnMqL1xuICAgICAgLyogKiBsb2NhbCBidWZmZXJpbmcgKHdpdGggZW5kLW9mLWJsb2NrIGNvbW1pdCkqL1xuICAgIH0sXG4gICk7XG4gIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZTtcbn07JGjNj19vbmNlLnByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKTtcblxuY29uc3QgbWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlID0gcHJlcGFyZUNoYWluU3RvcmFnZU5vZGUobWFrZUhlYXBab25lKCkpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGhlYXAtYmFzZWQgcm9vdCBzdG9yYWdlIG5vZGUgZm9yIGEgZ2l2ZW4gYmFja2luZyBmdW5jdGlvbiBhbmQgcm9vdFxuICogcGF0aC5cbiAqXG4gKiBAcGFyYW0geyhtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55fSBoYW5kbGVTdG9yYWdlTWVzc2FnZSBhIGZ1bmN0aW9uIGZvclxuICogICBzZW5kaW5nIGEgc3RvcmFnZU1lc3NhZ2Ugb2JqZWN0IHRvIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9uIChjZi5cbiAqICAgZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoXG4gKiBAcGFyYW0ge29iamVjdH0gW3Jvb3RPcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbcm9vdE9wdGlvbnMuc2VxdWVuY2VdIGVtcGxveSBhIHdyYXBwaW5nIHN0cnVjdHVyZSB0aGF0XG4gKiAgIHByZXNlcnZlcyBlYWNoIHZhbHVlIHNldCB3aXRoaW4gYSBzaW5nbGUgYmxvY2ssIGFuZCBkZWZhdWx0IGNoaWxkIG5vZGVzIHRvXG4gKiAgIGRvIHRoZSBzYW1lXG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbiAgaGFuZGxlU3RvcmFnZU1lc3NhZ2UsXG4gIHJvb3RQYXRoLFxuICByb290T3B0aW9ucyA9IHt9LFxuKSB7XG4gIGNvbnN0IG1lc3NlbmdlciA9IGNiLm1ha2VGdW5jdGlvbkNhbGxiYWNrKGhhbmRsZVN0b3JhZ2VNZXNzYWdlKTtcblxuICAvKiBVc2UgdGhlIGhlYXBab25lIGRpcmVjdGx5LiovXG4gIGNvbnN0IHJvb3ROb2RlID0gbWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlKG1lc3Nlbmdlciwgcm9vdFBhdGgsIHJvb3RPcHRpb25zKTtcbiAgcmV0dXJuIHJvb3ROb2RlO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHtTdG9yYWdlTm9kZX0gYW4gb2JqZWN0IHRoYXQgY29uZmlybXMgdG8gU3RvcmFnZU5vZGUgQVBJIGJ1dCBkb2VzXG4gKiAgIG5vdCBzdG9yZSBhbnl3aGVyZS5cbiAqL1xuY29uc3QgbWFrZU51bGxTdG9yYWdlTm9kZSA9ICgpID0+IHtcbiAgLyogWFhYIHJlLXVzZSBcIkNoYWluU3RvcmFnZVwiIG1ldGhvZHMgYWJvdmUgd2hpY2ggZG9uJ3QgYWN0dWFsbHkgZGVwZW5kIG9uIGNoYWlucyovXG4gIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbiAgICBGYXIoJ051bGxNZXNzZW5nZXInLCAoKSA9PiBudWxsKSxcbiAgICAnbnVsbCcsXG4gICk7XG59O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciByZXR1cm5pbmcgYSBzdG9yYWdlIG5vZGUgYXQgb3IgdW5kZXIgaXRzIGlucHV0LFxuICogZmFsbGluZyBiYWNrIHRvIGFuIGluZXJ0IG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0IGludGVyZmFjZSAoYnV0IGluY29tcGxldGVcbiAqIGJlaGF2aW9yKSB3aGVuIHRoYXQgaXMgdW5hdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtFUmVmPFJlbW90ZTxTdG9yYWdlTm9kZT4gfCBudWxsPn0gc3RvcmFnZU5vZGVSZWZcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGlsZE5hbWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlbW90ZTxTdG9yYWdlTm9kZT4+fVxuICovXG4gICAgICAgYXN5bmMgZnVuY3Rpb24gbWFrZVN0b3JhZ2VOb2RlQ2hpbGQoc3RvcmFnZU5vZGVSZWYsIGNoaWxkTmFtZSkge1xuICBjb25zdCBleGlzdGluZ1N0b3JhZ2VOb2RlID0gYXdhaXQgc3RvcmFnZU5vZGVSZWY7XG4gIGNvbnN0IHN0b3JhZ2VOb2RlID0gZXhpc3RpbmdTdG9yYWdlTm9kZSB8fCBtYWtlTnVsbFN0b3JhZ2VOb2RlKCk7XG4gIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkTmFtZSk7XG59XG5oYXJkZW4obWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG4vKiBUT0RPIGZpbmQgYSBiZXR0ZXIgbW9kdWxlIGZvciB0aGlzKi9cbi8qKlxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHsodmFsdWU6IFBhc3NhYmxlKSA9PiBQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICByZXR1cm4gYXN5bmMgdmFsdWUgPT4ge1xuICAgIGNvbnN0IG1hcnNoYWxsZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KG1hcnNoYWxsZWQpO1xuICAgIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkKTtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTdHJlYW1DZWxsU2hhcGUiOlsiU3RyZWFtQ2VsbFNoYXBlIl0sImlzU3RyZWFtQ2VsbCI6WyJpc1N0cmVhbUNlbGwiXSwiYXNzZXJ0UGF0aFNlZ21lbnQiOlsiYXNzZXJ0UGF0aFNlZ21lbnQiXSwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiOlsicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwibWFrZUNoYWluU3RvcmFnZVJvb3QiOlsibWFrZUNoYWluU3RvcmFnZVJvb3QiXSwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiOlsibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiXSwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSI6WyJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKSDz56xAwAAsQMAADAAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC9wdXJlLWRhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbInB1cmVEYXRhTWFyc2hhbGxlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NhcERhdGF9IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICovXG5cbi8qKiBAcGFyYW0ge0NhcERhdGE8dW5rbm93bj59IGNhcCAqL1xuY29uc3QgcmVqZWN0T0NhcCA9IGNhcCA9PiBGYWlsYCR7Y2FwfSBpcyBub3QgcHVyZSBkYXRhYDtcbiAgICAgICBjb25zdCBwdXJlRGF0YU1hcnNoYWxsZXIgPSBtYWtlTWFyc2hhbChyZWplY3RPQ2FwLCByZWplY3RPQ2FwLCB7XG4gIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnLFxufSk7JGjNj19vbmNlLnB1cmVEYXRhTWFyc2hhbGxlcihwdXJlRGF0YU1hcnNoYWxsZXIpO1xuaGFyZGVuKHB1cmVEYXRhTWFyc2hhbGxlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwdXJlRGF0YU1hcnNoYWxsZXIiOlsicHVyZURhdGFNYXJzaGFsbGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACvtEEXxDQAA8Q0AACsAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJiaW5kQWxsTWV0aG9kcyIsImdldE1ldGhvZE5hbWVzIiwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCByZWFsR2V0TWV0aG9kTmFtZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLFskaM2PX2EgPT4gKHJlYWxHZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAZmlsZSBtZXRob2QtdG9vbHMgdXNlIGR5bmFtaWMgcHJvcGVydHkgbG9va3VwLCB3aGljaCBpcyBub3RcbiAqICAgSmVzc2llLWNvbXBhdGlibGVcbiAqL1xuXG5jb25zdCB7IGNyZWF0ZSwgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qKlxuICogVE9ETyBDb25zb2xpZGF0ZSB3aXRoIHRoZSBgZ2V0TWV0aG9kTmFtZXNgIGluIGBAZW5kby9ldmVudHVhbC1zZW5kYFxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBgZ2V0TWV0aG9kTmFtZXNgIGZyb20gYEBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNgIGluc3RlYWQuXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBLXG4gKiBAcGFyYW0ge1JlY29yZDxLLCBhbnk+fSB2YWxcbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRNZXRob2ROYW1lcyA9IHZhbCA9PlxuICAvKiogQHR5cGUge0tbXX0gKi8gKHJlYWxHZXRNZXRob2ROYW1lcyh2YWwpKTskaM2PX29uY2UuZ2V0TWV0aG9kTmFtZXMoZ2V0TWV0aG9kTmFtZXMpO1xuaGFyZGVuKGdldE1ldGhvZE5hbWVzKTtcblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGBnZXRNZXRob2ROYW1lc2AgY29udGFpbmluZyBvbmx5IHN0cmluZyBuYW1lcywgd2l0aG91dCBzeW1ib2xzXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gS1xuICogQHBhcmFtIHtSZWNvcmQ8SywgYW55Pn0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRTdHJpbmdNZXRob2ROYW1lcyA9IHZhbCA9PlxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAoXG4gICAgcmVhbEdldE1ldGhvZE5hbWVzKHZhbCkuZmlsdGVyKG5hbWUgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKVxuICApO1xuXG4vKipcbiAqIFRPRE8gVGhpcyBmdW5jdGlvbiBleGlzdHMgb25seSB0byBlYXNlIHRoZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTk3MCB0cmFuc2l0aW9uLCBmcm9tIGFsbCBtZXRob2RzXG4gKiBiZWluZyBvd24gcHJvcGVydGllcyB0byBtZXRob2RzIGJlaW5nIGluaGVyaXRlZCBmcm9tIGEgY29tbW9uIHByb3RvdHlwZS4gVGhpc1xuICogdHJhbnNpdGlvbiBicmVha3MgdHdvIHBhdHRlcm5zIHVzZWQgaW4gcHJpb3IgY29kZTogYXV0b2JpbmRpbmcsIGFuZFxuICogZW51bWVyYXRpbmcgbWV0aG9kcyBieSBlbnVtZXJhdGluZyBvd24gcHJvcGVydGllcy4gRm9yIGJvdGgsIHRoZSBwcmVmZXJyZWRcbiAqIHJlcGFpcnMgYXJlXG4gKlxuICogLSBhdXRvYmluZGluZzogUmVwbGFjZSwgZm9yIGV4YW1wbGUsIGBmb28ob2JqLm1ldGhvZClgIHdpdGggYGZvbyhhcmcgPT5cbiAqICAgYG9iai5tZXRob2QoYXJnKSlgLiBJT1csIHN0b3AgcmVseWluZyBvbiBleHByZXNzaW9ucyBsaWtlIGBvYmoubWV0aG9kYHRvXG4gKiAgIGV4dHJhY3QgYSBtZXRob2Qgc3RpbGwgYm91bmQgdG8gdGhlIHN0YXRlIG9mYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kXG4gKiAgIGR1cmFibGUgb2JqZWN0cywgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqIC0gbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZSBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGhcbiAqICAgYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuIEZvclxuICogdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBhbnk+fSBUXG4gKiBAcGFyYW0ge1R9IG9ialxuICogQHJldHVybnMge1R9XG4gKi8kaM2PX29uY2UuZ2V0U3RyaW5nTWV0aG9kTmFtZXMoZ2V0U3RyaW5nTWV0aG9kTmFtZXMpO1xuICAgICAgIGNvbnN0IGJpbmRBbGxNZXRob2RzID0gb2JqID0+XG4gIGhhcmRlbihcbiAgICBjcmVhdGUoXG4gICAgICBvYmosXG4gICAgICBmcm9tRW50cmllcyhcbiAgICAgICAgcmVhbEdldE1ldGhvZE5hbWVzKG9iaikubWFwKG5hbWUgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6ICgvKiogQHR5cGUge3Vua25vd25bXX0gKi8gLi4uYXJncykgPT5cbiAgICAgICAgICAgICAgYXBwbHkob2JqW25hbWVdLCBvYmosIGFyZ3MpLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTskaM2PX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuaGFyZGVuKGJpbmRBbGxNZXRob2RzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImdldFN0cmluZ01ldGhvZE5hbWVzIjpbImdldFN0cmluZ01ldGhvZE5hbWVzIl0sImJpbmRBbGxNZXRob2RzIjpbImJpbmRBbGxNZXRob2RzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJD9IHigQgAAoEIAACYAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0cmljcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJCTE9DS19ISVNUT0dSQU1fTUVUUklDUyIsIkhJU1RPR1JBTV9NRVRSSUNTIiwiS0VSTkVMX1NUQVRTX01FVFJJQ1MiLCJLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MiLCJLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MiLCJRdWV1ZU1ldHJpY0FzcGVjdCIsIm1ha2VRdWV1ZU1ldHJpY3MiLCJtYWtlUXVldWVNZXRyaWNzTWV0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsaXNOYXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJpc05hdFwiLFskaM2PX2EgPT4gKGlzTmF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01ldGVyIGFzIE9UZWxNZXRlciwgTWV0cmljQXR0cmlidXRlc30gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbiAqIEBpbXBvcnQge1RvdGFsTWFwfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqL1xuXG5jb25zdCBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTID0gW1xuICA1LFxuICAxMCxcbiAgMjUsXG4gIDUwLFxuICAxMDAsXG4gIDI1MCxcbiAgNTAwLFxuICAxMDAwLFxuICAyNTAwLFxuICA1MDAwLFxuICAxMDAwMCxcbiAgSW5maW5pdHksXG5dO1xuY29uc3QgSElTVE9HUkFNX1NFQ09ORFNfTEFURU5DWV9CT1VOREFSSUVTID1cbiAgSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUy5tYXAobXMgPT4gbXMgLyAxMDAwKTtcblxuLyogVE9ETzogVmFsaWRhdGUgdGhlc2UgYm91bmRhcmllcy4gV2UncmUgbm90IGdvaW5nIHRvIGhhdmUgNW1zIGJsb2NrcywgYnV0Ki9cbi8qIHdlIHByb2JhYmx5IGNhcmUgYWJvdXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxMCB2cy4gMzAgc2Vjb25kcy4qL1xuICAgICAgIGNvbnN0IEhJU1RPR1JBTV9NRVRSSUNTID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgc3dpbmdzZXRfY3JhbmtfcHJvY2Vzc2luZ190aW1lOiB7XG4gICAgZGVzY3JpcHRpb246ICdQcm9jZXNzaW5nIHRpbWUgcGVyIGNyYW5rIChtcyknLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogQXJyYXkub2YoMSwgMTEsIDIxLCAzMSwgNDEsIDUxLCA2MSwgNzEsIDgxLCA5MSwgSW5maW5pdHkpLFxuICB9LFxuICBzd2luZ3NldF9ibG9ja19wcm9jZXNzaW5nX3NlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Byb2Nlc3NpbmcgdGltZSBwZXIgYmxvY2snLFxuICAgIHVuaXQ6ICdzJyxcbiAgICBib3VuZGFyaWVzOiBISVNUT0dSQU1fU0VDT05EU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG4gIHN3aW5nc2V0X3ZhdF9zdGFydHVwOiB7XG4gICAgZGVzY3JpcHRpb246ICdWYXQgc3RhcnR1cCB0aW1lIChtcyknLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbiAgc3dpbmdzZXRfdmF0X2RlbGl2ZXJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdWYXQgZGVsaXZlcnkgdGltZSAobXMpJyxcbiAgICB1bml0OiAnbXMnLFxuICAgIGJvdW5kYXJpZXM6IEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG4gIHN3aW5nc2V0X21ldGVyX3VzYWdlOiB7XG4gICAgZGVzY3JpcHRpb246ICdWYXQgbWV0ZXIgdXNhZ2UnLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbn0pOyRozY9fb25jZS5ISVNUT0dSQU1fTUVUUklDUyhISVNUT0dSQU1fTUVUUklDUyk7XG5cbmNvbnN0IGJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyA9IHtcbiAgLyogRGlzYWJsZWQgYmVjYXVzZSBpbXBvcnRpbmcgZnJvbSBAb3BlbnRlbGVtZXRyeS9hcGkgYnJlYWtzIGtlcm5lbCBidW5kbGluZy4qL1xuICAvKiBUaGFua2Z1bGx5LCBpdCdzIHRoZSBkZWZhdWx0IGFueXdheToqL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vb3Blbi10ZWxlbWV0cnkvb3BlbnRlbGVtZXRyeS1qcy9ibG9iL2Y0ZGQyYTEwNjJmOTgwY2QzNDRjZmIxNzJhNTE1ZDAwMTE1ZGY1NzAvYXBpL3NyYy9tZXRyaWNzL01ldHJpYy50cyNMNTMtTDU3Ki9cbiAgLyogdmFsdWVUeXBlOiBWYWx1ZVR5cGUuRE9VQkxFLCovXG4gIHVuaXQ6ICdzJyxcbiAgYWR2aWNlOiB7XG4gICAgZXhwbGljaXRCdWNrZXRCb3VuZGFyaWVzOiBbXG4gICAgICAwLjEsIDAuMiwgMC4zLCAwLjQsIDAuNSwgMSwgMiwgMywgNCwgNSwgNiwgNywgMTAsIDE1LCAzMCxcbiAgICBdLFxuICB9LFxufTtcbiAgICAgICBjb25zdCBCTE9DS19ISVNUT0dSQU1fTUVUUklDUyA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIHN3aW5nc2V0UnVuU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgZXhlY3V0aW5nIFN3aW5nU2V0JyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIHN3aW5nc2V0Q2hhaW5TYXZlU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgcHJvcGFnYXRpbmcgU3dpbmdTZXQgc3RhdGUgaW50byBjb3Ntb3MnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgc3dpbmdzZXRDb21taXRTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgY29tbWl0dGluZyBTd2luZ1NldCBzdGF0ZSB0byBob3N0IHN0b3JhZ2UnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgY29zbW9zQ29tbWl0U2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgY29tbWl0dGluZyBjb3Ntb3Mgc3RhdGUnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgZnVsbENvbW1pdFNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQZXItYmxvY2sgdGltZSBzcGVudCBjb21taXR0aW5nIHN0YXRlLCBpbmNsdXNpdmUgb2YgQ09NTUlUX0JMT0NLIHByb2Nlc3NpbmcgcGx1cyB0aW1lIHNwZW50IFtvdXRzaWRlIG9mIGNvc21pYy1zd2luZ3NldF0gYmVmb3JlIGFuZCBhZnRlciBpdCcsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBpbnRlckJsb2NrU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZSBzcGVudCBpZGxlIGJldHdlZW4gYmxvY2tzJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGFmdGVyQ29tbWl0SGFuZ292ZXJTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgd2FpdGluZyBmb3IgcHJldmlvdXMtYmxvY2sgYWZ0ZXJDb21taXQgd29yaycsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBibG9ja0xhZ1NlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBkZWxheSBvZiBlYWNoIGJsb2NrIGZyb20gaXRzIGV4cGVjdGVkIGJlZ2luIHRpbWUnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgICAvKiBBZGQgYnVja2V0cyBmb3IgZXhjZXNzaXZlbHkgbG9uZyBkZWxheXMuKi9cbiAgICBhZHZpY2U6IHtcbiAgICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYy5hZHZpY2UsXG4gICAgICBleHBsaWNpdEJ1Y2tldEJvdW5kYXJpZXM6IC8qKiBAdHlwZSB7bnVtYmVyW119ICovIChbXG4gICAgICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYy5hZHZpY2UuZXhwbGljaXRCdWNrZXRCb3VuZGFyaWVzLFxuICAgICAgICAuLi5bNjAsIDEyMCwgMTgwLCAyNDAsIDMwMCwgNjAwLCAzNjAwXSxcbiAgICAgIF0pLFxuICAgIH0sXG4gIH0sXG59KTtcblxuLyoqIEBlbnVtIHsodHlwZW9mIFF1ZXVlTWV0cmljQXNwZWN0KVtrZXlvZiB0eXBlb2YgUXVldWVNZXRyaWNBc3BlY3RdfSAqLyRozY9fb25jZS5CTE9DS19ISVNUT0dSQU1fTUVUUklDUyhCTE9DS19ISVNUT0dSQU1fTUVUUklDUyk7XG4gICAgICAgY29uc3QgUXVldWVNZXRyaWNBc3BlY3QgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBMZW5ndGg6ICdsZW5ndGgnLFxuICBJbmNyZW1lbnRDb3VudDogJ2luY3JlbWVudHMnLFxuICBEZWNyZW1lbnRDb3VudDogJ2RlY3JlbWVudHMnLFxufSk7XG5cbi8qKlxuICogUXVldWUgbWV0cmljcyBjb21lIGluIHtsZW5ndGgsYWRkLHJlbW92ZX0gdHJpcGxlcyBzaGFyaW5nIGEgY29tbW9uIHByZWZpeC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVByZWZpeFxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NQcmVmaXhcbiAqIEByZXR1cm5zIHtSZWNvcmQ8XG4gKiAgIFF1ZXVlTWV0cmljQXNwZWN0LFxuICogICB7IG5hbWU6IHN0cmluZzsgb3B0aW9uczogTWV0cmljQXR0cmlidXRlcyB9XG4gKiA+fVxuICovJGjNj19vbmNlLlF1ZXVlTWV0cmljQXNwZWN0KFF1ZXVlTWV0cmljQXNwZWN0KTtcbiAgICAgICBjb25zdCBtYWtlUXVldWVNZXRyaWNzTWV0YSA9IChuYW1lUHJlZml4LCBkZXNjUHJlZml4KSA9PiB7XG4gIC8qKiBAdHlwZSB7W1F1ZXVlTWV0cmljQXNwZWN0LCBzdHJpbmcsIHN0cmluZ11bXX0gKi9cbiAgY29uc3QgbWV0cmljc01ldGEgPSBbXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0Lkxlbmd0aCwgJ2xlbmd0aCcsICdsZW5ndGgnXSxcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuSW5jcmVtZW50Q291bnQsICdhZGQnLCAnaW5jcmVtZW50cyddLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5EZWNyZW1lbnRDb3VudCwgJ3JlbW92ZScsICdkZWNyZW1lbnRzJ10sXG4gIF07XG4gIGNvbnN0IGVudHJpZXMgPSBtZXRyaWNzTWV0YS5tYXAoKFthc3BlY3QsIG5hbWVTdWZmaXgsIGRlc2NTdWZmaXhdKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IGAke25hbWVQcmVmaXh9XyR7bmFtZVN1ZmZpeH1gO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYCR7ZGVzY1ByZWZpeH0gJHtkZXNjU3VmZml4fWA7XG4gICAgLyogRnV0dXJlIE9wZW5UZWxlbWV0cnkgU0RLcyBzaG91bGQgYWxzbyBzdXBwb3J0IGNyZWF0aW5nIEluc3RydW1lbnRzIHdpdGgqL1xuICAgIC8qIGF0dHJpYnV0ZSBrZXlzIChzdWNoIGFzIHRoZSBcInF1ZXVlXCIgYXR0cmlidXRlIGZvciovXG4gICAgLyogXCJjb3NtaWNfc3dpbmdzZXRfaW5ib3VuZF9xdWV1ZV97bGVuZ3RoLGFkZCxyZW1vdmV9XCIgbWVhc3VyZW1lbnRzKToqL1xuICAgIC8qIGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL290ZWwvbWV0cmljcy9hcGkvI2luc3RydW1lbnQtYWR2aXNvcnktcGFyYW1ldGVyLWF0dHJpYnV0ZXMqL1xuICAgIC8qIEF0IHRoYXQgdGltZSwgYSBuZXcgZmllbGQgd2lsbCBiZSBhZGRlZCB0byB0aGlzIHJlY29yZC4qL1xuICAgIHJldHVybiBbYXNwZWN0LCB7IG5hbWUsIG9wdGlvbnM6IHsgZGVzY3JpcHRpb24gfSB9XTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBRdWV1ZU5hbWVcbiAqIEB0eXBlZGVmIFF1ZXVlTWV0cmljc1xuICogQHByb3BlcnR5IHsobGVuZ3RoczogUmVjb3JkPFF1ZXVlTmFtZSwgbnVtYmVyPikgPT4gdm9pZH0gaW5pdExlbmd0aHMgbXVzdCBiZVxuICogICBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBmdW5jdGlvblxuICogQHByb3BlcnR5IHsobGVuZ3RoczogUmVjb3JkPFF1ZXVlTmFtZSwgbnVtYmVyPikgPT4gdm9pZH0gdXBkYXRlTGVuZ3Roc1xuICogQHByb3BlcnR5IHsocXVldWU6IFF1ZXVlTmFtZSwgZGVsdGE/OiBudW1iZXIpID0+IHZvaWR9IGluY0xlbmd0aCBmb3IgYVxuICogICBub24tbmVnYXRpdmUgZGVsdGFcbiAqIEBwcm9wZXJ0eSB7KHF1ZXVlOiBRdWV1ZU5hbWUsIGRlbHRhPzogbnVtYmVyKSA9PiB2b2lkfSBkZWNMZW5ndGggZm9yIGFcbiAqICAgbm9uLW5lZ2F0aXZlIGRlbHRhXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUge2xlbmd0aCxhZGQscmVtb3ZlfSBJbnN0cnVtZW50cyBmb3IgYSBxdWV1ZSBhbmQgcmV0dXJuIGZ1bmN0aW9ucyBmb3JcbiAqIGNvbnNpc3RlbnRseSBpbml0aWFsaXppbmcgYW5kIHVwZGF0aW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFF1ZXVlTmFtZVxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICogQHBhcmFtIHtPVGVsTWV0ZXJ9IGNvbmZpZy5vdGVsTWV0ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWcubmFtZVByZWZpeFxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZy5kZXNjUHJlZml4XG4gKiBAcGFyYW0ge1BpY2s8Q29uc29sZSwgJ3dhcm4nPn0gW2NvbmZpZy5jb25zb2xlXVxuICogQHJldHVybnMge1F1ZXVlTWV0cmljczxRdWV1ZU5hbWU+fVxuICovJGjNj19vbmNlLm1ha2VRdWV1ZU1ldHJpY3NNZXRhKG1ha2VRdWV1ZU1ldHJpY3NNZXRhKTtcbiAgICAgICBjb25zdCBtYWtlUXVldWVNZXRyaWNzID0gKHtcbiAgb3RlbE1ldGVyLFxuICBuYW1lUHJlZml4LFxuICBkZXNjUHJlZml4LFxuICBjb25zb2xlLFxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0Lkxlbmd0aF06IGxlbmd0aE1ldGEsXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0LkluY3JlbWVudENvdW50XTogdXBNZXRhLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5EZWNyZW1lbnRDb3VudF06IGRvd25NZXRhLFxuICB9ID0gbWFrZVF1ZXVlTWV0cmljc01ldGEobmFtZVByZWZpeCwgZGVzY1ByZWZpeCk7XG4gIC8qIFRPRE86IFdoZW4gaXQncyBkZWVtZWQgc2FmZSB0byBjaGFuZ2UgcmVwb3J0ZWQgbWV0cmljcywgbWFrZSB1cENvdW50ZXIgYW5kKi9cbiAgLyogZG93bkNvdW50ZXIgc3luY2hyb25vdXMgKGFuZCBkcm9wIGBpbmNyZW1lbnRzYCBhbmQgYGRlY3JlbWVudHNgIG1hcHMpLiovXG4gIC8qIFdlIGNhbid0IGRvIHNvIHVudGlsIHRoZW4gYmVjYXVzZSBpdCB3aWxsIGFkZCBhIFwiX3RvdGFsXCIgc3VmZml4IHRvIHRoZSovXG4gIC8qIFByb21ldGhldXMgZXhwb3J0IG1ldHJpYyBuYW1lLCBkaXZlcmdpbmcgZnJvbSBgbWFrZUluYm91bmRRdWV1ZU1ldHJpY3NgIGluKi9cbiAgLyogcGFja2FnZXMvY29zbWljLXN3aW5nc2V0L3NyYy9rZXJuZWwtc3RhdHMuanMuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL29wZW4tdGVsZW1ldHJ5L29wZW50ZWxlbWV0cnktanMvYmxvYi9tYWluL2RvYy91cGdyYWRlLXRvLTIueC5tZCMtb3RoZXItY2hhbmdlcyovXG4gIGNvbnN0IGxlbmd0aENvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcihcbiAgICBsZW5ndGhNZXRhLm5hbWUsXG4gICAgbGVuZ3RoTWV0YS5vcHRpb25zLFxuICApO1xuICAvKiBjb25zdCB1cENvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlQ291bnRlcih1cE1ldGEubmFtZSwgdXBNZXRhLm9wdGlvbnMpOyovXG4gIC8qIGNvbnN0IGRvd25Db3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZUNvdW50ZXIoZG93bk1ldGEubmFtZSwgZG93bk1ldGEub3B0aW9ucyk7Ki9cbiAgY29uc3QgdXBDb3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZU9ic2VydmFibGVDb3VudGVyKFxuICAgIHVwTWV0YS5uYW1lLFxuICAgIHVwTWV0YS5vcHRpb25zLFxuICApO1xuICBjb25zdCBkb3duQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVPYnNlcnZhYmxlQ291bnRlcihcbiAgICBkb3duTWV0YS5uYW1lLFxuICAgIGRvd25NZXRhLm9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGluY3JlbWVudHMgPSAvKiogQHR5cGUge1RvdGFsTWFwPHN0cmluZywgbnVtYmVyPn0gKi8gKG5ldyBNYXAoKSk7XG4gIGNvbnN0IGRlY3JlbWVudHMgPSAvKiogQHR5cGUge1RvdGFsTWFwPHN0cmluZywgbnVtYmVyPn0gKi8gKG5ldyBNYXAoKSk7XG4gIHVwQ291bnRlci5hZGRDYWxsYmFjayhvYnNlcnZlciA9PiB7XG4gICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCB2YWx1ZV0gb2YgaW5jcmVtZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUodmFsdWUsIHsgcXVldWU6IHF1ZXVlTmFtZSB9KTtcbiAgICB9XG4gIH0pO1xuICBkb3duQ291bnRlci5hZGRDYWxsYmFjayhvYnNlcnZlciA9PiB7XG4gICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCB2YWx1ZV0gb2YgZGVjcmVtZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUodmFsdWUsIHsgcXVldWU6IHF1ZXVlTmFtZSB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCByZWFkeSA9IGZhbHNlO1xuICBjb25zdCBsZW5ndGhzID0gLyoqIEB0eXBlIHtUb3RhbE1hcDxzdHJpbmcsIG51bWJlcj59ICovIChuZXcgTWFwKCkpO1xuICBjb25zdCBudWRnZSA9IChxdWV1ZU5hbWUsIGRlbHRhLCBpbml0ID0gZmFsc2UpID0+IHtcbiAgICBpZiAoIWxlbmd0aHMuaGFzKHF1ZXVlTmFtZSkpIHtcbiAgICAgIGlmICghaW5pdCkgY29uc29sZT8ud2FybignVW5rbm93biBxdWV1ZScsIHF1ZXVlTmFtZSk7XG4gICAgICBsZW5ndGhzLnNldChxdWV1ZU5hbWUsIDApO1xuICAgICAgaW5jcmVtZW50cy5zZXQocXVldWVOYW1lLCAwKTtcbiAgICAgIGRlY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgMCk7XG4gICAgfVxuICAgIGNvbnN0IG9sZExlbmd0aCA9IGxlbmd0aHMuZ2V0KHF1ZXVlTmFtZSk7XG4gICAgbGVuZ3Rocy5zZXQocXVldWVOYW1lLCBvbGRMZW5ndGggKyBkZWx0YSk7XG4gICAgY29uc3QgZGltZW5zaW9ucyA9IHsgcXVldWU6IHF1ZXVlTmFtZSB9O1xuICAgIGxlbmd0aENvdW50ZXIuYWRkKGRlbHRhLCBkaW1lbnNpb25zKTtcbiAgICBpZiAoaW5pdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoZGVsdGEgPiAwKSB7XG4gICAgICAvKiBUT0RPIHBlciBhYm92ZTogdXBDb3VudGVyLmFkZChkZWx0YSwgZGltZW5zaW9ucyk7Ki9cbiAgICAgIGluY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgKGluY3JlbWVudHMuZ2V0KHF1ZXVlTmFtZSkgfHwgMCkgKyBkZWx0YSk7XG4gICAgfSBlbHNlIGlmIChkZWx0YSA8IDApIHtcbiAgICAgIC8qIFRPRE8gcGVyIGFib3ZlOiBkb3duQ291bnRlci5hZGQoLWRlbHRhLCBkaW1lbnNpb25zKTsqL1xuICAgICAgZGVjcmVtZW50cy5zZXQocXVldWVOYW1lLCAoZGVjcmVtZW50cy5nZXQocXVldWVOYW1lKSB8fCAwKSAtIGRlbHRhKTtcbiAgICB9XG4gICAgcmVhZHkgPSB0cnVlO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGluaXRMZW5ndGhzOiBpbml0aWFsTGVuZ3RocyA9PiB7XG4gICAgICAhcmVhZHkgfHxcbiAgICAgICAgY29uc29sZT8ud2FybihcbiAgICAgICAgICBgVW5leHBlY3RlZCByZXBlYXQgcXVldWUgbGVuZ3RoIGluaXRpYWxpemF0aW9uIGZyb20gJHtxKGxlbmd0aHMpfSB0byAke3EoaW5pdGlhbExlbmd0aHMpfWBcbiAgICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgbmV3TGVuZ3RoXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsTGVuZ3RocykpIHtcbiAgICAgICAgaWYgKCFpc05hdChuZXdMZW5ndGgpKSB7XG4gICAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBsZW5ndGggZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBuZXdMZW5ndGgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgbmV3TGVuZ3RoLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZUxlbmd0aHM6IG5ld0xlbmd0aHMgPT4ge1xuICAgICAgcmVhZHkgfHwgY29uc29sZT8ud2FybignTWlzc2luZyBpbml0aWFsIHF1ZXVlIGxlbmd0aHMnKTtcbiAgICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgbmV3TGVuZ3RoXSBvZiBPYmplY3QuZW50cmllcyhuZXdMZW5ndGhzKSkge1xuICAgICAgICBpZiAoIWlzTmF0KG5ld0xlbmd0aCkpIHtcbiAgICAgICAgICBjb25zb2xlPy53YXJuKGBJbnZhbGlkIGxlbmd0aCBmb3IgcXVldWUgJHtxKHF1ZXVlTmFtZSl9OmAsIG5ld0xlbmd0aCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbnVkZ2UocXVldWVOYW1lLCBuZXdMZW5ndGggLSAobGVuZ3Rocy5nZXQocXVldWVOYW1lKSB8fCAwKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBpbmNMZW5ndGg6IChxdWV1ZU5hbWUsIGRlbHRhID0gMSkgPT4ge1xuICAgICAgaWYgKCFpc05hdChkZWx0YSkpIHtcbiAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBpbmNyZW1lbnQgZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBkZWx0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgZGVsdGEpO1xuICAgIH0sXG4gICAgZGVjTGVuZ3RoOiAocXVldWVOYW1lLCBkZWx0YSA9IDEpID0+IHtcbiAgICAgIGlmICghaXNOYXQoZGVsdGEpKSB7XG4gICAgICAgIGNvbnNvbGU/Lndhcm4oYEludmFsaWQgZGVjcmVtZW50IGZvciBxdWV1ZSAke3EocXVldWVOYW1lKX06YCwgZGVsdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBudWRnZShxdWV1ZU5hbWUsIC1kZWx0YSk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKiBBbGwgdGhlIGtlcm5lbCBtZXRyaWNzIHdlIGFyZSBwcmVwYXJlZCBmb3IuKi9cbi8qKiBAZW51bSB7KHR5cGVvZiBNZXRyaWNUeXBlKVtrZXlvZiB0eXBlb2YgTWV0cmljVHlwZV19IE1ldHJpY1R5cGUgKi8kaM2PX29uY2UubWFrZVF1ZXVlTWV0cmljcyhtYWtlUXVldWVNZXRyaWNzKTtcbmNvbnN0IE1ldHJpY1R5cGUgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBDb3VudGVyOiAnY291bnRlcicsXG4gIEdhdWdlOiAnZ2F1Z2UnLFxufSk7XG4vKipcbiAqIEB0eXBlZGVmIEtlcm5lbE1ldHJpY01ldGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge3sgZGltZW5zaW9uOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfX0gW3N1Yl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc2Vuc3VzXVxuICogQHByb3BlcnR5IHtNZXRyaWNUeXBlfSBtZXRyaWNUeXBlXG4gKi9cbi8qKiBAdHlwZSB7T21pdDxLZXJuZWxNZXRyaWNNZXRhLCAnbWV0cmljVHlwZSc+W119ICovXG4gICAgICAgY29uc3QgS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTID0gW1xuICB7XG4gICAga2V5OiAnc3lzY2FsbHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9hbGxfc3lzY2FsbF90b3RhbCcsXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxTZW5kJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3NlbmQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgbWVzc2FnZSBzZW5kIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsQ2FsbE5vdycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdjYWxsTm93JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHN5bmNocm9ub3VzIGRldmljZSBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFN1YnNjcmliZScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdzdWJzY3JpYmUnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgcHJvbWlzZSBzdWJzY3JpcHRpb24ga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxSZXNvbHZlJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3Jlc29sdmUnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgcHJvbWlzZSByZXNvbHV0aW9uIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsRXhpdCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdleGl0JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBleGl0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVHZXQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVHZXQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgZ2V0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVTZXQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVTZXQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgc2V0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVHZXROZXh0S2V5JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3ZhdHN0b3JlR2V0TmV4dCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXRzdG9yZSBnZXROZXh0S2V5IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVEZWxldGUnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVEZWxldGUnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgZGVsZXRlIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsRHJvcEltcG9ydHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnZHJvcEltcG9ydHMnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgZHJvcCBpbXBvcnRzIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkaXNwYXRjaGVzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZGlzcGF0Y2hfdG90YWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkaXNwYXRjaERlbGl2ZXInLFxuICAgIG5hbWU6ICdzd2luZ3NldF9kaXNwYXRjaF9kZWxpdmVyX3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgbWVzc2FnZSBkZWxpdmVyaWVzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2Rpc3BhdGNoTm90aWZ5JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZGlzcGF0Y2hfbm90aWZ5X3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgcHJvbWlzZSBub3RpZmljYXRpb25zJyxcbiAgfSxcbl07XG5cbi8qKiBAdHlwZSB7T21pdDxLZXJuZWxNZXRyaWNNZXRhLCAnbWV0cmljVHlwZSc+W119ICovJGjNj19vbmNlLktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyhLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MpO1xuICAgICAgIGNvbnN0IEtFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyA9IFtcbiAge1xuICAgIGtleTogJ2tlcm5lbE9iamVjdHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9rZXJuZWxfb2JqZWN0cycsXG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmUga2VybmVsIG9iamVjdHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna2VybmVsRGV2aWNlcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2tlcm5lbF9kZXZpY2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBrZXJuZWwgZGV2aWNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrZXJuZWxQcm9taXNlcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmUga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2twVW5yZXNvbHZlZCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3VucmVzb2x2ZWRfa2VybmVsX3Byb21pc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ1VucmVzb2x2ZWQga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2twRnVsZmlsbGVkJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZnVsZmlsbGVkX2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdGdWxmaWxsZWQga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2twUmVqZWN0ZWQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9yZWplY3RlZF9rZXJuZWxfcHJvbWlzZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnUmVqZWN0ZWQga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3J1blF1ZXVlTGVuZ3RoJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfcnVuX3F1ZXVlX2xlbmd0aCcsXG4gICAgY29uc2Vuc3VzOiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOiAnTGVuZ3RoIG9mIHRoZSBrZXJuZWwgcnVuIHF1ZXVlJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2FjY2VwdGFuY2VRdWV1ZUxlbmd0aCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2FjY2VwdGFuY2VfcXVldWVfbGVuZ3RoJyxcbiAgICBjb25zZW5zdXM6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdMZW5ndGggb2YgdGhlIGtlcm5lbCBhY2NlcHRhbmNlIHF1ZXVlJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3Byb21pc2VRdWV1ZXNMZW5ndGgnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9wcm9taXNlX3F1ZXVlc19sZW5ndGgnLFxuICAgIGNvbnNlbnN1czogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ0NvbWJpbmVkIGxlbmd0aCBvZiBhbGwga2VybmVsIHByb21pc2UgcXVldWVzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NsaXN0RW50cmllcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2NsaXN0X2VudHJpZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGtlcm5lbCBjLWxpc3QnLFxuICB9LFxuICB7XG4gICAga2V5OiAndmF0cycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3ZhdHMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIGFjdGl2ZSB2YXRzJyxcbiAgfSxcbl07JGjNj19vbmNlLktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyhLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MpO1xuXG5jb25zdCB7IENvdW50ZXIsIEdhdWdlIH0gPSBNZXRyaWNUeXBlO1xuLyoqIEB0eXBlIHtLZXJuZWxNZXRyaWNNZXRhW119ICovXG4gICAgICAgY29uc3QgS0VSTkVMX1NUQVRTX01FVFJJQ1MgPSBoYXJkZW4oW1xuICAuLi5LRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MubWFwKG0gPT4gKHsgLi4ubSwgbWV0cmljVHlwZTogQ291bnRlciB9KSksXG4gIC4uLktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUy5tYXAobSA9PiAoeyAuLi5tLCBtZXRyaWNUeXBlOiBHYXVnZSB9KSksXG5dKTtcblxuLyogRW5zdXJlIGtlcm5lbCBzdGF0cyBrZXkgdW5pcXVlbmVzcy4qLyRozY9fb25jZS5LRVJORUxfU1RBVFNfTUVUUklDUyhLRVJORUxfU1RBVFNfTUVUUklDUyk7XG5jb25zdCBrZXJuZWxTdGF0c0tleXMgPSBuZXcgTWFwKCk7XG5mb3IgKGNvbnN0IHsga2V5IH0gb2YgS0VSTkVMX1NUQVRTX01FVFJJQ1MpIHtcbiAga2VybmVsU3RhdHNLZXlzLnNldChrZXksIChrZXJuZWxTdGF0c0tleXMuZ2V0KGtleSkgfHwgMCkgKyAxKTtcbn1cbmNvbnN0IGR1cGxpY2F0ZUtlcm5lbFN0YXRzS2V5cyA9IFsuLi5rZXJuZWxTdGF0c0tleXMuZW50cmllcygpXS5mbGF0TWFwKFxuICAoW2tleSwgdmFsdWVdKSA9PiAodmFsdWUgPiAxID8gW2tleV0gOiBbXSksXG4pO1xuaWYgKGR1cGxpY2F0ZUtlcm5lbFN0YXRzS2V5cy5sZW5ndGggPiAwKSB7XG4gIGNvbnN0IG1zZyA9IGBEdXBsaWNhdGUga2VybmVsIHN0YXRzIGtleXMgJHtKU09OLnN0cmluZ2lmeShkdXBsaWNhdGVLZXJuZWxTdGF0c0tleXMpfWA7XG4gIHRocm93IEVycm9yKG1zZyk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJISVNUT0dSQU1fTUVUUklDUyI6WyJISVNUT0dSQU1fTUVUUklDUyJdLCJCTE9DS19ISVNUT0dSQU1fTUVUUklDUyI6WyJCTE9DS19ISVNUT0dSQU1fTUVUUklDUyJdLCJRdWV1ZU1ldHJpY0FzcGVjdCI6WyJRdWV1ZU1ldHJpY0FzcGVjdCJdLCJtYWtlUXVldWVNZXRyaWNzTWV0YSI6WyJtYWtlUXVldWVNZXRyaWNzTWV0YSJdLCJtYWtlUXVldWVNZXRyaWNzIjpbIm1ha2VRdWV1ZU1ldHJpY3MiXSwiS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTIjpbIktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyJdLCJLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MiOlsiS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTIl0sIktFUk5FTF9TVEFUU19NRVRSSUNTIjpbIktFUk5FTF9TVEFUU19NRVRSSUNTIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIq5WvK2DgAAtg4AACsAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbmF0dXJhbC1zb3J0LmpzeyJpbXBvcnRzIjpbIi4vanMtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJuYXR1cmFsQ29tcGFyZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHByb3ZpZGVMYXp5TWFwOyRozY9faW1wb3J0cyhbW1wiLi9qcy11dGlscy5qc1wiLCBbW1wicHJvdmlkZUxhenlNYXBcIixbJGjNj19hID0+IChwcm92aWRlTGF6eU1hcCA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuY29uc3QgY29tcGFyZU5hdHMgPSAoYSwgYikgPT4ge1xuICAvKiBEZWZhdWx0IHRvIElFRUUgNzU0IG51bWJlciBhcml0aG1ldGljIGZvciBzcGVlZCwgYnV0IGZhbGwgYmFjayBvbiBiaWdpbnQqL1xuICAvKiBhcml0aG1ldGljIHRvIHJlc29sdmUgdGllcyBiZWNhdXNlIGJpZyBudW1iZXJzIGNhbiBsb3NlIHJlc29sdXRpb24qL1xuICAvKiAoc29tZXRpbWVzIGV2ZW4gYmVjb21pbmcgaW5maW5pdGUpIGFuZCB0aGVuIHVsdGltYXRlbHkgb24gbGVuZ3RoIHRvIHJlc29sdmUqL1xuICAvKiB0aWVzIGJ5IGFzY2VuZGluZyBjb3VudCBvZiBsZWFkaW5nIHplcm9zLiovXG4gIGNvbnN0IGRpZmYgPSArYSAtICtiO1xuICBjb25zdCBmaW5pdGVEaWZmID1cbiAgICAoTnVtYmVyLmlzRmluaXRlKGRpZmYpICYmIGRpZmYpIHx8XG4gICAgKGEgPT09IGIgPyAwIDogTnVtYmVyKEJpZ0ludChhKSAtIEJpZ0ludChiKSkgfHwgYS5sZW5ndGggLSBiLmxlbmd0aCk7XG5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciB0aGlzIGNhbGwgcmVhbGx5IGRvZXMgcmV0dXJuIC0xIHwgMCB8IDEqL1xuICByZXR1cm4gTWF0aC5zaWduKGZpbml0ZURpZmYpO1xufTtcblxuLyogVE9ETzogY29tcGFyZUJ5Q29kZVBvaW50cyovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8yMDA4Ki9cblxuY29uc3QgY29tcGFyZVN0cmluZ3MgPSAoYSwgYikgPT4gKGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwKTtcblxuY29uc3QgckNhcHR1cmVEaWdpdHMgPSAvKFswLTldKykvO1xuXG4vKipcbiAqIFNwbGl0dGluZyBieSByZWd1bGFyIGV4cHJlc3Npb24gY2FuIGJlIGV4cGVuc2l2ZTsgd2UgZG9uJ3Qgd2FudCB0byByZXBlYXRcbiAqIHRoYXQgZm9yIGV2ZXJ5IGNvbXBhcmlzb24gYWdhaW5zdCB0aGUgc2FtZSBzdHJpbmcuXG4gKlxuICogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZ1tdPn1cbiAqL1xuY29uc3QgcGFydHNDYWNoZSA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBQZXJmb3JtIGEgbXVsdGktbGV2ZWwgbmF0dXJhbC1zb3J0IGNvbXBhcmlzb24sIGZpbmRpbmcgdGhlIGRlY2ltYWwgZGlnaXRcbiAqIHNlcXVlbmNlcyBpbiBlYWNoIG9wZXJhbmQgYW5kIGNvbXBhcmluZyBmaXJzdCBieSBlYWNoIChbcG9zc2libHkgZW1wdHldXG4gKiBzdHJpbmcgcHJlZml4LCBpbnRlZ2VyKSBwYWlyIGluIHR1cm4sIHdpdGggYSBmaW5hbCBjb21wYXJpc2lvbiBieSBzdHJpbmdcbiAqIHN1ZmZpeCBhcyBuZWNlc3NhcnkgKGUuZy4sIHNvcnRpbmcgJ2tvNDInIGJlZm9yZSAna28xMDAnIGFzIFsna28nLCA0Ml0gdnMuXG4gKiBbJ2tvJywgMTAwXSBhbmQgJ3BhcmVudDEuY2hpbGQ4JyBiZWZvcmUgJ3BhcmVudDEuY2hpbGQxMCcgYXMgWydwYXJlbnQnLCAxLFxuICogJ2NoaWxkJywgOF0gdnMuIFsncGFyZW50JywgMSwgJ2NoaWxkJywgMTBdKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYVxuICogQHBhcmFtIHtzdHJpbmd9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG4gICAgICAgY29uc3QgbmF0dXJhbENvbXBhcmUgPSAoYSwgYikgPT4ge1xuICAvKiBXZSB3YW50IHRvIG1haW50YWluIGEgY2FjaGUgb25seSBmb3IgdGhlIGR1cmF0aW9uIG9mIGVhY2ggY2FsbCB0byovXG4gIC8qIGFycmF5LnNvcnQsIGFuZCBsZXZlcmFnZSB0aGUgc3luY2hyb25vdXMgbmF0dXJlIG9mIHRoYXQgbWV0aG9kIGluIHRoZSBmaXJzdCovXG4gIC8qIGludm9jYXRpb24gb2YgZWFjaCB0dXJuIChpbmRpY2F0ZWQgYnkgYW4gZW1wdHkgY2FjaGUpIHRvIHNjaGVkdWxlIGNhY2hlKi9cbiAgLyogY2xlYXJpbmcgaW4gdGhlICpuZXh0KiB0dXJuLiovXG4gIGlmICghcGFydHNDYWNoZS5zaXplKSB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gcGFydHNDYWNoZS5jbGVhcigpKTtcblxuICBjb25zdCBhUGFydHMgPSBwcm92aWRlTGF6eU1hcChwYXJ0c0NhY2hlLCBhLCAoKSA9PiBhLnNwbGl0KHJDYXB0dXJlRGlnaXRzKSk7XG4gIGNvbnN0IGJQYXJ0cyA9IHByb3ZpZGVMYXp5TWFwKHBhcnRzQ2FjaGUsIGIsICgpID0+IGIuc3BsaXQockNhcHR1cmVEaWdpdHMpKTtcblxuICAvKiBBbiBldmVuIGluZGV4IGNvcnJlc3BvbmRzIHdpdGggYSBzdHJpbmcgcGFydDsgYW4gb2RkIG9uZSB3aXRoIGEgZGlnaXQgcGFydC4qL1xuICBsZXQgaSA9IDA7XG4gIGZvciAoOyBpICsgMSA8IGFQYXJ0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgIGlmIChpICsgMSA8IGJQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIC8qIEJvdGggYGFgIGFuZCBgYmAgaGF2ZSBhIGRpZ2l0IHBhcnQgaGVyZSwgYnV0IHdlIGNvbXBhcmUgdGhlIHByZWNlZGluZyovXG4gICAgICAvKiBzdHJpbmcgcGFydCBmaXJzdCBpbiBjYXNlIHRob3NlIGFyZSB1bmVxdWFsLiovXG4gICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICBjb21wYXJlU3RyaW5ncyhhUGFydHNbaV0sIGJQYXJ0c1tpXSkgfHxcbiAgICAgICAgY29tcGFyZU5hdHMoYVBhcnRzW2kgKyAxXSwgYlBhcnRzW2kgKyAxXSk7XG4gICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBBZnRlciBhIChwb3NzaWJseSBlbXB0eSkgY29tbW9uIHByZWZpeCwgYGFgIGhhcyBkaWdpdHMgd2hlcmUgYGJgIGRvZXMqL1xuICAgICAgLyogbm90LCBzbyB3ZSB1c2Ugc3RyaW5nIGNvbXBhcmlzb24gb2YgYCR7YVN0cmluZ30ke2FEaWdpdHN9YCB2cy4qL1xuICAgICAgLyogYCR7YlN0cmluZ31gLiovXG4gICAgICByZXR1cm4gY29tcGFyZVN0cmluZ3MoYCR7YVBhcnRzW2ldfSR7YVBhcnRzW2kgKyAxXX1gLCBiUGFydHNbaV0pO1xuICAgIH1cbiAgfVxuICBpZiAoYlBhcnRzLmxlbmd0aCA+IGFQYXJ0cy5sZW5ndGgpIHtcbiAgICAvKiBgYmAgaGFzIGRpZ2l0cyB3aGVyZSBgYWAgZG9lcyBub3QuKi9cbiAgICByZXR1cm4gY29tcGFyZVN0cmluZ3MoYVBhcnRzW2ldLCBgJHtiUGFydHNbaV19JHtiUGFydHNbaSArIDFdfWApO1xuICB9XG4gIC8qIElmIGBhYCBhbmQgYGJgIGRpZmZlciwgaXQncyBvbmx5IGluIHRoZSBmaW5hbCBzdHJpbmcgc3VmZml4LiovXG4gIHJldHVybiBjb21wYXJlU3RyaW5ncyhhUGFydHNbaV0sIGJQYXJ0c1tpXSk7XG59OyRozY9fb25jZS5uYXR1cmFsQ29tcGFyZShuYXR1cmFsQ29tcGFyZSk7XG5oYXJkZW4obmF0dXJhbENvbXBhcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0dXJhbENvbXBhcmUiOlsibmF0dXJhbENvbXBhcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAT8Qll2pIAABqSAAAKAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9zZXMtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1ldGEtbWFwLmpzIiwiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9zdHJlYW0iLCJqZXNzaWUuanMiLCIuL2pzLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIiwiYWdncmVnYXRlVHJ5RmluYWxseSIsImFsbFZhbHVlcyIsImFzc2VydEFsbERlZmluZWQiLCJhdHRlbnVhdGUiLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiLCJmb3JldmVyIiwiZnJvbVVuaXF1ZUVudHJpZXMiLCJtYWtlTGltaXRlZENvbnNvbGUiLCJvYmplY3RNYXAiLCJvYmplY3RNZXRhTWFwIiwic3RyaXBQcmVmaXgiLCJzeW5jaHJvbml6ZWRUZWUiLCJ0aHJvd0Vycm9yQ29kZSIsInRyeUpzb25QYXJzZSIsInRyeU5vdyIsInVudGlsVHJ1ZSIsIndoaWxlVHJ1ZSIsIndpdGhEZWZlcnJlZENsZWFudXAiLCJ6aXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsb2JqZWN0TWV0YU1hcCxmcm9tVW5pcXVlRW50cmllcyxxLGIsRmFpbCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixYLGRlZXBseUZ1bGZpbGxlZCxpc1ByaW1pdGl2ZSxtYWtlUHJvbWlzZUtpdCxtYWtlUXVldWUsYXN5bmNHZW5lcmF0ZSxsb2dMZXZlbHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKSwkaM2PX2xpdmVbXCJvYmplY3RNYXBcIl1dXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanNcIiwgW1tcIm9iamVjdE1ldGFNYXBcIixbJGjNj19hID0+IChvYmplY3RNZXRhTWFwID0gJGjNj19hKSwkaM2PX2xpdmVbXCJvYmplY3RNZXRhTWFwXCJdXV1dXSxbXCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qc1wiLCBbW1wiZnJvbVVuaXF1ZUVudHJpZXNcIixbJGjNj19hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRozY9fYSksJGjNj19saXZlW1wiZnJvbVVuaXF1ZUVudHJpZXNcIl1dXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYlwiLFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsWyRozY9fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjNj19hKV1dLFtcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3N0cmVhbVwiLCBbW1wibWFrZVF1ZXVlXCIsWyRozY9fYSA9PiAobWFrZVF1ZXVlID0gJGjNj19hKV1dXV0sW1wiamVzc2llLmpzXCIsIFtbXCJhc3luY0dlbmVyYXRlXCIsWyRozY9fYSA9PiAoYXN5bmNHZW5lcmF0ZSA9ICRozY9fYSldXV1dLFtcIi4vanMtdXRpbHMuanNcIiwgW1tcImxvZ0xldmVsc1wiLFskaM2PX2EgPT4gKGxvZ0xldmVscyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgZnJvbUVudHJpZXMsIGtleXMsIHZhbHVlcyB9ID0gT2JqZWN0O1xuXG4vKiogQHBhcmFtIHsobGV2ZWw6IHN0cmluZykgPT4gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZH0gbWFrZUxvZ2dlciAqL1xuICAgICAgIGNvbnN0IG1ha2VMaW1pdGVkQ29uc29sZSA9IG1ha2VMb2dnZXIgPT4ge1xuICBjb25zdCBsaW1pdGVkQ29uc29sZSA9IC8qKiBAdHlwZSB7YW55fSAqLyAoXG4gICAgZnJvbUVudHJpZXMobG9nTGV2ZWxzLm1hcChsZXZlbCA9PiBbbGV2ZWwsIG1ha2VMb2dnZXIobGV2ZWwpXSkpXG4gICk7XG4gIHJldHVybiAvKiogQHR5cGUge0xpbWl0ZWRDb25zb2xlfSAqLyAoaGFyZGVuKGxpbWl0ZWRDb25zb2xlKSk7XG59OyRozY9fb25jZS5tYWtlTGltaXRlZENvbnNvbGUobWFrZUxpbWl0ZWRDb25zb2xlKTtcbmhhcmRlbihtYWtlTGltaXRlZENvbnNvbGUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7eyBbS2V5VHlwZSBpbiBrZXlvZiBUXTogVFtLZXlUeXBlXSB9ICYge319IFNpbXBsaWZ5IGZsYXR0ZW4gdGhlXG4gKiAgIHR5cGUgb3V0cHV0IHRvIGltcHJvdmUgdHlwZSBoaW50cyBzaG93biBpbiBlZGl0b3JzXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2Uvc2ltcGxpZnkuZC50c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHR5cGVkZWYge3tcbiAqICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBDYWxsYWJsZSA/IFRbS10gOiBEZWVwbHlBd2FpdGVkPFRbS10+O1xuICogfX0gRGVlcGx5QXdhaXRlZE9iamVjdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgUHJvbWlzZUxpa2U8YW55PlxuICogICAgID8gQXdhaXRlZDxUPlxuICogICAgIDogVCBleHRlbmRzIFJlbW90YWJsZUJyYW5kPGFueSwgYW55PiB8IFJlbW90YWJsZU9iamVjdFxuICogICAgICAgPyBUXG4gKiAgICAgICA6IFQgZXh0ZW5kcyB7fVxuICogICAgICAgICA/IFNpbXBsaWZ5PERlZXBseUF3YWl0ZWRPYmplY3Q8VD4+XG4gKiAgICAgICAgIDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogQSBtb3JlIGNvbnN0cmFpbmVkIHZlcnNpb24gb2Yge2RlZXBseUZ1bGZpbGxlZH0gZm9yIHR5cGUgc2FmZXR5IHVudGlsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzEyNTcgVXNlZnVsIGluIHN0YXJ0aW5nIGNvbnRyYWN0cyB0aGF0XG4gKiBuZWVkIGFsbCB0ZXJtcyB0byBiZSBmdWxmaWxsZWQgaW4gb3JkZXIgdG8gYmUgZHVyYWJsZS5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyB7fT4odW5mdWxmaWxsZWRUZXJtczogVCkgPT4gUHJvbWlzZTxEZWVwbHlBd2FpdGVkPFQ+Pn1cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBseUZ1bGZpbGxlZE9iamVjdCA9IGFzeW5jIG9iaiA9PiB7XG4gICFpc1ByaW1pdGl2ZShvYmopIHx8IEZhaWxgcGFyYW0gbXVzdCBiZSBhbiBvYmplY3RgO1xuICByZXR1cm4gZGVlcGx5RnVsZmlsbGVkKG9iaik7XG59O1xuXG4vKipcbiAqIFRvbGVyYXRlIGFic2VuY2Ugb2YgQWdncmVnYXRlRXJyb3IgaW4gZS5nLiB4c25hcC5cbiAqXG4gKiBAdHlwZSB7KGVycm9yczogRXJyb3JbXSwgbWVzc2FnZT86IHN0cmluZywgb3B0aW9ucz86IG9iamVjdCkgPT4gRXJyb3J9XG4gKi8kaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCBtYWtlQWdncmVnYXRlRXJyb3IgPVxuICB0eXBlb2YgQWdncmVnYXRlRXJyb3IgPT09ICdmdW5jdGlvbidcbiAgICA/IChlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpID0+IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSwgb3B0aW9ucylcbiAgICA6IChlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIG1ha2VFcnJvcihtZXNzYWdlID8/ICdtdWx0aXBsZSBlcnJvcnMnLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIGVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4vKipcbiAqIEFzc2VydCB0aGF0IGEgc3RyaW5nIGhhcyBhIHByZWZpeCwgYW5kIHJldHVybiB0aGUgcGFydCB0aGF0IGZvbGxvd3MgaXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuICAgICAgIGNvbnN0IHN0cmlwUHJlZml4ID0gKHByZWZpeCwgc3RyKSA9PiB7XG4gIHN0ci5zdGFydHNXaXRoKHByZWZpeCkgfHwgRmFpbGAke3N0cn0gaXMgbWlzc2luZyBwcmVmaXggJHtxKHByZWZpeCl9YDtcbiAgcmV0dXJuIHN0ci5zbGljZShwcmVmaXgubGVuZ3RoKTtcbn07XG5cbi8qKlxuICogVGhyb3cgYW4gZXJyb3Igd2l0aCBhbiBvd24gXCJjb2RlXCIgZGF0YSBwcm9wZXJ0eSwgc3VwcG9ydGluZyBpZGVudGlmaWNhdGlvblxuICogd2l0aG91dCBwYXJzaW5nIGBtZXNzYWdlYC4gTm90ZSB0aGF0IHN1Y2ggZXJyb3JzIGFyZSBub3QgUGFzc2FibGUgYW5kIHRodXNcbiAqIGNhbm5vdCBhcHBlYXIgaW5zaWRlIGEgUGFzc2FibGUgc3RydWN0dXJlLCBhbmQgZXZlbiBhdCB0b3AgbGV2ZWwgdGhlIFwiY29kZVwiXG4gKiBwcm9wZXJ0eSB3aWxsIGJlIHNpbGVudGx5IGRyb3BwZWQgYnkgbWFyc2hhbGxpbmcuXG4gKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IENvZGVcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczx0eXBlb2YgbWFrZUVycm9yPlswXX0gZGV0YWlsc1xuICogQHBhcmFtIHtDb2RlfSBjb2RlXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8dHlwZW9mIG1ha2VFcnJvcj5bMl0gJiB7XG4gKiAgIGNvbnN0cnVjdG9yPzogUGFyYW1ldGVyczx0eXBlb2YgbWFrZUVycm9yPlsxXTtcbiAqIH19IFtvcHRzXVxuICovJGjNj19vbmNlLnN0cmlwUHJlZml4KHN0cmlwUHJlZml4KTtcbiAgICAgICBjb25zdCB0aHJvd0Vycm9yQ29kZSA9IChkZXRhaWxzLCBjb2RlLCBvcHRzKSA9PiB7XG4gIGNvbnN0IGVyciA9IG1ha2VFcnJvcihkZXRhaWxzLCBvcHRzPy5jb25zdHJ1Y3Rvciwge1xuICAgIC4uLm9wdHMsXG4gICAgc2FuaXRpemU6IGZhbHNlLFxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ2NvZGUnLCB7IHZhbHVlOiBjb2RlLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICBoYXJkZW4oZXJyKTtcbiAgdGhyb3cgZXJyO1xufTtcblxuLyoqXG4gKiBTeW5jaHJvbnVzbHkgaW52b2tlIGEgZnVuY3Rpb24gd2l0aCB0aGUgb3Bwb3J0dW5pdHkgdG8gaGFuZGxlIGFueSBlcnJvclxuICogc2ltaWxhcmx5IHRvIGEgUHJvbWlzZSBgY2F0Y2hgIGNhbGxiYWNrIChlLmcuLCBzdWJzdGl0dXRpbmcgYSBub24tZXJyb3JcbiAqIHJldHVybmVkIHZhbHVlIG9yIHRocm93aW5nIGEgcG9zc2libHktbmV3IGVycm9yKS4gVGhpcyBpcyB1c2VmdWwgZm9yIChhbW9uZ1xuICogb3RoZXIgdGhpbmdzKSByZXBsYWNpbmcgZ2VuZXJpYyBlcnJvciBtZXNzYWdlcyB3aXRoIHNwZWNpZmljIG9uZXMgKGFzIGluXG4gKiB7QHNlZSB0cnlKc29uUGFyc2V9KS5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBGXG4gKiBAdGVtcGxhdGUgW1U9UmV0dXJuVHlwZTxGPl1cbiAqIEBwYXJhbSB7Rn0gZm4gdG8gaW52b2tlXG4gKiBAcGFyYW0geyhlcnI6IEVycm9yKSA9PiBVfSB0cmFuc2Zvcm1FcnJvciBjYWxsYmFjayB0byByZWNlaXZlIGFueSBlcnJvciBmcm9tXG4gKiAgIGludm9raW5nIGBmbmAgYW5kIGVpdGhlciByZXR1cm4gYSBzdWJzdGl0dXRlIHZhbHVlIG9yIHRocm93IGEgcG90ZW50aWFsbHlcbiAqICAgbmV3IGVycm9yXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8Rj59IGFyZ3MgZm9yIGBmbmBcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPEY+IHwgVX1cbiAqLyRozY9fb25jZS50aHJvd0Vycm9yQ29kZSh0aHJvd0Vycm9yQ29kZSk7XG4gICAgICAgY29uc3QgdHJ5Tm93ID0gKGZuLCB0cmFuc2Zvcm1FcnJvciwgLi4uYXJncykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBmbiguLi5hcmdzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0cmFuc2Zvcm1FcnJvcihlcnIpO1xuICAgIH0gY2F0Y2ggKG5ld0Vycikge1xuICAgICAgLyogVHJ5IHRvIGFzc29jaWF0ZSBgZXJyYCB3aXRoIGBuZXdFcnJgLiovXG4gICAgICBpZiAoIW5ld0Vyci5jYXVzZSkge1xuICAgICAgICBjb25zdCBkZXNjID0ge1xuICAgICAgICAgIHZhbHVlOiBlcnIsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIVJlZmxlY3QuZGVmaW5lUHJvcGVydHkobmV3RXJyLCAnY2F1c2UnLCBkZXNjKSkge1xuICAgICAgICAgIGFzc2VydC5ub3RlKG5ld0VyciwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXdFcnI7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFBhcnNlIEpTT04gdGV4dCwgb3IgaGFuZGxlIGFuIGVycm9yIGJ5IGUuZy4gc3Vic3RpdHV0aW5nIGEgZGVmYXVsdCB2YWx1ZSBvclxuICogcmVwbGFjaW5nIGl0IHdpdGggb25lIGJlYXJpbmcgYSBub24tZ2VuZXJpYyBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBqc29uVGV4dFxuICogQHBhcmFtIHtzdHJpbmcgfCAoKGVycjogRXJyb3IpID0+IHVua25vd24pfSBvbkVycm9yIGFuIGVycm9yIG1lc3NhZ2Ugb3JcbiAqICAgY2FsbGJhY2tcbiAqLyRozY9fb25jZS50cnlOb3codHJ5Tm93KTtcbiAgICAgICBjb25zdCB0cnlKc29uUGFyc2UgPSAoanNvblRleHQsIG9uRXJyb3IpID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtRXJyb3IgPVxuICAgIHR5cGVvZiBvbkVycm9yID09PSAnZnVuY3Rpb24nXG4gICAgICA/IG9uRXJyb3JcbiAgICAgIDogZXJyID0+IEZhaWwoW2Ake29uRXJyb3J9OiAke2Vyci5tZXNzYWdlfSBmb3IgaW5wdXQgYCwgJyddLCBqc29uVGV4dCk7XG4gIHJldHVybiB0cnlOb3coKCkgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YganNvblRleHQ7XG4gICAgdHlwZSA9PT0gJ3N0cmluZycgfHwgRmFpbGBJbnB1dCBtdXN0IGJlIGEgc3RyaW5nLCBub3QgJHtiKHR5cGUpfWA7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblRleHQpO1xuICB9LCB0cmFuc2Zvcm1FcnJvcik7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3JlYWRvbmx5IChUIHwgUHJvbWlzZUxpa2U8VD4pW119IGl0ZW1zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUW10+fVxuICovJGjNj19vbmNlLnRyeUpzb25QYXJzZSh0cnlKc29uUGFyc2UpO1xuICAgICAgIGNvbnN0IFByb21pc2VBbGxPckVycm9ycyA9IGFzeW5jIGl0ZW1zID0+IHtcbiAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChpdGVtcykudGhlbihyZXN1bHRzID0+IHtcbiAgICBjb25zdCBlcnJvcnMgPSAvKiogQHR5cGUge1Byb21pc2VSZWplY3RlZFJlc3VsdFtdfSAqLyAoXG4gICAgICByZXN1bHRzLmZpbHRlcigoeyBzdGF0dXMgfSkgPT4gc3RhdHVzID09PSAncmVqZWN0ZWQnKVxuICAgICkubWFwKHJlc3VsdCA9PiByZXN1bHQucmVhc29uKTtcbiAgICBpZiAoIWVycm9ycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge1Byb21pc2VGdWxmaWxsZWRSZXN1bHQ8VD5bXX0gKi8gKHJlc3VsdHMpLm1hcChcbiAgICAgICAgcmVzdWx0ID0+IHJlc3VsdC52YWx1ZSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aHJvdyBlcnJvcnNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG1ha2VBZ2dyZWdhdGVFcnJvcihlcnJvcnMpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IHRyaWVyXG4gKiBAcGFyYW0geyhlcnJvcj86IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj59IGZpbmFsaXplclxuICogQHJldHVybnMge1JldHVyblR5cGU8dHJpZXI+fVxuICovJGjNj19vbmNlLlByb21pc2VBbGxPckVycm9ycyhQcm9taXNlQWxsT3JFcnJvcnMpO1xuICAgICAgIGNvbnN0IGFnZ3JlZ2F0ZVRyeUZpbmFsbHkgPSBhc3luYyAodHJpZXIsIGZpbmFsaXplcikgPT5cbiAgdHJpZXIoKS50aGVuKFxuICAgIGFzeW5jIHJlc3VsdCA9PiBmaW5hbGl6ZXIoKS50aGVuKCgpID0+IHJlc3VsdCksXG4gICAgYXN5bmMgdHJ5RXJyb3IgPT5cbiAgICAgIGZpbmFsaXplcih0cnlFcnJvcilcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgKCkgPT4gdHJ5RXJyb3IsXG4gICAgICAgICAgZmluYWxpemVFcnJvciA9PiBtYWtlQWdncmVnYXRlRXJyb3IoW3RyeUVycm9yLCBmaW5hbGl6ZUVycm9yXSksXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4oZXJyb3IgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKSxcbiAgKTtcblxuLyoqXG4gKiBSdW4gYSBmdW5jdGlvbiB3aXRoIHRoZSBhYmlsaXR5IHRvIGRlZmVyIGxhc3QtaW4tZmlyc3Qtb3V0IGNsZWFudXAgY2FsbGJhY2tzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geyhcbiAqICAgYWRkQ2xlYW51cDogKGZuOiAoZXJyPzogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPikgPT4gdm9pZCxcbiAqICkgPT4gUHJvbWlzZTxUPn0gZm5cbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPGZuPn1cbiAqLyRozY9fb25jZS5hZ2dyZWdhdGVUcnlGaW5hbGx5KGFnZ3JlZ2F0ZVRyeUZpbmFsbHkpO1xuICAgICAgIGNvbnN0IHdpdGhEZWZlcnJlZENsZWFudXAgPSBhc3luYyBmbiA9PiB7XG4gIC8qKiBAdHlwZSB7KChlcnI/OiB1bmtub3duKSA9PiB1bmtub3duKVtdfSAqL1xuICBjb25zdCBjbGVhbnVwc0xJRk8gPSBbXTtcbiAgLyoqIEB0eXBlIHsoY2xlYW51cDogKGVycj86IHVua25vd24pID0+IHVua25vd24pID0+IHZvaWR9ICovXG4gIGNvbnN0IGFkZENsZWFudXAgPSBjbGVhbnVwID0+IHtcbiAgICBjbGVhbnVwc0xJRk8udW5zaGlmdChjbGVhbnVwKTtcbiAgfTtcbiAgLyoqIEB0eXBlIHsoZXJyPzogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPn0gKi9cbiAgY29uc3QgZmluYWxpemVyID0gYXN5bmMgZXJyID0+IHtcbiAgICAvKiBSdW4gZWFjaCBjbGVhbnVwIGluIGl0cyBvd24gaXNvbGF0ZWQgc3RhY2suKi9cbiAgICBjb25zdCBjbGVhbnVwUmVzdWx0cyA9IGNsZWFudXBzTElGTy5tYXAoYXN5bmMgY2xlYW51cCA9PiB7XG4gICAgICBhd2FpdCBudWxsO1xuICAgICAgcmV0dXJuIGNsZWFudXAoZXJyKTtcbiAgICB9KTtcbiAgICBhd2FpdCBQcm9taXNlQWxsT3JFcnJvcnMoY2xlYW51cFJlc3VsdHMpO1xuICB9O1xuICByZXR1cm4gYWdncmVnYXRlVHJ5RmluYWxseSgoKSA9PiBmbihhZGRDbGVhbnVwKSwgZmluYWxpemVyKTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVFxuICogQHR5cGVkZWYge3sgW1AgaW4ga2V5b2YgVF06IEV4Y2x1ZGU8VFtQXSwgdW5kZWZpbmVkPiB9fSBBbGxEZWZpbmVkXG4gKi9cblxuLyoqXG4gKiBDb25jaXNlIHdheSB0byBjaGVjayB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBmcm9tIG9iamVjdCBsaXRlcmFsIHNob3J0aGFuZC5cbiAqIFRocm93cyBlcnJvciBtZXNzYWdlIHRvIHNwZWNpZnkgdGhlIG1pc3NpbmcgdmFsdWVzLlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpID0+IGFzc2VydHMgb2JqIGlzIEFsbERlZmluZWQ8VD59XG4gKiBAdGhyb3dzIGlmIGFueSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGVudHJpZXMgaXMgbm90IGRlZmluZWRcbiAqLyRozY9fb25jZS53aXRoRGVmZXJyZWRDbGVhbnVwKHdpdGhEZWZlcnJlZENsZWFudXApO1xuICAgICAgIGNvbnN0IGFzc2VydEFsbERlZmluZWQgPSBvYmogPT4ge1xuICBjb25zdCBtaXNzaW5nID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtaXNzaW5nLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgIEZhaWxgbWlzc2luZyAke3EobWlzc2luZyl9YDtcbiAgfVxufTtcblxuLyoqXG4gKiBBdHRlbnVhdGUgYHNwZWNpbWVuYCB0byBvbmx5IHByb3BlcnRpZXMgYWxsb3dlZCBieSBgcGVybWl0YC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQZXJtaXQ8VD59IFBcbiAqIEBwYXJhbSB7VH0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UH0gcGVybWl0XG4gKiBAcGFyYW0gezxVLCBTdWJQIGV4dGVuZHMgUGVybWl0PFU+PihhdHRlbnVhdGlvbjogVSwgcGVybWl0OiBTdWJQKSA9PiBVfSBbdHJhbnNmb3JtXVxuICogICB1c2VkIHRvIHJlcGxhY2UgdGhlIHJlc3VsdHMgb2YgcmVjdXJzaXZlIHBpY2tzIChidXQgbm90IGJsYW5rZXQgcGVybWl0cylcbiAqIEByZXR1cm5zIHtBdHRlbnVhdGVkPFQsIFA+fVxuICovJGjNj19vbmNlLmFzc2VydEFsbERlZmluZWQoYXNzZXJ0QWxsRGVmaW5lZCk7XG4gICAgICAgY29uc3QgYXR0ZW51YXRlID0gKHNwZWNpbWVuLCBwZXJtaXQsIHRyYW5zZm9ybSA9IHggPT4geCkgPT4ge1xuICAvKiBGYXN0LXBhdGggZm9yIG5vIGF0dGVudWF0aW9uLiovXG4gIGlmIChwZXJtaXQgPT09IHRydWUgfHwgdHlwZW9mIHBlcm1pdCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtBdHRlbnVhdGVkPFQsIFA+fSAqLyAoc3BlY2ltZW4pO1xuICB9XG5cbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgcGF0aCA9IFtdO1xuICAvKipcbiAqIEB0ZW1wbGF0ZSBTdWJUXG4gKiBAdGVtcGxhdGUge0V4Y2x1ZGU8UGVybWl0PFN1YlQ+LCBQcmltaXRpdmU+fSBTdWJQXG4gKiBAdHlwZSB7KHNwZWNpbWVuOiBTdWJULCBwZXJtaXQ6IFN1YlApID0+IEF0dGVudWF0ZWQ8U3ViVCwgU3ViUD59XG4gKi9cbiAgY29uc3QgZXh0cmFjdCA9IChzdWJTcGVjaW1lbiwgc3ViUGVybWl0KSA9PiB7XG4gICAgaWYgKHN1YlBlcm1pdCA9PT0gbnVsbCB8fCB0eXBlb2Ygc3ViUGVybWl0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgcGF0aC5sZW5ndGggPT09IDBcbiAgICAgICAgPyBGYWlsYGludmFsaWQgcGVybWl0OiAke3EocGVybWl0KX1gXG4gICAgICAgIDogRmFpbGBpbnZhbGlkIHBlcm1pdCBhdCBwYXRoICR7cShwYXRoKX06ICR7cShzdWJQZXJtaXQpfWA7XG4gICAgfSBlbHNlIGlmIChzdWJTcGVjaW1lbiA9PT0gbnVsbCB8fCB0eXBlb2Ygc3ViU3BlY2ltZW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBwYXRoLmxlbmd0aCA9PT0gMFxuICAgICAgICA/IEZhaWxgc3BlY2ltZW4gbXVzdCBiZSBhbiBvYmplY3QgZm9yIHBlcm1pdCAke3EocGVybWl0KX1gXG4gICAgICAgIDogRmFpbGBzcGVjaW1lbiBhdCBwYXRoICR7cShwYXRoKX0gbXVzdCBiZSBhbiBvYmplY3QgZm9yIHBlcm1pdCAke3Eoc3ViUGVybWl0KX1gO1xuICAgIH1cbiAgICBjb25zdCBwaWNrcyA9IE9iamVjdC5lbnRyaWVzKHN1YlBlcm1pdCkubWFwKChbc3ViS2V5LCBkZWVwUGVybWl0XSkgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaGFzT3duKHN1YlNwZWNpbWVuLCBzdWJLZXkpKSB7XG4gICAgICAgIHRocm93IEZhaWxgc3BlY2ltZW4gaXMgbWlzc2luZyBwYXRoICR7cShwYXRoLmNvbmNhdChzdWJLZXkpKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVlcFNwZWNpbWVuID0gUmVmbGVjdC5nZXQoc3ViU3BlY2ltZW4sIHN1YktleSk7XG4gICAgICBpZiAoZGVlcFBlcm1pdCA9PT0gdHJ1ZSB8fCB0eXBlb2YgZGVlcFBlcm1pdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtzdWJLZXksIGRlZXBTcGVjaW1lbl07XG4gICAgICB9XG4gICAgICBwYXRoLnB1c2goc3ViS2V5KTtcbiAgICAgIGNvbnN0IGV4dHJhY3RlZCA9IGV4dHJhY3QoLyoqIEB0eXBlIHthbnl9ICovIChkZWVwU3BlY2ltZW4pLCBkZWVwUGVybWl0KTtcbiAgICAgIGNvbnN0IGVudHJ5ID0gW3N1YktleSwgZXh0cmFjdGVkXTtcbiAgICAgIHBhdGgucG9wKCk7XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYW5zZm9ybShPYmplY3QuZnJvbUVudHJpZXMocGlja3MpLCBzdWJQZXJtaXQpO1xuICB9O1xuXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIHJldHVybiBleHRyYWN0KHNwZWNpbWVuLCBwZXJtaXQpO1xufTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDx1bmRlZmluZWQsIG5ldmVyPn0gKi8kaM2PX29uY2UuYXR0ZW51YXRlKGF0dGVudWF0ZSk7XG5jb25zdCBub3REb25lID0gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG5cbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8bmV2ZXIsIHZvaWQ+fSAqL1xuY29uc3QgYWx3YXlzRG9uZSA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG5cbiAgICAgICBjb25zdCBmb3JldmVyID0gYXN5bmNHZW5lcmF0ZSgoKSA9PiBub3REb25lKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUfSBwcm9kdWNlIFRoZSB2YWx1ZSBvZiBgYXdhaXQgcHJvZHVjZSgpYCBpcyB1c2VkIGZvciBpdHNcbiAqICAgdHJ1dGhpbmVzcyB2cyBmYWxzaW5lc3MuIElPVywgaXQgaXMgY29lcmNlZCB0byBhIGJvb2xlYW4gc28gdGhlIGNhbGxlciBuZWVkXG4gKiAgIG5vdCBib3RoZXIgZG9pbmcgdGhpcyB0aGVtc2VsdmVzLlxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8QXdhaXRlZDxUPj59XG4gKi8kaM2PX29uY2UuZm9yZXZlcihmb3JldmVyKTtcbiAgICAgICBjb25zdCB3aGlsZVRydWUgPSBwcm9kdWNlID0+XG4gIGFzeW5jR2VuZXJhdGUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcHJvZHVjZSgpO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiBhbHdheXNEb25lO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG4gIH0pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFR9IHByb2R1Y2UgVGhlIHZhbHVlIG9mIGBhd2FpdCBwcm9kdWNlKClgIGlzIHVzZWQgZm9yIGl0c1xuICogICB0cnV0aGluZXNzIHZzIGZhbHNpbmVzcy4gSU9XLCBpdCBpcyBjb2VyY2VkIHRvIGEgYm9vbGVhbiBzbyB0aGUgY2FsbGVyIG5lZWRcbiAqICAgbm90IGJvdGhlciBkb2luZyB0aGlzIHRoZW1zZWx2ZXMuXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxBd2FpdGVkPFQ+Pn1cbiAqLyRozY9fb25jZS53aGlsZVRydWUod2hpbGVUcnVlKTtcbiAgICAgICBjb25zdCB1bnRpbFRydWUgPSBwcm9kdWNlID0+XG4gIGFzeW5jR2VuZXJhdGUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcHJvZHVjZSgpO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIGRvbmU6IHRydWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfSk7XG5cbi8qKiBAdHlwZSB7PFgsIFk+KHhzOiBYW10sIHlzOiBZW10pID0+IFtYLCBZXVtdfSAqLyRozY9fb25jZS51bnRpbFRydWUodW50aWxUcnVlKTtcbiAgICAgICBjb25zdCB6aXAgPSAoeHMsIHlzKSA9PiBoYXJkZW4oeHMubWFwKCh4LCBpKSA9PiBbeCwgeXNbK2ldXSkpO1xuXG4vKipcbiAqIEB0eXBlIHs8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEVSZWY8YW55Pj4+KFxuICogICBvYmo6IFQsXG4gKiApID0+IFByb21pc2U8eyBbSyBpbiBrZXlvZiBUXTogQXdhaXRlZDxUW0tdPiB9Pn1cbiAqLyRozY9fb25jZS56aXAoemlwKTtcbiAgICAgICBjb25zdCBhbGxWYWx1ZXMgPSBhc3luYyBvYmogPT4ge1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IFByb21pc2UuYWxsKHZhbHVlcyhvYmopKTtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgcmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyh6aXAoa2V5cyhvYmopLCByZXNvbHZlZCkpKTtcbn07XG5cbi8qKlxuICogQSB0ZWUgaW1wbGVtZW50YXRpb24gd2hlcmUgYWxsIHJlYWRlcnMgYXJlIHN5bmNocm9uaXplZCB3aXRoIGVhY2ggb3RoZXIuIFRoZXlcbiAqIGFsbCBjb25zdW1lIHRoZSBzb3VyY2Ugc3RyZWFtIGluIGxvY2tzdGVwLCBhbmQgYW55IG9uZSByZXR1cm5pbmcgb3IgdGhyb3dpbmdcbiAqIGVhcmx5IHdpbGwgYWZmZWN0IHRoZSBvdGhlcnMuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0FzeW5jSXRlcmF0b3I8VCwgdm9pZCwgdm9pZD59IHNvdXJjZVN0cmVhbVxuICogQHBhcmFtIHtudW1iZXJ9IHJlYWRlckNvdW50XG4gKi8kaM2PX29uY2UuYWxsVmFsdWVzKGFsbFZhbHVlcyk7XG4gICAgICAgY29uc3Qgc3luY2hyb25pemVkVGVlID0gKHNvdXJjZVN0cmVhbSwgcmVhZGVyQ291bnQpID0+IHtcbiAgLyoqIEB0eXBlIHtJdGVyYXRvclJldHVyblJlc3VsdDx2b2lkPiB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IGRvbmVSZXN1bHQ7XG5cbiAgLyoqXG4gKiBAdHlwZWRlZiB7SXRlcmF0b3JSZXN1bHQ8XG4gKiAgICh2YWx1ZTogUHJvbWlzZUxpa2U8SXRlcmF0b3JSZXN1bHQ8VD4+KSA9PiB2b2lkXG4gKiA+fSBRdWV1ZVBheWxvYWRcbiAqL1xuICAvKiogQHR5cGUge0FzeW5jUXVldWU8UXVldWVQYXlsb2FkPltdfSAqL1xuICBjb25zdCBxdWV1ZXMgPSBbXTtcblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGNvbnN0IHB1bGxOZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHF1ZXVlcy5tYXAocXVldWUgPT4gcXVldWUuZ2V0KCkpKTtcbiAgICBjb25zdCByZWplY3Rpb25zID0gW107XG4gICAgLyoqIEB0eXBlIHtBcnJheTwodmFsdWU6IFByb21pc2VMaWtlPEl0ZXJhdG9yUmVzdWx0PFQ+PikgPT4gdm9pZD59ICovXG4gICAgY29uc3QgcmVzb2x2ZXJzID0gW107XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHNldHRsZWRSZXN1bHQgb2YgcmVxdWVzdHMpIHtcbiAgICAgIGlmIChzZXR0bGVkUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICByZWplY3Rpb25zLnB1c2goc2V0dGxlZFJlc3VsdC5yZWFzb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZSB8fD0gISFzZXR0bGVkUmVzdWx0LnZhbHVlLmRvbmU7XG4gICAgICAgIHJlc29sdmVycy5wdXNoKHNldHRsZWRSZXN1bHQudmFsdWUudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiogQHR5cGUge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+fSAqL1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKGRvbmVSZXN1bHQpIHtcbiAgICAgIHJlc3VsdCA9IFByb21pc2UucmVzb2x2ZShkb25lUmVzdWx0KTtcbiAgICB9IGVsc2UgaWYgKHJlamVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG1ha2VFcnJvcihYYFRlZWQgc3RyZWFtIHRocmV3YCk7XG4gICAgICBhbm5vdGF0ZUVycm9yKGVycm9yLCBYYFRlZWQgcmVqZWN0aW9uczogJHtyZWplY3Rpb25zfWApO1xuICAgICAgcmVzdWx0ID1cbiAgICAgICAgc291cmNlU3RyZWFtLnRocm93Py4oZXJyb3IpIHx8XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShzb3VyY2VTdHJlYW0ucmV0dXJuPy4oKSkudGhlbigoKSA9PlxuICAgICAgICAgIFByb21pc2UucmVqZWN0KGVycm9yKSxcbiAgICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGRvbmUpIHtcbiAgICAgIHJlc3VsdCA9XG4gICAgICAgIHNvdXJjZVN0cmVhbS5yZXR1cm4/LigpIHx8XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHNvdXJjZVN0cmVhbS5uZXh0KCk7XG4gICAgfVxuICAgIHJlc3VsdC50aGVuKFxuICAgICAgciA9PiB7XG4gICAgICAgIGlmIChyLmRvbmUpIHtcbiAgICAgICAgICBkb25lUmVzdWx0ID0gcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgZG9uZVJlc3VsdCA9IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgfSxcbiAgICApO1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZSBvZiByZXNvbHZlcnMpIHtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHB1bGxOZXh0KCk7XG4gIH07XG5cbiAgY29uc3QgcmVhZGVycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHJlYWRlckNvdW50IH0pLm1hcCgoKSA9PiB7XG4gICAgLyoqIEB0eXBlIHtBc3luY1F1ZXVlPFF1ZXVlUGF5bG9hZD59ICovXG4gICAgY29uc3QgcXVldWUgPSBtYWtlUXVldWUoKTtcbiAgICBxdWV1ZXMucHVzaChxdWV1ZSk7XG5cbiAgICAvKiogQHR5cGUge0FzeW5jR2VuZXJhdG9yPFQsIHZvaWQsIHZvaWQ+fSAqL1xuICAgIGNvbnN0IHJlYWRlciA9IGhhcmRlbih7XG4gICAgICBhc3luYyBuZXh0KCkge1xuICAgICAgICAvKipcbiAqIEB0eXBlIHtQcm9taXNlS2l0PEl0ZXJhdG9yUmVzdWx0PFQ+Pn1cbiAqL1xuICAgICAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gICAgICAgIHF1ZXVlLnB1dCh7IHZhbHVlOiByZXNvbHZlLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgcmV0dXJuKCkge1xuICAgICAgICAvKipcbiAqIEB0eXBlIHtQcm9taXNlS2l0PEl0ZXJhdG9yUmVzdWx0PFQ+Pn1cbiAqL1xuICAgICAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gICAgICAgIHF1ZXVlLnB1dCh7IHZhbHVlOiByZXNvbHZlLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBhc3luYyB0aHJvdyhyZWFzb24pIHtcbiAgICAgICAgY29uc3QgcmVqZWN0aW9uID0gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgcXVldWUucHV0KHJlamVjdGlvbik7XG4gICAgICAgIHJldHVybiByZWplY3Rpb247XG4gICAgICB9LFxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG4gICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gcmVhZGVyO1xuICAgICAgfSxcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuICAgICAgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuICAgICAgICBhd2FpdCByZWFkZXIucmV0dXJuKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiByZWFkZXI7XG4gIH0pO1xuXG4gIHZvaWQgcHVsbE5leHQoKTtcbiAgcmV0dXJuIHJlYWRlcnM7XG59OyRozY9fb25jZS5zeW5jaHJvbml6ZWRUZWUoc3luY2hyb25pemVkVGVlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7Im9iamVjdE1hcCI6WyJvYmplY3RNYXAiLGZhbHNlXSwib2JqZWN0TWV0YU1hcCI6WyJvYmplY3RNZXRhTWFwIixmYWxzZV0sImZyb21VbmlxdWVFbnRyaWVzIjpbImZyb21VbmlxdWVFbnRyaWVzIixmYWxzZV19LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxpbWl0ZWRDb25zb2xlIjpbIm1ha2VMaW1pdGVkQ29uc29sZSJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sInN0cmlwUHJlZml4IjpbInN0cmlwUHJlZml4Il0sInRocm93RXJyb3JDb2RlIjpbInRocm93RXJyb3JDb2RlIl0sInRyeU5vdyI6WyJ0cnlOb3ciXSwidHJ5SnNvblBhcnNlIjpbInRyeUpzb25QYXJzZSJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJ3aXRoRGVmZXJyZWRDbGVhbnVwIjpbIndpdGhEZWZlcnJlZENsZWFudXAiXSwiYXNzZXJ0QWxsRGVmaW5lZCI6WyJhc3NlcnRBbGxEZWZpbmVkIl0sImF0dGVudWF0ZSI6WyJhdHRlbnVhdGUiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXSwic3luY2hyb25pemVkVGVlIjpbInN5bmNocm9uaXplZFRlZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADaiNsr1gMAANYDAAAlAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3RtcERpci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRlbXBEaXJGYWN0b3J5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qKlxuICogQ3JlYXRlIGEgYHRtcERpcmAgZnVuY3Rpb24gdGhhdCBzeW5jaHJvbm91c2x5IGNyZWF0ZXMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5XG4gKiBhbmQgYSBmdW5jdGlvbiBmb3IgZGVsZXRpbmcgaXQgYWxvbmcgd2l0aCBhbnkgYWRkZWQgY29udGVudHMuXG4gKlxuICogQHBhcmFtIHtQaWNrPElNUE9SVCgndG1wJyksICdkaXJTeW5jJz59IHRtcFxuICovXG4gICAgICAgY29uc3QgbWFrZVRlbXBEaXJGYWN0b3J5ID0gdG1wID0+IHtcbiAgLyoqIEB0eXBlIHsocHJlZml4Pzogc3RyaW5nKSA9PiBbZGlyTmFtZTogc3RyaW5nLCBjbGVhbnVwOiAoKSA9PiB2b2lkXX0gKi9cbiAgY29uc3QgdG1wRGlyID0gcHJlZml4ID0+IHtcbiAgICBjb25zdCB7IG5hbWUsIHJlbW92ZUNhbGxiYWNrIH0gPSB0bXAuZGlyU3luYyh7XG4gICAgICBwcmVmaXgsXG4gICAgICB1bnNhZmVDbGVhbnVwOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBbbmFtZSwgcmVtb3ZlQ2FsbGJhY2tdO1xuICB9O1xuICByZXR1cm4gdG1wRGlyO1xufTskaM2PX29uY2UubWFrZVRlbXBEaXJGYWN0b3J5KG1ha2VUZW1wRGlyRmFjdG9yeSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGVtcERpckZhY3RvcnkiOlsibWFrZVRlbXBEaXJGYWN0b3J5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE5ip5ahBAAAoQQAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUNoZWNrLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiY2FzdCIsIm11c3RNYXRjaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHR5cGVsZXNzTXVzdE1hdGNoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKHR5cGVsZXNzTXVzdE1hdGNoID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBpbXBvcnQge011c3RNYXRjaCwgUGF0dGVyblR5cGUsIFR5cGVkUGF0dGVybn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqIEB0eXBlIHtNdXN0TWF0Y2h9ICovXG4gICAgICAgY29uc3QgbXVzdE1hdGNoID0gdHlwZWxlc3NNdXN0TWF0Y2g7XG5cbi8qKlxuICogQHRlbXBsYXRlIE1cbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7VHlwZWRQYXR0ZXJuPE0+fSBwYXR0XG4gKiBAcmV0dXJucyB7TX1cbiAqLyRozY9fb25jZS5tdXN0TWF0Y2gobXVzdE1hdGNoKTtcbiAgICAgICBjb25zdCBjYXN0ID0gKHNwZWNpbWVuLCBwYXR0KSA9PiB7XG4gIC8qIG11c3RNYXRjaCB0aHJvd3MgaWYgdGhleSBkb24ndCwgd2hpY2ggbWVhbnMgdGhhdCBgY2FzdGAgYWxzbyBuYXJyb3dzIHRoZSovXG4gIC8qIHR5cGUgYnV0IGEgZnVuY3Rpb24gY2FuJ3QgYm90aCBuYXJyb3cgYW5kIHJldHVybiBhIHR5cGUuIFRoYXQgaXMgYnkgZGVzaWduOiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzQ2MzYjaXNzdWVjb21tZW50LTU0NTAyNTkxNiovXG4gIG11c3RNYXRjaChzcGVjaW1lbiwgcGF0dCk7XG4gIHJldHVybiBzcGVjaW1lbjtcbn07JGjNj19vbmNlLmNhc3QoY2FzdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl0sImNhc3QiOlsiY2FzdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACrfHXEowUAAKMFAAApAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJCcmlkZ2VCaWdJbnRTaGFwZSIsIlN0b3JhZ2VOb2RlU2hhcGUiLCJVbmd1YXJkZWRIZWxwZXJJIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7VHlwZWRQYXR0ZXJufSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4gICAgICAgY29uc3QgU3RvcmFnZU5vZGVTaGFwZSA9IE0ucmVtb3RhYmxlKCdTdG9yYWdlTm9kZScpO1xuXG4vKiogVG8gYmUgdXNlZCBvbmx5IGZvciAnaGVscGVyJyBmYWNldHMgd2hlcmUgdGhlIGNhbGxzIGFyZSBmcm9tIHRydXN0ZWQgY29kZS4gKi8kaM2PX29uY2UuU3RvcmFnZU5vZGVTaGFwZShTdG9yYWdlTm9kZVNoYXBlKTtcbiAgICAgICBjb25zdCBVbmd1YXJkZWRIZWxwZXJJID0gTS5pbnRlcmZhY2UoXG4gICdoZWxwZXInLFxuICB7fSxcbiAgLyogbm90IGV4cG9zZWQgc28gdXNpbmcgYGRlZmF1bHRHdWFyZHNgIGlzIGZpbmUuKi9cbiAgeyBkZWZhdWx0R3VhcmRzOiAncGFzc2FibGUnIH0sXG4pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtudW1iZXIgfCBgJHtiaWdpbnR9YH0gQnJpZGdlQmlnSW50IEVuc3VyZSB0aGF0IGNhbGxlZXMgcGFzc2VkIGFcbiAqICAgYnJpZGdlIG1lc3NhZ2UgdGhhdCB3YXMgc2VyaWFsaXNlZCBmcm9tIGEgR29sYW5nIGludDY0IG9yIHVpbnQ2NCBhY2NlcHRcbiAqICAgZWl0aGVyIGEgSlMgbnVtYmVyIG9yIGEgc3RyaW5naWZpZWQgSlMgYmlnaW50LlxuICovXG5cbi8qKlxuICogQHR5cGUge1R5cGVkUGF0dGVybjxCcmlkZ2VCaWdJbnQ+fVxuICovJGjNj19vbmNlLlVuZ3VhcmRlZEhlbHBlckkoVW5ndWFyZGVkSGVscGVySSk7XG4gICAgICAgY29uc3QgQnJpZGdlQmlnSW50U2hhcGUgPSBNLm9yKE0ubnVtYmVyKCksIE0uc3RyaW5nKCkpOyRozY9fb25jZS5CcmlkZ2VCaWdJbnRTaGFwZShCcmlkZ2VCaWdJbnRTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTdG9yYWdlTm9kZVNoYXBlIjpbIlN0b3JhZ2VOb2RlU2hhcGUiXSwiVW5ndWFyZGVkSGVscGVySSI6WyJVbmd1YXJkZWRIZWxwZXJJIl0sIkJyaWRnZUJpZ0ludFNoYXBlIjpbIkJyaWRnZUJpZ0ludFNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACoAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA14cZPXAMAABwDAAAKgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91cGdyYWRlLWFwaS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiLCJpc0FiYW5kb25lZEVycm9yIiwiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiIsIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sbWF0Y2hlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbmNvbnN0IHsgaXNGcm96ZW4gfSA9IE9iamVjdDtcblxuLyoqXG4gKiBBbiBFcnJvci1saWtlIG9iamVjdCBmb3IgdXNlIGFzIHRoZSByZWplY3Rpb24gcmVhc29uIG9mIHByb21pc2VzIGFiYW5kb25lZCBieVxuICogdXBncmFkZS5cbiAqXG4gKiBAdHlwZWRlZiB7e1xuICogICBuYW1lOiAndmF0VXBncmFkZWQnO1xuICogICB1cGdyYWRlTWVzc2FnZTogc3RyaW5nO1xuICogICBpbmNhcm5hdGlvbk51bWJlcjogbnVtYmVyO1xuICogfX0gVXBncmFkZURpc2Nvbm5lY3Rpb25cbiAqL1xuXG4gICAgICAgY29uc3QgVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSA9IGhhcmRlbih7XG4gIG5hbWU6ICd2YXRVcGdyYWRlZCcsXG4gIHVwZ3JhZGVNZXNzYWdlOiBNLnN0cmluZygpLFxuICBpbmNhcm5hdGlvbk51bWJlcjogTS5udW1iZXIoKSxcbn0pO1xuXG4vKipcbiAqIE1ha2VzIGFuIEVycm9yLWxpa2Ugb2JqZWN0IGZvciB1c2UgYXMgdGhlIHJlamVjdGlvbiByZWFzb24gb2YgcHJvbWlzZXNcbiAqIGFiYW5kb25lZCBieSB1cGdyYWRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cGdyYWRlTWVzc2FnZVxuICogQHBhcmFtIHtudW1iZXJ9IHRvSW5jYXJuYXRpb25OdW1iZXJcbiAqIEByZXR1cm5zIHtVcGdyYWRlRGlzY29ubmVjdGlvbn1cbiAqLyRozY9fb25jZS5VcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiA9ICh1cGdyYWRlTWVzc2FnZSwgdG9JbmNhcm5hdGlvbk51bWJlcikgPT5cbiAgaGFyZGVuKHtcbiAgICBuYW1lOiAndmF0VXBncmFkZWQnLFxuICAgIHVwZ3JhZGVNZXNzYWdlLFxuICAgIGluY2FybmF0aW9uTnVtYmVyOiB0b0luY2FybmF0aW9uTnVtYmVyLFxuICB9KTskaM2PX29uY2UubWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gcmVhc29uIElmIGByZWFzb25gIGlzIG5vdCBmcm96ZW4sIGl0IGNhbm5vdCBiZSBhblxuICogICBVcGdyYWRlRGlzY29ubmVjdGlvbiwgc28gcmV0dXJucyBmYWxzZSB3aXRob3V0IGV2ZW4gY2hlY2tpbmcgYWdhaW5zdCB0aGVcbiAqICAgc2hhcGUuXG4gKiBAcmV0dXJucyB7cmVhc29uIGlzIFVwZ3JhZGVEaXNjb25uZWN0aW9ufVxuICovXG4gICAgICAgY29uc3QgaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9IHJlYXNvbiA9PlxuICByZWFzb24gIT0gbnVsbCAmJiAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcSovXG4gIGlzRnJvemVuKHJlYXNvbikgJiZcbiAgbWF0Y2hlcyhyZWFzb24sIFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpOyRozY9fb25jZS5pc1VwZ3JhZGVEaXNjb25uZWN0aW9uKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuaGFyZGVuKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhIHJlYXNvbiBpcyBhICd2YXQgdGVybWluYXRlZCcgZXJyb3IgZ2VuZXJhdGVkIHdoZW4gYW4gb2JqZWN0XG4gKiBpcyBhYmFuZG9uZWQgYnkgYSB2YXQgZHVyaW5nIGFuIHVwZ3JhZGUuXG4gKlxuICogTm9ybWFsbHkgd2UgZG8gbm90IHdhbnQgdG8gcmVseSBvbiB0aGUgYG1lc3NhZ2VgIG9mIGFuIGVycm9yIG9iamVjdCwgYnV0IHRoaXNcbiAqIGlzIGEgcHJhZ21hdGljIHNvbHV0aW9uIHRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHZhdCB1cGdyYWRlIGVycm9ycy4gSW4gdGhlXG4gKiBmdXR1cmUgd2UnZCBwcmVmZXIgaGF2aW5nIGFuIGVycm9yIHdpdGggYSBjYXVzZSByZWZlcmVuY2luZyBhIGRpc2Nvbm5lY3Rpb25cbiAqIG9iamVjdCBsaWtlIGZvciBwcm9taXNlIHJlamVjdGlvbnMuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85NTgyXG4gKlxuICogQHBhcmFtIHthbnl9IHJlYXNvblxuICogQHJldHVybnMge3JlYXNvbiBpcyBFcnJvcn1cbiAqL1xuICAgICAgIGNvbnN0IGlzQWJhbmRvbmVkRXJyb3IgPSByZWFzb24gPT5cbiAgcmVhc29uICE9IG51bGwgJiYgLyogZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXEqL1xuICBpc0Zyb3plbihyZWFzb24pICYmXG4gIG1hdGNoZXMocmVhc29uLCBNLmVycm9yKCkpICYmXG4gIC8qIFdlJ3JlIG5vdCB1c2luZyBhIGNvbnN0YW50IGhlcmUgc2luY2UgdGhpcyBzcGVjaWFsIHZhbHVlIGlzIGFscmVhZHkqL1xuICAvKiBzcHJpbmtsZWQgdGhyb3VnaG91dCB0aGUgU0RLKi9cbiAgcmVhc29uLm1lc3NhZ2UgPT09ICd2YXQgdGVybWluYXRlZCc7JGjNj19vbmNlLmlzQWJhbmRvbmVkRXJyb3IoaXNBYmFuZG9uZWRFcnJvcik7XG5oYXJkZW4oaXNBYmFuZG9uZWRFcnJvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlIjpbIlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiXSwibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIjpbIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwiaXNBYmFuZG9uZWRFcnJvciI6WyJpc0FiYW5kb25lZEVycm9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD/hQTwZFAAAGRQAADMAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLHN1YnNjcmliZUxhdGVzdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7QmFzZU5vdGlmaWVyLCBJdGVyYXRpb25PYnNlcnZlciwgTGF0ZXN0VG9waWN9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYHN1YnNjcmliZUxhdGVzdGAgZnJvbSBgQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanNgIGluc3RlYWQuXG4gKlxuICogQWRhcHRvciBmcm9tIGEgbm90aWZpZXJQIHRvIGFuIGFzeW5jIGl0ZXJhYmxlLlxuICogVGhlIG5vdGlmaWVyUCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGhhcyBhbiBldmVudHVhbGx5IGludm9jYWJsZVxuICogYGdldFVwZGF0ZVNpbmNlYCBtZXRob2QgdGhhdCBiZWhhdmVzIGFjY29yZGluZyB0byB0aGUgbm90aWZpZXJcbiAqIHNwZWMuIFRoaXMgY2FuIGJlIGEgbm90aWZpZXIsIGEgcHJvbWlzZSBmb3IgYSBsb2NhbCBvciByZW1vdGVcbiAqIG5vdGlmaWVyLCBvciBhIHByZXNlbmNlIG9mIGEgcmVtb3RlIG5vdGlmaWVyLlxuICpcbiAqIEl0IGlzIGFsc28gdXNlZCBpbnRlcm5hbGx5IGJ5IG5vdGlmaWVyLmpzIHNvIHRoYXQgYSBub3RpZmllciBpdHNlbGYgaXMgYW5cbiAqIGFzeW5jIGl0ZXJhYmxlLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhYmxlIGlzIGFuIG9iamVjdCB3aXRoIGEgYFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKWAgbWV0aG9kXG4gKiB0aGF0IHJldHVybnMgYW4gYXN5bmMgaXRlcmF0b3IuIFRoZSBhc3luYyBpdGVyYXRvciB3ZSByZXR1cm4gaGVyZSBoYXMgb25seVxuICogYSBgbmV4dCgpYCBtZXRob2QsIHdpdGhvdXQgdGhlIG9wdGlvbmFsIGByZXR1cm5gIGFuZCBgdGhyb3dgIG1ldGhvZHMuIFRoZVxuICogb21pdHRlZCBtZXRob2RzLCBpZiBwcmVzZW50LCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB0b1xuICogaW5mb3JtIHRoZSBpdGVyYXRvciBvZiBlYXJseSB0ZXJtaW5hdGlvbi4gQnV0IHRoaXMgYWRhcHRvciB3b3VsZCBub3QgZG9cbiAqIGFueXRoaW5nIHVzZWZ1bCBpbiByZWFjdGlvbiB0byB0aGlzIG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYXRvcidzIGBuZXh0KClgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gaXRlcmF0aW9uXG4gKiByZXN1bHQuIEFuIGl0ZXJhdGlvbiByZXN1bHQgaXMgYSByZWNvcmQgd2l0aCBgdmFsdWVgIGFuZCBgZG9uZWAgcHJvcGVydGllcy5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiBidWlsZGluZyBvbiB0aGUgbm90aWZpZXIgcHJvdG9jb2wgaXMgdG8gaGF2ZSBhIGxvc3N5XG4gKiBhZGFwdG9yLCB3aGVyZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBjYW4gYmUgbWlzc2VkIGluIGZhdm9yIG9mIG1vcmUgcmVjZW50XG4gKiByZXN1bHRzIHdoaWNoIGFyZSB0aGVyZWZvcmUgbGVzcyBzdGFsZS4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2RvY3VtZW50YXRpb24vYmxvYi9IRUFEL21haW4vZ3VpZGVzL2pzLXByb2dyYW1taW5nL25vdGlmaWVycy5tZFxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIgPSBzdWJzY3JpYmVMYXRlc3Q7XG5cbi8qKlxuICogVGhpcyBhZHZhbmNlcyBgYXN5bmNJdGVyYXRvclBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRvcmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYXRvcjxUPj59IGFzeW5jSXRlcmF0b3JQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRozY9fb25jZS5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcik7XG4gICAgICAgY29uc3Qgb2JzZXJ2ZUl0ZXJhdG9yID0gKGFzeW5jSXRlcmF0b3JQLCBpdGVyYXRpb25PYnNlcnZlcikgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKGFjaywgb2JzZXJ2ZXJFcnJvcikgPT4ge1xuICAgIGNvbnN0IHJlY3VyID0gKCkgPT4ge1xuICAgICAgRS53aGVuKFxuICAgICAgICBFKGFzeW5jSXRlcmF0b3JQKS5uZXh0KCksXG4gICAgICAgICh7IHZhbHVlLCBkb25lIH0pID0+IHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoICYmIGl0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCh2YWx1ZSk7XG4gICAgICAgICAgICBhY2sodW5kZWZpbmVkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUgJiZcbiAgICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUodmFsdWUpO1xuICAgICAgICAgICAgcmVjdXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbiA9PiB7XG4gICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbCAmJiBpdGVyYXRpb25PYnNlcnZlci5mYWlsKHJlYXNvbik7XG4gICAgICAgICAgYWNrKHVuZGVmaW5lZCk7XG4gICAgICAgIH0sXG4gICAgICApLmNhdGNoKG9ic2VydmVyRXJyb3IpO1xuICAgIH07XG4gICAgcmVjdXIoKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFRoaXMgcmVhZHMgZnJvbSBgYXN5bmNJdGVyYWJsZVBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRpb25gIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaM2PX29uY2Uub2JzZXJ2ZUl0ZXJhdG9yKG9ic2VydmVJdGVyYXRvcik7XG4gICAgICAgY29uc3Qgb2JzZXJ2ZUl0ZXJhdGlvbiA9IChhc3luY0l0ZXJhYmxlUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpID0+IHtcbiAgY29uc3QgaXRlcmF0b3JQID0gRShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gIHJldHVybiBvYnNlcnZlSXRlcmF0b3IoaXRlcmF0b3JQLCBpdGVyYXRpb25PYnNlcnZlcik7XG59O1xuXG4vKipcbiAqIEFzIHVwZGF0ZXMgY29tZSBpbiBmcm9tIHRoZSBwb3NzaWJseSByZW1vdGUgYG5vdGlmaWVyUGAsIHVwZGF0ZVxuICogdGhlIGxvY2FsIGB1cGRhdGVyYC4gU2luY2UgdGhlIHVwZGF0ZXMgY29tZSBmcm9tIGEgbm90aWZpZXIsIHRoZXlcbiAqIGFyZSBsb3NzeSwgaS5lLiwgb25jZSBhIG1vcmUgcmVjZW50IHN0YXRlIGNhbiBiZSByZXBvcnRlZCwgbGVzcyByZWNlbnRcbiAqIHN0YXRlcyBhcmUgYXNzdW1lZCBpcnJlbGV2YW50IGFuZCBkcm9wcGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSBub3RpZmllclBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjNj19vbmNlLm9ic2VydmVJdGVyYXRpb24ob2JzZXJ2ZUl0ZXJhdGlvbik7XG4gICAgICAgY29uc3Qgb2JzZXJ2ZU5vdGlmaWVyID0gKG5vdGlmaWVyUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpID0+XG4gIG9ic2VydmVJdGVyYXRpb24oc3Vic2NyaWJlTGF0ZXN0KG5vdGlmaWVyUCksIGl0ZXJhdGlvbk9ic2VydmVyKTskaM2PX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdLCJvYnNlcnZlSXRlcmF0b3IiOlsib2JzZXJ2ZUl0ZXJhdG9yIl0sIm9ic2VydmVJdGVyYXRpb24iOlsib2JzZXJ2ZUl0ZXJhdGlvbiJdLCJvYnNlcnZlTm90aWZpZXIiOlsib2JzZXJ2ZU5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMI+7bjrBwAA6wcAACQAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi9ub3RpZmllci5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIi4vdG9waWMuanMiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllcktpdCIsIm1ha2VOb3RpZmllcktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Iiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZUl0ZXJhdG9yIiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Iiwic3Vic2NyaWJlTGF0ZXN0Iiwic3Vic2NyaWJlTGF0ZXN0IixudWxsXSwicmVleHBvcnRzIjpbIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW11dLFtcIi4vbm90aWZpZXIuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbXV0sW1wiLi90b3BpYy5qc1wiLCBbXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbXV0sW1wiLi9zdG9yZXN1Yi5qc1wiLCBbXV0sW1wiLi9zdG9yZWQtbm90aWZpZXIuanNcIiwgW11dLFtcIi4vdHlwZXMtaW5kZXguanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3B1Ymxpc2gta2l0LmpzIjpbWyJtYWtlUHVibGlzaEtpdCIsIm1ha2VQdWJsaXNoS2l0Il0sWyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSxbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIl0sWyJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUVhY2hUb3BpY0kiXSxbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIiwiSXRlcmFibGVMYXRlc3RUb3BpY0kiXSxbIlN1YnNjcmliZXJTaGFwZSIsIlN1YnNjcmliZXJTaGFwZSJdXSwiLi9zdWJzY3JpYmUuanMiOltbInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVFYWNoIl0sWyJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiXV0sIi4vbm90aWZpZXIuanMiOltbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllciJdLFsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0Il0sWyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl0sWyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl1dLCIuL3N1YnNjcmliZXIuanMiOltbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uIl0sWyJtYWtlU3Vic2NyaXB0aW9uS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCJdXSwiLi90b3BpYy5qcyI6W1sibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyIsIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXV0sIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOltbIm9ic2VydmVOb3RpZmllciIsIm9ic2VydmVOb3RpZmllciJdLFsib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZUl0ZXJhdG9yIl0sWyJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdGlvbiJdLFsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAs0n/TsUbAADFGwAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9ub3RpZmllci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0LEUsRmFyLG1ha2VQdWJsaXNoS2l0LHN1YnNjcmliZUxhdGVzdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UmVtb3RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0xhdGVzdFRvcGljLCBOb3RpZmllciwgTm90aWZpZXJSZWNvcmQsIFB1Ymxpc2hLaXQsIFN1YnNjcmliZXIsIFVwZGF0ZVJlY29yZH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gc2hhcmFibGVJbnRlcm5hbHNQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXIgPSBzaGFyYWJsZUludGVybmFsc1AgPT4ge1xuICAvKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuICBjb25zdCBub3RpZmllciA9IEZhcignbm90aWZpZXInLCB7XG4gICAgLi4uc3Vic2NyaWJlTGF0ZXN0KHNoYXJhYmxlSW50ZXJuYWxzUCksXG4gICAgZ2V0VXBkYXRlU2luY2U6IGFzeW5jIHVwZGF0ZUNvdW50ID0+XG4gICAgICBFKHNoYXJhYmxlSW50ZXJuYWxzUCkuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuXG4gICAgLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgTm90aWZpZXIgZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIE5vdGlmaWVyIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VOb3RpZmllcmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBOb3RpZmllciBhdCB0aGF0IHNpdGUuXG4gKi9cbiAgICBnZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOiBhc3luYyAoKSA9PiBzaGFyYWJsZUludGVybmFsc1AsXG4gICAgLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogVXNlZCBvbmx5IGJ5IGBtYWtlQ2FzdGluZ1NwZWNGcm9tUmVmYC4gIEluc3RlYWQgdGhhdCBmdW5jdGlvbiBzaG91bGQgdXNlXG4gKiB0aGUgYFN0b3JlZEZhY2V0YCBBUEkuXG4gKi9cbiAgICBnZXRTdG9yZUtleTogKCkgPT4gaGFyZGVuKHsgbm90aWZpZXIgfSksXG4gIH0pO1xuICByZXR1cm4gbm90aWZpZXI7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj4gfCBSZW1vdGU8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqLyRozY9fb25jZS5tYWtlTm90aWZpZXIobWFrZU5vdGlmaWVyKTtcbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciA9IHN1YnNjcmliZXIgPT4ge1xuICAvKipcbiAqIEB0eXBlIHtMYXRlc3RUb3BpYzxUPn1cbiAqL1xuICBjb25zdCBiYXNlTm90aWZpZXIgPSBoYXJkZW4oe1xuICAgIGdldFVwZGF0ZVNpbmNlOiAodXBkYXRlQ291bnQgPSB1bmRlZmluZWQpID0+XG4gICAgICBFKHN1YnNjcmliZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbiAgY29uc3Qgbm90aWZpZXIgPSBGYXIoJ25vdGlmaWVyJywge1xuICAgIC4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuICAgIC4uLmJhc2VOb3RpZmllcixcbiAgfSk7XG4gIHJldHVybiBub3RpZmllcjtcbn07JGjNj19vbmNlLm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5cbi8qKlxuICogUHJvZHVjZXMgYSBwYWlyIG9mIG9iamVjdHMsIHdoaWNoIGFsbG93IGEgc2VydmljZSB0byBwcm9kdWNlIGEgc3RyZWFtIG9mXG4gKiB1cGRhdGUgcHJvbWlzZXMuXG4gKlxuICogVGhlIGluaXRpYWwgc3RhdGUgYXJndW1lbnQgaGFzIHRvIGJlIHRydWx5IG9wdGlvbmFsIGV2ZW4gdGhvdWdoIGl0IGNhblxuICogYmUgYW55IGZpcnN0IGNsYXNzIHZhbHVlIGluY2x1ZGluZyBgdW5kZWZpbmVkYC4gV2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGVcbiAqIHByZXNlbmNlIHZzIHRoZSBhYnNlbmNlIG9mIGl0LCB3aGljaCB3ZSBjYW5ub3QgZG8gd2l0aCB0aGUgb3B0aW9uYWwgYXJndW1lbnRcbiAqIHN5bnRheC4gUmF0aGVyIHdlIHVzZSB0aGUgYXJpdHkgb2YgdGhlIGBpbml0aWFsU3RhdGVBcnJgIGFycmF5LlxuICpcbiAqIElmIG5vIGluaXRpYWwgc3RhdGUgaXMgcHJvdmlkZWQgdG8gYG1ha2VOb3RpZmllcktpdGAsIHRoZW4gaXQgc3RhcnRzIHdpdGhvdXRcbiAqIGFuIGluaXRpYWwgc3RhdGUuIEl0cyBpbml0aWFsIHN0YXRlIHdpbGwgaW5zdGVhZCBiZSB0aGUgc3RhdGUgb2YgdGhlIGZpcnN0XG4gKiB1cGRhdGUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W10gfCBbVF19IGluaXRpYWxTdGF0ZUFyciB0aGUgZmlyc3Qgc3RhdGUgdG8gYmUgcmV0dXJuZWQgKHR5cGVkIGFzIHJlc3QgYXJyYXkgdG8gcGVybWl0IGB1bmRlZmluZWRgKVxuICogQHJldHVybnMge05vdGlmaWVyUmVjb3JkPFQ+fSB0aGUgbm90aWZpZXIgYW5kIHVwZGF0ZXJcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VOb3RpZmllcktpdCA9ICguLi5pbml0aWFsU3RhdGVBcnIpID0+IHtcbiAgLyoqIEB0eXBlIHtQdWJsaXNoS2l0PFQ+fSAqL1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICBjb25zdCBub3RpZmllciA9IG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKHN1YnNjcmliZXIpO1xuXG4gIGNvbnN0IHVwZGF0ZXIgPSBGYXIoJ3VwZGF0ZXInLCB7XG4gICAgdXBkYXRlU3RhdGU6IHN0YXRlID0+IHB1Ymxpc2hlci5wdWJsaXNoKHN0YXRlKSxcbiAgICBmaW5pc2g6IGNvbXBsZXRpb24gPT4gcHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbiAgICBmYWlsOiByZWFzb24gPT4gcHVibGlzaGVyLmZhaWwocmVhc29uKSxcbiAgfSk7XG5cbiAgYXNzZXJ0KGluaXRpYWxTdGF0ZUFyci5sZW5ndGggPD0gMSwgJ3RvbyBtYW55IGFyZ3VtZW50cycpO1xuICBpZiAoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aCA9PT0gMSkge1xuICAgIHVwZGF0ZXIudXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlQXJyWzBdKTtcbiAgfVxuXG4gIC8qIG5vdGlmaWVyIGZhY2V0IGlzIHNlcGFyYXRlIHNvIGl0IGNhbiBiZSBoYW5kZWQgb3V0IHdoaWxlIHVwZGF0ZXIqL1xuICAvKiBpcyB0aWdodGx5IGhlbGQqL1xuICByZXR1cm4gaGFyZGVuKHsgbm90aWZpZXIsIHVwZGF0ZXIgfSk7XG59O1xuXG4vKipcbiAqIEFkYXB0b3IgZnJvbSBhc3luYyBpdGVyYWJsZSB0byBub3RpZmllci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBUaGUgcmVzdWx0aW5nIG5vdGlmaWVyIGlzIGxvc3NsZXNzLCB3aGljaCBpcyBub3QgZGVzaXJhYmxlLlxuICogUHJlZmVyIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyLCBhbmQgcmVmZXIgdG9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNTQxMyBhbmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU2OTUgZm9yIGNvbnRleHQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqLyRozY9fb25jZS5tYWtlTm90aWZpZXJLaXQobWFrZU5vdGlmaWVyS2l0KTtcbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSA9IGFzeW5jSXRlcmFibGVQID0+IHtcbiAgY29uc3QgaXRlcmF0b3JQID0gRShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbiAgLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xuICBsZXQgb3B0TmV4dFByb21pc2U7XG4gIGxldCBjdXJyZW50VXBkYXRlQ291bnQgPSAwbjtcbiAgLyoqIEB0eXBlIHtFUmVmPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xuICBsZXQgY3VycmVudFJlc3BvbnNlO1xuICBsZXQgZmluYWwgPSBmYWxzZTtcblxuICAvKipcbiAqIEB0eXBlIHtMYXRlc3RUb3BpYzxUPn1cbiAqL1xuICBjb25zdCBiYXNlTm90aWZpZXIgPSBGYXIoJ2Jhc2VOb3RpZmllcicsIHtcbiAgICBnZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCA9IC0xbikge1xuICAgICAgaWYgKHVwZGF0ZUNvdW50IDwgY3VycmVudFVwZGF0ZUNvdW50KSB7XG4gICAgICAgIGlmIChjdXJyZW50UmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodXBkYXRlQ291bnQgIT09IGN1cnJlbnRVcGRhdGVDb3VudCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAnZ2V0VXBkYXRlU2luY2UgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHVwZGF0ZUNvdW50LicsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8qIFJldHVybiBhIGZpbmFsIHJlc3BvbnNlIGlmIHdlIGhhdmUgb25lLCBvdGhlcndpc2UgYSBwcm9taXNlIGZvciB0aGUgbmV4dCBzdGF0ZS4qL1xuICAgICAgaWYgKGZpbmFsKSB7XG4gICAgICAgIGFzc2VydChjdXJyZW50UmVzcG9uc2UgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIGlmICghb3B0TmV4dFByb21pc2UpIHtcbiAgICAgICAgY29uc3QgbmV4dEl0ZXJSZXN1bHRQID0gRShpdGVyYXRvclApLm5leHQoKTtcbiAgICAgICAgb3B0TmV4dFByb21pc2UgPSBFLndoZW4oXG4gICAgICAgICAgbmV4dEl0ZXJSZXN1bHRQLFxuICAgICAgICAgICh7IGRvbmUsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICAgIGFzc2VydCghZmluYWwpO1xuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgZmluYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudFVwZGF0ZUNvdW50ICs9IDFuO1xuICAgICAgICAgICAgY3VycmVudFJlc3BvbnNlID0gaGFyZGVuKHtcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIHVwZGF0ZUNvdW50OiBkb25lID8gdW5kZWZpbmVkIDogY3VycmVudFVwZGF0ZUNvdW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcHROZXh0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBfcmVhc29uID0+IHtcbiAgICAgICAgICAgIGZpbmFsID0gdHJ1ZTtcbiAgICAgICAgICAgIGN1cnJlbnRSZXNwb25zZSA9XG4gICAgICAgICAgICAgIC8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSAqL1xuICAgICAgICAgICAgICAobmV4dEl0ZXJSZXN1bHRQKTtcbiAgICAgICAgICAgIG9wdE5leHRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdE5leHRQcm9taXNlO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG4gIGNvbnN0IG5vdGlmaWVyID0gRmFyKCdub3RpZmllcicsIHtcbiAgICAvKiBEb24ndCBsZWFrIHRoZSBvcmlnaW5hbCBhc3luY0l0ZXJhYmxlUCBzaW5jZSBpdCBtYXkgYmUgcmVtb3RlIGFuZCB3ZSBhbHNvKi9cbiAgICAvKiB3YW50IHRoZSBzYW1lIHNlbWFudGljcyBmb3IgdGhpcyBleHBvc2VkIGl0ZXJhYmxlIGFuZCB0aGUgYmFzZU5vdGlmaWVyLiovXG4gICAgLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4gICAgLi4uYmFzZU5vdGlmaWVyLFxuICB9KTtcbiAgcmV0dXJuIG5vdGlmaWVyO1xufTskaM2PX29uY2UubWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUobWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiXSwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiOlsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCJdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAbIRejM0IAADNCAAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3B1Ymxpc2gta2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vcGF0dGVybnMiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIiwiUHVibGlzaGVySSIsIlN1YnNjcmliZXJJIiwiU3Vic2NyaWJlclNoYXBlIiwiVXBkYXRlQ291bnRTaGFwZSIsIm1ha2VQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHVibGlzaEtpdElLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRSxGYXIsbWFrZVByb21pc2VLaXQsTSxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQsY2FuQmVEdXJhYmxlLHByZXBhcmVFeG9DbGFzc0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZUd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLFskaM2PX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlLCBEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eSwgTGF0ZXN0VG9waWMsIE5vdGlmaWVyLCBOb3RpZmllclJlY29yZCwgUHVibGljYXRpb25SZWNvcmQsIFB1Ymxpc2hlciwgUHVibGlzaEtpdCwgU3Vic2NyaWJlciwgVXBkYXRlUmVjb3JkfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICovXG5cbmNvbnN0IHNpbmsgPSAoKSA9PiB7fTtcbmNvbnN0IG1ha2VRdWlldFJlamVjdGlvbiA9IHJlYXNvbiA9PiB7XG4gIGNvbnN0IHJlamVjdGlvbiA9IGhhcmRlbihQcm9taXNlLnJlamVjdChyZWFzb24pKTtcbiAgdm9pZCBFLndoZW4ocmVqZWN0aW9uLCBzaW5rLCBzaW5rKTtcbiAgcmV0dXJuIHJlamVjdGlvbjtcbn07XG5jb25zdCB0b29GYXJSZWplY3Rpb24gPSBtYWtlUXVpZXRSZWplY3Rpb24oXG4gIGhhcmRlbihFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKSxcbik7XG5cbiAgICAgICBjb25zdCBQdWJsaXNoZXJJID0gTS5pbnRlcmZhY2UoJ1B1Ymxpc2hlcicsIHtcbiAgcHVibGlzaDogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbiAgZmluaXNoOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBmYWlsOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxufSk7XG5cbi8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIE5vdGlmaWVyIGBnZXRVcGRhdGVTaW5jZWAuKi8kaM2PX29uY2UuUHVibGlzaGVySShQdWJsaXNoZXJJKTtcbiAgICAgICBjb25zdCBVcGRhdGVDb3VudFNoYXBlID0gTS5vcihNLmJpZ2ludCgpLCBNLm51bWJlcigpKTskaM2PX29uY2UuVXBkYXRlQ291bnRTaGFwZShVcGRhdGVDb3VudFNoYXBlKTtcbiAgICAgICBjb25zdCBTdWJzY3JpYmVySSA9IE0uaW50ZXJmYWNlKCdTdWJzY3JpYmVyJywge1xuICBzdWJzY3JpYmVBZnRlcjogTS5jYWxsKCkub3B0aW9uYWwoTS5iaWdpbnQoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldFVwZGF0ZVNpbmNlOiBNLmNhbGwoKS5vcHRpb25hbChVcGRhdGVDb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn0pOyRozY9fb25jZS5TdWJzY3JpYmVySShTdWJzY3JpYmVySSk7XG4gICAgICAgY29uc3QgcHVibGlzaEtpdElLaXQgPSBoYXJkZW4oe1xuICBwdWJsaXNoZXI6IFB1Ymxpc2hlckksXG4gIHN1YnNjcmliZXI6IFN1YnNjcmliZXJJLFxufSk7JGjNj19vbmNlLnB1Ymxpc2hLaXRJS2l0KHB1Ymxpc2hLaXRJS2l0KTtcblxuICAgICAgIGNvbnN0IEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUgPSBNLmludGVyZmFjZShcbiAgJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyxcbiAge1xuICAgIGZvcms6IE0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSwgLyogb29wczogcmVjdXJzaXZlIHR5cGUqL1xuICAgIG5leHQ6IE0uY2FsbFdoZW4oKS5yZXR1cm5zKE0uYW55KCkpLFxuICB9LFxuKTskaM2PX29uY2UuRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZShGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlKTtcblxuICAgICAgIGNvbnN0IEl0ZXJhYmxlRWFjaFRvcGljSSA9IE0uaW50ZXJmYWNlKCdJdGVyYWJsZUVhY2hUb3BpYycsIHtcbiAgc3Vic2NyaWJlQWZ0ZXI6XG4gICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFN1YnNjcmliZXJJKS5tZXRob2RHdWFyZHMuc3Vic2NyaWJlQWZ0ZXIsXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06IE0uY2FsbCgpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyksXG4gICksXG59KTskaM2PX29uY2UuSXRlcmFibGVFYWNoVG9waWNJKEl0ZXJhYmxlRWFjaFRvcGljSSk7XG5cbiAgICAgICBjb25zdCBJdGVyYWJsZUxhdGVzdFRvcGljSSA9IE0uaW50ZXJmYWNlKCdJdGVyYWJsZUxhdGVzdFRvcGljJywge1xuICBnZXRVcGRhdGVTaW5jZTpcbiAgICBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoU3Vic2NyaWJlckkpLm1ldGhvZEd1YXJkcy5nZXRVcGRhdGVTaW5jZSxcbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogTS5jYWxsKCkucmV0dXJucyhcbiAgICBNLnJlbW90YWJsZSgnRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InKSxcbiAgKSxcbn0pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBBcmdcbiAqIEB0ZW1wbGF0ZSBSZXRcbiAqIEBwYXJhbSB7KGFyZzogQXJnKSA9PiBSZXR9IGZuXG4gKiBAcmV0dXJucyB7KGFyZzogQXJnKSA9PiBSZXR9XG4gKi8kaM2PX29uY2UuSXRlcmFibGVMYXRlc3RUb3BpY0koSXRlcmFibGVMYXRlc3RUb3BpY0kpO1xuY29uc3Qgd2Vha01lbW9pemVVbmFyeSA9IGZuID0+IHtcbiAgY29uc3QgY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuICByZXR1cm4gYXJnID0+IHtcbiAgICAvKiogQHR5cGUge29iamVjdH0gKi9cbiAgICBjb25zdCBvYXJnID0gYXJnO1xuICAgIGlmIChjYWNoZS5oYXMob2FyZykpIHtcbiAgICAgIHJldHVybiBjYWNoZS5nZXQob2FyZyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGZuKGFyZyk7XG4gICAgY2FjaGUuc2V0KG9hcmcsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UHVibGljYXRpb25SZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge1VwZGF0ZVJlY29yZDxUPn1cbiAqL1xuY29uc3QgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZCA9IHJlY29yZCA9PiB7XG4gIGNvbnN0IHtcbiAgICBoZWFkOiB7IHZhbHVlLCBkb25lIH0sXG4gICAgcHVibGlzaENvdW50LFxuICB9ID0gcmVjb3JkO1xuICBpZiAoZG9uZSkge1xuICAgIC8qIEZpbmFsIHJlc3VsdHMgaGF2ZSB1bmRlZmluZWQgdXBkYXRlQ291bnQuKi9cbiAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWUsIHVwZGF0ZUNvdW50OiB1bmRlZmluZWQgfSk7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCB1cGRhdGVDb3VudDogcHVibGlzaENvdW50IH0pO1xufTtcblxuLyoqXG4gKiBNYWtlcyBhIGB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9YCBwYWlyIGZvciBkb2luZyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIgc3VwcG9ydGluZyBib3RoIFwiZWFjaFwiIGFuZCBcImxhdGVzdFwiIGl0ZXJhdGlvblxuICogb2YgcHVibGlzaGVkIHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1B1Ymxpc2hLaXQ8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUHVibGlzaEtpdCA9ICgpID0+IHtcbiAgLyoqIEB0eXBlIHtQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gKi9cbiAgbGV0IHRhaWxQO1xuICAvKiogQHR5cGUge3VuZGVmaW5lZCB8ICgodmFsdWU6IEVSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+KSA9PiB2b2lkKX0gKi9cbiAgbGV0IHRhaWxSO1xuICAoeyBwcm9taXNlOiB0YWlsUCwgcmVzb2x2ZTogdGFpbFIgfSA9IG1ha2VQcm9taXNlS2l0KCkpO1xuXG4gIGxldCBjdXJyZW50UHVibGlzaENvdW50ID0gMG47XG4gIGxldCBjdXJyZW50UCA9IHRhaWxQO1xuICBjb25zdCBhZHZhbmNlQ3VycmVudCA9IChkb25lLCB2YWx1ZSwgcmVqZWN0aW9uKSA9PiB7XG4gICAgaWYgKHRhaWxSID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRQdWJsaXNoQ291bnQgKz0gMW47XG4gICAgY3VycmVudFAgPSB0YWlsUDtcbiAgICBjb25zdCByZXNvbHZlQ3VycmVudCA9IHRhaWxSO1xuXG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHRhaWxQID0gdG9vRmFyUmVqZWN0aW9uO1xuICAgICAgdGFpbFIgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG4gICAgfVxuXG4gICAgaWYgKHJlamVjdGlvbikge1xuICAgICAgcmVzb2x2ZUN1cnJlbnQocmVqZWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZUN1cnJlbnQoXG4gICAgICAgIGhhcmRlbih7XG4gICAgICAgICAgaGVhZDogeyB2YWx1ZSwgZG9uZSB9LFxuICAgICAgICAgIHB1Ymxpc2hDb3VudDogY3VycmVudFB1Ymxpc2hDb3VudCxcbiAgICAgICAgICB0YWlsOiB0YWlsUCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQgPSB3ZWFrTWVtb2l6ZVVuYXJ5KFxuICAgIG1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQsXG4gICk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGUge1N1YnNjcmliZXI8VD59XG4gKi9cbiAgY29uc3Qgc3Vic2NyaWJlciA9IEZhcignU3Vic2NyaWJlcicsIHtcbiAgICBzdWJzY3JpYmVBZnRlcjogKHB1Ymxpc2hDb3VudCA9IC0xbikgPT4ge1xuICAgICAgYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsICdiaWdpbnQnKTtcbiAgICAgIGlmIChwdWJsaXNoQ291bnQgPT09IGN1cnJlbnRQdWJsaXNoQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIHRhaWxQO1xuICAgICAgfSBlbHNlIGlmIChwdWJsaXNoQ291bnQgPCBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50UDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICdzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRVcGRhdGVTaW5jZTogdXBkYXRlQ291bnQgPT4ge1xuICAgICAgaWYgKHVwZGF0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gICAgICB9XG4gICAgICB1cGRhdGVDb3VudCA9IEJpZ0ludCh1cGRhdGVDb3VudCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzdWJzY3JpYmVyXG4gICAgICAgICAgLyogYHN1YnNjcmliZUFmdGVyYCBtYXkgcmVzb2x2ZSB3aXRoIHRoZSB1cGRhdGUgcmVjb3JkIG51bWJlcmVkKi9cbiAgICAgICAgICAvKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuICAgICAgICAgIC8qIHNhbWUgY3JhbmsuLi4qL1xuICAgICAgICAgIC5zdWJzY3JpYmVBZnRlcih1cGRhdGVDb3VudClcbiAgICAgICAgICAvKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbiAgICAgICAgICAvKiBmdXJ0aGVyIG9uZXMuKi9cbiAgICAgICAgICAudGhlbigoKSA9PiBzdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKCkpXG4gICAgICApO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7UHVibGlzaGVyPFQ+fSAqL1xuICBjb25zdCBwdWJsaXNoZXIgPSBGYXIoJ1B1Ymxpc2hlcicsIHtcbiAgICBwdWJsaXNoOiB2YWx1ZSA9PiB7XG4gICAgICBhZHZhbmNlQ3VycmVudChmYWxzZSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZmluaXNoOiBmaW5hbFZhbHVlID0+IHtcbiAgICAgIGFkdmFuY2VDdXJyZW50KHRydWUsIGZpbmFsVmFsdWUpO1xuICAgIH0sXG4gICAgZmFpbDogcmVhc29uID0+IHtcbiAgICAgIGFkdmFuY2VDdXJyZW50KHRydWUsIHVuZGVmaW5lZCwgbWFrZVF1aWV0UmVqZWN0aW9uKHJlYXNvbikpO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaGFyZGVuKHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0pO1xufTskaM2PX29uY2UubWFrZVB1Ymxpc2hLaXQobWFrZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VQdWJsaXNoS2l0KTtcblxuY29uc3QgRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlID0gaGFyZGVuKHtcbiAgdmFsdWVEdXJhYmlsaXR5OiBNLmFueSgpLFxuICBwdWJsaXNoQ291bnQ6IE0uYW55KCksXG4gIHN0YXR1czogTS5hbnkoKSxcbiAgaGFzVmFsdWU6IE0uYW55KCksXG4gIHZhbHVlOiBNLmFueSgpLFxufSk7XG5cbi8qIFRPRE86IE1vdmUgZHVyYWJsZSBwdWJsaXNoIGtpdCB0byBhIG5ldyBmaWxlPyovXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eSAmICdtYW5kYXRvcnknfSBbb3B0aW9ucy52YWx1ZUR1cmFiaWxpdHldXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX1cbiAqL1xuY29uc3QgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGUgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHsgdmFsdWVEdXJhYmlsaXR5ID0gJ21hbmRhdG9yeScgfSA9IG9wdGlvbnM7XG4gIGFzc2VydC5lcXVhbCh2YWx1ZUR1cmFiaWxpdHksICdtYW5kYXRvcnknKTtcbiAgcmV0dXJuIHtcbiAgICAvKiBjb25maWd1cmF0aW9uKi9cbiAgICB2YWx1ZUR1cmFiaWxpdHksXG5cbiAgICAvKiBsaWZlY3ljbGUgcHJvZ3Jlc3MqL1xuICAgIHB1Ymxpc2hDb3VudDogMG4sXG4gICAgc3RhdHVzOiAnbGl2ZScsIC8qIHwgJ2ZpbmlzaGVkJyB8ICdmYWlsZWQnKi9cblxuICAgIC8qIHBlcnNpc3RlZCByZXN1bHQgZGF0YSovXG4gICAgLyogTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIG5vbi10ZXJtaW5hbCB2YWx1ZXMgZnJvbSBgcHVibGlzaGAsKi9cbiAgICAvKiB2YWx1ZSBhbHNvIGhvbGRzIHRoZSB0ZXJtaW5hbCB2YWx1ZSBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYC4qL1xuICAgIGhhc1ZhbHVlOiBmYWxzZSxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICB9O1xufTtcblxuLyogV2UgbmVlZCB0aGUgV2Vha01hcCBrZXkgZm9yIGEga2l0IHRvIGJlIGEgdnJlZi1iZWFyaW5nIG9iamVjdCovXG4vKiBpbiBpdHMgY29ob3J0LCBhbmQgaGF2ZSBhcmJpdHJhcmlseSBjaG9zZW4gdGhlIHB1Ymxpc2hlciBmYWNldC4qL1xuLyoqIEB0eXBlZGVmIHtQdWJsaXNoZXI8Kj59IER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5ICovXG4vKipcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXl9XG4gKi9cbmNvbnN0IGdldEVwaGVtZXJhbEtleSA9IGZhY2V0cyA9PiBmYWNldHMucHVibGlzaGVyO1xuXG4vKipcbiAqIEB0eXBlZGVmIER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YVxuICogQHByb3BlcnR5IHtQcm9taXNlPCo+IHwgdW5kZWZpbmVkfSBjdXJyZW50UCBUaGUgY3VycmVudC1yZXN1bHQgcHJvbWlzZVxuICogICAodW5kZWZpbmVkIHVubGVzcyByZXNvbHZlZCB3aXRoIHVucmVjb3ZlcmFibGUgZXBoZW1lcmFsIGRhdGEpXG4gKiBAcHJvcGVydHkge1Byb21pc2U8Kj59IHRhaWxQIFRoZSBuZXh0LXJlc3VsdCBwcm9taXNlXG4gKiBAcHJvcGVydHkgeygodmFsdWU6IGFueSkgPT4gdm9pZCkgfCB1bmRlZmluZWR9IHRhaWxSIFRoZSBuZXh0LXJlc3VsdCByZXNvbHZlclxuICogICAodW5kZWZpbmVkIHdoZW4gdGhlIHB1Ymxpc2gga2l0IGhhcyB0ZXJtaW5hdGVkKVxuICovXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleSwgRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPn0gKi9cbmNvbnN0IGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YSA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudC1yZXN1bHQgcHJvbWlzZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBkdXJhYmxlXG4gKiBwdWJsaXNoIGtpdCwgcmVjcmVhdGVkIHVubGVzcyB3ZSBhbHJlYWR5IGhhdmUgb25lIHdpdGggcmV0YWluZWRcbiAqIGVwaGVtZXJhbCBkYXRhLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcGFyYW0ge1Byb21pc2U8Kj59IHRhaWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICovXG5jb25zdCBwcm92aWRlQ3VycmVudFAgPSAoc3RhdGUsIGZhY2V0cywgdGFpbCkgPT4ge1xuICBjb25zdCBlcGhlbWVyYWxLZXkgPSBnZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbiAgY29uc3QgZm91bmREYXRhID0gZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLmdldChlcGhlbWVyYWxLZXkpO1xuICBjb25zdCBjdXJyZW50UCA9IGZvdW5kRGF0YSAmJiBmb3VuZERhdGEuY3VycmVudFA7XG4gIGlmIChjdXJyZW50UCkge1xuICAgIHJldHVybiBjdXJyZW50UDtcbiAgfVxuXG4gIGNvbnN0IHsgcHVibGlzaENvdW50LCBzdGF0dXMsIGhhc1ZhbHVlLCB2YWx1ZSB9ID0gc3RhdGU7XG4gIGlmICghaGFzVmFsdWUpIHtcbiAgICBhc3NlcnQoc3RhdHVzID09PSAnbGl2ZScpO1xuICAgIHJldHVybiB0YWlsO1xuICB9XG4gIGlmIChzdGF0dXMgPT09ICdsaXZlJyB8fCBzdGF0dXMgPT09ICdmaW5pc2hlZCcpIHtcbiAgICBjb25zdCBjZWxsID0gaGFyZGVuKHtcbiAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmU6IHN0YXR1cyAhPT0gJ2xpdmUnIH0sXG4gICAgICBwdWJsaXNoQ291bnQsXG4gICAgICB0YWlsLFxuICAgIH0pO1xuICAgIHJldHVybiBFLnJlc29sdmUoY2VsbCk7XG4gIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgIHJldHVybiBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEZhaWxgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZXh0LXJlc3VsdCBwcm9taXNlIGFuZCByZXNvbHZlciBhc3NvY2lhdGVkIHdpdGggYSBnaXZlblxuICogZHVyYWJsZSBwdWJsaXNoIGtpdC5cbiAqIFRoZXNlIGFyZSBsb3N0IG9uIHVwZ3JhZGUgYnV0IHJlY3JlYXRlZCBvbi1kZW1hbmQsIHByZXNlcnZpbmcgdGhlXG4gKiB2YWx1ZSBpbiAoYnV0IG5vdCB0aGUgaWRlbnRpdHkgb2YpIHRoZSBjdXJyZW50IHsgdmFsdWUsIGRvbmUgfSByZXN1bHRcbiAqIHdoZW4gcG9zc2libGUsIHdoaWNoIGlzIGFsd2F5cyB0aGUgY2FzZSB3aGVuIHRoYXQgdmFsdWUgaXMgdGVybWluYWxcbiAqIChpLmUuLCBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCkgb3Igd2hlbiB0aGUgZHVyYWJsZSBwdWJsaXNoIGtpdCBpc1xuICogY29uZmlndXJlZCB3aXRoIGB2YWx1ZUR1cmFiaWxpdHk6ICdtYW5kYXRvcnknYC5cbiAqXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9IHN0YXRlXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YX1cbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YSA9IChzdGF0ZSwgZmFjZXRzKSA9PiB7XG4gIGNvbnN0IGVwaGVtZXJhbEtleSA9IGdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuICBjb25zdCBmb3VuZERhdGEgPSBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG4gIGlmIChmb3VuZERhdGEpIHtcbiAgICByZXR1cm4gZm91bmREYXRhO1xuICB9XG5cbiAgY29uc3QgeyBzdGF0dXMgfSA9IHN0YXRlO1xuICBsZXQgdGFpbFA7XG4gIGxldCB0YWlsUjtcbiAgaWYgKHN0YXR1cyA9PT0gJ2xpdmUnKSB7XG4gICAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcbiAgICB2b2lkIEUud2hlbih0YWlsUCwgc2luaywgc2luayk7XG4gIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnZmluaXNoZWQnIHx8IHN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICB0YWlsUCA9IHRvb0ZhclJlamVjdGlvbjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBGYWlsYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gIH1cbiAgLyogY3VycmVudFAgaXMgbm90IGVwaGVtZXJhbCB3aGVuIHJlc3RvcmluZyBmcm9tIHBlcnNpc3RlZCBzdGF0ZS4qL1xuICBjb25zdCBvYmogPSBoYXJkZW4oeyBjdXJyZW50UDogdW5kZWZpbmVkLCB0YWlsUCwgdGFpbFIgfSk7XG4gIGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoZXBoZW1lcmFsS2V5LCBvYmopO1xuICByZXR1cm4gb2JqO1xufTtcblxuLyoqXG4gKiBFeHRlbmRzIHRoZSBzZXF1ZW5jZSBvZiByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSB7e3N0YXRlOiBEdXJhYmxlUHVibGlzaEtpdFN0YXRlLCBmYWNldHM6IFB1Ymxpc2hLaXQ8Kj59fSBjb250ZXh0XG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVsnc3RhdHVzJ119IFt0YXJnZXRTdGF0dXNdXG4gKi9cbmNvbnN0IGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCA9IChjb250ZXh0LCB2YWx1ZSwgdGFyZ2V0U3RhdHVzID0gJ2xpdmUnKSA9PiB7XG4gIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gY29udGV4dDtcbiAgY29uc3QgeyB2YWx1ZUR1cmFiaWxpdHksIHN0YXR1cyB9ID0gc3RhdGU7XG4gIGlmIChzdGF0dXMgIT09ICdsaXZlJykge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuICB9XG4gIGNvbnN0IGRvbmUgPSB0YXJnZXRTdGF0dXMgIT09ICdsaXZlJztcbiAgaWYgKGRvbmUgfHwgdmFsdWVEdXJhYmlsaXR5ID09PSAnbWFuZGF0b3J5Jykge1xuICAgIGNhbkJlRHVyYWJsZSh2YWx1ZSkgfHwgRmFpbGBDYW5ub3QgYWNjZXB0IG5vbi1kdXJhYmxlIHZhbHVlOiAke3ZhbHVlfWA7XG4gIH1cbiAgY29uc3QgeyB0YWlsUDogb2xkVGFpbFAsIHRhaWxSOiByZXNvbHZlT2xkVGFpbCB9ID1cbiAgICBwcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKHN0YXRlLCBmYWNldHMpO1xuICBhc3NlcnQudHlwZW9mKHJlc29sdmVPbGRUYWlsLCAnZnVuY3Rpb24nKTtcblxuICBjb25zdCBwdWJsaXNoQ291bnQgPSBzdGF0ZS5wdWJsaXNoQ291bnQgKyAxbjtcbiAgc3RhdGUucHVibGlzaENvdW50ID0gcHVibGlzaENvdW50O1xuXG4gIGxldCB0YWlsUDtcbiAgbGV0IHRhaWxSO1xuICBpZiAoZG9uZSkge1xuICAgIHN0YXRlLnN0YXR1cyA9IHRhcmdldFN0YXR1cztcbiAgICB0YWlsUCA9IHRvb0ZhclJlamVjdGlvbjtcbiAgICB0YWlsUiA9IHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICAoeyBwcm9taXNlOiB0YWlsUCwgcmVzb2x2ZTogdGFpbFIgfSA9IG1ha2VQcm9taXNlS2l0KCkpO1xuICAgIHZvaWQgRS53aGVuKHRhaWxQLCBzaW5rLCBzaW5rKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50UDtcbiAgaWYgKHRhcmdldFN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICBzdGF0ZS5oYXNWYWx1ZSA9IHRydWU7XG4gICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICBjb25zdCByZWplY3Rpb24gPSBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuICAgIHJlc29sdmVPbGRUYWlsKHJlamVjdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgLyogUGVyc2lzdCBhIHRlcm1pbmFsIHZhbHVlLCBvciBhIG5vbi10ZXJtaW5hbCB2YWx1ZSovXG4gICAgLyogaWYgY29uZmlndXJlZCBhcyAnbWFuZGF0b3J5JyBvciAnb3Bwb3J0dW5pc3RpYycuKi9cbiAgICBpZiAoZG9uZSB8fCAodmFsdWVEdXJhYmlsaXR5ICE9PSAnaWdub3JlZCcgJiYgY2FuQmVEdXJhYmxlKHZhbHVlKSkpIHtcbiAgICAgIHN0YXRlLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIC8qIFJldGFpbiBhbnkgcHJvbWlzZSB3aXRoIG5vbi1kdXJhYmxlIHJlc29sdXRpb24uKi9cbiAgICAgIGN1cnJlbnRQID0gb2xkVGFpbFA7XG4gICAgfVxuXG4gICAgcmVzb2x2ZU9sZFRhaWwoXG4gICAgICBoYXJkZW4oe1xuICAgICAgICBoZWFkOiB7IHZhbHVlLCBkb25lIH0sXG4gICAgICAgIHB1Ymxpc2hDb3VudCxcbiAgICAgICAgdGFpbDogdGFpbFAsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChcbiAgICBnZXRFcGhlbWVyYWxLZXkoZmFjZXRzKSxcbiAgICBoYXJkZW4oeyBjdXJyZW50UCwgdGFpbFAsIHRhaWxSIH0pLFxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHJldHVybnMgezxUPihvcHRpb25zPzogUGFyYW1ldGVyczx0eXBlb2YgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGU+WzBdKSA9PiBQdWJsaXNoS2l0PFQ+fVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0ID0gKGJhZ2dhZ2UsIGtpbmROYW1lKSA9PiB7XG4gIC8qIFRPRE86IE9uY2Ugd2UgdW5pZnkgd2l0aCBtYWtlUHVibGlzaEtpdCwgd2Ugd2lsbCB1c2UgYSBab25lLWNvbXBhdGlibGUgd2VhayovXG4gIC8qIG1hcCBmb3IgbWVtb2l6YXRpb24uKi9cbiAgY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkID0gbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZDtcblxuICByZXR1cm4gcHJlcGFyZUV4b0NsYXNzS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgcHVibGlzaEtpdElLaXQsXG4gICAgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGUsXG4gICAge1xuICAgICAgLyogVGhlIHB1Ymxpc2hlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuICAgICAgLyogYWNjZXB0cyBuZXcgdmFsdWVzLiovXG4gICAgICBwdWJsaXNoZXI6IHtcbiAgICAgICAgcHVibGlzaCh2YWx1ZSkge1xuICAgICAgICAgIGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZpbmlzaChmaW5hbFZhbHVlKSB7XG4gICAgICAgICAgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsIGZpbmFsVmFsdWUsICdmaW5pc2hlZCcpO1xuICAgICAgICB9LFxuICAgICAgICBmYWlsKHJlYXNvbikge1xuICAgICAgICAgIGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLCByZWFzb24sICdmYWlsZWQnKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8qIFRoZSBzdWJzY3JpYmVyIGZhY2V0IG9mIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCovXG4gICAgICAvKiBwcm9wYWdhdGVzIHZhbHVlcy4qL1xuICAgICAgc3Vic2NyaWJlcjoge1xuICAgICAgICBzdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQgPSAtMW4pIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdWJsaXNoQ291bnQ6IGN1cnJlbnRQdWJsaXNoQ291bnQgfSA9IHN0YXRlO1xuICAgICAgICAgIGNvbnN0IHsgY3VycmVudFAsIHRhaWxQIH0gPSBwcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKFxuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBmYWNldHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocHVibGlzaENvdW50ID09PSBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFpbFA7XG4gICAgICAgICAgfSBlbHNlIGlmIChwdWJsaXNoQ291bnQgPCBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFAgfHwgcHJvdmlkZUN1cnJlbnRQKHN0YXRlLCBmYWNldHMsIHRhaWxQKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICdzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmYWNldHM6IHsgc3Vic2NyaWJlciB9LFxuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIGlmICh1cGRhdGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLnRoZW4obWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdXBkYXRlQ291bnQgPSBCaWdJbnQodXBkYXRlQ291bnQpO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBzdWJzY3JpYmVyXG4gICAgICAgICAgICAgIC8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4gICAgICAgICAgICAgIC8qIGB1cGRhdGVDb3VudCArIDFgLCBldmVuIGlmIHNldmVyYWwgdXBkYXRlcyBhcmUgcHVibGlzaGVkIGluIHRoZSovXG4gICAgICAgICAgICAgIC8qIHNhbWUgY3JhbmsuLi4qL1xuICAgICAgICAgICAgICAuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4gICAgICAgICAgICAgIC8qIC4uLiBzbyB3ZSBwb2xsIHRoZSBsYXRlc3QgcHVibGlzaGVkIHVwZGF0ZSwgd2l0aG91dCB3YWl0aW5nIGZvciBhbnkqL1xuICAgICAgICAgICAgICAvKiBmdXJ0aGVyIG9uZXMuKi9cbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gc3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgc3RhdGVTaGFwZTogRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlLFxuICAgIH0sXG4gICk7XG59OyRozY9fb25jZS5wcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcbmhhcmRlbihwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuXG4gICAgICAgY29uc3QgU3Vic2NyaWJlclNoYXBlID0gTS5yZW1vdGFibGUoJ1N1YnNjcmliZXInKTskaM2PX29uY2UuU3Vic2NyaWJlclNoYXBlKFN1YnNjcmliZXJTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQdWJsaXNoZXJJIjpbIlB1Ymxpc2hlckkiXSwiVXBkYXRlQ291bnRTaGFwZSI6WyJVcGRhdGVDb3VudFNoYXBlIl0sIlN1YnNjcmliZXJJIjpbIlN1YnNjcmliZXJJIl0sInB1Ymxpc2hLaXRJS2l0IjpbInB1Ymxpc2hLaXRJS2l0Il0sIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiOlsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSJdLCJJdGVyYWJsZUVhY2hUb3BpY0kiOlsiSXRlcmFibGVFYWNoVG9waWNJIl0sIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIjpbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIl0sIm1ha2VQdWJsaXNoS2l0IjpbIm1ha2VQdWJsaXNoS2l0Il0sInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCI6WyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSwiU3Vic2NyaWJlclNoYXBlIjpbIlN1YnNjcmliZXJTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAsSEQ3qgwAAKoMAAAuAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBlbmRvL2ZhciIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiXSwiZXhwb3J0cyI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UsRSxGYXIsb2JzZXJ2ZU5vdGlmaWVyOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLFskaM2PX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsWyRozY9fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZU5vdGlmaWVyXCIsWyRozY9fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0Jhc2VOb3RpZmllciwgTm90aWZpZXJ9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7RVJlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtFTWFyc2hhbGxlcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMnO1xuICogQGltcG9ydCB7U3RvcmVkRmFjZXQsIFN0b3JhZ2VOb2RlLCBVbnNlcmlhbGl6ZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICogQGltcG9ydCB7UGFzc2FibGVDYXB9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD4gJiBPbWl0PFN0b3JlZEZhY2V0LCAnZ2V0U3RvcmVLZXknPn0gU3RvcmVkTm90aWZpZXJcbiAqL1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkTm90aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGVDYXB9IFRcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZE5vdGlmaWVyPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVN0b3JlZE5vdGlmaWVyID0gKG5vdGlmaWVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBhc3NlcnRBbGxEZWZpbmVkKHsgbm90aWZpZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyIH0pO1xuXG4gIGNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlID0gbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcik7XG5cbiAgb2JzZXJ2ZU5vdGlmaWVyKG5vdGlmaWVyLCB7XG4gICAgdXBkYXRlU3RhdGUodmFsdWUpIHtcbiAgICAgIG1hcnNoYWxsVG9TdG9yYWdlKHZhbHVlKS5jYXRjaChyZWFzb24gPT5cbiAgICAgICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIHVwZGF0ZVN0YXRlJywgcmVhc29uKSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBmYWlsKHJlYXNvbikge1xuICAgICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLCByZWFzb24pO1xuICAgIH0sXG4gIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgaGFsdGVkIGl0ZXJhdGlvbicsIHJlYXNvbik7XG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuICBjb25zdCB1bnNlcmlhbGl6ZXIgPSBGYXIoJ3Vuc2VyaWFsaXplcicsIHtcbiAgICBmcm9tQ2FwRGF0YTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICAgIHVuc2VyaWFsaXplOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7U3RvcmVkTm90aWZpZXI8VD59ICovXG4gIGNvbnN0IHN0b3JlZE5vdGlmaWVyID0gRmFyKCdTdG9yZWROb3RpZmllcicsIHtcbiAgICBnZXRVcGRhdGVTaW5jZTogdXBkYXRlQ291bnQgPT4gRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuICAgIGdldFBhdGg6ICgpID0+IEUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKSxcbiAgICBnZXRVbnNlcmlhbGl6ZXI6ICgpID0+IHVuc2VyaWFsaXplcixcbiAgfSk7XG4gIHJldHVybiBzdG9yZWROb3RpZmllcjtcbn07JGjNj19vbmNlLm1ha2VTdG9yZWROb3RpZmllcihtYWtlU3RvcmVkTm90aWZpZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN0b3JlZE5vdGlmaWVyIjpbIm1ha2VTdG9yZWROb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB65k5eJCYAACQmAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3Jlc3ViLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmVyLmpzIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiLCJtYWtlU3RvcmVkUHVibGlzaEtpdCIsIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiLCJtYWtlU3RvcmVkU3Vic2NyaWJlciIsIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixtYWtlTWFyc2hhbCxhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Usb2JzZXJ2ZUl0ZXJhdGlvbixtYWtlUHVibGlzaEtpdCxtYWtlU3Vic2NyaXB0aW9uS2l0LHN1YnNjcmliZUVhY2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIixbJGjNj19hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjNj19hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLFskaM2PX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsWyRozY9fYSA9PiAobWFrZVN1YnNjcmlwdGlvbktpdCA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVtb3RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtJdGVyYXRpb25PYnNlcnZlciwgTGF0ZXN0VG9waWMsIE5vdGlmaWVyLCBOb3RpZmllclJlY29yZCwgUHVibGljYXRpb25SZWNvcmQsIFB1Ymxpc2hlciwgUHVibGlzaEtpdCwgU3RvcmVkUHVibGlzaEtpdCwgU3RvcmVkU3Vic2NyaXB0aW9uLCBTdG9yZWRTdWJzY3JpYmVyLCBTdWJzY3JpYmVyLCBTdWJzY3JpcHRpb24sIFVwZGF0ZVJlY29yZH0gZnJvbSAnLi4vc3JjL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1N0b3JhZ2VOb2RlLCBVbnNlcmlhbGl6ZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICogQGltcG9ydCB7RU1hcnNoYWxsZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlQ2FwfSBmcm9tICdAZW5kby9tYXJzaGFsJztcbiAqL1xuXG4vKipcbiAqIE5COiBkb2VzIG5vdCB5ZXQgc3Vydml2ZSB1cGdyYWRlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjg5M1xuICpcbiAqIEBhbHBoYVxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHsodjogVCkgPT4gdm9pZH0gY29uc3VtZVZhbHVlXG4gKi9cbiAgICAgICBjb25zdCBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQgPSBhc3luYyAoc3Vic2NyaWJlciwgY29uc3VtZVZhbHVlKSA9PiB7XG4gIC8qIFdlIG9wZW4tY29kZSB0aGUgZm9yLWF3YWl0LW9mIGltcGxlbWVudGF0aW9uIHJhdGhlciB0aGFuIHVzaW5nIHRoYXQgc3ludGF4Ki9cbiAgLyogZGlyZWN0bHkgYmVjYXVzZSB3ZSB3YW50IHRvIHJ1biB0aGUgY29uc3VtZXIgb24gdGhlIGRvbmUgdmFsdWUgYXMgd2VsbC4qL1xuICBjb25zdCBpdGVyYXRvciA9IHN1YnNjcmliZUVhY2goc3Vic2NyaWJlcilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gIGF3YWl0IG51bGw7XG4gIHdoaWxlICghZmluaXNoZWQpIHtcbiAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG4gICAgYXdhaXQgY29uc3VtZVZhbHVlKHZhbHVlKTtcbiAgICBmaW5pc2hlZCA9ICEhZG9uZTtcbiAgfVxufTtcblxuLyoqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgbm8gZnVydGhlciB3cml0ZXMgdG8gaXQgd2lsbFxuICogYmUgYXR0ZW1wdGVkIChidXQgcmVzdWx0cyB3aWxsIHJlbWFpbiBhdmFpbGFibGUgZnJvbSB0aGUgc3Vic2NyaWJlcikuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmliZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGVDYXB9IFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fVxuICovJGjNj19vbmNlLmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChmb3JFYWNoUHVibGljYXRpb25SZWNvcmQpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRTdWJzY3JpYmVyID0gKHN1YnNjcmliZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGFzc2VydEFsbERlZmluZWQoeyBzdWJzY3JpYmVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciB9KTtcblxuICBjb25zdCBtYXJzaGFsbFRvU3RvcmFnZSA9IG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpO1xuXG4gIC8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xuICBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQoc3Vic2NyaWJlciwgbWFyc2hhbGxUb1N0b3JhZ2UpLmNhdGNoKGVyciA9PiB7XG4gICAgLyogVE9ETzogSG93IHNob3VsZCB3ZSBoYW5kbGUgYW5kL29yIHN1cmZhY2UgdGhpcyBmYWlsdXJlPyovXG4gICAgLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTc2NiNkaXNjdXNzaW9uX3I5MjI0OTgwODgqL1xuICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZFN1YnNjcmliZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLCBlcnIpO1xuICB9KTtcblxuICAvKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbiAgY29uc3QgdW5zZXJpYWxpemVyID0gRmFyKCd1bnNlcmlhbGl6ZXInLCB7XG4gICAgZnJvbUNhcERhdGE6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgICB1bnNlcmlhbGl6ZTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICB9KTtcblxuICAvKiogQHR5cGUge1N0b3JlZFN1YnNjcmliZXI8VD59ICovXG4gIGNvbnN0IHN0b3Jlc3ViID0gRmFyKCdTdG9yZWRTdWJzY3JpYmVyJywge1xuICAgIHN1YnNjcmliZUFmdGVyOiBwdWJsaXNoQ291bnQgPT4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuICAgIGdldFVwZGF0ZVNpbmNlOiB1cGRhdGVDb3VudCA9PiBzdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbiAgICBnZXRQYXRoOiAoKSA9PiBFKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG4gICAgZ2V0U3RvcmVLZXk6ICgpID0+IEUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCksXG4gICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiB1bnNlcmlhbGl6ZXIsXG4gIH0pO1xuICByZXR1cm4gc3RvcmVzdWI7XG59O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBtYWtlU3RvcmVkU3Vic2NyaWJlclxuICpcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCB0aGUgaXRlcmF0aW9uIHdpbGwgYmUgdGVybWluYXRlZC5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPiB8IG51bGx9IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IFttYXJzaGFsbGVyXVxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn1cbiAqLyRozY9fb25jZS5tYWtlU3RvcmVkU3Vic2NyaWJlcihtYWtlU3RvcmVkU3Vic2NyaWJlcik7XG4gICAgICAgY29uc3QgbWFrZVN0b3JlZFN1YnNjcmlwdGlvbiA9IChcbiAgc3Vic2NyaXB0aW9uLFxuICBzdG9yYWdlTm9kZSxcbiAgbWFyc2hhbGxlciA9IG1ha2VNYXJzaGFsKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG4gICAgbWFyc2hhbFNhdmVFcnJvcjogKCkgPT4ge30sXG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG4gIH0pLFxuKSA9PiB7XG4gIC8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuICBjb25zdCB1bnNlcmlhbGl6ZXIgPSBGYXIoJ3Vuc2VyaWFsaXplcicsIHtcbiAgICBmcm9tQ2FwRGF0YTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICAgIHVuc2VyaWFsaXplOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gIH0pO1xuXG4gIC8qIEFib3J0IHRoZSBpdGVyYXRpb24gb24gdGhlIG5leHQgb2JzZXJ2YXRpb24gaWYgdGhlIHB1Ymxpc2hlciBldmVyIGZhaWxzLiovXG4gIGxldCBwdWJsaXNoRmFpbGVkID0gZmFsc2U7XG4gIGxldCBwdWJsaXNoRXhjZXB0aW9uO1xuXG4gIGNvbnN0IGZhaWwgPSBlcnIgPT4ge1xuICAgIHB1Ymxpc2hGYWlsZWQgPSB0cnVlO1xuICAgIHB1Ymxpc2hFeGNlcHRpb24gPSBlcnI7XG4gIH07XG5cbiAgLyogTXVzdCAqbm90KiBiZSBhbiBhc3luYyBmdW5jdGlvbiwgYmVjYXVzZSBpdCBzb21ldGltZXMgbXVzdCB0aHJvdyB0byBhYm9ydCovXG4gIC8qIHRoZSBpdGVyYXRpb24uKi9cbiAgY29uc3QgcHVibGlzaFZhbHVlID0gb2JqID0+IHtcbiAgICBhc3NlcnQoc3RvcmFnZU5vZGUpO1xuICAgIGlmIChwdWJsaXNoRmFpbGVkKSB7XG4gICAgICAvKiBUbyBwcm9wZXJseSBhYm9ydCB0aGUgaXRlcmF0aW9uLCB0aGlzIG11c3QgYmUgYSBzeW5jaHJvbm91cyBleGNlcHRpb24uKi9cbiAgICAgIHRocm93IHB1Ymxpc2hFeGNlcHRpb247XG4gICAgfVxuXG4gICAgLyogUHVibGlzaCB0aGUgdmFsdWUsIGNhcHR1cmluZyBhbnkgZXJyb3IuKi9cbiAgICBFKG1hcnNoYWxsZXIpXG4gICAgICAudG9DYXBEYXRhKG9iailcbiAgICAgIC50aGVuKHNlcmlhbGl6ZWQgPT4ge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCk7XG4gICAgICAgIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShlbmNvZGVkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZmFpbCk7XG4gIH07XG5cbiAgaWYgKHN0b3JhZ2VOb2RlKSB7XG4gICAgLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG4gICAgb2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpcHRpb24sIHtcbiAgICAgIHVwZGF0ZVN0YXRlOiBwdWJsaXNoVmFsdWUsXG4gICAgICBmaW5pc2g6IHB1Ymxpc2hWYWx1ZSxcbiAgICB9KS5jYXRjaChmYWlsKTtcbiAgfVxuXG4gIC8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSAqL1xuICBjb25zdCBzdG9yZXN1YiA9IEZhcignU3RvcmVkU3Vic2NyaXB0aW9uJywge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgZ2V0U3RvcmVLZXkgdHlwZSBkb2VzIG5vdCBoYXZlIGBzdWJzY3JpcHRpb25gKi9cbiAgICBnZXRTdG9yZUtleTogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzdG9yYWdlTm9kZSkge1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgc3Vic2NyaXB0aW9uIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RvcmVLZXkgPSBhd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IC4uLnN0b3JlS2V5LCBzdWJzY3JpcHRpb24gfSk7XG4gICAgfSxcbiAgICBnZXRVbnNlcmlhbGl6ZXI6ICgpID0+IHVuc2VyaWFsaXplcixcbiAgICBnZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczogKCkgPT5cbiAgICAgIHN1YnNjcmlwdGlvbi5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFscygpLFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHN1YnNjcmlwdGlvbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSxcbiAgICBzdWJzY3JpYmVBZnRlcjogcHVibGlzaENvdW50ID0+IHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuICB9KTtcbiAgcmV0dXJuIHN0b3Jlc3ViO1xufTskaM2PX29uY2UubWFrZVN0b3JlZFN1YnNjcmlwdGlvbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgU3RvcmVkUHVibGlzaEtpdFxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZFB1Ymxpc2hlcktpdFxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpcHRpb248VD59IHN1YnNjcmliZXJcbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHB1Ymxpc2hlclxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgaW5jb21wYXRpYmxlIHdpdGggZHVyYWJpbGl0eTsgaW5zdGVhZCBoYW5kbGUgdnN0b3JhZ2UgZXBoZW1lcmFsbHkgb24gYSBkdXJhYmxlIFB1Ymxpc2hLaXRcbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT4gfCBudWxsfSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hpbGRQYXRoXVxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hlcktpdDxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQgPSAoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIsIGNoaWxkUGF0aCkgPT4ge1xuICBjb25zdCB7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfSA9IG1ha2VTdWJzY3JpcHRpb25LaXQoKTtcblxuICBpZiAoc3RvcmFnZU5vZGUgJiYgY2hpbGRQYXRoKSB7XG4gICAgc3RvcmFnZU5vZGUgPSBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkUGF0aCk7XG4gIH1cblxuICAvKiB3cmFwIHRoZSBzdWJzY3JpcHRpb24gdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlLCByZXBlYXRpbmcgdG8gdGhpcyBgc3Vic2NyaWJlcmAqL1xuICBjb25zdCBzdWJzY3JpYmVyID0gbWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbiAgICBzdWJzY3JpcHRpb24sXG4gICAgc3RvcmFnZU5vZGUsXG4gICAgbWFyc2hhbGxlcixcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHB1Ymxpc2hlcjogcHVibGljYXRpb24sXG4gICAgc3Vic2NyaWJlcixcbiAgfTtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgaW5jb21wYXRpYmxlIHdpdGggZHVyYWJpbGl0eTsgaW5zdGVhZCBoYW5kbGUgdnN0b3JhZ2UgZXBoZW1lcmFsbHkgb24gYSBkdXJhYmxlIFB1Ymxpc2hLaXRcbiAqXG4gKiBMaWtlIG1ha2VQdWJsaXNoS2l0IHRoaXMgbWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogV2hhdCdzIGRpZmZlcmVudCBpcyBgc3Vic2NyaWJlcmAgdGVlcyByZWNvcmRzLCB3cml0aW5nIG91dCB0byBzdG9yYWdlTm9kZS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaEtpdDxUPn1cbiAqLyRozY9fb25jZS5tYWtlU3RvcmVkUHVibGlzaGVyS2l0KG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRQdWJsaXNoS2l0ID0gKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuXG4gIHJldHVybiB7XG4gICAgcHVibGlzaGVyLFxuICAgIC8qIHdyYXAgdGhlIHN1YnNjcmliZXIgdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlKi9cbiAgICBzdWJzY3JpYmVyOiBtYWtlU3RvcmVkU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciksXG4gIH07XG59OyRozY9fb25jZS5tYWtlU3RvcmVkUHVibGlzaEtpdChtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCJdLCJtYWtlU3RvcmVkU3Vic2NyaWJlciI6WyJtYWtlU3RvcmVkU3Vic2NyaWJlciJdLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIjpbIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCI6WyJtYWtlU3RvcmVkUHVibGlzaGVyS2l0Il0sIm1ha2VTdG9yZWRQdWJsaXNoS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGQOvXzyKQAA8ikAACgAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyJdLCJleHBvcnRzIjpbInN1YnNjcmliZSIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLEZhaWwsYW5ub3RhdGVFcnJvcixFLEZhcixpc1ByaW1pdGl2ZSxpc1VwZ3JhZGVEaXNjb25uZWN0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzXCIsIFtbXCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uXCIsWyRozY9fYSA9PiAoaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0l0ZXJhdGlvbk9ic2VydmVyLCBMYXRlc3RUb3BpYywgTm90aWZpZXIsIE5vdGlmaWVyUmVjb3JkLCBQdWJsaWNhdGlvblJlY29yZCwgUHVibGlzaGVyLCBQdWJsaXNoS2l0LCBTdG9yZWRQdWJsaXNoS2l0LCBTdG9yZWRTdWJzY3JpcHRpb24sIFN0b3JlZFN1YnNjcmliZXIsIFN1YnNjcmliZXIsIFN1YnNjcmlwdGlvbiwgVXBkYXRlUmVjb3JkLCBFYWNoVG9waWMsIEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHNpbmsgPSAoKSA9PiB7fTtcblxuLyoqXG4gKiBDaGVjayB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGZvciByZWplY3Rpb24gYnkgdmF0IHVwZ3JhZGUsXG4gKiBhbmQgcmVmZXRjaCB1cG9uIGVuY291bnRlcmluZyB0aGF0IGNvbmRpdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBFUmVmPFQ+fSBnZXR0ZXJcbiAqIEBwYXJhbSB7RVJlZjxUPltdfSBbc2VlZF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fVxuICovXG5jb25zdCByZWNvbm5lY3RBc05lZWRlZCA9IGFzeW5jIChnZXR0ZXIsIHNlZWQgPSBbXSkgPT4ge1xuICBsZXQgZGlzY29ubmVjdGlvbjtcbiAgbGV0IGxhc3RWZXJzaW9uID0gLUluZmluaXR5O1xuICAvKiBFbmQgc3luY2hyb25vdXMgcHJlbHVkZS4qL1xuICBhd2FpdCBudWxsO1xuICBmb3IgKGxldCBpID0gMDsgOyBpICs9IDEpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0UCA9IGkgPCBzZWVkLmxlbmd0aCA/IHNlZWRbaV0gOiBnZXR0ZXIoKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3VsdFA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24oZXJyKSkge1xuICAgICAgICBpZiAoIWRpc2Nvbm5lY3Rpb24pIHtcbiAgICAgICAgICBkaXNjb25uZWN0aW9uID0gZXJyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgaW5jYXJuYXRpb25OdW1iZXI6IHZlcnNpb24gfSA9IGVycjtcbiAgICAgICAgaWYgKHZlcnNpb24gPiBsYXN0VmVyc2lvbikge1xuICAgICAgICAgIC8qIFdlIGRvbid0IGV4cGVjdCBhbm90aGVyIHVwZ3JhZGUgaW4gYmV0d2VlbiByZWNlaXZpbmcqL1xuICAgICAgICAgIC8qIGEgZGlzY29ubmVjdGlvbiBhbmQgcmUtcmVxdWVzdGluZyBhbiB1cGRhdGUsIGJ1dCBtdXN0Ki9cbiAgICAgICAgICAvKiBuZXZlcnRoZWxlc3MgYmUgcHJlcGFyZWQgZm9yIHRoYXQuKi9cbiAgICAgICAgICBsYXN0VmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qIGlmIGBlcnJgIGlzIGFuIChFcnJvcikgb2JqZWN0LCB3ZSBjYW4gdHJ5IHRvIGFzc29jaWF0ZSBpdCB3aXRoKi9cbiAgICAgIC8qIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaXNjb25uZWN0aW9uIHRoYXQgcHJvbXB0ZWQgdGhlIHJlcXVlc3QqL1xuICAgICAgLyogZm9yIHdoaWNoIGl0IGlzIGEgcmVzdWx0LiovXG4gICAgICBpZiAoIWlzUHJpbWl0aXZlKGVycikgJiYgZGlzY29ubmVjdGlvbiAmJiBkaXNjb25uZWN0aW9uICE9PSBlcnIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhbm5vdGF0ZUVycm9yKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgWGBBdHRlbXB0aW5nIHRvIHJlY292ZXIgZnJvbSBkaXNjb25uZWN0aW9uOiAke2Rpc2Nvbm5lY3Rpb259YCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgLyogbm9vcCovXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgbmVhciBpdGVyYWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgcG90ZW50aWFsbHkgZmFyIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGVJdGVyYXRvcjxUPj59IGl0UFxuICovXG4gICAgICAgY29uc3Qgc3Vic2NyaWJlID0gaXRQID0+XG4gIEZhcignQXN5bmNJdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBpdCA9IEUoaXRQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IHNlbGYgPSBGYXIoJ0FzeW5jSXRlcmFibGVJdGVyYXRvcicsIHtcbiAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gc2VsZixcbiAgICAgICAgbmV4dDogYXN5bmMgKCkgPT4gRShpdCkubmV4dCgpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuICB9KTtcblxuLyoqXG4gKiBBc3luY3Jvbm91c2x5IGl0ZXJhdGVzIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGEgUHVibGljYXRpb25SZWNvcmQgY2hhaW4gYXMgdGhleVxuICogYXBwZWFyLiAgVGhpcyBpdGVyYXRpb24gbXVzdCBkcm9wIHBhcnRzIG9mIHB1YmxpY2F0aW9uIHJlY29yZHMgdGhhdCBhcmUgbm9cbiAqIGxvbmdlciBuZWVkZWQgc28gdGhleSBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICogQHBhcmFtIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gbmV4dENlbGxQXG4gKiAgIFB1YmxpY2F0aW9uUmVjb3JkIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgZmlyc3QgaXRlcmF0aW9uIHJlc3VsdFxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovJGjNj19vbmNlLnN1YnNjcmliZShzdWJzY3JpYmUpO1xuY29uc3QgbWFrZUVhY2hJdGVyYXRvciA9ICh0b3BpYywgbmV4dENlbGxQKSA9PiB7XG4gIC8qIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uLCBzdGFydCB3aXRoKi9cbiAgLyogaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTYwNDA0MTIyMjUwL2h0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPXN0cmF3bWFuOmNvbmN1cnJlbmN5I2luZmluaXRlX3F1ZXVlKi9cbiAgY29uc3Qgc2VsZiA9IEZhcignRWFjaEl0ZXJhdG9yJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHNlbGYsXG4gICAgbmV4dDogKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBoZWFkOiByZXN1bHRQLFxuICAgICAgICBwdWJsaXNoQ291bnQ6IHB1Ymxpc2hDb3VudFAsXG4gICAgICAgIHRhaWw6IHRhaWxQLFxuICAgICAgfSA9IEUuZ2V0KG5leHRDZWxsUCk7XG5cbiAgICAgIC8qIElmIHRhaWxQIGlzIGJyb2tlbiBieSB1cGdyYWRlLCB3ZSB3aWxsIG5lZWQgdG8gcmUtcmVxdWVzdCBpdCovXG4gICAgICAvKiBkaXJlY3RseSBmcm9tIGB0b3BpY2AuKi9cbiAgICAgIGNvbnN0IGdldFN1Y2Nlc3NvciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHVibGlzaENvdW50ID0gYXdhaXQgcHVibGlzaENvdW50UDtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsICdiaWdpbnQnKTtcbiAgICAgICAgY29uc3Qgc3VjY2Vzc29yID0gYXdhaXQgRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbiAgICAgICAgY29uc3QgbmV3UHVibGlzaENvdW50ID0gc3VjY2Vzc29yLnB1Ymxpc2hDb3VudDtcbiAgICAgICAgaWYgKG5ld1B1Ymxpc2hDb3VudCAhPT0gcHVibGlzaENvdW50ICsgMW4pIHtcbiAgICAgICAgICBGYWlsYGVhY2hJdGVyYXRvciBicm9rZW4gYnkgZ2FwIGZyb20gcHVibGlzaENvdW50ICR7cHVibGlzaENvdW50fSB0byAke25ld1B1Ymxpc2hDb3VudH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZXNzb3I7XG4gICAgICB9O1xuXG4gICAgICAvKiBSZXBsYWNlIG5leHRDZWxsUCBvbiBldmVyeSBjYWxsIHRvIG5leHQoKSBzbyB0aGluZ3Mgd29yayBldmVuKi9cbiAgICAgIC8qIHdpdGggYW4gZWFnZXIgY29uc3VtZXIgdGhhdCBkb2Vzbid0IHdhaXQgZm9yIHJlc3VsdHMgdG8gc2V0dGxlLiovXG4gICAgICBuZXh0Q2VsbFAgPSByZWNvbm5lY3RBc05lZWRlZChnZXRTdWNjZXNzb3IsIFt0YWlsUF0pO1xuXG4gICAgICAvKiBBdm9pZCB1bmhhbmRsZWQgcmVqZWN0aW9uIHdhcm5pbmdzIGhlcmUgaWYgdGhlIHByZXZpb3VzIGNlbGwgd2FzIHJlamVjdGVkIG9yKi9cbiAgICAgIC8qIHRoZXJlIGlzIG5vIGZ1cnRoZXIgcmVxdWVzdCBvZiB0aGlzIGl0ZXJhdG9yLiovXG4gICAgICAvKiBgdGFpbFBgIGlzIGhhbmRsZWQgaW5zaWRlIGByZWNvbm5lY3RBc05lZWRlZGAgYW5kIGByZXN1bHRQYCBpcyB0aGUgY2FsbGVyJ3MqL1xuICAgICAgLyogY29uY2VybiwgbGVhdmluZyBvbmx5IGBwdWJsaXNoQ291bnRQYCBhbmQgdGhlIG5ldyBgbmV4dENlbGxQYC4qL1xuICAgICAgdm9pZCBFLndoZW4ocHVibGlzaENvdW50UCwgc2luaywgc2luayk7XG4gICAgICB2b2lkIEUud2hlbihuZXh0Q2VsbFAsIHNpbmssIHNpbmspO1xuICAgICAgcmV0dXJuIHJlc3VsdFA7XG4gICAgfSxcbiAgICBmb3JrOiAoKSA9PiBtYWtlRWFjaEl0ZXJhdG9yKHRvcGljLCBuZXh0Q2VsbFApLFxuICB9KTtcbiAgcmV0dXJuIHNlbGY7XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcInByZWZpeCBsb3NzeVwiIGl0ZXJhdGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0LlxuICogQnkgXCJwcmVmaXggbG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBldmVyeXRoaW5nIHB1Ymxpc2hlZCBiZWZvcmVcbiAqIHlvdSBhc2sgdGhlIHJldHVybmVkIGl0ZXJhYmxlIGZvciBhbiBpdGVyYXRvci4gQnV0IHRoZSByZXR1cm5lZCBpdGVyYXRvclxuICogd2lsbCBlbnVtZXJhdGUgZWFjaCB0aGluZyBwdWJsaXNoZWQgZnJvbSB0aGF0IGl0ZXJhdG9yJ3Mgc3RhcnRpbmcgcG9pbnRcbiAqIHVwIHRvIGEgZGlzY29ubmVjdGlvbiByZXN1bHQgaW5kaWNhdGluZyB1cGdyYWRlIG9mIHRoZSBwcm9kdWNlclxuICogKHdoaWNoIGJyZWFrcyB0aGUgZ2FwLWZyZWUgZ3VhcmFudGVlIGFuZCB0aGVyZWZvcmUgdGVybWluYXRlcyBhbnkgYWN0aXZlXG4gKiBpdGVyYXRvciB3aGlsZSBzdGlsbCBzdXBwb3J0aW5nIGNyZWF0aW9uIG9mIG5ldyBpdGVyYXRvcnMpLlxuICpcbiAqIElmIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdCBpcyB0ZXJtaW5hdGVkLCB0aGF0IHRlcm1pbmFsIHZhbHVlIHdpbGwgYmVcbiAqIHJlcG9ydGVkIGxvc3NsZXNzbHkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICovXG4gICAgICAgY29uc3Qgc3Vic2NyaWJlRWFjaCA9IHRvcGljID0+IHtcbiAgY29uc3QgaXRlcmFibGUgPSBGYXIoJ0VhY2hJdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdENlbGxQID0gcmVjb25uZWN0QXNOZWVkZWQoKCkgPT4gRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIoKSk7XG4gICAgICByZXR1cm4gbWFrZUVhY2hJdGVyYXRvcih0b3BpYywgZmlyc3RDZWxsUCk7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZTtcbn07JGjNj19vbmNlLnN1YnNjcmliZUVhY2goc3Vic2NyaWJlRWFjaCk7XG5oYXJkZW4oc3Vic2NyaWJlRWFjaCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKiBAcGFyYW0ge2JpZ2ludH0gW2xvY2FsVXBkYXRlQ291bnRdXG4gKiBAcGFyYW0ge0l0ZXJhdG9yUmV0dXJuUmVzdWx0PFQ+fSBbdGVybWluYWxSZXN1bHRdXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVD59XG4gKi9cbmNvbnN0IGNsb25lTGF0ZXN0SXRlcmF0b3IgPSAodG9waWMsIGxvY2FsVXBkYXRlQ291bnQsIHRlcm1pbmFsUmVzdWx0KSA9PiB7XG4gIGxldCBtdXRleCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIC8qKlxuICogUmVxdWVzdCB0aGUgbmV4dCB1cGRhdGUgcmVjb3JkIGZyb20gdGhlIHRvcGljLCB1cGRhdGluZyBvdXIgbG9jYWwgc3RhdGUsXG4gKiBhbmQgY29udmVydCBpdCB0byBhbiBpdGVyYXRvciByZXN1bHQuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVD4+fVxuICovXG4gIGNvbnN0IG1heWJlUmVxdWVzdE5leHRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRlcm1pbmFsUmVzdWx0KSB7XG4gICAgICAvKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRvcGljLCBqdXN0IGtlZXAgcmV0dXJuaW5nIHRoZSBsYXN0IHJlc3VsdCovXG4gICAgICAvKiB3aXRob3V0IGZ1cnRoZXIgcmVxdWVzdHMuKi9cbiAgICAgIHJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiAgICB9XG5cbiAgICAvKiBTZW5kIHRoZSBuZXh0IHJlcXVlc3Qgbm93LCBza2lwcGluZyBwYXN0IGludGVybWVkaWF0ZSB1cGRhdGVzKi9cbiAgICAvKiBhbmQgdXBncmFkZSBkaXNjb25uZWN0aW9ucy4qL1xuICAgIGNvbnN0IHsgdmFsdWUsIHVwZGF0ZUNvdW50IH0gPSBhd2FpdCByZWNvbm5lY3RBc05lZWRlZCgoKSA9PlxuICAgICAgRSh0b3BpYykuZ2V0VXBkYXRlU2luY2UobG9jYWxVcGRhdGVDb3VudCksXG4gICAgKTtcbiAgICAvKiBNYWtlIHN1cmUgdGhlIG5leHQgcmVxdWVzdCBpcyBmb3IgYSBmcmVzaGVyIHZhbHVlLiovXG4gICAgbG9jYWxVcGRhdGVDb3VudCA9IHVwZGF0ZUNvdW50O1xuXG4gICAgLyogTWFrZSBhbiBJdGVyYXRvclJlc3VsdC4qL1xuICAgIGlmICh1cGRhdGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZXJtaW5hbFJlc3VsdCA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlIH0pO1xuICAgICAgcmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pO1xuICB9O1xuXG4gIGNvbnN0IHNlbGYgPSBGYXIoJ0xhdGVzdEl0ZXJhdG9yJywge1xuICAgIGZvcms6ICgpID0+IGNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMsIGxvY2FsVXBkYXRlQ291bnQsIHRlcm1pbmFsUmVzdWx0KSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgIG5leHQ6IGFzeW5jICgpID0+IHtcbiAgICAgIC8qIEluIHRoaXMgYWRhcHRvciwgb25jZSBgbmV4dCgpYCBpcyBjYWxsZWQgYW5kIHJldHVybnMgYW4gdW5yZXNvbHZlZCovXG4gICAgICAvKiBwcm9taXNlLCBmdXJ0aGVyIGBuZXh0KClgIGNhbGxzIHdpbGwgYWxzbyByZXR1cm4gdW5yZXNvbHZlZCBwcm9taXNlcyovXG4gICAgICAvKiBidXQgZWFjaCBjYWxsIHdpbGwgbm90IHRyaWdnZXIgYW5vdGhlciBgdG9waWNgIHJlcXVlc3QgdW50aWwgdGhlIHByaW9yKi9cbiAgICAgIC8qIG9uZSBoYXMgc2V0dGxlZC4qL1xuICAgICAgLyoqL1xuICAgICAgLyogVGhpcyBsaW5lYXIgcXVldWVpbmcgYmVoYXZpb3IgaXMgb25seSBuZWVkZWQgZm9yIGNvZGUgdGhhdCB1c2VzIHRoZSovXG4gICAgICAvKiBhc3luYyBpdGVyYXRvciBwcm90b2NvbCBleHBsaWNpdGx5LiBXaGVuIHRoaXMgYXN5bmMgaXRlcmF0b3IgaXMqL1xuICAgICAgLyogY29uc3VtZWQgYnkgYSBmb3IvYXdhaXQvb2YgbG9vcCwgYG5leHQoKWAgd2lsbCBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUqL1xuICAgICAgLyogcHJvbWlzZSBmb3IgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiByZXN1bHQgaGFzIGZ1bGZpbGxlZC4gSWYgaXQgZnVsZmlsbHMqL1xuICAgICAgLyogd2l0aCBgZG9uZTogdHJ1ZWAsIHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB3aWxsIG5ldmVyIGNhbGwgYG5leHQoKWAqL1xuICAgICAgLyogYWdhaW4uKi9cbiAgICAgIC8qKi9cbiAgICAgIC8qIFNlZSovXG4gICAgICAvKiBodHRwczovLzJhbGl0eS5jb20vMjAxNi8xMC9hc3luY2hyb25vdXMtaXRlcmF0aW9uLmh0bWwjcXVldWluZy1uZXh0KCktaW52b2NhdGlvbnMqL1xuICAgICAgLyogZm9yIGFuIGV4cGxpY2l0IHVzZSB0aGF0IHNlbmRzIGBuZXh0KClgIHdpdGhvdXQgd2FpdGluZy4qL1xuXG4gICAgICBpZiAodGVybWluYWxSZXN1bHQpIHtcbiAgICAgICAgLyogV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB0b3BpYywganVzdCBrZWVwIHJldHVybmluZyB0aGUgbGFzdCovXG4gICAgICAgIC8qIHJlc3VsdC4qL1xuICAgICAgICByZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8qIEJFR0lOIENSSVRJQ0FMIFNFQ1RJT04gLSBzeW5jaHJvbm91c2x5IGVucXVldWUgYW5kIHJlYXNzaWduIGBtdXRleGAqL1xuICAgICAgLyoqL1xuICAgICAgLyogVXNlIGBtdXRleGAgdG8gZW5zdXJlIHRoYXQgd2UgaGF2ZSBubyBtb3JlIHRoYW4gYSBzaW5nbGUgcmVxdWVzdCBpbiovXG4gICAgICAvKiBmbGlnaHQuKi9cbiAgICAgIGNvbnN0IG5leHRSZXN1bHQgPSBtdXRleC50aGVuKG1heWJlUmVxdWVzdE5leHRSZXN1bHQpO1xuICAgICAgbXV0ZXggPSBuZXh0UmVzdWx0LnRoZW4oc2luaywgc2luayk7XG4gICAgICAvKiBFTkQgQ1JJVElDQUwgU0VDVElPTiovXG5cbiAgICAgIHJldHVybiBuZXh0UmVzdWx0O1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc2VsZjtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVD59XG4gKi9cbmNvbnN0IG1ha2VMYXRlc3RJdGVyYXRvciA9IHRvcGljID0+IGNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMpO1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcImxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcImxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgYW55IHB1Ymxpc2hlZCBzdGF0ZSBpZiBhIG1vcmVcbiAqIHJlY2VudCBwdWJsaXNoZWQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQgYnkgdXBncmFkZSBvZiB0aGUgcHJvZHVjZXIsXG4gKiBpdCB3aWxsIGJlIHJlLXJlcXVlc3RlZC4gQWxsIG90aGVyIHRlcm1pbmFsIHZhbHVlcyB3aWxsIGJlIGxvc3NsZXNzbHlcbiAqIHByb3BhZ2F0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKi9cbiAgICAgICBjb25zdCBzdWJzY3JpYmVMYXRlc3QgPSB0b3BpYyA9PiB7XG4gIGNvbnN0IGl0ZXJhYmxlID0gRmFyKCdMYXRlc3RJdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBtYWtlTGF0ZXN0SXRlcmF0b3IodG9waWMpLFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2Uuc3Vic2NyaWJlTGF0ZXN0KHN1YnNjcmliZUxhdGVzdCk7XG5oYXJkZW4oc3Vic2NyaWJlTGF0ZXN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN1YnNjcmliZSI6WyJzdWJzY3JpYmUiXSwic3Vic2NyaWJlRWFjaCI6WyJzdWJzY3JpYmVFYWNoIl0sInN1YnNjcmliZUxhdGVzdCI6WyJzdWJzY3JpYmVMYXRlc3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAV6oEkSkNAAApDQAAKQAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIi4vc3Vic2NyaWJlLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vdG9waWMuanMiXSwiZXhwb3J0cyI6WyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsRmFyLHN1YnNjcmliZUVhY2gsbWFrZVB1Ymxpc2hLaXQsbWFrZVBpbm5lZEhpc3RvcnlUb3BpYzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIixbJGjNj19hID0+IChzdWJzY3JpYmVFYWNoID0gJGjNj19hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChtYWtlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIi4vdG9waWMuanNcIiwgW1tcIm1ha2VQaW5uZWRIaXN0b3J5VG9waWNcIixbJGjNj19hID0+IChtYWtlUGlubmVkSGlzdG9yeVRvcGljID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RWFjaFRvcGljLCBJdGVyYXRpb25PYnNlcnZlciwgTGF0ZXN0VG9waWMsIE5vdGlmaWVyLCBOb3RpZmllclJlY29yZCwgU3Vic2NyaXB0aW9uUmVjb3JkLCBQdWJsaXNoZXIsIFB1Ymxpc2hLaXQsIFN0b3JlZFB1Ymxpc2hLaXQsIFN0b3JlZFN1YnNjcmlwdGlvbiwgU3RvcmVkU3Vic2NyaWJlciwgU3Vic2NyaWJlciwgU3Vic2NyaXB0aW9uLCBVcGRhdGVSZWNvcmR9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEVhY2hUb3BpYzxUPj59IHRvcGljXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uID0gdG9waWMgPT4ge1xuICBjb25zdCBzdWJzY3JpcHRpb24gPSBGYXIoJ1N1YnNjcmlwdGlvbicsIHtcbiAgICAuLi5zdWJzY3JpYmVFYWNoKHRvcGljKSxcbiAgICBzdWJzY3JpYmVBZnRlcjogYXN5bmMgcHVibGlzaENvdW50ID0+IEUodG9waWMpLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG5cbiAgICAvKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBTdWJzY3JpcHRpb24gZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIFN1YnNjcmlwdGlvbiB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlU3Vic2NyaXB0aW9uYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIFN1YnNjcmlwdGlvbiBhdCB0aGF0IHNpdGUuXG4gKi9cbiAgICBnZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczogYXN5bmMgKCkgPT4gdG9waWMsXG5cbiAgICBnZXRTdG9yZUtleTogKCkgPT4gaGFyZGVuKHsgc3Vic2NyaXB0aW9uIH0pLFxuICB9KTtcbiAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbn07JGjNj19vbmNlLm1ha2VTdWJzY3JpcHRpb24obWFrZVN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbik7XG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBQcm9kdWNlcnMgc2hvdWxkIHVzZVxuICogYGBganNcbiAqIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuICogY29uc3QgdG9waWMgPSBtYWtlUGlubmVkSGlzdG9yeVRvcGljKHN1YnNjcmliZXIpO1xuICogYGBgXG4gKiBpbnN0ZWFkLCB3aGljaCBtYWtlcyBpdCBjbGVhcmVyIHRoYXQgYWxsIHRoZSBzdWJzY3JpYmVyJ3MgaGlzdG9yeSBpc1xuICogcmV0YWluZWQsIHByZXZlbnRpbmcgR0MuICBQb3RlbnRpYWxseSByZW1vdGUgY29uc3VtZXJzIHVzZVxuICogYGBganNcbiAqIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2Ygc3Vic2NyaWJlRWFjaCh0b3BpYykpIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIE1ha2VzIGEgYHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9YCBmb3IgZG9pbmcgbG9zc2xlc3MgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0ID0gKCkgPT4ge1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICAvKiBUaGUgcHVibGlzaCBraXQgc3Vic2NyaWJlciBpcyBwcmVmaXgtbG9zc3ksIHNvIG1ha2luZyAqdGhpcyogc3Vic2NyaWJlciBjb21wbGV0ZWx5Ki9cbiAgLyogbG9zc2xlc3MgZnJvbSBpbml0aWFsaXNhdGlvbiByZXF1aXJlcyBwaW5uaW5nIHRoZSBmb3JtZXIncyBoaXN0b3J5LiovXG5cbiAgY29uc3QgcGlubmVkSGlzdG9yeVRvcGljID0gbWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhzdWJzY3JpYmVyKTtcbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbWFrZVN1YnNjcmlwdGlvbihwaW5uZWRIaXN0b3J5VG9waWMpO1xuXG4gIC8qKiBAdHlwZSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59ICovXG4gIGNvbnN0IHB1YmxpY2F0aW9uID0gRmFyKCdwdWJsaWNhdGlvbicsIHtcbiAgICB1cGRhdGVTdGF0ZTogbm9uRmluYWxWYWx1ZSA9PiBwdWJsaXNoZXIucHVibGlzaChub25GaW5hbFZhbHVlKSxcbiAgICBmaW5pc2g6IGNvbXBsZXRpb24gPT4gcHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbiAgICBmYWlsOiByZWFzb24gPT4gcHVibGlzaGVyLmZhaWwocmVhc29uKSxcbiAgfSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfSk7XG59OyRozY9fb25jZS5tYWtlU3Vic2NyaXB0aW9uS2l0KG1ha2VTdWJzY3JpcHRpb25LaXQpO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb25LaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB35kpGlQYAAJUGAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3RvcGljLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VhY2hUb3BpYywgTGF0ZXN0VG9waWN9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBBIHBpbm5lZC1oaXN0b3J5IHRvcGljIHByZXNlcnZlcyBhbGwgb2YgaXRzIHB1Ymxpc2hlZCB2YWx1ZXMgaW5cbiAqIG1lbW9yeS4gIFVzZSBhIHByZWZpeC1sb3NzeSBtYWtlUHVibGlzaEtpdCBpbnN0ZWFkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VhY2hUb3BpYzxUPiAmIExhdGVzdFRvcGljPFQ+fSB0b3BpYyBuZWVkcyB0byBiZSBuZWFyIGluIG9yZGVyIHRvXG4gKiBwcmVzZXJ2ZSBzdWJzY3JpcHRpb24gdGltaW5ncy4gIFRPRE86IGRyb3AgYExhdGVzdFRvcGljPFQ+YCByZXF1aXJlbWVudFxuICogQHJldHVybnMge0VhY2hUb3BpYzxUPiAmIExhdGVzdFRvcGljPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVBpbm5lZEhpc3RvcnlUb3BpYyA9IHRvcGljID0+IHtcbiAgLyogU3VjaCBsb3NzbGVzc25lc3MgaW5oaWJpdHMgR0MsIHdoaWNoIGlzIHdoeSB3ZSdyZSBtb3ZpbmcgYXdheSBmcm9tIGl0LiovXG5cbiAgLyogV2UgbmVlZCB0byB0YWtlIGFuIGltbWVkaWF0ZSBzbmFwc2hvdCBvZiB0aGUgdG9waWMncyBjdXJyZW50IHN0YXRlLiovXG4gIGNvbnN0IHBpbm5lZFB1Ykxpc3QgPSB0b3BpYy5zdWJzY3JpYmVBZnRlcigpO1xuXG4gIHJldHVybiBGYXIoJ1Bpbm5lZEhpc3RvcnlUb3BpYycsIHtcbiAgICBzdWJzY3JpYmVBZnRlcjogYXN5bmMgKHB1Ymxpc2hDb3VudCA9IC0xbikgPT4ge1xuICAgICAgaWYgKHB1Ymxpc2hDb3VudCA9PT0gLTFuKSB7XG4gICAgICAgIHJldHVybiBwaW5uZWRQdWJMaXN0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvcGljLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCk7XG4gICAgfSxcbiAgICBnZXRVcGRhdGVTaW5jZTogYXN5bmMgKHVwZGF0ZUNvdW50ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAvKiBUT0RPOiBCdWlsZCB0aGlzIG91dCBvZiBFYWNoVG9waWM8VD4uKi9cbiAgICAgIHJldHVybiB0b3BpYy5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlUGlubmVkSGlzdG9yeVRvcGljKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xuaGFyZGVuKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARxpyk0YOAABGDgAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyIsIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsIkBlbmRvL2V4byIsIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyIsIm11c3RNYXRjaCIsInByb3ZpZGVMYXp5IiwicHJvdmlkZUxhenkiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCB0eXBlbGVzc011c3RNYXRjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+ICh0eXBlbGVzc011c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzXCIsIFtdXSxbXCJAZW5kby9leG9cIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbXV0sW1wiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogWFhYIEBhZ29yaWMvc3RvcmUgc2hvdWxkIG5vdCBkZXBlbmQgb24gQGFnb3JpYy9pbnRlcm5hbCovXG4vKiBUT0RPIG1vdmUgdG8gRW5kbyovXG4vKiogQHR5cGUge011c3RNYXRjaH0gKi9cbiAgICAgICBjb25zdCBtdXN0TWF0Y2ggPSB0eXBlbGVzc011c3RNYXRjaDskaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6W1sibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6W1sibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6W1sibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUF0b21pY1Byb3ZpZGVyIl0sWyJwcm92aWRlTGF6eSIsInByb3ZpZGVMYXp5Il1dLCJAZW5kby9wYXR0ZXJucyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXSxbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl0sWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXSxbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl0sWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il0sWyJiYWdJc1N1cGVyYmFnIiwiYmFnSXNTdXBlcmJhZyJdLFsiYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXSxbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJpc0NvcHlTZXQiLCJpc0NvcHlTZXQiXSxbImlzQ29weU1hcCIsImlzQ29weU1hcCJdXSwiQGVuZG8vZXhvIjpbWyJpbml0RW1wdHkiLCJpbml0RW1wdHkiXSxbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiXSxbImRlZmluZUV4b0NsYXNzS2l0IiwiZGVmaW5lRXhvQ2xhc3NLaXQiXSxbIm1ha2VFeG8iLCJtYWtlRXhvIl1dLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiOltbIm1ha2VMZWdhY3lNYXAiLCJtYWtlTGVnYWN5TWFwIl1dLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjpbWyJtYWtlTGVnYWN5V2Vha01hcCIsIm1ha2VMZWdhY3lXZWFrTWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAD9JGLuILAADiCwAALAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBhbmQgaXRzIGZyYXRlcm5hbCBzaWJsaW5nIGxlZ2FjeVdlYWtNYXAgZXhpc3Qgb25seSB0byBlYXNlIGFcbiAqIHRyYW5zaXRpb24gdG8gdGhlIG1vZGVybiBgc3RvcmVgIHN5c3RlbSwgYXJlIGRlcHJlY2F0ZWQsIGFuZCB3aWxsIGV2ZW50dWFsbHlcbiAqIGRpc2FwcGVhci4gVGhleSBhcmUgbmVlZGVkIGZvciBub3cgdG8gc3VwcG9ydCBzb21lIG9mIHRoZSB1c2VzIG9mIHRoZSBvbGRcbiAqIGJlaGF2aW9yIHRoYXQgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG5ldy4gVGhlIGNvbnN0cmFpbnQgaW1wb3NlZCBieSB0aGVcbiAqIG5ldyBpcyB0aGF0IG9ubHkgcGFzc2FibGVzIGNhbiBiZSB1c2VkIGFzIHZhbHVlcywgYW5kIG9ubHkga2V5cyAocm91Z2hseSxcbiAqIHN0cnVjdHVyZXMsIGFrYSBjb21wYXJhYmxlcykgY2FuIGJlIHVzZWQgYXMgdmFsdWVzLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC8zNTY3XG4gKlxuICogVE9ETyBPbmNlIHRoYXQgUFIgaXMgbWVyZ2VkLCBsaW5rIHRvIHRoZSBkb2N1bWVudHMgcmF0aGVyIHRoYW4gdGhlIFBScy5cbiAqXG4gKiBFYWNoIG9mIHRoZXNlIG5vbi1jb25mb3JtaW5nIHVzZXMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoIGFcbiAqXG4gKiBgYGBqc1xuICogLy8gTGVnYWN5IGJlY2F1c2UuLi5cbiAqIGBgYFxuICpcbiAqIGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgcHJvYmxlbSBpbmhpYml0aW5nIGNvbnZlcnNpb24gdG8gdGhlIG5ldyBzeXN0ZW0uIFNvbWVcbiAqIG9mIHRoZXNlIHByb2JsZW1zIGFzIG9mIHRoaXMgd3JpdGluZzpcbiAqXG4gKiAtIEEgcHJvbWlzZUtpdCB1c2VkIGFzIGEgdmFsdWUsIGV2ZW4gdGhvdWdoIGEgcHJvbWlzZUtpdCBpcyBub3QgYSBwYXNzYWJsZS5cbiAqICAgU29sdXRpb25zIGFyZSB0byBtYWtlIGl0IGEgcGFzc2FibGUsIG9yIHRvIGNvbnZlcnQgdGhlIGNvbnRhaW5lciBiYWNrIHRvIGFcbiAqICAgY29udmVudGlvbmFsIEphdmFTY3JpcHQgTWFwLlxuICogLSBBIG11dGFibGUgYXJyYXkgdXNlZCBhcyBhIHZhbHVlLCB0aGF0IGlzIHN1YnNlcXVlbnRseSBtdXRhdGVkLiBGcmVlemluZyB0aGVcbiAqICAgYXJyYXkgd291bGRuJ3Qgd29yayBvZiBjb3Vyc2UgYmVjYXVzZSBpdCB3b3VsZCBicmVhayB0aGUgc3Vic2VxdWVudFxuICogICBtdXRhdGlvbi4gVXNpbmcgYSBmYXIgb2JqZWN0IHdyYXBwaW5nIGFuIGFycmF5IHdvdWxkIGxpa2VseSB3b3JrIGZpbmUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhck1hcCBpZiBwb3NzaWJsZSwgTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lNYXA8SywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTGVnYWN5TWFwID0gKHRhZyA9ICdrZXknKSA9PiB7XG4gIGNvbnN0IG0gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdCA9IGtleSA9PlxuICAgICFtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0ga2V5ID0+XG4gICAgbS5oYXMoa2V5KSB8fCBGYWlsYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGhhczoga2V5ID0+IHtcbiAgICAgIC8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbiAgICAgIC8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbiAgICAgIC8qIGluIHRoaXMgbWFwLiovXG4gICAgICByZXR1cm4gbS5oYXMoa2V5KTtcbiAgICB9LFxuICAgIGluaXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbiAgICAgIG0uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZ2V0OiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICByZXR1cm4gbS5nZXQoa2V5KTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgbS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIG0uZGVsZXRlKGtleSk7XG4gICAgfSxcbiAgICBrZXlzOiAoKSA9PiBtLmtleXMoKSxcbiAgICB2YWx1ZXM6ICgpID0+IG0udmFsdWVzKCksXG4gICAgZW50cmllczogKCkgPT4gbS5lbnRyaWVzKCksXG4gICAgZ2V0U2l6ZTogKCkgPT4gbS5zaXplLFxuICAgIGNsZWFyOiAoKSA9PiBtLmNsZWFyKCksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUxlZ2FjeU1hcChtYWtlTGVnYWN5TWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADbxEI1bQcAAG0HAAAwAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogU2VlIGRvY2NvbW1lbnQgaW4gdGhlIGNsb3NlbHkgcmVsYXRlZCBgbGVnYWN5TWFwLmpzYCBtb2R1bGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhcldlYWtNYXAgaWYgcG9zc2libGUsIFdlYWtNYXAgb3RoZXJ3aXNlXG4gKiBAdGVtcGxhdGUge1dlYWtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHJldHVybnMge0xlZ2FjeVdlYWtNYXA8SywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTGVnYWN5V2Vha01hcCA9ICh0YWcgPSAna2V5JykgPT4ge1xuICAvKiogQHR5cGUge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59ICovXG4gIGNvbnN0IHdtID0gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0ID0ga2V5ID0+XG4gICAgIXdtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0ga2V5ID0+XG4gICAgd20uaGFzKGtleSkgfHwgRmFpbGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IGtleSA9PiB7XG4gICAgICAvKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4gICAgICAvKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4gICAgICAvKiBpbiB0aGlzIG1hcC4qL1xuICAgICAgcmV0dXJuIHdtLmhhcyhrZXkpO1xuICAgIH0sXG4gICAgaW5pdDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuICAgICAgd20uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZ2V0OiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICAvKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtWfSAqLyAod20uZ2V0KGtleSkpO1xuICAgIH0sXG4gICAgc2V0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICB3bS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIHdtLmRlbGV0ZShrZXkpO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUxlZ2FjeVdlYWtNYXAobWFrZUxlZ2FjeVdlYWtNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lXZWFrTWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANehQUbqGAAA6hgAADEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiLCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYXIsYXNzZXJ0UGFzc2FibGUsZmlsdGVySXRlcmFibGUsbWFwSXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5TWFwLG1hdGNoZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4sbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsWyRozY9fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaM2PX2EpXV0sW1wibWFwSXRlcmFibGVcIixbJGjNj19hID0+IChtYXBJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzXCIsWyRozY9fYSA9PiAobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIixbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7S2V5LCBQYXR0ZXJufSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtNYXBTdG9yZSwgTWFwU3RvcmVNZXRob2RzLCBTdG9yZU9wdGlvbnN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge01hcDxLLCBWPn0ganNtYXBcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb0FkZFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvU2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXVxuICogQHJldHVybnMge01hcFN0b3JlTWV0aG9kczxLLCBWPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNYXBTdG9yZU1ldGhvZHMgPSAoXG4gIGpzbWFwLFxuICBhc3NlcnRLVk9rVG9BZGQsXG4gIGFzc2VydEtWT2tUb1NldCxcbiAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbiAgdGFnID0gJ2tleScsXG4pID0+IHtcbiAgY29uc3QgeyBhc3NlcnRVcGRhdGVPbkFkZCwgYXNzZXJ0VXBkYXRlT25EZWxldGUsIGl0ZXJhYmxlS2V5cyB9ID1cbiAgICBtYWtlQ3VycmVudEtleXNLaXQoXG4gICAgICAoKSA9PiBqc21hcC5rZXlzKCksXG4gICAgICBrID0+IGpzbWFwLmhhcyhrKSxcbiAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgYXNzZXJ0S1ZPa1RvQWRkLFxuICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbiAgICAgIHRhZyxcbiAgICApO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuICBjb25zdCBrZXlzID0gKGtleVBhdHQsIHZhbHVlUGF0dCkgPT4ge1xuICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBpdGVyYWJsZUtleXM7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IGsgPT4ge1xuICAgICAgaWYgKGtleVBhdHQgIT09IHVuZGVmaW5lZCAmJiAhbWF0Y2hlcyhrLCBrZXlQYXR0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvKiBVc2VzIHRoZSBjdXJyZW50IGpzbWFwIHZhbHVlLCBzaW5jZSB0aGUgaXRlcmF0YXRvciBzdXJ2aXZlcyBgLnNldGAqL1xuICAgICAgaWYgKHZhbHVlUGF0dCAhPT0gdW5kZWZpbmVkICYmICFtYXRjaGVzKGpzbWFwLmdldChrKSwgdmFsdWVQYXR0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsIGZpbHRlcik7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHBhcmFtIHtQYXR0ZXJufSBbdmFsdWVQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPFY+fVxuICovXG4gIGNvbnN0IHZhbHVlcyA9IChrZXlQYXR0LCB2YWx1ZVBhdHQpID0+XG4gICAgbWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LCB2YWx1ZVBhdHQpLCBrID0+IC8qKiBAdHlwZSB7Vn0gKi8gKGpzbWFwLmdldChrKSkpO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSywgVl0+fVxuICovXG4gIGNvbnN0IGVudHJpZXMgPSAoa2V5UGF0dCwgdmFsdWVQYXR0KSA9PlxuICAgIG1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSwgayA9PiBbXG4gICAgICBrLFxuICAgICAgLyoqIEB0eXBlIHtWfSAqLyAoanNtYXAuZ2V0KGspKSxcbiAgICBdKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICAuLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzbWFwLFxuICAgICAgLyoqIEB0eXBlIHsoazogSywgdjogVikgPT4gdm9pZH0gKi8gKGFzc2VydFVwZGF0ZU9uQWRkKSxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIGFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuICAgICAgdGFnLFxuICAgICksXG4gICAga2V5cyxcbiAgICB2YWx1ZXMsXG4gICAgZW50cmllcyxcblxuICAgIHNuYXBzaG90OiAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LCB2YWx1ZVBhdHQpKSxcblxuICAgIGdldFNpemU6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgICBrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBqc21hcC5zaXplXG4gICAgICAgIDogWy4uLmtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG4gICAgY2xlYXI6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAganNtYXAuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSkge1xuICAgICAgICBqc21hcC5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvciByZWZlcmVuY2luZyBhXG4gKiBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCwgYHNldGAgYW5kXG4gKiBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSBfc2NhbGFyXyBtYXAgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZU1hcHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgSz1hbnlcbiAqIEB0ZW1wbGF0ZSBWPWFueVxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGhlIGNvbHVtbiBuYW1lIGZvciB0aGUga2V5XG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SywgVj59XG4gKi8kaM2PX29uY2UubWFrZU1hcFN0b3JlTWV0aG9kcyhtYWtlTWFwU3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyTWFwU3RvcmUgPSAoXG4gIHRhZyA9ICdrZXknLFxuICB7IGtleVNoYXBlLCB2YWx1ZVNoYXBlIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCBqc21hcCA9IG5ldyBNYXAoKTtcbiAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiAgfVxuICBpZiAodmFsdWVTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiAgfVxuXG4gIGNvbnN0IGFzc2VydEtWT2tUb1NldCA9IChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgIC8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbiAgICBoYXJkZW4odmFsdWUpO1xuXG4gICAgYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuICAgIGlmICh2YWx1ZVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSwgJ21hcFN0b3JlIHZhbHVlJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFzc2VydEtWT2tUb0FkZCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbihrZXkpO1xuXG4gICAgYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG4gICAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChrZXksIGtleVNoYXBlLCAnbWFwU3RvcmUga2V5Jyk7XG4gICAgfVxuICAgIGFzc2VydEtWT2tUb1NldChrZXksIHZhbHVlKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKGBzY2FsYXIgTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VNYXBTdG9yZU1ldGhvZHMoXG4gICAgICBqc21hcCxcbiAgICAgIGFzc2VydEtWT2tUb0FkZCxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRhZyxcbiAgICApLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJNYXBTdG9yZShtYWtlU2NhbGFyTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACmQkq1EREAABERAAAxAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIixbJGjNj19hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsWyRozY9fYSA9PiAobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIixbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXksIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1NldFN0b3JlLCBTZXRTdG9yZU1ldGhvZHMsIFN0b3JlT3B0aW9uc30gZnJvbSAnLi4vdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7U2V0PEs+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7U2V0U3RvcmVNZXRob2RzPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVNldFN0b3JlTWV0aG9kcyA9IChcbiAganNzZXQsXG4gIGFzc2VydEtleU9rVG9BZGQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBjb25zdCB7IGFzc2VydFVwZGF0ZU9uQWRkLCBhc3NlcnRVcGRhdGVPbkRlbGV0ZSwgaXRlcmFibGVLZXlzIH0gPVxuICAgIG1ha2VDdXJyZW50S2V5c0tpdChcbiAgICAgICgpID0+IGpzc2V0LmtleXMoKSxcbiAgICAgIGsgPT4ganNzZXQuaGFzKGspLFxuICAgICAgY29tcGFyZVJhbmssXG4gICAgICBhc3NlcnRLZXlPa1RvQWRkLFxuICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbiAgICAgIGtleU5hbWUsXG4gICAgKTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbiAgY29uc3Qga2V5cyA9IGtleVBhdHQgPT5cbiAgICBrZXlQYXR0ID09PSB1bmRlZmluZWRcbiAgICAgID8gaXRlcmFibGVLZXlzXG4gICAgICA6IGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cywgayA9PiBtYXRjaGVzKGssIGtleVBhdHQpKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICAuLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzc2V0LFxuICAgICAgYXNzZXJ0VXBkYXRlT25BZGQsXG4gICAgICBhc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbiAgICAgIGtleU5hbWUsXG4gICAgKSxcblxuICAgIGtleXMsXG5cbiAgICB2YWx1ZXM6IGtleXMsXG5cbiAgICBzbmFwc2hvdDogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+IG1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG4gICAgZ2V0U2l6ZTogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgICBrZXlQYXR0ID09PSB1bmRlZmluZWQgPyBqc3NldC5zaXplIDogWy4uLmtleXMoa2V5UGF0dCldLmxlbmd0aCxcblxuICAgIGNsZWFyOiAoa2V5UGF0dCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGtleVBhdHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBqc3NldC5jbGVhcigpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0KSkge1xuICAgICAgICBqc3NldC5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvciByZWZlcmVuY2luZyBhXG4gKiBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCwgYHNldGAgYW5kXG4gKiBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSBfc2NhbGFyXyBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqLyRozY9fb25jZS5tYWtlU2V0U3RvcmVNZXRob2RzKG1ha2VTZXRTdG9yZU1ldGhvZHMpO1xuICAgICAgIGNvbnN0IG1ha2VTY2FsYXJTZXRTdG9yZSA9ICh0YWcgPSAna2V5JywgeyBrZXlTaGFwZSB9ID0ge30pID0+IHtcbiAgY29uc3QganNzZXQgPSBuZXcgU2V0KCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLZXlPa1RvQWRkID0ga2V5ID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKGtleSk7XG5cbiAgICBhc3NlcnRTY2FsYXJLZXkoa2V5KTtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICdzZXRTdG9yZSBrZXknKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEZhcihgc2NhbGFyIFNldFN0b3JlIG9mICR7cSh0YWcpfWAsIHtcbiAgICAuLi5tYWtlU2V0U3RvcmVNZXRob2RzKGpzc2V0LCBhc3NlcnRLZXlPa1RvQWRkLCB1bmRlZmluZWQsIHRhZyksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhclNldFN0b3JlKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhclNldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPk186ftFgAA7RYAADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsRmFyLGFzc2VydFBhc3NhYmxlLHBhc3NTdHlsZU9mLGdldENvcHlNYXBFbnRyaWVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weU1hcDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldENvcHlNYXBFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJpZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dLFtcImlzQ29weU1hcFwiLFskaM2PX2EgPT4gKGlzQ29weU1hcCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXl9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7V2Vha01hcFN0b3JlLCBTdG9yZU9wdGlvbnN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7V2Vha01hcFN0b3JlPEssIFY+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAoXG4gIGpzbWFwLFxuICBhc3NlcnRLVk9rVG9BZGQsXG4gIGFzc2VydEtWT2tUb1NldCxcbiAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSA9IHVuZGVmaW5lZCxcbiAga2V5TmFtZSA9ICdrZXknLFxuKSA9PiB7XG4gIGNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdCA9IGtleSA9PlxuICAgICFqc21hcC5oYXMoa2V5KSB8fCBGYWlsYCR7cShrZXlOYW1lKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuXG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIGpzbWFwLmhhcyhrZXkpIHx8IEZhaWxgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuICAgICAgLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuICAgICAgLyogaW4gdGhpcyBtYXAuKi9cbiAgICAgIHJldHVybiBqc21hcC5oYXMoa2V5KTtcbiAgICB9LFxuICAgIGdldDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7Vn0gKi8gKGpzbWFwLmdldChrZXkpKTtcbiAgICB9LFxuXG4gICAgaW5pdDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuICAgICAgYXNzZXJ0S1ZPa1RvQWRkKGtleSwgdmFsdWUpO1xuICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBhc3NlcnRLVk9rVG9TZXQoa2V5LCB2YWx1ZSk7XG4gICAgICBqc21hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIGlmIChhc3NlcnRLZXlPa1RvRGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAganNtYXAuZGVsZXRlKGtleSk7XG4gICAgfSxcblxuICAgIGFkZEFsbDogZW50cmllcyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGVudHJpZXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGVudHJpZXMpICYmIGlzQ29weU1hcChlbnRyaWVzKSkge1xuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYKi9cbiAgICAgICAgICBlbnRyaWVzID0gZ2V0Q29weU1hcEVudHJpZXMoZW50cmllcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRmFpbGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7ZW50cmllc31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAvKiogQHR5cGUge0l0ZXJhYmxlPFtLLCBWXT59ICovIChlbnRyaWVzKSkge1xuICAgICAgICAvKiBEb24ndCBhc3NlcnQgdGhhdCB0aGUga2V5IGVpdGhlciBkb2VzIG9yIGRvZXMgbm90IGV4aXN0LiovXG4gICAgICAgIGFzc2VydEtWT2tUb0FkZChrZXksIHZhbHVlKTtcbiAgICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgX3NjYWxhcl8gbWFwU3RvcmUgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzOlxuICogcHJpbWl0aXZlcyBvciByZW1vdGFibGVzLiBPdGhlciBtYXBTdG9yZXMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLFxuICogY29weUFycmF5cyBhbmQgY29weVJlY29yZHMgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mXG4gKiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha01hcCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha01hcCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dCBpdFxuICogc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogbWFwLiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlIHJlbW90YWJsZXMsXG4gKiBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIHJlYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlT2JqZWN0ICYgV2Vha01hcFN0b3JlPEssIFY+fVxuICovJGjNj19vbmNlLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gKFxuICB0YWcgPSAna2V5JyxcbiAgeyBsb25nTGl2ZWQgPSB0cnVlLCBrZXlTaGFwZSA9IHVuZGVmaW5lZCwgdmFsdWVTaGFwZSA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSAqL1xuICBjb25zdCBqc21hcCA9IGxvbmdMaXZlZCA/IG5ldyBXZWFrTWFwKCkgOiBuZXcgTWFwKCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cbiAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLVk9rVG9TZXQgPSAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKHZhbHVlKTtcblxuICAgIGFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbiAgICBpZiAodmFsdWVTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2godmFsdWUsIHZhbHVlU2hhcGUsICd3ZWFrTWFwU3RvcmUgdmFsdWUnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvQWRkID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKGtleSk7XG4gICAgcGFzc1N0eWxlT2Yoa2V5KSA9PT0gJ3JlbW90YWJsZScgfHxcbiAgICAgIEZhaWxgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrTWFwU3RvcmVzOiAke2tleX1gO1xuICAgIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2goa2V5LCBrZXlTaGFwZSwgJ3dlYWtNYXBTdG9yZSBrZXknKTtcbiAgICB9XG4gICAgYXNzZXJ0S1ZPa1RvU2V0KGtleSwgdmFsdWUpO1xuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBXZWFrTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuICAgICAganNtYXAsXG4gICAgICBhc3NlcnRLVk9rVG9BZGQsXG4gICAgICBhc3NlcnRLVk9rVG9TZXQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0YWcsXG4gICAgKSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlU2NhbGFyV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJRapRtOEQAAThEAADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsRmFyLHBhc3NTdHlsZU9mLGdldENvcHlTZXRLZXlzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weVNldDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXSxbXCJpc0NvcHlTZXRcIixbJGjNj19hID0+IChpc0NvcHlTZXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7S2V5fSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtTdG9yZU9wdGlvbnMsIFdlYWtTZXRTdG9yZSwgV2Vha1NldFN0b3JlTWV0aG9kc30gZnJvbSAnQGFnb3JpYy9zdG9yZSc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtXZWFrU2V0PEsgJiBvYmplY3Q+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlTWV0aG9kczxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gKFxuICBqc3NldCxcbiAgYXNzZXJ0S2V5T2tUb0FkZCxcbiAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSA9IHVuZGVmaW5lZCxcbiAga2V5TmFtZSA9ICdrZXknLFxuKSA9PiB7XG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIGpzc2V0LmhhcyhrZXkpIHx8IEZhaWxgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuICAgICAgLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuICAgICAgLyogaW4gdGhpcyBzZXQuKi9cbiAgICAgIHJldHVybiBqc3NldC5oYXMoa2V5KTtcbiAgICB9LFxuXG4gICAgYWRkOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuICAgICAganNzZXQuYWRkKGtleSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIGlmIChhc3NlcnRLZXlPa1RvRGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAganNzZXQuZGVsZXRlKGtleSk7XG4gICAgfSxcblxuICAgIGFkZEFsbDoga2V5cyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGtleXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGtleXMpICYmIGlzQ29weVNldChrZXlzKSkge1xuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYKi9cbiAgICAgICAgICBrZXlzID0gZ2V0Q29weVNldEtleXMoa2V5cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRmFpbGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7a2V5c31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiAvKiogQHR5cGUge0l0ZXJhYmxlPEs+fSAqLyAoa2V5cykpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuICAgICAgICBqc3NldC5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogVGhpcyBpcyBhIF9zY2FsYXJfIHNldCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlU2V0cyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrU2V0IGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrU2V0IGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0IGl0XG4gKiBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBzZXQuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGUgcmVtb3RhYmxlcyxcbiAqIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqLyRozY9fb25jZS5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyk7XG4gICAgICAgY29uc3QgbWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9IChcbiAgdGFnID0gJ2tleScsXG4gIHsgbG9uZ0xpdmVkID0gdHJ1ZSwga2V5U2hhcGUgPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGpzc2V0ID0gbmV3IChsb25nTGl2ZWQgPyBXZWFrU2V0IDogU2V0KSgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S2V5T2tUb0FkZCA9IGtleSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbihrZXkpO1xuICAgIHBhc3NTdHlsZU9mKGtleSkgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgICBGYWlsYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha1N0b3JlczogJHtrZXl9YDtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICd3ZWFrU2V0U3RvcmUga2V5Jyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBXZWFrU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKGpzc2V0LCBhc3NlcnRLZXlPa1RvQWRkLCB1bmRlZmluZWQsIHRhZyksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhcldlYWtTZXRTdG9yZShtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACqV+8u2xoAANsaAAAuAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJhcHBlbmRUb1N0b3JlZEFycmF5IiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRmFyLGlzQ29weU1hcCxpc0NvcHlTZXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImlzQ29weU1hcFwiLFskaM2PX2EgPT4gKGlzQ29weU1hcCA9ICRozY9fYSksJGjNj19saXZlW1wiaXNDb3B5TWFwXCJdXV0sW1wiaXNDb3B5U2V0XCIsWyRozY9fYSA9PiAoaXNDb3B5U2V0ID0gJGjNj19hKSwkaM2PX2xpdmVbXCJpc0NvcHlTZXRcIl1dXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDdXJyZW50S2V5c0tpdFxuICogQHByb3BlcnR5IHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uQWRkXG4gKiBAcHJvcGVydHkgeyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkRlbGV0ZVxuICogQHByb3BlcnR5IHtJdGVyYWJsZTxLPn0gaXRlcmFibGVLZXlzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHsoKSA9PiBJdGVyYWJsZTxLPn0gZ2V0UmF3S2V5c1xuICogQHBhcmFtIHsoazogSykgPT4gYm9vbGVhbn0gY2hlY2tIYXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtDdXJyZW50S2V5c0tpdDxLLCBWPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDdXJyZW50S2V5c0tpdCA9IChcbiAgZ2V0UmF3S2V5cyxcbiAgY2hlY2tIYXMsXG4gIGNvbXBhcmUsXG4gIGFzc2VydE9rVG9BZGQsXG4gIGFzc2VydE9rVG9EZWxldGUsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBsZXQgdXBkYXRlQ291bnQgPSAwO1xuICAvKiogQHR5cGUge0FycmF5PEs+IHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgc29ydGVkS2V5c01lbW87XG5cbiAgY29uc3QgYXNzZXJ0VXBkYXRlT25BZGQgPSAoaywgdiA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFzc2VydE9rVG9BZGQoaywgdik7XG4gICAgdXBkYXRlQ291bnQgKz0gMTtcbiAgICBzb3J0ZWRLZXlzTWVtbyA9IHVuZGVmaW5lZDtcbiAgfTtcblxuICBjb25zdCBhc3NlcnRVcGRhdGVPbkRlbGV0ZSA9IGsgPT4gYXNzZXJ0T2tUb0RlbGV0ZSAmJiBhc3NlcnRPa1RvRGVsZXRlKGspO1xuXG4gIGNvbnN0IGdldFNvcnRlZEtleXMgPSAoKSA9PiB7XG4gICAgaWYgKHNvcnRlZEtleXNNZW1vID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNvcnRlZEtleXNNZW1vID0gaGFyZGVuKFsuLi5nZXRSYXdLZXlzKCldLnNvcnQoY29tcGFyZSkpO1xuICAgIH1cbiAgICByZXR1cm4gc29ydGVkS2V5c01lbW87XG4gIH07XG5cbiAgY29uc3QgaXRlcmFibGVLZXlzID0gRmFyKCdJdGVyYWJsZSBvZiBrZXlzJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBnZW5lcmF0aW9uID0gdXBkYXRlQ291bnQ7XG4gICAgICBnZXRTb3J0ZWRLZXlzKCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFRTIGRvZXNuJ3QgdHJhY2sgdGhhdCBzb3J0ZWRLZXlzTWVtbyBpcyBkZWZpbmVkKi9cbiAgICAgIGNvbnN0IGxlbiA9IHNvcnRlZEtleXNNZW1vLmxlbmd0aDtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHJldHVybiBGYXIoJ0l0ZXJhdG9yIG9mIGtleXMnLCB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBnZW5lcmF0aW9uID09PSB1cGRhdGVDb3VudCB8fCBGYWlsYFN0b3JlICR7cShrZXlOYW1lKX0gY3Vyc29yIHN0YWxlYDtcbiAgICAgICAgICAvKiBJZiB0aGV5J3JlIGVxdWFsLCB0aGVuIHRoZSBzb3J0ZWRLZXlNZW1vIGlzIHRoZSBzYW1lIG9uZSovXG4gICAgICAgICAgLyogd2Ugc3RhcnRlZCB3aXRoLiovXG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUUyBkb2Vzbid0IHRyYWNrIHRoYXQgc29ydGVkS2V5c01lbW8gaXMgZGVmaW5lZCovXG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gc29ydGVkS2V5c01lbW9baV07XG4gICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgaWYgKGNoZWNrSGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oLyoqIEB0eXBlIHtjb25zdH0gKi8gKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge2NvbnN0fSAqLyAoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGFzc2VydFVwZGF0ZU9uQWRkLFxuICAgIGFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuICAgIGl0ZXJhYmxlS2V5cyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQ3VycmVudEtleXNLaXQobWFrZUN1cnJlbnRLZXlzS2l0KTtcbmhhcmRlbihtYWtlQ3VycmVudEtleXNLaXQpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVMYXp5YCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuIElmIHRoZXJlXG4gKiBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSwgY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhc1xuICogdGhlIHZhbHVlIGZvciB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SywgVj59IG1hcFN0b3JlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBWfSBtYWtlVmFsdWVcbiAqIEByZXR1cm5zIHtWfVxuICovXG4gICAgICAgY29uc3QgcHJvdmlkZUxhenkgPSAobWFwU3RvcmUsIGtleSwgbWFrZVZhbHVlKSA9PiB7XG4gIGlmICghbWFwU3RvcmUuaGFzKGtleSkpIHtcbiAgICBtYXBTdG9yZS5pbml0KGtleSwgbWFrZVZhbHVlKGtleSkpO1xuICB9XG4gIHJldHVybiBtYXBTdG9yZS5nZXQoa2V5KTtcbn07JGjNj19vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qKlxuICogSGVscGVyIGZvciB1c2UgY2FzZXMgaW4gd2hpY2ggdGhlIG1ha2VyIGZ1bmN0aW9uIGlzIGFzeW5jLiBGb3IgdHdvXG4gKiBwcm92aWRlTGF6eSBjYWxscyB3aXRoIHRoZSBzYW1lIGtleSwgb25lIG1heSBiZSBtYWtpbmcgd2hlbiB0aGUgb3RoZXIgY2FsbFxuICogc3RhcnRzIGFuZCBpdCB3b3VsZCBtYWtlIGFnYWluLiAoVGhlbiB0aGVyZSdkIGJlIGEgY29sbGlzaW9uIHdoZW4gdGhlIHNlY29uZFxuICogdHJpZXMgdG8gc3RvcmUgdGhlIGtleS4pIFRoaXMgcHJldmVudHMgdGhhdCByYWNlIGNvbmRpdGlvbiBieSBpbW1lZGlhdGVseVxuICogc3RvcmluZyBhIFByb21pc2UgZm9yIHRoZSBtYWtlciBpbiBhbiBlcGhlbWVyYWwgc3RvcmUuXG4gKlxuICogV2hlbiB0aGUgYHN0b3JlYCBhcmd1bWVudCBpcyBkdXJhYmxlIHN0b3JhZ2UsIG5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvclxuICogdGVybWluYXRpb24gdG8gaGFwcGVuIGFmdGVyIHRoZSBtYWtlIGNvbXBsZXRlcyBhbmQgYmVmb3JlIGl0IHJlYWNoZXMgZHVyYWJsZVxuICogc3RvcmFnZS5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SywgVj59IHN0b3JlXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQXRvbWljUHJvdmlkZXIgPSBzdG9yZSA9PiB7XG4gIC8qKiBAdHlwZSB7TWFwPEssIFByb21pc2U8Vj4+fSAqL1xuICBjb25zdCBwZW5kaW5nID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICogQ2FsbCBgcHJvdmlkZUFzeW5jYCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIHdoZW5cbiAqIHRoZSBtYWtlciBpcyBhc3luY2hyb25vdXMuIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yIHRoYXQga2V5LCBhbmQgcmV0dXJuXG4gKiBpdC5cbiAqXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBQcm9taXNlPFY+fSBtYWtlVmFsdWUgbWFrZSB0aGUgdmFsdWUgZm9yIHRoZSBzdG9yZSBpZlxuICogICBpdCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciB0aGUgbGFzdCBtYWtlIGZhaWxlZFxuICogQHBhcmFtIHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gUHJvbWlzZTx2b2lkPn0gW2ZpbmlzaFZhbHVlXSBydW5zIGV4YWN0bHlcbiAqICAgb25jZSBhZnRlciBhIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgc3RvcmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFY+fVxuICovXG4gIGNvbnN0IHByb3ZpZGVBc3luYyA9IChrZXksIG1ha2VWYWx1ZSwgZmluaXNoVmFsdWUpID0+IHtcbiAgICBpZiAoc3RvcmUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3RvcmUuZ2V0KGtleSkpO1xuICAgIH1cbiAgICBpZiAoIXBlbmRpbmcuaGFzKGtleSkpIHtcbiAgICAgIGNvbnN0IHZhbFAgPSBtYWtlVmFsdWUoa2V5KVxuICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICBzdG9yZS5pbml0KGtleSwgdik7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHYgPT4ge1xuICAgICAgICAgIGlmIChmaW5pc2hWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmlzaFZhbHVlKGtleSwgdikudGhlbigoKSA9PiB2KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICBwZW5kaW5nLmRlbGV0ZShrZXkpO1xuICAgICAgICB9KTtcbiAgICAgIHBlbmRpbmcuc2V0KGtleSwgdmFsUCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbFAgPSBwZW5kaW5nLmdldChrZXkpO1xuICAgIGFzc2VydCh2YWxQKTtcbiAgICByZXR1cm4gdmFsUDtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHJvdmlkZUFzeW5jIH0pO1xufTskaM2PX29uY2UubWFrZUF0b21pY1Byb3ZpZGVyKG1ha2VBdG9taWNQcm92aWRlcik7XG5oYXJkZW4obWFrZUF0b21pY1Byb3ZpZGVyKTtcbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXRvbWljUHJvdmlkZXI8SywgVj4+fSBBdG9taWNQcm92aWRlcjxLLCBWPlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7TWFwU3RvcmU8SywgVltdPn0gbWFwU3RvcmVcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0ge1Z9IGl0ZW1cbiAqL1xuICAgICAgIGNvbnN0IGFwcGVuZFRvU3RvcmVkQXJyYXkgPSAobWFwU3RvcmUsIGtleSwgaXRlbSkgPT4ge1xuICBpZiAobWFwU3RvcmUuaGFzKGtleSkpIHtcbiAgICBjb25zdCBleHRhbnQgPSBtYXBTdG9yZS5nZXQoa2V5KTtcbiAgICBtYXBTdG9yZS5zZXQoa2V5LCBoYXJkZW4oWy4uLmV4dGFudCwgaXRlbV0pKTtcbiAgfSBlbHNlIHtcbiAgICBtYXBTdG9yZS5pbml0KGtleSwgaGFyZGVuKFtpdGVtXSkpO1xuICB9XG59OyRozY9fb25jZS5hcHBlbmRUb1N0b3JlZEFycmF5KGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xuaGFyZGVuKGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiaXNDb3B5TWFwIjpbImlzQ29weU1hcCIsZmFsc2VdLCJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0IixmYWxzZV19LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUN1cnJlbnRLZXlzS2l0IjpbIm1ha2VDdXJyZW50S2V5c0tpdCJdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSJdLCJtYWtlQXRvbWljUHJvdmlkZXIiOlsibWFrZUF0b21pY1Byb3ZpZGVyIl0sImFwcGVuZFRvU3RvcmVkQXJyYXkiOlsiYXBwZW5kVG9TdG9yZWRBcnJheSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO31mJswAgAAMAIAABwAAABAYWdvcmljL3RpbWUtdjAuMy4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3RpbWVNYXRoLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvdGltZU1hdGguanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALQzbZQKJQAACiUAACMAAABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90aW1lTWF0aC5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiVGltZU1hdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsRmFpbCxxLG11c3RNYXRjaCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxUaW1lc3RhbXBSZWNvcmRTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSA9ICRozY9fYSldXSxbXCJUaW1lc3RhbXBSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFJlY29yZFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZWxhdGl2ZVRpbWUsIFJlbGF0aXZlVGltZVZhbHVlLCBUaW1lckJyYW5kLCBUaW1lTWF0aFR5cGUsIFRpbWVzdGFtcCwgVGltZXN0YW1wUmVjb3JkLCBUaW1lc3RhbXBWYWx1ZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtSYW5rQ29tcGFyaXNvbn0gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKi9cblxuLyoqXG4gKiBgYWdyZWVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUuXG4gKlxuICogQHBhcmFtIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfSBsZWZ0QnJhbmRcbiAqIEBwYXJhbSB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH0gcmlnaHRCcmFuZFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGFncmVlZFRpbWVyQnJhbmQgPSAobGVmdEJyYW5kLCByaWdodEJyYW5kKSA9PiB7XG4gIGlmIChsZWZ0QnJhbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChyaWdodEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByaWdodEJyYW5kO1xuICAgIH1cbiAgfSBlbHNlIGlmIChyaWdodEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbGVmdEJyYW5kO1xuICB9IGVsc2Uge1xuICAgIGxlZnRCcmFuZCA9PT0gcmlnaHRCcmFuZCB8fFxuICAgICAgRmFpbGBUaW1lckJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdEJyYW5kKX0gdnMgJHtxKHJpZ2h0QnJhbmQpfWA7XG4gICAgcmV0dXJuIGxlZnRCcmFuZDtcbiAgfVxufTtcblxuLyoqXG4gKiBgc2hhcmVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCBpbXBsZW1lbnRzIHRoZVxuICogdHJhbnNpdGlvbmFsIGJyYW5kIGNoZWNraW5nIGFuZCBjb250YWlnaW9uIGxvZ2ljIGV4cGxhaW5lZCBpbiB0aGUgYFRpbWVNYXRoYFxuICogY29tbWVudC4gSXQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGJpbmFyeSBvcGVyYXRvcnMgdGhhdCBzaG91bGQgZm9sbG93XG4gKiB0aGlzIGxvZ2ljLiBJdCBkb2VzIHRoZSBlcnJvciBjaGVja2luZyBiZXR3ZWVuIHRoZSBvcGVyYW5kcywgYW5kIHJldHVybnNcbiAqIHRoZSBicmFuZCwgaWYgYW55LCB0aGF0IHNob3VsZCBsYWJlbCB0aGUgcmVzdWx0aW5nIHRpbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IHNoYXJlZFRpbWVyQnJhbmQgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgY29uc3QgbGVmdEJyYW5kID0gdHlwZW9mIGxlZnQgPT09ICdiaWdpbnQnID8gdW5kZWZpbmVkIDogbGVmdC50aW1lckJyYW5kO1xuICBjb25zdCByaWdodEJyYW5kID0gdHlwZW9mIHJpZ2h0ID09PSAnYmlnaW50JyA/IHVuZGVmaW5lZCA6IHJpZ2h0LnRpbWVyQnJhbmQ7XG4gIHJldHVybiBhZ3JlZWRUaW1lckJyYW5kKGxlZnRCcmFuZCwgcmlnaHRCcmFuZCk7XG59O1xuXG4vKipcbiAqIGBhYnNMaWtlYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnlcbiAqIG9wZXJhdG9ycyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgYSBgVGltZXN0YW1wYFxuICogcmF0aGVyIHRoYW4gYSBgUmVsYXRpdmVUaW1lYC5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcFZhbHVlfSBhYnNWYWx1ZVxuICogQHJldHVybnMge1RpbWVzdGFtcH1cbiAqL1xuY29uc3QgYWJzTGlrZSA9IChsZWZ0LCByaWdodCwgYWJzVmFsdWUpID0+IHtcbiAgTmF0KGFic1ZhbHVlKTtcbiAgY29uc3QgdGltZXJCcmFuZCA9IHNoYXJlZFRpbWVyQnJhbmQobGVmdCwgcmlnaHQpO1xuICBpZiAodGltZXJCcmFuZCkge1xuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgdGltZXJCcmFuZCxcbiAgICAgIGFic1ZhbHVlLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhYnNWYWx1ZTtcbiAgfVxufTtcblxuLyoqXG4gKiBgcmVsTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFJlbGF0aXZlVGltZWBcbiAqIHJhdGhlciB0aGFuIGEgYFRpbWVzdGFtcGAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWVWYWx1ZX0gcmVsVmFsdWVcbiAqIEByZXR1cm5zIHtSZWxhdGl2ZVRpbWV9XG4gKi9cbmNvbnN0IHJlbExpa2UgPSAobGVmdCwgcmlnaHQsIHJlbFZhbHVlKSA9PiB7XG4gIE5hdChyZWxWYWx1ZSk7XG4gIGNvbnN0IHRpbWVyQnJhbmQgPSBzaGFyZWRUaW1lckJyYW5kKGxlZnQsIHJpZ2h0KTtcbiAgaWYgKHRpbWVyQnJhbmQpIHtcbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHRpbWVyQnJhbmQsXG4gICAgICByZWxWYWx1ZSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVsVmFsdWU7XG4gIH1cbn07XG5cbi8qIEZvciBhbGwgdGhlIGZvbGxvd2luZyB0aW1lIG9wZXJhdG9ycywgdGhlaXIgZG9jdW1lbnRhdGlvbiBpcyBpbiovXG4vKiB0aGUgYFRpbWVNYXRoVHlwZWAsIHNpbmNlIHRoYXQgaXMgdGhlIGRvY3VtZW50YXRpb24gdGhhdCBzaG93cyB1cCovXG4vKiBpbiB0aGUgSURFLiBXZWxsLCBhdCBsZWFzdCB0aGUgdnNjb2RlIElERS4qL1xuXG5jb25zdCBhYnNWYWx1ZSA9IGFicyA9PiB7XG4gIGlmICh0eXBlb2YgYWJzID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBOYXQoYWJzKTtcbiAgfVxuICBtdXN0TWF0Y2goYWJzLCBUaW1lc3RhbXBSZWNvcmRTaGFwZSwgJ3RpbWVzdGFtcCcpO1xuICByZXR1cm4gTmF0KGFicy5hYnNWYWx1ZSk7XG59O1xuXG5jb25zdCByZWxWYWx1ZSA9IHJlbCA9PiB7XG4gIGlmICh0eXBlb2YgcmVsID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBOYXQocmVsKTtcbiAgfVxuICBtdXN0TWF0Y2gocmVsLCBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSwgJ3JlbGF0aXZlJyk7XG4gIHJldHVybiBOYXQocmVsLnJlbFZhbHVlKTtcbn07XG5cbmNvbnN0IG1ha2VUaW1lc3RhbXBSZWNvcmQgPSAoYWJzLCB0aW1lckJyYW5kKSA9PlxuICBoYXJkZW4oeyBhYnNWYWx1ZTogYWJzLCB0aW1lckJyYW5kIH0pO1xuY29uc3QgbWFrZVJlbGF0aXZlVGltZVJlY29yZCA9IChyZWwsIHRpbWVyQnJhbmQpID0+XG4gIGhhcmRlbih7IHJlbFZhbHVlOiByZWwsIHRpbWVyQnJhbmQgfSk7XG5cbmNvbnN0IGNvZXJjZVRpbWVzdGFtcFJlY29yZCA9ICh0cywgYnJhbmQpID0+IHtcbiAgYnJhbmQgfHwgRmFpbGBtdXN0IGhhdmUgYSBicmFuZGA7XG4gIGlmICh0eXBlb2YgdHMgPT09ICdudW1iZXInKSB7XG4gICAgdHMgPSBOYXQodHMpO1xuICB9XG4gIGlmICh0eXBlb2YgdHMgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIG1ha2VUaW1lc3RhbXBSZWNvcmQodHMsIGJyYW5kKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHRpbWVyQnJhbmQgfSA9IHRzO1xuICAgIG11c3RNYXRjaCh0cywgVGltZXN0YW1wUmVjb3JkU2hhcGUsICd0aW1lc3RhbXAnKTtcbiAgICBhZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsIGJyYW5kKTtcbiAgICByZXR1cm4gdHM7XG4gIH1cbn07XG5cbmNvbnN0IGNvZXJjZVJlbGF0aXZlVGltZVJlY29yZCA9IChydCwgYnJhbmQpID0+IHtcbiAgYnJhbmQgfHwgRmFpbGBtdXN0IGhhdmUgYSBicmFuZGA7XG4gIGlmICh0eXBlb2YgcnQgPT09ICdudW1iZXInKSB7XG4gICAgcnQgPSBOYXQocnQpO1xuICB9XG4gIGlmICh0eXBlb2YgcnQgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIG1ha2VSZWxhdGl2ZVRpbWVSZWNvcmQocnQsIGJyYW5kKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHRpbWVyQnJhbmQgfSA9IHJ0O1xuICAgIG11c3RNYXRjaChydCwgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsICdyZWxhdGl2ZVRpbWUnKTtcbiAgICBhZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsIGJyYW5kKTtcbiAgICByZXR1cm4gcnQ7XG4gIH1cbn07XG5cbmNvbnN0IGFkZEFic1JlbCA9IChhYnMsIHJlbCkgPT5cbiAgYWJzTGlrZShhYnMsIHJlbCwgYWJzVmFsdWUoYWJzKSArIHJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBhZGRSZWxSZWwgPSAocmVsMSwgcmVsMikgPT5cbiAgcmVsTGlrZShyZWwxLCByZWwyLCByZWxWYWx1ZShyZWwxKSArIHJlbFZhbHVlKHJlbDIpKTtcblxuY29uc3Qgc3VidHJhY3RBYnNBYnMgPSAoYWJzMSwgYWJzMikgPT5cbiAgcmVsTGlrZShhYnMxLCBhYnMyLCBhYnNWYWx1ZShhYnMxKSAtIGFic1ZhbHVlKGFiczIpKTtcblxuY29uc3QgY2xhbXBlZFN1YnRyYWN0QWJzQWJzID0gKGFiczEsIGFiczIpID0+IHtcbiAgY29uc3QgdmFsMSA9IGFic1ZhbHVlKGFiczEpO1xuICBjb25zdCB2YWwyID0gYWJzVmFsdWUoYWJzMik7XG4gIHJldHVybiByZWxMaWtlKGFiczEsIGFiczIsIHZhbDEgPiB2YWwyID8gdmFsMSAtIHZhbDIgOiAwbik7XG59O1xuXG5jb25zdCBzdWJ0cmFjdEFic1JlbCA9IChhYnMsIHJlbCkgPT5cbiAgYWJzTGlrZShhYnMsIHJlbCwgYWJzVmFsdWUoYWJzKSAtIHJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBzdWJ0cmFjdFJlbFJlbCA9IChyZWwxLCByZWwyKSA9PlxuICByZWxMaWtlKHJlbDEsIHJlbDIsIHJlbFZhbHVlKHJlbDEpIC0gcmVsVmFsdWUocmVsMikpO1xuXG5jb25zdCBpc1JlbFplcm8gPSByZWwgPT4gcmVsVmFsdWUocmVsKSA9PT0gMG47XG5cbmNvbnN0IG11bHRpcGx5UmVsTmF0ID0gKHJlbCwgbmF0KSA9PiByZWxMaWtlKHJlbCwgbmF0LCByZWxWYWx1ZShyZWwpICogbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsTmF0ID0gKHJlbCwgbmF0KSA9PiByZWxMaWtlKHJlbCwgbmF0LCByZWxWYWx1ZShyZWwpIC8gbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsUmVsID0gKHJlbDEsIHJlbDIpID0+IHtcbiAgc2hhcmVkVGltZXJCcmFuZChyZWwxLCByZWwyKTsgLyoganVzdCBlcnJvciBjaGVjayovXG4gIHJldHVybiByZWxWYWx1ZShyZWwxKSAvIHJlbFZhbHVlKHJlbDIpO1xufTtcblxuY29uc3QgbW9kQWJzUmVsID0gKGFicywgc3RlcCkgPT5cbiAgcmVsTGlrZShhYnMsIHN0ZXAsIGFic1ZhbHVlKGFicykgJSByZWxWYWx1ZShzdGVwKSk7XG5cbmNvbnN0IG1vZFJlbFJlbCA9IChyZWwsIHN0ZXApID0+XG4gIHJlbExpa2UocmVsLCBzdGVwLCByZWxWYWx1ZShyZWwpICUgcmVsVmFsdWUoc3RlcCkpO1xuXG4vKipcbiAqIGBjb21wYXJlVmFsdWVzYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50XG4gKiB0aGUgdGltZSBjb21wYXJpc29uIG9wZXJhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge2JpZ2ludH0gdjFcbiAqIEBwYXJhbSB7YmlnaW50fSB2MlxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG5jb25zdCBjb21wYXJlVmFsdWVzID0gKGxlZnQsIHJpZ2h0LCB2MSwgdjIpID0+IHtcbiAgc2hhcmVkVGltZXJCcmFuZChsZWZ0LCByaWdodCk7XG4gIGlmICh2MSA8IHYyKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2UgaWYgKHYxID09PSB2Mikge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIGFzc2VydCh2MSA+IHYyKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTtcblxuLyoqXG4gKiBUaGUgYFRpbWVNYXRoYCBvYmplY3QgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdG8gZG8gYXJpdGhtZXRpYyBvbiBsYWJlbGVkXG4gKiB0aW1lIHZhbHVlcywgbXVjaCBsaWtlIGBBbW91bnRNYXRoYCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBkbyBhcml0aG1ldGljXG4gKiBvbiBsYWJlbGVkIGFzc2V0L21vbmV5IHZhbHVlcy4gQm90aCBjaGVjayBmb3IgY29uc2lzdGVuY3kgb2YgbGFiZWxzOiBhXG4gKiBiaW5hcnkgb3BlcmF0aW9uIG9uIHR3byBsYWJlbGVkIG9iamVjdHMgZW5zdXJlcyB0aGF0IHRoZSBib3RoIGNhcnJ5XG4gKiB0aGUgc2FtZSBsYWJlbC4gSWYgdGhleSBwcm9kdWNlIGFub3RoZXIgb2JqZWN0IGZyb20gdGhlIHNhbWUgZG9tYWluLCBpdFxuICogd2lsbCBjYXJyeSB0aGUgc2FtZSBsYWJlbC4gSWYgdGhlIG9wZXJhbmRzIGhhdmUgaW5jb21wYXRpYmxlIGxhYmVscyxcbiAqIGFuIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBVbmxpa2UgYW1vdW50IGFyaXRobWV0aWMsIHRpbWUgYXJpdGhtZXRpYyBkZWFscyBpbiB0d28ga2luZHMgb2YgdGltZSBvYmplY3RzOlxuICogVGltZXN0YW1wcywgd2hpY2ggcmVwcmVzZW50IGFic29sdXRlIHRpbWUsIGFuZCBSZWxhdGl2ZVRpbWUsIHdoaWNoIHJlcHJlc2VudHNcbiAqIHRoZSBkdXJhdGlvbiBiZXR3ZWVuIHR3byBhYnNvbHV0ZSB0aW1lcy4gQm90aCBraW5kcyBvZiB0aW1lIG9iamVjdFxuICogYXJlIGxhYmVsZWQgYnkgYSBgVGltZXJCcmFuZGAuIEZvciBhIFRpbWVzdGFtcCBvYmplY3QsIHRoZSB2YWx1ZSBpc1xuICogYSBiaWdpbnQgaW4gYW4gYGFic1ZhbHVlYCBwcm9wZXJ0eS4gRm9yIGEgUmVsYXRpdmVUaW1lIG9iamVjdCwgdGhlIHZhbHVlXG4gKiBpcyBhIGJpZ2ludCBpbiBhIGByZWxWYWx1ZWAgcHJvcGVydHkuIFRodXMgd2UgaGF2ZSBhIHJ1bnRpbWUgc2FmZXR5IGNoZWNrXG4gKiB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBjb25mdXNlZCB0aGUgdHdvLCBldmVuIGlmIHdlIGhhdmUgbWFuYWdlZCB0byBmb29sXG4gKiB0aGUgKHVuc291bmQpIHN0YXRpYyB0eXBlIHN5c3RlbS5cbiAqXG4gKiBBcyBhIHRyYW5zaXRpb25hbCBtZWFzdXJlLCBjdXJyZW50bHkgbWFueSBUaW1lc3RhbXBzIGFuZCBSZWxhdGl2ZVRpbWVzIGFyZVxuICogc3RpbGwgcmVwcmVzZW50ZWQgYnkgdW5sYWJlbGVkIGJpZ2ludHMuIER1cmluZyB0aGlzIHRyYW5zaXRpb25hbCBwZXJpb2QsXG4gKiB3ZSBhbGxvdyB0aGlzLCBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5LiBGb3IgYSBub3JtYWwgYmluYXJ5XG4gKiBvcGVyYXRpb24sIGlmIGJvdGggaW5wdXRzIGFyZSBsYWJlbGVkLCB0aGVuIHdlIGRvIHRoZSBmdWxsIGNoZWNraW5nIGFzXG4gKiBleHBsYWluZWQgYWJvdmUgYW5kIHJldHVybiBhIGxhYmVsZWQgcmVzdWx0LiBJZiBib3RoIGlucHV0cyBhcmUgdW5sYWJlbGVkXG4gKiBiaWdpbnRzLCB3ZSAqYXNzdW1lKiB0aGF0IHRoZXkgaW5kaWNhdGUgYSB0aW1lIG9mIHRoZSByaWdodCBraW5kXG4gKiAoVGltZXN0YW1wIHZzIFJlbGF0aXZlVGltZSkgYW5kIHRpbWVyIGJyYW5kLiBTaW5jZSB3ZSBkb24ndCBrbm93IHdoYXRcbiAqIGJyYW5kIHdhcyBpbnRlbmRlZCwgd2UgY2FuIG9ubHkgcmV0dXJuIHlldCBhbm90aGVyIHVubGFiZWxlZCBiaWdpbnQuXG4gKlxuICogSWYgb25lIG9wZXJhbmQgaXMgbGFiZWxlZCBhbmQgdGhlIG90aGVyIGlzIG5vdCwgd2UgY2hlY2sgdGhlIGxhYmVsZWQgb3BlcmFuZCxcbiAqICphc3N1bWUqIHRoZSB1bmxhYmVsZWQgYmlnaW50IHJlcHJlc2VudHMgdGhlIHZhbHVlIG5lZWRlZCBmb3IgdGhlIG90aGVyXG4gKiBvcGVyYW5kLCBhbmQgcmV0dXJuIGEgbGFiZWxlZCB0aW1lIG9iamVjdCB3aXRoIHRoZSBicmFuZCBvZiB0aGUgbGFiZWxlZFxuICogb3BlcmFuZC5cbiAqXG4gKiBAdHlwZSB7VGltZU1hdGhUeXBlfVxuICovXG4gICAgICAgY29uc3QgVGltZU1hdGggPSBoYXJkZW4oe1xuICBhYnNWYWx1ZSxcbiAgcmVsVmFsdWUsXG4gIGNvZXJjZVRpbWVzdGFtcFJlY29yZCxcbiAgY29lcmNlUmVsYXRpdmVUaW1lUmVjb3JkLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIHh4eCBkeW5hbWljIHR5cGluZyovXG4gIGFkZEFic1JlbCxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciB4eHggZHluYW1pYyB0eXBpbmcqL1xuICBhZGRSZWxSZWwsXG4gIHN1YnRyYWN0QWJzQWJzLFxuICBjbGFtcGVkU3VidHJhY3RBYnNBYnMsXG4gIHN1YnRyYWN0QWJzUmVsLFxuICBzdWJ0cmFjdFJlbFJlbCxcbiAgaXNSZWxaZXJvLFxuICBtdWx0aXBseVJlbE5hdCxcbiAgZGl2aWRlUmVsTmF0LFxuICBkaXZpZGVSZWxSZWwsXG4gIG1vZEFic1JlbCxcbiAgbW9kUmVsUmVsLFxuICBjb21wYXJlQWJzOiAoYWJzMSwgYWJzMikgPT5cbiAgICBjb21wYXJlVmFsdWVzKGFiczEsIGFiczIsIGFic1ZhbHVlKGFiczEpLCBhYnNWYWx1ZShhYnMyKSksXG4gIGNvbXBhcmVSZWw6IChyZWwxLCByZWwyKSA9PlxuICAgIGNvbXBhcmVWYWx1ZXMocmVsMSwgcmVsMiwgcmVsVmFsdWUocmVsMSksIHJlbFZhbHVlKHJlbDIpKSxcbn0pOyRozY9fb25jZS5UaW1lTWF0aChUaW1lTWF0aCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUaW1lTWF0aCI6WyJUaW1lTWF0aCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA09hXE8wkAAPMJAAAlAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIiwiUmVsYXRpdmVUaW1lU2hhcGUiLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIiwiVGltZXJCcmFuZFNoYXBlIiwiVGltZXJTZXJ2aWNlU2hhcGUiLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSIsIlRpbWVzdGFtcFNoYXBlIiwiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE07JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtUaW1lc3RhbXBSZWNvcmQsIFRpbWVzdGFtcFZhbHVlLCBSZWxhdGl2ZVRpbWVWYWx1ZSwgUmVsYXRpdmVUaW1lUmVjb3JkfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4gICAgICAgY29uc3QgVGltZXJCcmFuZFNoYXBlID0gTS5yZW1vdGFibGUoJ1RpbWVyQnJhbmQnKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48YmlnaW50Pn0gKi8kaM2PX29uY2UuVGltZXJCcmFuZFNoYXBlKFRpbWVyQnJhbmRTaGFwZSk7XG4gICAgICAgY29uc3QgVGltZXN0YW1wVmFsdWVTaGFwZSA9IE0ubmF0KCk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPGJpZ2ludD59ICovJGjNj19vbmNlLlRpbWVzdGFtcFZhbHVlU2hhcGUoVGltZXN0YW1wVmFsdWVTaGFwZSk7XG4gICAgICAgY29uc3QgUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSA9IE0ubmF0KCk7IC8qIFNob3VsZCB3ZSBhbGxvdyBuZWdhdGl2ZXM/Ki9cblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48VGltZXN0YW1wUmVjb3JkPn0gKi8kaM2PX29uY2UuUmVsYXRpdmVUaW1lVmFsdWVTaGFwZShSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTtcbiAgICAgICBjb25zdCBUaW1lc3RhbXBSZWNvcmRTaGFwZSA9IHtcbiAgdGltZXJCcmFuZDogVGltZXJCcmFuZFNoYXBlLFxuICBhYnNWYWx1ZTogVGltZXN0YW1wVmFsdWVTaGFwZSxcbn07JGjNj19vbmNlLlRpbWVzdGFtcFJlY29yZFNoYXBlKFRpbWVzdGFtcFJlY29yZFNoYXBlKTtcbmhhcmRlbihUaW1lc3RhbXBSZWNvcmRTaGFwZSk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFJlbGF0aXZlVGltZVJlY29yZD59ICovXG4gICAgICAgY29uc3QgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUgPSB7XG4gIHRpbWVyQnJhbmQ6IFRpbWVyQnJhbmRTaGFwZSxcbiAgcmVsVmFsdWU6IFJlbGF0aXZlVGltZVZhbHVlU2hhcGUsXG59OyRozY9fb25jZS5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZShSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSk7XG5oYXJkZW4oUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxUaW1lc3RhbXBSZWNvcmQgfCBUaW1lc3RhbXBWYWx1ZT59ICovXG4gICAgICAgY29uc3QgVGltZXN0YW1wU2hhcGUgPSBNLm9yKFRpbWVzdGFtcFJlY29yZFNoYXBlLCBUaW1lc3RhbXBWYWx1ZVNoYXBlKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48UmVsYXRpdmVUaW1lUmVjb3JkIHwgUmVsYXRpdmVUaW1lVmFsdWU+fSAqLyRozY9fb25jZS5UaW1lc3RhbXBTaGFwZShUaW1lc3RhbXBTaGFwZSk7XG4gICAgICAgY29uc3QgUmVsYXRpdmVUaW1lU2hhcGUgPSBNLm9yKFxuICBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxcbiAgUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSxcbik7JGjNj19vbmNlLlJlbGF0aXZlVGltZVNoYXBlKFJlbGF0aXZlVGltZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IFRpbWVyU2VydmljZVNoYXBlID0gTS5yZW1vdGFibGUoJ1RpbWVyU2VydmljZScpOyRozY9fb25jZS5UaW1lclNlcnZpY2VTaGFwZShUaW1lclNlcnZpY2VTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUaW1lckJyYW5kU2hhcGUiOlsiVGltZXJCcmFuZFNoYXBlIl0sIlRpbWVzdGFtcFZhbHVlU2hhcGUiOlsiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIjpbIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiXSwiVGltZXN0YW1wUmVjb3JkU2hhcGUiOlsiVGltZXN0YW1wUmVjb3JkU2hhcGUiXSwiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiOlsiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiXSwiVGltZXN0YW1wU2hhcGUiOlsiVGltZXN0YW1wU2hhcGUiXSwiUmVsYXRpdmVUaW1lU2hhcGUiOlsiUmVsYXRpdmVUaW1lU2hhcGUiXSwiVGltZXJTZXJ2aWNlU2hhcGUiOlsiVGltZXJTZXJ2aWNlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADYPWJQtLAAALSwAACgAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzIiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiaWdub3JlQ29udGV4dCIsIm1ha2VFeG9VdGlscyIsInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvQ2xhc3MiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlU2luZ2xldG9uIiwicHJvdmlkZUtpbmRIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpbml0RW1wdHkscHJvdmlkZSxnbG9iYWxWYXREYXRhOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsWyRozY9fYSA9PiAoaW5pdEVtcHR5ID0gJGjNj19hKV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wicHJvdmlkZVwiLFskaM2PX2EgPT4gKHByb3ZpZGUgPSAkaM2PX2EpXV0sW1wiVmF0RGF0YVwiLFskaM2PX2EgPT4gKGdsb2JhbFZhdERhdGEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1JlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlLCBEZWZpbmVLaW5kT3B0aW9ucywgRHVyYWJsZUtpbmRIYW5kbGUsIEludGVyZmFjZUd1YXJkS2l0fSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtQbHVzQ29udGV4dH0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7VmF0RGF0YX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7UHJlcGFyZUtpbmR9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge1ByZXBhcmVLaW5kTXVsdGl9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge0d1YXJkZWR9IGZyb20gJ0BlbmRvL2V4byc7XG4gKiBAaW1wb3J0IHtHdWFyZGVkS2l0fSBmcm9tICdAZW5kby9leG8nO1xuICovXG5cbi8qIFNvbWUgZmVlZGJhY2sgaWYgdGhlIGluaXQgZnVuY3Rpb24gaXMgYXN5bmMqL1xuLyoqXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEluaXRTdGF0ZVxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxJPiBleHRlbmRzIFByb21pc2U8YW55PiA/IG5ldmVyIDogUmV0dXJuVHlwZTxJPn0gU3RhdGVSZXN1bHRcbiAqL1xuXG4vKipcbiAqIE1ha2UgYSB2ZXJzaW9uIG9mIHRoZSBhcmd1bWVudCBmdW5jdGlvbiB0aGF0IHRha2VzIGEga2luZCBjb250ZXh0IGJ1dCBpZ25vcmVzXG4gKiBpdC5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyAoLi4uYXJnczogYW55KSA9PiBhbnk+KFxuICogICBmbjogVCxcbiAqICkgPT4gUGx1c0NvbnRleHQ8bmV2ZXIsIFQ+fVxuICovXG4gICAgICAgY29uc3QgaWdub3JlQ29udGV4dCA9XG4gIGZuID0+XG4gIChfY29udGV4dCwgLi4uYXJncykgPT5cbiAgICBmbiguLi5hcmdzKTskaM2PX29uY2UuaWdub3JlQ29udGV4dChpZ25vcmVDb250ZXh0KTtcbmhhcmRlbihpZ25vcmVDb250ZXh0KTtcblxuLyogVE9ETzogRmluZCBhIGdvb2QgaG9tZSBmb3IgdGhpcyBmdW5jdGlvbiB1c2VkIGJ5IEBhZ29yaWMvdmF0LWRhdGEgYW5kIHRlc3RpbmcgY29kZSovXG4vKiogQHBhcmFtIHtWYXREYXRhfSBWYXREYXRhICovXG4gICAgICAgY29uc3QgbWFrZUV4b1V0aWxzID0gVmF0RGF0YSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWZpbmVLaW5kLFxuICAgIGRlZmluZUtpbmRNdWx0aSxcbiAgICBkZWZpbmVEdXJhYmxlS2luZCxcbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpLFxuICAgIG1ha2VLaW5kSGFuZGxlLFxuICB9ID0gVmF0RGF0YTtcblxuICAvKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEByZXR1cm5zIHtEdXJhYmxlS2luZEhhbmRsZX1cbiAqL1xuICBjb25zdCBwcm92aWRlS2luZEhhbmRsZSA9IChiYWdnYWdlLCBraW5kTmFtZSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwgKCkgPT4gbWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTtcbiAgaGFyZGVuKHByb3ZpZGVLaW5kSGFuZGxlKTtcblxuICAvKipcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvQ2xhc3MgaW5zdGVhZFxuICogQHR5cGUge1ByZXBhcmVLaW5kfVxuICovXG4gIGNvbnN0IHByZXBhcmVLaW5kID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW5pdCxcbiAgICBiZWhhdmlvcixcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUtpbmQoXG4gICAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgICBpbml0LFxuICAgICAgYmVoYXZpb3IsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIGhhcmRlbihwcmVwYXJlS2luZCk7XG5cbiAgLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4b0NsYXNzS2l0IGluc3RlYWRcbiAqIEB0eXBlIHtQcmVwYXJlS2luZE11bHRpfVxuICovXG4gIGNvbnN0IHByZXBhcmVLaW5kTXVsdGkgPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBpbml0LFxuICAgIGJlaGF2aW9yLFxuICAgIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4gICkgPT5cbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpKFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW5pdCxcbiAgICAgIGJlaGF2aW9yLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUtpbmRNdWx0aSk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgVCBiZWhhdmlvclxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIHNlbGY6IFQ7XG4gKiAgICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogICB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIHNlbGY6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZDxUPn1cbiAqL1xuICBjb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MgPSAodGFnLCBpbnRlcmZhY2VHdWFyZCwgaW5pdCwgbWV0aG9kcywgb3B0aW9ucykgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUtpbmQodGFnLCBpbml0LCBtZXRob2RzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZEtpdCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIGZhY2V0czogR3VhcmRlZEtpdDxUPjtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZEtpdDxUPn1cbiAqL1xuICBjb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQgPSAoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIGluaXQsXG4gICAgZmFjZXRzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUtpbmRNdWx0aSh0YWcsIGluaXQsIGZhY2V0cywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRoaXNmdWxNZXRob2RzOiB0cnVlLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgfSk7XG4gIGhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtJbml0U3RhdGV9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBUO1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWQ8VD59XG4gKi9cbiAgY29uc3QgZGVmaW5lRHVyYWJsZUV4b0NsYXNzID0gKFxuICAgIGtpbmRIYW5kbGUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdCxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUR1cmFibGVLaW5kKGtpbmRIYW5kbGUsIGluaXQsIG1ldGhvZHMsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB0aGlzZnVsTWV0aG9kczogdHJ1ZSxcbiAgICAgIGludGVyZmFjZUd1YXJkLFxuICAgIH0pO1xuICBoYXJkZW4oZGVmaW5lRHVyYWJsZUV4b0NsYXNzKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkS2l0IHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJlxuICogICBUaGlzVHlwZTx7XG4gKiAgICAgZmFjZXRzOiBHdWFyZGVkS2l0PFQ+O1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIGZhY2V0czogVDtcbiAqICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiBHdWFyZGVkS2l0PFQ+fVxuICovXG4gIGNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCA9IChcbiAgICBraW5kSGFuZGxlLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIGluaXQsXG4gICAgZmFjZXRzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSwgaW5pdCwgZmFjZXRzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj59IFQgbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBSZW1vdGFibGVPYmplY3QgJiBUO1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWQ8VD59XG4gKi9cbiAgY29uc3QgcHJlcGFyZUV4b0NsYXNzID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdCxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4gICkgPT5cbiAgICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3MoXG4gICAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICAgIGluaXQsXG4gICAgICBtZXRob2RzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUV4b0NsYXNzKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZEtpdCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIGZhY2V0czogR3VhcmRlZEtpdDxUPjtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZEtpdDxUPn1cbiAqL1xuICBjb25zdCBwcmVwYXJlRXhvQ2xhc3NLaXQgPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICBpbml0LFxuICAgIGZhY2V0cyxcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgICBpbml0LFxuICAgICAgZmFjZXRzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUV4b0NsYXNzS2l0KTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7TSAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBSZW1vdGFibGVPYmplY3QgJiBNO1xuICogICB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IE0gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMge0d1YXJkZWQ8TT59XG4gKi9cbiAgY29uc3QgcHJlcGFyZUV4byA9IChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIG1ldGhvZHMsXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgY29uc3QgbWFrZVNpbmdsZXRvbiA9IHByZXBhcmVFeG9DbGFzcyhcbiAgICAgIGJhZ2dhZ2UsXG4gICAgICBraW5kTmFtZSxcbiAgICAgIGludGVyZmFjZUd1YXJkLFxuICAgICAgaW5pdEVtcHR5LFxuICAgICAgbWV0aG9kcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcblxuICAgIHJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9zaW5nbGV0b25gLCAoKSA9PiBtYWtlU2luZ2xldG9uKCkpO1xuICB9O1xuICBoYXJkZW4ocHJlcGFyZUV4byk7XG5cbiAgLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4byBpbnN0ZWFkLlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+fSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge019IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtHdWFyZGVkPE0+fVxuICovXG4gIGNvbnN0IHByZXBhcmVTaW5nbGV0b24gPSAoYmFnZ2FnZSwga2luZE5hbWUsIG1ldGhvZHMsIG9wdGlvbnMgPSB1bmRlZmluZWQpID0+XG4gICAgcHJlcGFyZUV4byhiYWdnYWdlLCBraW5kTmFtZSwgdW5kZWZpbmVkLCBtZXRob2RzLCBvcHRpb25zKTtcbiAgaGFyZGVuKHByZXBhcmVTaW5nbGV0b24pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGRlZmluZVZpcnR1YWxFeG9DbGFzcyxcbiAgICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuICAgIGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCxcbiAgICBwcmVwYXJlRXhvQ2xhc3MsXG4gICAgcHJlcGFyZUV4b0NsYXNzS2l0LFxuICAgIHByZXBhcmVFeG8sXG5cbiAgICBwcmVwYXJlU2luZ2xldG9uLFxuICAgIHByb3ZpZGVLaW5kSGFuZGxlLFxuICAgIHByZXBhcmVLaW5kLFxuICAgIHByZXBhcmVLaW5kTXVsdGksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUV4b1V0aWxzKG1ha2VFeG9VdGlscyk7XG5cbmNvbnN0IGdsb2JhbEV4b1V0aWxzID0gbWFrZUV4b1V0aWxzKGdsb2JhbFZhdERhdGEpO1xuXG4gICAgICAgY29uc3Qge1xuICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG4gIGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbiAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG4gIHByZXBhcmVFeG9DbGFzcyxcbiAgcHJlcGFyZUV4b0NsYXNzS2l0LFxuICBwcmVwYXJlRXhvLFxuICBwcmVwYXJlU2luZ2xldG9uLFxufSA9IGdsb2JhbEV4b1V0aWxzO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovJGjNj19vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzcyhkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpOyRozY9fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQoZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpOyRozY9fb25jZS5wcmVwYXJlRXhvQ2xhc3MocHJlcGFyZUV4b0NsYXNzKTskaM2PX29uY2UucHJlcGFyZUV4b0NsYXNzS2l0KHByZXBhcmVFeG9DbGFzc0tpdCk7JGjNj19vbmNlLnByZXBhcmVFeG8ocHJlcGFyZUV4byk7JGjNj19vbmNlLnByZXBhcmVTaW5nbGV0b24ocHJlcGFyZVNpbmdsZXRvbik7XG4gICAgICAgY29uc3QgeyBwcm92aWRlS2luZEhhbmRsZSwgcHJlcGFyZUtpbmQsIHByZXBhcmVLaW5kTXVsdGkgfSA9XG4gIGdsb2JhbEV4b1V0aWxzOyRozY9fb25jZS5wcm92aWRlS2luZEhhbmRsZShwcm92aWRlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByZXBhcmVLaW5kKHByZXBhcmVLaW5kKTskaM2PX29uY2UucHJlcGFyZUtpbmRNdWx0aShwcmVwYXJlS2luZE11bHRpKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCJdLCJtYWtlRXhvVXRpbHMiOlsibWFrZUV4b1V0aWxzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4b0NsYXNzIjpbInByZXBhcmVFeG9DbGFzcyJdLCJwcmVwYXJlRXhvQ2xhc3NLaXQiOlsicHJlcGFyZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG8iOlsicHJlcGFyZUV4byJdLCJwcmVwYXJlU2luZ2xldG9uIjpbInByZXBhcmVTaW5nbGV0b24iXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwicHJlcGFyZUtpbmQiOlsicHJlcGFyZUtpbmQiXSwicHJlcGFyZUtpbmRNdWx0aSI6WyJwcmVwYXJlS2luZE11bHRpIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM+c6+m2CAAAtggAACQAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCIuL2V4by11dGlscy5qcyJdLCJleHBvcnRzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtdXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtdXSxbXCIuL2V4by11dGlscy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvc3RvcmUiOltbIk0iLCJNIl0sWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjpbWyJtYWtlS2luZEhhbmRsZSIsIm1ha2VLaW5kSGFuZGxlIl0sWyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSxbIndhdGNoUHJvbWlzZSIsIndhdGNoUHJvbWlzZSJdLFsibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLFsiY2FuQmVEdXJhYmxlIiwiY2FuQmVEdXJhYmxlIl0sWyJwaWNrRmFjZXQiLCJwaWNrRmFjZXQiXSxbInBhcnRpYWxBc3NpZ24iLCJwYXJ0aWFsQXNzaWduIl0sWyJwcm92aWRlIiwicHJvdmlkZSJdLFsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl0sWyJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZCJdLFsiZGVmaW5lS2luZE11bHRpIiwiZGVmaW5lS2luZE11bHRpIl0sWyJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kIl0sWyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdXSwiLi9leG8tdXRpbHMuanMiOltbImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLFsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSxbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLFsicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzIl0sWyJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvIl0sWyJwcmVwYXJlU2luZ2xldG9uIiwicHJlcGFyZVNpbmdsZXRvbiJdLFsiaWdub3JlQ29udGV4dCIsImlnbm9yZUNvbnRleHQiXSxbInByb3ZpZGVLaW5kSGFuZGxlIiwicHJvdmlkZUtpbmRIYW5kbGUiXSxbInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmQiXSxbInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlS2luZE11bHRpIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADvd74wOSMAADkjAAAwAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJWYXREYXRhIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmVVdGlscyIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxwcm92aWRlTGF6eTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLFskaM2PX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqIEBpbXBvcnQge0JhZ2dhZ2UsIFBpY2tGYWNldCwgVmF0RGF0YX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnICovXG5cbi8qKiBAdHlwZSB7VmF0RGF0YX0gKi9cbmxldCBWYXREYXRhR2xvYmFsO1xuaWYgKCdWYXREYXRhJyBpbiBnbG9iYWxUaGlzKSB7XG4gIGdsb2JhbFRoaXMuVmF0RGF0YSB8fCBGYWlsYFZhdERhdGEgZGVmaW5lZCBpbiBnbG9iYWwgYXMgbnVsbCBvciB1bmRlZmluZWRgO1xuICAvKiBYWFggdHlwZXMgaW5jb21wYXRpYmlsaXR5Ki9cbiAgVmF0RGF0YUdsb2JhbCA9IC8qKiBAdHlwZSB7YW55fSAqLyAoZ2xvYmFsVGhpcy5WYXREYXRhKTtcbn0gZWxzZSB7XG4gIC8qIFhYWCB0aGlzIG1vZHVsZSBoYXMgYmVlbiBrbm93biB0byBnZXQgaW1wb3J0ZWQgKHRyYW5zaXRpdmVseSkgaW4gY2FzZXMgdGhhdCovXG4gIC8qIG5ldmVyIHVzZSBpdCBzbyB3ZSBtYWtlIGEgdmVyc2lvbiB0aGF0IHdpbGwgc2F0aXNmeSBtb2R1bGUgcmVzb2x1dGlvbiBidXQqL1xuICAvKiBmYWlsIGF0IHJ1bnRpbWUuKi9cbiAgY29uc3QgdW5hdmFpbGFibGUgPSAoKSA9PiBGYWlsYFZhdERhdGEgdW5hdmFpbGFibGVgO1xuICBWYXREYXRhR2xvYmFsID0ge1xuICAgIGRlZmluZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUtpbmRNdWx0aTogdW5hdmFpbGFibGUsXG4gICAgZGVmaW5lRHVyYWJsZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGk6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VLaW5kSGFuZGxlOiB1bmF2YWlsYWJsZSxcbiAgICBwcm92aWRlUHJvbWlzZVdhdGNoZXI6IHVuYXZhaWxhYmxlLFxuICAgIHdhdGNoUHJvbWlzZTogdW5hdmFpbGFibGUsXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIGNhbkJlRHVyYWJsZTogdW5hdmFpbGFibGUsXG4gIH07XG59XG5cbmNvbnN0IFZhdERhdGFFeHBvcnQgPSBWYXREYXRhR2xvYmFsOyRozY9fb25jZS5WYXREYXRhRXhwb3J0KFZhdERhdGFFeHBvcnQpO1xuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIEV4b3MvRXhvQ2xhc3NlcyBpbnN0ZWFkIG9mIEtpbmRzXG4gKi9cbiAgICAgICBjb25zdCB7XG4gIGRlZmluZUtpbmQsXG4gIGRlZmluZUtpbmRNdWx0aSxcbiAgZGVmaW5lRHVyYWJsZUtpbmQsXG4gIGRlZmluZUR1cmFibGVLaW5kTXVsdGksXG59ID0gVmF0RGF0YUdsb2JhbDskaM2PX29uY2UuZGVmaW5lS2luZChkZWZpbmVLaW5kKTskaM2PX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVLaW5kKGRlZmluZUR1cmFibGVLaW5kKTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShkZWZpbmVEdXJhYmxlS2luZE11bHRpKTtcblxuICAgICAgIGNvbnN0IHtcbiAgbWFrZUtpbmRIYW5kbGUsXG4gIHByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbiAgd2F0Y2hQcm9taXNlLFxuICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4gIG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG4gIG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbiAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSxcbiAgY2FuQmVEdXJhYmxlLFxufSA9IFZhdERhdGFHbG9iYWw7XG5cbi8qKlxuICogV2hlbiBtYWtpbmcgYSBtdWx0aS1mYWNldCBraW5kLCBpdCdzIGNvbW1vbiB0byBwaWNrIG9uZSBmYWNldCB0byBleHBvc2UuXG4gKiBFLmcuLFxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gKGEsIGIsIGMsIGQpID0+IG1ha2VGb29CYXNlKGEsIGIsIGMsIGQpLnNlbGY7XG4gKlxuICogVGhpcyBoZWxwZXIgcmVkdWNlcyB0aGUgZHVwbGljYXRpb246XG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSBwaWNrRmFjZXQobWFrZUZvb0Jhc2UsICdzZWxmJyk7XG4gKlxuICogQHR5cGUge1BpY2tGYWNldH1cbiAqLyRozY9fb25jZS5tYWtlS2luZEhhbmRsZShtYWtlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ01hcFN0b3JlKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUpOyRozY9fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbiAgICAgICBjb25zdCBwaWNrRmFjZXQgPVxuICAobWFrZXIsIGZhY2V0TmFtZSkgPT5cbiAgKC4uLmFyZ3MpID0+XG4gICAgbWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaM2PX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLyoqXG4gKiBBc3NpZ24gdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlXG4gKiBvYmplY3QgdG8gdGhlaXIga2V5cyBpbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQYXJ0aWFsPFQ+fSBzb3VyY2VcbiAqL1xuICAgICAgIGNvbnN0IHBhcnRpYWxBc3NpZ24gPSAodGFyZ2V0LCBzb3VyY2UpID0+IHtcbiAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSk7XG59OyRozY9fb25jZS5wYXJ0aWFsQXNzaWduKHBhcnRpYWxBc3NpZ24pO1xuaGFyZGVuKHBhcnRpYWxBc3NpZ24pO1xuXG4vKiogQGltcG9ydCB7U3RvcmVPcHRpb25zfSBmcm9tICdAYWdvcmljL3N0b3JlJyAqL1xuXG4vKipcbiAqIFVubGlrZSBgcHJvdmlkZUxhenlgLCBgcHJvdmlkZWAgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2Ugd2l0aGluIGFueSB2YXRcbiAqIGluY2FybmF0aW9uIHdpdGggYSBnaXZlbiBgYmFnZ2FnZWAsYGtleWAgcGFpci5cbiAqXG4gKiBgcHJvdmlkZWAgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBwb3B1bGF0ZSBiYWdnYWdlLCB3aGVyZSB0aGUgdG90YWwgbnVtYmVyIG9mXG4gKiBjYWxscyB0byBgcHJvdmlkZWAgbXVzdCBiZSBsb3cgY2FyZGluYWxpdHksIHNpbmNlIHdlIGtlZXAgdGhlIGJvb2trZWVwaW5nIHRvXG4gKiBkZXRlY3QgY29sbGlzaW9ucyBpbiBub3JtYWwgbGFuZ3VhZ2UtaGVhcCBtZW1vcnkuIEFsbCB0aGUgb3RoZXJcbiAqIGJhZ2dhZ2Utb3JpZW50ZWQgYHByb3ZpZGUqYCBhbmQgYHByZXBhcmUqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsIGFuZCBzb1xuICogaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBvdXIgZXhwZWN0ZWQgZHVyYWJpbGl0eVxuICogcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqXG4gKiAtIGtpbmRIYW5kbGVzLCB3aGljaCBhcmUgcGVyIGtpbmQsIHdoaWNoIG11c3QgYmUgbG93IGNhcmRpbmFsaXR5XG4gKiAtIGRhdGEgXCJ2YXJpYWJsZXNcIiBmb3IgcmVlc3RhYmxpc2hpbmcgdGhlIGxleGljYWwgc2NvcGUsIGVzcGVjaWFsbHkgb2ZcbiAqICAgc2luZ2xldG9uc1xuICogLSBuYW1lZCBub24tYmFnZ2FnZSBjb2xsZWN0aW9ucyBhdCB0aGUgbGVhdmVzIG9mIHRoZSBiYWdnYWdlIHRyZWUuXG4gKlxuICogV2hhdCBpcyBleHBlY3RlZCB0byBiZSBoaWdoIGNhcmRpbmFsaXR5IGFyZSB0aGUgaW5zdGFuY2VzIG9mIHRoZSBraW5kcywgYW5kXG4gKiB0aGUgbWVtYmVycyBvZiB0aGUgbm9uLWJhZ2dnYWdlIGNvbGxlY3Rpb25zLlxuICpcbiAqIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTg3NSA6IEltcGxlbWVudFxuICogZGV2ZWxvcG1lbnQtdGltZSBpbnN0cnVtZW50YXRpb24gdG8gZGV0ZWN0IHdoZW4gYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZVxuICogcHJlc2NyaXB0aW9uLCBhbmQgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBzYW1lIHZhdCBpbmNhcm5hdGlvbiB3aXRoXG4gKiB0aGUgc2FtZSBiYWdnYWdlLGtleSBwYWlyLlxuICovXG5cbiAgICAgICBjb25zdCBwcm92aWRlID1cbiAgLyogWFhYIGNhc3QgYmVjYXVzZSBwcm92aWRlTGF6eSBpcyBgYW55YCBkdWUgdG8gYnJva2VuIHR5cGUgaW1wb3J0Ki9cbiAgLyoqXG4gKiBAdHlwZSB7PEssIFY+KFxuICogICBiYWdnYWdlOiBCYWdnYWdlLFxuICogICBrZXk6IEssXG4gKiAgIG1ha2VWYWx1ZTogKGtleTogSykgPT4gVixcbiAqICkgPT4gVn1cbiAqLyAgIChwcm92aWRlTGF6eSk7XG5cbi8qIFRPRE86IEZpbmQgYSBnb29kIGhvbWUgZm9yIHRoaXMgZnVuY3Rpb24gdXNlZCBieSBAYWdvcmljL3ZhdC1kYXRhIGFuZCB0ZXN0aW5nIGNvZGUqL1xuLyoqIEBwYXJhbSB7VmF0RGF0YX0gVmF0RGF0YSAqLyRozY9fb25jZS5wcm92aWRlKHByb3ZpZGUpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZVV0aWxzID0gVmF0RGF0YSA9PiB7XG4gIGNvbnN0IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xuICAgIG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xuICAgIG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbiAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbiAgICBtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuICB9ID0gVmF0RGF0YTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gKGJhZ2dhZ2UsIG5hbWUsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+XG4gICAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVNldFN0b3JlID0gKGJhZ2dhZ2UsIG5hbWUsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+XG4gICAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZVNldFN0b3JlKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG4gICAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVN0b3JlVXRpbHMobWFrZVN0b3JlVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxTdG9yZVV0aWxzID0gbWFrZVN0b3JlVXRpbHMoVmF0RGF0YUdsb2JhbCk7XG4gICAgICAgY29uc3Qge1xuICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxuICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVTZXRTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsXG59ID0gZ2xvYmFsU3RvcmVVdGlsczskaM2PX29uY2UucHJvdmlkZUR1cmFibGVNYXBTdG9yZShwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTskaM2PX29uY2UucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJWYXREYXRhIjpbIlZhdERhdGFFeHBvcnQiXSwiZGVmaW5lS2luZCI6WyJkZWZpbmVLaW5kIl0sImRlZmluZUtpbmRNdWx0aSI6WyJkZWZpbmVLaW5kTXVsdGkiXSwiZGVmaW5lRHVyYWJsZUtpbmQiOlsiZGVmaW5lRHVyYWJsZUtpbmQiXSwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSI6WyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIl0sIm1ha2VLaW5kSGFuZGxlIjpbIm1ha2VLaW5kSGFuZGxlIl0sInByb3ZpZGVQcm9taXNlV2F0Y2hlciI6WyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLCJjYW5CZUR1cmFibGUiOlsiY2FuQmVEdXJhYmxlIl0sInBpY2tGYWNldCI6WyJwaWNrRmFjZXQiXSwicGFydGlhbEFzc2lnbiI6WyJwYXJ0aWFsQXNzaWduIl0sInByb3ZpZGUiOlsicHJvdmlkZSJdLCJtYWtlU3RvcmVVdGlscyI6WyJtYWtlU3RvcmVVdGlscyJdLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAHT9EtISwAASEsAACUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIl0sImV4cG9ydHMiOlsiQWRtaW5GYWNldEkiLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIiwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiLCJCdW5kbGVDYXBTaGFwZSIsIkJ1bmRsZVNoYXBlIiwiRW1wdHlQcm9wb3NhbFNoYXBlIiwiRXhpdE9iamVjdEkiLCJFeGl0T2JqZWN0U2hhcGUiLCJGZWVNaW50QWNjZXNzU2hhcGUiLCJGdWxsUHJvcG9zYWxTaGFwZSIsIkhhbmRsZUkiLCJIYW5kbGVPZmZlckkiLCJJbnN0YWxsYXRpb25TaGFwZSIsIkluc3RhbmNlQWRtaW5JIiwiSW5zdGFuY2VBZG1pblNoYXBlIiwiSW5zdGFuY2VIYW5kbGVTaGFwZSIsIkluc3RhbmNlUmVjb3JkU2hhcGUiLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCIsIkludml0YXRpb25FbGVtZW50U2hhcGUiLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUmVjb3JkU2hhcGUiLCJLZXl3b3JkU2hhcGUiLCJPZmZlckhhbmRsZXJJIiwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiLCJQcmljZVF1b3RlU2hhcGUiLCJQcm9wb3NhbFNoYXBlIiwiU2VhdERhdGFTaGFwZSIsIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIiwiU2VhdFNoYXBlIiwiVGVybXNTaGFwZSIsIlRpbWVyU2hhcGUiLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSIsIlpvZU1pbnRJIiwiWm9lTWludFNoYXBlIiwiWm9lU2VydmljZUkiLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSIsImlzT25EZW1hbmRFeGl0UnVsZSIsImlzV2FpdmVkRXhpdFJ1bGUiLCJtYWtlSGFuZGxlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRTaGFwZSxBc3NldEtpbmRTaGFwZSxCcmFuZFNoYXBlLERpc3BsYXlJbmZvU2hhcGUsSXNzdWVyS2l0U2hhcGUsSXNzdWVyU2hhcGUsUGF5bWVudFNoYXBlLFN1YnNjcmliZXJTaGFwZSxNLFRpbWVzdGFtcFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRTaGFwZVwiLFskaM2PX2EgPT4gKEFtb3VudFNoYXBlID0gJGjNj19hKV1dLFtcIkFzc2V0S2luZFNoYXBlXCIsWyRozY9fYSA9PiAoQXNzZXRLaW5kU2hhcGUgPSAkaM2PX2EpXV0sW1wiQnJhbmRTaGFwZVwiLFskaM2PX2EgPT4gKEJyYW5kU2hhcGUgPSAkaM2PX2EpXV0sW1wiRGlzcGxheUluZm9TaGFwZVwiLFskaM2PX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaM2PX2EpXV0sW1wiSXNzdWVyS2l0U2hhcGVcIixbJGjNj19hID0+IChJc3N1ZXJLaXRTaGFwZSA9ICRozY9fYSldXSxbXCJJc3N1ZXJTaGFwZVwiLFskaM2PX2EgPT4gKElzc3VlclNoYXBlID0gJGjNj19hKV1dLFtcIlBheW1lbnRTaGFwZVwiLFskaM2PX2EgPT4gKFBheW1lbnRTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIlN1YnNjcmliZXJTaGFwZVwiLFskaM2PX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtBZnRlckRlYWRsaW5lRXhpdFJ1bGUsIEluc3RhbGxhdGlvbiwgWm9lSXNzdWVyUmVjb3JkfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtFeGl0UnVsZSwgSW52aXRhdGlvbiwgSW52aXRhdGlvbkhhbmRsZSwgV2FpdmVkRXhpdFJ1bGV9IGZyb20gJy4vdHlwZXMtaW5kZXguanMnO1xuICogQGltcG9ydCB7SW52aXRhdGlvbkRldGFpbHN9IGZyb20gJy4vdHlwZXMtaW5kZXguanMnO1xuICovXG5cbi8qIGtleXdvcmRzIGhhdmUgYW4gaW5pdGlhbCBjYXAqL1xuICAgICAgIGNvbnN0IEtleXdvcmRTaGFwZSA9IE0uc3RyaW5nKCk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPEludml0YXRpb25IYW5kbGU+fSAqLyRozY9fb25jZS5LZXl3b3JkU2hhcGUoS2V5d29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBJbnZpdGF0aW9uSGFuZGxlU2hhcGUgPSBNLnJlbW90YWJsZSgnSW52aXRhdGlvbkhhbmRsZScpO1xuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48SW52aXRhdGlvbj59ICovJGjNj19vbmNlLkludml0YXRpb25IYW5kbGVTaGFwZShJbnZpdGF0aW9uSGFuZGxlU2hhcGUpO1xuICAgICAgIGNvbnN0IEludml0YXRpb25TaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uJyk7JGjNj19vbmNlLkludml0YXRpb25TaGFwZShJbnZpdGF0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IEluc3RhbmNlSGFuZGxlU2hhcGUgPSBNLnJlbW90YWJsZSgnSW5zdGFuY2VIYW5kbGUnKTtcbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPEluc3RhbGxhdGlvbj59ICovJGjNj19vbmNlLkluc3RhbmNlSGFuZGxlU2hhcGUoSW5zdGFuY2VIYW5kbGVTaGFwZSk7XG4gICAgICAgY29uc3QgSW5zdGFsbGF0aW9uU2hhcGUgPSBNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJyk7JGjNj19vbmNlLkluc3RhbGxhdGlvblNoYXBlKEluc3RhbGxhdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBTZWF0U2hhcGUgPSBNLnJlbW90YWJsZSgnU2VhdCcpOyRozY9fb25jZS5TZWF0U2hhcGUoU2VhdFNoYXBlKTtcblxuICAgICAgIGNvbnN0IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLCBBbW91bnRTaGFwZSk7JGjNj19vbmNlLkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZShBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKFxuICBLZXl3b3JkU2hhcGUsXG4gIE0ucGF0dGVybigpLFxuKTskaM2PX29uY2UuQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZShBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoXG4gIEtleXdvcmRTaGFwZSxcbiAgTS5lcmVmKFBheW1lbnRTaGFwZSksXG4pOyRozY9fb25jZS5QYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZShQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsIElzc3VlclNoYXBlKTskaM2PX29uY2UuSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoXG4gIEtleXdvcmRTaGFwZSxcbiAgTS5lcmVmKElzc3VlclNoYXBlKSxcbik7JGjNj19vbmNlLklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKEtleXdvcmRTaGFwZSwgQnJhbmRTaGFwZSk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFpvZUlzc3VlclJlY29yZD59ICovJGjNj19vbmNlLkJyYW5kS2V5d29yZFJlY29yZFNoYXBlKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJSZWNvcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBicmFuZDogQnJhbmRTaGFwZSxcbiAgICBpc3N1ZXI6IElzc3VlclNoYXBlLFxuICAgIGFzc2V0S2luZDogQXNzZXRLaW5kU2hhcGUsXG4gIH0sXG4gIHsgZGlzcGxheUluZm86IERpc3BsYXlJbmZvU2hhcGUgfSxcbik7JGjNj19vbmNlLklzc3VlclJlY29yZFNoYXBlKElzc3VlclJlY29yZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IFRlcm1zU2hhcGUgPSB7XG4gIGlzc3VlcnM6IElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSxcbiAgYnJhbmRzOiBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSxcbn07JGjNj19vbmNlLlRlcm1zU2hhcGUoVGVybXNTaGFwZSk7XG5oYXJkZW4oVGVybXNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBJbnN0YW5jZVJlY29yZFNoYXBlID0ge1xuICBpbnN0YWxsYXRpb246IEluc3RhbGxhdGlvblNoYXBlLFxuICBpbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbiAgdGVybXM6IE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSksXG59OyRozY9fb25jZS5JbnN0YW5jZVJlY29yZFNoYXBlKEluc3RhbmNlUmVjb3JkU2hhcGUpO1xuaGFyZGVuKEluc3RhbmNlUmVjb3JkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSGFuZGxlSSA9IE0uaW50ZXJmYWNlKCdIYW5kbGUnLCB7fSk7JGjNj19vbmNlLkhhbmRsZUkoSGFuZGxlSSk7XG5cbiAgICAgICBjb25zdCBtYWtlSGFuZGxlU2hhcGUgPSBuYW1lID0+IE0ucmVtb3RhYmxlKGAke25hbWV9SGFuZGxlYCk7JGjNj19vbmNlLm1ha2VIYW5kbGVTaGFwZShtYWtlSGFuZGxlU2hhcGUpO1xuICAgICAgIGNvbnN0IFRpbWVyU2hhcGUgPSBtYWtlSGFuZGxlU2hhcGUoJ3RpbWVyJyk7XG5cbi8qKlxuICogQWZ0ZXIgZGVmYXVsdHMgYXJlIGZpbGxlZCBpblxuICpcbiAqIEBzZWUge1Byb3Bvc2FsUmVjb3JkfSB0eXBlXG4gKi8kaM2PX29uY2UuVGltZXJTaGFwZShUaW1lclNoYXBlKTtcbiAgICAgICBjb25zdCBGdWxsUHJvcG9zYWxTaGFwZSA9IHtcbiAgd2FudDogQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSxcbiAgZ2l2ZTogQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuICAvKiBUbyBhY2NlcHQgb25seSBvbmUsIHdlIGNvdWxkIHVzZSBNLm9yIHJhdGhlciB0aGFuIE0uc3BsaXRSZWNvcmQsKi9cbiAgLyogYnV0IHRoZSBlcnJvciBtZXNzYWdlcyB3b3VsZCBoYXZlIGJlZW4gd29yc2UuIFJhdGhlciwqL1xuICAvKiBjbGVhblByb3Bvc2FsJ3MgYXNzZXJ0RXhpdCBjaGVja3MgdGhhdCB0aGVyZSdzIGV4YWN0bHkgb25lLiovXG4gIGV4aXQ6IE0uc3BsaXRSZWNvcmQoXG4gICAge30sXG4gICAge1xuICAgICAgb25EZW1hbmQ6IG51bGwsXG4gICAgICB3YWl2ZWQ6IG51bGwsXG4gICAgICBhZnRlckRlYWRsaW5lOiB7XG4gICAgICAgIHRpbWVyOiBNLmVyZWYoVGltZXJTaGFwZSksXG4gICAgICAgIGRlYWRsaW5lOiBUaW1lc3RhbXBTaGFwZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7fSxcbiAgKSxcbn07JGjNj19vbmNlLkZ1bGxQcm9wb3NhbFNoYXBlKEZ1bGxQcm9wb3NhbFNoYXBlKTtcbmhhcmRlbihGdWxsUHJvcG9zYWxTaGFwZSk7XG5cbi8qKiBAc2VlIHtQcm9wb3NhbH0gdHlwZSAqL1xuICAgICAgIGNvbnN0IFByb3Bvc2FsU2hhcGUgPSBNLnNwbGl0UmVjb3JkKHt9LCBGdWxsUHJvcG9zYWxTaGFwZSwge30pOyRozY9fb25jZS5Qcm9wb3NhbFNoYXBlKFByb3Bvc2FsU2hhcGUpO1xuXG4gICAgICAgY29uc3QgRW1wdHlQcm9wb3NhbFNoYXBlID0gTS5zcGxpdFJlY29yZCh7XG4gIGdpdmU6IHt9LFxuICB3YW50OiB7fSxcbiAgZXhpdDogeyBvbkRlbWFuZDogbnVsbCB9LFxufSk7JGjNj19vbmNlLkVtcHR5UHJvcG9zYWxTaGFwZShFbXB0eVByb3Bvc2FsU2hhcGUpO1xuXG4gICAgICAgY29uc3QgaXNPbkRlbWFuZEV4aXRSdWxlID0gZXhpdCA9PiB7XG4gIGNvbnN0IFtleGl0S2V5XSA9IE9iamVjdC5rZXlzKGV4aXQpO1xuICByZXR1cm4gZXhpdEtleSA9PT0gJ29uRGVtYW5kJztcbn07JGjNj19vbmNlLmlzT25EZW1hbmRFeGl0UnVsZShpc09uRGVtYW5kRXhpdFJ1bGUpO1xuaGFyZGVuKGlzT25EZW1hbmRFeGl0UnVsZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgV2FpdmVkRXhpdFJ1bGV9XG4gKi9cbiAgICAgICBjb25zdCBpc1dhaXZlZEV4aXRSdWxlID0gZXhpdCA9PiB7XG4gIGNvbnN0IFtleGl0S2V5XSA9IE9iamVjdC5rZXlzKGV4aXQpO1xuICByZXR1cm4gZXhpdEtleSA9PT0gJ3dhaXZlZCc7XG59OyRozY9fb25jZS5pc1dhaXZlZEV4aXRSdWxlKGlzV2FpdmVkRXhpdFJ1bGUpO1xuaGFyZGVuKGlzV2FpdmVkRXhpdFJ1bGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIEFmdGVyRGVhZGxpbmVFeGl0UnVsZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlID0gZXhpdCA9PiB7XG4gIGNvbnN0IFtleGl0S2V5XSA9IE9iamVjdC5rZXlzKGV4aXQpO1xuICByZXR1cm4gZXhpdEtleSA9PT0gJ2FmdGVyRGVhZGxpbmUnO1xufTskaM2PX29uY2UuaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUoaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUpO1xuaGFyZGVuKGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48SW52aXRhdGlvbkRldGFpbHM+fSAqL1xuICAgICAgIGNvbnN0IEludml0YXRpb25FbGVtZW50U2hhcGUgPSBNLnNwbGl0UmVjb3JkKHtcbiAgZGVzY3JpcHRpb246IE0uc3RyaW5nKCksXG4gIGhhbmRsZTogSW52aXRhdGlvbkhhbmRsZVNoYXBlLFxuICBpbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbiAgaW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb25TaGFwZSxcbn0pOyRozY9fb25jZS5JbnZpdGF0aW9uRWxlbWVudFNoYXBlKEludml0YXRpb25FbGVtZW50U2hhcGUpO1xuXG4gICAgICAgY29uc3QgT2ZmZXJIYW5kbGVySSA9IE0uaW50ZXJmYWNlKCdPZmZlckhhbmRsZXInLCB7XG4gIGhhbmRsZTogTS5jYWxsKFNlYXRTaGFwZSkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLmFueSgpKSxcbn0pOyRozY9fb25jZS5PZmZlckhhbmRsZXJJKE9mZmVySGFuZGxlckkpO1xuXG4gICAgICAgY29uc3QgU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUgPSBNLmFycmF5T2Yoe1xuICBzZWF0SGFuZGxlOiBTZWF0U2hhcGUsXG4gIGFsbG9jYXRpb246IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbn0pOyRozY9fb25jZS5TZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZShTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBab2VNaW50U2hhcGUgPSBNLnJlbW90YWJsZSgnWm9lTWludCcpOyRozY9fb25jZS5ab2VNaW50U2hhcGUoWm9lTWludFNoYXBlKTtcbiAgICAgICBjb25zdCBab2VNaW50SSA9IE0uaW50ZXJmYWNlKCdab2VNaW50Jywge1xuICBnZXRJc3N1ZXJSZWNvcmQ6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyUmVjb3JkU2hhcGUpLFxuICBtaW50QW5kRXNjcm93OiBNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKSxcbiAgd2l0aGRyYXdBbmRCdXJuOiBNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKSxcbn0pOyRozY9fb25jZS5ab2VNaW50SShab2VNaW50SSk7XG5cbiAgICAgICBjb25zdCBGZWVNaW50QWNjZXNzU2hhcGUgPSBNLnJlbW90YWJsZSgnRmVlTWludEFjY2VzcycpOyRozY9fb25jZS5GZWVNaW50QWNjZXNzU2hhcGUoRmVlTWludEFjY2Vzc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IEV4aXRPYmplY3RJID0gTS5pbnRlcmZhY2UoJ0V4aXQgT2JqZWN0Jywge1xuICBleGl0OiBNLmNhbGwoKS5yZXR1cm5zKCksXG59KTskaM2PX29uY2UuRXhpdE9iamVjdEkoRXhpdE9iamVjdEkpO1xuXG4gICAgICAgY29uc3QgRXhpdE9iamVjdFNoYXBlID0gTS5yZW1vdGFibGUoJ0V4aXRPYmonKTskaM2PX29uY2UuRXhpdE9iamVjdFNoYXBlKEV4aXRPYmplY3RTaGFwZSk7XG4gICAgICAgY29uc3QgSW5zdGFuY2VBZG1pblNoYXBlID0gTS5yZW1vdGFibGUoJ0luc3RhbmNlQWRtaW4nKTskaM2PX29uY2UuSW5zdGFuY2VBZG1pblNoYXBlKEluc3RhbmNlQWRtaW5TaGFwZSk7XG4gICAgICAgY29uc3QgSW5zdGFuY2VBZG1pbkkgPSBNLmludGVyZmFjZSgnSW5zdGFuY2VBZG1pbicsIHtcbiAgbWFrZUludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsIE0uc3RyaW5nKCkpXG4gICAgLm9wdGlvbmFsKE0ucmVjb3JkKCksIE0ucGF0dGVybigpKVxuICAgIC5yZXR1cm5zKEludml0YXRpb25TaGFwZSksXG4gIHNhdmVJc3N1ZXI6IE0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSksIEtleXdvcmRTaGFwZSkucmV0dXJucyhcbiAgICBJc3N1ZXJSZWNvcmRTaGFwZSxcbiAgKSxcbiAgbWFrZU5vRXNjcm93U2VhdDogTS5jYWxsKFxuICAgIEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgICBQcm9wb3NhbFNoYXBlLFxuICAgIEV4aXRPYmplY3RTaGFwZSxcbiAgICBTZWF0U2hhcGUsXG4gICkucmV0dXJucyhTZWF0U2hhcGUpLFxuICBleGl0QWxsU2VhdHM6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gIGZhaWxBbGxTZWF0czogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbiAgZXhpdFNlYXQ6IE0uY2FsbChTZWF0U2hhcGUsIE0uYW55KCkpLnJldHVybnMoKSxcbiAgZmFpbFNlYXQ6IE0uY2FsbChTZWF0U2hhcGUsIE0uYW55KCkpLnJldHVybnMoKSxcbiAgbWFrZVpvZU1pbnQ6IE0uY2FsbChLZXl3b3JkU2hhcGUpXG4gICAgLm9wdGlvbmFsKFxuICAgICAgQXNzZXRLaW5kU2hhcGUsXG4gICAgICBEaXNwbGF5SW5mb1NoYXBlLFxuICAgICAgTS5zcGxpdFJlY29yZCh7fSwgeyBlbGVtZW50U2hhcGU6IE0ucGF0dGVybigpIH0pLFxuICAgIClcbiAgICAucmV0dXJucyhNLnJlbW90YWJsZSgnem9lTWludCcpKSxcbiAgcmVnaXN0ZXJGZWVNaW50OiBNLmNhbGwoS2V5d29yZFNoYXBlLCBGZWVNaW50QWNjZXNzU2hhcGUpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKSxcbiAgKSxcbiAgcmVwbGFjZUFsbG9jYXRpb25zOiBNLmNhbGwoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpLnJldHVybnMoKSxcbiAgc3RvcEFjY2VwdGluZ09mZmVyczogTS5jYWxsKCkucmV0dXJucygpLFxuICBzZXRPZmZlckZpbHRlcjogTS5jYWxsKE0uYXJyYXlPZihNLnN0cmluZygpKSkucmV0dXJucygpLFxuICBnZXRPZmZlckZpbHRlcjogTS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuICBnZXRFeGl0U3Vic2NyaWJlcjogTS5jYWxsKFNlYXRTaGFwZSkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuICBpc0Jsb2NrZWQ6IE0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgcmVwYWlyQ29udHJhY3RDb21wbGV0aW9uV2F0Y2hlcjogTS5jYWxsKCkucmV0dXJucygpLFxufSk7JGjNj19vbmNlLkluc3RhbmNlQWRtaW5JKEluc3RhbmNlQWRtaW5JKTtcblxuICAgICAgIGNvbnN0IEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0ID0ge1xuICBpbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyOiBNLmludGVyZmFjZSgnSW5zdGFuY2VTdG9yYWdlTWFuYWdlcicsIHtcbiAgICBnZXRUZXJtczogTS5jYWxsKCkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbiAgICBnZXRJc3N1ZXJzOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgZ2V0QnJhbmRzOiBNLmNhbGwoKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbiAgICBnZXRJbnN0YWxsYXRpb246IE0uY2FsbCgpLnJldHVybnMoSW5zdGFsbGF0aW9uU2hhcGUpLFxuICAgIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuXG4gICAgc2F2ZUlzc3VlcjogTS5jYWxsKElzc3VlclNoYXBlLCBLZXl3b3JkU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIG1ha2Vab2VNaW50OiBNLmNhbGwoS2V5d29yZFNoYXBlKVxuICAgICAgLm9wdGlvbmFsKFxuICAgICAgICBBc3NldEtpbmRTaGFwZSxcbiAgICAgICAgRGlzcGxheUluZm9TaGFwZSxcbiAgICAgICAgTS5zcGxpdFJlY29yZCh7fSwgeyBlbGVtZW50U2hhcGU6IE0ucGF0dGVybigpIH0pLFxuICAgICAgKVxuICAgICAgLnJldHVybnMoTS5lcmVmKFpvZU1pbnRTaGFwZSkpLFxuICAgIHJlZ2lzdGVyRmVlTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSwgRmVlTWludEFjY2Vzc1NoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKSxcbiAgICApLFxuICAgIGdldEluc3RhbmNlUmVjb3JkOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlUmVjb3JkU2hhcGUpLFxuICAgIGdldElzc3VlclJlY29yZHM6IE0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKElzc3VlclJlY29yZFNoYXBlKSksXG4gICAgZ2V0V2l0aGRyYXdGYWNldDogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnV2l0aGRyYXdGYWNldCcpKSxcbiAgICBpbml0SW5zdGFuY2VBZG1pbjogTS5jYWxsKFxuICAgICAgSW5zdGFuY2VIYW5kbGVTaGFwZSxcbiAgICAgIE0ucmVtb3RhYmxlKCdpbnN0YW5jZUFkbWluJyksXG4gICAgKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBkZWxldGVJbnN0YW5jZUFkbWluOiBNLmNhbGwoSW5zdGFuY2VBZG1pblNoYXBlKS5yZXR1cm5zKCksXG4gICAgbWFrZUludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsIE0uc3RyaW5nKCkpXG4gICAgICAub3B0aW9uYWwoTS5yZWNvcmQoKSwgTS5wYXR0ZXJuKCkpXG4gICAgICAucmV0dXJucyhQYXltZW50U2hhcGUpLFxuICAgIGdldFJvb3Q6IE0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG4gICAgZ2V0QWRtaW5Ob2RlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKSksXG4gIH0pLFxuICB3aXRoZHJhd0ZhY2V0OiBNLmludGVyZmFjZSgnV2l0aGRyYXdGYWNldCcsIHtcbiAgICB3aXRoZHJhd1BheW1lbnRzOiBNLmNhbGwoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuICAgICAgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICAgKSxcbiAgfSksXG4gIGhlbHBlcnM6IE0uaW50ZXJmYWNlKCdJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyIGhlbHBlcicsIHtcbiAgICB3cmFwSXNzdWVyS2l0V2l0aFpvZU1pbnQ6IE0uY2FsbChcbiAgICAgIEtleXdvcmRTaGFwZSxcbiAgICAgIElzc3VlcktpdFNoYXBlLFxuICAgICAgTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpLFxuICAgICkucmV0dXJucyhab2VNaW50U2hhcGUpLFxuICB9KSxcbn07JGjNj19vbmNlLkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KTtcbmhhcmRlbihJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5cbiAgICAgICBjb25zdCBCdW5kbGVDYXBTaGFwZSA9IE0ucmVtb3RhYmxlKCdidW5kbGVDYXAnKTskaM2PX29uY2UuQnVuZGxlQ2FwU2hhcGUoQnVuZGxlQ2FwU2hhcGUpO1xuICAgICAgIGNvbnN0IEJ1bmRsZVNoYXBlID0gTS5hbmQoXG4gIE0uc3BsaXRSZWNvcmQoeyBtb2R1bGVGb3JtYXQ6IE0uYW55KCkgfSksXG4gIE0ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5zdHJpbmcoeyBzdHJpbmdMZW5ndGhMaW1pdDogSW5maW5pdHkgfSkpLFxuKTskaM2PX29uY2UuQnVuZGxlU2hhcGUoQnVuZGxlU2hhcGUpO1xuXG4gICAgICAgY29uc3QgVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7IGluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uU2hhcGUgfSxcbiAge1xuICAgIGJ1bmRsZTogTS5yZWNvcmRPZihNLnN0cmluZygpLCBNLnN0cmluZyh7IHN0cmluZ0xlbmd0aExpbWl0OiBJbmZpbml0eSB9KSksXG4gICAgYnVuZGxlQ2FwOiBCdW5kbGVDYXBTaGFwZSxcbiAgICBidW5kbGVJRDogTS5zdHJpbmcoKSxcbiAgfSxcbiAge30sXG4pOyRozY9fb25jZS5VbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZShVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBab2VTdG9yYWdlTWFuYWdlcklLaXQgPSB7XG4gIHpvZVNlcnZpY2VEYXRhQWNjZXNzOiBNLmludGVyZmFjZSgnWm9lU2VydmljZSBkYXRhQWNjZXNzJywge1xuICAgIGdldFRlcm1zOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbiAgICBnZXRJc3N1ZXJzOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuICAgIGdldEJyYW5kczogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuICAgIGdldEluc3RhbGxhdGlvbjogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLmVyZWYoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSxcbiAgICApLFxuICAgIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuXG4gICAgZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uOiBNLmNhbGwoSW5zdGFsbGF0aW9uU2hhcGUpLnJldHVybnMoXG4gICAgICBNLmVyZWYoTS5zdHJpbmcoKSksXG4gICAgKSxcbiAgICBpbnN0YWxsQnVuZGxlOiBNLmNhbGwoQnVuZGxlU2hhcGUpXG4gICAgICAub3B0aW9uYWwoTS5zdHJpbmcoKSlcbiAgICAgIC5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBpbnN0YWxsQnVuZGxlSUQ6IE0uY2FsbChNLnN0cmluZygpKVxuICAgICAgLm9wdGlvbmFsKE0uc3RyaW5nKCkpXG4gICAgICAucmV0dXJucyhNLnByb21pc2UoKSksXG5cbiAgICBnZXRQdWJsaWNGYWNldDogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLmVyZWYoTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JykpLFxuICAgICksXG4gICAgZ2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG4gICAgZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLm9wdChNLnBhdHRlcm4oKSksXG4gICAgKSxcbiAgfSksXG4gIG1ha2VPZmZlckFjY2VzczogTS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgbWFrZU9mZmVyIGFjY2VzcycsIHtcbiAgICBnZXRBc3NldEtpbmRCeUJyYW5kOiBNLmNhbGwoQnJhbmRTaGFwZSkucmV0dXJucyhBc3NldEtpbmRTaGFwZSksXG4gICAgZ2V0SW5zdGFuY2VBZG1pbjogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpLFxuICAgICksXG4gICAgZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLm9wdChNLnBhdHRlcm4oKSksXG4gICAgKSxcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgICBkZXBvc2l0UGF5bWVudHM6IE0uY2FsbChQcm9wb3NhbFNoYXBlLCBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcbiAgICAgIE0ucHJvbWlzZSgpLFxuICAgICksXG4gIH0pLFxuICBzdGFydEluc3RhbmNlQWNjZXNzOiBNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBzdGFydEluc3RhbmNlIGFjY2VzcycsIHtcbiAgICBtYWtlWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcjogTS5jYWxsKFxuICAgICAgSW5zdGFsbGF0aW9uU2hhcGUsXG4gICAgICBNLmFueSgpLFxuICAgICAgSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgICAgIEluc3RhbmNlSGFuZGxlU2hhcGUsXG4gICAgICBNLm9yKEJ1bmRsZUNhcFNoYXBlLCBCdW5kbGVTaGFwZSksXG4gICAgICBNLnN0cmluZygpLFxuICAgICkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgdW53cmFwSW5zdGFsbGF0aW9uOiBNLmNhbGxXaGVuKE0uZXJlZihJbnN0YWxsYXRpb25TaGFwZSkpLnJldHVybnMoXG4gICAgICBVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSxcbiAgICApLFxuICB9KSxcbiAgaW52aXRhdGlvbklzc3VlckFjY2VzczogTS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgaW52aXRhdGlvbklzc3VlcicsIHtcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgfSksXG59OyRozY9fb25jZS5ab2VTdG9yYWdlTWFuYWdlcklLaXQoWm9lU3RvcmFnZU1hbmFnZXJJS2l0KTtcbmhhcmRlbihab2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuXG4gICAgICAgY29uc3QgWm9lU2VydmljZUkgPSBNLmludGVyZmFjZSgnWm9lU2VydmljZScsIHtcbiAgaW5zdGFsbDogTS5jYWxsKE0uYW55KCkpLm9wdGlvbmFsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBpbnN0YWxsQnVuZGxlSUQ6IE0uY2FsbChNLnN0cmluZygpKS5vcHRpb25hbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgc3RhcnRJbnN0YW5jZTogTS5jYWxsKE0uZXJlZihJbnN0YWxsYXRpb25TaGFwZSkpXG4gICAgLm9wdGlvbmFsKElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUsIE0ucmVjb3JkKCksIE0ucmVjb3JkKCksIE0uc3RyaW5nKCkpXG4gICAgLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBvZmZlcjogTS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKVxuICAgIC5vcHRpb25hbChQcm9wb3NhbFNoYXBlLCBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSwgTS5hbnkoKSlcbiAgICAucmV0dXJucyhNLnByb21pc2UoKSksXG5cbiAgZ2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBNLmFycmF5T2YoTS5zdHJpbmcoKSksXG4gICksXG4gIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRGZWVJc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRCcmFuZHM6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgKSxcbiAgZ2V0SXNzdWVyczogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSxcbiAgKSxcbiAgZ2V0UHVibGljRmFjZXQ6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBNLnJlbW90YWJsZSgnUHVibGljRmFjZXQnKSxcbiAgKSxcbiAgZ2V0VGVybXM6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhNLmFueSgpKSxcbiAgZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2U6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBNLmVyZWYoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSxcbiAgKSxcbiAgZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKFxuICAgIE0uZXJlZihNLnN0cmluZygpKSxcbiAgKSxcblxuICBnZXRJbnN0YWxsYXRpb246IE0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldEluc3RhbmNlOiBNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRDb25maWd1cmF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKHtcbiAgICBmZWVJc3N1ZXJDb25maWc6IHtcbiAgICAgIG5hbWU6IE0uc3RyaW5nKCksXG4gICAgICBhc3NldEtpbmQ6ICduYXQnLFxuICAgICAgZGlzcGxheUluZm86IERpc3BsYXlJbmZvU2hhcGUsXG4gICAgfSxcbiAgfSksXG4gIGdldEludml0YXRpb25EZXRhaWxzOiBNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG4gIGdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgIE0ub3B0KE0ucGF0dGVybigpKSxcbiAgKSxcbn0pOyRozY9fb25jZS5ab2VTZXJ2aWNlSShab2VTZXJ2aWNlSSk7XG5cbiAgICAgICBjb25zdCBBZG1pbkZhY2V0SSA9IE0uaW50ZXJmYWNlKCdaY2ZBZG1pbkZhY2V0Jywge1xuICBnZXRWYXRTaHV0ZG93blByb21pc2U6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICByZXN0YXJ0Q29udHJhY3Q6IE0uY2FsbCgpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICB1cGdyYWRlQ29udHJhY3Q6IE0uY2FsbChNLnN0cmluZygpKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgdGVybWluYXRlQ29udHJhY3Q6IE0uY2FsbChNLmVycm9yKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxufSk7JGjNj19vbmNlLkFkbWluRmFjZXRJKEFkbWluRmFjZXRJKTtcblxuICAgICAgIGNvbnN0IFNlYXREYXRhU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAgcHJvcG9zYWw6IFByb3Bvc2FsU2hhcGUsXG4gICAgaW5pdGlhbEFsbG9jYXRpb246IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgICBzZWF0SGFuZGxlOiBTZWF0U2hhcGUsXG4gIH0sXG4gIHtcbiAgICBvZmZlckFyZ3M6IE0uYW55KCksXG4gIH0sXG4pOyRozY9fb25jZS5TZWF0RGF0YVNoYXBlKFNlYXREYXRhU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSGFuZGxlT2ZmZXJJID0gTS5pbnRlcmZhY2UoJ0hhbmRsZU9mZmVyJywge1xuICBoYW5kbGVPZmZlcjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSwgU2VhdERhdGFTaGFwZSkucmV0dXJucyh7XG4gICAgb2ZmZXJSZXN1bHRQcm9taXNlOiBNLnByb21pc2UoKSxcbiAgICBleGl0T2JqOiBFeGl0T2JqZWN0U2hhcGUsXG4gIH0pLFxufSk7JGjNj19vbmNlLkhhbmRsZU9mZmVySShIYW5kbGVPZmZlckkpO1xuXG4gICAgICAgY29uc3QgUHJpY2VRdW90ZVNoYXBlID0ge1xuICBxdW90ZUFtb3VudDogQW1vdW50U2hhcGUsXG4gIHF1b3RlUGF5bWVudDogTS5lcmVmKFBheW1lbnRTaGFwZSksXG59OyRozY9fb25jZS5QcmljZVF1b3RlU2hhcGUoUHJpY2VRdW90ZVNoYXBlKTtcbmhhcmRlbihQcmljZVF1b3RlU2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiS2V5d29yZFNoYXBlIjpbIktleXdvcmRTaGFwZSJdLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiOlsiSW52aXRhdGlvbkhhbmRsZVNoYXBlIl0sIkludml0YXRpb25TaGFwZSI6WyJJbnZpdGF0aW9uU2hhcGUiXSwiSW5zdGFuY2VIYW5kbGVTaGFwZSI6WyJJbnN0YW5jZUhhbmRsZVNoYXBlIl0sIkluc3RhbGxhdGlvblNoYXBlIjpbIkluc3RhbGxhdGlvblNoYXBlIl0sIlNlYXRTaGFwZSI6WyJTZWF0U2hhcGUiXSwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiXSwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIjpbIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIjpbIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiXSwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyUmVjb3JkU2hhcGUiOlsiSXNzdWVyUmVjb3JkU2hhcGUiXSwiVGVybXNTaGFwZSI6WyJUZXJtc1NoYXBlIl0sIkluc3RhbmNlUmVjb3JkU2hhcGUiOlsiSW5zdGFuY2VSZWNvcmRTaGFwZSJdLCJIYW5kbGVJIjpbIkhhbmRsZUkiXSwibWFrZUhhbmRsZVNoYXBlIjpbIm1ha2VIYW5kbGVTaGFwZSJdLCJUaW1lclNoYXBlIjpbIlRpbWVyU2hhcGUiXSwiRnVsbFByb3Bvc2FsU2hhcGUiOlsiRnVsbFByb3Bvc2FsU2hhcGUiXSwiUHJvcG9zYWxTaGFwZSI6WyJQcm9wb3NhbFNoYXBlIl0sIkVtcHR5UHJvcG9zYWxTaGFwZSI6WyJFbXB0eVByb3Bvc2FsU2hhcGUiXSwiaXNPbkRlbWFuZEV4aXRSdWxlIjpbImlzT25EZW1hbmRFeGl0UnVsZSJdLCJpc1dhaXZlZEV4aXRSdWxlIjpbImlzV2FpdmVkRXhpdFJ1bGUiXSwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiOlsiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiXSwiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSI6WyJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIl0sIk9mZmVySGFuZGxlckkiOlsiT2ZmZXJIYW5kbGVySSJdLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSI6WyJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSJdLCJab2VNaW50U2hhcGUiOlsiWm9lTWludFNoYXBlIl0sIlpvZU1pbnRJIjpbIlpvZU1pbnRJIl0sIkZlZU1pbnRBY2Nlc3NTaGFwZSI6WyJGZWVNaW50QWNjZXNzU2hhcGUiXSwiRXhpdE9iamVjdEkiOlsiRXhpdE9iamVjdEkiXSwiRXhpdE9iamVjdFNoYXBlIjpbIkV4aXRPYmplY3RTaGFwZSJdLCJJbnN0YW5jZUFkbWluU2hhcGUiOlsiSW5zdGFuY2VBZG1pblNoYXBlIl0sIkluc3RhbmNlQWRtaW5JIjpbIkluc3RhbmNlQWRtaW5JIl0sIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0IjpbIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0Il0sIkJ1bmRsZUNhcFNoYXBlIjpbIkJ1bmRsZUNhcFNoYXBlIl0sIkJ1bmRsZVNoYXBlIjpbIkJ1bmRsZVNoYXBlIl0sIlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlIjpbIlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlIl0sIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJab2VTdG9yYWdlTWFuYWdlcklLaXQiXSwiWm9lU2VydmljZUkiOlsiWm9lU2VydmljZUkiXSwiQWRtaW5GYWNldEkiOlsiQWRtaW5GYWNldEkiXSwiU2VhdERhdGFTaGFwZSI6WyJTZWF0RGF0YVNoYXBlIl0sIkhhbmRsZU9mZmVySSI6WyJIYW5kbGVPZmZlckkiXSwiUHJpY2VRdW90ZVNoYXBlIjpbIlByaWNlUXVvdGVTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADZ9JO0lgEAAJYBAAAeAAAAQGFnb3JpYy96b25lLXYwLjIuMi9kdXJhYmxlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2R1cmFibGUuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9kdXJhYmxlLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2R1cmFibGUuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgDJSytoTAADaEwAAIgAAAEBhZ29yaWMvem9uZS12MC4yLjIvc3JjL2R1cmFibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL2Jhc2Utem9uZSJdLCJleHBvcnRzIjpbIm1ha2VEdXJhYmxlWm9uZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRmFyLGlzUGFzc2FibGUsY2FuQmVEdXJhYmxlLG1ha2VTY2FsYXJNYXBTdG9yZSxwcmVwYXJlRXhvLHByZXBhcmVFeG9DbGFzcyxwcmVwYXJlRXhvQ2xhc3NLaXQscHJvdmlkZUR1cmFibGVNYXBTdG9yZSxwcm92aWRlRHVyYWJsZVNldFN0b3JlLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlLHdhdGNoUHJvbWlzZSxrZXlzLG1ha2VPbmNlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJpc1Bhc3NhYmxlXCIsWyRozY9fYSA9PiAoaXNQYXNzYWJsZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLFskaM2PX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG8gPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVNldFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVTZXRTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUgPSAkaM2PX2EpXV0sW1wid2F0Y2hQcm9taXNlXCIsWyRozY9fYSA9PiAod2F0Y2hQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9iYXNlLXpvbmVcIiwgW1tcImFnb3JpY1ZhdERhdGFLZXlzXCIsWyRozY9fYSA9PiAoa2V5cyA9ICRozY9fYSldXSxbXCJtYWtlT25jZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VPbmNlS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJy4vaW5kZXguanMnO1xuICogQGltcG9ydCB7U3RvcmVzfSBmcm9tICcuL2luZGV4LmpzJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqL1xuXG4vKipcbiAqIEEgdmFyaWFudCBvZiBgY2FuQmVEdXJhYmxlYCB0aGF0IHJldHVybnMgYGZhbHNlYCBpbnN0ZWFkIG9mIGV2ZXIgdGhyb3dpbmcuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzU3RvcmFibGUgPSBzcGVjaW1lbiA9PiBpc1Bhc3NhYmxlKHNwZWNpbWVuKSAmJiBjYW5CZUR1cmFibGUoc3BlY2ltZW4pO1xuaGFyZGVuKGlzU3RvcmFibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7KCkgPT4gQmFnZ2FnZX0gZ2V0QmFnZ2FnZVxuICovXG5jb25zdCBhdHRhY2hEdXJhYmxlU3RvcmVzID0gZ2V0QmFnZ2FnZSA9PiB7XG4gIC8qKiBAdHlwZSB7Wm9uZVsnbWFwU3RvcmUnXX0gKi9cbiAgY29uc3QgbWFwU3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBiYWdnYWdlID0gZ2V0QmFnZ2FnZSgpO1xuICAgIGNvbnN0IHJldCA9IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUoYmFnZ2FnZSwgbGFiZWwsIG9wdGlvbnMpO1xuICAgIHJldHVybiByZXQ7XG4gIH07XG4gIC8qKiBAdHlwZSB7Wm9uZVsnc2V0U3RvcmUnXX0gKi9cbiAgY29uc3Qgc2V0U3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+XG4gICAgcHJvdmlkZUR1cmFibGVTZXRTdG9yZShnZXRCYWdnYWdlKCksIGxhYmVsLCBvcHRpb25zKTtcbiAgLyoqIEB0eXBlIHtab25lWyd3ZWFrU2V0U3RvcmUnXX0gKi9cbiAgY29uc3Qgd2Vha1NldFN0b3JlID0gKGxhYmVsLCBvcHRpb25zKSA9PlxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKGdldEJhZ2dhZ2UoKSwgbGFiZWwsIG9wdGlvbnMpO1xuICAvKiogQHR5cGUge1pvbmVbJ3dlYWtNYXBTdG9yZSddfSAqL1xuICBjb25zdCB3ZWFrTWFwU3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+XG4gICAgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoZ2V0QmFnZ2FnZSgpLCBsYWJlbCwgb3B0aW9ucyk7XG5cbiAgLyoqIEB0eXBlIHtTdG9yZXN9ICovXG4gIHJldHVybiBGYXIoJ2R1cmFibGVTdG9yZXMnLCB7XG4gICAgZGV0YWNoZWQ6ICgpID0+IGRldGFjaGVkRHVyYWJsZVN0b3JlcyxcbiAgICBpc1N0b3JhYmxlLFxuICAgIG1hcFN0b3JlLFxuICAgIHNldFN0b3JlLFxuICAgIHdlYWtNYXBTdG9yZSxcbiAgICB3ZWFrU2V0U3RvcmUsXG4gIH0pO1xufTtcblxuLyoqIEB0eXBlIHtTdG9yZXN9ICovXG5jb25zdCBkZXRhY2hlZER1cmFibGVTdG9yZXMgPSBhdHRhY2hEdXJhYmxlU3RvcmVzKCgpID0+XG4gIG1ha2VTY2FsYXJNYXBTdG9yZSgnZGV0YWNoZWQnKSxcbik7XG5cbi8qKlxuICogQ3JlYXRlIGEgem9uZSB3aG9zZSBvYmplY3RzIHBlcnNpc3QgYmV0d2VlbiBBZ29yaWMgdmF0IHVwZ3JhZGVzLlxuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IFtiYXNlTGFiZWxdXG4gKiBAcmV0dXJucyB7Wm9uZX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEdXJhYmxlWm9uZSA9IChiYWdnYWdlLCBiYXNlTGFiZWwgPSAnZHVyYWJsZVpvbmUnKSA9PiB7XG4gIGJhZ2dhZ2UgfHwgRmFpbGBiYWdnYWdlIHJlcXVpcmVkYDtcblxuICBjb25zdCBhdHRhY2hlZFN0b3JlcyA9IGF0dGFjaER1cmFibGVTdG9yZXMoKCkgPT4gYmFnZ2FnZSk7XG5cbiAgY29uc3QgeyBtYWtlT25jZSwgd3JhcFByb3ZpZGVyIH0gPSBtYWtlT25jZUtpdChcbiAgICBiYXNlTGFiZWwsXG4gICAgYXR0YWNoZWRTdG9yZXMsXG4gICAgYmFnZ2FnZSxcbiAgKTtcblxuICAvKiogQHR5cGUge1pvbmVbJ2V4b0NsYXNzJ119ICovXG4gIGNvbnN0IGV4b0NsYXNzID0gKC4uLmFyZ3MpID0+IHByZXBhcmVFeG9DbGFzcyhiYWdnYWdlLCAuLi5hcmdzKTtcbiAgLyoqIEB0eXBlIHtab25lWydleG9DbGFzc0tpdCddfSAqL1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50IC0tIGhhcHBlbnMgb25seSBpbnRlZ3JhdGluZyB3aXRoIEVuZG8gbWFzdGVyKi9cbiAgLyogQHRzLWlnbm9yZSBGSVhNRSBpbiBFbmRvKi9cbiAgY29uc3QgZXhvQ2xhc3NLaXQgPSAoLi4uYXJncykgPT4gcHJlcGFyZUV4b0NsYXNzS2l0KGJhZ2dhZ2UsIC4uLmFyZ3MpO1xuICAvKiogQHR5cGUge1pvbmVbJ2V4byddfSAqL1xuICBjb25zdCBleG8gPSAoLi4uYXJncykgPT4gcHJlcGFyZUV4byhiYWdnYWdlLCAuLi5hcmdzKTtcblxuICBjb25zdCBzdWJab25lU3RvcmUgPSB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMubWFwU3RvcmUsIGtleXMuem9uZSk7XG5cbiAgLyoqIEB0eXBlIHtab25lWydzdWJab25lJ119ICovXG4gIGNvbnN0IHN1YlpvbmUgPSAobGFiZWwsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIC8qKiBAdHlwZSB7QmFnZ2FnZX0gKi9cbiAgICBjb25zdCBzdWJCYWdnYWdlID0gc3ViWm9uZVN0b3JlKGxhYmVsLCBvcHRpb25zKTtcbiAgICByZXR1cm4gbWFrZUR1cmFibGVab25lKHN1YkJhZ2dhZ2UsIGAke2Jhc2VMYWJlbH0uJHtsYWJlbH1gKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKCdkdXJhYmxlWm9uZScsIHtcbiAgICBleG86IHdyYXBQcm92aWRlcihleG8sIGtleXMuZXhvKSxcbiAgICBleG9DbGFzczogd3JhcFByb3ZpZGVyKGV4b0NsYXNzLCBrZXlzLmV4b0NsYXNzKSxcbiAgICBleG9DbGFzc0tpdDogd3JhcFByb3ZpZGVyKGV4b0NsYXNzS2l0LCBrZXlzLmV4b0NsYXNzS2l0KSxcbiAgICBzdWJab25lLFxuXG4gICAgbWFrZU9uY2UsXG4gICAgd2F0Y2hQcm9taXNlLFxuICAgIGRldGFjaGVkOiBhdHRhY2hlZFN0b3Jlcy5kZXRhY2hlZCxcbiAgICBpc1N0b3JhYmxlOiBhdHRhY2hlZFN0b3Jlcy5pc1N0b3JhYmxlLFxuXG4gICAgbWFwU3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5tYXBTdG9yZSwga2V5cy5zdG9yZSksXG4gICAgc2V0U3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5zZXRTdG9yZSwga2V5cy5zdG9yZSksXG4gICAgd2Vha01hcFN0b3JlOiB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMud2Vha01hcFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgICB3ZWFrU2V0U3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy53ZWFrU2V0U3RvcmUsIGtleXMuc3RvcmUpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VEdXJhYmxlWm9uZShtYWtlRHVyYWJsZVpvbmUpO1xuaGFyZGVuKG1ha2VEdXJhYmxlWm9uZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRHVyYWJsZVpvbmUiOlsibWFrZUR1cmFibGVab25lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG9RIY9hCwAAYQsAACwAAABAZW5kby9jb21tb24tdjEuMi4xMy9hcHBseS1sYWJlbGluZy1lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Rocm93LWxhYmVsZWQuanMiXSwiZXhwb3J0cyI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLGlzUHJvbWlzZSx0aHJvd0xhYmVsZWQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3Rocm93LWxhYmVsZWQuanNcIiwgW1tcInRocm93TGFiZWxlZFwiLFskaM2PX2EgPT4gKHRocm93TGFiZWxlZCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIENhbGxzIGBmdW5jKC4uLmFyZ3MpYCwgYnV0IGFubm90YXRpbmcgYW55IGZhaWx1cmUgZXJyb3Igd2l0aCBgbGFiZWxgLlxuICpcbiAqIElmIGBsYWJlbGAgaXMgb21pdHRlZCBvciBgdW5kZWZpbmVkYCwgdGhlbiB0aGlzIGlzIGVxdWl2YWxlbnQgdG9cbiAqIGBmdW5jKC4uLmFyZ3MpLlxuICpcbiAqIE90aGVyd2lzZSwgaWYgaXQgc3VjY2Vzc2Z1bGx5IHJldHVybnMgYSBub24tcHJvbWlzZSwgdGhhdCBub24tcHJvbWlzZSBpc1xuICogcmV0dXJuZWQuXG4gKlxuICogSWYgaXQgdGhyb3dzLCByZXRocm93IGEgc2ltaWxhciBlcnJvciB3aG9zZSBtZXNzYWdlIGlzXG4gKiBgYGBqc1xuICogYCR7bGFiZWx9OiAke29yaWdpbmFsTWVzc2FnZX1gXG4gKiBgYGBcbiAqIFRoYXQgd2F5LCBpbiBhbiBlcnJvciBoYXBwZW5zIGRlZXAgd2l0aGluIGEgc3RhY2sgb2YgY2FsbHMgdG9cbiAqIGBhcHBseUxhYmVsaW5nRXJyb3JgLCB0aGUgcmVzdWx0aW5nIGVycm9yIHdpbGwgc2hvdyB0aGUgc3RhY2sgb2YgbGFiZWxzLlxuICpcbiAqIElmIGl0IHJldHVybnMgYSBwcm9taXNlLCB0aGVuIGBhcHBseUxhYmVsaW5nRXJyb3JgIGNhbm5vdCB0ZWxsIHVudGlsIHRoYXRcbiAqIHByb21pc2Ugc2V0dGxlcyB3aGV0aGVyIGl0IHJlcHJlc2VudHMgYSBzdWNjZXNzIG9yIGZhaWx1cmUuIFNvIGl0IGltbWVkaWF0ZWx5XG4gKiByZXR1cm5zIGEgbmV3IHByb21pc2UuIElmIHRoZSBvcmlnaW5hbCBwcm9taXNlIGZ1bGZpbGxzLCB0aGVuIHRoZVxuICogZnVsZmlsbG1lbnQgaXMgcHJvcGFnYXRlZCB0byB0aGUgcmV0dXJuZWQgcHJvbWlzZS5cbiAqXG4gKiBJZiB0aGUgcHJvbWlzZSByZWplY3RzIHdpdGggYW4gZXJyb3IsIHRoZW4gdGhlIHJldHVybmVkIHByb21pc2UgaXNcbiAqIHJlamVjdGVkIHdpdGggYSBzaW1pbGFyIHByb21pc2UsIHByZWZpeGVkIHdpdGggdGhlIGxhYmVsIGluIHRoYXQgc2FtZSB3YXkuXG4gKlxuICogQHRlbXBsYXRlIEEsUlxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBSfSBmdW5jXG4gKiBAcGFyYW0ge0FbXX0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Un1cbiAqL1xuICAgICAgIGNvbnN0IGFwcGx5TGFiZWxpbmdFcnJvciA9IChmdW5jLCBhcmdzLCBsYWJlbCA9IHVuZGVmaW5lZCkgPT4ge1xuICBpZiAobGFiZWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmdW5jKC4uLmFyZ3MpO1xuICB9XG4gIGxldCByZXN1bHQ7XG4gIHRyeSB7XG4gICAgcmVzdWx0ID0gZnVuYyguLi5hcmdzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3dMYWJlbGVkKGVyciwgbGFiZWwpO1xuICB9XG4gIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgIC8qIENhbm5vdCBiZSBhdC10cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGVyZSBpcyBubyB0eXBlIGVycm9yIGxvY2FsbHkuKi9cbiAgICAvKiBSYXRoZXIsIGEgdHlwZSBlcnJvciBvbmx5IGFzIGltcG9ydGVkIGludG8gZXhvLiovXG4gICAgLyogQHRzLWlnbm9yZSBJZiByZXN1bHQgaXMgYSByZWplY3RlZCBwcm9taXNlLCB0aGlzIHdpbGwqL1xuICAgIC8qIHJldHVybiBhIHByb21pc2Ugd2l0aCBhIGRpZmZlcmVudCByZWplY3Rpb24gcmVhc29uLiBCdXQgdGhpcyovXG4gICAgLyogY29uZnVzZXMgVHlwZVNjcmlwdCBiZWNhdXNlIGl0IHR5cGVzIHRoYXQgY2FzZSBhcyBgUHJvbWlzZTxuZXZlcj5gKi9cbiAgICAvKiB3aGljaCBpcyBjb29sIGZvciBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyIGZ1bGZsbC4qL1xuICAgIC8qIEJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IHRoaXMgd2lsbCBvbmx5IGhhcHBlbiovXG4gICAgLyogd2hlbiBgcmVzdWx0YCB3YXMgYSByZWplY3RlZCBwcm9taXNlLiBJbiBvbmx5IHRoaXMgY2FzZSBgUmAqL1xuICAgIC8qIHNob3VsZCBhbHJlYWR5IGFsbG93IGBQcm9taXNlPG5ldmVyPmAgYXMgYSBzdWJ0eXBlLiovXG4gICAgcmV0dXJuIEUud2hlbihyZXN1bHQsIHVuZGVmaW5lZCwgcmVhc29uID0+IHRocm93TGFiZWxlZChyZWFzb24sIGxhYmVsKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTskaM2PX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFwcGx5TGFiZWxpbmdFcnJvciI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASPhCyt0FAADdBQAAKwAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL2Zyb20tdW5pcXVlLWVudHJpZXMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIFRocm93cyBpZiBtdWx0aXBsZSBlbnRyaWVzIHVzZSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lLiBPdGhlcndpc2UgYWN0c1xuICogbGlrZSBgT2JqZWN0LmZyb21FbnRyaWVzYCBidXQgaGFyZGVucyB0aGUgcmVzdWx0LlxuICogVXNlIGl0IHRvIHByb3RlY3QgZnJvbSBwcm9wZXJ0eSBuYW1lcyBjb21wdXRlZCBmcm9tIHVzZXItcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9YW55XVxuICogQHBhcmFtIHtJdGVyYWJsZTxyZWFkb25seSBbUHJvcGVydHlLZXksIFRdPn0gYWxsRW50cmllc1xuICogQHJldHVybnMge3sgW2s6IHN0cmluZ106IFQ7IH19XG4gKi9cbiAgICAgICBjb25zdCBmcm9tVW5pcXVlRW50cmllcyA9IGFsbEVudHJpZXMgPT4ge1xuICBjb25zdCBlbnRyaWVzQXJyYXkgPSBbLi4uYWxsRW50cmllc107XG4gIGNvbnN0IHJlc3VsdCA9IGhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpKTtcbiAgaWYgKG93bktleXMocmVzdWx0KS5sZW5ndGggPT09IGVudHJpZXNBcnJheS5sZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBfXSBvZiBlbnRyaWVzQXJyYXkpIHtcbiAgICBpZiAobmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICBGYWlsYGNvbGxpc2lvbiBvbiBwcm9wZXJ0eSBuYW1lICR7cShuYW1lKX06ICR7ZW50cmllc0FycmF5fWA7XG4gICAgfVxuICAgIG5hbWVzLmFkZChuYW1lKTtcbiAgfVxuICB0aHJvdyBGYWlsYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYDtcbn07JGjNj19vbmNlLmZyb21VbmlxdWVFbnRyaWVzKGZyb21VbmlxdWVFbnRyaWVzKTtcbmhhcmRlbihmcm9tVW5pcXVlRW50cmllcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC3lVPuJQgAACUIAAAlAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvaWRlbnQtY2hlY2tlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaWRlbnRDaGVja2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIFRPRE8gQ29tcGxldGUgbWlncmF0aW9uIG9mIENoZWNrZXIgdHlwZSBmcm9tIEBlbmRvL3Bhc3Mtc3R5bGUgdG8gQGVuZG8vY29tbW9uKi9cbi8qIGJ5IGhhdmluZyBAZW5kby9wYXNzLXN0eWxlLCBhbmQgZXZlcnlvbmUgZWxzZSB3aG8gbmVlZHMgaXQsIGltcG9ydCBpdCBmcm9tKi9cbi8qIGBAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qc2AuKi9cbi8qKlxuICogQGNhbGxiYWNrIENoZWNrZXJcbiAqIEludGVybmFsIHRvIGEgdXNlZnVsIHBhdHRlcm4gZm9yIHdyaXRpbmcgY2hlY2tpbmcgbG9naWNcbiAqIChhIFwiY2hlY2tGb29cIiBmdW5jdGlvbikgdGhhdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYSBwcmVkaWNhdGVcbiAqIChhbiBcImlzRm9vXCIgZnVuY3Rpb24pIG9yIGEgdmFsaWRhdG9yIChhbiBcImFzc2VydEZvb1wiIGZ1bmN0aW9uKS5cbiAqXG4gKiAgICAqIEEgcHJlZGljYXRlIGlkZWFsbHkgb25seSByZXR1cm5zIGB0cnVlYCBvciBgZmFsc2VgIGFuZCByYXJlbHkgdGhyb3dzLlxuICogICAgKiBBIHZhbGlkYXRvciB0aHJvd3MgYW4gaW5mb3JtYXRpdmUgZGlhZ25vc3RpYyB3aGVuIHRoZSBwcmVkaWNhdGVcbiAqICAgICAgd291bGQgaGF2ZSByZXR1cm5lZCBgZmFsc2VgLCBhbmQgc2ltcGx5IHJldHVybnMgYHVuZGVmaW5lZGAgbm9ybWFsbHlcbiAqICAgICAgd2hlbiB0aGUgcHJlZGljYXRlIHdvdWxkIGhhdmUgcmV0dXJuZWQgYHRydWVgLlxuICogICAgKiBUaGUgaW50ZXJuYWwgY2hlY2tpbmcgZnVuY3Rpb24gdGhhdCB0aGV5IHNoYXJlIGlzIHBhcmFtZXRlcml6ZWQgYnkgYVxuICogICAgICBgQ2hlY2tlcmAgdGhhdCBkZXRlcm1pbmVzIGhvdyB0byBwcm9jZWVkIHdpdGggYSBmYWlsdXJlIGNvbmRpdGlvbi5cbiAqICAgICAgUHJlZGljYXRlcyBwYXNzIGluIGFuIGlkZW50aXR5IGZ1bmN0aW9uIGFzIGNoZWNrZXIuIFZhbGlkYXRvcnNcbiAqICAgICAgcGFzcyBpbiBgYXNzZXJ0Q2hlY2tlcmAgd2hpY2ggaXMgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kIGBhc3NlcnRgLlxuICpcbiAqIFNlZSB0aGUgdmFyaW91cyB1c2VzIGZvciBnb29kIGV4YW1wbGVzLlxuICogQHBhcmFtIHtib29sZWFufSBjb25kXG4gKiBAcGFyYW0ge0lNUE9SVCgnc2VzJykuRGV0YWlsc30gW2RldGFpbHNdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEluIHRoZSBgYXNzZXJ0Rm9vYC9gaXNGb29gL2BjaGVja0Zvb2AgcGF0dGVybiwgYGNoZWNrRm9vYCBoYXMgYSBgY2hlY2tgXG4gKiBwYXJhbWV0ZXIgb2YgdHlwZSBgQ2hlY2tlcmAuIGBhc3NlcnRGb29gIGNhbGxzIGBjaGVja0Zvb2AgcGFzc2VzXG4gKiBgYXNzZXJ0Q2hlY2tlcmAgYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpc0Zvb2AgcGFzc2VzIGBpZGVudENoZWNrZXJgXG4gKiBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlkZW50Q2hlY2tlcmAgYWN0cyBwcmVjaXNlbHkgbGlrZSBhblxuICogaWRlbnRpdHkgZnVuY3Rpb24sIGJ1dCBpcyB0eXBlZCBhcyBhIGBDaGVja2VyYCB0byBpbmRpY2F0ZSBpdHNcbiAqIGludGVuZGVkIHVzZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuICAgICAgIGNvbnN0IGlkZW50Q2hlY2tlciA9IChjb25kLCBfZGV0YWlscykgPT4gY29uZDskaM2PX29uY2UuaWRlbnRDaGVja2VyKGlkZW50Q2hlY2tlcik7XG5oYXJkZW4oaWRlbnRDaGVja2VyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlkZW50Q2hlY2tlciI6WyJpZGVudENoZWNrZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYa/8argEAAC4BAAAJwAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL2xpc3QtZGlmZmVyZW5jZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibGlzdERpZmZlcmVuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyoqXG4gKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgcHJlc2VudCBpbiB0aGUgYGxlZnRMaXN0YCBhbmQgbm90XG4gKiBpbiB0aGUgYHJpZ2h0TGlzdGAuIFJldHVybiBpbiB0aGUgb3JkZXIgb2YgdGhlaXIgYXBwZWFyYW5jZSBpbiBgbGVmdExpc3RgLlxuICogVXNlcyB0aGUgY29tcGFyaXNvbiBidWlsdCBpbnRvIGBTZXRgIG1lbWJlcnNoaXAgKFNhbWVWYWx1ZVplcm8pXG4gKiB3aGljaCBpcyBsaWtlIEphdmFTY3JpcHQncyBgPT09YCBleGNlcHQgdGhhdCBpdCBqdWRnZXMgYW55IGBOYU5gIHRvXG4gKiBiZSB0aGUgc2FtZSBhcyBhbnkgYE5hTmAgYW5kIGl0IGp1ZGdlcyBgMGAgdG8gYmUgdGhlIHNhbWUgYSBgLTBgLlxuICpcbiAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCBvbiBsaXN0cyBvZiBuYW1lcyB0aGF0IHNob3VsZCBtYXRjaCwgaW4gb3JkZXIgdG8gZ2VuZXJhdGVcbiAqIHVzZWZ1bCBkaWFnbm9zdGljcyBhYm91dCB0aGUgdW5tYXRjaGVkIG5hbWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7YW55fSBWXG4gKiBAcGFyYW0ge1ZbXX0gbGVmdExpc3RcbiAqIEBwYXJhbSB7VltdfSByaWdodExpc3RcbiAqL1xuICAgICAgIGNvbnN0IGxpc3REaWZmZXJlbmNlID0gKGxlZnRMaXN0LCByaWdodExpc3QpID0+IHtcbiAgY29uc3QgcmlnaHRTZXQgPSBuZXcgU2V0KHJpZ2h0TGlzdCk7XG4gIHJldHVybiBsZWZ0TGlzdC5maWx0ZXIoZWxlbWVudCA9PiAhcmlnaHRTZXQuaGFzKGVsZW1lbnQpKTtcbn07JGjNj19vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJsaXN0RGlmZmVyZW5jZSI6WyJsaXN0RGlmZmVyZW5jZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAl7F33eQQAAHkEAAArAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvbWFrZS1hcnJheS1pdGVyYXRvci5qc3siaW1wb3J0cyI6WyIuL21ha2UtaXRlcmF0b3IuanMiXSwiZXhwb3J0cyI6WyJtYWtlQXJyYXlJdGVyYXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VJdGVyYXRvcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFrZS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUl0ZXJhdG9yXCIsWyRozY9fYSA9PiAobWFrZUl0ZXJhdG9yID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBBIGBoYXJkZW5gaW5nIGFuYWxvZyBvZiBBcnJheS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7QXJyYXk8VD59IGFyclxuICogQHJldHVybnMge0l0ZXJhYmxlSXRlcmF0b3I8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQXJyYXlJdGVyYXRvciA9IGFyciA9PiB7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBhcnI7XG4gIGxldCBpID0gMDtcbiAgcmV0dXJuIG1ha2VJdGVyYXRvcigoKSA9PiB7XG4gICAgLyoqIEB0eXBlIHtUfSAqL1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgdmFsdWUgPSBhcnJbaV07XG4gICAgICBpICs9IDE7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pO1xuICAgIH1cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFRoZSB0ZXJtaW5hbCB2YWx1ZSBkb2Vzbid0IG1hdHRlciovXG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlIH0pO1xuICB9KTtcbn07JGjNj19vbmNlLm1ha2VBcnJheUl0ZXJhdG9yKG1ha2VBcnJheUl0ZXJhdG9yKTtcbmhhcmRlbihtYWtlQXJyYXlJdGVyYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXJyYXlJdGVyYXRvciI6WyJtYWtlQXJyYXlJdGVyYXRvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABdNq96BgMAAAYDAAAlAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvbWFrZS1pdGVyYXRvci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZUl0ZXJhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qKlxuICogTWFrZXMgYSBvbmUtc2hvdCBpdGVyYWJsZSBpdGVyYXRvciBmcm9tIGEgcHJvdmlkZWQgYG5leHRgIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHsoKSA9PiBJdGVyYXRvclJlc3VsdDxUPn0gbmV4dFxuICogQHJldHVybnMge0l0ZXJhYmxlSXRlcmF0b3I8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlSXRlcmF0b3IgPSBuZXh0ID0+IHtcbiAgY29uc3QgaXRlciA9IGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IGl0ZXIsXG4gICAgbmV4dCxcbiAgfSk7XG4gIHJldHVybiBpdGVyO1xufTskaM2PX29uY2UubWFrZUl0ZXJhdG9yKG1ha2VJdGVyYXRvcik7XG5oYXJkZW4obWFrZUl0ZXJhdG9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VJdGVyYXRvciI6WyJtYWtlSXRlcmF0b3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAduerGW8KAABvCgAAIgAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL29iamVjdC1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtjb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQnkgYW5hbG9neSB3aXRoIGhvdyBgQXJyYXkucHJvdG90eXBlLm1hcGAgd2lsbCBtYXAgdGhlIGVsZW1lbnRzIG9mXG4gKiBhbiBhcnJheSB0byB0cmFuc2Zvcm1lZCBlbGVtZW50cyBvZiBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSxcbiAqIGBvYmplY3RNYXBgIHdpbGwgZG8gbGlrZXdpc2UgZm9yIHRoZSBzdHJpbmctbmFtZWQgb3duIGVudW1lcmFibGVcbiAqIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LlxuICpcbiAqIFR5cGljYWwgdXNhZ2UgYXBwbGllcyBgb2JqZWN0TWFwYCB0byBhIENvcHlSZWNvcmQsIGkuZS4sXG4gKiBhbiBvYmplY3QgZm9yIHdoaWNoIGBwYXNzU3R5bGVPZihvcmlnaW5hbCkgPT09ICdjb3B5UmVjb3JkJ2AuIEZvciB0aGVzZSxcbiAqIG5vbmUgb2YgdGhlIGZvbGxvd2luZyBlZGdlIGNhc2VzIGFyaXNlLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBDb3B5UmVjb3JkXG4gKiB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydHkgbmFtZXMsIHdob3NlIHZhbHVlcyBhcmUgdGhlIG1hcHBlZCBmb3JtIG9mXG4gKiB0aGUgb3JpZ2luYWwncyB2YWx1ZXMuXG4gKlxuICogV2hlbiB0aGUgb3JpZ2luYWwgaXMgbm90IGEgQ29weVJlY29yZCwgc29tZSBlZGdlIGNhc2VzIHRvIGJlIGF3YXJlIG9mXG4gKiAgICAqIE5vIG1hdHRlciBob3cgbXV0YWJsZSB0aGUgb3JpZ2luYWwgb2JqZWN0LCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzXG4gKiAgICAgIGhhcmRlbmVkLlxuICogICAgKiBPbmx5IHRoZSBzdHJpbmctbmFtZWQgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZiB0aGUgb3JpZ2luYWxcbiAqICAgICAgYXJlIG1hcHBlZC4gQWxsIG90aGVyIHByb3BlcnRpZXMgYXJlIGlnbm9yZWQuXG4gKiAgICAqIElmIGFueSBvZiB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyB3ZXJlIGFjY2Vzc29ycywgYE9iamVjdC5lbnRyaWVzYFxuICogICAgICB3aWxsIGNhdXNlIGl0cyBgZ2V0dGVyYCB0byBiZSBjYWxsZWQgYW5kIHdpbGwgdXNlIHRoZSByZXN1bHRpbmdcbiAqICAgICAgdmFsdWUuXG4gKiAgICAqIE5vIG1hdHRlciB3aGV0aGVyIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSB3YXMgYW4gYWNjZXNzb3IsIHdyaXRhYmxlLFxuICogICAgICBvciBjb25maWd1cmFibGUsIGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqICAgICAgbm9uLXdyaXRhYmxlLCBub24tY29uZmlndXJhYmxlLCBkYXRhIHByb3BlcnRpZXMuXG4gKiAgICAqIE5vIG1hdHRlciB3aGF0IHRoZSBvcmlnaW5hbCBvYmplY3QgbWF5IGhhdmUgaW5oZXJpdGVkIGZyb20sIGFuZFxuICogICAgICBubyBtYXR0ZXIgd2hldGhlciBpdCB3YXMgYSBzcGVjaWFsIGtpbmQgb2Ygb2JqZWN0IHN1Y2ggYXMgYW4gYXJyYXksXG4gKiAgICAgIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgYSBwbGFpbiBvYmplY3QgaW5oZXJpdGluZyBkaXJlY3RseVxuICogICAgICBmcm9tIGBPYmplY3QucHJvdG90eXBlYCBhbmQgd2hvc2Ugc3RhdGUgaXMgb25seSB0aGVzZSBuZXcgbWFwcGVkXG4gKiAgICAgIG93biBwcm9wZXJ0aWVzLlxuICpcbiAqIFdpdGggdGhlc2UgZGlmZmVyZW5jZXMsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIG9iamVjdCB3YXMgbm90IGEgQ29weVJlY29yZCxcbiAqIGlmIGFsbCB0aGUgbWFwcGVkIHZhbHVlcyBhcmUgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiBhIENvcHlSZWNvcmQuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBPXG4gKiBAdGVtcGxhdGUgUiBtYXAgcmVzdWx0XG4gKiBAcGFyYW0ge099IG9yaWdpbmFsXG4gKiBAcGFyYW0geyh2YWx1ZTogT1trZXlvZiBPXSwga2V5OiBrZXlvZiBPKSA9PiBSfSBtYXBGblxuICogQHJldHVybnMge1JlY29yZDxrZXlvZiBPLCBSPn1cbiAqL1xuICAgICAgIGNvbnN0IG9iamVjdE1hcCA9IChvcmlnaW5hbCwgbWFwRm4pID0+IHtcbiAgY29uc3QgZW50cyA9IGVudHJpZXMob3JpZ2luYWwpO1xuICBjb25zdCBtYXBFbnRzID0gZW50cy5tYXAoXG4gICAgKFtrLCB2XSkgPT4gLyoqIEB0eXBlIHtba2V5b2YgTywgUl19ICovIChbaywgbWFwRm4odiwgayldKSxcbiAgKTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPGtleW9mIE8sIFI+fSAqLyAoaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKSk7XG59OyRozY9fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAComiDaOwkAADsJAAAnAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1ldGEtbWFwLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJvYmplY3RNZXRhTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO2NvbnN0IHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgY3JlYXRlLCBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIExpa2UgYG9iamVjdE1hcGAsIGJ1dCBhdCB0aGUgcmVmbGVjdGl2ZSBsZXZlbCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9yc1xuICogcmF0aGVyIHRoYW4gcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqIEV4Y2VwdCBmb3IgaGFyZGVuaW5nLCB0aGUgZWRnZSBjYXNlIGJlaGF2aW9yIGlzIG1vc3RseSB0aGUgb3Bwb3NpdGUgb2ZcbiAqIHRoZSBgb2JqZWN0TWFwYCBlZGdlIGNhc2VzLlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogQWxsIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbCBhcmUgbWFwcGVkLCBldmVuIGlmIHN5bWJvbC1uYW1lZFxuICogICAgICBvciBub24tZW51bWVyYWJsZS5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCB0aGUgZGVzY3JpcHRvclxuICogICAgICBjb250YWluaW5nIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhcmUgZ2l2ZW4gdG8gYG1ldGFNYXBGbmAuXG4gKiAgICAqIFRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgcmV0dXJuZWQgYXJlIGFjY29yZGluZyB0byB0aGUgZGVzY3JpcHRvcnNcbiAqICAgICAgcmV0dXJuZWQgYnkgYG1ldGFNYXBGbmAuXG4gKiAgICAqIFRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgYSBwbGFpbiBvYmplY3Qgd2hvc2Ugc3RhdGUgaXNcbiAqICAgICAgb25seSB0aGVzZSBtYXBwZWQgb3duIHByb3BlcnRpZXMuIEl0IHdpbGwgaW5oZXJpdCBmcm9tIHRoZSB0aGlyZFxuICogICAgICBhcmd1bWVudCBpZiBwcm92aWRlZCwgZGVmYXVsdGluZyB0byBgT2JqZWN0LnByb3RvdHlwZWAgaWYgb21pdHRlZC5cbiAqXG4gKiBCZWNhdXNlIGEgcHJvcGVydHkgZGVzY3JpcHRvciBpcyBkaXN0aW5jdCBmcm9tIGB1bmRlZmluZWRgLCB3ZSBidW5kbGVcbiAqIG1hcHBpbmcgYW5kIGZpbHRlcmluZyB0b2dldGhlci4gV2hlbiB0aGUgYG1ldGFNYXBGbmAgcmV0dXJucyBgdW5kZWZpbmVkYCxcbiAqIHRoYXQgcHJvcGVydHkgaXMgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIGFueT59IE9cbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEBwYXJhbSB7KFxuICogICBkZXNjOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxPW2tleW9mIE9dPixcbiAqICAga2V5OiBrZXlvZiBPXG4gKiApID0+IChQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQpfSBtZXRhTWFwRm5cbiAqIEBwYXJhbSB7YW55fSBbcHJvdG9dXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG4gICAgICAgY29uc3Qgb2JqZWN0TWV0YU1hcCA9IChcbiAgb3JpZ2luYWwsXG4gIG1ldGFNYXBGbixcbiAgcHJvdG8gPSBPYmplY3QucHJvdG90eXBlLFxuKSA9PiB7XG4gIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvcmlnaW5hbCk7XG4gIGNvbnN0IGtleXMgPSBvd25LZXlzKG9yaWdpbmFsKTtcblxuICBjb25zdCBkZXNjRW50cmllcyA9IC8qKiBAdHlwZSB7W1Byb3BlcnR5S2V5LFByb3BlcnR5RGVzY3JpcHRvcl1bXX0gKi8gKFxuICAgIGtleXNcbiAgICAgIC5tYXAoa2V5ID0+IFtrZXksIG1ldGFNYXBGbihkZXNjc1trZXldLCBrZXkpXSlcbiAgICAgIC5maWx0ZXIoKFtfa2V5LCBvcHREZXNjXSkgPT4gb3B0RGVzYyAhPT0gdW5kZWZpbmVkKVxuICApO1xuICByZXR1cm4gaGFyZGVuKGNyZWF0ZShwcm90bywgZnJvbUVudHJpZXMoZGVzY0VudHJpZXMpKSk7XG59OyRozY9fb25jZS5vYmplY3RNZXRhTWFwKG9iamVjdE1ldGFNYXApO1xuaGFyZGVuKG9iamVjdE1ldGFNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsib2JqZWN0TWV0YU1hcCI6WyJvYmplY3RNZXRhTWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANizQYKZBQAAmQUAACUAAABAZW5kby9jb21tb24tdjEuMi4xMy90aHJvdy1sYWJlbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbInRocm93TGFiZWxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsbWFrZUVycm9yLGFubm90YXRlRXJyb3I7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogR2l2ZW4gYW4gZXJyb3IgYGlubmVyRXJyYCBhbmQgYSBgbGFiZWxgLCB0aHJvd3MgYSBzaW1pbGFyXG4gKiBlcnJvciB3aG9zZSBtZXNzYWdlIHN0cmluZyBpcyBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLlxuICogU2VlIGBhcHBseUxhYmVsaW5nRXJyb3JgIGZvciB0aGUgbW90aXZhdGluZyB1c2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7SU1QT1JUKCdzZXMnKS5HZW5lcmljRXJyb3JDb25zdHJ1Y3Rvcn0gW2VyckNvbnN0cnVjdG9yXVxuICogQHBhcmFtIHtJTVBPUlQoJ3NlcycpLkFzc2VydE1ha2VFcnJvck9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge25ldmVyfVxuICovXG4gICAgICAgY29uc3QgdGhyb3dMYWJlbGVkID0gKFxuICBpbm5lckVycixcbiAgbGFiZWwsXG4gIGVyckNvbnN0cnVjdG9yID0gdW5kZWZpbmVkLFxuICBvcHRpb25zID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGlmICh0eXBlb2YgbGFiZWwgPT09ICdudW1iZXInKSB7XG4gICAgbGFiZWwgPSBgWyR7bGFiZWx9XWA7XG4gIH1cbiAgY29uc3Qgb3V0ZXJFcnIgPSBtYWtlRXJyb3IoXG4gICAgYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YCxcbiAgICBlcnJDb25zdHJ1Y3RvcixcbiAgICBvcHRpb25zLFxuICApO1xuICBhbm5vdGF0ZUVycm9yKG91dGVyRXJyLCBYYENhdXNlZCBieSAke2lubmVyRXJyfWApO1xuICB0aHJvdyBvdXRlckVycjtcbn07JGjNj19vbmNlLnRocm93TGFiZWxlZCh0aHJvd0xhYmVsZWQpO1xuaGFyZGVuKHRocm93TGFiZWxlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0aHJvd0xhYmVsZWQiOlsidGhyb3dMYWJlbGVkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADSioamiAQAAogEAACIAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZW52LW9wdGlvbnMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvAEzgjgWAAA4FgAALAAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvc3JjL2Vudi1vcHRpb25zLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIiwiZ2V0RW52aXJvbm1lbnRPcHRpb24iLCJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0IiwibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4vKiBAdHMtY2hlY2sqL1xuXG4vKiBgQGVuZG8vZW52LW9wdGlvbnNgIG5lZWRzIHRvIGJlIGltcG9ydGVkIHF1aXRlIGVhcmx5LCBhbmQgc28gc2hvdWxkKi9cbi8qIGF2b2lkIGltcG9ydGluZyBmcm9tIHNlcyBvciBhbnl0aGluZyB0aGF0IGRlcGVuZHMgb24gc2VzLiovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cbi8qIFByZWx1ZGUgb2YgY2hlYXAgZ29vZCAtIGVub3VnaCBpbWl0YXRpb25zIG9mIHRoaW5ncyB3ZSdkIHVzZSBvciovXG4vKiBkbyBkaWZmZXJlbnRseSBpZiB3ZSBjb3VsZCBkZXBlbmQgb24gc2VzKi9cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG5jb25zdCBsb2NhbFRoaXMgPSBnbG9iYWxUaGlzO1xuXG5jb25zdCB7IE9iamVjdCwgUmVmbGVjdCwgQXJyYXksIFN0cmluZywgSlNPTiwgRXJyb3IgfSA9IGxvY2FsVGhpcztcbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vKiBTaG91bGQgYmUgZXF1aXZhbGVudCB0byB0aGUgb25lIGluIHNlcycgY29tbW9ucy5qcyBldmVuIHRob3VnaCBpdCovXG4vKiB1c2VzIHRoZSBvdGhlciB0ZWNobmlxdWUuKi9cbmNvbnN0IHVuY3VycnlUaGlzID1cbiAgZm4gPT5cbiAgKHJlY2VpdmVyLCAuLi5hcmdzKSA9PlxuICAgIGFwcGx5KGZuLCByZWNlaXZlciwgYXJncyk7XG5jb25zdCBhcnJheVB1c2ggPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUucHVzaCk7XG5jb25zdCBhcnJheUluY2x1ZGVzID0gdW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKTtcbmNvbnN0IHN0cmluZ1NwbGl0ID0gdW5jdXJyeVRoaXMoU3RyaW5nLnByb3RvdHlwZS5zcGxpdCk7XG5cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuY29uc3QgRmFpbCA9IChsaXRlcmFscywgLi4uYXJncykgPT4ge1xuICBsZXQgbXNnID0gbGl0ZXJhbHNbMF07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIG1zZyA9IGAke21zZ30ke2FyZ3NbaV19JHtsaXRlcmFsc1tpICsgMV19YDtcbiAgfVxuICB0aHJvdyBFcnJvcihtc2cpO1xufTtcblxuLyogZW5kIHByZWx1ZGUqL1xuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIGBtYWtlRW52aXJvbm1lbnRDYXB0b3JgIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBnZXR0aW5nIGVudmlyb25tZW50XG4gKiB2YXJpYWJsZXMsIGlmIHRoZXkgYXJlIG5lZWRlZCwgYW5kIGEgd2F5IHRvIGNhdGFsb2cgdGhlIG5hbWVzIG9mIGFsbFxuICogdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IHdlcmUgY2FwdHVyZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFHbG9iYWxcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Ryb3BOYW1lc10gRGVmYXVsdHMgdG8gZmFsc2UuIElmIHRydWUsIGRvbid0IHRyYWNrXG4gKiBuYW1lcyB1c2VkLlxuICovXG4gICAgICAgY29uc3QgbWFrZUVudmlyb25tZW50Q2FwdG9yID0gKGFHbG9iYWwsIGRyb3BOYW1lcyA9IGZhbHNlKSA9PiB7XG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9IFtdO1xuXG4gIC8qKlxuICogR2V0cyBhbiBlbnZpcm9ubWVudCBvcHRpb24gYnkgbmFtZSBhbmQgcmV0dXJucyB0aGUgb3B0aW9uIHZhbHVlIG9yIHRoZVxuICogZ2l2ZW4gZGVmYXVsdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGRlZmF1bHRTZXR0aW5nXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3B0T3RoZXJWYWx1ZXNdXG4gKiBJZiBwcm92aWRlZCwgdGhlIG9wdGlvbiB2YWx1ZSBtdXN0IGJlIGluY2x1ZGVkIG9yIG1hdGNoIGBkZWZhdWx0U2V0dGluZ2AuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG4gIGNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uID0gKFxuICAgIG9wdGlvbk5hbWUsXG4gICAgZGVmYXVsdFNldHRpbmcsXG4gICAgb3B0T3RoZXJWYWx1ZXMgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgIHR5cGVvZiBvcHRpb25OYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZSAke3Eob3B0aW9uTmFtZSl9IG11c3QgYmUgYSBzdHJpbmcuYDtcbiAgICB0eXBlb2YgZGVmYXVsdFNldHRpbmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBkZWZhdWx0IHNldHRpbmcgJHtxKFxuICAgICAgICBkZWZhdWx0U2V0dGluZyxcbiAgICAgICl9IG11c3QgYmUgYSBzdHJpbmcuYDtcblxuICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgIGxldCBzZXR0aW5nID0gZGVmYXVsdFNldHRpbmc7XG4gICAgY29uc3QgZ2xvYmFsUHJvY2VzcyA9IGFHbG9iYWwucHJvY2VzcyB8fCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZ2xvYmFsRW52ID1cbiAgICAgICh0eXBlb2YgZ2xvYmFsUHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgZ2xvYmFsUHJvY2Vzcy5lbnYpIHx8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGdsb2JhbEVudiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChvcHRpb25OYW1lIGluIGdsb2JhbEVudikge1xuICAgICAgICBpZiAoIWRyb3BOYW1lcykge1xuICAgICAgICAgIGFycmF5UHVzaChjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsIG9wdGlvbk5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gZ2xvYmFsRW52W29wdGlvbk5hbWVdO1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCovXG4gICAgICAgIHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lZCAke3EoXG4gICAgICAgICAgICBvcHRpb25OYW1lLFxuICAgICAgICAgICl9LCBpZiBwcmVzZW50LCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHN0cmluZyB2YWx1ZSwgZ290ICR7cShcbiAgICAgICAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgc2V0dGluZyA9IG9wdGlvblZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBvcHRPdGhlclZhbHVlcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBzZXR0aW5nID09PSBkZWZhdWx0U2V0dGluZyB8fFxuICAgICAgYXJyYXlJbmNsdWRlcyhvcHRPdGhlclZhbHVlcywgc2V0dGluZykgfHxcbiAgICAgIEZhaWxgVW5yZWNvZ25pemVkICR7cShvcHRpb25OYW1lKX0gdmFsdWUgJHtxKFxuICAgICAgICBzZXR0aW5nLFxuICAgICAgKX0uIEV4cGVjdGVkIG9uZSBvZiAke3EoW2RlZmF1bHRTZXR0aW5nLCAuLi5vcHRPdGhlclZhbHVlc10pfWA7XG4gICAgcmV0dXJuIHNldHRpbmc7XG4gIH07XG4gIGZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbik7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gW1Q9c3RyaW5nXVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbiAgY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCA9IG9wdGlvbk5hbWUgPT4ge1xuICAgIGNvbnN0IG9wdGlvbiA9IGdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsICcnKTtcbiAgICByZXR1cm4gZnJlZXplKG9wdGlvbiA9PT0gJycgPyBbXSA6IHN0cmluZ1NwbGl0KG9wdGlvbiwgJywnKSk7XG4gIH07XG4gIGZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBbVD1zdHJpbmddXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHBhcmFtIHtUfSBlbGVtZW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzID0gKG9wdGlvbk5hbWUsIGVsZW1lbnQpID0+XG4gICAgYXJyYXlJbmNsdWRlcyhnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KG9wdGlvbk5hbWUpLCBlbGVtZW50KTtcblxuICBjb25zdCBnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIGZyZWV6ZShbLi4uY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzXSk7XG4gIH07XG4gIGZyZWV6ZShnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMpO1xuXG4gIHJldHVybiBmcmVlemUoe1xuICAgIGdldEVudmlyb25tZW50T3B0aW9uLFxuICAgIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gICAgZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyxcbiAgICBnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUVudmlyb25tZW50Q2FwdG9yKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG5mcmVlemUobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcblxuLyoqXG4gKiBGb3IgdGhlIHNpbXBsZSBjYXNlLCB3aGVyZSB0aGUgZ2xvYmFsIGluIHF1ZXN0aW9uIGlzIGBnbG9iYWxUaGlzYCBhbmQgbm9cbiAqIHJlcG9ydGluZyBvZiBvcHRpb24gbmFtZXMgaXMgZGVzaXJlZC5cbiAqL1xuICAgICAgIGNvbnN0IHtcbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG59ID0gbWFrZUVudmlyb25tZW50Q2FwdG9yKGxvY2FsVGhpcywgdHJ1ZSk7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uKGdldEVudmlyb25tZW50T3B0aW9uKTskaM2PX29uY2UuZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdChnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTskaM2PX29uY2UuZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyhlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbnZpcm9ubWVudENhcHRvciI6WyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwiZ2V0RW52aXJvbm1lbnRPcHRpb24iOlsiZ2V0RW52aXJvbm1lbnRPcHRpb24iXSwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCI6WyJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0Il0sImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABqZnbiZA0AAGQNAAAdAAAAQGVuZG8vZXJyb3JzLXYxLjIuMTMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkZhaWwiLCJYIiwiYW5ub3RhdGVFcnJvciIsImFzc2VydCIsImIiLCJiYXJlIiwibWFrZUVycm9yIiwibm90ZSIsInEiLCJxdW90ZSIsInJlZGFjdGVkIiwidGhyb3dSZWRhY3RlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogVGhpcyBtb2R1bGUgYXNzdW1lcyB0aGUgZXhpc3RlbmNlIG9mIGEgbm9uLXN0YW5kYXJkIGBhc3NlcnRgIGhvc3Qgb2JqZWN0LiovXG4vKiBTRVMgdmVyc2lvbiAwLjExLjAgaW50cm9kdWNlcyB0aGlzIGdsb2JhbCBvYmplY3QgYW5kIGVudGFuZ2xlcyBpdCovXG4vKiB3aXRoIHRoZSBgY29uc29sZWAgaG9zdCBvYmplY3QgaW4gc2NvcGUgd2hlbiBpdCBpbml0aWFsaXplcywqL1xuLyogYWxsb3dpbmcgZXJyb3JzLCBwYXJ0aWN1bGFybHkgYXNzZXJ0aW9uIGVycm9ycywgdG8gaGlkZSB0aGVpciBcImRldGFpbHNcIiovXG4vKiBmcm9tIGNhbGxlcnMgdGhhdCBtaWdodCBjYXRjaCB0aG9zZSBlcnJvcnMsIHRoZW4gcmV2ZWFsIHRoZW0gdG8gdGhlKi9cbi8qIHVuZGVybHlpbmcgY29uc29sZS4qL1xuLyogVG8gdGhlIGV4dGVudCB0aGF0IHRoaXMgYGNvbnNvbGVgIGlzIGNvbnNpZGVyZWQgYSByZXNvdXJjZSwqL1xuLyogdGhpcyBtb2R1bGUgbXVzdCBiZSBjb25zaWRlcmVkIGEgcmVzb3VyY2UgbW9kdWxlLiovXG5cbi8qIFRoZSBhc3NlcnRpb25zIHJlLWV4cG9ydGVkIGhlcmUgYXJlIGRlZmluZWQgaW4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvSEVBRC9wYWNrYWdlcy9zZXMvc3JjL2Vycm9yL2Fzc2VydC5qcyovXG5cbmNvbnN0IGdsb2JhbEFzc2VydCA9IGdsb2JhbFRoaXMuYXNzZXJ0O1xuXG5pZiAoZ2xvYmFsQXNzZXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgdGhyb3cgRXJyb3IoXG4gICAgYENhbm5vdCBpbml0aWFsaXplIEBlbmRvL2Vycm9ycywgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCwgaW1wb3J0ICdzZXMnIGJlZm9yZSAnQGVuZG8vZXJyb3JzJ2AsXG4gICk7XG59XG5cbmNvbnN0IG1pc3NpbmcgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoW1xuICAndHlwZW9mJyxcbiAgJ2Vycm9yJyxcbiAgJ2ZhaWwnLFxuICAnZXF1YWwnLFxuICAnc3RyaW5nJyxcbiAgJ25vdGUnLFxuICAnZGV0YWlscycsXG4gICdGYWlsJyxcbiAgJ3F1b3RlJyxcbiAgLyogQXMgb2YgMjAyNC0wMiwgdGhlIEFnb3JpYyBjaGFpbidzIGJvb3RzdHJhcCB2YXQgcnVucyB3aXRoIGEgdmVyc2lvbiBvZiBTRVMgdGhhdCovXG4gIC8qIHByZWRhdGVzIGFkZGl0aW9uIG9mIHRoZSAnYmFyZScgbWV0aG9kLCBzbyB3ZSBtdXN0IHRvbGVyYXRlIGl0cyBhYnNlbmNlIGFuZCBmYWxsKi9cbiAgLyogYmFjayB0byBxdW90ZSBiZWhhdmlvciBpbiB0aGF0IGVudmlyb25tZW50IChzZWUgYmVsb3cpLiovXG4gIC8qICdiYXJlJywqL1xuICAnbWFrZUFzc2VydCcsXG5dKS5maWx0ZXIobmFtZSA9PiBnbG9iYWxBc3NlcnRbbmFtZV0gPT09IHVuZGVmaW5lZCk7XG5pZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbiAgICAgICcsICcsXG4gICAgKX1gLFxuICApO1xufVxuXG4vKiBUaGUgZ2xvYmFsIGFzc2VydCBtaXhlZCBhc3NlcnRpb25zIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucy4qL1xuLyogVGhpcyBtb2R1bGUgc3BsaXRzIHRoZW0gYXBhcnQqL1xuLyogYW5kIGFsc28gdXBkYXRlcyB0aGUgbmFtZXMgb2YgdGhlIHV0aWxpdHkgZnVuY3Rpb25zLiovXG5jb25zdCB7XG4gIGJhcmUsXG4gIGRldGFpbHM6IHJlZGFjdGVkLFxuICBlcnJvcjogbWFrZUVycm9yLFxuICBGYWlsOiB0aHJvd1JlZGFjdGVkLFxuICBtYWtlQXNzZXJ0OiBfb21pdHRlZE1ha2VBc3NlcnQsXG4gIG5vdGUsXG4gIHF1b3RlLFxuICAuLi5hc3NlcnRpb25zXG59ID0gZ2xvYmFsQXNzZXJ0O1xuLyoqIEB0eXBlIHtJTVBPUlQoXCJzZXNcIikuQXNzZXJ0aW9uRnVuY3Rpb25zIH0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgbWlzc2luZyBwcm9wZXJ0aWVzIGFzc2lnbmVkIG5leHQqLyRozY9fb25jZS5yZWRhY3RlZChyZWRhY3RlZCk7JGjNj19vbmNlLm1ha2VFcnJvcihtYWtlRXJyb3IpOyRozY9fb25jZS50aHJvd1JlZGFjdGVkKHRocm93UmVkYWN0ZWQpOyRozY9fb25jZS5ub3RlKG5vdGUpOyRozY9fb25jZS5xdW90ZShxdW90ZSk7XG5jb25zdCBhc3NlcnQgPSAodmFsdWUsIG9wdERldGFpbHMsIGVyckNvbnRydWN0b3IsIG9wdGlvbnMpID0+XG4gIGdsb2JhbEFzc2VydCh2YWx1ZSwgb3B0RGV0YWlscywgZXJyQ29udHJ1Y3Rvciwgb3B0aW9ucyk7JGjNj19vbmNlLmFzc2VydChhc3NlcnQpO1xuT2JqZWN0LmFzc2lnbihhc3NlcnQsIGFzc2VydGlvbnMpO1xuXG4vKiBBcyBvZiAyMDI0LTAyLCB0aGUgQWdvcmljIGNoYWluJ3MgYm9vdHN0cmFwIHZhdCBydW5zIHdpdGggYSB2ZXJzaW9uIG9mIFNFUyovXG4vKiB0aGF0IHByZWRhdGVzIHRoZSBhZGRpdGlvbiBvZiB0aGUgJ2JhcmUnIG1ldGhvZCwgc28gd2UgbXVzdCBmYWxsIGJhY2sgdG8qL1xuLyogcXVvdGUgYmVoYXZpb3IgZm9yIHRoYXQgZW52aXJvbm1lbnQuKi9cbmNvbnN0IGJhcmVPclF1b3RlID0gYmFyZSB8fCBxdW90ZTtcblxuLyogWFhYIG1vZHVsZSBleHBvcnRzIGZhaWwgaWYgdGhlc2UgYXJlbid0IGluIHNjb3BlKi9cbi8qKiBAaW1wb3J0IHtBc3NlcnRNYWtlRXJyb3JPcHRpb25zLCBEZXRhaWxzLCBHZW5lcmljRXJyb3JDb25zdHJ1Y3Rvcn0gZnJvbSAnc2VzJyAqLyRozY9fb25jZS5iYXJlT3JRdW90ZShiYXJlT3JRdW90ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWRhY3RlZCI6WyJyZWRhY3RlZCJdLCJYIjpbInJlZGFjdGVkIl0sIm1ha2VFcnJvciI6WyJtYWtlRXJyb3IiXSwidGhyb3dSZWRhY3RlZCI6WyJ0aHJvd1JlZGFjdGVkIl0sIkZhaWwiOlsidGhyb3dSZWRhY3RlZCJdLCJub3RlIjpbIm5vdGUiXSwiYW5ub3RhdGVFcnJvciI6WyJub3RlIl0sInF1b3RlIjpbInF1b3RlIl0sInEiOlsicXVvdGUiXSwiYXNzZXJ0IjpbImFzc2VydCJdLCJiYXJlIjpbImJhcmVPclF1b3RlIl0sImIiOlsiYmFyZU9yUXVvdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0+lGCBBHAAAQRwAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9FLmpzeyJpbXBvcnRzIjpbIi4vdHJhY2stdHVybnMuanMiLCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHJhY2tUdXJucyxtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsWyRozY9fYSA9PiAodHJhY2tUdXJucyA9ICRozY9fYSldXV1dLFtcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsWyRozY9fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsLCBlcnJvcjogbWFrZUVycm9yIH0gPSBhc3NlcnQ7XG5jb25zdCB7IGFzc2lnbiwgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQGltcG9ydCB7IEhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3IsIFJlbW90YWJsZUJyYW5kLCBDYWxsYWJsZSwgU2V0dGxlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IG9uU2VuZCA9IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcignRU5ET19TRU5EX0JSRUFLUE9JTlRTJyk7XG5cbi8qKiBAdHlwZSB7UHJveHlIYW5kbGVyPGFueT59ICovXG5jb25zdCBiYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyID0ge1xuICBzZXQoX3RhcmdldCwgX3Byb3AsIF92YWx1ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgaXNFeHRlbnNpYmxlKF90YXJnZXQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHNldFByb3RvdHlwZU9mKF90YXJnZXQsIF92YWx1ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZGVsZXRlUHJvcGVydHkoX3RhcmdldCwgX3Byb3ApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG59O1xuXG4vKiBFIFByb3h5IGhhbmRsZXJzIHByZXRlbmQgdGhhdCBhbnkgcHJvcGVydHkgZXhpc3RzIG9uIHRoZSB0YXJnZXQgYW5kIHJldHVybnMqL1xuLyogYSBmdW5jdGlvbiBmb3IgdGhlaXIgdmFsdWUuIFdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgXCJib3VuZFwiIGJ5IGNvbnRleHQsIGl0IGlzKi9cbi8qIG1lYW50IHRvIGJlIGNhbGxlZCBhcyBhIG1ldGhvZC4gRm9yIHRoYXQgcmVhc29uLCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24qL1xuLyogaW5jbHVkZXMgYSBjaGVjayB0aGF0IHRoZSBgdGhpc2AgYXJndW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIGluaXRpYWwqL1xuLyogcmVjZWl2ZXIgd2hlbiB0aGUgZnVuY3Rpb24gd2FzIHJldHJpZXZlZC4qL1xuLyogRSBQcm94eSBoYW5kbGVycyBhbHNvIGZvcndhcmQgZGlyZWN0IGNhbGxzIHRvIHRoZSB0YXJnZXQgaW4gY2FzZSB0aGUgcmVtb3RlKi9cbi8qIGlzIGEgZnVuY3Rpb24gaW5zdGVhZCBvZiBhbiBvYmplY3QuIE5vIHN1Y2ggcmVjZWl2ZXIgY2hlY2tzIGFyZSBuZWNlc3NhcnkgaW4qL1xuLyogdGhhdCBjYXNlLiovXG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFKHgpLlxuICpcbiAqIEBwYXJhbSB7YW55fSByZWNpcGllbnQgQW55IHZhbHVlIHBhc3NlZCB0byBFKHgpXG4gKiBAcGFyYW0ge0hhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyPHVua25vd24+fSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRVByb3h5SGFuZGxlciA9IChyZWNpcGllbnQsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcGVydHlLZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKFxuICAgICAgICB7XG4gICAgICAgICAgLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuICAgICAgICAgIC8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4gICAgICAgICAgLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbiAgICAgICAgICAvKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG4gICAgICAgICAgLyoqIEB0eXBlIHsoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8dW5rbm93bj59ICovXG4gICAgICAgICAgW3Byb3BlcnR5S2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAodGhpcyAhPT0gcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgLyogUmVqZWN0IHRoZSBhc3luYyBmdW5jdGlvbiBjYWxsKi9cbiAgICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgICBtYWtlRXJyb3IoXG4gICAgICAgICAgICAgICAgICBYYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKHByb3BlcnR5S2V5KX1cIiBtZXRob2Qgb2YgRSgke3EoXG4gICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudCxcbiAgICAgICAgICAgICAgICAgICl9KWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuICAgICAgICAgICAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgbWV0aG9kLWNhbGwqL1xuICAgICAgICAgICAgICAvKiBtZXNzYWdlLCovXG4gICAgICAgICAgICAgIC8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4gICAgICAgICAgICAgIC8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZChyZWNpcGllbnQsIHByb3BlcnR5S2V5LCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki9cbiAgICAgICAgfVtwcm9wZXJ0eUtleV0sXG4gICAgICApO1xuICAgIH0sXG4gICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJnQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICAgICAgZGVidWdnZXI7IC8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbiAgICAgICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIGZ1bmN0aW9uLWNhbGwgbWVzc2FnZSwqL1xuICAgICAgICAvKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuICAgICAgICAvKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gICAgICB9XG4gICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ0FycmF5KTtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvKiBXZSBqdXN0IHByZXRlbmQgZXZlcnl0aGluZyBleGlzdHMuKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0pO1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHthbnl9IHJlY2lwaWVudCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUuc2VuZE9ubHkoeClcbiAqIEBwYXJhbSB7SGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXI8dW5rbm93bj59IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbiAgICAgICAgICAvKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuICAgICAgICAgIC8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4gICAgICAgICAgLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuICAgICAgICAgIC8qKiBAdHlwZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiB1bmRlZmluZWR9ICovXG4gICAgICAgICAgW3Byb3BlcnR5S2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICAvKiBUaHJvdyBzaW5jZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBub3RoaW5nKi9cbiAgICAgICAgICAgIHRoaXMgPT09IHJlY2VpdmVyIHx8XG4gICAgICAgICAgICAgIEZhaWxgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EoXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgICAgICl9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKHJlY2lwaWVudCl9KWA7XG4gICAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgICAgICAgICAgIGRlYnVnZ2VyOyAvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4gICAgICAgICAgICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBtZXRob2QtY2FsbCovXG4gICAgICAgICAgICAgIC8qIG1lc3NhZ2UsKi9cbiAgICAgICAgICAgICAgLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbiAgICAgICAgICAgICAgLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2RTZW5kT25seShyZWNpcGllbnQsIHByb3BlcnR5S2V5LCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovXG4gICAgICAgIH1bcHJvcGVydHlLZXldLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIGFyZ3NBcnJheSA9IFtdKSA9PiB7XG4gICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgICAgICBkZWJ1Z2dlcjsgLyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuICAgICAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgZnVuY3Rpb24tY2FsbCBtZXNzYWdlLCovXG4gICAgICAgIC8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4gICAgICAgIC8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiAgICAgIH1cbiAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seShyZWNpcGllbnQsIGFyZ3NBcnJheSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgaGFzOiAoX3RhcmdldCwgX3ApID0+IHtcbiAgICAgIC8qIFdlIGp1c3QgcHJldGVuZCB0aGF0IGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUuZ2V0KHgpXG4gKiBJdCBpcyBhIHZhcmlhbnQgb24gdGhlIEUoeCkgUHJveHkgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0ge2FueX0geCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUuZ2V0KHgpXG4gKiBAcGFyYW0ge0hhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyPHVua25vd24+fSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRUdldFByb3h5SGFuZGxlciA9ICh4LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGhhczogKF90YXJnZXQsIF9wcm9wKSA9PiB0cnVlLFxuICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IEhhbmRsZWRQcm9taXNlLmdldCh4LCBwcm9wKSxcbiAgfSk7XG5cbi8qKlxuICogYGZyZWV6ZWAgYnV0IG5vdCBgaGFyZGVuYCB0aGUgcHJveHkgdGFyZ2V0IHNvIGl0IHJlbWFpbnMgdHJhcHBpbmcuXG4gKiBUaHVzLCBpdCBzaG91bGQgbm90IGJlIHNoYXJlZCBvdXRzaWRlIHRoaXMgbW9kdWxlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9kb2NzL3ByZXBhcmluZy1mb3Itc3RhYmlsaXplLm1kXG4gKi9cbmNvbnN0IGZ1bmNUYXJnZXQgPSBmcmVlemUoKCkgPT4ge30pO1xuXG4vKipcbi8qKlxuICogYGZyZWV6ZWAgYnV0IG5vdCBgaGFyZGVuYCB0aGUgcHJveHkgdGFyZ2V0IHNvIGl0IHJlbWFpbnMgdHJhcHBpbmcuXG4gKiBUaHVzLCBpdCBzaG91bGQgbm90IGJlIHNoYXJlZCBvdXRzaWRlIHRoaXMgbW9kdWxlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9kb2NzL3ByZXBhcmluZy1mb3Itc3RhYmlsaXplLm1kXG4gKi9cbmNvbnN0IG9ialRhcmdldCA9IGZyZWV6ZSh7IF9fcHJvdG9fXzogbnVsbCB9KTtcblxuLyoqXG4gKiBAcGFyYW0ge0hhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKi9cbmNvbnN0IG1ha2VFID0gSGFuZGxlZFByb21pc2UgPT4ge1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGFzc2lnbihcbiAgICAgIC8qKlxuICogRSh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBjYWxsIGFyYml0cmFyeSBtZXRob2RzLiBFYWNoIG9mIHRoZXNlXG4gKiBtZXRob2QgY2FsbHMgcmV0dXJucyBhIHByb21pc2UuIFRoZSBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIG9uIHdoYXRldmVyXG4gKiAneCcgZGVzaWduYXRlcyAob3IgcmVzb2x2ZXMgdG8pIGluIGEgZnV0dXJlIHR1cm4sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBBbiBleGFtcGxlIGNhbGwgd291bGQgYmVcbiAqXG4gKiBFKHpvZSkuaW5zdGFsbChidW5kbGUpXG4gKiAgIC50aGVuKGluc3RhbGxhdGlvbkhhbmRsZSA9PiB7IC4uLiB9KVxuICogICAuY2F0Y2goZXJyID0+IHsgLi4uIH0pO1xuICpcbiAqICBTZWUgaHR0cHM6Ly9lbmRvanMuZ2l0aHViLmlvL2VuZG8vZnVuY3Rpb25zL19lbmRvX2Zhci5FLmh0bWwgZm9yIGRldGFpbHMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB0YXJnZXQgZm9yIG1ldGhvZC9mdW5jdGlvbiBjYWxsXG4gKiBAcmV0dXJucyB7RUNhbGxhYmxlT3JNZXRob2RzPFJlbW90ZUZ1bmN0aW9uczxUPj59IG1ldGhvZC9mdW5jdGlvbiBjYWxsIHByb3h5XG4gKi9cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIHR5cGVkZWYqL1xuICAgICAgeCA9PiBuZXcgUHJveHkoZnVuY1RhcmdldCwgbWFrZUVQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcbiAgICAgIHtcbiAgICAgICAgLyoqXG4gKiBFLmdldCh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBnZXQgYXJiaXRyYXJ5IHByb3BlcnRpZXMuXG4gKiBFYWNoIG9mIHRoZXNlIHByb3BlcnRpZXMgcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSBwcm9wZXJ0eS4gIFRoZSBwcm9taXNlXG4gKiB2YWx1ZSB3aWxsIGJlIHRoZSBwcm9wZXJ0eSBmZXRjaGVkIGZyb20gd2hhdGV2ZXIgJ3gnIGRlc2lnbmF0ZXMgKG9yXG4gKiByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBwcm9wZXJ0eSBnZXRcbiAqIEByZXR1cm5zIHtFR2V0dGVyczxMb2NhbFJlY29yZDxUPj59IHByb3BlcnR5IGdldCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggdHlwZWRlZiovXG4gICAgICAgIGdldDogeCA9PiBuZXcgUHJveHkob2JqVGFyZ2V0LCBtYWtlRUdldFByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuXG4gICAgICAgIC8qKlxuICogRS5yZXNvbHZlKHgpIGNvbnZlcnRzIHggdG8gYSBoYW5kbGVkIHByb21pc2UuIEl0IGlzXG4gKiBzaG9ydGhhbmQgZm9yIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeClcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBoYW5kbGVkIHByb21pc2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBoYW5kbGVkIHByb21pc2UgZm9yIHhcbiAqIEByZWFkb25seVxuICovXG4gICAgICAgIHJlc29sdmU6IEhhbmRsZWRQcm9taXNlLnJlc29sdmUsXG5cbiAgICAgICAgLyoqXG4gKiBFLnNlbmRPbmx5IHJldHVybnMgYSBwcm94eSBzaW1pbGFyIHRvIEUsIGJ1dCBmb3Igd2hpY2ggdGhlIHJlc3VsdHNcbiAqIGFyZSBpZ25vcmVkICh1bmRlZmluZWQgaXMgcmV0dXJuZWQpLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBtZXRob2QvZnVuY3Rpb24gY2FsbFxuICogQHJldHVybnMge0VTZW5kT25seUNhbGxhYmxlT3JNZXRob2RzPFJlbW90ZUZ1bmN0aW9uczxUPj59IG1ldGhvZC9mdW5jdGlvbiBjYWxsIHByb3h5XG4gKiBAcmVhZG9ubHlcbiAqL1xuICAgICAgICBzZW5kT25seTogeCA9PlxuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIHR5cGVkZWYqL1xuICAgICAgICAgIG5ldyBQcm94eShmdW5jVGFyZ2V0LCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLyoqXG4gKiBFLndoZW4oeCwgcmVzLCByZWopIGlzIGVxdWl2YWxlbnQgdG9cbiAqIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihyZXMsIHJlailcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtVID0gVF1cbiAqIEBwYXJhbSB7VHxQcm9taXNlTGlrZTxUPn0geCB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgaGFuZGxlZCBwcm9taXNlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gRVJlZjxVPn0gW29uZnVsZmlsbGVkXVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IEVSZWY8VT59IFtvbnJlamVjdGVkXVxuICogQHJldHVybnMge1Byb21pc2U8VT59XG4gKiBAcmVhZG9ubHlcbiAqL1xuICAgICAgICB3aGVuOiAoeCwgb25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpID0+XG4gICAgICAgICAgSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKFxuICAgICAgICAgICAgLi4udHJhY2tUdXJucyhbb25mdWxmaWxsZWQsIG9ucmVqZWN0ZWRdKSxcbiAgICAgICAgICApLFxuICAgICAgfSxcbiAgICApLFxuICApO1xufTtcblxuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0Om1ha2VFfTtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPG1ha2VFPn0gRVByb3h5ICovXG5cbi8qKlxuICogRGVjbGFyZSBhbiBvYmplY3QgdGhhdCBpcyBwb3RlbnRpYWxseSBhIGZhciByZWZlcmVuY2Ugb2YgdHlwZSBQcmltYXJ5IHdob3NlXG4gKiBhdXhpbGxpYXJ5IGRhdGEgaGFzIHR5cGUgTG9jYWwuICBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIGNvbnN1bWVycyBvZlxuICogRmFyIG9iamVjdHMgaW4gYXJndW1lbnRzIGFuZCBkZWNsYXJhdGlvbnM7IHRoZSBvbmx5IGNyZWF0b3JzIG9mIEZhciBvYmplY3RzXG4gKiBhcmUgZGlzdHJpYnV0ZWQgb2JqZWN0IGNyZWF0b3IgY29tcG9uZW50cyBsaWtlIHRoZSBgRmFyYCBvciBgUmVtb3RhYmxlYFxuICogZnVuY3Rpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBQcmltYXJ5IFRoZSB0eXBlIG9mIHRoZSBwcmltYXJ5IHJlZmVyZW5jZS5cbiAqIEB0ZW1wbGF0ZSBbTG9jYWw9RGF0YU9ubHk8UHJpbWFyeT5dIFRoZSBsb2NhbCBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QuXG4gKiBAdHlwZWRlZiB7RVJlZjxMb2NhbCAmIFJlbW90YWJsZUJyYW5kPExvY2FsLCBQcmltYXJ5Pj59IEZhclJlZlxuICovXG5cbi8qKlxuICogYERhdGFPbmx5PFQ+YCBtZWFucyB0byByZXR1cm4gYSByZWNvcmQgdHlwZSBgVDJgIGNvbnNpc3Rpbmcgb25seSBvZlxuICogcHJvcGVydGllcyB0aGF0IGFyZSAqbm90KiBmdW5jdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgdG8gYmUgZmlsdGVyZWQuXG4gKiBAdHlwZWRlZiB7T21pdDxULCBGaWx0ZXJlZEtleXM8VCwgQ2FsbGFibGU+Pn0gRGF0YU9ubHlcbiAqL1xuXG4vKipcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzEzOTR9XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1Byb21pc2VMaWtlPFQ+IHwgVH0gRVJlZlxuICogRGVjbGFyZSB0aGF0IGBUYCBtYXkgb3IgbWF5IG5vdCBiZSBhIFByb21pc2UuICBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yXG4gKiBjb25zdW1lcnMgb2YgYXJndW1lbnRzIGFuZCBkZWNsYXJhdGlvbnM7IHJldHVybiB2YWx1ZXMgc2hvdWxkIHNwZWNpZmljYWxseSBiZVxuICogYFByb21pc2U8VD5gIG9yIGBUYCBpdHNlbGYuXG4gKi9cblxuLyoqXG4gKiBUaGUgYXdhaXRlZCByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uLlxuICogRm9yIHRoZSBldmVudHVhbCByZXN1bHQgb2YgYW4gRSBjYWxsLCBAc2VlIHtFUmVzdWx0fSBvciBAc2VlIHtFQ2FsbGFibGVSZXR1cm59XG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGluZmVyIFIgPyBBd2FpdGVkPFI+IDogbmV2ZXJ9IEVSZXR1cm5cbiAqL1xuXG4vKipcbiAqIEFuIGV2ZW50dWFsIHZhbHVlIHdoZXJlIHJlbW90YWJsZSBvYmplY3RzIGFyZSByZWN1cnNpdmVseSBtYXBwZWQgdG8gUmVtb3RlIHR5cGVzXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtBd2FpdGVkPFQ+fSBFUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBFeHBlcmltZW50YWwgdHlwZSBtYXBwaW5nIHJlbW90YWJsZSBvYmplY3RzIHRvIFJlbW90ZSB0eXBlc1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICAwIGV4dGVuZHMgKDEgJiBUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBUIGlzIGFueVxuICogICAgID8gVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wYWdhdGUgdGhlIGFueSB0eXBlIHRocm91Z2ggdGhlIHJlc3VsdFxuICogICAgIDogVCBleHRlbmRzIFJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFA+ICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgUmVtb3RhYmxlXG4gKiAgICAgICA/IChQIHwgUmVtb3RhYmxlQnJhbmQ8TCwgUD4pICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcCBpdCB0byBpdHMgXCJtYXliZSByZW1vdGVcIiBmb3JtIChwcmltYXJ5IGJlaGF2aW9yIG9yIHJlbW90YWJsZSBwcmVzZW5jZSlcbiAqICAgICAgIDogVCBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+ICAgICAgICAgICAgICAgICAgICAgLy8gSWYgVCBpcyBhIHByb21pc2VcbiAqICAgICAgICAgPyBQcm9taXNlPEVBd2FpdGVkUmVzdWx0PEF3YWl0ZWQ8VD4+PiAgICAgICAgICAgICAgLy8gbWFwIGl0cyByZXNvbHV0aW9uXG4gKiAgICAgICAgIDogVCBleHRlbmRzIChudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHN5bWJvbCB8IGJpZ2ludCB8IENhbGxhYmxlKSAvLyBJbnRlcnNlY3Rpb25zIG9mIHRoZXNlIHR5cGVzIHdpdGggb2JqZWN0cyBhcmUgbm90IG1hcHBlZFxuICogICAgICAgICAgID8gVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmltaXRpdmVzIGFuZCBub24tcmVtb3RhYmxlIGZ1bmN0aW9ucyBhcmUgcGFzc2VkLXRocm91Z2hcbiAqICAgICAgICAgICA6IFQgZXh0ZW5kcyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAqICAgICAgICAgICAgID8geyBbUCBpbiBrZXlvZiBUXTogRUF3YWl0ZWRSZXN1bHQ8VFtQXT47IH0gICAgLy8gb3RoZXIgb2JqZWN0cyBhcmUgY29uc2lkZXJlZCBjb3B5IGRhdGEgYW5kIHByb3BlcnRpZXMgbWFwcGVkXG4gKiAgICAgICAgICAgICA6IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2UgYW55dGhpbmcgd2Fzbid0IGNvdmVyZWQsIGZhbGxiYWNrIHRvIHBhc3MtdGhyb3VnaFxuICogKX0gRUF3YWl0ZWRSZXN1bHRcbiAqL1xuXG4vKipcbiAqIFRoZSBAc2VlIHtFUmVzdWx0fSByZXR1cm4gdHlwZSBvZiBhIHJlbW90ZSBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICAwIGV4dGVuZHMgKDEgJiBUKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgVCBpcyBhbnlcbiAqICAgICA/IGFueSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSB0aGUgYW55IHR5cGUgdGhyb3VnaCB0aGUgcmVzdWx0XG4gKiAgICAgOiBUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBpbmZlciBSICAvLyBFbHNlIGluZmVyIHRoZSByZXR1cm4gdHlwZVxuICogICAgICAgPyBFUmVzdWx0PFI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhlIGZ1dHVyZSwgbWFwIHRoZSBldmVudHVhbCByZXN1bHRcbiAqICAgICAgIDogbmV2ZXJcbiAqICl9IEVDYWxsYWJsZVJldHVyblxuICovXG5cbi8qIFRPRE86IEZpZ3VyZSBvdXQgYSB3YXkgdG8gbWFwIGdlbmVyaWMgY2FsbGFibGUgcmV0dXJuIHR5cGVzLCBvciBhdCBsZWFzdCBiZXR0ZXIgZGV0ZWN0IHRoZW0uKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzYxODM4LiBXaXRob3V0IHRoYXQsIGBFKHN0YXJ0R292ZXJuZWRVcGdyYWRhYmxlKWAqL1xuLyogaW4gYWdvcmljLXNkayBkb2Vzbid0IHByb3BhZ2F0ZSB0aGUgc3RhcnQgZnVuY3Rpb24gdHlwZS4qL1xuLyoqXG4gKiBNYXBzIGEgY2FsbGFibGUgdG8gaXRzIHJlbW90ZWx5IGNhbGxlZCB0eXBlXG4gKlxuICogQHRlbXBsYXRlIHtDYWxsYWJsZX0gVFxuICogQHR5cGVkZWYgeyhcbiAqICAgIFJldHVyblR5cGU8VD4gZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPiAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGNhbGxhYmxlIHJldHVybnMgYSBwcm9taXNlXG4gKiAgICAgID8gVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCeXBhc3MgbWFwcGluZyB0byBtYWludGFpbiBhbnkgZ2VuZXJpY1xuICogICAgICA6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBQcm9taXNlPEVDYWxsYWJsZVJldHVybjxUPj4gLy8gTWFwIGl0IGFueXdheSB0byBlbnN1cmUgcHJvbWlzZSByZXR1cm4gdHlwZVxuICogKX0gRUNhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gRUNhbGxhYmxlPFRbUF0+XG4gKiAgICAgOiBuZXZlcjtcbiAqIH19IEVNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPlxuICogICAgID8gVFtQXVxuICogICAgIDogUHJvbWlzZTxBd2FpdGVkPFRbUF0+PjtcbiAqIH19IEVHZXR0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0NhbGxhYmxlfSBUXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFByb21pc2U8dm9pZD59IEVTZW5kT25seUNhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gRVNlbmRPbmx5Q2FsbGFibGU8VFtQXT5cbiAqICAgICA6IG5ldmVyO1xuICogfX0gRVNlbmRPbmx5TWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gRVNlbmRPbmx5Q2FsbGFibGU8VD4gJiBFU2VuZE9ubHlNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogICAgIDogMCBleHRlbmRzICgxICYgVClcbiAqICAgICAgID8gbmV2ZXJcbiAqICAgICAgIDogRVNlbmRPbmx5TWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICl9IEVTZW5kT25seUNhbGxhYmxlT3JNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyBFQ2FsbGFibGU8VD4gJiBFTWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICAgICA6IDAgZXh0ZW5kcyAoMSAmIFQpXG4gKiAgICAgICA/IG5ldmVyXG4gKiAgICAgICA6IEVNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogKX0gRUNhbGxhYmxlT3JNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gYSB1bmlvbiBvZiBwcm9wZXJ0eSBuYW1lcy9zeW1ib2xzL251bWJlcnMgUCBmb3Igd2hpY2ggdGhlIHJlY29yZCBlbGVtZW50IFRbUF0ncyB0eXBlIGV4dGVuZHMgVS5cbiAqXG4gKiBHaXZlbiBjb25zdCB4ID0geyBhOiAxMjMsIGI6ICdoZWxsbycsIGM6IDQyLCA0OTogKCkgPT4ge30sIDUzOiA2NyB9LFxuICpcbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgbnVtYmVyPiBpcyB0aGUgdHlwZSAnYScgfCAnYycgfCA1My5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgc3RyaW5nPiBpcyB0aGUgdHlwZSAnYicuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIDQyIHwgNjc+IGlzIHRoZSB0eXBlICdjJyB8IDUzLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBib29sZWFuPiBpcyB0aGUgdHlwZSBuZXZlci5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFVcbiAqIEB0eXBlZGVmIHt7IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgVSA/IFAgOiBuZXZlcjsgfVtrZXlvZiBUXX0gRmlsdGVyZWRLZXlzXG4gKi9cblxuLyoqXG4gKiBgUGlja0NhbGxhYmxlPFQ+YCBtZWFucyB0byByZXR1cm4gYSBzaW5nbGUgcm9vdCBjYWxsYWJsZSBvciBhIHJlY29yZCB0eXBlXG4gKiBjb25zaXN0aW5nIG9ubHkgb2YgcHJvcGVydGllcyB0aGF0IGFyZSBmdW5jdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFJldHVyblR5cGU8VD4gICAgICAgICAgICAgICAgICAgICAvLyBhIHJvb3QgY2FsbGFibGUsIG5vIG1ldGhvZHNcbiAqICAgICA6IFBpY2s8VCwgRmlsdGVyZWRLZXlzPFQsIENhbGxhYmxlPj4gICAgICAgICAgLy8gYW55IGNhbGxhYmxlIG1ldGhvZHNcbiAqICl9IFBpY2tDYWxsYWJsZVxuICovXG5cbi8qKlxuICogYFJlbW90ZUZ1bmN0aW9uczxUPmAgbWVhbnMgdG8gcmV0dXJuIHRoZSBmdW5jdGlvbnMgYW5kIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVtb3RlbHkgY2FsbGFibGUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBSZW1vdGFibGVCcmFuZDxpbmZlciBMLCBpbmZlciBSPiAgIC8vIGlmIGEgZ2l2ZW4gVCBpcyBzb21lIHJlbW90ZSBpbnRlcmZhY2UgUlxuICogICAgID8gUGlja0NhbGxhYmxlPFI+ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHJldHVybiB0aGUgY2FsbGFibGUgcHJvcGVydGllcyBvZiBSXG4gKiAgICAgOiBUIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT4gICAgICAgICAgIC8vIG90aGVyd2lzZSwgaWYgVCBpcyBhIHByb21pc2VcbiAqICAgICAgID8gUmVtb3RlRnVuY3Rpb25zPFU+ICAgICAgICAgICAgICAgICAgICAgLy8gcmVjdXJzZSBvbiB0aGUgcmVzb2x2ZWQgdmFsdWUgb2YgVFxuICogICAgICAgOiBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHJldHVybiBUXG4gKiApfSBSZW1vdGVGdW5jdGlvbnNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj5cbiAqICAgICA/IExcbiAqICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPlxuICogICAgID8gTG9jYWxSZWNvcmQ8VT5cbiAqICAgICA6IFRcbiAqICl9IExvY2FsUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1IgPSB1bmtub3duXVxuICogQHR5cGVkZWYge3tcbiAqICAgcHJvbWlzZTogUHJvbWlzZTxSPjtcbiAqICAgc2V0dGxlcjogU2V0dGxlcjxSPjtcbiAqIH19IEVQcm9taXNlS2l0XG4gKi9cblxuLyoqXG4gKiBEZWNsYXJlIGEgbmVhciBvYmplY3QgdGhhdCBtdXN0IG9ubHkgYmUgaW52b2tlZCB3aXRoIEUsIGV2ZW4gbG9jYWxseS4gIEl0XG4gKiBzdXBwb3J0cyB0aGUgYFRgIGludGVyZmFjZSBidXQgYWRkaXRpb25hbGx5IHBlcm1pdHMgYFRgJ3MgbWV0aG9kcyB0byByZXR1cm5cbiAqIGBQcm9taXNlTGlrZWBzIGV2ZW4gaWYgYFRgIGRlY2xhcmVzIHRoZW0gYXMgb25seSBzeW5jaHJvbm91cy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gRVJlZjxBd2FpdGVkPEVPbmx5PFJldHVyblR5cGU8VD4+Pj5cbiAqICAgICA6IFQgZXh0ZW5kcyBSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlPlxuICogICAgID8ge1xuICogICAgICAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgICAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUW0tdPikgPT4gRVJlZjxBd2FpdGVkPEVPbmx5PFJldHVyblR5cGU8VFtLXT4+Pj5cbiAqICAgICAgICAgICA6IFRbS107XG4gKiAgICAgICB9XG4gKiAgICAgOiBUXG4gKiApfSBFT25seVxuICovJGjNj19vbmNlLmRlZmF1bHQoJGPNj19kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAc5UxUnIUAAByFAAAJwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9sb2NhbC5qc3siaW1wb3J0cyI6WyIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJnZXRNZXRob2ROYW1lcyIsImxvY2FsQXBwbHlGdW5jdGlvbiIsImxvY2FsQXBwbHlNZXRob2QiLCJsb2NhbEdldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcjskaM2PX2ltcG9ydHMoW1tcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsWyRozY9fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSwgRmFpbCB9ID0gYXNzZXJ0O1xuXG5jb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGdldFByb3RvdHlwZU9mLCBmcmVlemUgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHksIG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbmNvbnN0IG50eXBlb2YgPSBzcGVjaW1lbiA9PiAoc3BlY2ltZW4gPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2Ygc3BlY2ltZW4pO1xuXG5jb25zdCBvbkRlbGl2ZXJ5ID0gbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX0RFTElWRVJZX0JSRUFLUE9JTlRTJyk7XG5cbi8qKlxuICogVE9ETyBDb25zb2xpZGF0ZSB3aXRoIGBpc1ByaW1pdGl2ZWAgdGhhdCdzIGN1cnJlbnRseSBpbiBgQGVuZG8vcGFzcy1zdHlsZWAuXG4gKiBMYXllcmluZyBjb25zdHJhaW50cyBtYWtlIHRoaXMgdHJpY2t5LCB3aGljaCBpcyB3aHkgd2UgaGF2ZW4ndCB5ZXQgZmlndXJlZFxuICogb3V0IGhvdyB0byBkbyB0aGlzLlxuICpcbiAqIEB0eXBlIHsodmFsOiB1bmtub3duKSA9PiB2YWwgaXMgKHVuZGVmaW5lZFxuICogfCBudWxsXG4gKiB8IGJvb2xlYW5cbiAqIHwgbnVtYmVyXG4gKiB8IGJpZ2ludFxuICogfCBzdHJpbmdcbiAqIHwgc3ltYm9sKX1cbiAqL1xuY29uc3QgaXNQcmltaXRpdmUgPSB2YWwgPT5cbiAgIXZhbCB8fCAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJyk7XG5cbi8qKlxuICogUHJpb3JpdGl6ZSBzeW1ib2xzIGFzIGVhcmxpZXIgdGhhbiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYVxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkID0gKGEsIGIpID0+IHtcbiAgaWYgKHR5cGVvZiBhID09PSB0eXBlb2YgYikge1xuICAgIGNvbnN0IGxlZnQgPSBTdHJpbmcoYSk7XG4gICAgY29uc3QgcmlnaHQgPSBTdHJpbmcoYik7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbiAgICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbiAgfVxuICBpZiAodHlwZW9mIGEgPT09ICdzeW1ib2wnKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiID09PSAnc3RyaW5nJyk7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGFzc2VydCh0eXBlb2YgYSA9PT0gJ3N0cmluZycpO1xuICBhc3NlcnQodHlwZW9mIGIgPT09ICdzeW1ib2wnKTtcbiAgcmV0dXJuIDE7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHsoc3RyaW5nfHN5bWJvbClbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldE1ldGhvZE5hbWVzID0gdmFsID0+IHtcbiAgbGV0IGxheWVyID0gdmFsO1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKTsgLyogU2V0IHRvIGRlZHVwbGljYXRlKi9cbiAgd2hpbGUgKGxheWVyICE9PSBudWxsICYmIGxheWVyICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgLyogYmUgdG9sZXJhbnQgb2Ygbm9uLW9iamVjdHMqL1xuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG93bktleXMoZGVzY3MpKSB7XG4gICAgICAvKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4gICAgICAvKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuICAgICAgaWYgKHR5cGVvZiB2YWxbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNQcmltaXRpdmUodmFsKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxheWVyID0gZ2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuICB9XG4gIHJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xufTtcbi8qIFRoZSB0b3AgbGV2ZWwgb2YgdGhlIGV2ZW50dWFsIHNlbmQgbW9kdWxlcyBjYW4gYmUgZXZhbHVhdGVkIGJlZm9yZSovXG4vKiBzZXMgY3JlYXRlcyBgaGFyZGVuYCwgYW5kIHNvIGNhbm5vdCByZWx5IG9uIGBoYXJkZW5gIGF0IHRvcCBsZXZlbC4qLyRozY9fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7XG5mcmVlemUoZ2V0TWV0aG9kTmFtZXMpO1xuXG4gICAgICAgY29uc3QgbG9jYWxBcHBseUZ1bmN0aW9uID0gKHJlY2lwaWVudCwgYXJncykgPT4ge1xuICB0eXBlb2YgcmVjaXBpZW50ID09PSAnZnVuY3Rpb24nIHx8XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBpbnZva2UgdGFyZ2V0IGFzIGEgZnVuY3Rpb247IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgaWYgKG9uRGVsaXZlcnkgJiYgb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgZGVidWdnZXI7IC8qIFNURVAgSU5UTyBBUFBMWSovXG4gICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gdGhpcyBkZWxpdmVyeSBvZiBhbiBldmVudHVhbCBmdW5jdGlvbiBjYWxsKi9cbiAgICAvKiBzbyB0aGF0IHlvdSBjYW4gc3RlcCAqaW50byogdGhlIGZvbGxvd2luZyBgYXBwbHlgIGluIG9yZGVyIHRvIHNlZSB0aGUqL1xuICAgIC8qIGZ1bmN0aW9uIGNhbGwgYXMgaXQgaGFwcGVucy4gT3Igc3RlcCAqb3ZlciogdG8gc2VlIHdoYXQgaGFwcGVucyovXG4gICAgLyogYWZ0ZXIgdGhlIGZ1bmN0aW9uIGNhbGwgcmV0dXJucy4qL1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGFwcGx5KHJlY2lwaWVudCwgdW5kZWZpbmVkLCBhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmxvY2FsQXBwbHlGdW5jdGlvbihsb2NhbEFwcGx5RnVuY3Rpb24pO1xuXG4gICAgICAgY29uc3QgbG9jYWxBcHBseU1ldGhvZCA9IChyZWNpcGllbnQsIG1ldGhvZE5hbWUsIGFyZ3MpID0+IHtcbiAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fCBtZXRob2ROYW1lID09PSBudWxsKSB7XG4gICAgLyogQmFzZSBjYXNlOyBib3R0b20gb3V0IHRvIGFwcGx5IGZ1bmN0aW9ucy4qL1xuICAgIHJldHVybiBsb2NhbEFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LCBhcmdzKTtcbiAgfVxuICBpZiAocmVjaXBpZW50ID09PSB1bmRlZmluZWQgfHwgcmVjaXBpZW50ID09PSBudWxsKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBkZWxpdmVyICR7cShtZXRob2ROYW1lKX0gdG8gdGFyZ2V0OyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZm4gPSByZWNpcGllbnRbbWV0aG9kTmFtZV07XG4gIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYHRhcmdldCBoYXMgbm8gbWV0aG9kICR7cShtZXRob2ROYW1lKX0sIGhhcyAke3EoXG4gICAgICAgIGdldE1ldGhvZE5hbWVzKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmdHlwZSA9IG50eXBlb2YoZm4pO1xuICB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgfHxcbiAgICBGYWlsYGludm9rZWQgbWV0aG9kICR7cShtZXRob2ROYW1lKX0gaXMgbm90IGEgZnVuY3Rpb247IGl0IGlzIGEgJHtxKFxuICAgICAgZnR5cGUsXG4gICAgKX1gO1xuICBpZiAob25EZWxpdmVyeSAmJiBvbkRlbGl2ZXJ5LnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBtZXRob2ROYW1lKSkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgZGVidWdnZXI7IC8qIFNURVAgSU5UTyBBUFBMWSovXG4gICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gdGhpcyBkZWxpdmVyeSBvZiBhbiBldmVudHVhbCBtZXRob2QgY2FsbCovXG4gICAgLyogc28gdGhhdCB5b3UgY2FuIHN0ZXAgKmludG8qIHRoZSBmb2xsb3dpbmcgYGFwcGx5YCBpbiBvcmRlciB0byBzZWUgdGhlKi9cbiAgICAvKiBtZXRob2QgY2FsbCBhcyBpdCBoYXBwZW5zLiBPciBzdGVwICpvdmVyKiB0byBzZWUgd2hhdCBoYXBwZW5zKi9cbiAgICAvKiBhZnRlciB0aGUgbWV0aG9kIGNhbGwgcmV0dXJucy4qL1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGFwcGx5KGZuLCByZWNpcGllbnQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseU1ldGhvZChsb2NhbEFwcGx5TWV0aG9kKTtcblxuICAgICAgIGNvbnN0IGxvY2FsR2V0ID0gKHQsIGtleSkgPT4gdFtrZXldOyRozY9fb25jZS5sb2NhbEdldChsb2NhbEdldCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJsb2NhbEFwcGx5RnVuY3Rpb24iOlsibG9jYWxBcHBseUZ1bmN0aW9uIl0sImxvY2FsQXBwbHlNZXRob2QiOlsibG9jYWxBcHBseU1ldGhvZCJdLCJsb2NhbEdldCI6WyJsb2NhbEdldCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACHeIi59BgAAPQYAAA1AAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBxdW90ZTogcSwgRmFpbCB9ID0gYXNzZXJ0O1xuXG5jb25zdCB7IGhhc093biwgZnJlZXplLCBlbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZyB8ICcqJ30gTWF0Y2hTdHJpbmdUYWdcbiAqICAgQSBzdGFyIGAnKidgIG1hdGNoZXMgYW55IHJlY2lwaWVudC4gT3RoZXJ3aXNlLCB0aGUgc3RyaW5nIGlzXG4gKiAgIG1hdGNoZWQgYWdhaW5zdCB0aGUgdmFsdWUgb2YgYSByZWNpcGllbnQncyBgQEB0b1N0cmluZ1RhZ2BcbiAqICAgYWZ0ZXIgc3RyaXBwaW5nIG91dCBhbnkgbGVhZGluZyBgJ0FsbGVnZWQ6ICdgIG9yIGAnRGVidWdOYW1lOiAnYFxuICogICBwcmVmaXguIEZvciBvYmplY3RzIGRlZmluZWQgd2l0aCBgRmFyYCB0aGlzIGlzIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqICAga25vd24gYXMgdGhlIGBmYXJOYW1lYC4gRm9yIGV4b3MsIHRoaXMgaXMgdGhlIHRhZy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgJyonfSBNYXRjaE1ldGhvZE5hbWVcbiAqICAgQSBzdGFyIGAnKidgIG1hdGNoZXMgYW55IG1ldGhvZCBuYW1lLiBPdGhlcndpc2UsIHRoZSBzdHJpbmcgaXNcbiAqICAgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBtZXRob2QgbmFtZS4gQ3VycmVudGx5LCB0aGlzIGlzIG9ubHkgYW4gZXhhY3QgbWF0Y2guXG4gKiAgIEhvd2V2ZXIsIGJld2FyZSB0aGF0IHdlIG1heSBpbnRyb2R1Y2UgYSBzdHJpbmcgc3ludGF4IGZvclxuICogICBzeW1ib2wgbWV0aG9kIG5hbWVzLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtudW1iZXIgfCAnKid9IE1hdGNoQ291bnRkb3duXG4gKiAgIEEgc3RhciBgJyonYCB3aWxsIGFsd2F5cyBicmVha3BvaW50LiBPdGhlcndpc2UsIHRoZSBzdHJpbmdcbiAqICAgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLiBPbmNlIHRoYXQgaXMgemVybywgYWx3YXlzIGJyZWFrcG9pbnQuXG4gKiAgIE90aGVyd2lzZSBkZWNyZW1lbnQgYnkgb25lIGVhY2ggdGltZSBpdCBtYXRjaGVzIHVudGlsIGl0IHJlYWNoZXMgemVyby5cbiAqICAgSW4gb3RoZXIgd29yZHMsIHRoZSBjb3VudGRvd24gcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mXG4gKiAgIGJyZWFrcG9pbnQgb2NjdXJyZW5jZXMgdG8gc2tpcCBiZWZvcmUgYWN0dWFsbHkgYnJlYWtwb2ludGluZy5cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGV4dGVybmFsIEpTT04gcmVwcmVzZW50YXRpb24sIGluIHdoaWNoXG4gKiAtIHRoZSBvdXRlciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBjbGFzcy1saWtlIHRhZyBvciAnKicsXG4gKiAtIHRoZSBpbm5lciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBtZXRob2QgbmFtZSBvciAnKicsXG4gKiAtIHRoZSB2YWx1ZSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGNvdW50ZG93biBvciAnKicuXG4gKlxuICogQHR5cGVkZWYge1JlY29yZDxNYXRjaFN0cmluZ1RhZywgUmVjb3JkPE1hdGNoTWV0aG9kTmFtZSwgTWF0Y2hDb3VudGRvd24+Pn0gTWVzc2FnZUJyZWFrcG9pbnRzXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBpbnRlcm5hbCBKU09OIHJlcHJlc2VudGF0aW9uLCBpbiB3aGljaFxuICogLSB0aGUgb3V0ZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgbWV0aG9kIG5hbWUgb3IgJyonLFxuICogLSB0aGUgaW5uZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgY2xhc3MtbGlrZSB0YWcgb3IgJyonLFxuICogLSB0aGUgdmFsdWUgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciBjb3VudGRvd24gb3IgJyonLlxuICpcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8TWF0Y2hNZXRob2ROYW1lLCBSZWNvcmQ8TWF0Y2hTdHJpbmdUYWcsIE1hdGNoQ291bnRkb3duPj59IEJyZWFrcG9pbnRUYWJsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWVzc2FnZUJyZWFrcG9pbnRzfSBnZXRCcmVha3BvaW50c1xuICogQHByb3BlcnR5IHsobmV3QnJlYWtwb2ludHM/OiBNZXNzYWdlQnJlYWtwb2ludHMpID0+IHZvaWR9IHNldEJyZWFrcG9pbnRzXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVjaXBpZW50OiBvYmplY3QsXG4gKiAgIG1ldGhvZE5hbWU6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZFxuICogKSA9PiBib29sZWFufSBzaG91bGRCcmVha3BvaW50XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7dmFsIGlzIFJlY29yZDxzdHJpbmcsIGFueT59XG4gKi9cbmNvbnN0IGlzSlNPTlJlY29yZCA9IHZhbCA9PlxuICB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuLyoqXG4gKiBSZXR1cm4gYHRhZ2AgYWZ0ZXIgc3RyaXBwaW5nIG9mZiBhbnkgYCdBbGxlZ2VkOiAnYCBvciBgJ0RlYnVnTmFtZTogJ2BcbiAqIHByZWZpeCBpZiBwcmVzZW50LlxuICogYGBganNcbiAqIHNpbXBsaWZ5VGFnKCdBbGxlZ2VkOiBtb29sYSBpc3N1ZXInKSA9PT0gJ21vb2xhIGlzc3VlcidcbiAqIGBgYFxuICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIHN1Y2ggcHJlZml4ZXMsIG9ubHkgdGhlIG91dGVyIG9uZSBpcyByZW1vdmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHNpbXBsaWZ5VGFnID0gdGFnID0+IHtcbiAgZm9yIChjb25zdCBwcmVmaXggb2YgWydBbGxlZ2VkOiAnLCAnRGVidWdOYW1lOiAnXSkge1xuICAgIGlmICh0YWcuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICByZXR1cm4gdGFnLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFnO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHJldHVybnMge01lc3NhZ2VCcmVha3BvaW50VGVzdGVyIHwgdW5kZWZpbmVkfVxuICovXG4gICAgICAgY29uc3QgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gb3B0aW9uTmFtZSA9PiB7XG4gIGxldCBicmVha3BvaW50cyA9IEpTT04ucGFyc2UoZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJ251bGwnKSk7XG5cbiAgaWYgKGJyZWFrcG9pbnRzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBAdHlwZSB7QnJlYWtwb2ludFRhYmxlfSAqL1xuICBsZXQgYnJlYWtwb2ludHNUYWJsZTtcblxuICBjb25zdCBnZXRCcmVha3BvaW50cyA9ICgpID0+IGJyZWFrcG9pbnRzO1xuICBmcmVlemUoZ2V0QnJlYWtwb2ludHMpO1xuXG4gIGNvbnN0IHNldEJyZWFrcG9pbnRzID0gKG5ld0JyZWFrcG9pbnRzID0gYnJlYWtwb2ludHMpID0+IHtcbiAgICBpc0pTT05SZWNvcmQobmV3QnJlYWtwb2ludHMpIHx8XG4gICAgICBGYWlsYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uIHRvIGJlIGEgSlNPTiBicmVha3BvaW50cyByZWNvcmRgO1xuXG4gICAgLyoqIEB0eXBlIHtCcmVha3BvaW50VGFibGV9ICovXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjb25mdXNlZCBieSBfX3Byb3RvX18qL1xuICAgIGNvbnN0IG5ld0JyZWFrcG9pbnRzVGFibGUgPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuXG4gICAgZm9yIChjb25zdCBbdGFnLCBtZXRob2RCUHNdIG9mIGVudHJpZXMobmV3QnJlYWtwb2ludHMpKSB7XG4gICAgICB0YWcgPT09IHNpbXBsaWZ5VGFnKHRhZykgfHxcbiAgICAgICAgRmFpbGBKdXN0IHVzZSBzaW1wbGUgdGFnICR7cShzaW1wbGlmeVRhZyh0YWcpKX0gcmF0aGVyIHRoYW4gJHtxKHRhZyl9YDtcbiAgICAgIGlzSlNPTlJlY29yZChtZXRob2RCUHMpIHx8XG4gICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EoXG4gICAgICAgICAgdGFnLFxuICAgICAgICApfSB0byBiZSBhIEpTT04gbWV0aG9kcyBicmVha3BvaW50cyByZWNvcmRgO1xuICAgICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgY291bnRdIG9mIGVudHJpZXMobWV0aG9kQlBzKSkge1xuICAgICAgICBjb3VudCA9PT0gJyonIHx8XG4gICAgICAgICAgKHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50KSAmJlxuICAgICAgICAgICAgY291bnQgPj0gMCkgfHxcbiAgICAgICAgICBGYWlsYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKHRhZyl9LiR7cShcbiAgICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKX0gdG8gYmUgXCIqXCIgb3IgYSBub24tbmVnYXRpdmUgaW50ZWdlcmA7XG5cbiAgICAgICAgY29uc3QgY2xhc3NCUHMgPSBoYXNPd24obmV3QnJlYWtwb2ludHNUYWJsZSwgbWV0aG9kTmFtZSlcbiAgICAgICAgICA/IG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV1cbiAgICAgICAgICA6IChuZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdID0ge1xuICAgICAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvbmZ1c2VkIGJ5IF9fcHJvdG9fXyovXG4gICAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjbGFzc0JQc1t0YWddID0gY291bnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGJyZWFrcG9pbnRzID0gbmV3QnJlYWtwb2ludHM7XG4gICAgYnJlYWtwb2ludHNUYWJsZSA9IG5ld0JyZWFrcG9pbnRzVGFibGU7XG4gIH07XG4gIGZyZWV6ZShzZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2hvdWxkQnJlYWtwb2ludCA9IChyZWNpcGllbnQsIG1ldGhvZE5hbWUpID0+IHtcbiAgICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAgIC8qIFRPRE8gZW5hYmxlIGZ1bmN0aW9uIGJyZWFrcG9pbnRpbmcqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc0JQcyA9IGJyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gfHwgYnJlYWtwb2ludHNUYWJsZVsnKiddO1xuICAgIGlmIChjbGFzc0JQcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCB0YWcgPSBzaW1wbGlmeVRhZyhyZWNpcGllbnRbU3ltYm9sLnRvU3RyaW5nVGFnXSk7XG4gICAgbGV0IGNvdW50ID0gY2xhc3NCUHNbdGFnXTtcbiAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFnID0gJyonO1xuICAgICAgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY291bnQgPT09ICcqJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFzc2VydCh0eXBlb2YgY291bnQgPT09ICdudW1iZXInICYmIGNvdW50ID49IDEpO1xuICAgIGNsYXNzQlBzW3RhZ10gPSBjb3VudCAtIDE7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBmcmVlemUoc2hvdWxkQnJlYWtwb2ludCk7XG5cbiAgY29uc3QgYnJlYWtwb2ludFRlc3RlciA9IGZyZWV6ZSh7XG4gICAgZ2V0QnJlYWtwb2ludHMsXG4gICAgc2V0QnJlYWtwb2ludHMsXG4gICAgc2hvdWxkQnJlYWtwb2ludCxcbiAgfSk7XG4gIGJyZWFrcG9pbnRUZXN0ZXIuc2V0QnJlYWtwb2ludHMoKTtcbiAgcmV0dXJuIGJyZWFrcG9pbnRUZXN0ZXI7XG59OyRozY9fb25jZS5tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbmZyZWV6ZShtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAApE1XZ1gUAANYFAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlRTskaM2PX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKG1ha2VFID0gJGjNj19hKV1dXV0sW1wiLi9leHBvcnRzLmpzXCIsIFtdXV0pO1xuXG4vKiBYWFggbW9kdWxlIGV4cG9ydHMgZm9yIEhhbmRsZWRQcm9taXNlIGZhaWwgaWYgdGhlc2UgYXJlbid0IGluIHNjb3BlKi9cbi8qKiBAaW1wb3J0IHtIYW5kbGVyLCBIYW5kbGVkRXhlY3V0b3J9IGZyb20gJy4vaGFuZGxlZC1wcm9taXNlLmpzJyAqL1xuLyoqIEBpbXBvcnQge0VDYWxsYWJsZU9yTWV0aG9kcywgRUdldHRlcnMsIEVSZWYsIEVSZW1vdGVGdW5jdGlvbnMsIEVTZW5kT25seUNhbGxhYmxlT3JNZXRob2RzLCBMb2NhbFJlY29yZCwgUmVtb3RlRnVuY3Rpb25zfSBmcm9tICcuL0UuanMnICovXG5cbmNvbnN0IGhwID0gSGFuZGxlZFByb21pc2U7XG5cbi8qKlxuICogRSh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBjYWxsIGFyYml0cmFyeSBtZXRob2RzLiBFYWNoIG9mIHRoZXNlIG1ldGhvZCBjYWxscyByZXR1cm5zIGEgcHJvbWlzZS5cbiAqIFRoZSBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIG9uIHdoYXRldmVyICd4JyBkZXNpZ25hdGVzIChvciByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEUuZ2V0KHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGdldCBhcmJpdHJhcnkgcHJvcGVydGllcy4gRWFjaCBvZiB0aGVzZSBwcm9wZXJ0aWVzIHJldHVybnMgYVxuICogcHJvbWlzZSBmb3IgdGhlIHByb3BlcnR5LiAgVGhlIHByb21pc2UgdmFsdWUgd2lsbCBiZSB0aGUgcHJvcGVydHkgZmV0Y2hlZCBmcm9tIHdoYXRldmVyICd4JyBkZXNpZ25hdGVzIChvclxuICogcmVzb2x2ZXMgdG8pIGluIGEgZnV0dXJlIHR1cm4sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBFLndoZW4oeCwgcmVzLCByZWopIGlzIGVxdWl2YWxlbnQgdG8gSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKHJlcywgcmVqKVxuICovJGjNj19vbmNlLmhwKGhwKTtcbiAgICAgICBjb25zdCBFID0gbWFrZUUoaHApOyRozY9fb25jZS5FKEUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiSGFuZGxlZFByb21pc2UiOlsiaHAiXSwiRSI6WyJFIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADMopI5XEgAAVxIAAC0AAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJ0cmFja1R1cm5zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb24sZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dLFtcImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXNcIixbJGjNj19hID0+IChlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKiBOT1RFOiBXZSBjYW4ndCBpbXBvcnQgdGhlc2UgYmVjYXVzZSB0aGV5J3JlIG5vdCBpbiBzY29wZSBiZWZvcmUgbG9ja2Rvd24uKi9cbi8qIFdlIGFsc28gY2Fubm90IGN1cnJlbnRseSBpbXBvcnQgdGhlbSBiZWNhdXNlIGl0IHdvdWxkIGNyZWF0ZSBhIGN5Y2xpYyovXG4vKiBkZXBlbmRlbmN5LCB0aG91Z2ggdGhpcyBpcyBtb3JlIGVhc2lseSBmaXhlZC4qL1xuLyogaW1wb3J0IHsgYXNzZXJ0LCBYLCBGYWlsIH0gZnJvbSAnQGVuZG8vZXJyb3JzJzsqL1xuLyogU2VlIGFsc28gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85NTE1Ki9cblxuLyogV0FSTklORzogR2xvYmFsIE11dGFibGUgU3RhdGUhKi9cbi8qIFRoaXMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIGBhc3NlcnRgIHRoYXQgbWFrZXMgaXQgYXZhaWxhYmxlIHRvIHRoZSovXG4vKiBjYXVzYWwgY29uc29sZSwgd2hpY2ggYWZmZWN0cyB0aGUgY29uc29sZSBsb2cgb3V0cHV0LiBOb3JtYWxseSB3ZSovXG4vKiByZWdhcmQgdGhlIGFiaWxpdHkgdG8gc2VlIGNvbnNvbGUgbG9nIG91dHB1dCBhcyBhIG1ldGEtbGV2ZWwgcHJpdmlsZWdlKi9cbi8qIGFuYWxvZ291cyB0byB0aGUgYWJpbGl0eSB0byBkZWJ1Zy4gQXNpZGUgZnJvbSB0aGF0LCB0aGlzIG1vZHVsZSBzaG91bGQqL1xuLyogbm90IGhhdmUgYW55IG9ic2VydmFibHkgbXV0YWJsZSBzdGF0ZS4qL1xuXG5sZXQgaGlkZGVuUHJpb3JFcnJvcjtcbmxldCBoaWRkZW5DdXJyZW50VHVybiA9IDA7XG5sZXQgaGlkZGVuQ3VycmVudEV2ZW50ID0gMDtcblxuLyogVHVybiBvbiBpZiB5b3Ugc2VlbSB0byBiZSBsb3NpbmcgZXJyb3IgbG9nZ2luZyBhdCB0aGUgdG9wIG9mIHRoZSBldmVudCBsb29wKi9cbmNvbnN0IFZFUkJPU0UgPSBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKCdERUJVRycsICd0cmFjay10dXJucycpO1xuXG4vKiBUcmFjay10dXJucyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZCBjYW4gYmUgZW5hYmxlZCBieSBhbiBlbnZpcm9ubWVudCovXG4vKiBvcHRpb24uKi9cbmNvbnN0IEVOQUJMRUQgPVxuICAvKiogQHR5cGUgeydkaXNhYmxlZCcgfCAnZW5hYmxlZCd9ICovXG4gIChnZXRFbnZpcm9ubWVudE9wdGlvbignVFJBQ0tfVFVSTlMnLCAnZGlzYWJsZWQnLCBbJ2VuYWJsZWQnXSkpID09PSAnZW5hYmxlZCc7XG5cbi8qIFdlIGhvaXN0IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG91dCBvZiB0cmFja1R1cm5zKCkgdG8gZGlzY291cmFnZSB0aGUqL1xuLyogY2xvc3VyZXMgZnJvbSBob2xkaW5nIG9udG8gJ2FyZ3MnIG9yICdmdW5jJyBsb25nZXIgdGhhbiBuZWNlc3NhcnksKi9cbi8qIHdoaWNoIHdlJ3ZlIHNlZW4gY2F1c2UgSGFuZGxlZFByb21pc2UgYXJndW1lbnRzIHRvIGJlIHJldGFpbmVkIGZvciovXG4vKiBhIHN1cnByaXNpbmdseSBsb25nIHRpbWUuKi9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZSA9IGRldGFpbHNOb3RlID0+IHJlYXNvbiA9PiB7XG4gIGlmIChyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGdsb2JhbFRoaXMuYXNzZXJ0Lm5vdGUocmVhc29uLCBkZXRhaWxzTm90ZSk7XG4gIH1cbiAgaWYgKFZFUkJPU0UpIHtcbiAgICBjb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLCByZWFzb24pO1xuICB9XG59O1xuXG5jb25zdCB3cmFwRnVuY3Rpb24gPVxuICAoZnVuYywgc2VuZGluZ0Vycm9yLCBYKSA9PlxuICAoLi4uYXJncykgPT4ge1xuICAgIGhpZGRlblByaW9yRXJyb3IgPSBzZW5kaW5nRXJyb3I7XG4gICAgaGlkZGVuQ3VycmVudFR1cm4gKz0gMTtcbiAgICBoaWRkZW5DdXJyZW50RXZlbnQgPSAwO1xuICAgIHRyeSB7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZnVuYyguLi5hcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgWGBUaHJvd24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFZFUkJPU0UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICAvKiBNdXN0IGNhcHR1cmUgdGhpcyBub3csIG5vdCB3aGVuIHRoZSBjYXRjaCB0cmlnZ2Vycy4qL1xuICAgICAgY29uc3QgZGV0YWlsc05vdGUgPSBYYFJlamVjdGlvbiBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWA7XG4gICAgICBQcm9taXNlLnJlc29sdmUocmVzdWx0KS5jYXRjaChhZGRSZWplY3Rpb25Ob3RlKGRldGFpbHNOb3RlKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBoaWRkZW5QcmlvckVycm9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHRlbXBsYXRlIHtUdXJuU3RhcnRlckZuW119IFRcbiAqIEBwYXJhbSB7VH0gZnVuY3NcbiAqIEByZXR1cm5zIHtUfVxuICovXG4gICAgICAgY29uc3QgdHJhY2tUdXJucyA9IGZ1bmNzID0+IHtcbiAgaWYgKCFFTkFCTEVEIHx8IHR5cGVvZiBnbG9iYWxUaGlzID09PSAndW5kZWZpbmVkJyB8fCAhZ2xvYmFsVGhpcy5hc3NlcnQpIHtcbiAgICByZXR1cm4gZnVuY3M7XG4gIH1cbiAgY29uc3QgeyBkZXRhaWxzOiBYLCBub3RlOiBhbm5vdGF0ZUVycm9yIH0gPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuICBoaWRkZW5DdXJyZW50RXZlbnQgKz0gMTtcbiAgY29uc3Qgc2VuZGluZ0Vycm9yID0gRXJyb3IoXG4gICAgYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gLFxuICApO1xuICBpZiAoaGlkZGVuUHJpb3JFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYW5ub3RhdGVFcnJvcihzZW5kaW5nRXJyb3IsIFhgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gIH1cblxuICByZXR1cm4gLyoqIEB0eXBlIHtUfSAqLyAoXG4gICAgZnVuY3MubWFwKGZ1bmMgPT4gZnVuYyAmJiB3cmFwRnVuY3Rpb24oZnVuYywgc2VuZGluZ0Vycm9yLCBYKSlcbiAgKTtcbn07XG5cbi8qKlxuICogQW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBpcyBub3QgdGhpcy1zZW5zaXRpdmUsIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBhdFxuICogYm90dG9tIG9mIHN0YWNrIHRvIHN0YXJ0IGEgbmV3IHR1cm4uXG4gKlxuICogQHR5cGVkZWYgeygoLi4uYXJnczogYW55W10pID0+IGFueSkgfCB1bmRlZmluZWR9IFR1cm5TdGFydGVyRm5cbiAqLyRozY9fb25jZS50cmFja1R1cm5zKHRyYWNrVHVybnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC91dGlscy5qc3siaW1wb3J0cyI6WyIuL3NyYy9sb2NhbC5qcyIsIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2xvY2FsLmpzXCIsIFtdXSxbXCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvbG9jYWwuanMiOltbImdldE1ldGhvZE5hbWVzIiwiZ2V0TWV0aG9kTmFtZXMiXV0sIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOltbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciIsIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3EXZo2ACAABgAgAAGgAAAEBlbmRvL2V4by12MS41LjEyL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2V4by1tYWtlcnMuanMiLCIuL3NyYy90eXBlcy5qcyIsIi4vc3JjL2dldC1pbnRlcmZhY2UuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZXhvLW1ha2Vycy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2V4by1tYWtlcnMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyI6W1siR0VUX0lOVEVSRkFDRV9HVUFSRCIsIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALGTEP8QIAAAECAAACMAAABAZW5kby9leG8tdjEuNS4xMi9zcmMvZXhvLW1ha2Vycy5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIiwiLi9leG8tdG9vbHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzS2l0IiwiaW5pdEVtcHR5IiwibWFrZUV4byJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG9iamVjdE1hcCxlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLEZhaWwscSxkZWZlbmRQcm90b3R5cGUsZGVmZW5kUHJvdG90eXBlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL2V4by10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsWyRozY9fYSA9PiAoZGVmZW5kUHJvdG90eXBlID0gJGjNj19hKV1dLFtcImRlZmVuZFByb3RvdHlwZUtpdFwiLFskaM2PX2EgPT4gKGRlZmVuZFByb3RvdHlwZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtBbXBsaWZ5LCBFeG9DbGFzc0tpdE1ldGhvZHMsIEV4b0NsYXNzTWV0aG9kcywgRmFyQ2xhc3NPcHRpb25zLCBHdWFyZGVkLCBHdWFyZGVkS2l0LCBFeG9DbGFzc0ludGVyZmFjZUd1YXJkS2l0LCBJc0luc3RhbmNlLCBLaXRDb250ZXh0LCBFeG9DbGFzc0ludGVyZmFjZUd1YXJkLCBNZXRob2RzLCBGYWNldE5hbWV9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHsgY3JlYXRlLCBzZWFsLCBmcmVlemUsIGRlZmluZVByb3BlcnR5LCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLyogVHVybiBvbiB0byBnaXZlIGVhY2ggZXhvIGluc3RhbmNlIGl0cyBvd24gdG9TdHJpbmdUYWcgdmFsdWUuKi9cbmNvbnN0IExBQkVMX0lOU1RBTkNFUyA9IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywgJ2xhYmVsLWluc3RhbmNlcycpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEBwYXJhbSB7VH0gcHJvdG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUNvdW50XG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgbWFrZVNlbGYgPSAocHJvdG8sIGluc3RhbmNlQ291bnQpID0+IHtcbiAgY29uc3Qgc2VsZiA9IGNyZWF0ZShwcm90byk7XG4gIGlmIChMQUJFTF9JTlNUQU5DRVMpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShzZWxmLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcbiAgICAgIHZhbHVlOiBgJHtwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddfSMke2luc3RhbmNlQ291bnR9YCxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKHNlbGYpO1xufTtcblxuY29uc3QgZW1wdHlSZWNvcmQgPSBoYXJkZW4oe30pO1xuXG4vKipcbiAqIFdoZW4gY2FsbGluZyBgZGVmaW5lRHVyYWJsZUtpbmRgIGFuZFxuICogaXRzIHNpYmxpbmdzLCB1c2VkIGFzIHRoZSBgaW5pdGAgZnVuY3Rpb24gYXJndW1lbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGVcbiAqIHN0YXRlIHJlY29yZCBvZiB0aGUgKHZpcnR1YWwvZHVyYWJsZSkgaW5zdGFuY2VzIG9mIHRoZSBraW5kL2V4b0NsYXNzXG4gKiBzaG91bGQgYmUgZW1wdHksIGFuZCB0aGF0IHRoZSByZXR1cm5lZCBtYWtlciBmdW5jdGlvbiBzaG91bGQgaGF2ZSB6ZXJvXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuICAgICAgIGNvbnN0IGluaXRFbXB0eSA9ICgpID0+IGVtcHR5UmVjb3JkO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7RXhvQ2xhc3NJbnRlcmZhY2VHdWFyZDxNPiB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtFeG9DbGFzc01ldGhvZHM8TSwgST59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RmFyQ2xhc3NPcHRpb25zPElNUE9SVCgnLi90eXBlcy5qcycpLkNsYXNzQ29udGV4dDxSZXR1cm5UeXBlPEk+LCBNPj59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiBHdWFyZGVkPE0+fVxuICovJGjNj19vbmNlLmluaXRFbXB0eShpbml0RW1wdHkpO1xuICAgICAgIGNvbnN0IGRlZmluZUV4b0NsYXNzID0gKFxuICB0YWcsXG4gIGludGVyZmFjZUd1YXJkLFxuICBpbml0LFxuICBtZXRob2RzLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgaGFyZGVuKG1ldGhvZHMpO1xuICBjb25zdCB7XG4gICAgZmluaXNoID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVBbXBsaWZpZXIgPSB1bmRlZmluZWQsXG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyID0gdW5kZWZpbmVkLFxuICB9ID0gb3B0aW9ucztcbiAgcmVjZWl2ZUFtcGxpZmllciA9PT0gdW5kZWZpbmVkIHx8XG4gICAgRmFpbGBPbmx5IGZhY2V0cyBvZiBhbiBleG8gY2xhc3Mga2l0IGNhbiBiZSBhbXBsaWZpZWQgJHtxKHRhZyl9YDtcblxuICAvKiogQHR5cGUge1dlYWtNYXA8TSwgSU1QT1JUKCcuL3R5cGVzLmpzJykuQ2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sIE0+Pn0gKi9cbiAgY29uc3QgY29udGV4dE1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IHByb3RvID0gZGVmZW5kUHJvdG90eXBlKFxuICAgIHRhZyxcbiAgICBzZWxmID0+IC8qKiBAdHlwZSB7YW55fSAqLyAoY29udGV4dE1hcC5nZXQoc2VsZikpLFxuICAgIG1ldGhvZHMsXG4gICAgdHJ1ZSxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgKTtcbiAgbGV0IGluc3RhbmNlQ291bnQgPSAwO1xuICAvKipcbiAqIEBwYXJhbSAge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqL1xuICBjb25zdCBtYWtlSW5zdGFuY2UgPSAoLi4uYXJncykgPT4ge1xuICAgIC8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbiAgICBjb25zdCBzdGF0ZSA9IHNlYWwoaW5pdCguLi5hcmdzKSk7XG4gICAgaW5zdGFuY2VDb3VudCArPSAxO1xuICAgIGNvbnN0IHNlbGYgPSBtYWtlU2VsZihwcm90bywgaW5zdGFuY2VDb3VudCk7XG5cbiAgICAvKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG4gICAgLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5DbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPixNPn0gKi9cbiAgICBjb25zdCBjb250ZXh0ID0gZnJlZXplKHsgc3RhdGUsIHNlbGYgfSk7XG4gICAgY29udGV4dE1hcC5zZXQoc2VsZiwgY29udGV4dCk7XG4gICAgaWYgKGZpbmlzaCkge1xuICAgICAgZmluaXNoKGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICBpZiAocmVjZWl2ZUluc3RhbmNlVGVzdGVyKSB7XG4gICAgLyoqIEB0eXBlIHtJc0luc3RhbmNlfSAqL1xuICAgIGNvbnN0IGlzSW5zdGFuY2UgPSAoZXhvLCBmYWNldE5hbWUgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGZhY2V0TmFtZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgZmFjZXROYW1lIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBhbiBleG8gY2xhc3Mga2l0OiAke3EoXG4gICAgICAgICAgdGFnLFxuICAgICAgICApfSBoYXMgbm8gZmFjZXQgJHtxKGZhY2V0TmFtZSl9YDtcbiAgICAgIHJldHVybiBjb250ZXh0TWFwLmhhcyhleG8pO1xuICAgIH07XG4gICAgaGFyZGVuKGlzSW5zdGFuY2UpO1xuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3Rlcihpc0luc3RhbmNlKTtcbiAgfVxuXG4gIHJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlKTtcbn07JGjNj19vbmNlLmRlZmluZUV4b0NsYXNzKGRlZmluZUV4b0NsYXNzKTtcbmhhcmRlbihkZWZpbmVFeG9DbGFzcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSSBpbml0IGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxGYWNldE5hbWUsIE1ldGhvZHM+fSBGIGZhY2V0IG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7RXhvQ2xhc3NJbnRlcmZhY2VHdWFyZEtpdDxGPiB8IHVuZGVmaW5lZCB9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7RXhvQ2xhc3NLaXRNZXRob2RzPEYsIEk+fSBtZXRob2RzS2l0XG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxcbiAqICAgS2l0Q29udGV4dDxSZXR1cm5UeXBlPEk+LCBHdWFyZGVkS2l0PEY+PixcbiAqICAgR3VhcmRlZEtpdDxGPlxuICogPn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWRLaXQ8Rj59XG4gKi9cbiAgICAgICBjb25zdCBkZWZpbmVFeG9DbGFzc0tpdCA9IChcbiAgdGFnLFxuICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgaW5pdCxcbiAgbWV0aG9kc0tpdCxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGhhcmRlbihtZXRob2RzS2l0KTtcbiAgY29uc3Qge1xuICAgIGZpbmlzaCA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlQW1wbGlmaWVyID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3RlciA9IHVuZGVmaW5lZCxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNvbnRleHRNYXBLaXQgPSBvYmplY3RNYXAobWV0aG9kc0tpdCwgKCkgPT4gbmV3IFdlYWtNYXAoKSk7XG4gIGNvbnN0IGdldENvbnRleHRLaXQgPSBvYmplY3RNYXAoXG4gICAgY29udGV4dE1hcEtpdCxcbiAgICBjb250ZXh0TWFwID0+IGZhY2V0ID0+IGNvbnRleHRNYXAuZ2V0KGZhY2V0KSxcbiAgKTtcbiAgY29uc3QgcHJvdG90eXBlS2l0ID0gZGVmZW5kUHJvdG90eXBlS2l0KFxuICAgIHRhZyxcbiAgICBnZXRDb250ZXh0S2l0LFxuICAgIG1ldGhvZHNLaXQsXG4gICAgdHJ1ZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgKTtcbiAgbGV0IGluc3RhbmNlQ291bnQgPSAwO1xuICAvKipcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICovXG4gIGNvbnN0IG1ha2VJbnN0YW5jZUtpdCA9ICguLi5hcmdzKSA9PiB7XG4gICAgLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuICAgIGNvbnN0IHN0YXRlID0gc2VhbChpbml0KC4uLmFyZ3MpKTtcbiAgICAvKiBEb24ndCBmcmVlemUgY29udGV4dCB1bnRpbCB3ZSBhZGQgZmFjZXRzKi9cbiAgICAvKiogQHR5cGUge3sgc3RhdGU6IFJldHVyblR5cGU8ST4sIGZhY2V0czogYW55IH19ICovXG4gICAgY29uc3QgY29udGV4dCA9IHsgc3RhdGUsIGZhY2V0czogbnVsbCB9O1xuICAgIGluc3RhbmNlQ291bnQgKz0gMTtcbiAgICBjb25zdCBmYWNldHMgPSBvYmplY3RNYXAocHJvdG90eXBlS2l0LCAocHJvdG8sIGZhY2V0TmFtZSkgPT4ge1xuICAgICAgY29uc3Qgc2VsZiA9IG1ha2VTZWxmKHByb3RvLCBpbnN0YW5jZUNvdW50KTtcbiAgICAgIGNvbnRleHRNYXBLaXRbZmFjZXROYW1lXS5zZXQoc2VsZiwgY29udGV4dCk7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9KTtcbiAgICBjb250ZXh0LmZhY2V0cyA9IGZhY2V0cztcbiAgICAvKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG4gICAgZnJlZXplKGNvbnRleHQpO1xuICAgIGlmIChmaW5pc2gpIHtcbiAgICAgIGZpbmlzaChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7R3VhcmRlZEtpdDxGPn0gKi8gKGNvbnRleHQuZmFjZXRzKTtcbiAgfTtcblxuICBpZiAocmVjZWl2ZUFtcGxpZmllcikge1xuICAgIC8qKiBAdHlwZSB7QW1wbGlmeX0gKi9cbiAgICBjb25zdCBhbXBsaWZ5ID0gZXhvRmFjZXQgPT4ge1xuICAgICAgZm9yIChjb25zdCBjb250ZXh0TWFwIG9mIHZhbHVlcyhjb250ZXh0TWFwS2l0KSkge1xuICAgICAgICBpZiAoY29udGV4dE1hcC5oYXMoZXhvRmFjZXQpKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWNldHMgfSA9IGNvbnRleHRNYXAuZ2V0KGV4b0ZhY2V0KTtcbiAgICAgICAgICByZXR1cm4gZmFjZXRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBGYWlsYE11c3QgYmUgYSBmYWNldCBvZiAke3EodGFnKX06ICR7ZXhvRmFjZXR9YDtcbiAgICB9O1xuICAgIGhhcmRlbihhbXBsaWZ5KTtcbiAgICByZWNlaXZlQW1wbGlmaWVyKGFtcGxpZnkpO1xuICB9XG5cbiAgaWYgKHJlY2VpdmVJbnN0YW5jZVRlc3Rlcikge1xuICAgIC8qKiBAdHlwZSB7SXNJbnN0YW5jZX0gKi9cbiAgICBjb25zdCBpc0luc3RhbmNlID0gKGV4b0ZhY2V0LCBmYWNldE5hbWUgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChmYWNldE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdmFsdWVzKGNvbnRleHRNYXBLaXQpLnNvbWUoY29udGV4dE1hcCA9PlxuICAgICAgICAgIGNvbnRleHRNYXAuaGFzKGV4b0ZhY2V0KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydC50eXBlb2YoZmFjZXROYW1lLCAnc3RyaW5nJyk7XG4gICAgICBjb25zdCBjb250ZXh0TWFwID0gY29udGV4dE1hcEtpdFtmYWNldE5hbWVdO1xuICAgICAgY29udGV4dE1hcCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgZXhvIGNsYXNzIGtpdCAke3EodGFnKX0gaGFzIG5vIGZhY2V0IG5hbWVkICR7cShmYWNldE5hbWUpfWA7XG4gICAgICByZXR1cm4gY29udGV4dE1hcC5oYXMoZXhvRmFjZXQpO1xuICAgIH07XG4gICAgaGFyZGVuKGlzSW5zdGFuY2UpO1xuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3Rlcihpc0luc3RhbmNlKTtcbiAgfVxuXG4gIHJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlS2l0KTtcbn07JGjNj19vbmNlLmRlZmluZUV4b0NsYXNzS2l0KGRlZmluZUV4b0NsYXNzS2l0KTtcbmhhcmRlbihkZWZpbmVFeG9DbGFzc0tpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0lNUE9SVCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZDx7XG4gKiAgIFtNIGluIGtleW9mIFRdOiBJTVBPUlQoJ0BlbmRvL3BhdHRlcm5zJykuTWV0aG9kR3VhcmRcbiAqIH0+IHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZCBDQVZFQVQ6IHN0YXRpYyB0eXBpbmcgZG9lcyBub3QgeWV0IHN1cHBvcnQgYGNhbGxXaGVuYCB0cmFuc2Zvcm1hdGlvblxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxJTVBPUlQoJy4vdHlwZXMuanMnKS5DbGFzc0NvbnRleHQ8e30sVD4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtHdWFyZGVkPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUV4byA9ICh0YWcsIGludGVyZmFjZUd1YXJkLCBtZXRob2RzLCBvcHRpb25zID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IG1ha2VJbnN0YW5jZSA9IGRlZmluZUV4b0NsYXNzKFxuICAgIHRhZyxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICBpbml0RW1wdHksXG4gICAgbWV0aG9kcyxcbiAgICBvcHRpb25zLFxuICApO1xuICByZXR1cm4gbWFrZUluc3RhbmNlKCk7XG59OyRozY9fb25jZS5tYWtlRXhvKG1ha2VFeG8pO1xuaGFyZGVuKG1ha2VFeG8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaW5pdEVtcHR5IjpbImluaXRFbXB0eSJdLCJkZWZpbmVFeG9DbGFzcyI6WyJkZWZpbmVFeG9DbGFzcyJdLCJkZWZpbmVFeG9DbGFzc0tpdCI6WyJkZWZpbmVFeG9DbGFzc0tpdCJdLCJtYWtlRXhvIjpbIm1ha2VFeG8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFaP+6y5GAAAuRgAAIgAAAEBlbmRvL2V4by12MS41LjEyL3NyYy9leG8tdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyIsIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIkBlbmRvL2Vycm9ycyIsIi4vZ2V0LWludGVyZmFjZS5qcyJdLCJleHBvcnRzIjpbImRlZmVuZFByb3RvdHlwZSIsImRlZmVuZFByb3RvdHlwZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMsdG9UaHJvd2FibGUsRmFyLG11c3RNYXRjaCxNLGlzQXdhaXRBcmdHdWFyZCxpc1Jhd0d1YXJkLGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkLGdldE1ldGhvZEd1YXJkUGF5bG9hZCxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQsZ2V0Q29weU1hcEVudHJpZXMsbGlzdERpZmZlcmVuY2Usb2JqZWN0TWFwLHEsRmFpbCxHRVRfSU5URVJGQUNFX0dVQVJEOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRSZW1vdGFibGVNZXRob2ROYW1lc1wiLFskaM2PX2EgPT4gKGdldFJlbW90YWJsZU1ldGhvZE5hbWVzID0gJGjNj19hKV1dLFtcInRvVGhyb3dhYmxlXCIsWyRozY9fYSA9PiAodG9UaHJvd2FibGUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJpc0F3YWl0QXJnR3VhcmRcIixbJGjNj19hID0+IChpc0F3YWl0QXJnR3VhcmQgPSAkaM2PX2EpXV0sW1wiaXNSYXdHdWFyZFwiLFskaM2PX2EgPT4gKGlzUmF3R3VhcmQgPSAkaM2PX2EpXV0sW1wiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCA9ICRozY9fYSldXSxbXCJnZXRNZXRob2RHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRNZXRob2RHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dLFtcImdldENvcHlNYXBFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzXCIsIFtbXCJsaXN0RGlmZmVyZW5jZVwiLFskaM2PX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2dldC1pbnRlcmZhY2UuanNcIiwgW1tcIkdFVF9JTlRFUkZBQ0VfR1VBUkRcIixbJGjNj19hID0+IChHRVRfSU5URVJGQUNFX0dVQVJEID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVNZXRob2ROYW1lfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0ludGVyZmFjZUd1YXJkLCBNZXRob2QsIE1ldGhvZEd1YXJkLCBNZXRob2RHdWFyZFBheWxvYWQsIERlZmF1bHRHdWFyZFR5cGV9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJ1xuICogQGltcG9ydCB7Q2xhc3NDb250ZXh0LCBDb250ZXh0UHJvdmlkZXIsIEZhY2V0TmFtZSwgS2l0Q29udGV4dCwgS2l0Q29udGV4dFByb3ZpZGVyLCBNYXRjaENvbmZpZywgTWV0aG9kc30gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge0dldEludGVyZmFjZUd1YXJkfSBmcm9tICcuL2dldC1pbnRlcmZhY2UuanMnO1xuICovXG5cbmNvbnN0IHsgYXBwbHksIG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGRlZmluZVByb3BlcnRpZXMsIGZyb21FbnRyaWVzLCBoYXNPd24gfSA9IE9iamVjdDtcblxuLyoqXG4gKiBBIG1ldGhvZCBndWFyZCwgZm9yIGluY2x1c2lvbiBpbiBhbiBpbnRlcmZhY2UgZ3VhcmQsIHRoYXQgZG9lcyBub3RcbiAqIGVuZm9yY2UgYW55IGNvbnN0cmFpbnRzIG9mIGluY29taW5nIGFyZ3VtZW50cyBvciByZXR1cm4gcmVzdWx0cy5cbiAqL1xuY29uc3QgUmF3TWV0aG9kR3VhcmQgPSBNLmNhbGwoKS5yZXN0KE0ucmF3KCkpLnJldHVybnMoTS5yYXcoKSk7XG5cbmNvbnN0IFJFREFDVEVEX1JBV19BUkcgPSAnPHJlZGFjdGVkIHJhdyBhcmc+JztcblxuLyoqXG4gKiBBIG1ldGhvZCBndWFyZCwgZm9yIGluY2x1c2lvbiBpbiBhbiBpbnRlcmZhY2UgZ3VhcmQsIHRoYXQgZW5mb3JjZXMgb25seSB0aGF0XG4gKiBhbGwgYXJndW1lbnRzIGFyZSBwYXNzYWJsZSBhbmQgdGhhdCB0aGUgcmVzdWx0IGlzIHBhc3NhYmxlLiAoSW4gZmFyIGNsYXNzZXMsXG4gKiBcImFueVwiIG1lYW5zIGFueSAqcGFzc2FibGUqLikgVGhpcyBpcyB0aGUgbGVhc3QgcG9zc2libGUgbm9uLXJhd1xuICogZW5mb3JjZW1lbnQgZm9yIGEgbWV0aG9kIGd1YXJkLCBhbmQgaXMgaW1wbGllZCBieSBhbGwgb3RoZXJcbiAqIG5vbi1yYXcgbWV0aG9kIGd1YXJkcy5cbiAqL1xuY29uc3QgUGFzc2FibGVNZXRob2RHdWFyZCA9IE0uY2FsbCgpLnJlc3QoTS5hbnkoKSkucmV0dXJucyhNLmFueSgpKTtcblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlW119IHN5bmNBcmdzXG4gKiBAcGFyYW0ge01hdGNoQ29uZmlnfSBtYXRjaENvbmZpZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZVtdfSBSZXR1cm5zIHRoZSBhcmdzIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgcmF3IG1ldGhvZC5cbiAqL1xuY29uc3QgZGVmZW5kU3luY0FyZ3MgPSAoc3luY0FyZ3MsIG1hdGNoQ29uZmlnLCBsYWJlbCA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjbGFyZWRMZW4sXG4gICAgaGFzUmVzdEFyZ0d1YXJkLFxuICAgIHJlc3RBcmdHdWFyZElzUmF3LFxuICAgIHBhcmFtc1BhdHRlcm4sXG4gICAgcmVkYWN0ZWRJbmRpY2VzLFxuICB9ID0gbWF0Y2hDb25maWc7XG5cbiAgLyogVXNlIHN5bmNBcmdzIGlmIHBvc3NpYmxlLCBidXQgY29weSBpdCB3aGVuIG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQqL1xuICAvKiByZWRhY3Rpb25zLiovXG4gIGxldCBtYXRjaGFibGVBcmdzID0gc3luY0FyZ3M7XG4gIGlmIChyZXN0QXJnR3VhcmRJc1JhdyAmJiBzeW5jQXJncy5sZW5ndGggPiBkZWNsYXJlZExlbikge1xuICAgIGNvbnN0IHJlc3RMZW4gPSBzeW5jQXJncy5sZW5ndGggLSBkZWNsYXJlZExlbjtcbiAgICBjb25zdCByZWRhY3RlZFJlc3QgPSBBcnJheShyZXN0TGVuKS5maWxsKFJFREFDVEVEX1JBV19BUkcpO1xuICAgIG1hdGNoYWJsZUFyZ3MgPSBbLi4uc3luY0FyZ3Muc2xpY2UoMCwgZGVjbGFyZWRMZW4pLCAuLi5yZWRhY3RlZFJlc3RdO1xuICB9IGVsc2UgaWYgKFxuICAgIHJlZGFjdGVkSW5kaWNlcy5sZW5ndGggPiAwICYmXG4gICAgcmVkYWN0ZWRJbmRpY2VzWzBdIDwgc3luY0FyZ3MubGVuZ3RoXG4gICkge1xuICAgIC8qIENvcHkgdGhlIGFyZ3VtZW50cyBhcnJheSwgYXZvaWRpbmcgaGFyZGVuaW5nIHRoZSByZWRhY3RlZCBvbmVzICh3aGljaCBhcmUqL1xuICAgIC8qIHRyaXZpYWxseSBtYXRjaGVkIHVzaW5nIFJFREFDVEVEX1JBV19BUkcgYXMgYSBzZW50aW5lbCB2YWx1ZSkuKi9cbiAgICBtYXRjaGFibGVBcmdzID0gWy4uLnN5bmNBcmdzXTtcbiAgfVxuXG4gIGZvciAoY29uc3QgaSBvZiByZWRhY3RlZEluZGljZXMpIHtcbiAgICBpZiAoaSA+PSBtYXRjaGFibGVBcmdzLmxlbmd0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG1hdGNoYWJsZUFyZ3NbaV0gPSBSRURBQ1RFRF9SQVdfQVJHO1xuICB9XG5cbiAgbXVzdE1hdGNoKGhhcmRlbihtYXRjaGFibGVBcmdzKSwgcGFyYW1zUGF0dGVybiwgbGFiZWwpO1xuXG4gIGlmIChoYXNSZXN0QXJnR3VhcmQpIHtcbiAgICByZXR1cm4gc3luY0FyZ3M7XG4gIH1cbiAgc3luY0FyZ3MubGVuZ3RoIDw9IGRlY2xhcmVkTGVuIHx8XG4gICAgRmFpbGAke3EobGFiZWwpfSBhY2NlcHRzIGF0IG1vc3QgJHtxKGRlY2xhcmVkTGVuKX0gYXJndW1lbnRzLCBub3QgJHtxKFxuICAgICAgc3luY0FyZ3MubGVuZ3RoLFxuICAgICl9OiAke3N5bmNBcmdzfWA7XG4gIHJldHVybiBzeW5jQXJncztcbn07XG5cbi8qKlxuICogQ29udmVydCBhIG1ldGhvZCBndWFyZCB0byBhIG1hdGNoIGNvbmZpZyBmb3IgbW9yZSBlZmZpY2llbnQgcGVyLWNhbGxcbiAqIGV4ZWN1dGlvbi4gIFRoaXMgaXMgYSBvbmUtdGltZSBjb252ZXJzaW9uLCBzbyBpdCdzIE9LIHRvIGJlIHNsb3cuXG4gKlxuICogTW9zdCBvZiB0aGUgd29yayBpcyBkb25lIHRvIGRldGVjdCBgTS5yYXcoKWAgc28gdGhhdCB3ZSBidWlsZCBhIG1hdGNoIHBhdHRlcm5cbiAqIGFuZCBtZXRhZGF0YSBpbnN0ZWFkIG9mIGRvaW5nIHRoaXMgaW4gdGhlIGhvdCBwYXRoLlxuICogQHBhcmFtIHtNZXRob2RHdWFyZFBheWxvYWR9IG1ldGhvZEd1YXJkUGF5bG9hZFxuICogQHJldHVybnMge01hdGNoQ29uZmlnfVxuICovXG5jb25zdCBidWlsZE1hdGNoQ29uZmlnID0gbWV0aG9kR3VhcmRQYXlsb2FkID0+IHtcbiAgY29uc3Qge1xuICAgIGFyZ0d1YXJkcyxcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgIHJlc3RBcmdHdWFyZCxcbiAgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcblxuICBjb25zdCBtYXRjaGFibGVBcmdHdWFyZHMgPSBbLi4uYXJnR3VhcmRzLCAuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbiAgY29uc3QgcmVkYWN0ZWRJbmRpY2VzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2hhYmxlQXJnR3VhcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGlzUmF3R3VhcmQobWF0Y2hhYmxlQXJnR3VhcmRzW2ldKSkge1xuICAgICAgbWF0Y2hhYmxlQXJnR3VhcmRzW2ldID0gUkVEQUNURURfUkFXX0FSRztcbiAgICAgIHJlZGFjdGVkSW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIC8qIFBhc3MgdGhyb3VnaCByYXcgcmVzdCBhcmd1bWVudHMgd2l0aG91dCBtYXRjaGluZy4qL1xuICBsZXQgbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkID0gcmVzdEFyZ0d1YXJkO1xuICBpZiAoaXNSYXdHdWFyZChtYXRjaGFibGVSZXN0QXJnR3VhcmQpKSB7XG4gICAgbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkID0gTS5hcnJheU9mKFJFREFDVEVEX1JBV19BUkcpO1xuICB9XG4gIGNvbnN0IG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZCA9IGhhcmRlbih7XG4gICAgLi4ubWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgIGFyZ0d1YXJkczogbWF0Y2hhYmxlQXJnR3VhcmRzLnNsaWNlKDAsIGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgIG9wdGlvbmFsQXJnR3VhcmRzOiBtYXRjaGFibGVBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgcmVzdEFyZ0d1YXJkOiBtYXRjaGFibGVSZXN0QXJnR3VhcmQsXG4gIH0pO1xuXG4gIGNvbnN0IHBhcmFtc1BhdHRlcm4gPSBNLnNwbGl0QXJyYXkoXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLmFyZ0d1YXJkcyxcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQub3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLnJlc3RBcmdHdWFyZCxcbiAgKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBkZWNsYXJlZExlbjogbWF0Y2hhYmxlQXJnR3VhcmRzLmxlbmd0aCxcbiAgICBoYXNSZXN0QXJnR3VhcmQ6IHJlc3RBcmdHdWFyZCAhPT0gdW5kZWZpbmVkLFxuICAgIHJlc3RBcmdHdWFyZElzUmF3OiByZXN0QXJnR3VhcmQgIT09IG1hdGNoYWJsZVJlc3RBcmdHdWFyZCxcbiAgICBwYXJhbXNQYXR0ZXJuLFxuICAgIHJlZGFjdGVkSW5kaWNlcyxcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAcGFyYW0geyhyZXByZXNlbnRhdGl2ZTogYW55KSA9PiBDbGFzc0NvbnRleHQgfCBLaXRDb250ZXh0fSBnZXRDb250ZXh0XG4gKiBAcGFyYW0ge0NhbGxhYmxlRnVuY3Rpb259IGJlaGF2aW9yTWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkUGF5bG9hZH0gbWV0aG9kR3VhcmRQYXlsb2FkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEByZXR1cm5zIHtNZXRob2R9XG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNNZXRob2QgPSAoXG4gIGdldENvbnRleHQsXG4gIGJlaGF2aW9yTWV0aG9kLFxuICBtZXRob2RHdWFyZFBheWxvYWQsXG4gIGxhYmVsLFxuKSA9PiB7XG4gIGNvbnN0IHsgcmV0dXJuR3VhcmQgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgY29uc3QgaXNSYXdSZXR1cm4gPSBpc1Jhd0d1YXJkKHJldHVybkd1YXJkKTtcbiAgY29uc3QgbWF0Y2hDb25maWcgPSBidWlsZE1hdGNoQ29uZmlnKG1ldGhvZEd1YXJkUGF5bG9hZCk7XG4gIGNvbnN0IHsgc3luY01ldGhvZCB9ID0ge1xuICAgIC8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuICAgIHN5bmNNZXRob2QoLi4uc3luY0FyZ3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KHRoaXMpO1xuICAgICAgICAvKiBPbmx5IGhhcmRlbiBhcmdzIGFuZCByZXR1cm4gdmFsdWUgaWYgbm90IGRlYWxpbmcgd2l0aCBhIHJhdyB2YWx1ZSBndWFyZC4qL1xuICAgICAgICBjb25zdCByZWFsQXJncyA9IGRlZmVuZFN5bmNBcmdzKHN5bmNBcmdzLCBtYXRjaENvbmZpZywgbGFiZWwpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhcHBseShiZWhhdmlvck1ldGhvZCwgY29udGV4dCwgcmVhbEFyZ3MpO1xuICAgICAgICBpZiAoIWlzUmF3UmV0dXJuKSB7XG4gICAgICAgICAgbXVzdE1hdGNoKGhhcmRlbihyZXN1bHQpLCByZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBjYXRjaCAodGhyb3duVGhpbmcpIHtcbiAgICAgICAgdGhyb3cgdG9UaHJvd2FibGUodGhyb3duVGhpbmcpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG4gIHJldHVybiBzeW5jTWV0aG9kO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkUGF5bG9hZH0gbWV0aG9kR3VhcmRQYXlsb2FkXG4gKi9cbmNvbnN0IGRlc3luYyA9IG1ldGhvZEd1YXJkUGF5bG9hZCA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcmdHdWFyZHMsXG4gICAgb3B0aW9uYWxBcmdHdWFyZHMgPSBbXSxcbiAgICByZXN0QXJnR3VhcmQsXG4gIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG4gICFpc0F3YWl0QXJnR3VhcmQocmVzdEFyZ0d1YXJkKSB8fFxuICAgIEZhaWxgUmVzdCBhcmdzIG1heSBub3QgYmUgYXdhaXRlZDogJHtyZXN0QXJnR3VhcmR9YDtcbiAgY29uc3QgcmF3QXJnR3VhcmRzID0gWy4uLmFyZ0d1YXJkcywgLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG4gIGNvbnN0IGF3YWl0SW5kZXhlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0FyZ0d1YXJkcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGFyZ0d1YXJkID0gcmF3QXJnR3VhcmRzW2ldO1xuICAgIGlmIChpc0F3YWl0QXJnR3VhcmQoYXJnR3VhcmQpKSB7XG4gICAgICByYXdBcmdHdWFyZHNbaV0gPSBnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZChhcmdHdWFyZCkuYXJnR3VhcmQ7XG4gICAgICBhd2FpdEluZGV4ZXMucHVzaChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhd2FpdEluZGV4ZXMsXG4gICAgcmF3TWV0aG9kR3VhcmRQYXlsb2FkOiB7XG4gICAgICAuLi5tZXRob2RHdWFyZFBheWxvYWQsXG4gICAgICBhcmdHdWFyZHM6IHJhd0FyZ0d1YXJkcy5zbGljZSgwLCBhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICAgIG9wdGlvbmFsQXJnR3VhcmRzOiByYXdBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHsocmVwcmVzZW50YXRpdmU6IGFueSkgPT4gQ2xhc3NDb250ZXh0IHwgS2l0Q29udGV4dH0gZ2V0Q29udGV4dFxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZFBheWxvYWR9IG1ldGhvZEd1YXJkUGF5bG9hZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKi9cbmNvbnN0IGRlZmVuZEFzeW5jTWV0aG9kID0gKFxuICBnZXRDb250ZXh0LFxuICBiZWhhdmlvck1ldGhvZCxcbiAgbWV0aG9kR3VhcmRQYXlsb2FkLFxuICBsYWJlbCxcbikgPT4ge1xuICBjb25zdCB7IHJldHVybkd1YXJkIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG4gIGNvbnN0IGlzUmF3UmV0dXJuID0gaXNSYXdHdWFyZChyZXR1cm5HdWFyZCk7XG5cbiAgY29uc3QgeyBhd2FpdEluZGV4ZXMsIHJhd01ldGhvZEd1YXJkUGF5bG9hZCB9ID0gZGVzeW5jKG1ldGhvZEd1YXJkUGF5bG9hZCk7XG4gIGNvbnN0IG1hdGNoQ29uZmlnID0gYnVpbGRNYXRjaENvbmZpZyhyYXdNZXRob2RHdWFyZFBheWxvYWQpO1xuXG4gIGNvbnN0IHsgYXN5bmNNZXRob2QgfSA9IHtcbiAgICAvKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbiAgICBhc3luY01ldGhvZCguLi5hcmdzKSB7XG4gICAgICBjb25zdCBhd2FpdExpc3QgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgaSBvZiBhd2FpdEluZGV4ZXMpIHtcbiAgICAgICAgaWYgKGkgPj0gYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBhd2FpdExpc3QucHVzaChhcmdzW2ldKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHAgPSBQcm9taXNlLmFsbChhd2FpdExpc3QpO1xuICAgICAgY29uc3Qgc3luY0FyZ3MgPSBbLi4uYXJnc107XG4gICAgICBjb25zdCByZXN1bHRQID0gRS53aGVuKFxuICAgICAgICBwLFxuICAgICAgICAvKiogQHBhcmFtIHthbnlbXX0gYXdhaXRlZEFyZ3MgKi8gYXdhaXRlZEFyZ3MgPT4ge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXdhaXRlZEFyZ3MubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgIHN5bmNBcmdzW2F3YWl0SW5kZXhlc1tqXV0gPSBhd2FpdGVkQXJnc1tqXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogR2V0IHRoZSBjb250ZXh0IGFmdGVyIGFsbCB3YWl0aW5nIGluIGNhc2Ugd2UgZXZlciBkbyByZXZvY2F0aW9uKi9cbiAgICAgICAgICAvKiBieSByZW1vdmluZyB0aGUgY29udGV4dCBlbnRyeS4gQXZvaWQgVE9DVFRPVSEqL1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KHRoaXMpO1xuICAgICAgICAgIGNvbnN0IHJlYWxBcmdzID0gZGVmZW5kU3luY0FyZ3Moc3luY0FyZ3MsIG1hdGNoQ29uZmlnLCBsYWJlbCk7XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLCBjb250ZXh0LCByZWFsQXJncyk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIEUud2hlbihyZXN1bHRQLCBmdWxmaWxsbWVudCA9PiB7XG4gICAgICAgIGlmICghaXNSYXdSZXR1cm4pIHtcbiAgICAgICAgICBtdXN0TWF0Y2goaGFyZGVuKGZ1bGZpbGxtZW50KSwgcmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bGZpbGxtZW50O1xuICAgICAgfSkuY2F0Y2gocmVhc29uID0+XG4gICAgICAgIC8qIERvbmUgaXMgYSBjaGFpbmVkIGAuY2F0Y2hgIHJhdGhlciB0aGFuIGFuIG9uUmVqZWN0ZWQgY2xhdXNlIG9mIHRoZSovXG4gICAgICAgIC8qIGBFLndoZW5gIGFib3ZlIGluIGNhc2UgdGhlIGBtdXN0TWF0Y2hgIHRocm93cy4qL1xuICAgICAgICBQcm9taXNlLnJlamVjdCh0b1Rocm93YWJsZShyZWFzb24pKSxcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIGFzeW5jTWV0aG9kO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHsocmVwcmVzZW50YXRpdmU6IGFueSkgPT4gQ2xhc3NDb250ZXh0IHwgS2l0Q29udGV4dH0gZ2V0Q29udGV4dFxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICovXG5jb25zdCBkZWZlbmRNZXRob2QgPSAoZ2V0Q29udGV4dCwgYmVoYXZpb3JNZXRob2QsIG1ldGhvZEd1YXJkLCBsYWJlbCkgPT4ge1xuICBjb25zdCBtZXRob2RHdWFyZFBheWxvYWQgPSBnZXRNZXRob2RHdWFyZFBheWxvYWQobWV0aG9kR3VhcmQpO1xuICBjb25zdCB7IGNhbGxLaW5kIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG4gIGlmIChjYWxsS2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgcmV0dXJuIGRlZmVuZFN5bmNNZXRob2QoXG4gICAgICBnZXRDb250ZXh0LFxuICAgICAgYmVoYXZpb3JNZXRob2QsXG4gICAgICBtZXRob2RHdWFyZFBheWxvYWQsXG4gICAgICBsYWJlbCxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGFzc2VydChjYWxsS2luZCA9PT0gJ2FzeW5jJyk7XG4gICAgcmV0dXJuIGRlZmVuZEFzeW5jTWV0aG9kKFxuICAgICAgZ2V0Q29udGV4dCxcbiAgICAgIGJlaGF2aW9yTWV0aG9kLFxuICAgICAgbWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgICAgbGFiZWwsXG4gICAgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kVGFnXG4gKiBAcGFyYW0ge0NvbnRleHRQcm92aWRlcn0gY29udGV4dFByb3ZpZGVyXG4gKiBAcGFyYW0ge0NhbGxhYmxlRnVuY3Rpb259IGJlaGF2aW9yTWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICovXG5jb25zdCBiaW5kTWV0aG9kID0gKFxuICBtZXRob2RUYWcsXG4gIGNvbnRleHRQcm92aWRlcixcbiAgYmVoYXZpb3JNZXRob2QsXG4gIG1ldGhvZEd1YXJkLFxuKSA9PiB7XG4gIGFzc2VydC50eXBlb2YoYmVoYXZpb3JNZXRob2QsICdmdW5jdGlvbicpO1xuXG4gIC8qKlxuICogQHBhcmFtIHthbnl9IHJlcHJlc2VudGF0aXZlXG4gKiBAcmV0dXJucyB7Q2xhc3NDb250ZXh0IHwgS2l0Q29udGV4dH1cbiAqL1xuICBjb25zdCBnZXRDb250ZXh0ID0gcmVwcmVzZW50YXRpdmUgPT4ge1xuICAgIHJlcHJlc2VudGF0aXZlIHx8XG4gICAgICAvKiBzZXBhcmF0ZSBsaW5lIHRvIGVhc2UgYnJlYWtwb2ludGluZyovXG4gICAgICBGYWlsYE1ldGhvZCAke21ldGhvZFRhZ30gY2FsbGVkIHdpdGhvdXQgJ3RoaXMnIG9iamVjdGA7XG4gICAgY29uc3QgY29udGV4dCA9IGNvbnRleHRQcm92aWRlcihyZXByZXNlbnRhdGl2ZSk7XG4gICAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRmFpbGAke3EoXG4gICAgICAgIG1ldGhvZFRhZyxcbiAgICAgICl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtyZXByZXNlbnRhdGl2ZX1gO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbiAgfTtcblxuICBjb25zdCBtZXRob2QgPSBkZWZlbmRNZXRob2QoXG4gICAgZ2V0Q29udGV4dCxcbiAgICBiZWhhdmlvck1ldGhvZCxcbiAgICBtZXRob2RHdWFyZCxcbiAgICBtZXRob2RUYWcsXG4gICk7XG5cbiAgZGVmaW5lUHJvcGVydGllcyhtZXRob2QsIHtcbiAgICBuYW1lOiB7IHZhbHVlOiBtZXRob2RUYWcgfSxcbiAgICBsZW5ndGg6IHsgdmFsdWU6IGJlaGF2aW9yTWV0aG9kLmxlbmd0aCB9LFxuICB9KTtcbiAgcmV0dXJuIG1ldGhvZDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UmVtb3RhYmxlTWV0aG9kTmFtZSwgQ2FsbGFibGVGdW5jdGlvbj59IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7Q29udGV4dFByb3ZpZGVyfSBjb250ZXh0UHJvdmlkZXJcbiAqIEBwYXJhbSB7VH0gYmVoYXZpb3JNZXRob2RzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQ8eyBbTSBpbiBrZXlvZiBUXTogTWV0aG9kR3VhcmQgfT59IFtpbnRlcmZhY2VHdWFyZF1cbiAqL1xuICAgICAgIGNvbnN0IGRlZmVuZFByb3RvdHlwZSA9IChcbiAgdGFnLFxuICBjb250ZXh0UHJvdmlkZXIsXG4gIGJlaGF2aW9yTWV0aG9kcyxcbiAgdGhpc2Z1bE1ldGhvZHMgPSBmYWxzZSxcbiAgaW50ZXJmYWNlR3VhcmQgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgY29uc3QgcHJvdG90eXBlID0ge307XG4gIGNvbnN0IG1ldGhvZE5hbWVzID0gZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMoYmVoYXZpb3JNZXRob2RzKS5maWx0ZXIoXG4gICAgLyogQnkgaWdub3JpbmcgYW55IG1ldGhvZCB0aGF0IHNlZW1zIHRvIGJlIGEgY29uc3RydWN0b3IsIHdlIGNhbiB1c2UgYSovXG4gICAgLyogY2xhc3MucHJvdG90eXBlIGFzIGEgYmVoYXZpb3JNZXRob2RzLiovXG4gICAga2V5ID0+IHtcbiAgICAgIGlmIChrZXkgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IGJlaGF2aW9yTWV0aG9kcy5jb25zdHJ1Y3RvcjtcbiAgICAgIHJldHVybiAhKFxuICAgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiZcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID09PSBjb25zdHJ1Y3RvclxuICAgICAgKTtcbiAgICB9LFxuICApO1xuICAvKiogQHR5cGUge1JlY29yZDxSZW1vdGFibGVNZXRob2ROYW1lLCBNZXRob2RHdWFyZD4gfCB1bmRlZmluZWR9ICovXG4gIGxldCBtZXRob2RHdWFyZHM7XG4gIC8qKiBAdHlwZSB7RGVmYXVsdEd1YXJkVHlwZX0gKi9cbiAgbGV0IGRlZmF1bHRHdWFyZHM7XG4gIGlmIChpbnRlcmZhY2VHdWFyZCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVyZmFjZU5hbWUsXG4gICAgICBtZXRob2RHdWFyZHM6IG1nLFxuICAgICAgc3ltYm9sTWV0aG9kR3VhcmRzLFxuICAgICAgc2xvcHB5LFxuICAgICAgZGVmYXVsdEd1YXJkczogZGcgPSBzbG9wcHkgPyAncGFzc2FibGUnIDogZGVmYXVsdEd1YXJkcyxcbiAgICB9ID0gZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGludGVyZmFjZUd1YXJkKTtcbiAgICBtZXRob2RHdWFyZHMgPSBoYXJkZW4oe1xuICAgICAgLi4ubWcsXG4gICAgICAuLi4oc3ltYm9sTWV0aG9kR3VhcmRzICYmXG4gICAgICAgIGZyb21FbnRyaWVzKGdldENvcHlNYXBFbnRyaWVzKHN5bWJvbE1ldGhvZEd1YXJkcykpKSxcbiAgICB9KTtcbiAgICBkZWZhdWx0R3VhcmRzID0gZGc7XG4gICAge1xuICAgICAgY29uc3QgbWV0aG9kR3VhcmROYW1lcyA9IG93bktleXMobWV0aG9kR3VhcmRzKTtcbiAgICAgIGNvbnN0IHVuaW1wbGVtZW50ZWQgPSBsaXN0RGlmZmVyZW5jZShtZXRob2RHdWFyZE5hbWVzLCBtZXRob2ROYW1lcyk7XG4gICAgICB1bmltcGxlbWVudGVkLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBGYWlsYG1ldGhvZHMgJHtxKHVuaW1wbGVtZW50ZWQpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbiAgICAgIGlmIChkZWZhdWx0R3VhcmRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdW5ndWFyZGVkID0gbGlzdERpZmZlcmVuY2UobWV0aG9kTmFtZXMsIG1ldGhvZEd1YXJkTmFtZXMpO1xuICAgICAgICB1bmd1YXJkZWQubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgRmFpbGBtZXRob2RzICR7cSh1bmd1YXJkZWQpfSBub3QgZ3VhcmRlZCBieSAke3EoaW50ZXJmYWNlTmFtZSl9YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3Agb2YgbWV0aG9kTmFtZXMpIHtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGJlaGF2aW9yTWV0aG9kc1twcm9wXTtcbiAgICBjb25zdCB7IHNoaWZ0ZWRNZXRob2QgfSA9IHtcbiAgICAgIHNoaWZ0ZWRNZXRob2QoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QodGhpcywgLi4uYXJncyk7XG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgYmVoYXZpb3JNZXRob2QgPSB0aGlzZnVsTWV0aG9kcyA/IG9yaWdpbmFsTWV0aG9kIDogc2hpZnRlZE1ldGhvZDtcbiAgICAvKiBUT0RPIHNvbWUgdG9vbCBkb2VzIG5vdCB5ZXQgdW5kZXJzdGFuZCB0aGUgYD8uW2Agc3ludGF4Ki9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMjI0NyNkaXNjdXNzaW9uX3IxNTgzNzI0NDI0Ki9cbiAgICBsZXQgbWV0aG9kR3VhcmQgPSBtZXRob2RHdWFyZHMgJiYgbWV0aG9kR3VhcmRzW3Byb3BdO1xuICAgIGlmICghbWV0aG9kR3VhcmQpIHtcbiAgICAgIHN3aXRjaCAoZGVmYXVsdEd1YXJkcykge1xuICAgICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICAgIGlmICh0aGlzZnVsTWV0aG9kcykge1xuICAgICAgICAgICAgbWV0aG9kR3VhcmQgPSBQYXNzYWJsZU1ldGhvZEd1YXJkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXRob2RHdWFyZCA9IFJhd01ldGhvZEd1YXJkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdwYXNzYWJsZSc6IHtcbiAgICAgICAgICBtZXRob2RHdWFyZCA9IFBhc3NhYmxlTWV0aG9kR3VhcmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncmF3Jzoge1xuICAgICAgICAgIG1ldGhvZEd1YXJkID0gUmF3TWV0aG9kR3VhcmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIGRlZmF1bHRHdWFyZHMgJHtxKGRlZmF1bHRHdWFyZHMpfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJvdG90eXBlW3Byb3BdID0gYmluZE1ldGhvZChcbiAgICAgIGBJbiAke3EocHJvcCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG4gICAgICBjb250ZXh0UHJvdmlkZXIsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkLFxuICAgICk7XG4gIH1cblxuICBpZiAoIWhhc093bihwcm90b3R5cGUsIEdFVF9JTlRFUkZBQ0VfR1VBUkQpKSB7XG4gICAgY29uc3QgZ2V0SW50ZXJmYWNlR3VhcmRNZXRob2QgPSB7XG4gICAgICBbR0VUX0lOVEVSRkFDRV9HVUFSRF0oKSB7XG4gICAgICAgIC8qIE5vdGU6IE1heSBiZSBgdW5kZWZpbmVkYCovXG4gICAgICAgIHJldHVybiBpbnRlcmZhY2VHdWFyZDtcbiAgICAgIH0sXG4gICAgfVtHRVRfSU5URVJGQUNFX0dVQVJEXTtcbiAgICBwcm90b3R5cGVbR0VUX0lOVEVSRkFDRV9HVUFSRF0gPSBiaW5kTWV0aG9kKFxuICAgICAgYEluICR7cShHRVRfSU5URVJGQUNFX0dVQVJEKX0gbWV0aG9kIG9mICgke3RhZ30pYCxcbiAgICAgIGNvbnRleHRQcm92aWRlcixcbiAgICAgIGdldEludGVyZmFjZUd1YXJkTWV0aG9kLFxuICAgICAgUGFzc2FibGVNZXRob2RHdWFyZCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIEZhcih0YWcsIC8qKiBAdHlwZSB7VCAmIEdldEludGVyZmFjZUd1YXJkPFQ+fSAqLyAocHJvdG90eXBlKSk7XG59OyRozY9fb25jZS5kZWZlbmRQcm90b3R5cGUoZGVmZW5kUHJvdG90eXBlKTtcbmhhcmRlbihkZWZlbmRQcm90b3R5cGUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPEZhY2V0TmFtZSwgTWV0aG9kcz59IEZcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7eyBbSyBpbiBrZXlvZiBGXTogS2l0Q29udGV4dFByb3ZpZGVyIH19IGNvbnRleHRQcm92aWRlcktpdFxuICogQHBhcmFtIHtGfSBiZWhhdmlvck1ldGhvZHNLaXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHt7IFtLIGluIGtleW9mIEZdOiBJbnRlcmZhY2VHdWFyZDxSZWNvcmQ8a2V5b2YgRltLXSwgTWV0aG9kR3VhcmQ+PiB9fSBbaW50ZXJmYWNlR3VhcmRLaXRdXG4gKi9cbiAgICAgICBjb25zdCBkZWZlbmRQcm90b3R5cGVLaXQgPSAoXG4gIHRhZyxcbiAgY29udGV4dFByb3ZpZGVyS2l0LFxuICBiZWhhdmlvck1ldGhvZHNLaXQsXG4gIHRoaXNmdWxNZXRob2RzID0gZmFsc2UsXG4gIGludGVyZmFjZUd1YXJkS2l0ID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGNvbnN0IGZhY2V0TmFtZXMgPSBvd25LZXlzKGJlaGF2aW9yTWV0aG9kc0tpdCkuc29ydCgpO1xuICBmYWNldE5hbWVzLmxlbmd0aCA+IDEgfHwgRmFpbGBBIG11bHRpLWZhY2V0IG9iamVjdCBtdXN0IGhhdmUgbXVsdGlwbGUgZmFjZXRzYDtcbiAgaWYgKGludGVyZmFjZUd1YXJkS2l0KSB7XG4gICAgY29uc3QgaW50ZXJmYWNlTmFtZXMgPSBvd25LZXlzKGludGVyZmFjZUd1YXJkS2l0KTtcbiAgICBjb25zdCBleHRyYUludGVyZmFjZU5hbWVzID0gbGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcywgaW50ZXJmYWNlTmFtZXMpO1xuICAgIGV4dHJhSW50ZXJmYWNlTmFtZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICBGYWlsYEludGVyZmFjZXMgJHtxKGV4dHJhSW50ZXJmYWNlTmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbiAgICBjb25zdCBleHRyYUZhY2V0TmFtZXMgPSBsaXN0RGlmZmVyZW5jZShpbnRlcmZhY2VOYW1lcywgZmFjZXROYW1lcyk7XG4gICAgZXh0cmFGYWNldE5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBub3QgZ3VhcmRlZCBieSBpbnRlcmZhY2VzYDtcbiAgfVxuICBjb25zdCBjb250ZXh0TWFwTmFtZXMgPSBvd25LZXlzKGNvbnRleHRQcm92aWRlcktpdCk7XG4gIGNvbnN0IGV4dHJhQ29udGV4dE5hbWVzID0gbGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcywgY29udGV4dE1hcE5hbWVzKTtcbiAgZXh0cmFDb250ZXh0TmFtZXMubGVuZ3RoID09PSAwIHx8XG4gICAgRmFpbGBDb250ZXh0cyAke3EoZXh0cmFDb250ZXh0TmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbiAgY29uc3QgZXh0cmFGYWNldE5hbWVzID0gbGlzdERpZmZlcmVuY2UoY29udGV4dE1hcE5hbWVzLCBmYWNldE5hbWVzKTtcbiAgZXh0cmFGYWNldE5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbWlzc2luZyBjb250ZXh0c2A7XG4gIGNvbnN0IHByb3RvS2l0ID0gb2JqZWN0TWFwKGJlaGF2aW9yTWV0aG9kc0tpdCwgKGJlaGF2aW9yTWV0aG9kcywgZmFjZXROYW1lKSA9PlxuICAgIGRlZmVuZFByb3RvdHlwZShcbiAgICAgIGAke3RhZ30gJHtTdHJpbmcoZmFjZXROYW1lKX1gLFxuICAgICAgY29udGV4dFByb3ZpZGVyS2l0W2ZhY2V0TmFtZV0sXG4gICAgICBiZWhhdmlvck1ldGhvZHMsXG4gICAgICB0aGlzZnVsTWV0aG9kcyxcbiAgICAgIGludGVyZmFjZUd1YXJkS2l0ICYmIGludGVyZmFjZUd1YXJkS2l0W2ZhY2V0TmFtZV0sXG4gICAgKSxcbiAgKTtcbiAgcmV0dXJuIHByb3RvS2l0O1xufTskaM2PX29uY2UuZGVmZW5kUHJvdG90eXBlS2l0KGRlZmVuZFByb3RvdHlwZUtpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZlbmRQcm90b3R5cGUiOlsiZGVmZW5kUHJvdG90eXBlIl0sImRlZmVuZFByb3RvdHlwZUtpdCI6WyJkZWZlbmRQcm90b3R5cGVLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAySXaNgsFAAALBQAAJgAAAEBlbmRvL2V4by12MS41LjEyL3NyYy9nZXQtaW50ZXJmYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJHRVRfSU5URVJGQUNFX0dVQVJEIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogQGltcG9ydCB7UmVtb3RhYmxlTWV0aG9kTmFtZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKi9cblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgYXV0b21hdGljYWxseSBhZGRlZCBkZWZhdWx0IG1ldGEtbWV0aG9kIGZvclxuICogb2J0YWluaW5nIGFuIGV4bydzIGludGVyZmFjZSwgaWYgaXQgaGFzIG9uZS5cbiAqXG4gKiBJbnRlbmRlZCB0byBiZSBzaW1pbGFyIHRvIGBHRVRfTUVUSE9EX05BTUVTYCBmcm9tIGBAZW5kby9wYXNzLXN0eWxlYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTgwOSNkaXNjdXNzaW9uX3IxMzg4MDUyNDU0XG4gKlxuICogQmV3YXJlIHRoYXQgYW4gZXhvJ3MgaW50ZXJmYWNlIGNhbiBjaGFuZ2UgYWNyb3NzIGFuIHVwZ3JhZGUsXG4gKiBzbyByZW1vdGVzIHRoYXQgY2FjaGUgaXQgY2FuIGJlY29tZSBzdGFsZS5cbiAqL1xuICAgICAgIGNvbnN0IEdFVF9JTlRFUkZBQ0VfR1VBUkQgPSAnX19nZXRJbnRlcmZhY2VHdWFyZF9fJztcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxSZW1vdGFibGVNZXRob2ROYW1lLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTVxuICogQHR5cGVkZWYge3tcbiAqICAgW0dFVF9JTlRFUkZBQ0VfR1VBUkRdPzogKCkgPT5cbiAqICAgICBJTVBPUlQoJ0BlbmRvL3BhdHRlcm5zJykuSW50ZXJmYWNlR3VhcmQ8e1xuICogICAgICAgW0sgaW4ga2V5b2YgTV06IElNUE9SVCgnQGVuZG8vcGF0dGVybnMnKS5NZXRob2RHdWFyZFxuICogICAgIH0+IHwgdW5kZWZpbmVkXG4gKiB9fSBHZXRJbnRlcmZhY2VHdWFyZFxuICovJGjNj19vbmNlLkdFVF9JTlRFUkZBQ0VfR1VBUkQoR0VUX0lOVEVSRkFDRV9HVUFSRCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJHRVRfSU5URVJGQUNFX0dVQVJEIjpbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAHgAAAEBlbmRvL2V4by12MS41LjEyL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAgAAAAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqSbWUJgCAACYAgAAHgAAAEBlbmRvL2Zhci12MS4xLjE0L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZXhwb3J0cy5qcyJdLCJleHBvcnRzIjpbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dLFtcIi4vZXhwb3J0cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBlbmRvL2V2ZW50dWFsLXNlbmQiOltbIkUiLCJFIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJGYXIiLCJGYXIiXSxbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXSxbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVGf9kHCAAABwgAAB0AAABAZW5kby9tYXJzaGFsLXYxLjguMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVCeUNvZGVQb2ludHMiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIiwicGFzc2FibGVBc0p1c3RpbiIsInBhc3NhYmxlQXNKdXN0aW4iLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXSxbInBhc3NhYmxlQXNKdXN0aW4iLCJwYXNzYWJsZUFzSnVzdGluIl0sWyJxcCIsInFwIl1dLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6W1sibWFrZVBhc3NhYmxlS2l0IiwibWFrZVBhc3NhYmxlS2l0Il0sWyJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiXSxbIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSJdLFsiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNFbmNvZGVkUmVtb3RhYmxlIl0sWyJ6ZXJvUGFkIiwiemVyb1BhZCJdLFsicmVjb3JkTmFtZXMiLCJyZWNvcmROYW1lcyJdLFsicmVjb3JkVmFsdWVzIiwicmVjb3JkVmFsdWVzIl1dLCIuL3NyYy9yYW5rT3JkZXIuanMiOltbImNvbXBhcmVOdW1lcmljcyIsImNvbXBhcmVOdW1lcmljcyJdLFsiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVCeUNvZGVQb2ludHMiXSxbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIl0sWyJjb21wYXJlUmFuayIsImNvbXBhcmVSYW5rIl0sWyJpc1JhbmtTb3J0ZWQiLCJpc1JhbmtTb3J0ZWQiXSxbInNvcnRCeVJhbmsiLCJzb3J0QnlSYW5rIl0sWyJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQW50aVJhbmsiXSxbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXSxbImdldFBhc3NTdHlsZUNvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiXSxbImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sWyJ1bmlvblJhbmtDb3ZlcnMiLCJ1bmlvblJhbmtDb3ZlcnMiXV0sIkBlbmRvL3Bhc3Mtc3R5bGUiOltbImRlZXBseUZ1bGZpbGxlZCIsImRlZXBseUZ1bGZpbGxlZCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYL9qqMl9AADJfQAAKgAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVQYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZVBhc3NhYmxlS2l0IiwicGFzc1N0eWxlUHJlZml4ZXMiLCJyZWNvcmROYW1lcyIsInJlY29yZFZhbHVlcyIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixhc3NlcnRSZWNvcmQsaXNFcnJvckxpa2UsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxiLHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcImJcIixbJGjNj19hID0+IChiID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgZnJvbUVudHJpZXMsIGlzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4Ki9cbmNvbnN0IHJDMCA9IC9bXFx4MDAtXFx4MUZdLztcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHN1ZmZpeCBvZiBhIHN0cmluZyBzdGFydGluZyBhdCBhIHBhcnRpY3VsYXIgaW5kZXguXG4gKiBUaGlzIGJvdGggZXhwcmVzc2VzIGludGVudCBhbmQgcG90ZW50aWFsbHkgYXZvaWRzIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGdldFN1ZmZpeCA9IChzdHIsIGluZGV4KSA9PiAoaW5kZXggPT09IDAgPyBzdHIgOiBzdHIuc3Vic3RyaW5nKGluZGV4KSk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQsIHdlIGhhdmUgb25seVxuICogc3RyaW5nLW5hbWVkIG93biBwcm9wZXJ0aWVzLiBgcmVjb3JkTmFtZXNgIHJldHVybnMgdGhvc2UgbmFtZSAqcmV2ZXJzZSpcbiAqIHNvcnRlZCwgYmVjYXVzZSB0aGF0J3MgaG93IHJlY29yZHMgYXJlIGNvbXBhcmVkLCBlbmNvZGVkLCBhbmQgc29ydGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbiAgICAgICBjb25zdCByZWNvcmROYW1lcyA9IHJlY29yZCA9PlxuICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjEwMDM2NTcyNDQqL1xuICAvKiBjb21wYXJlcyB0d28gd2F5cyBvZiByZXZlcnNlIHNvcnRpbmcsIGFuZCBzaG93cyB0aGF0IGAuc29ydCgpLnJldmVyc2UoKWAqL1xuICAvKiBpcyBjdXJyZW50bHkgZmFzdGVyIG9uIE1vZGRhYmxlIFhTLCB3aGlsZSB0aGUgb3RoZXIgd2F5LCovXG4gIC8qIGAuc29ydChyZXZlcnNlQ29tcGFyYXRvcilgLCBpcyBmYXN0ZXIgb24gdjguIFdlIGN1cnJlbnRseSBjYXJlIG1vcmUgYWJvdXQqL1xuICAvKiBYUyBwZXJmb3JtYW5jZSwgc28gd2UgcmV2ZXJzZSBzb3J0IHVzaW5nIGAuc29ydCgpLnJldmVyc2UoKWAuKi9cbiAgaGFyZGVuKC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChvd25LZXlzKHJlY29yZCkpLnNvcnQoKS5yZXZlcnNlKCkpOyRozY9fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkIGFuZCBgbmFtZXNgIGlzIGByZWNvcmROYW1lcyhyZWNvcmQpYCxcbiAqIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG4gICAgICAgY29uc3QgcmVjb3JkVmFsdWVzID0gKHJlY29yZCwgbmFtZXMpID0+XG4gIGhhcmRlbihuYW1lcy5tYXAobmFtZSA9PiByZWNvcmRbbmFtZV0pKTskaM2PX29uY2UucmVjb3JkVmFsdWVzKHJlY29yZFZhbHVlcyk7XG5oYXJkZW4ocmVjb3JkVmFsdWVzKTtcblxuY29uc3QgemVyb2VzID0gQXJyYXkoMTYpXG4gIC5maWxsKHVuZGVmaW5lZClcbiAgLm1hcCgoXywgaSkgPT4gJzAnLnJlcGVhdChpKSk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBuXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuICAgICAgIGNvbnN0IHplcm9QYWQgPSAobiwgc2l6ZSkgPT4ge1xuICBjb25zdCBuU3RyID0gYCR7bn1gO1xuICBjb25zdCBmaWxsTGVuID0gc2l6ZSAtIG5TdHIubGVuZ3RoO1xuICBpZiAoZmlsbExlbiA9PT0gMCkgcmV0dXJuIG5TdHI7XG4gIGFzc2VydChmaWxsTGVuID4gMCAmJiBmaWxsTGVuIDwgemVyb2VzLmxlbmd0aCk7XG4gIHJldHVybiBgJHt6ZXJvZXNbZmlsbExlbl19JHtuU3RyfWA7XG59OyRozY9fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vKiBUaGlzIGlzIHRoZSBKYXZhU2NyaXB0IGFuYWxvZyB0byBhIEMgdW5pb246IGEgd2F5IHRvIG1hcCBiZXR3ZWVuIGEgZmxvYXQgYXMgYSovXG4vKiBudW1iZXIgYW5kIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBmbG9hdCBhcyBhIGJ1ZmZlciBmdWxsIG9mIGJ5dGVzLiAgTm90ZSovXG4vKiB0aGF0IHRoZSBtdXRhdGlvbiBvZiBzdGF0aWMgc3RhdGUgaGVyZSBtYWtlcyB0aGlzIGludmFsaWQgSmVzc2llIGNvZGUsIGJ1dCovXG4vKiBkb2luZyBpdCB0aGlzIHdheSBzYXZlcyB0aGUgbnVnYXRvcnkgYW5kIGdyYXR1aXRvdXMgYWxsb2NhdGlvbnMgdGhhdCB3b3VsZCovXG4vKiBoYXBwZW4gZXZlcnkgdGltZSB5b3UgZG8gYSBjb252ZXJzaW9uIC0tIGFuZCBpbiBwcmFjdGljYWwgdGVybXMgaXQncyBzYWZlKi9cbi8qIGJlY2F1c2Ugd2UgcHV0IHRoZSB2YWx1ZSBpbiBvbmUgc2lkZSBhbmQgdGhlbiBpbW1lZGlhdGVseSB0YWtlIGl0IG91dCB0aGUqL1xuLyogb3RoZXI7IHRoZXJlIGlzIG5vIGFjdHVhbCBzdGF0ZSByZXRhaW5lZCBpbiB0aGUgY2xhc3NpYyBzZW5zZSBhbmQgdGh1cyBubyovXG4vKiByZS1lbnRyYW5jeSBpc3N1ZS4qL1xuY29uc3QgYXNOdW1iZXIgPSBuZXcgRmxvYXQ2NEFycmF5KDEpO1xuY29uc3QgYXNCaXRzID0gbmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8qIEphdmFTY3JpcHQgbnVtYmVycyBhcmUgZW5jb2RlZCBieSBvdXRwdXR0aW5nIHRoZSBiYXNlLTE2Ki9cbi8qIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgSUVFRSBmbG9hdGluZyBwb2ludCovXG4vKiByZXByZXNlbnRhdGlvbi4gIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFsbCBiaXRzIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gYXJlKi9cbi8qIGNvbXBsZW1lbnRlZCBwcmlvciB0byB0aGUgYmFzZS0xNiBjb252ZXJzaW9uLCB3aGlsZSBmb3IgcG9zaXRpdmUgdmFsdWVzLCB0aGUqL1xuLyogc2lnbiBiaXQgaXMgY29tcGxlbWVudGVkLiAgVGhpcyBlbnN1cmVzIGJvdGggdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBiZWZvcmUqL1xuLyogcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGFjY29yZGluZyB0byB0aGVpciBuZWdhdGl2ZSovXG4vKiBtYWduaXR1ZGUgcmF0aGVyIHRoYW4gdGhlaXIgcG9zaXRpdmUgbWFnbml0dWRlLiAgVGhpcyByZXN1bHRzIGluIGFuIEFTQ0lJKi9cbi8qIGVuY29kaW5nIHdob3NlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtZXJpYyBzb3J0IG9yZGVyKi9cbi8qIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMuKi9cblxuLyogVE9ETyBDaG9vc2UgdGhlIHNhbWUgY2Fub25pY2FsIE5hTiBlbmNvZGluZyB0aGF0IGNvc21XYXNtIGFuZCBld2FzbSBjaG9zZS4qL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cyA9ICdmZmY4MDAwMDAwMDAwMDAwJztcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmluYXJ5NjQgPSBuID0+IHtcbiAgLyogTm9ybWFsaXplIC0wIHRvIDAgYW5kIE5hTiB0byBhIGNhbm9uaWNhbCBlbmNvZGluZyovXG4gIGlmIChpcyhuLCAtMCkpIHtcbiAgICBuID0gMDtcbiAgfSBlbHNlIGlmIChpcyhuLCBOYU4pKSB7XG4gICAgcmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gIH1cbiAgYXNOdW1iZXJbMF0gPSBuO1xuICBsZXQgYml0cyA9IGFzQml0c1swXTtcbiAgaWYgKG4gPCAwKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICByZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksIDE2KX1gO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlQmluYXJ5NjQgPSAoZW5jb2RlZCwgc2tpcCA9IDApID0+IHtcbiAgZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICdmJyB8fCBGYWlsYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IGJpdHMgPSBCaWdJbnQoYDB4JHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpfWApO1xuICBpZiAoZW5jb2RlZC5jaGFyQXQoc2tpcCArIDEpIDwgJzgnKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICBhc0JpdHNbMF0gPSBiaXRzO1xuICBjb25zdCByZXN1bHQgPSBhc051bWJlclswXTtcbiAgIWlzKHJlc3VsdCwgLTApIHx8XG4gICAgRmFpbGBVbmV4cGVjdGVkIG5lZ2F0aXZlIHplcm86ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEVuY29kZSBhIEphdmFTY3JpcHQgYmlnaW50IHVzaW5nIGEgdmFyaWFudCBvZiBFbGlhcyBkZWx0YSBjb2RpbmcsIHdpdGggYW5cbiAqIGluaXRpYWwgY29tcG9uZW50IGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBkaWdpdCBjb3VudCBhcyBhIHVuYXJ5IHN0cmluZywgYVxuICogc2Vjb25kIGNvbXBvbmVudCBmb3IgdGhlIGRlY2ltYWwgZGlnaXQgY291bnQsIGFuZCBhIHRoaXJkIGNvbXBvbmVudCBmb3IgdGhlXG4gKiBkZWNpbWFsIGRpZ2l0cyBwcmVjZWRlZCBieSBhIGdyYXR1aXRvdXMgc2VwYXJhdGluZyBjb2xvbi5cbiAqIFRvIGVuc3VyZSB0aGF0IHRoZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgb2YgZW5jb2RlZCB2YWx1ZXMgbWF0Y2hlcyB0aGVcbiAqIG51bWVyaWMgc29ydCBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5hcnlcbiAqIHByZWZpeCBhcmUgZGlmZmVyZW50IGZvciBuZWdhdGl2ZSB2YWx1ZXMgKHR5cGUgXCJuXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZlxuICogXCIjXCJzIFt3aGljaCBzb3J0IGJlZm9yZSBkZWNpbWFsIGRpZ2l0c10pIHZzLiBwb3NpdGl2ZSBhbmQgemVybyB2YWx1ZXMgKHR5cGVcbiAqIFwicFwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgXCJ+XCJzIFt3aGljaCBzb3J0IGFmdGVyIGRlY2ltYWwgZGlnaXRzXSkgYW5kXG4gKiBlYWNoIGRlY2ltYWwgZGlnaXQgb2YgdGhlIGVuY29kaW5nIGZvciBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggaXRzXG4gKiB0ZW4ncyBjb21wbGVtZW50IChzbyB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBvZiB0aGUgc2FtZSBzY2FsZSBzb3J0IGJ5XG4gKiAqZGVzY2VuZGluZyogYWJzb2x1dGUgdmFsdWUpLlxuICpcbiAqIEBwYXJhbSB7YmlnaW50fSBuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVCaWdJbnQgPSBuID0+IHtcbiAgY29uc3QgYWJzID0gbiA8IDBuID8gLW4gOiBuO1xuICBjb25zdCBuRGlnaXRzID0gYWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuICBjb25zdCBsRGlnaXRzID0gbkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbiAgaWYgKG4gPCAwbikge1xuICAgIHJldHVybiBgbiR7XG4gICAgICAvKiBBIFwiI1wiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuICAgICAgLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuICAgICAgJyMnLnJlcGVhdChsRGlnaXRzIC0gMSlcbiAgICB9JHtcbiAgICAgIC8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbiAgICAgICgxMCAqKiBsRGlnaXRzIC0gbkRpZ2l0cykudG9TdHJpbmcoKS5wYWRTdGFydChsRGlnaXRzLCAnMCcpXG4gICAgfToke1xuICAgICAgLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGRpZ2l0cy4qL1xuICAgICAgKDEwbiAqKiBCaWdJbnQobkRpZ2l0cykgKyBuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsICcwJylcbiAgICB9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYHAke1xuICAgICAgLyogQSBcIn5cIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbiAgICAgIC8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbiAgICAgICd+Jy5yZXBlYXQobERpZ2l0cyAtIDEpXG4gICAgfSR7XG4gICAgICAvKiBUaGUgY291bnQgb2YgZGlnaXRzLiovXG4gICAgICBuRGlnaXRzXG4gICAgfToke1xuICAgICAgLyogVGhlIGRpZ2l0cy4qL1xuICAgICAgblxuICAgIH1gO1xuICB9XG59O1xuXG5jb25zdCByQmlnSW50UGF5bG9hZCA9IC8oWzAtOV0rKSg6KFswLTldKyR8KXwpL3M7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmNvbnN0IGRlY29kZUJpZ0ludCA9IGVuY29kZWQgPT4ge1xuICBjb25zdCB0eXBlUHJlZml4ID0gZW5jb2RlZC5jaGFyQXQoMCk7IC8qIGZhc3RlciB0aGFuIGVuY29kZWRbMF0qL1xuICB0eXBlUHJlZml4ID09PSAncCcgfHxcbiAgICB0eXBlUHJlZml4ID09PSAnbicgfHxcbiAgICBGYWlsYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuICBjb25zdCB7XG4gICAgaW5kZXg6IGxEaWdpdHMsXG4gICAgMTogc25EaWdpdHMsXG4gICAgMjogdGFpbCxcbiAgICAzOiBkaWdpdHMsXG4gIH0gPSBlbmNvZGVkLm1hdGNoKHJCaWdJbnRQYXlsb2FkKSB8fCBGYWlsYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuICBzbkRpZ2l0cy5sZW5ndGggPT09IGxEaWdpdHMgfHxcbiAgICBGYWlsYFVuYXJ5LXByZWZpeGVkIGRlY2ltYWwgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgbkRpZ2l0cyA9IHBhcnNlSW50KHNuRGlnaXRzLCAxMCk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4gICAgLyogbGlrZSBcIm4wOlwiIGFuZCBcIm4wMDrigKZcIiBhbmQgXCJuOTE64oCmXCIgdGhyb3VnaCBcIm45OTrigKZcIj8qL1xuICAgIG5EaWdpdHMgPSAxMCAqKiAvKiogQHR5cGUge251bWJlcn0gKi8gKGxEaWdpdHMpIC0gbkRpZ2l0cztcbiAgfVxuXG4gIHRhaWwuY2hhckF0KDApID09PSAnOicgfHwgRmFpbGBTZXBhcmF0b3IgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBkaWdpdHMubGVuZ3RoID09PSBuRGlnaXRzIHx8XG4gICAgRmFpbGBGaXhlZC1sZW5ndGggZGlnaXQgc2VxdWVuY2UgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgbiA9IEJpZ0ludChkaWdpdHMpO1xuICBpZiAodHlwZVByZWZpeCA9PT0gJ24nKSB7XG4gICAgLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuICAgIC8qIGxpa2UgXCJuOTowXCIgYW5kIFwibjg6MDBcIiBhbmQgXCJuODo5MVwiIHRocm91Z2ggXCJuODo5OVwiPyovXG4gICAgbiA9IC0oMTBuICoqIEJpZ0ludChuRGlnaXRzKSAtIG4pO1xuICB9XG5cbiAgcmV0dXJuIG47XG59O1xuXG4vKipcbiAqIEEgc3BhcnNlIGFycmF5IGZvciB3aGljaCBldmVyeSBwcmVzZW50IGluZGV4IG1hcHMgYSBjb2RlIHBvaW50IGluIHRoZSBBU0NJSVxuICogcmFuZ2UgdG8gYSBjb3JyZXNwb25kaW5nIGVzY2FwZSBzZXF1ZW5jZS5cbiAqXG4gKiBFc2NhcGVzIGFsbCBjaGFyYWN0ZXJzIGZyb20gVSswMDAwIE5VTEwgdG8gVSswMDFGIElORk9STUFUSU9OIFNFUEFSQVRPUiBPTkVcbiAqIGxpa2UgYCE8Y2hhcmFjdGVyIG9mZnNldCBieSAweDIxPmAgdG8gYXZvaWQgSlNPTi5zdHJpbmdpZnkgZXhwYW5zaW9uIGFzXG4gKiBgXFx1SEhISGAsIGFuZCBzcGVjaWFsbHkgZXNjYXBlcyBVKzAwMjAgU1BBQ0UgKHRoZSBhcnJheSBlbGVtZW50IHRlcm1pbmF0b3IpXG4gKiBhcyBgIV9gIGFuZCBVKzAwMjEgRVhDTEFNQVRJT04gTUFSSyAodGhlIGVzY2FwZSBwcmVmaXgpIGFzIGAhfGAgKGJvdGggY2hvc2VuXG4gKiBmb3IgdmlzdWFsIGFwcHJveGltYXRpb24pLlxuICogUmVsYXRpdmUgbGV4aWNvZ3JhcGhpYyBvcmRlcmluZyBpcyBwcmVzZXJ2ZWQgYnkgdGhpcyBtYXBwaW5nIG9mIGFueSBjaGFyYWN0ZXJcbiAqIGF0IG9yIGJlZm9yZSBgIWAgaW4gdGhlIGNvbnRpZ3VvdXMgcmFuZ2UgWzB4MDAuLjB4MjFdIHRvIGEgcmVzcGVjdGl2ZVxuICogY2hhcmFjdGVyIGluIFsweDIxLi4weDQwLCAweDVGLCAweDdDXSBwcmVjZWRlZCBieSBgIWAgKHdoaWNoIGlzIGl0c2VsZiBpbiB0aGVcbiAqIHJlcGxhY2VkIHJhbmdlKS5cbiAqIFNpbWlsYXJseSwgZXNjYXBlcyBgXmAgYXMgYF9AYCBhbmQgYF9gIGFzIGBfX2AgYmVjYXVzZSBgXmAgaW5kaWNhdGVzIHRoZVxuICogc3RhcnQgb2YgYW4gZW5jb2RlZCBhcnJheS5cbiAqXG4gKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAqL1xuY29uc3Qgc3RyaW5nRXNjYXBlcyA9IEFycmF5KDB4MjIpXG4gIC5maWxsKHVuZGVmaW5lZClcbiAgLm1hcCgoXywgY3ApID0+IHtcbiAgICBzd2l0Y2ggKFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApKSB7XG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgcmV0dXJuICchXyc7XG4gICAgICBjYXNlICchJzpcbiAgICAgICAgcmV0dXJuICchfCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCEke1N0cmluZy5mcm9tQ2hhckNvZGUoY3AgKyAweDIxKX1gO1xuICAgIH1cbiAgfSk7XG5zdHJpbmdFc2NhcGVzWydeJy5jaGFyQ29kZUF0KDApXSA9ICdfQCc7XG5zdHJpbmdFc2NhcGVzWydfJy5jaGFyQ29kZUF0KDApXSA9ICdfXyc7XG5cbi8qKlxuICogRW5jb2RlcyBhIHN0cmluZyB3aXRoIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIHVzZSBpbiB0aGUgXCJjb21wYWN0T3JkZXJlZFwiIGZvcm1hdC5cbiAqXG4gKiBAdHlwZSB7KHN0cjogc3RyaW5nKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXggPSBzdHIgPT5cbiAgc3RyLnJlcGxhY2UoL1tcXDAtIV5fXS9nLCBjaCA9PiBzdHJpbmdFc2NhcGVzW2NoLmNoYXJDb2RlQXQoMCldKTtcblxuLyoqXG4gKiBEZWNvZGVzIGEgc3RyaW5nIGZyb20gdGhlIFwiY29tcGFjdE9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhlbmNvZGVkOiBzdHJpbmcpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCA9IGVuY29kZWQgPT4ge1xuICByZXR1cm4gZW5jb2RlZC5yZXBsYWNlKC8oW1xcMC0hX10pKC58XFxuKT8vZywgKGVzYywgcHJlZml4LCBzdWZmaXgpID0+IHtcbiAgICBzd2l0Y2ggKGVzYykge1xuICAgICAgY2FzZSAnIV8nOlxuICAgICAgICByZXR1cm4gJyAnO1xuICAgICAgY2FzZSAnIXwnOlxuICAgICAgICByZXR1cm4gJyEnO1xuICAgICAgY2FzZSAnX0AnOlxuICAgICAgICByZXR1cm4gJ14nO1xuICAgICAgY2FzZSAnX18nOlxuICAgICAgICByZXR1cm4gJ18nO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBjaCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc3VmZml4KTtcbiAgICAgICAgLyogVGhlIHJhbmdlIG9mIHZhbGlkIGAhYC1lc2NhcGUgc3VmZml4ZXMgaXMgWygweDAwKzB4MjEpLi4oMHgxRisweDIxKV0sIGkuZS4qL1xuICAgICAgICAvKiBbMHgyMS4uMHg0MF0gKFUrMDAyMSBFWENMQU1BVElPTiBNQVJLIHRvIFUrMDA0MCBDT01NRVJDSUFMIEFUKS4qL1xuICAgICAgICAocHJlZml4ID09PSAnIScgJiYgc3VmZml4ICE9PSB1bmRlZmluZWQgJiYgY2ggPj0gJyEnICYmIGNoIDw9ICdAJykgfHxcbiAgICAgICAgICBGYWlsYGludmFsaWQgc3RyaW5nIGVzY2FwZTogJHtxKGVzYyl9YDtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2guY2hhckNvZGVBdCgwKSAtIDB4MjEpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIFRyaXZpYWxseSBpZGVudGl0eS1lbmNvZGVzIGEgc3RyaW5nIGZvciB1c2UgaW4gdGhlIFwibGVnYWN5T3JkZXJlZFwiIGZvcm1hdC5cbiAqXG4gKiBAdHlwZSB7KHN0cjogc3RyaW5nKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCA9IHN0ciA9PiBzdHI7XG5cbi8qKlxuICogVHJpdmlhbGx5IGlkZW50aXR5LWRlY29kZXMgYSBzdHJpbmcgZnJvbSB0aGUgXCJsZWdhY3lPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCA9IGVuY29kZWQgPT4gZW5jb2RlZDtcblxuLyoqXG4gKiBFbmNvZGVzIGFuIGFycmF5IGludG8gYSBzZXF1ZW5jZSBvZiBlbmNvZGVkIGVsZW1lbnRzIGZvciB1c2UgaW4gdGhlIFwiY29tcGFjdE9yZGVyZWRcIlxuICogZm9ybWF0LCBlYWNoIHRlcm1pbmF0ZWQgYnkgYSBzcGFjZSAod2hpY2ggaXMgcGFydCBvZiB0aGUgZXNjYXBlZCByYW5nZSBpblxuICogXCJjb21wYWN0T3JkZXJlZFwiIGVuY29kZWQgc3RyaW5ncykuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBhcnJheVxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHN0cmluZ30gZW5jb2RlUGFzc2FibGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RBcnJheSA9IChhcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgY2hhcnMgPSBbJ14nXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFycmF5KSB7XG4gICAgY29uc3QgZW5jID0gZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG4gICAgY2hhcnMucHVzaChlbmMsICcgJyk7XG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX0gZGVjb2RlUGFzc2FibGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdEFycmF5ID0gKGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICBsZXQgZGVwdGggPSAwO1xuICAvKiBTY2FuIGVuY29kZWQgcmF0aGVyIHRoYW4gaXRzIHRhaWwgdG8gYXZvaWQgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy4qL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuICBsZXQgbmV4dEluZGV4ID0gc2tpcCArIDE7XG4gIGxldCBjdXJyZW50RWxlbWVudFN0YXJ0ID0gc2tpcCArIDE7XG4gIGZvciAoY29uc3QgeyAwOiBjaCwgaW5kZXg6IGkgfSBvZiBlbmNvZGVkLm1hdGNoQWxsKC9bXFxeIF0vZykpIHtcbiAgICBjb25zdCBpbmRleCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoaSk7XG4gICAgaWYgKGluZGV4IDw9IHNraXApIHtcbiAgICAgIGlmIChpbmRleCA9PT0gc2tpcCkge1xuICAgICAgICBjaCA9PT0gJ14nIHx8IEZhaWxgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoID09PSAnXicpIHtcbiAgICAgIC8qIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbmVzdGVkIGFycmF5LiovXG4gICAgICAvKiBUT0RPOiBTaW5jZSB0aGUgc3ludGF4IG9mIG5lc3RlZCBhcnJheXMgbXVzdCBiZSB2YWxpZGF0ZWQgYXMgcGFydCBvZiovXG4gICAgICAvKiBkZWNvZGluZyB0aGUgb3V0ZXIgb25lLCBjb25zaWRlciBkZWNvZGluZyB0aGVtIGhlcmUgaW50byBhIHNoYXJlZCBjYWNoZSovXG4gICAgICAvKiByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIGNvbnRlbnRzIHVudGlsIHRoZSBsYXRlciovXG4gICAgICAvKiBkZWNvZGVQYXNzYWJsZS4qL1xuICAgICAgZGVwdGggKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogVGhpcyBpcyBhIHRlcm1pbmF0ZWQgZWxlbWVudC4qL1xuICAgICAgaWYgKGluZGV4ID09PSBuZXh0SW5kZXgpIHtcbiAgICAgICAgLyogQSB0ZXJtaW5hdG9yIGFmdGVyIGBbYCBvciBhbiBhbm90aGVyIHRlcm1pbmF0b3IgaW5kaWNhdGVzIHRoYXQgYW4gYXJyYXkgaXMgZG9uZS4qL1xuICAgICAgICBkZXB0aCAtPSAxO1xuICAgICAgICBkZXB0aCA+PSAwIHx8XG4gICAgICAgICAgLyogcHJldHRpZXItaWdub3JlKi9cbiAgICAgICAgICBGYWlsYHVuZXhwZWN0ZWQgYXJyYXkgZWxlbWVudCB0ZXJtaW5hdG9yOiAke2VuY29kZWQuc2xpY2Uoc2tpcCwgaW5kZXggKyAyKX1gO1xuICAgICAgfVxuICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgIC8qIFdlIGhhdmUgYSBjb21wbGV0ZSBlbGVtZW50IG9mIHRoZSB0b3Btb3N0IGFycmF5LiovXG4gICAgICAgIGVsZW1lbnRzLnB1c2goXG4gICAgICAgICAgZGVjb2RlUGFzc2FibGUoZW5jb2RlZC5zbGljZShjdXJyZW50RWxlbWVudFN0YXJ0LCBpbmRleCkpLFxuICAgICAgICApO1xuICAgICAgICBjdXJyZW50RWxlbWVudFN0YXJ0ID0gaW5kZXggKyAxO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBBZHZhbmNlIHRoZSBpbmRleC4qL1xuICAgIG5leHRJbmRleCA9IGluZGV4ICsgMTtcbiAgfVxuICBkZXB0aCA9PT0gMCB8fCBGYWlsYHVudGVybWluYXRlZCBhcnJheTogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgbmV4dEluZGV4ID09PSBlbmNvZGVkLmxlbmd0aCB8fFxuICAgIEZhaWxgdW50ZXJtaW5hdGVkIGFycmF5IGVsZW1lbnQ6ICR7Z2V0U3VmZml4KFxuICAgICAgZW5jb2RlZCxcbiAgICAgIGN1cnJlbnRFbGVtZW50U3RhcnQsXG4gICAgKX1gO1xuICByZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgdGhlIG9yaWdpbmFsIGFycmF5IGVuY29kaW5nLCB3aGljaCBlc2NhcGVzIGFsbCBlbmNvZGVkIGFycmF5XG4gKiBlbGVtZW50cyByYXRoZXIgdGhhbiBqdXN0IHN0cmluZ3MgKGBcXHUwMDAwYCBhcyB0aGUgZWxlbWVudCB0ZXJtaW5hdG9yIGFuZFxuICogYFxcdTAwMDFgIGFzIHRoZSBlc2NhcGUgcHJlZml4IGZvciBgXFx1MDAwMGAgb3IgYFxcdTAwMDFgKS5cbiAqIFRoaXMgbmVjZXNzaXRhdGVkIGFuIHVuZGVzaXJhYmxlIGFtb3VudCBvZiBpdGVyYXRpb24gYW5kIGV4cGFuc2lvbjsgc2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjk2MDM2OTgyNlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gYXJyYXlcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBzdHJpbmd9IGVuY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lBcnJheSA9IChhcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgY2hhcnMgPSBbJ1snXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFycmF5KSB7XG4gICAgY29uc3QgZW5jID0gZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG4gICAgZm9yIChjb25zdCBjIG9mIGVuYykge1xuICAgICAgaWYgKGMgPT09ICdcXHUwMDAwJyB8fCBjID09PSAnXFx1MDAwMScpIHtcbiAgICAgICAgY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuICAgICAgfVxuICAgICAgY2hhcnMucHVzaChjKTtcbiAgICB9XG4gICAgY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9IGRlY29kZVBhc3NhYmxlXG4gKiBAcGFyYW0ge251bWJlcn0gW3NraXBdXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeUFycmF5ID0gKGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICBjb25zdCBlbGVtQ2hhcnMgPSBbXTtcbiAgLyogVXNlIGEgc3RyaW5nIGl0ZXJhdG9yIHRvIGF2b2lkIHNsb3cgaW5kZXhlZCBhY2Nlc3MgaW4gWFMuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbiAgbGV0IHN0aWxsVG9Ta2lwID0gc2tpcCArIDE7XG4gIGxldCBpbkVzY2FwZSA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGMgb2YgZW5jb2RlZCkge1xuICAgIGlmIChzdGlsbFRvU2tpcCA+IDApIHtcbiAgICAgIHN0aWxsVG9Ta2lwIC09IDE7XG4gICAgICBpZiAoc3RpbGxUb1NraXAgPT09IDApIHtcbiAgICAgICAgYyA9PT0gJ1snIHx8IEZhaWxgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluRXNjYXBlKSB7XG4gICAgICBjID09PSAnXFx1MDAwMCcgfHxcbiAgICAgICAgYyA9PT0gJ1xcdTAwMDEnIHx8XG4gICAgICAgIEZhaWxgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2N9YDtcbiAgICAgIGVsZW1DaGFycy5wdXNoKGMpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICBjb25zdCBlbmNvZGVkRWxlbWVudCA9IGVsZW1DaGFycy5qb2luKCcnKTtcbiAgICAgIGVsZW1DaGFycy5sZW5ndGggPSAwO1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRlY29kZVBhc3NhYmxlKGVuY29kZWRFbGVtZW50KTtcbiAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFx1MDAwMScpIHtcbiAgICAgIGluRXNjYXBlID0gdHJ1ZTtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZSovXG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbUNoYXJzLnB1c2goYyk7XG4gICAgfVxuICAgIGluRXNjYXBlID0gZmFsc2U7XG4gIH1cbiAgIWluRXNjYXBlIHx8IEZhaWxgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgZWxlbUNoYXJzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7Qnl0ZUFycmF5fSBieXRlQXJyYXlcbiAqIEBwYXJhbSB7KGJ5dGVBcnJheTogQnl0ZUFycmF5KSA9PiBzdHJpbmd9IF9lbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQnl0ZUFycmF5ID0gKGJ5dGVBcnJheSwgX2VuY29kZVBhc3NhYmxlKSA9PiB7XG4gIC8qIFRPRE8gaW1wbGVtZW50Ki9cbiAgRmFpbGBlbmNvZGVQYXNzYWJsZShieXRlQXJyYXkpIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7Ynl0ZUFycmF5fWA7XG4gIHJldHVybiAnJzsgLyogSnVzdCBmb3IgdGhlIHR5cGUqL1xufTtcblxuY29uc3QgZW5jb2RlUmVjb3JkID0gKHJlY29yZCwgZW5jb2RlQXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IG5hbWVzID0gcmVjb3JkTmFtZXMocmVjb3JkKTtcbiAgY29uc3QgdmFsdWVzID0gcmVjb3JkVmFsdWVzKHJlY29yZCwgbmFtZXMpO1xuICByZXR1cm4gYCgke2VuY29kZUFycmF5KGhhcmRlbihbbmFtZXMsIHZhbHVlc10pLCBlbmNvZGVQYXNzYWJsZSl9YDtcbn07XG5cbmNvbnN0IGRlY29kZVJlY29yZCA9IChlbmNvZGVkLCBkZWNvZGVBcnJheSwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJygnKTtcbiAgLyogU2tpcCB0aGUgXCIoXCIgaW5zaWRlIGBkZWNvZGVBcnJheWAgdG8gYXZvaWQgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy4qL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuICBjb25zdCB1bnppcHBlZEVudHJpZXMgPSBkZWNvZGVBcnJheShlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCArIDEpO1xuICB1bnppcHBlZEVudHJpZXMubGVuZ3RoID09PSAyIHx8XG4gICAgRmFpbGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBba2V5cywgdmFsc10gPSB1bnppcHBlZEVudHJpZXM7XG5cbiAgKHBhc3NTdHlsZU9mKGtleXMpID09PSAnY29weUFycmF5JyAmJlxuICAgIHBhc3NTdHlsZU9mKHZhbHMpID09PSAnY29weUFycmF5JyAmJlxuICAgIGtleXMubGVuZ3RoID09PSB2YWxzLmxlbmd0aCAmJlxuICAgIGtleXMuZXZlcnkoa2V5ID0+IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSkgfHxcbiAgICBGYWlsYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgbWFwRW50cmllcyA9IGtleXMubWFwKChrZXksIGkpID0+IFtrZXksIHZhbHNbaV1dKTtcbiAgY29uc3QgcmVjb3JkID0gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbiAgYXNzZXJ0UmVjb3JkKHJlY29yZCwgJ2RlY29kZWQgcmVjb3JkJyk7XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQgPSAodGFnZ2VkLCBlbmNvZGVBcnJheSwgZW5jb2RlUGFzc2FibGUpID0+XG4gIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLCB0YWdnZWQucGF5bG9hZF0pLCBlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkID0gKGVuY29kZWQsIGRlY29kZUFycmF5LCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApID09PSAnOicpO1xuICAvKiBTa2lwIHRoZSBcIjpcIiBpbnNpZGUgYGRlY29kZUFycmF5YCB0byBhdm9pZCBzbG93IGBzdWJzdHJpbmdgIGluIFhTLiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG4gIGNvbnN0IHRhZ2dlZFBheWxvYWQgPSBkZWNvZGVBcnJheShlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCArIDEpO1xuICB0YWdnZWRQYXlsb2FkLmxlbmd0aCA9PT0gMiB8fFxuICAgIEZhaWxgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgW3RhZywgcGF5bG9hZF0gPSB0YWdnZWRQYXlsb2FkO1xuICBwYXNzU3R5bGVPZih0YWcpID09PSAnc3RyaW5nJyB8fFxuICAgIEZhaWxgbm90IGEgdmFsaWQgdGFnZ2VkIGVuY29kaW5nOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gbWFrZVRhZ2dlZCh0YWcsIHBheWxvYWQpO1xufTtcblxuY29uc3QgbWFrZUVuY29kZVJlbW90YWJsZSA9ICh1bnNhZmVFbmNvZGVSZW1vdGFibGUsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZVJlbW90YWJsZSA9IChyLCBpbm5lckVuY29kZSkgPT4ge1xuICAgIGNvbnN0IGVuY29kaW5nID0gdW5zYWZlRW5jb2RlUmVtb3RhYmxlKHIsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICdyJykgfHxcbiAgICAgIEZhaWxgUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcInJcIjogJHtlbmNvZGluZ31gO1xuICAgIHZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCAnUmVtb3RhYmxlJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlUmVtb3RhYmxlO1xufTtcblxuY29uc3QgbWFrZUVuY29kZVByb21pc2UgPSAodW5zYWZlRW5jb2RlUHJvbWlzZSwgdmVyaWZ5RW5jb2RpbmcpID0+IHtcbiAgY29uc3QgZW5jb2RlUHJvbWlzZSA9IChwLCBpbm5lckVuY29kZSkgPT4ge1xuICAgIGNvbnN0IGVuY29kaW5nID0gdW5zYWZlRW5jb2RlUHJvbWlzZShwLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAnPycpIHx8XG4gICAgICBGYWlsYFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiP1wiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdQcm9taXNlJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlUHJvbWlzZTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVFcnJvciA9ICh1bnNhZmVFbmNvZGVFcnJvciwgdmVyaWZ5RW5jb2RpbmcpID0+IHtcbiAgY29uc3QgZW5jb2RlRXJyb3IgPSAoZXJyLCBpbm5lckVuY29kZSkgPT4ge1xuICAgIGNvbnN0IGVuY29kaW5nID0gdW5zYWZlRW5jb2RlRXJyb3IoZXJyLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAnIScpIHx8XG4gICAgICBGYWlsYEVycm9yIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiFcIjogJHtlbmNvZGluZ31gO1xuICAgIHZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCAnRXJyb3InKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVFcnJvcjtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlT2JqZWN0LFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZUVycm9yXVxuICogQHByb3BlcnR5IHsnbGVnYWN5T3JkZXJlZCcgfCAnY29tcGFjdE9yZGVyZWQnfSBbZm9ybWF0XVxuICovXG5cbi8qKlxuICogQHBhcmFtIHsoc3RyOiBzdHJpbmcpID0+IHN0cmluZ30gZW5jb2RlU3RyaW5nU3VmZml4XG4gKiBAcGFyYW0geyhhcnI6IHVua25vd25bXSwgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nKSA9PiBzdHJpbmd9IGVuY29kZUFycmF5XG4gKiBAcGFyYW0ge1JlcXVpcmVkPEVuY29kZU9wdGlvbnM+ICYge3ZlcmlmeUVuY29kaW5nPzogKGVuY29kZWQ6IHN0cmluZywgbGFiZWw6IHN0cmluZykgPT4gdm9pZH19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHsocDogUGFzc2FibGUpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgbWFrZUlubmVyRW5jb2RlID0gKGVuY29kZVN0cmluZ1N1ZmZpeCwgZW5jb2RlQXJyYXksIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZTogdW5zYWZlRW5jb2RlUmVtb3RhYmxlLFxuICAgIGVuY29kZVByb21pc2U6IHVuc2FmZUVuY29kZVByb21pc2UsXG4gICAgZW5jb2RlRXJyb3I6IHVuc2FmZUVuY29kZUVycm9yLFxuICAgIHZlcmlmeUVuY29kaW5nID0gKCkgPT4ge30sXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBlbmNvZGVSZW1vdGFibGUgPSBtYWtlRW5jb2RlUmVtb3RhYmxlKFxuICAgIHVuc2FmZUVuY29kZVJlbW90YWJsZSxcbiAgICB2ZXJpZnlFbmNvZGluZyxcbiAgKTtcbiAgY29uc3QgZW5jb2RlUHJvbWlzZSA9IG1ha2VFbmNvZGVQcm9taXNlKHVuc2FmZUVuY29kZVByb21pc2UsIHZlcmlmeUVuY29kaW5nKTtcbiAgY29uc3QgZW5jb2RlRXJyb3IgPSBtYWtlRW5jb2RlRXJyb3IodW5zYWZlRW5jb2RlRXJyb3IsIHZlcmlmeUVuY29kaW5nKTtcblxuICBjb25zdCBpbm5lckVuY29kZSA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbiAgICAgIC8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4gICAgICAvKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuICAgICAgLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4gICAgICAvKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4gICAgICAvKiovXG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbiAgICAgIC8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbiAgICAgIC8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuICAgICAgLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuICAgICAgcmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgfVxuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6IHtcbiAgICAgICAgcmV0dXJuICd2JztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgcmV0dXJuICd6JztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUJpbmFyeTY0KHBhc3NhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgcmV0dXJuIGBzJHtlbmNvZGVTdHJpbmdTdWZmaXgocGFzc2FibGUpfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdib29sZWFuJzoge1xuICAgICAgICByZXR1cm4gYGIke3Bhc3NhYmxlfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCaWdJbnQocGFzc2FibGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlUmVtb3RhYmxlKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlUHJvbWlzZShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAvKiBTdHJpbmdzIGFuZCBzeW1ib2xzIHNoYXJlIGVuY29kaW5nIGxvZ2ljLiovXG4gICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgcmV0dXJuIGB5JHtlbmNvZGVTdHJpbmdTdWZmaXgobmFtZSl9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCeXRlQXJyYXkocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBpbm5lckVuY29kZTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZU9iamVjdH0gW2RlY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yXVxuICovXG5cbmNvbnN0IGxpYmVyYWxEZWNvZGVycyA9IC8qKiBAdHlwZSB7UmVxdWlyZWQ8RGVjb2RlT3B0aW9ucz59ICovIChcbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoe1xuICAgIGRlY29kZVJlbW90YWJsZTogKF9lbmNvZGluZywgX2lubmVyRGVjb2RlKSA9PiB1bmRlZmluZWQsXG4gICAgZGVjb2RlUHJvbWlzZTogKF9lbmNvZGluZywgX2lubmVyRGVjb2RlKSA9PiB1bmRlZmluZWQsXG4gICAgZGVjb2RlRXJyb3I6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICB9KVxuKTtcblxuLyoqXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IHN0cmluZ30gZGVjb2RlU3RyaW5nU3VmZml4XG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcsIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZSwgc2tpcD86IG51bWJlcikgPT4gdW5rbm93bltdfSBkZWNvZGVBcnJheVxuICogQHBhcmFtIHtSZXF1aXJlZDxEZWNvZGVPcHRpb25zPn0gb3B0aW9uc1xuICogQHJldHVybnMgeyhlbmNvZGVkOiBzdHJpbmcsIHNraXA/OiBudW1iZXIpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCBtYWtlSW5uZXJEZWNvZGUgPSAoZGVjb2RlU3RyaW5nU3VmZml4LCBkZWNvZGVBcnJheSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlY29kZVJlbW90YWJsZSwgZGVjb2RlUHJvbWlzZSwgZGVjb2RlRXJyb3IgfSA9IG9wdGlvbnM7XG4gIC8qKiBAdHlwZSB7KGVuY29kZWQ6IHN0cmluZywgc2tpcD86IG51bWJlcikgPT4gUGFzc2FibGV9ICovXG4gIGNvbnN0IGlubmVyRGVjb2RlID0gKGVuY29kZWQsIHNraXAgPSAwKSA9PiB7XG4gICAgc3dpdGNoIChlbmNvZGVkLmNoYXJBdChza2lwKSkge1xuICAgICAgY2FzZSAndic6IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjYXNlICd6Jzoge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY2FzZSAnZic6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZUJpbmFyeTY0KGVuY29kZWQsIHNraXApO1xuICAgICAgfVxuICAgICAgY2FzZSAncyc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVN0cmluZ1N1ZmZpeChnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2InOiB7XG4gICAgICAgIGNvbnN0IHN1YnN0cmluZyA9IGdldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSk7XG4gICAgICAgIGlmIChzdWJzdHJpbmcgPT09ICd0cnVlJykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YnN0cmluZyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGV4cGVjdGVkIGVuY29kZWQgYm9vbGVhbiB0byBiZSBcImJ0cnVlXCIgb3IgXCJiZmFsc2VcIjogJHtzdWJzdHJpbmd9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ24nOlxuICAgICAgY2FzZSAncCc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZUJpZ0ludChnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCkpO1xuICAgICAgfVxuICAgICAgY2FzZSAncic6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVJlbW90YWJsZShnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJz8nOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVQcm9taXNlKGdldFN1ZmZpeChlbmNvZGVkLCBza2lwKSwgaW5uZXJEZWNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnISc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZUVycm9yKGdldFN1ZmZpeChlbmNvZGVkLCBza2lwKSwgaW5uZXJEZWNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAneSc6IHtcbiAgICAgICAgLyogU3RyaW5ncyBhbmQgc3ltYm9scyBzaGFyZSBkZWNvZGluZyBsb2dpYy4qL1xuICAgICAgICBjb25zdCBuYW1lID0gZGVjb2RlU3RyaW5nU3VmZml4KGdldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSkpO1xuICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnWyc6XG4gICAgICBjYXNlICdeJzoge1xuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFR5cGUgJ3Vua25vd25bXScgaXMgbm90IFBhc3NhYmxlKi9cbiAgICAgICAgcmV0dXJuIGRlY29kZUFycmF5KGVuY29kZWQsIGlubmVyRGVjb2RlLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJygnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVSZWNvcmQoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGlubmVyRGVjb2RlLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJzonOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVUYWdnZWQoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGlubmVyRGVjb2RlLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGRhdGFiYXNlIGtleTogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBpbm5lckRlY29kZTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFzc2FibGVLaXRcbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTxtYWtlSW5uZXJFbmNvZGU+fSBlbmNvZGVQYXNzYWJsZVxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPG1ha2VJbm5lckRlY29kZT59IGRlY29kZVBhc3NhYmxlXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZU9wdGlvbnMgJiBEZWNvZGVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXNzYWJsZUtpdH1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQYXNzYWJsZUtpdCA9IChvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZSA9IChyLCBfKSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3J9YCxcbiAgICBlbmNvZGVQcm9taXNlID0gKHAsIF8pID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3B9YCxcbiAgICBlbmNvZGVFcnJvciA9IChlcnIsIF8pID0+IEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YCxcbiAgICBmb3JtYXQgPSAnbGVnYWN5T3JkZXJlZCcsXG5cbiAgICBkZWNvZGVSZW1vdGFibGUgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YCxcbiAgICBkZWNvZGVQcm9taXNlID0gKGVuY29kaW5nLCBfKSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICAgIGRlY29kZUVycm9yID0gKGVuY29kaW5nLCBfKSA9PiBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgLyoqIEB0eXBlIHtQYXNzYWJsZUtpdFsnZW5jb2RlUGFzc2FibGUnXX0gKi9cbiAgbGV0IGVuY29kZVBhc3NhYmxlO1xuICBjb25zdCBlbmNvZGVPcHRpb25zID0geyBlbmNvZGVSZW1vdGFibGUsIGVuY29kZVByb21pc2UsIGVuY29kZUVycm9yLCBmb3JtYXQgfTtcbiAgaWYgKGZvcm1hdCA9PT0gJ2NvbXBhY3RPcmRlcmVkJykge1xuICAgIGNvbnN0IGxpYmVyYWxEZWNvZGUgPSBtYWtlSW5uZXJEZWNvZGUoXG4gICAgICBkZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgICAgZGVjb2RlQ29tcGFjdEFycmF5LFxuICAgICAgbGliZXJhbERlY29kZXJzLFxuICAgICk7XG4gICAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgICBjb25zdCB2ZXJpZnlFbmNvZGluZyA9IChlbmNvZGluZywgbGFiZWwpID0+IHtcbiAgICAgICFlbmNvZGluZy5tYXRjaChyQzApIHx8XG4gICAgICAgIEZhaWxgJHtiKFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICApfSBlbmNvZGluZyBtdXN0IG5vdCBjb250YWluIGEgQzAgY29udHJvbCBjaGFyYWN0ZXI6ICR7ZW5jb2Rpbmd9YDtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVDb21wYWN0QXJyYXkoYF52ICR7ZW5jb2Rpbmd9IHYgYCwgbGliZXJhbERlY29kZSk7XG4gICAgICAoaXNBcnJheShkZWNvZGVkKSAmJlxuICAgICAgICBkZWNvZGVkLmxlbmd0aCA9PT0gMyAmJlxuICAgICAgICBkZWNvZGVkWzBdID09PSBudWxsICYmXG4gICAgICAgIGRlY29kZWRbMl0gPT09IG51bGwpIHx8XG4gICAgICAgIEZhaWxgJHtiKGxhYmVsKX0gZW5jb2RpbmcgbXVzdCBiZSBlbWJlZGRhYmxlOiAke2VuY29kaW5nfWA7XG4gICAgfTtcbiAgICBjb25zdCBlbmNvZGVDb21wYWN0ID0gbWFrZUlubmVyRW5jb2RlKFxuICAgICAgZW5jb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbiAgICAgIGVuY29kZUNvbXBhY3RBcnJheSxcbiAgICAgIHsgLi4uZW5jb2RlT3B0aW9ucywgdmVyaWZ5RW5jb2RpbmcgfSxcbiAgICApO1xuICAgIGVuY29kZVBhc3NhYmxlID0gcGFzc2FibGUgPT4gYH4ke2VuY29kZUNvbXBhY3QocGFzc2FibGUpfWA7XG4gIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnbGVnYWN5T3JkZXJlZCcpIHtcbiAgICBlbmNvZGVQYXNzYWJsZSA9IG1ha2VJbm5lckVuY29kZShcbiAgICAgIGVuY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCxcbiAgICAgIGVuY29kZUxlZ2FjeUFycmF5LFxuICAgICAgZW5jb2RlT3B0aW9ucyxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIGZvcm1hdDogJHtxKGZvcm1hdCl9YDtcbiAgfVxuXG4gIGNvbnN0IGRlY29kZU9wdGlvbnMgPSB7IGRlY29kZVJlbW90YWJsZSwgZGVjb2RlUHJvbWlzZSwgZGVjb2RlRXJyb3IgfTtcbiAgY29uc3QgZGVjb2RlQ29tcGFjdCA9IG1ha2VJbm5lckRlY29kZShcbiAgICBkZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgIGRlY29kZUNvbXBhY3RBcnJheSxcbiAgICBkZWNvZGVPcHRpb25zLFxuICApO1xuICBjb25zdCBkZWNvZGVMZWdhY3kgPSBtYWtlSW5uZXJEZWNvZGUoXG4gICAgZGVjb2RlTGVnYWN5U3RyaW5nU3VmZml4LFxuICAgIGRlY29kZUxlZ2FjeUFycmF5LFxuICAgIGRlY29kZU9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRlY29kZVBhc3NhYmxlID0gZW5jb2RlZCA9PiB7XG4gICAgLyogQSBsZWFkaW5nIFwiflwiIGluZGljYXRlcyB0aGUgdjIgZW5jb2RpbmcgKHdpdGggZXNjYXBpbmcgaW4gc3RyaW5ncyByYXRoZXIgdGhhbiBhcnJheXMpLiovXG4gICAgLyogU2tpcCBpdCBpbnNpZGUgYGRlY29kZUNvbXBhY3RgIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbiAgICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuICAgIGlmIChlbmNvZGVkLmNoYXJBdCgwKSA9PT0gJ34nKSB7XG4gICAgICByZXR1cm4gZGVjb2RlQ29tcGFjdChlbmNvZGVkLCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY29kZUxlZ2FjeShlbmNvZGVkKTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgZW5jb2RlUGFzc2FibGUsIGRlY29kZVBhc3NhYmxlIH0pO1xufTskaM2PX29uY2UubWFrZVBhc3NhYmxlS2l0KG1ha2VQYXNzYWJsZUtpdCk7XG5oYXJkZW4obWFrZVBhc3NhYmxlS2l0KTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMge1Bhc3NhYmxlS2l0WydlbmNvZGVQYXNzYWJsZSddfVxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVBhc3NhYmxlID0gZW5jb2RlT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgZW5jb2RlUGFzc2FibGUgfSA9IG1ha2VQYXNzYWJsZUtpdChlbmNvZGVPcHRpb25zKTtcbiAgcmV0dXJuIGVuY29kZVBhc3NhYmxlO1xufTskaM2PX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMge1Bhc3NhYmxlS2l0WydkZWNvZGVQYXNzYWJsZSddfVxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZVBhc3NhYmxlID0gZGVjb2RlT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgZGVjb2RlUGFzc2FibGUgfSA9IG1ha2VQYXNzYWJsZUtpdChkZWNvZGVPcHRpb25zKTtcbiAgcmV0dXJuIGRlY29kZVBhc3NhYmxlO1xufTskaM2PX29uY2UubWFrZURlY29kZVBhc3NhYmxlKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZURlY29kZVBhc3NhYmxlKTtcblxuICAgICAgIGNvbnN0IGlzRW5jb2RlZFJlbW90YWJsZSA9IGVuY29kZWQgPT4gZW5jb2RlZC5jaGFyQXQoMCkgPT09ICdyJzskaM2PX29uY2UuaXNFbmNvZGVkUmVtb3RhYmxlKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5oYXJkZW4oaXNFbmNvZGVkUmVtb3RhYmxlKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlIHtSZWNvcmQ8UGFzc1N0eWxlLCBzdHJpbmc+fVxuICogVGhlIHNpbmdsZSBwcmVmaXggY2hhcmFjdGVycyB0byBiZSB1c2VkIGZvciBlYWNoIFBhc3NTdHlsZSBjYXRlZ29yeS5cbiAqIGBiaWdpbnRgIGlzIGEgdHdvLWNoYXJhY3RlciBzdHJpbmcgYmVjYXVzZSBlYWNoIG9mIHRob3NlIGNoYXJhY3RlcnNcbiAqIGluZGl2aWR1YWxseSBpcyBhIHZhbGlkIGJpZ2ludCBwcmVmaXggKGBuYCBmb3IgXCJuZWdhdGl2ZVwiIGFuZCBgcGAgZm9yXG4gKiBcInBvc2l0aXZlXCIpLCBhbmQgY29weUFycmF5IGlzIGEgdHdvLWNoYXJhY3RlciBzdHJpbmcgYmVjYXVzZSBvbmUgZW5jb2RpbmdcbiAqIHByZWZpeGVzIGFycmF5cyB3aXRoIGBbYCB3aGlsZSB0aGUgb3RoZXIgdXNlcyBgXmAgKHdoaWNoIGlzIHByb2hpYml0ZWQgZnJvbVxuICogYXBwZWFyaW5nIGluIGFuIGVuY29kZWQgc3RyaW5nKS5cbiAqIFRoZSBvcmRlcmluZyBvZiB0aGVzZSBwcmVmaXhlcyBpcyB0aGUgc2FtZSBhcyB0aGUgcmFua09yZGVyaW5nIG9mIHRoZWlyXG4gKiByZXNwZWN0aXZlIFBhc3NTdHlsZXMsIGFuZCByYW5rT3JkZXIuanMgaW1wb3J0cyB0aGUgdGFibGUgZm9yIHRoaXMgcHVycG9zZS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgYHxgIGlzIHRoZSByZW1vdGFibGUtPm9yZGluYWwgbWFwcGluZyBwcmVmaXg6XG4gKiBUaGlzIGlzIG5vdCB1c2VkIGluIGNvdmVycyBidXQgaXQgaXNcbiAqIHJlc2VydmVkIGZyb20gdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIE5vdGUgdGhhdCB0aGUgcHJlZml4IGlzID4gYW55XG4gKiBwcmVmaXggdXNlZCBieSBhbnkgY292ZXIgc28gdGhhdCBvcmRpbmFsIG1hcHBpbmcga2V5cyBhcmUgYWx3YXlzIG91dHNpZGVcbiAqIHRoZSByYW5nZSBvZiB2YWxpZCBjb2xsZWN0aW9uIGVudHJ5IGtleXMuXG4gKi9cbiAgICAgICBjb25zdCBwYXNzU3R5bGVQcmVmaXhlcyA9IHtcbiAgZXJyb3I6ICchJyxcbiAgY29weVJlY29yZDogJygnLFxuICB0YWdnZWQ6ICc6JyxcbiAgcHJvbWlzZTogJz8nLFxuICBjb3B5QXJyYXk6ICdbXicsXG4gIGJ5dGVBcnJheTogJ2EnLFxuICBib29sZWFuOiAnYicsXG4gIG51bWJlcjogJ2YnLFxuICBiaWdpbnQ6ICducCcsXG4gIHJlbW90YWJsZTogJ3InLFxuICBzdHJpbmc6ICdzJyxcbiAgbnVsbDogJ3YnLFxuICBzeW1ib2w6ICd5JyxcbiAgLyogQmVjYXVzZSBBcnJheS5wcm90b3R5cGUuc29ydCBwdXRzIHVuZGVmaW5lZCB2YWx1ZXMgYXQgdGhlIGVuZCB3aXRob3V0Ki9cbiAgLyogcGFzc2luZyB0aGVtIHRvIGEgY29tcGFyaXNvbiBmdW5jdGlvbiwgdW5kZWZpbmVkIE1VU1QgYmUgdGhlIGxhc3QqL1xuICAvKiBjYXRlZ29yeS4qL1xuICB1bmRlZmluZWQ6ICd6Jyxcbn07JGjNj19vbmNlLnBhc3NTdHlsZVByZWZpeGVzKHBhc3NTdHlsZVByZWZpeGVzKTtcbk9iamVjdC5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVQcmVmaXhlcywgbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUHJlZml4ZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVjb3JkTmFtZXMiOlsicmVjb3JkTmFtZXMiXSwicmVjb3JkVmFsdWVzIjpbInJlY29yZFZhbHVlcyJdLCJ6ZXJvUGFkIjpbInplcm9QYWQiXSwibWFrZVBhc3NhYmxlS2l0IjpbIm1ha2VQYXNzYWJsZUtpdCJdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIl0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSJdLCJwYXNzU3R5bGVQcmVmaXhlcyI6WyJwYXNzU3R5bGVQcmVmaXhlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADVwnO6F0QAABdEAAArAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsaXNQcmltaXRpdmUsZ2V0VGFnLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzYWJsZSwgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJyAqL1xuLyoqIEBpbXBvcnQge0VuY29kaW5nLCBFbmNvZGluZ1VuaW9ufSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3Qge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBkZWZpbmVQcm9wZXJ0aWVzLFxuICBpcyxcbiAgZW50cmllcyxcbiAgZnJvbUVudHJpZXMsXG4gIGZyZWV6ZSxcbiAgaGFzT3duLFxufSA9IE9iamVjdDtcblxuLyoqXG4gKiBTcGVjaWFsIHByb3BlcnR5IG5hbWUgdGhhdCBpbmRpY2F0ZXMgYW4gZW5jb2RpbmcgdGhhdCBuZWVkcyBzcGVjaWFsXG4gKiBkZWNvZGluZy5cbiAqL1xuY29uc3QgUUNMQVNTID0gJ0BxY2xhc3MnOyRozY9fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RpbmcgJiBvYmplY3R9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtlbmNvZGVkIGlzIEVuY29kaW5nVW5pb259XG4gKi9cbmNvbnN0IGhhc1FDbGFzcyA9IGVuY29kZWQgPT4gaGFzT3duKGVuY29kZWQsIFFDTEFTUyk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtzdHJpbmd9IHFjbGFzc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHFjbGFzc01hdGNoZXMgPSAoZW5jb2RlZCwgcWNsYXNzKSA9PlxuICAhaXNQcmltaXRpdmUoZW5jb2RlZCkgJiZcbiAgIWlzQXJyYXkoZW5jb2RlZCkgJiZcbiAgaGFzUUNsYXNzKGVuY29kZWQpICYmXG4gIGVuY29kZWRbUUNMQVNTXSA9PT0gcWNsYXNzO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvQ2FwRGF0YU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZU9iamVjdCxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gcmVtID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gcHJvbSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YSA9IGVyciA9PiBGYWlsYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9DYXBEYXRhT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlVG9DYXBEYXRhID0gKGVuY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbiAgICBlbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG4gICAgZW5jb2RlRXJyb3JUb0NhcERhdGEgPSBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEsXG4gIH0gPSBlbmNvZGVPcHRpb25zO1xuXG4gIC8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRlbHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvQ2FwRGF0YWAgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb0NhcERhdGFgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG4gIGNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyID0gcGFzc2FibGUgPT4ge1xuICAgIC8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuICAgIC8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBhcyBbUUNMQVNTXSBjb21wb3NpdGVzLiovXG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGFzc2FibGUpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICAvKiBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG4gICAgICAgIHJldHVybiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICd1bmRlZmluZWQnIH07XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIC8qIFNwZWNpYWwtY2FzZSBudW1iZXJzIHdpdGggbm8gZGlnaXQtYmFzZWQgcmVwcmVzZW50YXRpb24uKi9cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihwYXNzYWJsZSkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ05hTicgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ0luZmluaXR5JyB9O1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJy1JbmZpbml0eScgfTtcbiAgICAgICAgfVxuICAgICAgICAvKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG4gICAgICAgIHJldHVybiBpcyhwYXNzYWJsZSwgLTApID8gMCA6IHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAnYmlnaW50JyxcbiAgICAgICAgICBkaWdpdHM6IFN0cmluZyhwYXNzYWJsZSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW1FDTEFTU106ICdzeW1ib2wnLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICBpZiAoaGFzT3duKHBhc3NhYmxlLCBRQ0xBU1MpKSB7XG4gICAgICAgICAgLyogSGlsYmVydCBob3RlbCovXG4gICAgICAgICAgY29uc3QgeyBbUUNMQVNTXTogcWNsYXNzVmFsdWUsIC4uLnJlc3QgfSA9IHBhc3NhYmxlO1xuICAgICAgICAgIC8qKiBAdHlwZSB7RW5jb2Rpbmd9ICovXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgW1FDTEFTU106ICdoaWxiZXJ0JyxcbiAgICAgICAgICAgIG9yaWdpbmFsOiBlbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAob3duS2V5cyhyZXN0KS5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgLyogV2UgaGFyZGVuIHRoZSBlbnRpcmUgY2FwRGF0YSBlbmNvZGluZyBiZWZvcmUgd2UgcmV0dXJuIGl0LiovXG4gICAgICAgICAgICAvKiBgZW5jb2RlVG9DYXBEYXRhYCByZXF1aXJlcyB0aGF0IGl0cyBpbnB1dCBiZSBQYXNzYWJsZSwgYW5kKi9cbiAgICAgICAgICAgIC8qIHRoZXJlZm9yZSBoYXJkZW5lZC4qL1xuICAgICAgICAgICAgLyogVGhlIGBmcmVlemVgIGhlcmUgaXMgbmVlZGVkIGFueXdheSwgYmVjYXVzZSB0aGUgYHJlc3RgIGlzKi9cbiAgICAgICAgICAgIC8qIGZyZXNobHkgY29uc3RydWN0ZWQgYnkgdGhlIGAuLi5gIGFib3ZlLCBhbmQgd2UncmUgdXNpbmcgaXQqL1xuICAgICAgICAgICAgLyogYXMgaW1wdXQgaW4gYW5vdGhlciBjYWxsIHRvIGBlbmNvZGVUb0NhcERhdGFgLiovXG4gICAgICAgICAgICByZXN1bHQucmVzdCA9IGVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbiAgICAgICAgLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbiAgICAgICAgLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbiAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhcbiAgICAgICAgICBuYW1lcy5tYXAobmFtZSA9PiBbbmFtZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgICAvKiBUT0RPIGltcGxlbWVudCovXG4gICAgICAgIHRocm93IEZhaWxgbWFyc2FsIG9mIGJ5dGVBcnJheSBub3QgeWV0IGltcGxlbWVudGVkOiAke3Bhc3NhYmxlfWA7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW1FDTEFTU106ICd0YWdnZWQnLFxuICAgICAgICAgIHRhZzogZ2V0VGFnKHBhc3NhYmxlKSxcbiAgICAgICAgICBwYXlsb2FkOiBlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZS5wYXlsb2FkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YShcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb0NhcERhdGFSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ3Nsb3QnKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIC8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgKX0gJHtxKCdzbG90Jyl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVQcm9taXNlVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdzbG90JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgICAnc2xvdCcsXG4gICAgICAgICl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ2Vycm9yJykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICBRQ0xBU1MsXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICBYYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG4gICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgZW5jb2RlVG9DYXBEYXRhID0gcGFzc2FibGUgPT4ge1xuICAgIGlmIChpc0Vycm9yTGlrZShwYXNzYWJsZSkpIHtcbiAgICAgIC8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuICAgICAgLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbiAgICAgIC8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4gICAgICAvKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbiAgICAgIC8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbiAgICAgIC8qKi9cbiAgICAgIC8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuICAgICAgLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuICAgICAgLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4gICAgICAvKiB0aGlzIGluZm9ybWF0aW9uLiovXG4gICAgICByZXR1cm4gaGFyZGVuKGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cikpO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb0NhcERhdGEobWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5oYXJkZW4obWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGVPYmplY3QpfSBbZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGVPYmplY3QpfSBbZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEgPSBzbG90RW5jb2RpbmcgPT5cbiAgRmFpbGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGEgPSBlcnJvckVuY29kaW5nID0+XG4gIEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJvckVuY29kaW5nfWA7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaFxuICogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uXG4gKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZVxuICogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS5cbiAqXG4gKiBUaGlzIHNlZW1zIGxpa2UgdGhlIGJlc3Qgc3RhcnRpbmcgcG9pbnQgdG8gaW5jcmVtZW50YWxseSBldm9sdmUgdG8gYW5cbiAqIEFQSSB3aGVyZSB0aGVzZSBjYW4gcmVsaWFibHkgZGlmZmVyLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNFxuICpcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IEVuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9IChkZWNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhID0gZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICBkZWNvZGVFcnJvckZyb21DYXBEYXRhID0gZG9udERlY29kZUVycm9yRnJvbUNhcERhdGEsXG4gIH0gPSBkZWNvZGVPcHRpb25zO1xuXG4gIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhID09PSBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgfHxcbiAgICBGYWlsYEFuIGltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uIGZvciBub3c6IElmIGVpdGhlciBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSBvciBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lOiAke3EoXG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSxcbiAgICApfSB2cyAke3EoZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhKX1gO1xuXG4gIC8qKlxuICogYGRlY29kZUZyb21DYXBEYXRhYCBtYXkgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBqc29uRW5jb2RlZGBcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvQ2FwRGF0YWBcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbUNhcERhdGFgIGNhbm5vdCByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbUNhcERhdGFgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30ganNvbkVuY29kZWQgbXVzdCBiZSBoYXJkZW5lZFxuICovXG4gIGNvbnN0IGRlY29kZUZyb21DYXBEYXRhID0ganNvbkVuY29kZWQgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShqc29uRW5jb2RlZCkpIHtcbiAgICAgIC8qIHByaW1pdGl2ZXMgcGFzcyB0aHJvdWdoKi9cbiAgICAgIHJldHVybiBqc29uRW5jb2RlZDtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkoanNvbkVuY29kZWQpKSB7XG4gICAgICByZXR1cm4ganNvbkVuY29kZWQubWFwKGVuY29kZWRWYWwgPT4gZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCkpO1xuICAgIH0gZWxzZSBpZiAoaGFzUUNsYXNzKGpzb25FbmNvZGVkKSkge1xuICAgICAgY29uc3QgcWNsYXNzID0ganNvbkVuY29kZWRbUUNMQVNTXTtcbiAgICAgIHR5cGVvZiBxY2xhc3MgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIEZhaWxgaW52YWxpZCAke3EoUUNMQVNTKX0gdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuICAgICAgc3dpdGNoIChxY2xhc3MpIHtcbiAgICAgICAgLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbiAgICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTmFOJzoge1xuICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnSW5maW5pdHknOiB7XG4gICAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICBjb25zdCB7IGRpZ2l0cyB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgdHlwZW9mIGRpZ2l0cyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xuICAgICAgICAgIHJldHVybiBCaWdJbnQoZGlnaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgLyogRGVwcmVjYXRlZCBxY2xhc3MuIFRPRE8gbWFrZSBjb25kaXRpb25hbCovXG4gICAgICAgICAgLyogb24gZW52aXJvbm1lbnQgdmFyaWFibGUuIEV2ZW50dWFsbHkgcmVtb3ZlLCBidXQgYWZ0ZXIgY29uZmlkZW50Ki9cbiAgICAgICAgICAvKiB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHN1cHBvcnRlZCBzZW5kZXJzLiovXG4gICAgICAgICAgLyoqL1xuICAgICAgICAgIHJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICAvKiBTZWUgbm90ZSBhYm92ZSBhYm91dCBob3cgdGhlIGN1cnJlbnQgZW5jb2RpbmcgY2Fubm90IHJlbGlhYmx5Ki9cbiAgICAgICAgICAvKiBkaXN0aW5ndWlzaCB3aGljaCB3ZSBzaG91bGQgY2FsbCwgc28gaW4gdGhlIG5vbi1kZWZhdWx0IGNhc2UqL1xuICAgICAgICAgIC8qIGJvdGggbXVzdCBiZSB0aGUgc2FtZSBhbmQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggd2UgY2FsbC4qL1xuICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YShcbiAgICAgICAgICAgIGpzb25FbmNvZGVkLFxuICAgICAgICAgICAgZGVjb2RlRnJvbUNhcERhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvKiBCRVdBUkU6IGNhcGRhdGEgZG9lcyBub3QgY2hlY2sgdGhhdCBgZGVjb2RlZGAgaXMqL1xuICAgICAgICAgIC8qIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZSwgc2luY2UgdGhhdCB3b3VsZCBicmVhayBzb21lKi9cbiAgICAgICAgICAvKiBjYXBkYXRhIGNsaWVudHMuIFdlIGFyZSBkZXByZWNhdGluZyBjYXBkYXRhLCBhbmQgdGhlc2UgY2xpZW50cyovXG4gICAgICAgICAgLyogd2lsbCBuZWVkIHRvIHVwZGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHNtYWxsY2Fwcy4qL1xuICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVFcnJvckZyb21DYXBEYXRhKFxuICAgICAgICAgICAganNvbkVuY29kZWQsXG4gICAgICAgICAgICBkZWNvZGVGcm9tQ2FwRGF0YSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwYXNzU3R5bGVPZihkZWNvZGVkKSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbUNhcERhdGEgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke2RlY29kZWR9YDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoaWxiZXJ0Jzoge1xuICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIGhhc093bihqc29uRW5jb2RlZCwgJ29yaWdpbmFsJykgfHxcbiAgICAgICAgICAgIEZhaWxgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7anNvbkVuY29kZWR9YDtcbiAgICAgICAgICAvKiBEb24ndCBoYXJkZW4gc2luY2Ugd2UncmUgbm90IGRvbmUgbXV0YXRpbmcgaXQqL1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgW1FDTEFTU106IGRlY29kZUZyb21DYXBEYXRhKG9yaWdpbmFsKSB9O1xuICAgICAgICAgIGlmIChoYXNPd24oanNvbkVuY29kZWQsICdyZXN0JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzTm9uRW1wdHlPYmplY3QgPVxuICAgICAgICAgICAgICB0eXBlb2YgcmVzdCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgcmVzdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA+PSAxO1xuICAgICAgICAgICAgaWYgKCFpc05vbkVtcHR5T2JqZWN0KSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN0T2JqID0gZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4gICAgICAgICAgICAvKiBUT0RPIHJlYWxseSBzaG91bGQgYXNzZXJ0IHRoYXQgYHBhc3NTdHlsZU9mKHJlc3QpYCBpcyovXG4gICAgICAgICAgICAvKiBgJ2NvcHlSZWNvcmQnYCBidXQgd2UnZCBoYXZlIHRvIGhhcmRlbiBpdCBhbmQgaXQgaXMgdG9vKi9cbiAgICAgICAgICAgIC8qIGVhcmx5IHRvIGRvIHRoYXQuKi9cbiAgICAgICAgICAgICFoYXNPd24ocmVzdE9iaiwgUUNMQVNTKSB8fFxuICAgICAgICAgICAgICBGYWlsYFJlc3QgbXVzdCBub3QgY29udGFpbiBpdHMgb3duIGRlZmluaXRpb24gb2YgJHtxKFFDTEFTUyl9YDtcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHJlc3RPYmopKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFRoaXMgaXMgdGhlIGVycm9yIGNhc2Ugd2UncmUgdGVzdGluZyBmb3IqL1xuICAgICAgICBjYXNlICdpYmlkJzoge1xuICAgICAgICAgIHRocm93IEZhaWxgVGhlIGNhcERhdGEgcHJvdG9jb2wgbm8gbG9uZ2VyIHN1cHBvcnRzICR7cShRQ0xBU1MpfSAke3EoXG4gICAgICAgICAgICBxY2xhc3MsXG4gICAgICAgICAgKX1gO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgIFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuICAgICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZCA9PT0gJ29iamVjdCcgJiYganNvbkVuY29kZWQgIT09IG51bGwpO1xuICAgICAgY29uc3QgZGVjb2RlRW50cnkgPSAoW25hbWUsIGVuY29kZWRWYWxdKSA9PiB7XG4gICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIEZhaWxgUHJvcGVydHkgJHtxKG5hbWUpfSBvZiAke2pzb25FbmNvZGVkfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgcmV0dXJuIFtuYW1lLCBkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKV07XG4gICAgICB9O1xuICAgICAgY29uc3QgZGVjb2RlZEVudHJpZXMgPSBlbnRyaWVzKGpzb25FbmNvZGVkKS5tYXAoZGVjb2RlRW50cnkpO1xuICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZGVjb2RlRnJvbUNhcERhdGEpO1xufTskaM2PX29uY2UubWFrZURlY29kZUZyb21DYXBEYXRhKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJRQ0xBU1MiOlsiUUNMQVNTIl0sIm1ha2VFbmNvZGVUb0NhcERhdGEiOlsibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiOlsibWFrZURlY29kZUZyb21DYXBEYXRhIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAA1TX470RQAA9EUAAC0AAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIiwibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxnZXRUYWcsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxYLEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzYWJsZSwgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJyAqL1xuLyogRklYTUUgZGVmaW5lIGFjdHVhbCB0eXBlcyovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IGlzLCBlbnRyaWVzLCBmcm9tRW50cmllcywgaGFzT3duIH0gPSBPYmplY3Q7XG5cbmNvbnN0IEJBTkcgPSAnIScuY2hhckNvZGVBdCgwKTtcbmNvbnN0IERBU0ggPSAnLScuY2hhckNvZGVBdCgwKTtcblxuLyoqXG4gKiBBbiBgZW5jb2RlVG9TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGEgcGFzc2FibGUgYW5kIHJldHVybnMgYVxuICogSlNPTi1yZXByZXNlbnRhYmxlIG9iamVjdCAoaS5lLiwgcm91bmQtdHJpcHBpbmcgaXQgdGhyb3VnaFxuICogYEpTT04uc3RyaW5naWZ5YCBhbmQgYEpTT04ucGFyc2VgIHdpdGggbm8gcmVwbGFjZXJzIG9yIHJldml2ZXJzXG4gKiByZXR1cm5zIGFuIGVxdWl2YWxlbnQgc3RydWN0dXJlIGV4Y2VwdCBmb3Igb2JqZWN0IGlkZW50aXR5KS5cbiAqIFdlIGNhbGwgdGhpcyByZXByZXNlbnRhdGlvbiBhIFNtYWxsY2FwcyBFbmNvZGluZy5cbiAqXG4gKiBBIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhcyBhcmd1bWVudCB3aGF0IGl0XG4gKiAqYXNzdW1lcyogaXMgdGhlIHJlc3VsdCBvZiBhIHBsYWluIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlc29sdmVyLiBJdCB0aGVuXG4gKiBtdXN0IHZhbGlkYXRlIHRoYXQgaXQgaXMgYSB2YWxpZCBTbWFsbGNhcHMgRW5jb2RpbmcsIGFuZCBpZiBpdCBpcyxcbiAqIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgcGFzc2FibGUuXG4gKlxuICogU21hbGxjYXBzIGNvbnNpZGVycyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIGAhYCAoYXNjaWkgY29kZSAzMywgQkFORylcbiAqIGFuZCBgLWAgKGFzY2lpIGNvZGUgNDUsIERBU0gpIHRvIGJlIHNwZWNpYWwgcHJlZml4ZXMgYWxsb3dpbmdcbiAqIHJlcHJlc2VudGF0aW9uIG9mIEpTT04taW5jb21wYXRpYmxlIGRhdGEgdXNpbmcgc3RyaW5ncy5cbiAqIFRoZXNlIGNoYXJhY3RlcnMsIGluIG9yZGVyLCBhcmUgYCFcIiMkJSYnKCkqKywtYFxuICogT2YgdGhlc2UsIHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAqIGAhYCAtIGVzY2FwZWQgc3RyaW5nXG4gKiAgKiBgK2AgLSBub24tbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgLWAgLSBuZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAjYCAtIG1hbmlmZXN0IGNvbnN0YW50XG4gKiAgKiBgJWAgLSBzeW1ib2xcbiAqICAqIGAkYCAtIHJlbW90YWJsZVxuICogICogYCZgIC0gcHJvbWlzZVxuICpcbiAqIEFsbCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgKGBcIicoKSosYCkgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBjb25zdGFudHMgdGhhdCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgZm9yIHZhbHVlczpcbiAqICAqIGAjdW5kZWZpbmVkYFxuICogICogYCNOYU5gXG4gKiAgKiBgI0luZmluaXR5YFxuICogICogYCMtSW5maW5pdHlgXG4gKlxuICogYW5kIGZvciBwcm9wZXJ0eSBuYW1lcyBhbmFsb2dvdXMgdG8gY2FwZGF0YSBAcWNsYXNzOlxuICogICogYCN0YWdgXG4gKiAgKiBgI2Vycm9yYFxuICpcbiAqIEFsbCBvdGhlciBlbmNvZGVkIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYCNgIGFyZSByZXNlcnZlZCBmb3JcbiAqIGZ1dHVyZSB1c2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRTdHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsID0gZW5jb2RlZFN0ciA9PiB7XG4gIGlmIChlbmNvZGVkU3RyID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiBjaGFyQ29kZUF0KDApIGFuZCBudW1iZXIgY29tcGFyZSBpcyBhIGJpdCBmYXN0ZXIuKi9cbiAgY29uc3QgY29kZSA9IGVuY29kZWRTdHIuY2hhckNvZGVBdCgwKTtcbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHlvZGEqL1xuICByZXR1cm4gQkFORyA8PSBjb2RlICYmIGNvZGUgPD0gREFTSDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGVPYmplY3QsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZUVycm9yVG9TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gcmVtID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSBwcm9tID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSBlcnIgPT5cbiAgRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvU21hbGxjYXBzT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBlbmNvZGVPcHRpb25zIGlzIGFjdHVhbGx5IG9wdGlvbmFsLCBidXQgbm90IG1hcmtlZCBhcyBzdWNoIHRvIHdvcmsgYXJvdW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMjg2XG4gKlxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nfVxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVRvU21hbGxjYXBzID0gKGVuY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG4gICAgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbiAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzID0gZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHMsXG4gIH0gPSBlbmNvZGVPcHRpb25zO1xuXG4gIGNvbnN0IGFzc2VydEVuY29kZWRFcnJvciA9IGVuY29kaW5nID0+IHtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnb2JqZWN0JyAmJiBoYXNPd24oZW5jb2RpbmcsICcjZXJyb3InKSkgfHxcbiAgICAgIEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG4gICAgICAgIGVuY29kaW5nLFxuICAgICAgKX1gO1xuICAgIC8qIEFzc2VydCB0aGF0IHRoZSAjZXJyb3IgcHJvcGVydHkgZGVjb2RlcyB0byBhIHN0cmluZy4qL1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmNvZGluZ1snI2Vycm9yJ107XG4gICAgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyAmJlxuICAgICAgKCFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpIHx8IG1lc3NhZ2UuY2hhckF0KDApID09PSAnIScpKSB8fFxuICAgICAgRmFpbGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIHN0cmluZyBtZXNzYWdlOiAke3EobWVzc2FnZSl9YDtcbiAgfTtcblxuICAvKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHthbnl9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7U21hbGxjYXBzRW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb1NtYWxsY2Fwc2AgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb1NtYWxsY2Fwc2AgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbiAgY29uc3QgZW5jb2RlVG9TbWFsbGNhcHNSZWN1ciA9IHBhc3NhYmxlID0+IHtcbiAgICAvKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbiAgICAvKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgaW50byBzbWFsbGNhcHMgc3RyaW5ncy4qL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzoge1xuICAgICAgICAvKiBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG4gICAgICAgIHJldHVybiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgaWYgKHN0YXJ0c1NwZWNpYWwocGFzc2FibGUpKSB7XG4gICAgICAgICAgLyogU3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYSBzcGVjaWFsIGNoYXIgYXJlIHF1b3RlZCB3aXRoIGAhYC4qL1xuICAgICAgICAgIC8qIFNpbmNlIGAhYCBpcyBpdHNlbGYgYSBzcGVjaWFsIGNoYXJhY3RlciwgdGhpcyB0cml2aWFsbHkgZG9lcyovXG4gICAgICAgICAgLyogdGhlIEhpbGJlcnQgaG90ZWwuIEFsc28sIHNpbmNlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlKi9cbiAgICAgICAgICAvKiBhIGNvbnRpbnVvdXMgc3VicmFuZ2Ugb2YgYXNjaWksIHRoaXMgcXVvdGluZyBpcyBzb3J0LW9yZGVyKi9cbiAgICAgICAgICAvKiBwcmVzZXJ2aW5nLiovXG4gICAgICAgICAgcmV0dXJuIGAhJHtwYXNzYWJsZX1gO1xuICAgICAgICB9XG4gICAgICAgIC8qIEFsbCBvdGhlciBzdHJpbmdzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4gJyN1bmRlZmluZWQnO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICAvKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFzc2FibGUpKSB7XG4gICAgICAgICAgcmV0dXJuICcjTmFOJztcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gJyNJbmZpbml0eSc7XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IC1JbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiAnIy1JbmZpbml0eSc7XG4gICAgICAgIH1cbiAgICAgICAgLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xuICAgICAgICByZXR1cm4gaXMocGFzc2FibGUsIC0wKSA/IDAgOiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKHBhc3NhYmxlKTtcbiAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7YmlnaW50fSAqLyAocGFzc2FibGUpIDwgMG4gPyBzdHIgOiBgKyR7c3RyfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKSk7XG4gICAgICAgIHJldHVybiBgJSR7bmFtZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbiAgICAgICAgLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbiAgICAgICAgLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbiAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhcbiAgICAgICAgICBuYW1lcy5tYXAobmFtZSA9PiBbXG4gICAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKG5hbWUpLFxuICAgICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZVtuYW1lXSksXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG4gICAgICB9XG4gICAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICAgIC8qIFRPRE8gaW1wbGVtZW50Ki9cbiAgICAgICAgdGhyb3cgRmFpbGBtYXJzYWwgb2YgYnl0ZUFycmF5IG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7cGFzc2FibGV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAnI3RhZyc6IGVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnICYmIHJlc3VsdC5jaGFyQXQoMCkgPT09ICckJykge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJFwiOiAke3Jlc3VsdH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxuICAgICAgICAgIHBhc3NhYmxlLFxuICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyAmJiByZXN1bHQuY2hhckF0KDApID09PSAnJicpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJlwiOiAke3Jlc3VsdH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsIGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuICAgICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgWGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzID0gcGFzc2FibGUgPT4ge1xuICAgIGlmIChpc0Vycm9yTGlrZShwYXNzYWJsZSkpIHtcbiAgICAgIC8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuICAgICAgLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbiAgICAgIC8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4gICAgICAvKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbiAgICAgIC8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbiAgICAgIC8qKi9cbiAgICAgIC8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuICAgICAgLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuICAgICAgLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4gICAgICAvKiB0aGlzIGluZm9ybWF0aW9uLiovXG4gICAgICBjb25zdCByZXN1bHQgPSBoYXJkZW4oXG4gICAgICAgIGVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsIGVuY29kZVRvU21hbGxjYXBzUmVjdXIpLFxuICAgICAgKTtcbiAgICAgIGFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlKSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHMpO1xufTskaM2PX29uY2UubWFrZUVuY29kZVRvU21hbGxjYXBzKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5oYXJkZW4obWFrZUVuY29kZVRvU21hbGxjYXBzKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGVPYmplY3R9IFtkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgPSBlbmNvZGluZyA9PlxuICBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7cShlbmNvZGluZyl9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogU21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2FwcyxcbiAgfSA9IGRlY29kZU9wdGlvbnM7XG5cbiAgLyoqXG4gKiBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbWF5IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBgZW5jb2RpbmdgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb1NtYWxsY2Fwc2BcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgY2Fubm90IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7U21hbGxjYXBzRW5jb2Rpbmd9IGVuY29kaW5nIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuICBjb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT4ge1xuICAgIHN3aXRjaCAodHlwZW9mIGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBpZiAoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGMgPSBlbmNvZGluZy5jaGFyQXQoMCk7XG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgICAgICAvKiB1bi1oaWxiZXJ0LWlmeSB0aGUgc3RyaW5nKi9cbiAgICAgICAgICAgIHJldHVybiBlbmNvZGluZy5zbGljZSgxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJSc6IHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2Rpbmcuc2xpY2UoMSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcjJzoge1xuICAgICAgICAgICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgICAgICAgICBjYXNlICcjdW5kZWZpbmVkJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnI05hTic6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJyNJbmZpbml0eSc6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnIy1JbmZpbml0eSc6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgICAgIFhgdW5rbm93biBjb25zdGFudCBcIiR7cShlbmNvZGluZyl9XCJgLFxuICAgICAgICAgICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgY2FzZSAnLSc6IHtcbiAgICAgICAgICAgIHJldHVybiBCaWdJbnQoZW5jb2RpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICckJzoge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyhcbiAgICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLyogQHRzLWlnbm9yZSBYWFggU21hbGxDYXBzRW5jb2RpbmcqL1xuICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKHJlc3VsdCkgIT09ICdyZW1vdGFibGUnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJic6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocGFzc1N0eWxlT2YocmVzdWx0KSAhPT0gJ3Byb21pc2UnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYFNwZWNpYWwgY2hhciAke3EoXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICApfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICBpZiAoZW5jb2RpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShlbmNvZGluZykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RpbmcubWFwKHZhbCA9PiBkZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093bihlbmNvZGluZywgJyN0YWcnKSkge1xuICAgICAgICAgIGNvbnN0IHsgJyN0YWcnOiB0YWcsIHBheWxvYWQsIC4uLnJlc3QgfSA9IGVuY29kaW5nO1xuICAgICAgICAgIHR5cGVvZiB0YWcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgIEZhaWxgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbiAgICAgICAgICByZXR1cm4gbWFrZVRhZ2dlZChcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHModGFnKSxcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMocGF5bG9hZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd24oZW5jb2RpbmcsICcjZXJyb3InKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbiAgICAgICAgICAgIGVuY29kaW5nLFxuICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhc3NTdHlsZU9mKHJlc3VsdCkgPT09ICdlcnJvcicgfHxcbiAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlY29kZUVudHJ5ID0gKFtlbmNvZGVkTmFtZSwgZW5jb2RlZFZhbF0pID0+IHtcbiAgICAgICAgICB0eXBlb2YgZW5jb2RlZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYFByb3BlcnR5IG5hbWUgJHtxKFxuICAgICAgICAgICAgICBlbmNvZGVkTmFtZSxcbiAgICAgICAgICAgICl9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgIGVuY29kZWROYW1lLmNoYXJBdCgwKSAhPT0gJyMnIHx8XG4gICAgICAgICAgICBGYWlsYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbiAgICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICByZXR1cm4gW25hbWUsIGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBkZWNvZGVkRW50cmllcyA9IGVudHJpZXMoZW5jb2RpbmcpLm1hcChkZWNvZGVFbnRyeSk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG4gICAgICAgICAgICB0eXBlb2YgZW5jb2RpbmcsXG4gICAgICAgICAgKX06ICR7ZW5jb2Rpbmd9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFyZGVuKGRlY29kZUZyb21TbWFsbGNhcHMpO1xufTskaM2PX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVuY29kZVRvU21hbGxjYXBzIjpbIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABCdBXpvkIAAL5CAAAqAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtanVzdGluLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbImRlY29kZVRvSnVzdGluIiwicGFzc2FibGVBc0p1c3RpbiIsInFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxYLEZhaWwsTmF0LGdldEVycm9yQ29uc3RydWN0b3IsaXNQcmltaXRpdmUsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxRQ0xBU1MsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dXV0sW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7U3RyaW5nYWJsZVBheWxvYWR9IGZyb20gJ3Nlcyc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtFbmNvZGluZ30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgc3RyaW5naWZ5OiBxdW90ZSB9ID0gSlNPTjtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbmRlbnRlclxuICogQHByb3BlcnR5IHsob3BlbkJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBvcGVuXG4gKiBAcHJvcGVydHkgeygpID0+IG51bWJlcn0gbGluZVxuICogQHByb3BlcnR5IHsodG9rZW46IHN0cmluZykgPT4gbnVtYmVyfSBuZXh0XG4gKiBAcHJvcGVydHkgeyhjbG9zZUJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBjbG9zZVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGRvbmVcbiAqL1xuXG4vKipcbiAqIEdlbmVyb3VzIHdoaXRlc3BhY2UgZm9yIHJlYWRhYmlsaXR5XG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlWWVzSW5kZW50ZXIgPSAoKSA9PiB7XG4gIGNvbnN0IHN0cmluZ3MgPSBbXTtcbiAgbGV0IGxldmVsID0gMDtcbiAgbGV0IG5lZWRTcGFjZSA9IGZhbHNlO1xuICBjb25zdCBsaW5lID0gKCkgPT4ge1xuICAgIG5lZWRTcGFjZSA9IGZhbHNlO1xuICAgIHJldHVybiBzdHJpbmdzLnB1c2goJ1xcbicsICcgICcucmVwZWF0KGxldmVsKSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHtcbiAgICAgIGxldmVsICs9IDE7XG4gICAgICBpZiAobmVlZFNwYWNlKSB7XG4gICAgICAgIHN0cmluZ3MucHVzaCgnICcpO1xuICAgICAgfVxuICAgICAgbmVlZFNwYWNlID0gZmFsc2U7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KTtcbiAgICB9LFxuICAgIGxpbmUsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKG5lZWRTcGFjZSAmJiB0b2tlbiAhPT0gJywnICYmIHRva2VuICE9PSAnKScpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSB0cnVlO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gICAgfSxcbiAgICBjbG9zZTogY2xvc2VCcmFja2V0ID0+IHtcbiAgICAgIGFzc2VydChsZXZlbCA+PSAxKTtcbiAgICAgIGxldmVsIC09IDE7XG4gICAgICBsaW5lKCk7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gICAgfSxcbiAgICBkb25lOiAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwobGV2ZWwsIDApO1xuICAgICAgcmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIElmIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBvbmUgdG9rZW4gdG9nZXRoZXIgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyXG4gKiBvZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoaXMgcGF0dGVybiwgdGhlbiB0aGUgdHdvIHRva2VucyBtdXN0IGJlXG4gKiBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSB0byBwcmVzZXJ2ZSB0aGVpciBtZWFuaW5nLiBPdGhlcndpc2UgdGhlXG4gKiB3aGl0ZXNwYWNlIGluIHVubmVjZXNzYXJ5LlxuICpcbiAqIFRoZSBgPCFgIGFuZCBgLT5gIGNhc2VzIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgZm9ybWF0aW9uIG9mIGFuXG4gKiBodG1sLWxpa2UgY29tbWVudC4gSSBkb24ndCB0aGluayB0aGUgZG91YmxlIGFuZ2xlIGJyYWNrZXRzIGFyZSBhY3R1YWxseVxuICogbmVlZGVkIGJ1dCBJIGhhdmVuJ3QgdGhvdWdodCBhYm91dCBpdCBlbm91Z2ggdG8gcmVtb3ZlIHRoZW0uXG4gKi9cbmNvbnN0IGJhZFBhaXJQYXR0ZXJuID0gL14oPzpcXHdcXHd8PDx8Pj58XFwrXFwrfC0tfDwhfC0+KSQvO1xuXG4vKipcbiAqIE1pbmltdW0gd2hpdGVzcGFjZSBuZWVkZWQgdG8gcHJlc2V2ZSBtZWFuaW5nLlxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZU5vSW5kZW50ZXIgPSAoKSA9PiB7XG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IHN0cmluZ3MgPSBbXTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgb3Blbjogb3BlbkJyYWNrZXQgPT4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KSxcbiAgICBsaW5lOiAoKSA9PiBzdHJpbmdzLmxlbmd0aCxcbiAgICBuZXh0OiB0b2tlbiA9PiB7XG4gICAgICBpZiAoc3RyaW5ncy5sZW5ndGggPj0gMSkge1xuICAgICAgICBjb25zdCBsYXN0ID0gc3RyaW5nc1tzdHJpbmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyAtLSBlcnJvciovXG4gICAgICAgIGlmIChsYXN0Lmxlbmd0aCA+PSAxICYmIHRva2VuLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgY29uc3QgcGFpciA9IGAke2xhc3RbbGFzdC5sZW5ndGggLSAxXX0ke3Rva2VuWzBdfWA7XG4gICAgICAgICAgaWYgKGJhZFBhaXJQYXR0ZXJuLnRlc3QocGFpcikpIHtcbiAgICAgICAgICAgIHN0cmluZ3MucHVzaCgnICcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gICAgfSxcbiAgICBjbG9zZTogY2xvc2VCcmFja2V0ID0+IHtcbiAgICAgIGlmIChzdHJpbmdzLmxlbmd0aCA+PSAxICYmIHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXSA9PT0gJywnKSB7XG4gICAgICAgIHN0cmluZ3MucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gICAgfSxcbiAgICBkb25lOiAoKSA9PiBzdHJpbmdzLmpvaW4oJycpLFxuICB9KTtcbn07XG5cbmNvbnN0IGlkZW50UGF0dGVybiA9IC9eW2EtekEtWl1cXHcqJC87XG5oYXJkZW4oaWRlbnRQYXR0ZXJuKTtcbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuID0gL15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZEluZGVudFxuICogQHBhcmFtIHthbnlbXX0gW3Nsb3RzXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW4gPSAoZW5jb2RpbmcsIHNob3VsZEluZGVudCA9IGZhbHNlLCBzbG90cyA9IFtdKSA9PiB7XG4gIC8qKlxuICogVGhlIGZpcnN0IHBhc3MgZG9lcyBzb21lIGlucHV0IHZhbGlkYXRpb24uXG4gKiBJdHMgY29udHJvbCBmbG93IHNob3VsZCBtaXJyb3IgYHJlY3VyYCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlXG4gKiBhbmQgdGhlIHR3byBzaG91bGQgYmUgbWFpbnRhaW5lZCB0b2dldGhlci4gVGhleSBtdXN0IHZpc2l0IGV2ZXJ5dGhpbmdcbiAqIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIFRPRE8gbm93IHRoYXQgaWJpZHMgYXJlIGdvbmUsIHdlIHNob3VsZCBmb2xkIHRoaXMgYmFjayB0b2dldGhlciBpbnRvXG4gKiBvbmUgdmFsaWRhdGluZyBwYXNzLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gIGNvbnN0IHByZXBhcmUgPSByYXdUcmVlID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUocmF3VHJlZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG4gICAgYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCAnb2JqZWN0Jyk7XG4gICAgYXNzZXJ0KHJhd1RyZWUgIT09IG51bGwpO1xuICAgIGlmIChRQ0xBU1MgaW4gcmF3VHJlZSkge1xuICAgICAgY29uc3QgcWNsYXNzID0gcmF3VHJlZVtRQ0xBU1NdO1xuICAgICAgdHlwZW9mIHFjbGFzcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgRmFpbGBpbnZhbGlkIHFjbGFzcyB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG4gICAgICBhc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuICAgICAgc3dpdGNoIChyYXdUcmVlWydAcWNsYXNzJ10pIHtcbiAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgY2FzZSAnTmFOJzpcbiAgICAgICAgY2FzZSAnSW5maW5pdHknOlxuICAgICAgICBjYXNlICctSW5maW5pdHknOiB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICBjb25zdCB7IGRpZ2l0cyB9ID0gcmF3VHJlZTtcbiAgICAgICAgICB0eXBlb2YgZGlnaXRzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgICBjb25zdCBzeW0gPSBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihzeW0sICdzeW1ib2wnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHsgdGFnLCBwYXlsb2FkIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YodGFnLCAnc3RyaW5nJyk7XG4gICAgICAgICAgcHJlcGFyZShwYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICBjb25zdCB7IGluZGV4LCBpZmFjZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKGluZGV4LCAnbnVtYmVyJyk7XG4gICAgICAgICAgTmF0KGluZGV4KTtcbiAgICAgICAgICBpZiAoaWZhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihpZmFjZSwgJ3N0cmluZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSByYXdUcmVlO1xuICAgICAgICAgICdvcmlnaW5hbCcgaW4gcmF3VHJlZSB8fFxuICAgICAgICAgICAgRmFpbGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWA7XG4gICAgICAgICAgcHJlcGFyZShvcmlnaW5hbCk7XG4gICAgICAgICAgaWYgKCdyZXN0JyBpbiByYXdUcmVlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3QgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIG51bGxgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQXJyYXkocmVzdCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgYW4gYXJyYXlgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFFDTEFTUyBpbiByZXN0KSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyZXN0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICAgICBGYWlsYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgICAgICBwcmVwYXJlKHJlc3RbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lLCBtZXNzYWdlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIG5hbWUpfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGdldEVycm9yQ29uc3RydWN0b3IobmFtZSkgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgRmFpbGBNdXN0IGJlIHRoZSBuYW1lIG9mIGFuIEVycm9yIGNvbnN0cnVjdG9yICR7bmFtZX1gO1xuICAgICAgICAgIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgbWVzc2FnZSl9YDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgYXNzZXJ0LmZhaWwoWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsIFR5cGVFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmF3VHJlZSkpIHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSByYXdUcmVlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBwcmVwYXJlKHJhd1RyZWVbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmF3VHJlZSk7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IEZhaWxgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgIH1cbiAgICAgICAgcHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbWFrZUluZGVudGVyID0gc2hvdWxkSW5kZW50ID8gbWFrZVllc0luZGVudGVyIDogbWFrZU5vSW5kZW50ZXI7XG4gIGxldCBvdXQgPSBtYWtlSW5kZW50ZXIoKTtcblxuICAvKipcbiAqIFRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIHJlY3Vyc2lvbiBhZnRlciB0aGUgZmlyc3QgcGFzcyBgcHJlcGFyZWAuXG4gKiBUaGUgZmlyc3QgcGFzcyBkaWQgc29tZSBpbnB1dCB2YWxpZGF0aW9uIHNvXG4gKiBoZXJlIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGV2ZXJ5dGhpbmcgdGhvc2UgdGhpbmdzIGFyZSB2YWxpZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICBjb25zdCBkZWNvZGUgPSByYXdUcmVlID0+IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIHJldHVybiByZWN1cihyYXdUcmVlKTtcbiAgfTtcblxuICBjb25zdCBkZWNvZGVQcm9wZXJ0eSA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgIG91dC5saW5lKCk7XG4gICAgaWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAvKiBKYXZhU2NyaXB0IGludGVycHJldHMgYHtfX3Byb3RvX186IHgsIC4uLn1gKi9cbiAgICAgIC8qIGFzIG1ha2luZyBhbiBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGB4YCwgd2hlcmVhcyovXG4gICAgICAvKiBpbiBKU09OIGl0IGlzIHNpbXBseSBhIHByb3BlcnR5IG5hbWUuIFByZXNlcnZlIHRoZSovXG4gICAgICAvKiBKU09OIG1lYW5pbmcuKi9cbiAgICAgIG91dC5uZXh0KGBbXCJfX3Byb3RvX19cIl06YCk7XG4gICAgfSBlbHNlIGlmIChpZGVudFBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgb3V0Lm5leHQoYCR7bmFtZX06YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5uZXh0KGAke3F1b3RlKG5hbWUpfTpgKTtcbiAgICB9XG4gICAgZGVjb2RlKHZhbHVlKTtcbiAgICBvdXQubmV4dCgnLCcpO1xuICB9O1xuXG4gIC8qKlxuICogTW9kZWxlZCBhZnRlciBgZnVsbFJldml2ZWAgaW4gbWFyc2hhbC5qc1xuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgY29uc3QgcmVjdXIgPSByYXdUcmVlID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUocmF3VHJlZSkpIHtcbiAgICAgIC8qIHByaW1pdGl2ZXMgZ2V0IHF1b3RlZCovXG4gICAgICByZXR1cm4gb3V0Lm5leHQocXVvdGUocmF3VHJlZSkpO1xuICAgIH1cbiAgICAvKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbiAgICBhc3NlcnQudHlwZW9mKHJhd1RyZWUsICdvYmplY3QnKTtcbiAgICBhc3NlcnQocmF3VHJlZSAhPT0gbnVsbCk7XG4gICAgaWYgKFFDTEFTUyBpbiByYXdUcmVlKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSByYXdUcmVlW1FDTEFTU107XG4gICAgICBhc3NlcnQudHlwZW9mKHFjbGFzcywgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIC8qIFN3aXRjaGluZyBvbiBgZW5jb2RlZFtRQ0xBU1NdYCAob3IgYW55dGhpbmcgbGVzcyBkaXJlY3QsIGxpa2UqL1xuICAgICAgLyogYHFjbGFzc2ApIGRvZXMgbm90IGRpc2NyaW1pbmF0ZSByYXdUcmVlIGluIHR5cGVzY3JpcHRANC4yLjMgYW5kKi9cbiAgICAgIC8qIGVhcmxpZXIuKi9cbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIC8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIC8qIFRoZWlyIHFjbGFzcyBpcyB0aGVpciBleHByZXNzaW9uIHNvdXJjZS4qL1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICBjb25zdCB7IGRpZ2l0cyB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKGRpZ2l0cywgJ3N0cmluZycpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgJHtCaWdJbnQoZGlnaXRzKX1uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIC8qIFRPRE8gZGVwcmVjYXRlZC4gRXZlbnR1YWxseSByZW1vdmUuKi9cbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgICBjb25zdCBzeW0gPSBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihzeW0sICdzeW1ib2wnKTtcbiAgICAgICAgICBjb25zdCByZWdpc3RlcmVkTmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChzeW0pO1xuICAgICAgICAgIGlmIChyZWdpc3RlcmVkTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IEF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG4gICAgICAgICAgICBhc3NlcnQobWF0Y2ggIT09IG51bGwpO1xuICAgICAgICAgICAgY29uc3Qgc3VmZml4ID0gbWF0Y2hbMV07XG4gICAgICAgICAgICBhc3NlcnQoU3ltYm9sW3N1ZmZpeF0gPT09IHN5bSk7XG4gICAgICAgICAgICBhc3NlcnQoaWRlbnRQYXR0ZXJuLnRlc3Qoc3VmZml4KSk7XG4gICAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYFN5bWJvbC4ke3N1ZmZpeH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBwYXNzYWJsZVN5bWJvbEZvck5hbWUoJHtxdW90ZShyZWdpc3RlcmVkTmFtZSl9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBvdXQubmV4dChgbWFrZVRhZ2dlZCgke3F1b3RlKHRhZyl9YCk7XG4gICAgICAgICAgb3V0Lm5leHQoJywnKTtcbiAgICAgICAgICBkZWNvZGUocGF5bG9hZCk7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KCcpJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdzbG90Jzoge1xuICAgICAgICAgIGNvbnN0IHsgaWZhY2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoTmF0KHJhd1RyZWUuaW5kZXgpKTtcbiAgICAgICAgICBjb25zdCBuZXN0ZWRSZW5kZXIgPSBhcmcgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2xkT3V0ID0gb3V0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgb3V0ID0gbWFrZU5vSW5kZW50ZXIoKTtcbiAgICAgICAgICAgICAgZGVjb2RlKGFyZyk7XG4gICAgICAgICAgICAgIHJldHVybiBvdXQuZG9uZSgpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgb3V0ID0gb2xkT3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGluZGV4IDwgc2xvdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJlZFNsb3QgPSBuZXN0ZWRSZW5kZXIoc2xvdHNbaW5kZXhdKTtcbiAgICAgICAgICAgIHJldHVybiBpZmFjZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gb3V0Lm5leHQoYHNsb3RUb1ZhbCgke3JlbmRlcmVkU2xvdH0pYClcbiAgICAgICAgICAgICAgOiBvdXQubmV4dChgc2xvdFRvVmFsKCR7cmVuZGVyZWRTbG90fSwke25lc3RlZFJlbmRlcihpZmFjZSl9KWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaWZhY2UgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBvdXQubmV4dChgc2xvdCgke2luZGV4fSlgKVxuICAgICAgICAgICAgOiBvdXQubmV4dChgc2xvdCgke2luZGV4fSwke25lc3RlZFJlbmRlcihpZmFjZSl9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSByYXdUcmVlO1xuICAgICAgICAgIG91dC5vcGVuKCd7Jyk7XG4gICAgICAgICAgZGVjb2RlUHJvcGVydHkoUUNMQVNTLCBvcmlnaW5hbCk7XG4gICAgICAgICAgaWYgKCdyZXN0JyBpbiByYXdUcmVlKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKHJlc3QsICdvYmplY3QnKTtcbiAgICAgICAgICAgIGFzc2VydChyZXN0ICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyZXN0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRmFpbGBQcm9wZXJ0eSBuYW1lICR7cShcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgKX0gb2YgJHtyZXN0fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShuYW1lLCByZXN0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnfScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICBjYXVzZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVycm9ycyA9IHVuZGVmaW5lZCxcbiAgICAgICAgICB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBjYXVzZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYGVycm9yIGNhdXNlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIG5hbWUgIT09IGBBZ2dyZWdhdGVFcnJvcmAgfHxcbiAgICAgICAgICAgIEZhaWxgQWdncmVnYXRlRXJyb3Igbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG4gICAgICAgICAgZXJyb3JzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgZXJyb3IgZXJyb3JzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgIFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuICAgICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmF3VHJlZSkpIHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSByYXdUcmVlO1xuICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQub3BlbignWycpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgb3V0LmxpbmUoKTtcbiAgICAgICAgICBkZWNvZGUocmF3VHJlZVtpXSk7XG4gICAgICAgICAgb3V0Lm5leHQoJywnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIHJhd1RyZWUgaXMgYW4gYEVuY29kaW5nUmVjb3JkYCB3aGljaCBvbmx5IGhhcyBzdHJpbmcga2V5cywqL1xuICAgICAgLyogYnV0IHNpbmNlIG93bktleXMgaXMgbm90IGdlbmVyaWMsIGl0IGNhbid0IHByb3BhZ2F0ZSB0aGF0Ki9cbiAgICAgIGNvbnN0IG5hbWVzID0gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKG93bktleXMocmF3VHJlZSkpO1xuICAgICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ3t9Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQub3BlbigneycpO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShuYW1lLCByYXdUcmVlW25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBwcmVwYXJlKGVuY29kaW5nKTtcbiAgZGVjb2RlKGVuY29kaW5nKTtcbiAgcmV0dXJuIG91dC5kb25lKCk7XG59OyRozY9fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Nob3VsZEluZGVudF1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCBwYXNzYWJsZUFzSnVzdGluID0gKHBhc3NhYmxlLCBzaG91bGRJbmRlbnQgPSB0cnVlKSA9PiB7XG4gIGxldCBzbG90Q291bnQgPSAwO1xuICAvKiBVc2luZyBwb3N0LWluY3JlbWVudCBiZWxvdyBvbmx5IHNvIHRoYXQgdGhlIGluZGV4ZXMgc3RhcnQgYXQgemVybyovXG4gIC8qIGFuZCB0aGUgYHNsb3RDb3VudGAgdmFyaWFibGUgY2FuIGJlIGluaXRpYWxpemVkIHRvIGAwYCByYXRoZXIgdGhhbiovXG4gIC8qIGAtMWAuKi9cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbiAgY29uc3QgY29udmVydFZhbFRvU2xvdCA9IHZhbCA9PiBgcyR7c2xvdENvdW50Kyt9YDtcbiAgY29uc3QgeyB0b0NhcERhdGEgfSA9IG1ha2VNYXJzaGFsKGNvbnZlcnRWYWxUb1Nsb3QpO1xuICBjb25zdCB7IGJvZHksIHNsb3RzIH0gPSB0b0NhcERhdGEocGFzc2FibGUpO1xuICBjb25zdCBlbmNvZGVkID0gSlNPTi5wYXJzZShib2R5KTtcbiAgcmV0dXJuIGRlY29kZVRvSnVzdGluKGVuY29kZWQsIHNob3VsZEluZGVudCwgc2xvdHMpO1xufTskaM2PX29uY2UucGFzc2FibGVBc0p1c3RpbihwYXNzYWJsZUFzSnVzdGluKTtcbmhhcmRlbihwYXNzYWJsZUFzSnVzdGluKTtcblxuLyogVGhlIGV4YW1wbGUgYmVsb3cgaXMgdGhlIGBwYXR0MWAgdGVzdCBjYXNlIGZyb20gYHFwLW9uLXBhdHRlcm4udGVzdC5qc2AuKi9cbi8qIFBsZWFzZSBjby1tYWludGFpbiB0aGUgZm9sbG93aW5nIGRvYy1jb21tZW50IGFuZCB0aGF0IHRlc3QgbW9kdWxlLiovXG4vKipcbiAqIGBxcGAgZm9yIHF1b3RlIHBhc3NhYmxlIGFzIGEgcXVhc2ktcXVvdGVkIEp1c3RpbiBleHByZXNzaW9uLlxuICpcbiAqIEJvdGggYHFgIGZyb20gYEBlbmRvL2Vycm9yc2AgYW5kIHRoaXMgYHFwYCBmcm9tIGBAZW5kby9tYXJzaGFsYCBjYW5cbiAqIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBgRmFpbGAsIGBYYCwgZXRjIGZyb20gYEBlbmRvL2Vycm9yc2AgdG8gbWFya1xuICogYSBzdWJzdGl0dXRpb24gdmFsdWUgdG8gYmUgYm90aFxuICogLSB2aXN1YWxseSBxdW90ZWQgaW4gc29tZSB1c2VmdWwgbWFubmVyXG4gKiAtIHVucmVkYWN0ZWRcbiAqXG4gKiBEaWZmZXJlbmNlczpcbiAqIC0gZ2l2ZW4gYSBwYXR0ZXJuIGBNLmFuZChNLmd0ZSgtMTAwKSwgTS5sdGUoMTAwKSlgLFxuICogICBgYGBqc1xuICogICBgJHtxKHBhdHQpfWBcbiAqICAgYGBgXG4gKiAgIHByb2R1Y2VzIGBcIlttYXRjaDphbmRdXCJgLCB3aGVyZWFzXG4gKiAgIGBgYGpzXG4gKiAgIGAke3FwKHBhdHQpfWBcbiAqICAgYGBgXG4gKiAgIHByb2R1Y2VzIHF1YXNpLXF1b3RlcyBKdXN0aW4gb2Ygd2hhdCB3b3VsZCBiZSBwYXNzZWQ6XG4gKiAgIGBgYGpzXG4gKiAgIGBtYWtlVGFnZ2VkKFwibWF0Y2g6YW5kXCIsIFtcbiAqICAgICBtYWtlVGFnZ2VkKFwibWF0Y2g6Z3RlXCIsIC0xMDApLFxuICogICAgIG1ha2VUYWdnZWQoXCJtYXRjaDpsdGVcIiwgMTAwKSxcbiAqICAgXSlgXG4gKiAgIGBgYFxuICogLSBgcWAgaXMgbGF6eSwgbWluaW1pemluZyB0aGUgY29zdCBmb3IgdXNpbmcgaXQgaW4gYW4gZXJyb3IgdGhhdCdzIG5ldmVyXG4gKiAgIGxvZ2dlZC4gVW5mb3J0dW5hdGVseSwgZHVlIHRvIGxheWVyaW5nIGNvbnN0cmFpbnRzLCBgcXBgIGlzIG5vdFxuICogICBsYXp5LCBhbHdheXMgcmVuZGVyaW5nIHRvIHF1YXNpLXF1b3RlZCBKdXN0aW4gaW1tZWRpYXRlbHkuXG4gKlxuICogU2luY2UgSnVzdGluIGlzIGEgc3Vic2V0IG9mIEhhcmRlbmVkSlMsIG5laXRoZXIgdGhlIG5hbWUgYHFwYCBub3IgdGhlXG4gKiByZW5kZXJlZCBmb3JtIG5lZWQgdG8gbWFrZSBjbGVhciB0aGF0IHRoZSByZW5kZXJlZCBmb3JtIGlzIGluIEp1c3RpbiByYXRoZXJcbiAqIHRoYW4gSGFyZGVuZWRKUy5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXlsb2FkXG4gKiBAcmV0dXJucyB7U3RyaW5nYWJsZVBheWxvYWR9XG4gKi9cbiAgICAgICBjb25zdCBxcCA9IHBheWxvYWQgPT4gYFxcYCR7cGFzc2FibGVBc0p1c3RpbihoYXJkZW4ocGF5bG9hZCksIHRydWUpfVxcYGA7JGjNj19vbmNlLnFwKHFwKTtcbmhhcmRlbihxcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiJdLCJwYXNzYWJsZUFzSnVzdGluIjpbInBhc3NhYmxlQXNKdXN0aW4iXSwicXAiOlsicXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAq3GB+KEJAAChCQAALQAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJyAqL1xuXG5jb25zdCB7IGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFZhbFRvU2xvdCA9IHZhbCA9PlxuICBGYWlsYE1hcnNoYWwncyBzdHJpbmdpZnkgcmVqZWN0cyBwcmVzZW5jZXMgYW5kIHByb21pc2VzICR7dmFsfWA7XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsID0gKHNsb3QsIF9pZmFjZSkgPT5cbiAgRmFpbGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90cyAke3Nsb3R9YDtcblxuY29uc3QgYmFkQXJyYXlIYW5kbGVyID0gaGFyZGVuKHtcbiAgZ2V0OiAoX3RhcmdldCwgbmFtZSwgX3JlY2VpdmVyKSA9PiB7XG4gICAgaWYgKG5hbWUgPT09ICdsZW5ndGgnKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xuICAgIHRocm93IEZhaWxgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gIH0sXG59KTtcblxuLyoqXG4gKiBgZnJlZXplYCBidXQgbm90IGBoYXJkZW5gIHRoZSBwcm94eSB0YXJnZXQgc28gaXQgcmVtYWlucyB0cmFwcGluZy5cbiAqIFRodXMsIGl0IHNob3VsZCBub3QgYmUgc2hhcmVkIG91dHNpZGUgdGhpcyBtb2R1bGUuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2VzL2RvY3MvcHJlcGFyaW5nLWZvci1zdGFiaWxpemUubWRcbiAqL1xuY29uc3QgYXJyYXlUYXJnZXQgPSBmcmVlemUoLyoqIEB0eXBlIHthbnlbXX0gKi8gKFtdKSk7XG5jb25zdCBiYWRBcnJheSA9IG5ldyBQcm94eShhcnJheVRhcmdldCwgYmFkQXJyYXlIYW5kbGVyKTtcblxuY29uc3QgeyBzZXJpYWxpemUsIHVuc2VyaWFsaXplIH0gPSBtYWtlTWFyc2hhbChcbiAgZG9Ob3RDb252ZXJ0VmFsVG9TbG90LFxuICBkb05vdENvbnZlcnRTbG90VG9WYWwsXG4gIHtcbiAgICBlcnJvclRhZ2dpbmc6ICdvZmYnLFxuICAgIC8qIFRPRE8gZml4IHRlc3RzIHRvIHdvcmtzIHdpdGggc21hbGxjYXBzLiovXG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ2NhcGRhdGEnLFxuICB9LFxuKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHN0cmluZ2lmeSA9IHZhbCA9PiBzZXJpYWxpemUodmFsKS5ib2R5OyRozY9fb25jZS5zdHJpbmdpZnkoc3RyaW5naWZ5KTtcbmhhcmRlbihzdHJpbmdpZnkpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgcGFyc2UgPSBzdHIgPT5cbiAgdW5zZXJpYWxpemUoXG4gICAgLyogYGZyZWV6ZWAgYnV0IG5vdCBgaGFyZGVuYCBzaW5jZSB0aGUgYGJhZEFycmF5YCBwcm94eSBhbmQgaXRzIHRhcmdldCovXG4gICAgLyogbXVzdCByZW1haW4gdHJhcHBpbmcuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9kb2NzL3ByZXBhcmluZy1mb3Itc3RhYmlsaXplLm1kKi9cbiAgICBmcmVlemUoe1xuICAgICAgYm9keTogc3RyLFxuICAgICAgc2xvdHM6IGJhZEFycmF5LFxuICAgIH0pLFxuICApOyRozY9fb25jZS5wYXJzZShwYXJzZSk7XG5oYXJkZW4ocGFyc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABlWIW1fD8AAHw/AAAjAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2VuY29kZVRvU21hbGxjYXBzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsYXNzZXJ0UGFzc2FibGUsZ2V0SW50ZXJmYWNlT2YsZ2V0RXJyb3JDb25zdHJ1Y3Rvcix0b1Bhc3NhYmxlRXJyb3IsWCxGYWlsLHEsbWFrZUVycm9yLGFubm90YXRlRXJyb3Isb2JqZWN0TWFwLFFDTEFTUyxtYWtlRW5jb2RlVG9DYXBEYXRhLG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyxtYWtlRW5jb2RlVG9TbWFsbGNhcHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRozY9fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJ0b1Bhc3NhYmxlRXJyb3JcIixbJGjNj19hID0+ICh0b1Bhc3NhYmxlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dLFtcIm1ha2VFbmNvZGVUb0NhcERhdGFcIixbJGjNj19hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjNj19hKV1dLFtcIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YVwiLFskaM2PX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9TbWFsbGNhcHMuanNcIiwgW1tcIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzXCIsWyRozY9fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaM2PX2EpXV0sW1wibWFrZUVuY29kZVRvU21hbGxjYXBzXCIsWyRozY9fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q29udmVydFNsb3RUb1ZhbCwgQ29udmVydFZhbFRvU2xvdCwgRnJvbUNhcERhdGEsIE1ha2VNYXJzaGFsT3B0aW9ucywgVG9DYXBEYXRhfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBQYXNzYWJsZUNhcCwgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0ludGVyZmFjZVNwZWN9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7RW5jb2Rpbmd9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHsgZGVmaW5lUHJvcGVydGllcywgaGFzT3duIH0gPSBPYmplY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKiogQHR5cGUge0NvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbiA9IHggPT4geDtcbi8qKiBAdHlwZSB7Q29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFNsb3RUb1ZhbEZuID0gKHgsIF8pID0+IHg7XG5cbi8qKlxuICogQHRlbXBsYXRlIFNsb3RcbiAqIEBwYXJhbSB7Q29udmVydFZhbFRvU2xvdDxTbG90Pn0gW2NvbnZlcnRWYWxUb1Nsb3RdXG4gKiBAcGFyYW0ge0NvbnZlcnRTbG90VG9WYWw8U2xvdD59IFtjb252ZXJ0U2xvdFRvVmFsXVxuICogQHBhcmFtIHtNYWtlTWFyc2hhbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNYXJzaGFsID0gKFxuICBjb252ZXJ0VmFsVG9TbG90ID0gZGVmYXVsdFZhbFRvU2xvdEZuLFxuICBjb252ZXJ0U2xvdFRvVmFsID0gZGVmYXVsdFNsb3RUb1ZhbEZuLFxuICB7XG4gICAgZXJyb3JUYWdnaW5nID0gJ29uJyxcbiAgICBtYXJzaGFsTmFtZSA9ICdhbm9uLW1hcnNoYWwnLFxuICAgIC8qIFRPRE8gVGVtcG9yYXJ5IGhhY2suKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzgwKi9cbiAgICBlcnJvcklkTnVtID0gMTAwMDAsXG4gICAgLyogV2UgcHJlZmVyIHRoYXQgdGhlIGNhbGxlciBpbnN0ZWFkIGxvZyB0byBzb21ld2hlcmUgaGlkZGVuKi9cbiAgICAvKiB0byBiZSByZXZlYWxlZCB3aGVuIGNvcnJlbGF0aW5nIHdpdGggdGhlIHJlY2VpdmVkIGVycm9yLiovXG4gICAgbWFyc2hhbFNhdmVFcnJvciA9IGVyciA9PlxuICAgICAgY29uc29sZS5sb2coJ1RlbXBvcmFyeSBsb2dnaW5nIG9mIHNlbnQgZXJyb3InLCBlcnIpLFxuICAgIC8qIERlZmF1bHQgdG8gJ2NhcGRhdGEnIGJlY2F1c2UgaXQgd2FzIGltcGxlbWVudGVkIGZpcnN0LiovXG4gICAgLyogU29tZXRpbWVzLCBvbnRvZ2VueSBkb2VzIHJlY2FwaXR1bGF0ZSBwaHlsb2dlbnkgOykqL1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQgPSAnY2FwZGF0YScsXG4gIH0gPSB7fSxcbikgPT4ge1xuICBhc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCAnc3RyaW5nJyk7XG4gIGVycm9yVGFnZ2luZyA9PT0gJ29uJyB8fFxuICAgIGVycm9yVGFnZ2luZyA9PT0gJ29mZicgfHxcbiAgICBGYWlsYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG4gIGNvbnN0IG5leHRFcnJvcklkID0gKCkgPT4ge1xuICAgIGVycm9ySWROdW0gKz0gMTtcbiAgICByZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuICB9O1xuXG4gIC8qKlxuICogQHR5cGUge1RvQ2FwRGF0YTxTbG90Pn1cbiAqL1xuICBjb25zdCB0b0NhcERhdGEgPSByb290ID0+IHtcbiAgICBjb25zdCBzbG90cyA9IFtdO1xuICAgIC8qIG1hcHMgdmFsIChwcm9taXNlIG9yIHJlbW90YWJsZSkgdG8gaW5kZXggb2Ygc2xvdHNbXSovXG4gICAgY29uc3Qgc2xvdE1hcCA9IG5ldyBNYXAoKTtcblxuICAgIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZUNhcH0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHt7aW5kZXg6IG51bWJlciwgcmVwZWF0OiBib29sZWFufX1cbiAqL1xuICAgIGNvbnN0IGVuY29kZVNsb3RDb21tb24gPSBwYXNzYWJsZSA9PiB7XG4gICAgICBsZXQgaW5kZXggPSBzbG90TWFwLmdldChwYXNzYWJsZSk7XG4gICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBUT0RPIGFzc2VydCB0aGF0IGl0J3MgdGhlIHNhbWUgaWZhY2UgYXMgYmVmb3JlKi9cbiAgICAgICAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgaW5kZXgsIHJlcGVhdDogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgaW5kZXggPSBzbG90cy5sZW5ndGg7XG4gICAgICBjb25zdCBzbG90ID0gY29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG4gICAgICBzbG90cy5wdXNoKHNsb3QpO1xuICAgICAgc2xvdE1hcC5zZXQocGFzc2FibGUsIGluZGV4KTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBpbmRleCwgcmVwZWF0OiBmYWxzZSB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiB1bmtub3dufSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319XG4gKi9cbiAgICBjb25zdCBlbmNvZGVFcnJvckNvbW1vbiA9IChlcnIsIGVuY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZW5jb2RlUmVjdXIoYCR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICBhc3NlcnQudHlwZW9mKG1lc3NhZ2UsICdzdHJpbmcnKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbmNvZGVSZWN1cihgJHtlcnIubmFtZX1gKTtcbiAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgLyogVE9ETyBNdXN0IGVuY29kZSBgY2F1c2VgLCBgZXJyb3JzYCwgYnV0Ki9cbiAgICAgIC8qIG9ubHkgb25jZSBhbGwgcG9zc2libGUgY291bnRlcnBhcnR5IGRlY29kZXJzIGFyZSB0b2xlcmFudCBvZiovXG4gICAgICAvKiByZWNlaXZpbmcgdGhlbS4qL1xuICAgICAgaWYgKGVycm9yVGFnZ2luZyA9PT0gJ29uJykge1xuICAgICAgICAvKiBXZSBkZWxpYmVyYXRlbHkgZG8gbm90IHNoYXJlIHRoZSBzdGFjaywgYnV0IGl0IHdvdWxkKi9cbiAgICAgICAgLyogYmUgdXNlZnVsIHRvIGxvZyB0aGUgc3RhY2sgbG9jYWxseSBzbyBzb21lb25lIHdobyBoYXMqL1xuICAgICAgICAvKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuICAgICAgICAvKiB0aGUgcHJvYmxlbSB3aXRoIHRoZSByZW1vdGUgVmF0IHRoYXQgZ2V0cyB0aGlzKi9cbiAgICAgICAgLyogc3VtbWFyeS4gSWYgd2UgZG8gdGhhdCwgd2UgY291bGQgYWxsb2NhdGUgc29tZSByYW5kb20qL1xuICAgICAgICAvKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbiAgICAgICAgLyogd2l0aCB0aGUgY29ycmVsYXRpb24uKi9cbiAgICAgICAgY29uc3QgZXJyb3JJZCA9IGVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuICAgICAgICBhc3NlcnQudHlwZW9mKGVycm9ySWQsICdzdHJpbmcnKTtcbiAgICAgICAgYW5ub3RhdGVFcnJvcihlcnIsIFhgU2VudCBhcyAke2Vycm9ySWR9YCk7XG4gICAgICAgIG1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGVycm9ySWQsIG1lc3NhZ2UsIG5hbWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgbWVzc2FnZSwgbmFtZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHNlcmlhbGl6ZUJvZHlGb3JtYXQgPT09ICdjYXBkYXRhJykge1xuICAgICAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlQ2FwfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbiAgICAgIGNvbnN0IGVuY29kZVNsb3RUb0NhcERhdGEgPSAocGFzc2FibGUsIGlmYWNlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIHJlcGVhdCB9ID0gZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbiAgICAgICAgaWYgKHJlcGVhdCA9PT0gdHJ1ZSB8fCBpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnc2xvdCcsIGluZGV4IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ3Nsb3QnLCBpZmFjZSwgaW5kZXggfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8qKiBAdHlwZSB7KHByb21pc2U6IFJlbW90YWJsZU9iamVjdCwgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmcpID0+IEVuY29kaW5nfSAqL1xuICAgICAgY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gKHZhbCwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9DYXBEYXRhKHZhbCwgZ2V0SW50ZXJmYWNlT2YodmFsKSk7XG5cbiAgICAgIC8qKiBAdHlwZSB7KHByb21pc2U6IFByb21pc2UsIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nKSA9PiBFbmNvZGluZ30gKi9cbiAgICAgIGNvbnN0IGVuY29kZVByb21pc2VUb0NhcERhdGEgPSAocHJvbWlzZSwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9DYXBEYXRhKHByb21pc2UpO1xuXG4gICAgICAvKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIGlzRXJyb3JMaWtlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IEVuY29kaW5nfSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG4gICAgICBjb25zdCBlbmNvZGVFcnJvclRvQ2FwRGF0YSA9IChlcnIsIGVuY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckRhdGEgPSBlbmNvZGVFcnJvckNvbW1vbihlcnIsIGVuY29kZVJlY3VyKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnZXJyb3InLCAuLi5lcnJEYXRhIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlVG9DYXBEYXRhID0gbWFrZUVuY29kZVRvQ2FwRGF0YSh7XG4gICAgICAgIGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbiAgICAgICAgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbiAgICAgICAgZW5jb2RlRXJyb3JUb0NhcERhdGEsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVRvQ2FwRGF0YShyb290KTtcbiAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBib2R5LFxuICAgICAgICBzbG90cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplQm9keUZvcm1hdCA9PT0gJ3NtYWxsY2FwcycpIHtcbiAgICAgIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtQYXNzYWJsZUNhcH0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuICAgICAgY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzID0gKHByZWZpeCwgcGFzc2FibGUsIGlmYWNlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIHJlcGVhdCB9ID0gZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbiAgICAgICAgLyogVE9ETyBleHBsb3JlIHJlbW92aW5nIHRoaXMgc3BlY2lhbCBjYXNlKi9cbiAgICAgICAgaWYgKHJlcGVhdCA9PT0gdHJ1ZSB8fCBpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IChyZW1vdGFibGUsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvU21hbGxjYXBzKCckJywgcmVtb3RhYmxlLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuICAgICAgY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gKHByb21pc2UsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJywgcHJvbWlzZSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgICBjb25zdCBlcnJEYXRhID0gZW5jb2RlRXJyb3JDb21tb24oZXJyLCBlbmNvZGVSZWN1cik7XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4ucmVzdCB9ID0gZXJyRGF0YTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7ICcjZXJyb3InOiBtZXNzYWdlLCAuLi5yZXN0IH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlVG9TbWFsbGNhcHMgPSBtYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuICAgICAgICBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbiAgICAgICAgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbiAgICAgIGNvbnN0IHNtYWxsY2Fwc0JvZHkgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICAvKiBWYWxpZCBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGEgdmFsaWQgc2lnbmFsKi9cbiAgICAgICAgLyogaW5kaWNhdGluZyBzbWFsbGNhcHMgZm9ybWF0LiovXG4gICAgICAgIGJvZHk6IGAjJHtzbWFsbGNhcHNCb2R5fWAsXG4gICAgICAgIHNsb3RzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIFRoZSBgdGhyb3dgIGlzIGEgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBBZGRlZCBmb3IgY29uZnVzZWQgbGludGVycy4qL1xuICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VGdWxsUmV2aXZlID0gc2xvdHMgPT4ge1xuICAgIC8qKiBAdHlwZSB7TWFwPG51bWJlciwgUmVtb3RhYmxlT2JqZWN0IHwgUHJvbWlzZT59ICovXG4gICAgY29uc3QgdmFsTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgLyoqXG4gKiBAcGFyYW0ge3tpZmFjZT86IHN0cmluZywgaW5kZXg6IG51bWJlcn19IHNsb3REYXRhXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlT2JqZWN0IHwgUHJvbWlzZX1cbiAqL1xuICAgIGNvbnN0IGRlY29kZVNsb3RDb21tb24gPSBzbG90RGF0YSA9PiB7XG4gICAgICBjb25zdCB7IGlmYWNlID0gdW5kZWZpbmVkLCBpbmRleCwgLi4ucmVzdCB9ID0gc2xvdERhdGE7XG4gICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBGYWlsYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG4gICAgICBjb25zdCBleHRhbnQgPSB2YWxNYXAuZ2V0KGluZGV4KTtcbiAgICAgIGlmIChleHRhbnQpIHtcbiAgICAgICAgcmV0dXJuIGV4dGFudDtcbiAgICAgIH1cbiAgICAgIC8qIFRPRE8gU0VDVVJJVFkgSEFaQVJEOiBtdXN0IGVuZm9jZSB0aGF0IHJlbW90YWJsZSB2cyBwcm9taXNlKi9cbiAgICAgIC8qIGlzIGFjY29yZGluZyB0byB0aGUgZW5jb2RlZCBzdHJpbmcuKi9cbiAgICAgIGNvbnN0IHNsb3QgPSBzbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuICAgICAgY29uc3QgdmFsID0gY29udmVydFNsb3RUb1ZhbChzbG90LCBpZmFjZSk7XG4gICAgICB2YWxNYXAuc2V0KGluZGV4LCB2YWwpO1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9O1xuXG4gICAgLyoqXG4gKiBAcGFyYW0ge3tcbiAqICAgZXJyb3JJZD86IHN0cmluZyxcbiAqICAgbWVzc2FnZTogc3RyaW5nLFxuICogICBuYW1lOiBzdHJpbmcsXG4gKiAgIGNhdXNlOiB1bmtub3duLFxuICogICBlcnJvcnM6IHVua25vd24sXG4gKiB9fSBlcnJEYXRhXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuICAgIGNvbnN0IGRlY29kZUVycm9yQ29tbW9uID0gKGVyckRhdGEsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGVycm9ySWQgPSB1bmRlZmluZWQsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNhdXNlID0gdW5kZWZpbmVkLFxuICAgICAgICBlcnJvcnMgPSB1bmRlZmluZWQsXG4gICAgICAgIC4uLnJlc3RcbiAgICAgIH0gPSBlcnJEYXRhO1xuICAgICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzIwNTIqL1xuICAgICAgLyogY2FwRGF0YSBkb2VzIG5vdCB0cmFuc2Zvcm0gc3RyaW5ncy4gVGhlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBjYWxscyovXG4gICAgICAvKiB0byBgZGVjb2RlUmVjdXJgIGFyZSBmb3IgcmV1c2UgYnkgb3RoZXIgZW5jb2RpbmdzIHRoYXQgZG8sKi9cbiAgICAgIC8qIHN1Y2ggYXMgc21hbGxjYXBzLiovXG4gICAgICBjb25zdCBkTmFtZSA9IGRlY29kZVJlY3VyKG5hbWUpO1xuICAgICAgY29uc3QgZE1lc3NhZ2UgPSBkZWNvZGVSZWN1cihtZXNzYWdlKTtcbiAgICAgIC8qIGVycm9ySWQgaXMgYSBsYXRlIGFkZGl0aW9uIHNvIGJlIHRvbGVyYW50IG9mIGl0cyBhYnNlbmNlLiovXG4gICAgICBjb25zdCBkRXJyb3JJZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZXJyb3JJZCAmJiBkZWNvZGVSZWN1cihlcnJvcklkKSk7XG4gICAgICBpZiAodHlwZW9mIGROYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBkTmFtZSl9YDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZE1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKGROYW1lKSB8fCBFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yTmFtZSA9XG4gICAgICAgIGRFcnJvcklkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICAgIDogYFJlbW90ZSR7ZXJyQ29uc3RydWN0b3IubmFtZX0oJHtkRXJyb3JJZH0pYDtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGVycm9yTmFtZSxcbiAgICAgICAgc2FuaXRpemU6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGlmIChjYXVzZSkge1xuICAgICAgICBvcHRpb25zLmNhdXNlID0gZGVjb2RlUmVjdXIoY2F1c2UpO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICBvcHRpb25zLmVycm9ycyA9IGRlY29kZVJlY3VyKGVycm9ycyk7XG4gICAgICB9XG4gICAgICBjb25zdCByYXdFcnJvciA9IG1ha2VFcnJvcihkTWVzc2FnZSwgZXJyQ29uc3RydWN0b3IsIG9wdGlvbnMpO1xuICAgICAgLyogTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgZGVjb2RlUmVjdXIgcmVzdCdzIHByb3BlcnR5IG5hbWVzLiovXG4gICAgICAvKiBUaGlzIHdvdWxkIGJlIGluY29uc2lzdGVudCB3aXRoIHNtYWxsY2FwcycgZXhwZWN0ZWQgaGFuZGxpbmcsKi9cbiAgICAgIC8qIGJ1dCBpcyBmaW5lIGhlcmUgc2luY2UgaXQgaXMgb25seSB1c2VkIGZvciBgYW5ub3RhdGVFcnJvcmAsKi9cbiAgICAgIC8qIHdoaWNoIGlzIGZvciBkaWFnbm9zdGljIGluZm8gdGhhdCBpcyBvdGhlcndpc2UgdW5vYnNlcnZhYmxlLiovXG4gICAgICBjb25zdCBkZXNjcyA9IG9iamVjdE1hcChyZXN0LCBkYXRhID0+ICh7XG4gICAgICAgIHZhbHVlOiBkZWNvZGVSZWN1cihkYXRhKSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcbiAgICAgIGRlZmluZVByb3BlcnRpZXMocmF3RXJyb3IsIGRlc2NzKTtcbiAgICAgIGhhcmRlbihyYXdFcnJvcik7XG4gICAgICByZXR1cm4gdG9QYXNzYWJsZUVycm9yKHJhd0Vycm9yKTtcbiAgICB9O1xuXG4gICAgLyogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaCovXG4gICAgLyogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uKi9cbiAgICAvKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSovXG4gICAgLyogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzQqL1xuICAgIGNvbnN0IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhID0gKHJhd1RyZWUsIF9kZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyBbUUNMQVNTXTogXywgLi4uc2xvdERhdGEgfSA9IHJhd1RyZWU7XG4gICAgICByZXR1cm4gZGVjb2RlU2xvdENvbW1vbihzbG90RGF0YSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGEgPSAocmF3VHJlZSwgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgW1FDTEFTU106IF8sIC4uLmVyckRhdGEgfSA9IHJhd1RyZWU7XG4gICAgICByZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSwgZGVjb2RlUmVjdXIpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXZpdmVGcm9tQ2FwRGF0YSA9IG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTogZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgICBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGE6IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcyA9IHByZWZpeCA9PiB7XG4gICAgICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdFbmNvZGluZ1xuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IF9kZWNvZGVSZWN1clxuICogQHJldHVybnMge1JlbW90YWJsZU9iamVjdCB8IFByb21pc2V9XG4gKi9cbiAgICAgIHJldHVybiAoc3RyaW5nRW5jb2RpbmcsIF9kZWNvZGVSZWN1cikgPT4ge1xuICAgICAgICBhc3NlcnQoc3RyaW5nRW5jb2RpbmcuY2hhckF0KDApID09PSBwcmVmaXgpO1xuICAgICAgICAvKiBzbG90czogJHNsb3RJbmRleC5pZmFjZSBvciAkc2xvdEluZGV4Ki9cbiAgICAgICAgY29uc3QgaSA9IHN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoc3RyaW5nRW5jb2Rpbmcuc2xpY2UoMSwgaSA8IDAgPyB1bmRlZmluZWQgOiBpKSk7XG4gICAgICAgIC8qIGkgPCAwIG1lYW5zIHRoZXJlIHdhcyBubyBpZmFjZSBpbmNsdWRlZC4qL1xuICAgICAgICBjb25zdCBpZmFjZSA9IGkgPCAwID8gdW5kZWZpbmVkIDogc3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSArIDEpO1xuICAgICAgICByZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7IGlmYWNlLCBpbmRleCB9KTtcbiAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG4gICAgY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuICAgIGNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyA9IChlbmNvZGluZywgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgJyNlcnJvcic6IG1lc3NhZ2UsIC4uLnJlc3RFcnJEYXRhIH0gPSBlbmNvZGluZztcbiAgICAgICFoYXNPd24ocmVzdEVyckRhdGEsICdtZXNzYWdlJykgfHxcbiAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbiAgICAgIHJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7IG1lc3NhZ2UsIC4uLnJlc3RFcnJEYXRhIH0sIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbiAgICAgIC8qIEB0cy1pZ25vcmUgWFhYIFNtYWxsQ2Fwc0VuY29kaW5nKi9cbiAgICAgIGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG4gICAgICAvKiBAdHMtaWdub3JlIFhYWCBTbWFsbENhcHNFbmNvZGluZyovXG4gICAgICBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbiAgICAgIGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBoYXJkZW4oeyByZXZpdmVGcm9tQ2FwRGF0YSwgcmV2aXZlRnJvbVNtYWxsY2FwcyB9KTtcbiAgfTtcblxuICAvKipcbiAqIEB0eXBlIHtGcm9tQ2FwRGF0YTxTbG90Pn1cbiAqL1xuICBjb25zdCBmcm9tQ2FwRGF0YSA9IGRhdGEgPT4ge1xuICAgIGNvbnN0IHsgYm9keSwgc2xvdHMgfSA9IGRhdGE7XG4gICAgdHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5ib2R5IGlzICR7Ym9keX0sIG5vdCBzdHJpbmcpYDtcbiAgICBpc0FycmF5KGRhdGEuc2xvdHMpIHx8XG4gICAgICBGYWlsYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5zbG90cyBhcmUgbm90IEFycmF5KWA7XG4gICAgY29uc3QgeyByZXZpdmVGcm9tQ2FwRGF0YSwgcmV2aXZlRnJvbVNtYWxsY2FwcyB9ID0gbWFrZUZ1bGxSZXZpdmUoc2xvdHMpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgLyogSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhbiB1bmFtYmlndW91cyBzaWduYWwuKi9cbiAgICBpZiAoYm9keS5jaGFyQXQoMCkgPT09ICcjJykge1xuICAgICAgY29uc3Qgc21hbGxjYXBzQm9keSA9IGJvZHkuc2xpY2UoMSk7XG4gICAgICBjb25zdCBlbmNvZGluZyA9IGhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbiAgICAgIHJlc3VsdCA9IGhhcmRlbihyZXZpdmVGcm9tU21hbGxjYXBzKGVuY29kaW5nKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJhd1RyZWUgPSBoYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG4gICAgICByZXN1bHQgPSBoYXJkZW4ocmV2aXZlRnJvbUNhcERhdGEocmF3VHJlZSkpO1xuICAgIH1cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM3Ki9cbiAgICAvKiB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBmaXhlZCBvbmNlIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgc3dpdGNoKi9cbiAgICAvKiB0byBzbWFsbGNhcHMuKi9cbiAgICBhc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xuICAgIHJldHVybiAvKiogQHR5cGUge1Bhc3NhYmxlQ2FwfSAqLyAocmVzdWx0KTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICB0b0NhcERhdGEsXG4gICAgZnJvbUNhcERhdGEsXG5cbiAgICAvKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqL1xuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgdG9DYXBEYXRhICovXG4gICAgc2VyaWFsaXplOiB0b0NhcERhdGEsXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBmcm9tQ2FwRGF0YSAqL1xuICAgIHVuc2VyaWFsaXplOiBmcm9tQ2FwRGF0YSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlTWFyc2hhbChtYWtlTWFyc2hhbCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACBor4x6FkAAOhZAAAlAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL3JhbmtPcmRlci5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCIuL2VuY29kZVBhc3NhYmxlLmpzIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQnlDb2RlUG9pbnRzIiwiY29tcGFyZU51bWVyaWNzIiwiY29tcGFyZVJhbmsiLCJjb3ZlcmVkRW50cmllcyIsImdldEluZGV4Q292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciIsImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpc1JhbmtTb3J0ZWQiLCJtYWtlQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Iiwic29ydEJ5UmFuayIsInVuaW9uUmFua0NvdmVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldGVudixGYWlsLHEsZ2V0VGFnLHBhc3NTdHlsZU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzU3R5bGVQcmVmaXhlcyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRlbnYgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicGFzc1N0eWxlUHJlZml4ZXNcIixbJGjNj19hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgUGFzc1N0eWxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICogQGltcG9ydCB7RnVsbENvbXBhcmUsIFBhcnRpYWxDb21wYXJlLCBQYXJ0aWFsQ29tcGFyaXNvbiwgUmFua0NvbXBhcmUsIFJhbmtDb21wYXJpc29uLCBSYW5rQ292ZXJ9IGZyb20gJy4vdHlwZXMuanMnXG4gKi9cblxuY29uc3QgeyBpc05hTjogTnVtYmVySXNOYU4gfSA9IE51bWJlcjtcbmNvbnN0IHsgZW50cmllcywgZnJvbUVudHJpZXMsIHNldFByb3RvdHlwZU9mLCBpcyB9ID0gT2JqZWN0O1xuXG5jb25zdCBFTkRPX1JBTktfU1RSSU5HUyA9IGdldGVudignRU5ET19SQU5LX1NUUklOR1MnLCAndXRmMTYtY29kZS11bml0LW9yZGVyJywgW1xuICAndW5pY29kZS1jb2RlLXBvaW50LW9yZGVyJyxcbiAgJ2Vycm9yLWlmLW9yZGVyLWNob2ljZS1tYXR0ZXJzJyxcbl0pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W251bWJlciwgbnVtYmVyXX0gSW5kZXhDb3ZlclxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbiB1c2VkIGJ5IEphdmFTY3JpcHQncyBNYXAgYW5kIFNldFxuICogYWJzdHJhY3Rpb25zLCB3aGVyZSBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGFuZCAtMCBpcyB0aGUgc2FtZSBhc1xuICogMC4gTWFyc2hhbCBzZXJpYWxpemVzIC0wIGFzIHplcm8sIHNvIHRoZSBzZW1hbnRpY3Mgb2Ygb3VyIGRpc3RyaWJ1dGVkXG4gKiBvYmplY3Qgc3lzdGVtIGRvZXMgbm90IGRpc3Rpbmd1aXNoIDAgZnJvbSAtMC5cbiAqXG4gKiBgc2FtZVZhbHVlWmVyb2AgaXMgdGhlIEVjbWFTY3JpcHQgc3BlYyBuYW1lIGZvciB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24sXG4gKiBidXQgVE9ETyB3ZSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSBBUEkuXG4gKlxuICogQHBhcmFtIHthbnl9IHhcbiAqIEBwYXJhbSB7YW55fSB5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc2FtZVZhbHVlWmVybyA9ICh4LCB5KSA9PiB4ID09PSB5IHx8IGlzKHgsIHkpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBsZWZ0XG4gKiBAcGFyYW0ge2FueX0gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuY29uc3QgdHJpdmlhbENvbXBhcmF0b3IgPSAobGVmdCwgcmlnaHQpID0+XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSwgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG4gIGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA9PT0gcmlnaHQgPyAwIDogMTtcbmhhcmRlbih0cml2aWFsQ29tcGFyYXRvcik7XG5cbi8qIEFwcGFyZW50bHkgZXNsaW50IGNvbmZ1c2VkIGFib3V0IHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGNhbiBldmVyIGV4aXQqL1xuLyogd2l0aG91dCBhbiBleHBsaWNpdCByZXR1cm4uKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnMtY2hlY2sqL1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGVmdFxuICogQHBhcmFtIHtzdHJpbmd9IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cbiAgICAgICBjb25zdCBjb21wYXJlQnlDb2RlUG9pbnRzID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGNvbnN0IGxlZnRJdGVyID0gbGVmdFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIGNvbnN0IHJpZ2h0SXRlciA9IHJpZ2h0W1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IHsgdmFsdWU6IGxlZnRDaGFyIH0gPSBsZWZ0SXRlci5uZXh0KCk7XG4gICAgY29uc3QgeyB2YWx1ZTogcmlnaHRDaGFyIH0gPSByaWdodEl0ZXIubmV4dCgpO1xuICAgIGlmIChsZWZ0Q2hhciA9PT0gdW5kZWZpbmVkICYmIHJpZ2h0Q2hhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGxlZnRDaGFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIGxlZnQgaXMgYSBwcmVmaXggb2YgcmlnaHQuKi9cbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKHJpZ2h0Q2hhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiByaWdodCBpcyBhIHByZWZpeCBvZiBsZWZ0LiovXG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgY29uc3QgbGVmdENvZGVwb2ludCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAobGVmdENoYXIuY29kZVBvaW50QXQoMCkpO1xuICAgIGNvbnN0IHJpZ2h0Q29kZXBvaW50ID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyaWdodENoYXIuY29kZVBvaW50QXQoMCkpO1xuICAgIGlmIChsZWZ0Q29kZXBvaW50IDwgcmlnaHRDb2RlcG9pbnQpIHJldHVybiAtMTtcbiAgICBpZiAobGVmdENvZGVwb2ludCA+IHJpZ2h0Q29kZXBvaW50KSByZXR1cm4gMTtcbiAgfVxufTskaM2PX29uY2UuY29tcGFyZUJ5Q29kZVBvaW50cyhjb21wYXJlQnlDb2RlUG9pbnRzKTtcbmhhcmRlbihjb21wYXJlQnlDb2RlUG9pbnRzKTtcblxuLyoqXG4gKiBDb21wYXJlIHR3byBzYW1lLXR5cGUgbnVtZXJpYyB2YWx1ZXMsIHJldHVybmluZyByZXN1bHRzIGNvbnNpc3RlbnQgd2l0aFxuICogYGNvbXBhcmVSYW5rYCdzIFwicmFuayBvcmRlclwiIChpLmUuLCB0cmVhdGluZyBib3RoIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB6ZXJvXG4gKiBhcyBlcXVhbCBhbmQgcGxhY2luZyBOYU4gYXMgc2VsZi1lcXVhbCBhZnRlciBhbGwgb3RoZXIgbnVtYmVycykuXG4gKlxuICogQHRlbXBsYXRlIHtudW1iZXIgfCBiaWdpbnR9IFRcbiAqIEBwYXJhbSB7VH0gbGVmdFxuICogQHBhcmFtIHtUfSByaWdodFxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG4gICAgICAgY29uc3QgY29tcGFyZU51bWVyaWNzID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbiAgaWYgKGxlZnQgPCByaWdodCkgcmV0dXJuIC0xO1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG4gIGlmIChsZWZ0ID4gcmlnaHQpIHJldHVybiAxO1xuICBpZiAoTnVtYmVySXNOYU4obGVmdCkgPT09IE51bWJlcklzTmFOKHJpZ2h0KSkgcmV0dXJuIDA7XG4gIGlmIChOdW1iZXJJc05hTihyaWdodCkpIHJldHVybiAtMTtcbiAgYXNzZXJ0KE51bWJlcklzTmFOKGxlZnQpKTtcbiAgcmV0dXJuIDE7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8UGFzc1N0eWxlLCB7IGluZGV4OiBudW1iZXIsIGNvdmVyOiBSYW5rQ292ZXIgfT59IFBhc3NTdHlsZVJhbmtzUmVjb3JkXG4gKi8kaM2PX29uY2UuY29tcGFyZU51bWVyaWNzKGNvbXBhcmVOdW1lcmljcyk7XG5cbmNvbnN0IHBhc3NTdHlsZVJhbmtzID0gLyoqIEB0eXBlIHtQYXNzU3R5bGVSYW5rc1JlY29yZH0gKi8gKFxuICBmcm9tRW50cmllcyhcbiAgICBlbnRyaWVzKHBhc3NTdHlsZVByZWZpeGVzKVxuICAgICAgLyogU29ydCBlbnRyaWVzIGJ5IGFzY2VuZGluZyBwcmVmaXgsIGFzc3VtaW5nIHRoYXQgYWxsIHByZWZpeGVzIGFyZSovXG4gICAgICAvKiBsaW1pdGVkIHRvIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUgKFUrMDAwMCB0aHJvdWdoIFUrRkZGRikgYW5kKi9cbiAgICAgIC8qIHRodXMgY29udGFpbiBvbmx5IGNvZGUgdW5pdHMgdGhhdCBhcmUgZXF1aXZhbGVudCB0byBjb2RlIHBvaW50cy4qL1xuICAgICAgLyogSW4gcHJhY3RpY2UsIHRoZXkgYXJlIGVudGlyZWx5IHByaW50YWJsZSBBU0NJSSovXG4gICAgICAvKiAoMHgyMCBTUEFDRSB0aHJvdWdoIDB4N0UgVElMREUpLiovXG4gICAgICAuc29ydCgoW19sZWZ0U3R5bGUsIGxlZnRQcmVmaXhlc10sIFtfcmlnaHRTdHlsZSwgcmlnaHRQcmVmaXhlc10pID0+IHtcbiAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcywgcmlnaHRQcmVmaXhlcyk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoW3Bhc3NTdHlsZSwgcHJlZml4ZXNdLCBpbmRleCkgPT4ge1xuICAgICAgICAvKiBWZXJpZnkgdGhhdCBgcHJlZml4ZXNgIGlzIHNvcnRlZCwgYW5kIGNvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQqL1xuICAgICAgICAvKiB3aXRoIGFueSBvZiBpdHMgY2hhcmFjdGVycywgaS5lLiovXG4gICAgICAgIC8qIGFsbCBzIHN1Y2ggdGhhdCBwcmVmaXhlcy5hdCgwKSDiiaQgcyA8IHN1Y2Nlc3NvcihwcmVmaXhlcy5hdCgtMSkpLiovXG4gICAgICAgIHByZWZpeGVzID09PSBwcmVmaXhlcy5zcGxpdCgnJykuc29ydCgpLmpvaW4oJycpIHx8XG4gICAgICAgICAgRmFpbGB1bnNvcnRlZCBwcmVmaXhlcyBmb3IgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHtxKHByZWZpeGVzKX1gO1xuICAgICAgICBjb25zdCBjb3ZlciA9IFtcbiAgICAgICAgICBwcmVmaXhlcy5jaGFyQXQoMCksXG4gICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZShwcmVmaXhlcy5jaGFyQ29kZUF0KHByZWZpeGVzLmxlbmd0aCAtIDEpICsgMSksXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiBbcGFzc1N0eWxlLCB7IGluZGV4LCBjb3ZlciB9XTtcbiAgICAgIH0pLFxuICApXG4pO1xuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsIG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVJhbmtzKTtcblxuLyoqXG4gKiBBc3NvY2lhdGUgd2l0aCBlYWNoIHBhc3NTdHlsZSBhIFJhbmtDb3ZlciB0aGF0IG1heSBiZSBhbiBvdmVyZXN0aW1hdGUsXG4gKiBhbmQgd2hvc2UgcmVzdWx0cyB0aGVyZWZvcmUgbmVlZCB0byBiZSBmaWx0ZXJlZCBkb3duLiBGb3IgZXhhbXBsZSwgYmVjYXVzZVxuICogdGhlcmUgaXMgbm90IGEgc21hbGxlc3Qgb3IgYmlnZ2VzdCBiaWdpbnQsIGJvdW5kIGl0IGJ5IGBOYU5gICh0aGUgbGFzdCBwbGFjZVxuICogbnVtYmVyKSBhbmQgYCcnYCAodGhlIGVtcHR5IHN0cmluZywgd2hpY2ggaXMgdGhlIGZpcnN0IHBsYWNlIHN0cmluZykuIFRodXMsXG4gKiBhIHJhbmdlIHF1ZXJ5IHVzaW5nIHRoaXMgcmFuZ2UgbWF5IGluY2x1ZGUgdGhlc2UgdmFsdWVzLCB3aGljaCB3b3VsZCB0aGVuXG4gKiBuZWVkIHRvIGJlIGZpbHRlcmVkIG91dC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG4gICAgICAgY29uc3QgZ2V0UGFzc1N0eWxlQ292ZXIgPSBwYXNzU3R5bGUgPT4gcGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaM2PX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxXZWFrU2V0PFBhc3NhYmxlW10+Pn1cbiAqL1xuY29uc3QgbWVtb09mU29ydGVkID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxSYW5rQ29tcGFyZT59XG4gKi9cbmNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFydGlhbENvbXBhcmV9IFtjb21wYXJlUmVtb3RhYmxlc11cbiAqIEEgY29tcGFyYXRvciBmb3IgYXNzaWduaW5nIGFuIGludGVybmFsIG9yZGVyIHRvIHJlbW90YWJsZXMuXG4gKiBJdCBkZWZhdWx0cyB0byBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgYE5hTmAsIG1lYW5pbmcgdGhhdCBhbGxcbiAqIHJlbW90YWJsZXMgYXJlIGluY29tcGFyYWJsZSBhbmQgc2hvdWxkIHRpZSBmb3IgdGhlIHNhbWUgcmFuayBieVxuICogc2hvcnQtY2lyY3VpdGluZyB3aXRob3V0IGZ1cnRoZXIgcmVmaW5lbWVudCAoZS5nLiwgbm90IG9ubHkgYXJlIGByMWAgYW5kIGByMmBcbiAqIHRpZWQsIGJ1dCBzbyBhcmUgYFtyMSwgMF1gIGFuZCBgW3IyLCBcInhcIl1gKS5cbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyYXRvcktpdH1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb21wYXJhdG9yS2l0ID0gKGNvbXBhcmVSZW1vdGFibGVzID0gKF94LCBfeSkgPT4gTmFOKSA9PiB7XG4gIC8qKiBAdHlwZSB7UGFydGlhbENvbXBhcmV9ICovXG4gIGNvbnN0IGNvbXBhcmF0b3IgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgICBpZiAoc2FtZVZhbHVlWmVybyhsZWZ0LCByaWdodCkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0U3R5bGUgPSBwYXNzU3R5bGVPZihsZWZ0KTtcbiAgICBjb25zdCByaWdodFN0eWxlID0gcGFzc1N0eWxlT2YocmlnaHQpO1xuICAgIGlmIChsZWZ0U3R5bGUgIT09IHJpZ2h0U3R5bGUpIHtcbiAgICAgIHJldHVybiBjb21wYXJlTnVtZXJpY3MoXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW3JpZ2h0U3R5bGVdLmluZGV4LFxuICAgICAgKTtcbiAgICB9XG4gICAgLyogZXNsaW50LWRpc2FibGUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyAtLVxuICogV2Uga25vdyBgbGVmdGAgYW5kIGByaWdodGAgYXJlIGNvbXBhcmFibGUuXG4gKi9cbiAgICBzd2l0Y2ggKGxlZnRTdHlsZSkge1xuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICByZXR1cm4gY29tcGFyZVJlbW90YWJsZXMobGVmdCwgcmlnaHQpO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgLyogRm9yIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgYWxsIG1lbWJlcnMgb2YgdGhhdCBwYXNzU3R5bGUgYXJlIHRpZWQqL1xuICAgICAgICAvKiBmb3IgdGhlIHNhbWUgcmFuay4qL1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAvKiBXaXRoaW4gZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCB0aGUgcmFuayBvcmRlcmluZyBhZ3JlZXMgd2l0aCovXG4gICAgICAgIC8qIEphdmFTY3JpcHQncyByZWxhdGlvbmFsIG9wZXJhdG9ycyBgPGAgYW5kIGA+YC4qL1xuICAgICAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBzd2l0Y2ggKEVORE9fUkFOS19TVFJJTkdTKSB7XG4gICAgICAgICAgY2FzZSAndXRmMTYtY29kZS11bml0LW9yZGVyJzoge1xuICAgICAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAndW5pY29kZS1jb2RlLXBvaW50LW9yZGVyJzoge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVCeUNvZGVQb2ludHMobGVmdCwgcmlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdlcnJvci1pZi1vcmRlci1jaG9pY2UtbWF0dGVycyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDEgPSB0cml2aWFsQ29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQyID0gY29tcGFyZUJ5Q29kZVBvaW50cyhsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICByZXN1bHQxID09PSByZXN1bHQyIHx8XG4gICAgICAgICAgICAgIEZhaWxgQ29tcGFyaXNvbnMgZGlmZmVyZWQ6ICR7bGVmdH0gdnMgJHtyaWdodH0sICR7cShyZXN1bHQxKX0gdnMgJHtxKHJlc3VsdDIpfWA7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0MTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBVbmV4cGVjdGVkIEVORE9fUkFOS19TVFJJTkdTICR7cShFTkRPX1JBTktfU1RSSU5HUyl9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IoXG4gICAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sKGxlZnQpLFxuICAgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJlTnVtZXJpY3MobGVmdCwgcmlnaHQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLyogTGV4aWNvZ3JhcGhpYyBieSBpbnZlcnNlIHNvcnRlZCBvcmRlciBvZiBwcm9wZXJ0eSBuYW1lcywgdGhlbiovXG4gICAgICAgIC8qIGxleGljb2dyYXBoaWMgYnkgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhhdCBzYW1lIGludmVyc2UqL1xuICAgICAgICAvKiBvcmRlciBvZiB0aGVpciBwcm9wZXJ0eSBuYW1lcy4gQ29tcGFyaW5nIG5hbWVzIGJ5IHRoZW1zZWx2ZXMgZmlyc3QsKi9cbiAgICAgICAgLyogYWxsIHJlY29yZHMgd2l0aCB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YgcHJvcGVydHkgbmFtZXMgc29ydCBuZXh0IHRvKi9cbiAgICAgICAgLyogZWFjaCBvdGhlciBpbiBhIHJhbmstc29ydCBvZiBjb3B5UmVjb3Jkcy4qL1xuXG4gICAgICAgIC8qIFRoZSBjb3B5UmVjb3JkIGludmFyaWFudHMgZW5mb3JjZWQgYnkgcGFzc1N0eWxlT2YgZW5zdXJlIHRoYXQqL1xuICAgICAgICAvKiBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIGFyZSBzdHJpbmdzLiBXZSBuZWVkIHRoZSByZXZlcnNlIHNvcnRlZCBvcmRlciovXG4gICAgICAgIC8qIG9mIHRoZXNlIG5hbWVzLCB3aGljaCB3ZSB0aGVuIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgZW5zdXJlcyovXG4gICAgICAgIC8qIHRoYXQgaWYgdGhlIG5hbWVzIG9mIHJlY29yZCBYIGFyZSBhIHN1YnNldCBvZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFksKi9cbiAgICAgICAgLyogdGhlbiByZWNvcmQgWCB3aWxsIGhhdmUgYW4gZWFybGllciByYW5rIGFuZCBzb3J0IHRvIHRoZSBsZWZ0IG9mIFkuKi9cbiAgICAgICAgY29uc3QgbGVmdE5hbWVzID0gcmVjb3JkTmFtZXMobGVmdCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0TmFtZXMgPSByZWNvcmROYW1lcyhyaWdodCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0TmFtZXMsIHJpZ2h0TmFtZXMpO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZWZ0VmFsdWVzID0gcmVjb3JkVmFsdWVzKGxlZnQsIGxlZnROYW1lcyk7XG4gICAgICAgIGNvbnN0IHJpZ2h0VmFsdWVzID0gcmVjb3JkVmFsdWVzKHJpZ2h0LCByaWdodE5hbWVzKTtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IobGVmdFZhbHVlcywgcmlnaHRWYWx1ZXMpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICAvKiBMZXhpY29ncmFwaGljKi9cbiAgICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJhdG9yKGxlZnRbaV0sIHJpZ2h0W2ldKTtcbiAgICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgd2VyZSB0aWVkLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4gICAgICAgIC8qIElmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGhhcyBhbiBlYXJsaWVyIHJhbmsgdGhhbiBZLiovXG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgICAvKiBCeXRlQXJyYXlzIGNvbXBhcmUgYnkgc2hvcnRsZXguKi9cbiAgICAgICAgLyogLSBmaXJzdCwgaWYgdGhleSBhcmUgb2YgdW5lcXVhbCBsZW5ndGgsIHRoZW4gdGhlIHNob3J0ZXIgaXMgbGVzcy4qL1xuICAgICAgICAvKiAtIHRoZW4sIGFtb25nIGJ5dGVBcnJheXMgb2YgZXF1YWwgbGVuZ3RoLCBieSBsZXhpY29ncmFwaGljIGNvbXBhcmlzb24qL1xuICAgICAgICAvKiBvZiB0aGVpciBieXRlcyBpbiBhc2NlbmRpbmcgb3JkZXIuKi9cbiAgICAgICAgY29uc3QgeyBieXRlTGVuZ3RoOiBsZWZ0TGVuIH0gPSBsZWZ0O1xuICAgICAgICBjb25zdCB7IGJ5dGVMZW5ndGg6IHJpZ2h0TGVuIH0gPSByaWdodDtcbiAgICAgICAgaWYgKGxlZnRMZW4gPCByaWdodExlbikge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVmdExlbiA+IHJpZ2h0TGVuKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBBY2NvdW50IGZvciBnYXBzIGluIHRoZSBAZW5kby9pbW11dGFibGUtYXJyYXlidWZmZXIgc2hpbS4qL1xuICAgICAgICBjb25zdCBsZWZ0QXJyYXkgPVxuICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihsZWZ0KSA9PT0gQXJyYXlCdWZmZXIucHJvdG90eXBlXG4gICAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KGxlZnQpXG4gICAgICAgICAgICA6IG5ldyBVaW50OEFycmF5KGxlZnQuc2xpY2UoMCkpO1xuICAgICAgICBjb25zdCByaWdodEFycmF5ID1cbiAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YocmlnaHQpID09PSBBcnJheUJ1ZmZlci5wcm90b3R5cGVcbiAgICAgICAgICAgID8gbmV3IFVpbnQ4QXJyYXkocmlnaHQpXG4gICAgICAgICAgICA6IG5ldyBVaW50OEFycmF5KHJpZ2h0LnNsaWNlKDApKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWZ0TGVuOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBsZWZ0Qnl0ZSA9IGxlZnRBcnJheVtpXTtcbiAgICAgICAgICBjb25zdCByaWdodEJ5dGUgPSByaWdodEFycmF5W2ldO1xuICAgICAgICAgIGlmIChsZWZ0Qnl0ZSA8IHJpZ2h0Qnl0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGVmdEJ5dGUgPiByaWdodEJ5dGUpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgLyogTGV4aWNvZ3JhcGhpYyBieSBgW1N5bWJvbC50b1N0cmluZ1RhZ11gIHRoZW4gYC5wYXlsb2FkYC4qL1xuICAgICAgICBjb25zdCBsYWJlbENvbXAgPSBjb21wYXJhdG9yKGdldFRhZyhsZWZ0KSwgZ2V0VGFnKHJpZ2h0KSk7XG4gICAgICAgIGlmIChsYWJlbENvbXAgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbGFiZWxDb21wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnQucGF5bG9hZCwgcmlnaHQucGF5bG9hZCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIHBhc3NTdHlsZTogJHtxKGxlZnRTdHlsZSl9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSAqL1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG4gIGNvbnN0IG91dGVyQ29tcGFyYXRvciA9ICh4LCB5KSA9PlxuICAgIC8qIFdoZW4gdGhlIGlubmVyIGNvbXBhcmF0b3IgcmV0dXJucyBOYU4gdG8gaW5kaWNhdGUgaW5jb21wYXJhYmlsaXR5LCovXG4gICAgLyogcmVwbGFjZSB0aGF0IHdpdGggMCB0byBpbmRpY2F0ZSBhIHRpZS4qL1xuICAgIC8qKiBAdHlwZSB7RXhjbHVkZTxQYXJ0aWFsQ29tcGFyaXNvbiwgTmFOPn0gKi8gKGNvbXBhcmF0b3IoeCwgeSkgfHwgMCk7XG5cbiAgLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbiAgY29uc3QgYW50aUNvbXBhcmF0b3IgPSAoeCwgeSkgPT4gb3V0ZXJDb21wYXJhdG9yKHksIHgpO1xuXG4gIG1lbW9PZlNvcnRlZC5zZXQob3V0ZXJDb21wYXJhdG9yLCBuZXcgV2Vha1NldCgpKTtcbiAgbWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvciwgbmV3IFdlYWtTZXQoKSk7XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KG91dGVyQ29tcGFyYXRvciwgYW50aUNvbXBhcmF0b3IpO1xuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvciwgb3V0ZXJDb21wYXJhdG9yKTtcblxuICByZXR1cm4gaGFyZGVuKHsgY29tcGFyYXRvcjogb3V0ZXJDb21wYXJhdG9yLCBhbnRpQ29tcGFyYXRvciB9KTtcbn07XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyZT19XG4gKi8kaM2PX29uY2UubWFrZUNvbXBhcmF0b3JLaXQobWFrZUNvbXBhcmF0b3JLaXQpO1xuICAgICAgIGNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZSA9IGNvbXBhcmF0b3IgPT5cbiAgY29tcGFyYXRvck1pcnJvckltYWdlcy5nZXQoY29tcGFyYXRvcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjNj19vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuICAgICAgIGNvbnN0IGlzUmFua1NvcnRlZCA9IChwYXNzYWJsZXMsIGNvbXBhcmUpID0+IHtcbiAgY29uc3Qgc3ViTWVtb09mU29ydGVkID0gbWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbiAgYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCAhPT0gdW5kZWZpbmVkKTtcbiAgaWYgKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpID09PSAnY29weUFycmF5Jyk7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcGFzc2FibGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGNvbXBhcmUocGFzc2FibGVzW2kgLSAxXSwgcGFzc2FibGVzW2ldKSA+PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbiAgcmV0dXJuIHRydWU7XG59OyRozY9fb25jZS5pc1JhbmtTb3J0ZWQoaXNSYW5rU29ydGVkKTtcbmhhcmRlbihpc1JhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRSYW5rU29ydGVkID0gKHNvcnRlZCwgY29tcGFyZSkgPT5cbiAgaXNSYW5rU29ydGVkKHNvcnRlZCwgY29tcGFyZSkgfHxcbiAgLyogVE9ETyBhc3NlcnQgb24gYnVnIGNvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLiBGaXguKi9cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgRmFpbGBNdXN0IGJlIHJhbmsgc29ydGVkOiAke3NvcnRlZH0gdnMgJHtzb3J0QnlSYW5rKHNvcnRlZCwgY29tcGFyZSl9YDskaM2PX29uY2UuYXNzZXJ0UmFua1NvcnRlZChhc3NlcnRSYW5rU29ydGVkKTtcbmhhcmRlbihhc3NlcnRSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbiAgICAgICBjb25zdCBzb3J0QnlSYW5rID0gKHBhc3NhYmxlcywgY29tcGFyZSkgPT4ge1xuICAvKiogQHR5cGUge1RbXX0gbXV0YWJsZSBmb3IgaW4tcGxhY2Ugc29ydGluZywgYnV0IHdpdGggaGFyZGVuZWQgZWxlbWVudHMgKi9cbiAgbGV0IHVuc29ydGVkO1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKSB7XG4gICAgaGFyZGVuKHBhc3NhYmxlcyk7XG4gICAgLyogQ2FsbGluZyBpc1JhbmtTb3J0ZWQgZ2l2ZXMgaXQgYSBjaGFuY2UgdG8gZ2V0IG1lbW9pemVkIGZvciovXG4gICAgLyogdGhpcyBgY29tcGFyZWAgZnVuY3Rpb24gZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBtZW1vaXplZCBmb3IgYSBkaWZmZXJlbnQqL1xuICAgIC8qIGBjb21wYXJlYCBmdW5jdGlvbi4qL1xuICAgIGlmIChpc1JhbmtTb3J0ZWQocGFzc2FibGVzLCBjb21wYXJlKSkge1xuICAgICAgcmV0dXJuIHBhc3NhYmxlcztcbiAgICB9XG4gICAgdW5zb3J0ZWQgPSBbLi4ucGFzc2FibGVzXTtcbiAgfSBlbHNlIHtcbiAgICB1bnNvcnRlZCA9IEFycmF5LmZyb20ocGFzc2FibGVzLCBoYXJkZW4pO1xuICB9XG4gIGNvbnN0IHNvcnRlZCA9IHVuc29ydGVkLnNvcnQoY29tcGFyZSk7XG4gIC8qIEZvciByZXZlcnNlIGNvbXBhcmlzb24sIG1vdmUgYHVuZGVmaW5lZGAgdmFsdWVzIGZyb20gdGhlIGVuZCB0byB0aGUgc3RhcnQuKi9cbiAgLyogTm90ZSB0aGF0IHBhc3NTdHlsZVByZWZpeGVzIChAc2VlIHtAbGluayAuL2VuY29kZVBhc3NhYmxlLmpzfSkgTVVTVCBOT1QqL1xuICAvKiBzb3J0IGFueSBjYXRlZ29yeSBhZnRlciBgdW5kZWZpbmVkYC4qL1xuICBpZiAoY29tcGFyZSh0cnVlLCB1bmRlZmluZWQpID4gMCkge1xuICAgIGxldCBpID0gc29ydGVkLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKGkgPj0gMCAmJiBzb3J0ZWRbaV0gPT09IHVuZGVmaW5lZCkgaSAtPSAxO1xuICAgIGNvbnN0IG4gPSBzb3J0ZWQubGVuZ3RoIC0gaSAtIDE7XG4gICAgaWYgKG4gPiAwICYmIG4gPCBzb3J0ZWQubGVuZ3RoKSB7XG4gICAgICBzb3J0ZWQuY29weVdpdGhpbihuLCAwKTtcbiAgICAgIHNvcnRlZC5maWxsKC8qKiBAdHlwZSB7VH0gKi8gKHVuZGVmaW5lZCksIDAsIG4pO1xuICAgIH1cbiAgfVxuICBoYXJkZW4oc29ydGVkKTtcbiAgY29uc3Qgc3ViTWVtb09mU29ydGVkID0gbWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbiAgYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCAhPT0gdW5kZWZpbmVkKTtcbiAgc3ViTWVtb09mU29ydGVkLmFkZChzb3J0ZWQpO1xuICByZXR1cm4gc29ydGVkO1xufTskaM2PX29uY2Uuc29ydEJ5UmFuayhzb3J0QnlSYW5rKTtcbmhhcmRlbihzb3J0QnlSYW5rKTtcblxuLyoqXG4gKiBTZWVcbiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpbmFyeV9zZWFyY2hfYWxnb3JpdGhtI1Byb2NlZHVyZV9mb3JfZmluZGluZ190aGVfbGVmdG1vc3RfZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBrZXlcbiAqIEBwYXJhbSB7KFwibGVmdE1vc3RcIiB8IFwicmlnaHRNb3N0XCIpPX0gYmlhc1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmFua1NlYXJjaCA9IChzb3J0ZWQsIGNvbXBhcmUsIGtleSwgYmlhcyA9ICdsZWZ0TW9zdCcpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpO1xuICBsZXQgbGVmdCA9IDA7XG4gIGxldCByaWdodCA9IHNvcnRlZC5sZW5ndGg7XG4gIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlKHNvcnRlZFttXSwga2V5KTtcbiAgICBpZiAoY29tcCA8PSAtMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAncmlnaHRNb3N0JykpIHtcbiAgICAgIGxlZnQgPSBtICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGNvbXAgPj0gMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAnbGVmdE1vc3QnKSk7XG4gICAgICByaWdodCA9IG07XG4gICAgfVxuICB9XG4gIHJldHVybiBiaWFzID09PSAnbGVmdE1vc3QnID8gbGVmdCA6IHJpZ2h0IC0gMTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSByYW5rQ292ZXJcbiAqIEByZXR1cm5zIHtJbmRleENvdmVyfVxuICovXG4gICAgICAgY29uc3QgZ2V0SW5kZXhDb3ZlciA9IChzb3J0ZWQsIGNvbXBhcmUsIFtsZWZ0S2V5LCByaWdodEtleV0pID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpO1xuICBjb25zdCBsZWZ0SW5kZXggPSByYW5rU2VhcmNoKHNvcnRlZCwgY29tcGFyZSwgbGVmdEtleSwgJ2xlZnRNb3N0Jyk7XG4gIGNvbnN0IHJpZ2h0SW5kZXggPSByYW5rU2VhcmNoKHNvcnRlZCwgY29tcGFyZSwgcmlnaHRLZXksICdyaWdodE1vc3QnKTtcbiAgcmV0dXJuIFtsZWZ0SW5kZXgsIHJpZ2h0SW5kZXhdO1xufTskaM2PX29uY2UuZ2V0SW5kZXhDb3ZlcihnZXRJbmRleENvdmVyKTtcbmhhcmRlbihnZXRJbmRleENvdmVyKTtcblxuLyoqIEB0eXBlIHtSYW5rQ292ZXJ9ICovXG4gICAgICAgY29uc3QgRnVsbFJhbmtDb3ZlciA9IGhhcmRlbihbJycsICd7J10pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge0luZGV4Q292ZXJ9IGluZGV4Q292ZXJcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fVxuICovJGjNj19vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG4gICAgICAgY29uc3QgY292ZXJlZEVudHJpZXMgPSAoc29ydGVkLCBbbGVmdEluZGV4LCByaWdodEluZGV4XSkgPT4ge1xuICAvKiogQHR5cGUge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59ICovXG4gIGNvbnN0IGl0ZXJhYmxlID0gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgbGV0IGkgPSBsZWZ0SW5kZXg7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChpIDw9IHJpZ2h0SW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBzb3J0ZWRbaV07XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWU6IFtpLCBlbGVtZW50XSwgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaXRlcmFibGU7XG59OyRozY9fb25jZS5jb3ZlcmVkRW50cmllcyhjb3ZlcmVkRW50cmllcyk7XG5oYXJkZW4oY292ZXJlZEVudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7VH0gYVxuICogQHBhcmFtIHtUfSBiXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgbWF4UmFuayA9IChjb21wYXJlLCBhLCBiKSA9PiAoY29tcGFyZShhLCBiKSA+PSAwID8gYSA6IGIpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7VH0gYVxuICogQHBhcmFtIHtUfSBiXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgbWluUmFuayA9IChjb21wYXJlLCBhLCBiKSA9PiAoY29tcGFyZShhLCBiKSA8PSAwID8gYSA6IGIpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuICAgICAgIGNvbnN0IHVuaW9uUmFua0NvdmVycyA9IChjb21wYXJlLCBjb3ZlcnMpID0+IHtcbiAgLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbiAgY29uc3QgdW5pb25SYW5rQ292ZXJQYWlyID0gKFtsZWZ0QSwgcmlnaHRBXSwgW2xlZnRCLCByaWdodEJdKSA9PiBbXG4gICAgbWluUmFuayhjb21wYXJlLCBsZWZ0QSwgbGVmdEIpLFxuICAgIG1heFJhbmsoY29tcGFyZSwgcmlnaHRBLCByaWdodEIpLFxuICBdO1xuICByZXR1cm4gY292ZXJzLnJlZHVjZSh1bmlvblJhbmtDb3ZlclBhaXIsIFsneycsICcnXSk7XG59OyRozY9fb25jZS51bmlvblJhbmtDb3ZlcnModW5pb25SYW5rQ292ZXJzKTtcbmhhcmRlbih1bmlvblJhbmtDb3ZlcnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuICAgICAgIGNvbnN0IGludGVyc2VjdFJhbmtDb3ZlcnMgPSAoY29tcGFyZSwgY292ZXJzKSA9PiB7XG4gIC8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG4gIGNvbnN0IGludGVyc2VjdFJhbmtDb3ZlclBhaXIgPSAoW2xlZnRBLCByaWdodEFdLCBbbGVmdEIsIHJpZ2h0Ql0pID0+IFtcbiAgICBtYXhSYW5rKGNvbXBhcmUsIGxlZnRBLCBsZWZ0QiksXG4gICAgbWluUmFuayhjb21wYXJlLCByaWdodEEsIHJpZ2h0QiksXG4gIF07XG4gIHJldHVybiBjb3ZlcnMucmVkdWNlKGludGVyc2VjdFJhbmtDb3ZlclBhaXIsIFsnJywgJ3snXSk7XG59OyRozY9fb25jZS5pbnRlcnNlY3RSYW5rQ292ZXJzKGludGVyc2VjdFJhbmtDb3ZlcnMpO1xuXG4gICAgICAgY29uc3QgeyBjb21wYXJhdG9yOiBjb21wYXJlUmFuaywgYW50aUNvbXBhcmF0b3I6IGNvbXBhcmVBbnRpUmFuayB9ID1cbiAgbWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wYXJhdG9yIGtpdCBpbiB3aGljaCByZW1vdGFibGVzIGFyZSBmdWxseSBvcmRlcmVkXG4gKiBieSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZmlyc3Qgc2VlbiBieSAqdGhpcyogY29tcGFyYXRvciBraXQuXG4gKiBCRVdBUkU6IFRoaXMgaXMgb2JzZXJ2YWJsZSBtdXRhYmxlIHN0YXRlLCBzbyBzdWNoIGEgY29tcGFyYXRvciBraXRcbiAqIHNob3VsZCBuZXZlciBiZSBzaGFyZWQgYW1vbmcgc3Vic3lzdGVtcyB0aGF0IHNob3VsZCBub3QgYmUgYWJsZVxuICogdG8gY29tbXVuaWNhdGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgb3JkZXIgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIGZvciBzdG9yZVxuICogb3JkZXJpbmcsIHNpbmNlIGl0IGhhcyBubyBtZW1vcnkgb2YgZGVsZXRlZCBrZXlzLlxuICpcbiAqIFRoZXNlIGZ1bGwgb3JkZXIgY29tcGFyYXRvciBraXQgaXMgc3RyaWN0bHkgbW9yZSBwcmVjaXNlIHRoYXQgdGhlXG4gKiByYW5rIG9yZGVyIGNvbXBhcmF0b3Iga2l0cyBhYm92ZS4gQXMgYSByZXN1bHQsIGFueSBhcnJheSB3aGljaCBpc1xuICogc29ydGVkIGJ5IHN1Y2ggYSBmdWxsIG9yZGVyIHdpbGwgcGFzcyB0aGUgaXNSYW5rU29ydGVkIHRlc3Qgd2l0aFxuICogYSBjb3JyZXNwb25kaW5nIHJhbmsgb3JkZXIuXG4gKlxuICogQW4gYXJyYXkgd2hpY2ggaXMgc29ydGVkIGJ5IGEgKmZyZXNoKiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIGkuZS4sXG4gKiBvbmUgdGhhdCBoYXMgbm90IHlldCBzZWVuIGFueSByZW1vdGFibGVzLCB3aWxsIG9mIGNvdXJzZSByZW1haW5cbiAqIHNvcnRlZCBieSBhY2NvcmRpbmcgdG8gKnRoYXQqIGZ1bGwgb3JkZXIgY29tcGFyYXRvci4gQW4gYXJyYXkgKm9mXG4gKiBzY2FsYXJzKiBzb3J0ZWQgYnkgYSBmcmVzaCBmdWxsIG9yZGVyIHdpbGwgcmVtYWluIHNvcnRlZCBldmVuXG4gKiBhY2NvcmRpbmcgdG8gYSBuZXcgZnJlc2ggZnVsbCBvcmRlciBjb21wYXJhdG9yLCBzaW5jZSBpdCB3aWxsIHNlZVxuICogdGhlIHJlbW90YWJsZXMgaW4gdGhlIHNhbWUgb3JkZXIgYWdhaW4uIFVuZm9ydHVuYXRlbHksIHRoaXMgaXNcbiAqIG5vdCB0cnVlIG9mIGFycmF5cyBvZiBwYXNzYWJsZXMgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsb25nTGl2ZWRcbiAqIEByZXR1cm5zIHtGdWxsQ29tcGFyYXRvcktpdH1cbiAqLyRozY9fb25jZS5jb21wYXJlUmFuayhjb21wYXJlUmFuayk7JGjNj19vbmNlLmNvbXBhcmVBbnRpUmFuayhjb21wYXJlQW50aVJhbmspO1xuICAgICAgIGNvbnN0IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gKGxvbmdMaXZlZCA9IGZhbHNlKSA9PiB7XG4gIGxldCBudW1TZWVuID0gMDtcbiAgLyogV2hlbiBkeW5hbWljYWxseSBjcmVhdGVkIHdpdGggc2hvcnQgbGlmZXRpbWVzICh0aGUgZGVmYXVsdCkgYSBXZWFrTWFwKi9cbiAgLyogd291bGQgcGVyZm9ybSBwb29ybHksIGFuZCB0aGUgbGVhayBjcmVhdGVkIGJ5IGEgTWFwIG9ubHkgbGFzdHMgYXMgbG9uZyovXG4gIC8qIGFzIHRoZSBNYXAuKi9cbiAgY29uc3QgTWFwQ29uc3RydWN0b3IgPSBsb25nTGl2ZWQgPyBXZWFrTWFwIDogTWFwO1xuICBjb25zdCBzZWVuID0gbmV3IE1hcENvbnN0cnVjdG9yKCk7XG4gIGNvbnN0IHRhZyA9IHIgPT4ge1xuICAgIGlmIChzZWVuLmhhcyhyKSkge1xuICAgICAgcmV0dXJuIHNlZW4uZ2V0KHIpO1xuICAgIH1cbiAgICBudW1TZWVuICs9IDE7XG4gICAgc2Vlbi5zZXQociwgbnVtU2Vlbik7XG4gICAgcmV0dXJuIG51bVNlZW47XG4gIH07XG4gIGNvbnN0IGNvbXBhcmVSZW1vdGFibGVzID0gKHgsIHkpID0+IGNvbXBhcmVSYW5rKHRhZyh4KSwgdGFnKHkpKTtcbiAgcmV0dXJuIG1ha2VDb21wYXJhdG9yS2l0KGNvbXBhcmVSZW1vdGFibGVzKTtcbn07JGjNj19vbmNlLm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbmhhcmRlbihtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb21wYXJlQnlDb2RlUG9pbnRzIjpbImNvbXBhcmVCeUNvZGVQb2ludHMiXSwiY29tcGFyZU51bWVyaWNzIjpbImNvbXBhcmVOdW1lcmljcyJdLCJnZXRQYXNzU3R5bGVDb3ZlciI6WyJnZXRQYXNzU3R5bGVDb3ZlciJdLCJtYWtlQ29tcGFyYXRvcktpdCI6WyJtYWtlQ29tcGFyYXRvcktpdCJdLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiOlsiY29tcGFyYXRvck1pcnJvckltYWdlIl0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiXSwiYXNzZXJ0UmFua1NvcnRlZCI6WyJhc3NlcnRSYW5rU29ydGVkIl0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayJdLCJnZXRJbmRleENvdmVyIjpbImdldEluZGV4Q292ZXIiXSwiRnVsbFJhbmtDb3ZlciI6WyJGdWxsUmFua0NvdmVyIl0sImNvdmVyZWRFbnRyaWVzIjpbImNvdmVyZWRFbnRyaWVzIl0sInVuaW9uUmFua0NvdmVycyI6WyJ1bmlvblJhbmtDb3ZlcnMiXSwiaW50ZXJzZWN0UmFua0NvdmVycyI6WyJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIl0sImNvbXBhcmVBbnRpUmFuayI6WyJjb21wYXJlQW50aVJhbmsiXSwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiOlsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAIQAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADjEN0jSQwAAEkMAAAdAAAAQGVuZG8vbmF0LXY1LjEuMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIk5hdCIsImlzTmF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwnbmFtZScse3ZhbHVlOlwiaXNOYXRcIn0pOyRozY9fb25jZS5pc05hdChpc05hdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdCwnbmFtZScse3ZhbHVlOlwiTmF0XCJ9KTskaM2PX29uY2UuTmF0KE5hdCk7LyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTmF0KGFsbGVnZWROdW0pIHtcbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBhbGxlZ2VkTnVtID49IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSAmJiBhbGxlZ2VkTnVtID49IDA7XG59XG5cbi8qKlxuICogSWYgYGFsbGVnZWROdW1iZXJgIHBhc3NlcyB0aGUgYGlzTmF0YCB0ZXN0LCB0aGVuIHJldHVybiBpdCBhcyBhIGJpZ2ludC5cbiAqIE90aGVyd2lzZSB0aHJvdyBhbiBhcHByb3ByaWF0ZSBlcnJvci5cbiAqXG4gKiBJZiBgYWxsZWdlZE51bWAgaXMgbmVpdGhlciBhIGJpZ2ludCBub3IgYSBudW1iZXIsIGBOYXRgIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBpcyBub3QgYSBbc2FmZWx5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiBub24tbmVnYXRpdmUgaW50ZWdlciwgYE5hdGAgdGhyb3dzIGEgYFJhbmdlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBiaWdpbnQgaWYgbmVjZXNzYXJ5IGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKSB7XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ2JpZ2ludCcpIHtcbiAgICBpZiAoYWxsZWdlZE51bSA8IDBuKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gICAgfVxuICAgIHJldHVybiBhbGxlZ2VkTnVtO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnbnVtYmVyJykge1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gICAgfVxuICAgIGlmIChhbGxlZ2VkTnVtIDwgMCkge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuICAgIH1cbiAgICByZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuICB9XG5cbiAgdGhyb3cgVHlwZUVycm9yKFxuICAgIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgLFxuICApO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABubt5zNgsAADYLAAAgAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIiwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3NyYy9lcnJvci5qcyIsIi4vc3JjL3JlbW90YWJsZS5qcyIsIi4vc3JjL3N5bWJvbC5qcyIsIi4vc3JjL3N0cmluZy5qcyIsIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIiwiLi9zcmMvbWFrZVRhZ2dlZC5qcyIsIi4vc3JjL21ha2UtZmFyLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiRmFyIiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIiwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiLCJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyIsImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiLCJpc09iamVjdCIsImlzT2JqZWN0IiwiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9pdGVyLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9lcnJvci5qc1wiLCBbXV0sW1wiLi9zcmMvcmVtb3RhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9zeW1ib2wuanNcIiwgW11dLFtcIi4vc3JjL3N0cmluZy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlT2YuanNcIiwgW11dLFtcIi4vc3JjL21ha2VUYWdnZWQuanNcIiwgW11dLFtcIi4vc3JjL21ha2UtZmFyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjpbWyJtYXBJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sWyJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIl1dLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6W1siUEFTU19TVFlMRSIsIlBBU1NfU1RZTEUiXSxbImlzT2JqZWN0IiwiaXNPYmplY3QiXSxbImlzUHJpbWl0aXZlIiwiaXNQcmltaXRpdmUiXSxbImFzc2VydENoZWNrZXIiLCJhc3NlcnRDaGVja2VyIl0sWyJnZXRUYWciLCJnZXRUYWciXSxbImhhc093blByb3BlcnR5T2YiLCJoYXNPd25Qcm9wZXJ0eU9mIl1dLCIuL3NyYy9lcnJvci5qcyI6W1siZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEVycm9yQ29uc3RydWN0b3IiXSxbImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiXV0sIi4vc3JjL3JlbW90YWJsZS5qcyI6W1siZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdLFsiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiLCJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyJdXSwiLi9zcmMvc3ltYm9sLmpzIjpbWyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sWyJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCJdLFsibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sWyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSxbInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIiwidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiXV0sIi4vc3JjL3N0cmluZy5qcyI6W1siaXNXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLFsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRQYXNzYWJsZVN0cmluZyJdXSwiLi9zcmMvcGFzc1N0eWxlT2YuanMiOltbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXSxbImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIl0sWyJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIl0sWyJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSxbInRvVGhyb3dhYmxlIiwidG9UaHJvd2FibGUiXV0sIi4vc3JjL21ha2VUYWdnZWQuanMiOltbIm1ha2VUYWdnZWQiLCJtYWtlVGFnZ2VkIl1dLCIuL3NyYy9tYWtlLWZhci5qcyI6W1siUmVtb3RhYmxlIiwiUmVtb3RhYmxlIl0sWyJGYXIiLCJGYXIiXSxbIlRvRmFyRnVuY3Rpb24iLCJUb0ZhckZ1bmN0aW9uIl0sWyJHRVRfTUVUSE9EX05BTUVTIiwiR0VUX01FVEhPRF9OQU1FUyJdXSwiLi9zcmMvdHlwZUd1YXJkcy5qcyI6W1siYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVjb3JkIl0sWyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiXSxbImFzc2VydFJlbW90YWJsZSIsImFzc2VydFJlbW90YWJsZSJdLFsiaXNSZW1vdGFibGUiLCJpc1JlbW90YWJsZSJdLFsiaXNSZWNvcmQiLCJpc1JlY29yZCJdLFsiaXNDb3B5QXJyYXkiLCJpc0NvcHlBcnJheSJdLFsiaXNBdG9tIiwiaXNBdG9tIl0sWyJhc3NlcnRBdG9tIiwiYXNzZXJ0QXRvbSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAToVuIxUNAAAVDQAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9ieXRlQXJyYXkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiQnl0ZUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJztcbiAqL1xuXG5jb25zdCB7IGdldFByb3RvdHlwZU9mLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cywgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qIERldGVjdHMgdGhlIHByZXNlbmNlIG9mIGEgaW1tdXRhYmxlIEFycmF5QnVmZmVyIHN1cHBvcnQgaW4gdGhlIHVuZGVybHlpbmcqL1xuLyogcGxhdGZvcm0gYW5kIHByb3ZpZGVzIGVpdGhlciBzdWl0YWJsZSB2YWx1ZXMgZnJvbSB0aGF0IGltcGxlbWVudGF0aW9uIG9yKi9cbi8qIHZhbHVlcyB0aGF0IHdpbGwgY29uc2lzdGVudGx5IGRlbnkgdGhhdCBpbW11dGFibGUgQXJyYXlCdWZmZXJzIGV4aXN0LiovXG5jb25zdCBhZGFwdEltbXV0YWJsZUFycmF5QnVmZmVyID0gKCkgPT4ge1xuICBjb25zdCBhbkFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDApO1xuXG4gIC8qIE9uIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHNsaWNlVG9JbW11dGFibGUsIHBhc3Mtc3R5bGUgYnl0ZUFycmF5Ki9cbiAgLyogY2Fubm90IGJlIGNvbnN0cnVjdGVkLiovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgVE9ETyBUaGlzIGVycm9yIHdpbGwgYmUgYWRkcmVzc2VkIHdoZW4gdXBkYXRpbmcqL1xuICAvKiBUeXBlU2NyaXB0J3MgbmF0aXZlIHR5cGVzIHRvIGEgdmVyc2lvbiByZWNvZ25pemluZyB0aGUgdXBjb21pbmcgc3RhbmRhcmQuKi9cbiAgaWYgKGFuQXJyYXlCdWZmZXIuc2xpY2VUb0ltbXV0YWJsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlOiBudWxsLFxuICAgICAgaW1tdXRhYmxlR2V0dGVyOiAoKSA9PiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBUT0RPIFRoaXMgZXJyb3Igd2lsbCBiZSBhZGRyZXNzZWQgd2hlbiB1cGRhdGluZyovXG4gIC8qIFR5cGVTY3JpcHQncyBuYXRpdmUgdHlwZXMgdG8gYSB2ZXJzaW9uIHJlY29nbml6aW5nIHRoZSB1cGNvbWluZyBzdGFuZGFyZC4qL1xuICBjb25zdCBhbkltbXV0YWJsZUFycmF5QnVmZmVyID0gYW5BcnJheUJ1ZmZlci5zbGljZVRvSW1tdXRhYmxlKCk7XG5cbiAgLyoqXG4gKiBBcyBwcm9wb3NlZCwgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIGBBcnJheUJ1ZmZlci5wcm90b3R5cGVgLiBBcyBzaGltbWVkLFxuICogdGhpcyB3aWxsIGJlIGEgaGlkZGVuIGludHJpbnNpYyB0aGF0IGluaGVyaXRzIGZyb20gYEFycmF5QnVmZmVyLnByb3RvdHlwZWAuXG4gKiBFaXRoZXIgd2F5LCBnZXQgdGhpcyBpbiBhIHdheSB0aGF0IHdlIGNhbiB0cnVzdCBpdCBhZnRlciBsb2NrZG93biwgYW5kXG4gKiByZXF1aXJlIHRoYXQgYWxsIGltbXV0YWJsZSBBcnJheUJ1ZmZlcnMgZGlyZWN0bHkgaW5oZXJpdCBmcm9tIGl0LlxuICovXG4gIGNvbnN0IGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW5JbW11dGFibGVBcnJheUJ1ZmZlcik7XG5cbiAgY29uc3QgaW1tdXRhYmxlR2V0dGVyID0gLyoqIEB0eXBlIHsodGhpczogQXJyYXlCdWZmZXIpID0+IGJvb2xlYW59ICovIChcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgdGhlIGRlc2NpcHRvciBpcyB0aGVyZS4qL1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSwgJ2ltbXV0YWJsZScpLmdldFxuICApO1xuXG4gIHJldHVybiB7IGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlLCBpbW11dGFibGVHZXR0ZXIgfTtcbn07XG5cbmNvbnN0IHsgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUsIGltbXV0YWJsZUdldHRlciB9ID1cbiAgYWRhcHRJbW11dGFibGVBcnJheUJ1ZmZlcigpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBCeXRlQXJyYXlIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdieXRlQXJyYXknLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciAmJlxuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUT0RPIEhvdyBkbyBJIGFkZCBpdCB0byB0aGUgQXJyYXlCdWZmZXIgdHlwZT8qL1xuICAgICAgY2FuZGlkYXRlLmltbXV0YWJsZSkgfHxcbiAgICAoISFjaGVjayAmJiBjaGVjayhmYWxzZSwgWGBJbW11dGFibGUgQXJyYXlCdWZmZXIgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIF9wYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUgfHxcbiAgICAgIGFzc2VydC5mYWlsKFhgTWFsZm9ybWVkIEJ5dGVBcnJheSAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICAgIGFwcGx5KGltbXV0YWJsZUdldHRlciwgY2FuZGlkYXRlLCBbXSkgfHxcbiAgICAgIEZhaWxgTXVzdCBiZSBhbiBpbW11dGFibGUgQXJyYXlCdWZmZXI6ICR7Y2FuZGlkYXRlfWA7XG4gICAgb3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgIFhgQnl0ZUFycmF5cyBtdXN0IG5vdCBoYXZlIG93biBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gLFxuICAgICAgICBUeXBlRXJyb3IsXG4gICAgICApO1xuICB9LFxufSk7JGjNj19vbmNlLkJ5dGVBcnJheUhlbHBlcihCeXRlQXJyYXlIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnl0ZUFycmF5SGVscGVyIjpbIkJ5dGVBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACZp73SCAgAAAgIAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxhc3NlcnRDaGVja2VyLGdldE93bkRhdGFEZXNjcmlwdG9yOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGdldFByb3RvdHlwZU9mIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXksIHByb3RvdHlwZTogYXJyYXlQcm90b3R5cGUgfSA9IEFycmF5O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG4gICAgICAgY29uc3QgQ29weUFycmF5SGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAnY29weUFycmF5JyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT5cbiAgICBpc0FycmF5KGNhbmRpZGF0ZSkgfHxcbiAgICAoISFjaGVjayAmJiBjaGVjayhmYWxzZSwgWGBBcnJheSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkgPT09IGFycmF5UHJvdG90eXBlIHx8XG4gICAgICBhc3NlcnQuZmFpbChYYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCwgVHlwZUVycm9yKTtcbiAgICAvKiBTaW5jZSB3ZSdyZSBhbHJlYWR5IGVuc3VyZWQgY2FuZGlkYXRlIGlzIGFuIGFycmF5LCBpdCBzaG91bGQgbm90IGJlKi9cbiAgICAvKiBwb3NzaWJsZSBmb3IgdGhlIGZvbGxvd2luZyBnZXQgdG8gZmFpbC4qL1xuICAgIGNvbnN0IGxlbiA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoXG4gICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsICdsZW5ndGgnLCBmYWxzZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWVcbiAgICApO1xuICAgIC8qIFZhbGlkYXRlIHRoYXQgZWFjaCBpbmRleCBwcm9wZXJ0eSBpcyBvd24vZGF0YS9lbnVtZXJhYmxlKi9cbiAgICAvKiBhbmQgaXRzIGFzc29jaWF0ZWQgdmFsdWUgaXMgcmVjdXJzaXZlbHkgcGFzc2FibGUuKi9cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICBwYXNzU3R5bGVPZlJlY3VyKFxuICAgICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsIGksIHRydWUsIGFzc2VydENoZWNrZXIpLnZhbHVlLFxuICAgICAgKTtcbiAgICB9XG4gICAgLyogRXhwZWN0IG9uZSBrZXkgcGVyIGluZGV4IHBsdXMgb25lIGZvciAnbGVuZ3RoJy4qL1xuICAgIG93bktleXMoY2FuZGlkYXRlKS5sZW5ndGggPT09IGxlbiArIDEgfHxcbiAgICAgIGFzc2VydC5mYWlsKFhgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsIFR5cGVFcnJvcik7XG4gIH0sXG59KTskaM2PX29uY2UuQ29weUFycmF5SGVscGVyKENvcHlBcnJheUhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5QXJyYXlIZWxwZXIiOlsiQ29weUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEcvuh1nCwAAZwsAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvY29weVJlY29yZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixnZXRPd25EYXRhRGVzY3JpcHRvcixDWCxjYW5CZU1ldGhvZDskaM2PX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJjYW5CZU1ldGhvZFwiLFskaM2PX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrT2JqZWN0UHJvdG90eXBlID0gKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIChcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YClcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7UHJvcGVydHlLZXl9IGtleVxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkID0gKGNhbmRpZGF0ZSwga2V5LCB2YWx1ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIChcbiAgICAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKCFjYW5CZU1ldGhvZCh2YWx1ZSkgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIC8qIFRPRE86IFVwZGF0ZSBtZXNzYWdlIG5vdyB0aGF0IHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgXCJpbXBsaWNpdCBSZW1vdGFibGVcIi4qL1xuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKVxuICApO1xufTtcblxuLyoqXG4gKlxuICogQHR5cGUge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IENvcHlSZWNvcmRIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdjb3B5UmVjb3JkJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBjaGVja09iamVjdFByb3RvdHlwZShjYW5kaWRhdGUsIGNoZWNrKSAmJlxuICAgICAgLyogUmVqZWN0IGFueSBjYW5kaWRhdGUgd2l0aCBhIHN5bWJvbC1rZXllZCBwcm9wZXJ0eSBvciBtZXRob2QtbGlrZSBwcm9wZXJ0eSovXG4gICAgICAvKiAoc3VjaCBpbnB1dCBpcyBwb3RlbnRpYWxseSBhIFJlbW90YWJsZSkuKi9cbiAgICAgIG93bktleXMoY2FuZGlkYXRlKS5ldmVyeShrZXkgPT5cbiAgICAgICAgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQoY2FuZGlkYXRlLCBrZXksIGNhbmRpZGF0ZVtrZXldLCBjaGVjayksXG4gICAgICApXG4gICAgKTtcbiAgfSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICAvKiBWYWxpZGF0ZSB0aGF0IGVhY2ggb3duIHByb3BlcnR5IGhhcyBhIHJlY3Vyc2l2ZWx5IHBhc3NhYmxlIGFzc29jaWF0ZWQqL1xuICAgIC8qIHZhbHVlICh3ZSBhbHJlYWR5IGtub3cgZnJvbSBjYW5CZVZhbGlkIHRoYXQgdGhlIG90aGVyIGNvbnN0cmFpbnRzIGFyZSovXG4gICAgLyogc2F0aXNmaWVkKS4qL1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGdldE93bkRhdGFEZXNjcmlwdG9yKFxuICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHRydWUsXG4gICAgICAgIGFzc2VydENoZWNrZXIsXG4gICAgICApO1xuICAgICAgcGFzc1N0eWxlT2ZSZWN1cih2YWx1ZSk7XG4gICAgfVxuICB9LFxufSk7JGjNj19vbmNlLkNvcHlSZWNvcmRIZWxwZXIoQ29weVJlY29yZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5UmVjb3JkSGVscGVyIjpbIkNvcHlSZWNvcmRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnjrC09gZAADYGQAALgAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9kZWVwbHlGdWxmaWxsZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJkZWVwbHlGdWxmaWxsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHEsRSxpc1Byb21pc2UsZ2V0VGFnLHBhc3NTdHlsZU9mLG1ha2VUYWdnZWQsaXNBdG9tOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJpc0F0b21cIixbJGjNj19hID0+IChpc0F0b20gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1JlbW90YWJsZUJyYW5kfSBmcm9tICdAZW5kby9ldmVudHVhbC1zZW5kJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBCeXRlQXJyYXksIENvcHlSZWNvcmQsIENvcHlBcnJheSwgQ29weVRhZ2dlZCwgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBDdXJyZW50bHkgY29waWVkIGZyb20gQGFnb3JpYy9pbnRlcm5hbCB1dGlscy5qcy5cbiAqIFRPRE8gU2hvdWxkIG1pZ3JhdGUgaGVyZSBhbmQgdGhlbiwgaWYgbmVlZGVkLCByZWV4cG9ydGVkIHRoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7eyBbS2V5VHlwZSBpbiBrZXlvZiBUXTogVFtLZXlUeXBlXSB9ICYge319IFNpbXBsaWZ5IGZsYXR0ZW4gdGhlXG4gKiAgIHR5cGUgb3V0cHV0IHRvIGltcHJvdmUgdHlwZSBoaW50cyBzaG93biBpbiBlZGl0b3JzXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2Uvc2ltcGxpZnkuZC50c1xuICovXG5cbi8qKlxuICogQ3VycmVudGx5IGNvcGllZCBmcm9tIEBhZ29yaWMvaW50ZXJuYWwgdXRpbHMuanMuXG4gKiBUT0RPIFNob3VsZCBtaWdyYXRlIGhlcmUgYW5kIHRoZW4sIGlmIG5lZWRlZCwgcmVleHBvcnRlZCB0aGVyZS5cbiAqXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IENhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBDdXJyZW50bHkgY29waWVkIGZyb20gQGFnb3JpYy9pbnRlcm5hbCB1dGlscy5qcy5cbiAqIFRPRE8gU2hvdWxkIG1pZ3JhdGUgaGVyZSBhbmQgdGhlbiwgaWYgbmVlZGVkLCByZWV4cG9ydGVkIHRoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ2FsbGFibGUgPyBUW0tdIDogRGVlcGx5QXdhaXRlZDxUW0tdPjtcbiAqIH19IERlZXBseUF3YWl0ZWRPYmplY3RcbiAqL1xuXG4vKipcbiAqIEN1cnJlbnRseSBjb3BpZWQgZnJvbSBAYWdvcmljL2ludGVybmFsIHV0aWxzLmpzLlxuICogVE9ETyBTaG91bGQgbWlncmF0ZSBoZXJlIGFuZCB0aGVuLCBpZiBuZWVkZWQsIHJlZXhwb3J0ZWQgdGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgUHJvbWlzZUxpa2U8YW55PlxuICogICAgID8gQXdhaXRlZDxUPlxuICogICAgIDogVCBleHRlbmRzIChSZW1vdGFibGVCcmFuZDxhbnksIGFueT4gfCBSZW1vdGFibGVPYmplY3QpXG4gKiAgICAgICA/IFRcbiAqICAgICAgIDogVCBleHRlbmRzIHt9XG4gKiAgICAgICAgID8gU2ltcGxpZnk8RGVlcGx5QXdhaXRlZE9iamVjdDxUPj5cbiAqICAgICAgICAgOiBBd2FpdGVkPFQ+fSBEZWVwbHlBd2FpdGVkXG4gKi9cblxuLyoqXG4gKiBHaXZlbiBhIFBhc3NhYmxlIGB2YWxgIHdob3NlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgbWF5IGNvbnRhaW4gbGVhZlxuICogcHJvbWlzZXMsIHJldHVybiBhIHByb21pc2UgZm9yIGEgcmVwbGFjZW1lbnQgUGFzc2FibGUsXG4gKiB3aGVyZSB0aGF0IHJlcGxhY2VtZW50IGlzICpkZWVwbHkgZnVsZmlsbGVkKiwgaS5lLiwgaXRzXG4gKiBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW55IHByb21pc2VzLlxuICpcbiAqIFRoaXMgaXMgYSBkZWVwIGZvcm0gb2YgYFByb21pc2UuYWxsYCBzcGVjaWFsaXplZCBmb3IgUGFzc2FibGVzLiBGb3IgZWFjaFxuICogZW5jb3VudGVyZWQgcHJvbWlzZSwgcmVwbGFjZSBpdCB3aXRoIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm0gb2ZcbiAqIGl0cyBmdWxmaWxsbWVudC5cbiAqIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgcmVqZWN0LCB0aGVuIHRoZSBwcm9taXNlIGZvciB0aGUgcmVwbGFjZW1lbnRcbiAqIHJlamVjdHMuIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgbmV2ZXIgc2V0dGxlLCB0aGVuIHRoZSBwcm9taXNlIGZvclxuICogdGhlIHJlcGxhY2VtZW50IG5ldmVyIHNldHRsZXMuXG4gKlxuICogSWYgdGhlIHJlcGxhY2VtZW50IHdvdWxkIG5vdCBiZSBQYXNzYWJsZSwgaS5lLiwgaWYgYHZhbGAgaXMgbm90XG4gKiBQYXNzYWJsZSwgb3IgaWYgYW55IG9mIHRoZSB0cmFuc2l0aXZlIHByb21pc2VzIGZ1bGZpbGwgdG8gc29tZXRoaW5nXG4gKiB0aGF0IGlzIG5vdCBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSByZWplY3RzLlxuICpcbiAqIElmIGB2YWxgIG9yIGl0cyBwYXJ0cyBhcmUgbm9uLWtleSBQYXNzYWJsZXMgb25seSAqYmVjYXVzZSogdGhleSBjb250YWluXG4gKiBwcm9taXNlcywgdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybXMgb2YgdmFsIG9yIGl0cyBwYXJ0cyBtYXkgYmUga2V5cy4gVGhpc1xuICogaXMgZm9yIHRoZSBoaWdoZXIgXCJAZW5kby9wYXR0ZXJuc1wiIGxldmVsIG9mIGFic3RyYWN0aW9uIHRvIGRldGVybWluZSxcbiAqIGJlY2F1c2UgaXQgZGVmaW5lcyB0aGUgYEtleWAgbm90aW9uIGluIHF1ZXN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtUPVBhc3NhYmxlXVxuICogQHBhcmFtIHtUfSB2YWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPERlZXBseUF3YWl0ZWQ8VD4+fVxuICovXG4gICAgICAgY29uc3QgZGVlcGx5RnVsZmlsbGVkID0gYXN5bmMgdmFsID0+IHtcbiAgLyogVE9ETyBGaWd1cmUgb3V0IHdoeSB3ZSBuZWVkIHRoZXNlIGF0LWV4cGVjdC1lcnJvciBkaXJlY3RpdmVzIGJlbG93Ki9cbiAgLyogYW5kIGZpeCBpZiBwb3NzaWJsZS4qL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzEyNTcgbWF5IGJlIHJlbGV2YW50LiovXG5cbiAgLyogSWYgYHZhbGAgaXMgbm90IFBhc3NhYmxlLCBgaXNBdG9tYCB3aWxsIHJldHVybiBmYWxzZSByYXRoZXIgdGhhbiovXG4gIC8qIHRocm93aW5nLiovXG4gIGlmIChpc0F0b20odmFsKSkge1xuICAgIHJldHVybiAvKiogQHR5cGUge0RlZXBseUF3YWl0ZWQ8VD59ICovICh2YWwpO1xuICB9XG4gIC8qIGlmIGB2YWxgIGlzIGEgcHJvbWlzZSBidXQgbm90IGEgcGFzc2FibGUgcHJvbWlzZSwgZm9yIGV4YW1wbGUsKi9cbiAgLyogYmVjYXVzZSBpdCBpcyBub3QgaGFyZGVuZWQsIGBpc1Byb21pc2VgIHdpbGwgcmV0dXJuIHRydWUsIHdoaWNoIGlzKi9cbiAgLyogb2sgaGVyZSBiYWNhdXNlIHdlIHVud3JhcCBpdCB0byBpdHMgc2V0dGxlbWVudCBhbmQgZGlzcGVuc2Ugd2l0aCB0aGUqL1xuICAvKiBwcm9taXNlKi9cbiAgaWYgKGlzUHJvbWlzZSh2YWwpKSB7XG4gICAgcmV0dXJuIEUud2hlbih2YWwsIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgfVxuICAvKiBJZiBgdmFsYCBpcyBhbnkgb3RoZXIgbm9uLVBhc3NhYmxlLCB0aGUgYHBhc3NTdHlsZU9mKHZhbClgIHdpbGwgdGhyb3cuKi9cbiAgLyogU28gdGhpcyBleGVtcHRpb24gZm9yIG5vbi1QYXNzYWJsZSBwcm9taXNlcyBpcyBvbmx5IGZvciB0aGUgdG9wLWxldmVsLiovXG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIGNvbnN0IHJlYyA9IC8qKiBAdHlwZSB7Q29weVJlY29yZH0gKi8gKHZhbCk7XG4gICAgICBjb25zdCBuYW1lcyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChvd25LZXlzKHJlYykpO1xuICAgICAgY29uc3QgdmFsUHMgPSBuYW1lcy5tYXAobmFtZSA9PiBkZWVwbHlGdWxmaWxsZWQocmVjW25hbWVdKSk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCB2YWxzID0+XG4gICAgICAgIGhhcmRlbihmcm9tRW50cmllcyh2YWxzLm1hcCgoYywgaSkgPT4gW25hbWVzW2ldLCBjXSkpKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgIGNvbnN0IGFyciA9IC8qKiBAdHlwZSB7Q29weUFycmF5fSAqLyAodmFsKTtcbiAgICAgIGNvbnN0IHZhbFBzID0gYXJyLm1hcChwID0+IGRlZXBseUZ1bGZpbGxlZChwKSk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCB2YWxzID0+IGhhcmRlbih2YWxzKSk7XG4gICAgfVxuICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgIGNvbnN0IGJ5dGVBcnJheSA9IC8qKiBAdHlwZSB7Qnl0ZUFycmF5fSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAodmFsKSk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiBieXRlQXJyYXk7XG4gICAgfVxuICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgIGNvbnN0IHRnZCA9IC8qKiBAdHlwZSB7Q29weVRhZ2dlZH0gKi8gKHZhbCk7XG4gICAgICBjb25zdCB0YWcgPSBnZXRUYWcodGdkKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3Igbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnRGVlcGx5QXdhaXRlZDxUPicqL1xuICAgICAgcmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodGdkLnBheWxvYWQpLCBwYXlsb2FkID0+XG4gICAgICAgIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIGNvbnN0IHJlbSA9IC8qKiBAdHlwZSB7UmVtb3RhYmxlT2JqZWN0fSAqLyAodmFsKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3Igbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnRGVlcGx5QXdhaXRlZDxUPicqL1xuICAgICAgcmV0dXJuIHJlbTtcbiAgICB9XG4gICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICBjb25zdCBlcnIgPSAvKiogQHR5cGUge0Vycm9yfSAqLyAodmFsKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3Igbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnRGVlcGx5QXdhaXRlZDxUPicqL1xuICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG4gICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgIGNvbnN0IHByb20gPSAvKiogQHR5cGUge1Byb21pc2V9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh2YWwpKTtcbiAgICAgIHJldHVybiBFLndoZW4ocHJvbSwgbm9ucCA9PiBkZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBhc3NlcnQuZmFpbChYYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsIFR5cGVFcnJvcik7XG4gICAgfVxuICB9XG59OyRozY9fb25jZS5kZWVwbHlGdWxmaWxsZWQoZGVlcGx5RnVsZmlsbGVkKTtcbmhhcmRlbihkZWVwbHlGdWxmaWxsZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABqyyZGzR0AAM0dAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2Vycm9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJFcnJvckhlbHBlciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIiwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwiaXNFcnJvckxpa2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLGFzc2VydENoZWNrZXIsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7Q2hlY2tlciwgUGFzc1N0eWxlLCBQYXNzU3R5bGVPZn0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgaGFzT3duLCBlbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qIFRPRE86IE1haW50ZW5hbmNlIGhhemFyZDogQ29vcmRpbmF0ZSB3aXRoIHRoZSBsaXN0IG9mIGVycm9ycyBpbiB0aGUgU0VTKi9cbi8qIHdoaWxlbGlzdC4qL1xuY29uc3QgZXJyb3JDb25zdHJ1Y3RvcnMgPSBuZXcgTWFwKFxuICAvKiBDYXN0IGJlY2F1c2Ugb3RoZXJ3aXNlIFRTIGlzIGNvbmZ1c2VkIGJ5IEFnZ3JlZ2F0ZUVycm9yKi9cbiAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzIwNDIjZGlzY3Vzc2lvbl9yMTQ4NDkzMzAyOCovXG4gIC8qKiBAdHlwZSB7QXJyYXk8W3N0cmluZywgSU1QT1JUKCdzZXMnKS5HZW5lcmljRXJyb3JDb25zdHJ1Y3Rvcl0+fSAqL1xuICAoW1xuICAgIFsnRXJyb3InLCBFcnJvcl0sXG4gICAgWydFdmFsRXJyb3InLCBFdmFsRXJyb3JdLFxuICAgIFsnUmFuZ2VFcnJvcicsIFJhbmdlRXJyb3JdLFxuICAgIFsnUmVmZXJlbmNlRXJyb3InLCBSZWZlcmVuY2VFcnJvcl0sXG4gICAgWydTeW50YXhFcnJvcicsIFN5bnRheEVycm9yXSxcbiAgICBbJ1R5cGVFcnJvcicsIFR5cGVFcnJvcl0sXG4gICAgWydVUklFcnJvcicsIFVSSUVycm9yXVxuXG4gICAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy81NTAqL1xuICAgIC8qIFRvIGFjY29tbW9kYXRlIHBsYXRmb3JtcyBwcmlvciB0byBBZ2dyZWdhdGVFcnJvciwgd2UgY29tbWVudCBvdXQgdGhlKi9cbiAgICAvKiBmb2xsb3dpbmcgbGluZSBhbmQgaW5zdGVhZCBjb25kaXRpb25hbGx5IGFkZCBpdCB0byB0aGUgbWFwIGJlbG93LiovXG4gICAgLyogWydBZ2dyZWdhdGVFcnJvcicsIEFnZ3JlZ2F0ZUVycm9yXSwqL1xuICBdKSxcbik7XG5cbmlmICh0eXBlb2YgQWdncmVnYXRlRXJyb3IgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8qIENvbmRpdGlvbmFsLCB0byBhY2NvbW1vZGF0ZSBwbGF0Zm9ybXMgcHJpb3IgdG8gQWdncmVnYXRlRXJyb3IqL1xuICBlcnJvckNvbnN0cnVjdG9ycy5zZXQoJ0FnZ3JlZ2F0ZUVycm9yJywgQWdncmVnYXRlRXJyb3IpO1xufVxuXG4vKipcbiAqIEJlY2F1c2UgdGhlIGVycm9yIGNvbnN0cnVjdG9yIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gbWlnaHQgYmVcbiAqIGBBZ2dyZWdhdGVFcnJvcmAsIHdoaWNoIGhhcyBkaWZmZXJlbnQgY29uc3RydWN0aW9uIHBhcmFtZXRlcnNcbiAqIGZyb20gdGhlIG90aGVyIGVycm9yIGNvbnN0cnVjdG9ycywgZG8gbm90IHVzZSBpdCBkaXJlY3RseSB0byB0cnlcbiAqIHRvIG1ha2UgYW4gZXJyb3IgaW5zdGFuY2UuIFJhdGhlciwgdXNlIGBtYWtlRXJyb3JgIHdoaWNoIGVuY2Fwc3VsYXRlc1xuICogdGhpcyBub24tdW5pZm9ybWl0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0lNUE9SVCgnc2VzJykuR2VuZXJpY0Vycm9yQ29uc3RydWN0b3IgfCB1bmRlZmluZWR9XG4gKi9cbiAgICAgICBjb25zdCBnZXRFcnJvckNvbnN0cnVjdG9yID0gbmFtZSA9PiBlcnJvckNvbnN0cnVjdG9ycy5nZXQobmFtZSk7JGjNj19vbmNlLmdldEVycm9yQ29uc3RydWN0b3IoZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5oYXJkZW4oZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrRXJyb3JMaWtlID0gKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgLyogVE9ETzogTmVlZCBhIGJldHRlciB0ZXN0IHRoYW4gaW5zdGFuY2VvZiovXG4gIHJldHVybiAoXG4gICAgY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICAoISFjaGVjayAmJiBDWChjaGVjaylgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogVmFsaWRhdGluZyBlcnJvciBvYmplY3RzIGFyZSBwYXNzYWJsZSByYWlzZXMgYSB0ZW5zaW9uIGJldHdlZW4gc2VjdXJpdHlcbiAqIHZzIHByZXNlcnZpbmcgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbi4gRm9yIGVycm9ycywgd2UgbmVlZCB0byByZW1lbWJlclxuICogdGhlIGVycm9yIGl0c2VsZiBleGlzdHMgdG8gaGVscCB1cyBkaWFnbm9zZSBhIGJ1ZyB0aGF0J3MgbGlrZWx5IG1vcmVcbiAqIHByZXNzaW5nIHRoYW4gYSB2YWxpZGl0eSBidWcgaW4gdGhlIGVycm9yIGl0c2VsZi4gVGh1cywgd2hlbmV2ZXIgaXQgaXMgc2FmZVxuICogdG8gZG8gc28sIHdlIHByZWZlciB0byBsZXQgdGhlIGVycm9yLWxpa2UgdGVzdCBzdWNjZWVkIGFuZCB0byBjb3VjaCB0aGVzZVxuICogY29tcGxhaW50cyBhcyBub3RlcyBvbiB0aGUgZXJyb3IuXG4gKlxuICogVG8gcmVzb2x2ZSB0aGlzLCBzdWNoIGEgbWFsZm9ybWVkIGVycm9yIG9iamVjdCB3aWxsIHN0aWxsIHBhc3NcbiAqIGBpc0Vycm9yTGlrZWAgc28gbWFyc2hhbCBjYW4gdXNlIHRoaXMgZm9yIHRvcCBsZXZlbCBlcnJvciB0byByZXBvcnQgZnJvbSxcbiAqIGV2ZW4gaWYgaXQgd291bGQgbm90IGFjdHVhbGx5IHZhbGlkYXRlLlxuICogSW5zdGVhZCwgdGhlIGRpYWdub3N0aWNzIHRoYXQgYGFzc2VydEVycm9yYCB3b3VsZCBoYXZlIHJlcG9ydGVkIGFyZVxuICogYXR0YWNoZWQgYXMgbm90ZXMgdG8gdGhlIG1hbGZvcm1lZCBlcnJvci4gVGh1cywgYSBtYWxmb3JtZWRcbiAqIGVycm9yIGlzIHBhc3NhYmxlIGJ5IGl0c2VsZiwgYnV0IG5vdCBhcyBwYXJ0IG9mIGEgcGFzc2FibGUgc3RydWN0dXJlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGlzRXJyb3JMaWtlID0gY2FuZGlkYXRlID0+IGNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjNj19vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BOYW1lXG4gKiBAcGFyYW0ge1Byb3BlcnR5RGVzY3JpcHRvcn0gZGVzY1xuICogQHBhcmFtIHsodmFsOiBhbnkpID0+IFBhc3NTdHlsZX0gcGFzc1N0eWxlT2ZSZWN1clxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gKFxuICBwcm9wTmFtZSxcbiAgZGVzYyxcbiAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgY2hlY2sgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKGRlc2MuZW51bWVyYWJsZSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlOiAke2Rlc2N9YFxuICAgICk7XG4gIH1cbiAgaWYgKCFoYXNPd24oZGVzYywgJ3ZhbHVlJykpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgcHJvcE5hbWUsXG4gICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIGRhdGEgcHJvcGVydHk6ICR7ZGVzY31gXG4gICAgKTtcbiAgfVxuICBjb25zdCB7IHZhbHVlIH0gPSBkZXNjO1xuICBzd2l0Y2ggKHByb3BOYW1lKSB7XG4gICAgY2FzZSAnbWVzc2FnZSc6XG4gICAgY2FzZSAnc3RhY2snOiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3ZhbHVlfWApXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICdjYXVzZSc6IHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICByZXR1cm4gY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IodmFsdWUsIHBhc3NTdHlsZU9mUmVjdXIsIGNoZWNrKTtcbiAgICB9XG4gICAgY2FzZSAnZXJyb3JzJzoge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBwYXNzU3R5bGVPZlJlY3VyKHZhbHVlKSAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAhIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgY29weUFycmF5OiAke3ZhbHVlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZS5ldmVyeShlcnIgPT5cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoZXJyLCBwYXNzU3R5bGVPZlJlY3VyLCBjaGVjayksXG4gICAgICApO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAhIWNoZWNrICYmXG4gICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yIGhhcyBleHRyYSB1bnBhc3NlZCBwcm9wZXJ0eSAke3EocHJvcE5hbWUpfWBcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcbmhhcmRlbihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7KHZhbDogYW55KSA9PiBQYXNzU3R5bGV9IHBhc3NTdHlsZU9mUmVjdXJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciA9IChcbiAgY2FuZGlkYXRlLFxuICBwYXNzU3R5bGVPZlJlY3VyLFxuICBjaGVjayA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAoIWNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSwgY2hlY2spKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbiAgY29uc3QgeyBuYW1lIH0gPSBwcm90bztcbiAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpO1xuICBpZiAoZXJyQ29uc3RydWN0b3IgPT09IHVuZGVmaW5lZCB8fCBlcnJDb25zdHJ1Y3Rvci5wcm90b3R5cGUgIT09IHByb3RvKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKFxuICAgICAgICBjaGVjayxcbiAgICAgIClgUGFzc2FibGUgRXJyb3IgbXVzdCBpbmhlcml0IGZyb20gYW4gZXJyb3IgY2xhc3MgLnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YFxuICAgICk7XG4gIH1cbiAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG4gIGlmICghKCdtZXNzYWdlJyBpbiBkZXNjcykpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goXG4gICAgICAgIGNoZWNrLFxuICAgICAgKWBQYXNzYWJsZSBFcnJvciBtdXN0IGhhdmUgYW4gb3duIFwibWVzc2FnZVwiIHN0cmluZyBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZW50cmllcyhkZXNjcykuZXZlcnkoKFtwcm9wTmFtZSwgZGVzY10pID0+XG4gICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoXG4gICAgICBwcm9wTmFtZSxcbiAgICAgIGRlc2MsXG4gICAgICBwYXNzU3R5bGVPZlJlY3VyLFxuICAgICAgY2hlY2ssXG4gICAgKSxcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKTtcbmhhcmRlbihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IEVycm9ySGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAnZXJyb3InLFxuXG4gIGNhbkJlVmFsaWQ6IGNoZWNrRXJyb3JMaWtlLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT5cbiAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIsIGFzc2VydENoZWNrZXIpLFxufSk7JGjNj19vbmNlLkVycm9ySGVscGVyKEVycm9ySGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEVycm9yQ29uc3RydWN0b3IiOlsiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLCJpc0Vycm9yTGlrZSI6WyJpc0Vycm9yTGlrZSJdLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyI6WyJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyJdLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciI6WyJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciJdLCJFcnJvckhlbHBlciI6WyJFcnJvckhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7Bop6fAkAAHwJAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFrZS1mYXIuanNcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgYW5kXG4gKiBoYXZlIHRoZSBzYW1lIHRlcm1pbmF0aW9uIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWUgb3IgZmFpbHVyZVxuICogcmVhc29uLiBCdXQgdGhlIG5vbi1maW5hbCB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIG5vbi1maW5hbFxuICogdmFsdWVzIGZyb20gYGJhc2VJdGVyYXRvcmAgYXMgdHJhbnNmb3JtZWQgYnkgYGZ1bmNgLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFVcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IFV9IGZ1bmNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxVPn1cbiAqL1xuICAgICAgIGNvbnN0IG1hcEl0ZXJhYmxlID0gKGJhc2VJdGVyYWJsZSwgZnVuYykgPT5cbiAgLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbiAgRmFyKCdtYXBwZWQgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VJdGVyYXRvciA9IGJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICByZXR1cm4gRmFyKCdtYXBwZWQgaXRlcmF0b3InLCB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHZhbHVlOiBiYXNlVmFsdWUsIGRvbmUgfSA9IGJhc2VJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBkb25lID8gYmFzZVZhbHVlIDogZnVuYyhiYXNlVmFsdWUpO1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyB2YWx1ZSwgZG9uZSB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pOyRozY9fb25jZS5tYXBJdGVyYWJsZShtYXBJdGVyYWJsZSk7XG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGEgc3Vic2V0IG9mIHRoZSBub24tZmluYWwgdmFsdWVzIGZyb20gdGhlXG4gKiBgYmFzZUl0ZXJhdG9yYCAtLS0gdGhvc2UgZm9yIHdoaWNoIGBwcmVkKHZhbHVlKWAgd2FzIHRydXRoeS4gVGhlIHJlc3VsdFxuICogaGFzIHRoZSBzYW1lIHRlcm1pbmF0aW9uIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlXG4gKiBvciBmYWlsdXJlIHJlYXNvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gYm9vbGVhbn0gcHJlZFxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG4gICAgICAgY29uc3QgZmlsdGVySXRlcmFibGUgPSAoYmFzZUl0ZXJhYmxlLCBwcmVkKSA9PlxuICAvKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuICBGYXIoJ2ZpbHRlcmVkIGl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBiYXNlSXRlcmF0b3IgPSBiYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgcmV0dXJuIEZhcignZmlsdGVyZWQgaXRlcmF0b3InLCB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBiYXNlSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgaWYgKGRvbmUgfHwgcHJlZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTskaM2PX29uY2UuZmlsdGVySXRlcmFibGUoZmlsdGVySXRlcmFibGUpO1xuaGFyZGVuKGZpbHRlckl0ZXJhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIl0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKEnjMn0JQAA9CUAACcAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZS1mYXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3JlbW90YWJsZS5qcyJdLCJleHBvcnRzIjpbIkZhciIsIkdFVF9NRVRIT0RfTkFNRVMiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0TWV0aG9kTmFtZXMscSxGYWlsLGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxhc3NlcnRJZmFjZSxnZXRJbnRlcmZhY2VPZixSZW1vdGFibGVIZWxwZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLFskaM2PX2EgPT4gKGdldE1ldGhvZE5hbWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcImFzc2VydElmYWNlXCIsWyRozY9fYSA9PiAoYXNzZXJ0SWZhY2UgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRozY9fYSldXSxbXCJSZW1vdGFibGVIZWxwZXJcIixbJGjNj19hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge1JlbW90YWJsZUJyYW5kfSBmcm9tICdAZW5kby9ldmVudHVhbC1zZW5kJyAqL1xuLyoqIEBpbXBvcnQge0ludGVyZmFjZVNwZWMsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBwcm90b3R5cGU6IGZ1bmN0aW9uUHJvdG90eXBlIH0gPSBGdW5jdGlvbjtcbmNvbnN0IHtcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIHNldFByb3RvdHlwZU9mLFxuICBjcmVhdGUsXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbn0gPSBPYmplY3Q7XG5cbi8qKlxuICogTm93IHRoYXQgdGhlIHJlbW90YWJsZVByb3RvIGRvZXMgbm90IHByb3ZpZGUgaXRzIG93biBgdG9TdHJpbmdgIG1ldGhvZCxcbiAqIGVuc3VyZSBpdCBhbHdheXMgaW5oZXJpdHMgZnJvbSBzb21ldGhpbmcuIFRoZSBvcmlnaW5hbCBwcm90b3R5cGUgb2ZcbiAqIGByZW1vdGFibGVgIGlmIHRoZXJlIHdhcyBvbmUsIG9yIGBPYmplY3QucHJvdG90eXBlYCBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlbW90YWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuY29uc3QgbWFrZVJlbW90YWJsZVByb3RvID0gKHJlbW90YWJsZSwgaWZhY2UpID0+IHtcbiAgbGV0IG9sZFByb3RvID0gZ2V0UHJvdG90eXBlT2YocmVtb3RhYmxlKTtcbiAgaWYgKHR5cGVvZiByZW1vdGFibGUgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKG9sZFByb3RvID09PSBudWxsKSB7XG4gICAgICBvbGRQcm90byA9IG9iamVjdFByb3RvdHlwZTtcbiAgICB9XG4gICAgb2xkUHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgICAgRmFpbGBGb3Igbm93LCByZW1vdGFibGVzIGNhbm5vdCBpbmhlcml0IGZyb20gYW55dGhpbmcgdW51c3VhbCwgaW4gJHtyZW1vdGFibGV9YDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcmVtb3RhYmxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgb2xkUHJvdG8gIT09IG51bGwgfHxcbiAgICAgIEZhaWxgT3JpZ2luYWwgZnVuY3Rpb24gbXVzdCBub3QgaW5oZXJpdCBmcm9tIG51bGw6ICR7cmVtb3RhYmxlfWA7XG4gICAgb2xkUHJvdG8gPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgICBnZXRQcm90b3R5cGVPZihvbGRQcm90bykgPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgICBGYWlsYEZhciBmdW5jdGlvbnMgbXVzdCBvcmlnaW5hbGx5IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGUsIGluICR7cmVtb3RhYmxlfWA7XG4gIH0gZWxzZSB7XG4gICAgRmFpbGB1bnJlY29nbml6ZWQgdHlwZW9mICR7cmVtb3RhYmxlfWA7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbihcbiAgICBjcmVhdGUob2xkUHJvdG8sIHtcbiAgICAgIFtQQVNTX1NUWUxFXTogeyB2YWx1ZTogJ3JlbW90YWJsZScgfSxcbiAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7IHZhbHVlOiBpZmFjZSB9LFxuICAgIH0pLFxuICApO1xufTtcblxuY29uc3QgYXNzZXJ0Q2FuQmVSZW1vdGFibGUgPSBjYW5kaWRhdGUgPT5cbiAgUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIGEgUmVtb3RhYmxlLiAgQWZ0ZXIgdGhpcywgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKVxuICogcmV0dXJucyBpZmFjZS5cbiAqXG4gKiAvLyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzgwNFxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0ZW1wbGF0ZSB7SW50ZXJmYWNlU3BlY30gSVxuICogQHBhcmFtIHtJfSBbaWZhY2VdIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3JcbiAqIHRoZSByZW1vdGFibGUuIEZvciBub3csIGEgc3RyaW5nIGlmYWNlIG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoXG4gKiBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIiwgdG8gc2VydmUgYXMgdGhlIGFsbGVnZWQgbmFtZS4gTW9yZVxuICogZ2VuZXJhbCBpZmFjZXMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIFRoaXMgaXMgdGVtcG9yYXJ5LiBXZSBpbmNsdWRlIHRoZVxuICogXCJBbGxlZ2VkXCIgb3IgXCJEZWJ1Z05hbWVcIiBhcyBhIHJlbWluZGVyIHRoYXQgd2UgZG8gbm90IHlldCBoYXZlIFN3aW5nU2V0XG4gKiBvciBDb21tcyBWYXRcbiAqIHN1cHBvcnQgZm9yIGVuc3VyaW5nIHRoaXMgaXMgYWNjb3JkaW5nIHRvIHRoZSB2YXQgaG9zdGluZyB0aGUgb2JqZWN0LlxuICogQ3VycmVudGx5LCBBbGljZSBjYW4gdGVsbCBCb2IgYWJvdXQgQ2Fyb2wsIHdoZXJlIFZhdEEgKG9uIEFsaWNlJ3MgYmVoYWxmKVxuICogbWlzcmVwcmVzZW50cyBDYXJvbCdzIGBpZmFjZWAuIFZhdEIgYW5kIHRoZXJlZm9yZSBCb2Igd2lsbCB0aGVuIHNlZVxuICogQ2Fyb2wncyBgaWZhY2VgIGFzIG1pc3JlcHJlc2VudGVkIGJ5IFZhdEEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gW3Byb3BzXSBDdXJyZW50bHkgbWF5IG9ubHkgYmUgdW5kZWZpbmVkLlxuICogVGhhdCBwbGFuIGlzIHRoYXQgb3duLXByb3BlcnRpZXMgYXJlIGNvcGllZCB0byB0aGUgcmVtb3RhYmxlXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGVdIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZU9iamVjdDxJPiAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn19IHJlbW90YWJsZSwgbW9kaWZpZWQgZm9yIGRlYnVnZ2FiaWxpdHlcbiAqL1xuICAgICAgIGNvbnN0IFJlbW90YWJsZSA9IChcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBJIGNvdWxkIGhhdmUgZGlmZmVyZW50IHN1YnR5cGUgdGhhbiBzdHJpbmcqL1xuICBpZmFjZSA9ICdSZW1vdGFibGUnLFxuICBwcm9wcyA9IHVuZGVmaW5lZCxcbiAgcmVtb3RhYmxlID0gLyoqIEB0eXBlIHtUfSAqLyAoe30pLFxuKSA9PiB7XG4gIGFzc2VydElmYWNlKGlmYWNlKTtcbiAgYXNzZXJ0KGlmYWNlKTtcbiAgLyogVE9ETzogV2hlbiBpZmFjZSBpcyByaWNoZXIgdGhhbiBqdXN0IHN0cmluZywgd2UgbmVlZCB0byBnZXQgdGhlIGFsbGVnZWROYW1lKi9cbiAgLyogaW4gYSBkaWZmZXJlbnQgd2F5LiovXG4gIHByb3BzID09PSB1bmRlZmluZWQgfHwgRmFpbGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbiAgLyogRmFpbCBmYXN0OiBjaGVjayB0aGF0IHRoZSB1bm1vZGlmaWVkIG9iamVjdCBpcyBhYmxlIHRvIGJlY29tZSBhIFJlbW90YWJsZS4qL1xuICBhc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4gIC8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBtYXJrZWQuKi9cbiAgIShQQVNTX1NUWUxFIGluIHJlbW90YWJsZSkgfHxcbiAgICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG4gICAgICByZW1vdGFibGVbUEFTU19TVFlMRV0sXG4gICAgKX1gO1xuICAvKiBgaXNGcm96ZW5gIGFsd2F5cyByZXR1cm5zIHRydWUgd2l0aCBhIGZha2UgYGhhcmRlbmAsIGJ1dCB3ZSB3YW50IHRoYXQgY2FzZSovXG4gIC8qIHRvIHN1Y2NlZWQgYW55d2F5LiBGYWtpbmcgYGhhcmRlbmAgaXMgb25seSBjb3JyZWN0bmVzcyBwcmVzZXJ2aW5nKi9cbiAgLyogaWYgdGhlIGNvZGUgaW4gcXVlc3Rpb24gY29udGFpbnMgbm8gYnVncyB0aGF0IHRoZSByZWFsIGBoYXJkZW5gIHdvdWxkKi9cbiAgLyogaGF2ZSBjYXVnaHQuKi9cbiAgLyogQHRzLWlnbm9yZSBgaXNGYWtlYCBwdXJwb3NlbHkgbm90IGluIHRoZSB0eXBlKi9cbiAgaGFyZGVuLmlzRmFrZSB8fFxuICAgIC8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBmcm96ZW4uKi9cbiAgICAhaXNGcm96ZW4ocmVtb3RhYmxlKSB8fFxuICAgIEZhaWxgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IGZyb3plbmA7XG4gIGNvbnN0IHJlbW90YWJsZVByb3RvID0gbWFrZVJlbW90YWJsZVByb3RvKHJlbW90YWJsZSwgaWZhY2UpO1xuXG4gIC8qIFRha2UgYSBzdGF0aWMgY29weSBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBhcyBkYXRhIHByb3BlcnRpZXMuKi9cbiAgLyogY29uc3QgcHJvcERlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh7IC4uLnByb3BzIH0pOyovXG4gIGNvbnN0IG11dGF0ZUhhcmRlbkFuZENoZWNrID0gdGFyZ2V0ID0+IHtcbiAgICAvKiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcERlc2NzKTsqL1xuICAgIHNldFByb3RvdHlwZU9mKHRhcmdldCwgcmVtb3RhYmxlUHJvdG8pO1xuICAgIGhhcmRlbih0YXJnZXQpO1xuICAgIGFzc2VydENhbkJlUmVtb3RhYmxlKHRhcmdldCk7XG4gIH07XG5cbiAgLyogRmFpbCBmYXN0OiBjaGVjayBhIGZyZXNoIHJlbW90YWJsZSB0byBzZWUgaWYgb3VyIHJ1bGVzIGZpdC4qL1xuICBtdXRhdGVIYXJkZW5BbmRDaGVjayh7fSk7XG5cbiAgLyogQWN0dWFsbHkgZmluaXNoIHRoZSBuZXcgcmVtb3RhYmxlLiovXG4gIG11dGF0ZUhhcmRlbkFuZENoZWNrKHJlbW90YWJsZSk7XG5cbiAgLyogQ09NTUlUVEVEISovXG4gIC8qIFdlJ3JlIGNvbW1pdHRlZCwgc28ga2VlcCB0aGUgaW50ZXJmYWNlIGZvciBmdXR1cmUgcmVmZXJlbmNlLiovXG4gIGFzc2VydChpZmFjZSAhPT0gdW5kZWZpbmVkKTsgLyogVG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5Ki9cbiAgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAocmVtb3RhYmxlKTtcbn07JGjNj19vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGF1dG9tYXRpY2FsbHkgYWRkZWQgZGVmYXVsdCBtZXRhLW1ldGhvZCBmb3Igb2J0YWluaW5nIGFcbiAqIGxpc3Qgb2YgYWxsIG1ldGhvZHMgb2YgYW4gb2JqZWN0IGRlY2xhcmVkIHdpdGggYEZhcmAsIG9yIGFuIG9iamVjdCB0aGF0XG4gKiBpbmhlcml0cyBmcm9tIGFuIG9iamVjdCBkZWNsYXJlZCB3aXRoIGBGYXJgLlxuICpcbiAqIE1vZGVsZWQgb24gYEdFVF9JTlRFUkZBQ0VfR1VBUkRgIGZyb20gYEBlbmRvL2V4b2AuXG4gKlxuICogVE9ETyBOYW1lIHRvIGJlIGJpa2VzaGVkLiBQZXJoYXBzIGV2ZW4gd2hldGhlciBpdCBpcyBhXG4gKiBzdHJpbmcgb3Igc3ltYm9sIHRvIGJlIGJpa2VzaGVkLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE4MDkjZGlzY3Vzc2lvbl9yMTM4ODA1MjQ1NFxuICpcbiAqIEhBWkFSRDogQmV3YXJlIHRoYXQgYW4gZXhvJ3MgaW50ZXJmYWNlIGNhbiBjaGFuZ2UgYWNyb3NzIGFuIHVwZ3JhZGUsXG4gKiBzbyByZW1vdGVzIHRoYXQgY2FjaGUgaXQgY2FuIGJlY29tZSBzdGFsZS5cbiAqL1xuICAgICAgIGNvbnN0IEdFVF9NRVRIT0RfTkFNRVMgPSAnX19nZXRNZXRob2ROYW1lc19fJztcblxuLyoqXG4gKiBOb3RlIHRoYXQgYGdldE1ldGhvZE5hbWVzTWV0aG9kYCBpcyBhIHRoaXNmdWwgbWV0aG9kISBJdCBtdXN0IGJlIHNvIHRoYXRcbiAqIGl0IHdvcmtzIGFzIGV4cGVjdGVkIHdpdGggZmFyLW9iamVjdCBpbmhlcml0YW5jZS5cbiAqXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi8kaM2PX29uY2UuR0VUX01FVEhPRF9OQU1FUyhHRVRfTUVUSE9EX05BTUVTKTtcbmNvbnN0IGdldE1ldGhvZE5hbWVzTWV0aG9kID0gaGFyZGVuKHtcbiAgW0dFVF9NRVRIT0RfTkFNRVNdKCkge1xuICAgIHJldHVybiBnZXRNZXRob2ROYW1lcyh0aGlzKTtcbiAgfSxcbn0pW0dFVF9NRVRIT0RfTkFNRVNdO1xuXG5jb25zdCBnZXRNZXRob2ROYW1lc0Rlc2NyaXB0b3IgPSBoYXJkZW4oe1xuICB2YWx1ZTogZ2V0TWV0aG9kTmFtZXNNZXRob2QsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBjb25maWd1cmFibGU6IGZhbHNlLFxuICB3cml0YWJsZTogZmFsc2UsXG59KTtcblxuLyoqXG4gKiBNYXJrIGFuIG9iamVjdCB0byBiZSBleHBvc2VkIGZvciByZW1vdGUgaW50ZXJhY3Rpb25cbiAqIGFuZCBnaXZlIGl0IGEgc3VnZ2VzdGl2ZSBpbnRlcmZhY2UgbmFtZSBmb3IgZGVidWdnaW5nLlxuICpcbiAqIEFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgaGF2ZSB0byBiZSBtZXRob2RzLCBub3QgZGF0YS5cbiAqXG4gKiBUaGUgb2JqZWN0IG11c3Qgbm90IGJlIGhhcmRlbmVkIGJlZm9yZSBpdCBpcyBtYXJrZWQuXG4gKiBJdCB3aWxsIGJlIGhhcmRlbmVkIGFmdGVyIG1hcmtpbmcuXG4gKlxuICogRm9yIGZhciBvYmplY3RzIChhcyBvcHBvc2VkIHRvIGZhciBmdW5jdGlvbnMpLCBhbHNvIGFkZHNcbiAqIGBfX2dldE1ldGhvZE5hbWVzX19gIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtZXRob2QgbmFtZXMsXG4gKiBpZiB0aGVyZSBpcyBub3QgeWV0IGFueSBtZXRob2QgbmFtZWQgYF9fZ2V0TWV0aG9kTmFtZXNfX2AuXG4gKlxuICogQGV4YW1wbGVcbiAqIEZhcignRW1wbG95ZWUnLCB7IGdldE1hbmFnZXIgfSlcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIFRoaXMgbmFtZSB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIGBBbGxlZ2VkOiBgXG4gKiBmb3Igbm93IHRvIGZvcm0gdGhlIGBSZW1vdGFibGVgIGBpZmFjZWAgYXJndW1lbnQuXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGVdIFRoZSBvYmplY3QgdG8gYmUgbWFya2VkIGFzIHJlbW90YWJsZVxuICovXG4gICAgICAgY29uc3QgRmFyID0gKGZhck5hbWUsIHJlbW90YWJsZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCByID0gcmVtb3RhYmxlID09PSB1bmRlZmluZWQgPyAvKiogQHR5cGUge1R9ICovICh7fSkgOiByZW1vdGFibGU7XG4gIGlmICh0eXBlb2YgciA9PT0gJ29iamVjdCcgJiYgIShHRVRfTUVUSE9EX05BTUVTIGluIHIpKSB7XG4gICAgLyogVGhpcyB0ZXN0IGV4Y2x1ZGVzIGZhciBmdW5jdGlvbnMsIHNpbmNlIHdlIGN1cnJlbnRseSBjb25zaWRlciB0aGVtKi9cbiAgICAvKiB0byBvbmx5IGhhdmUgYSBjYWxsLWJlaGF2aW9yLCB3aXRoIG5vIGNhbGxhYmxlIG1ldGhvZHMuKi9cbiAgICAvKiBCZXdhcmU6IE11dGF0ZXMgdGhlIGlucHV0IGFyZ3VtZW50ISBCdXQgYFJlbW90YWJsZWAqL1xuICAgIC8qICogcmVxdWlyZXMgdGhlIG9iamVjdCB0byBiZSBtdXRhYmxlKi9cbiAgICAvKiAqIGRvZXMgZnVydGhlciBtdXRhdGlvbnMsKi9cbiAgICAvKiAqIGhhcmRlbnMgdGhlIG11dGF0ZWQgb2JqZWN0IGJlZm9yZSByZXR1cm5pbmcgaXQuKi9cbiAgICAvKiBzbyB0aGlzIG11dGF0aW9uIGlzIG5vdCB1bnByZWNlZGVudGVkLiBCdXQgaXQgaXMgc3VycHJpc2luZyEqL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBHRVRfTUVUSE9EX05BTUVTLCBnZXRNZXRob2ROYW1lc0Rlc2NyaXB0b3IpO1xuICB9XG4gIHJldHVybiBSZW1vdGFibGUoYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLCB1bmRlZmluZWQsIHIpO1xufTskaM2PX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLyoqXG4gKiBDb2VyY2UgYGZ1bmNgIHRvIGEgZmFyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIGl0cyBjYWxsIGJlaGF2aW9yLlxuICogSWYgaXQgaXMgYWxyZWFkeSBhIGZhciBmdW5jdGlvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UgbWFrZSBhbmQgcmV0dXJuIGFcbiAqIG5ldyBmYXIgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGZvcndhcmRzIGNhbGxzIHRvIGl0LiBUaGlzXG4gKiB3b3JrcyBldmVuIGlmIGBmdW5jYCBpcyBhbHJlYWR5IGZyb3plbi4gYFRvRmFyRnVuY3Rpb25gIGlzIHRvIGJlIHVzZWRcbiAqIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20gZWxzZXdoZXJlIHVuZGVyIGxlc3MgY29udHJvbC4gRm9yIGZ1bmN0aW9uc1xuICogeW91IGF1dGhvciBpbiBwbGFjZSwgYmV0dGVyIHRvIHVzZSBgRmFyYCBvbiB0aGVpciBmdW5jdGlvbiBsaXRlcmFsIGRpcmVjdGx5LlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEZcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIHRvIGJlIHVzZWQgb25seSBpZiBgZnVuY2AgaXMgbm90IGFscmVhZHkgYVxuICogZmFyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGfSBmdW5jXG4gKiBAcmV0dXJucyB7RiAmIFJlbW90YWJsZU9iamVjdCAmIFJlbW90YWJsZUJyYW5kPHt9LCBGPn1cbiAqL1xuICAgICAgIGNvbnN0IFRvRmFyRnVuY3Rpb24gPSAoZmFyTmFtZSwgZnVuYykgPT4ge1xuICBpZiAoZ2V0SW50ZXJmYWNlT2YoZnVuYykgIT09IHVuZGVmaW5lZCkge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY2hlY2tlZCBjYXN0Ki9cbiAgICByZXR1cm4gZnVuYztcbiAgfVxuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGRpZmZlcmVudCBzdWJ0eXBlKi9cbiAgcmV0dXJuIEZhcihmYXJOYW1lLCAoLi4uYXJncykgPT4gZnVuYyguLi5hcmdzKSk7XG59OyRozY9fb25jZS5Ub0ZhckZ1bmN0aW9uKFRvRmFyRnVuY3Rpb24pO1xuaGFyZGVuKFRvRmFyRnVuY3Rpb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSJdLCJHRVRfTUVUSE9EX05BTUVTIjpbIkdFVF9NRVRIT0RfTkFNRVMiXSwiRmFyIjpbIkZhciJdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnFJgaYMFAACDBQAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlVGFnZ2VkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZVRhZ2dlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsUEFTU19TVFlMRSxhc3NlcnRQYXNzYWJsZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGUsQ29weVRhZ2dlZH0gZnJvbSAnLi90eXBlcy5qcydcbiAqL1xuXG5jb25zdCB7IGNyZWF0ZSwgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gVFxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gUFxuICogQHBhcmFtIHtUfSB0YWdcbiAqIEBwYXJhbSB7UH0gcGF5bG9hZFxuICogQHJldHVybnMge0NvcHlUYWdnZWQ8VCxQPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VUYWdnZWQgPSAodGFnLCBwYXlsb2FkKSA9PiB7XG4gIHR5cGVvZiB0YWcgPT09ICdzdHJpbmcnIHx8XG4gICAgRmFpbGBUaGUgdGFnIG9mIGEgdGFnZ2VkIHJlY29yZCBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ31gO1xuICBhc3NlcnRQYXNzYWJsZShoYXJkZW4ocGF5bG9hZCkpO1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGNyZWF0ZShvYmplY3RQcm90b3R5cGUsIHtcbiAgICAgIFtQQVNTX1NUWUxFXTogeyB2YWx1ZTogJ3RhZ2dlZCcgfSxcbiAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7IHZhbHVlOiB0YWcgfSxcbiAgICAgIHBheWxvYWQ6IHsgdmFsdWU6IHBheWxvYWQsIGVudW1lcmFibGU6IHRydWUgfSxcbiAgICB9KSxcbiAgKTtcbn07JGjNj19vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfCXq/eohAADqIQAAMAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJDWCIsIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCIsImNoZWNrUGFzc1N0eWxlIiwiY2hlY2tUYWdSZWNvcmQiLCJnZXRPd25EYXRhRGVzY3JpcHRvciIsImdldFRhZyIsImhhc093blByb3BlcnR5T2YiLCJpc09iamVjdCIsImlzUHJpbWl0aXZlIiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NoZWNrZXIsIFBhc3NTdHlsZSwgSlNQcmltaXRpdmV9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGdldFByb3RvdHlwZU9mLFxuICBoYXNPd24sXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbn0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuY29uc3QgeyB0b1N0cmluZ1RhZzogdG9TdHJpbmdUYWdTeW1ib2wgfSA9IFN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gIHR5cGVkQXJyYXlQcm90b3R5cGUsXG4gIHRvU3RyaW5nVGFnU3ltYm9sLFxuKTtcbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyA9IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcgPT09ICdmdW5jdGlvbicpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgT2JqZWN0Lmhhc093bmAgaW5zdGVhZFxuICovXG4gICAgICAgY29uc3QgaGFzT3duUHJvcGVydHlPZiA9IGhhc093bjtcblxuLyoqXG4gKiBAdHlwZSB7KHZhbDogdW5rbm93bikgPT4gdmFsIGlzIEpTUHJpbWl0aXZlfVxuICovJGjNj19vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG4gICAgICAgY29uc3QgaXNQcmltaXRpdmUgPSB2YWwgPT5cbiAgLyogU2FmZXIgd291bGQgYmUgYE9iamVjdCh2YWwpICE9PSB2YWxgIGJ1dCBpcyB0b28gZXhwZW5zaXZlIG9uIFhTLiovXG4gIC8qIFNvIGluc3RlYWQgd2UgdXNlIHRoaXMgYWRob2Mgc2V0IG9mIHR5cGUgdGVzdHMuIEJ1dCB0aGlzIGlzIG5vdCBzYWZlIGluKi9cbiAgLyogdGhlIGZhY2Ugb2YgcG9zc2libGUgZXZvbHV0aW9uIG9mIHRoZSBsYW5ndWFnZS4gQmV3YXJlISovXG4gICF2YWwgfHwgKHR5cGVvZiB2YWwgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwgIT09ICdmdW5jdGlvbicpOyRozY9fb25jZS5pc1ByaW1pdGl2ZShpc1ByaW1pdGl2ZSk7XG5oYXJkZW4oaXNQcmltaXRpdmUpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBgIWlzUHJpbWl0aXZlYCBpbnN0ZWFkXG4gKiBAdHlwZSB7KHZhbDogdW5rbm93bikgPT4gdmFsIGlzIChGdW5jdGlvbiB8IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KX1cbiAqL1xuICAgICAgIGNvbnN0IGlzT2JqZWN0ID0gdmFsID0+XG4gIC8qIFNhZmVyIHdvdWxkIGJlIGBPYmplY3QodmFsKSAtPT0gdmFsYCBidXQgaXMgdG9vIGV4cGVuc2l2ZSBvbiBYUy4qL1xuICAvKiBTbyBpbnN0ZWFkIHdlIHVzZSB0aGlzIGFkaG9jIHNldCBvZiB0eXBlIHRlc3RzLiBCdXQgdGhpcyBpcyBub3Qgc2FmZSBpbiovXG4gIC8qIHRoZSBmYWNlIG9mIHBvc3NpYmxlIGV2b2x1dGlvbiBvZiB0aGUgbGFuZ3VhZ2UuIEJld2FyZSEqL1xuICAhIXZhbCAmJiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJyk7JGjNj19vbmNlLmlzT2JqZWN0KGlzT2JqZWN0KTtcbmhhcmRlbihpc09iamVjdCk7XG5cbi8qKlxuICogRHVwbGljYXRlcyBwYWNrYWdlcy9zZXMvc3JjL21ha2UtaGFyZGVuZXIuanMgdG8gYXZvaWQgYSBkZXBlbmRlbmN5LlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqZWN0XG4gKi9cbiAgICAgICBjb25zdCBpc1R5cGVkQXJyYXkgPSBvYmplY3QgPT4ge1xuICAvKiBUaGUgb2JqZWN0IG11c3QgcGFzcyBhIGJyYW5kIGNoZWNrIG9yIHRvU3RyaW5nVGFnIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC4qL1xuICBjb25zdCB0YWcgPSBhcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsIG9iamVjdCwgW10pO1xuICByZXR1cm4gdGFnICE9PSB1bmRlZmluZWQ7XG59OyRozY9fb25jZS5pc1R5cGVkQXJyYXkoaXNUeXBlZEFycmF5KTtcbmhhcmRlbihpc1R5cGVkQXJyYXkpO1xuXG4vKipcbiAqIFdlIGNhc3Qgb3VyIGBTeW1ib2wuZm9yKClgIHRvIGEgc3RyaW5nIGNvbnN0YW50IGhlcmUgdG8gYXZvaWQgZXhwb3NpbmcgdGhlXG4gKiBgdW5pcXVlIHN5bWJvbGAgdHlwZSBwdWJsaWNseS4gIFRoZSBjYXN0IGRvZXNuJ3QgY2hhbmdlIGFueSBydW50aW1lXG4gKiBiZWhhdmlvci4uLiBpdCdzIHN0aWxsIGFjdHVhbGx5IGEgc3ltYm9sLlxuICpcbiAqIFdpdGhvdXQgdGhpcyB3b3JrYXJvdW5kLCB3ZSd2ZSBvYnNlcnZlZCBlcnJvcnMgd2hlbiB1c2luZ1xuICogYHR5cGVzY3JpcHRANS45LjNgJ3MgYHRzY2AgdG8gZ2VuZXJhdGUgZGVjbGFyYXRpb24gZmlsZXMgKC5kLnRzKSBmb3JcbiAqIGNvbnN1bWVycyBvZiBtb2R1bGVzIHRoYXQgaW1wb3J0IGBQQVNTX1NUWUxFYDpcbiAqIEBleGFtcGxlXG4gKiAgIGVycm9yIFRTOTAwNjogRGVjbGFyYXRpb24gZW1pdCBmb3IgdGhpcyBmaWxlIHJlcXVpcmVzIHVzaW5nIHByaXZhdGUgbmFtZVxuICogICAnUEFTU19TVFlMRScgZnJvbSBtb2R1bGUgJy4uLi9AZW5kby9wYXNzLXN0eWxlL3NyYy90eXBlc1wiJy4gQW4gZXhwbGljaXRcbiAqICAgdHlwZSBhbm5vdGF0aW9uIG1heSB1bmJsb2NrIGRlY2xhcmF0aW9uIGVtaXQuXG4gKi9cbiAgICAgICBjb25zdCBQQVNTX1NUWUxFID0gLyoqIEB0eXBlIHsnU3ltYm9sKHBhc3NTdHlsZSknfSAqLyAoXG4gIC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKFN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpKVxuKTtcblxuLyoqXG4gKiBCZWxvdyB3ZSBoYXZlIGEgc2VyaWVzIG9mIHByZWRpY2F0ZSBmdW5jdGlvbnMgYW5kIHRoZWlyIChjdXJyaWVkKSBhc3NlcnRpb25cbiAqIGZ1bmN0aW9ucy4gVGhlIHNlbWFudGljcyBvZiB0aGUgYXNzZXJ0aW9uIGZ1bmN0aW9uIGlzIGp1c3QgdG8gYXNzZXJ0IHRoYXRcbiAqIHRoZSBjb3JyZXNwb25kaW5nIHByZWRpY2F0ZSBmdW5jdGlvbiB3b3VsZCBoYXZlIHJldHVybmVkIHRydWUuIEJ1dCBpdFxuICogcmVwcm9kdWNlcyB0aGUgaW50ZXJuYWwgdGVzdHMgc28gZmFpbHVyZXMgY2FuIGdpdmUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqLyRozY9fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuICAgICAgIGNvbnN0IGFzc2VydENoZWNrZXIgPSAoY29uZCwgZGV0YWlscykgPT4ge1xuICBhc3NlcnQoY29uZCwgZGV0YWlscyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgZnVuY3Rpb24gdG8gZmFpbCB0aGUgcHJvdmlkZWQgQ2hlY2tlciB3aXRoIGRldGFpbHMuXG4gKiBUaGUgbmFtZSBtdXN0IGJlIHNob3J0IGZvciBlcmdvbm9taWMgaW5saW5lIHVzZSBhcyBpbjpcbiAqIGBgYFxuICogcmV0dXJuIGNoZWNrQ29uZGl0aW9uKC4uLikgfHwgKCEhY2hlY2sgJiYgQ1goY2hlY2spYC4uLmApO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG4gICAgICAgY29uc3QgQ1ggPSBjaGVjayA9PiB7XG4gIGNvbnN0IHJlamVjdCA9IChULCAuLi5zdWJzKSA9PiBjaGVjayhmYWxzZSwgWChULCAuLi5zdWJzKSk7XG4gIHJldHVybiByZWplY3Q7XG59OyRozY9fb25jZS5DWChDWCk7XG5oYXJkZW4oQ1gpO1xuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBwcmVzZW5jZSBhbmQgZW51bWVyYWJpbGl0eSBvZiBhbiBvd24gZGF0YSBwcm9wZXJ0eVxuICogYW5kIHJldHVybnMgaXRzIGRlc2NyaXB0b3IuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfHN5bWJvbH0gcHJvcE5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkQmVFbnVtZXJhYmxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlc2NyaXB0b3J9XG4gKi9cbiAgICAgICBjb25zdCBnZXRPd25EYXRhRGVzY3JpcHRvciA9IChcbiAgY2FuZGlkYXRlLFxuICBwcm9wTmFtZSxcbiAgc2hvdWxkQmVFbnVtZXJhYmxlLFxuICBjaGVjayxcbikgPT4ge1xuICBjb25zdCBkZXNjID0gLyoqIEB0eXBlIHtQcm9wZXJ0eURlc2NyaXB0b3J9ICovIChcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLCBwcm9wTmFtZSlcbiAgKTtcbiAgcmV0dXJuIChkZXNjICE9PSB1bmRlZmluZWQgfHxcbiAgICAoISFjaGVjayAmJiBDWChjaGVjaylgJHtxKHByb3BOYW1lKX0gcHJvcGVydHkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgIChoYXNPd24oZGVzYywgJ3ZhbHVlJykgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoc2hvdWxkQmVFbnVtZXJhYmxlXG4gICAgICA/IGRlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApXG4gICAgICA6ICFkZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpXG4gICAgPyBkZXNjXG4gICAgOiAvKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHVuZGVmaW5lZCkpO1xufTskaM2PX29uY2UuZ2V0T3duRGF0YURlc2NyaXB0b3IoZ2V0T3duRGF0YURlc2NyaXB0b3IpO1xuaGFyZGVuKGdldE93bkRhdGFEZXNjcmlwdG9yKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IFRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlZDxhbnksIFQ+fSB0YWdSZWNvcmRcbiAqIEByZXR1cm5zIHtUfVxuICovXG4gICAgICAgY29uc3QgZ2V0VGFnID0gdGFnUmVjb3JkID0+IHRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRozY9fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG4gICAgICAgY29uc3QgY2hlY2tQYXNzU3R5bGUgPSAob2JqLCBwYXNzU3R5bGUsIGV4cGVjdGVkUGFzc1N0eWxlLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIHBhc3NTdHlsZSA9PT0gZXhwZWN0ZWRQYXNzU3R5bGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKHBhc3NTdHlsZSl9OiAke29ian1gKVxuICApO1xufTskaM2PX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkID0gY2hlY2tQcm90byA9PiB7XG4gIC8qKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVkPGFueSwgYW55Pn0gdGFnUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gZXhwZWN0ZWRQYXNzU3R5bGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tUYWdSZWNvcmQgPSAodGFnUmVjb3JkLCBleHBlY3RlZFBhc3NTdHlsZSwgY2hlY2spID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgKCFpc1ByaW1pdGl2ZSh0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgICAgKGlzRnJvemVuKHRhZ1JlY29yZCkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYEEgdGFnUmVjb3JkIG11c3QgYmUgZnJvemVuOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgICghaXNBcnJheSh0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBBbiBhcnJheSBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgICAgY2hlY2tQYXNzU3R5bGUoXG4gICAgICAgIHRhZ1JlY29yZCxcbiAgICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IodGFnUmVjb3JkLCBQQVNTX1NUWUxFLCBmYWxzZSwgY2hlY2spLnZhbHVlLFxuICAgICAgICBleHBlY3RlZFBhc3NTdHlsZSxcbiAgICAgICAgY2hlY2ssXG4gICAgICApICYmXG4gICAgICAodHlwZW9mIGdldE93bkRhdGFEZXNjcmlwdG9yKHRhZ1JlY29yZCwgU3ltYm9sLnRvU3RyaW5nVGFnLCBmYWxzZSwgY2hlY2spXG4gICAgICAgIC52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgQSBbU3ltYm9sLnRvU3RyaW5nVGFnXS1uYW1lZCBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIGNoZWNrUHJvdG8odGFnUmVjb3JkLCBnZXRQcm90b3R5cGVPZih0YWdSZWNvcmQpLCBjaGVjaylcbiAgICApO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbn07XG5cbiAgICAgICBjb25zdCBjaGVja1RhZ1JlY29yZCA9IG1ha2VDaGVja1RhZ1JlY29yZChcbiAgKHZhbCwgcHJvdG8sIGNoZWNrKSA9PlxuICAgIHByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgY2hlY2soZmFsc2UsIFhgQSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHt2YWx9YCkpLFxuKTskaM2PX29uY2UuY2hlY2tUYWdSZWNvcmQoY2hlY2tUYWdSZWNvcmQpO1xuaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcblxuICAgICAgIGNvbnN0IGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSBtYWtlQ2hlY2tUYWdSZWNvcmQoXG4gICh2YWwsIHByb3RvLCBjaGVjaykgPT5cbiAgICBwcm90byA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAocHJvdG8gIT09IG51bGwgJiYgZ2V0UHJvdG90eXBlT2YocHJvdG8pID09PSBmdW5jdGlvblByb3RvdHlwZSkgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEZvciBmdW5jdGlvbnMsIGEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZTogJHt2YWx9YCxcbiAgICAgICkpLFxuKTskaM2PX29uY2UuY2hlY2tGdW5jdGlvblRhZ1JlY29yZChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbmhhcmRlbihjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiJdLCJpc1ByaW1pdGl2ZSI6WyJpc1ByaW1pdGl2ZSJdLCJpc09iamVjdCI6WyJpc09iamVjdCJdLCJpc1R5cGVkQXJyYXkiOlsiaXNUeXBlZEFycmF5Il0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSJdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiXSwiQ1giOlsiQ1giXSwiZ2V0T3duRGF0YURlc2NyaXB0b3IiOlsiZ2V0T3duRGF0YURlc2NyaXB0b3IiXSwiZ2V0VGFnIjpbImdldFRhZyJdLCJjaGVja1Bhc3NTdHlsZSI6WyJjaGVja1Bhc3NTdHlsZSJdLCJjaGVja1RhZ1JlY29yZCI6WyJjaGVja1RhZ1JlY29yZCJdLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIjpbImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJgKOt2I/AABiPwAAKgAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9wYXNzU3R5bGVPZi5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2NvcHlBcnJheS5qcyIsIi4vYnl0ZUFycmF5LmpzIiwiLi9jb3B5UmVjb3JkLmpzIiwiLi90YWdnZWQuanMiLCIuL2Vycm9yLmpzIiwiLi9yZW1vdGFibGUuanMiLCIuL3N5bWJvbC5qcyIsIi4vc2FmZS1wcm9taXNlLmpzIiwiLi9zdHJpbmcuanMiXSwiZXhwb3J0cyI6WyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCIsImFzc2VydFBhc3NhYmxlIiwiaXNQYXNzYWJsZSIsInBhc3NTdHlsZU9mIiwidG9QYXNzYWJsZUVycm9yIiwidG9UaHJvd2FibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpc1Byb21pc2UsWCxGYWlsLHEsYW5ub3RhdGVFcnJvcixtYWtlRXJyb3IsaXNQcmltaXRpdmUsaXNUeXBlZEFycmF5LFBBU1NfU1RZTEUsYXNzZXJ0Q2hlY2tlcixDb3B5QXJyYXlIZWxwZXIsQnl0ZUFycmF5SGVscGVyLENvcHlSZWNvcmRIZWxwZXIsVGFnZ2VkSGVscGVyLEVycm9ySGVscGVyLGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjLGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yLGdldEVycm9yQ29uc3RydWN0b3IsaXNFcnJvckxpa2UsUmVtb3RhYmxlSGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlLGFzc2VydFBhc3NhYmxlU3RyaW5nOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXSxbXCJpc1R5cGVkQXJyYXlcIixbJGjNj19hID0+IChpc1R5cGVkQXJyYXkgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlBcnJheS5qc1wiLCBbW1wiQ29weUFycmF5SGVscGVyXCIsWyRozY9fYSA9PiAoQ29weUFycmF5SGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9ieXRlQXJyYXkuanNcIiwgW1tcIkJ5dGVBcnJheUhlbHBlclwiLFskaM2PX2EgPT4gKEJ5dGVBcnJheUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsWyRozY9fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIixbJGjNj19hID0+IChFcnJvckhlbHBlciA9ICRozY9fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzY1wiLFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gJGjNj19hKV1dLFtcImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yXCIsWyRozY9fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAkaM2PX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIixbJGjNj19hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIi4vc2FmZS1wcm9taXNlLmpzXCIsIFtbXCJhc3NlcnRTYWZlUHJvbWlzZVwiLFskaM2PX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi9zdHJpbmcuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3RyaW5nXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7Q29weUFycmF5LCBDb3B5UmVjb3JkLCBDb3B5VGFnZ2VkLCBQYXNzYWJsZX0gZnJvbSAnLi90eXBlcy5qcycgKi9cbi8qKiBAaW1wb3J0IHtQYXNzU3R5bGV9IGZyb20gJy4vdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlT2Z9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNGcm96ZW4sIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIHZhbHVlcyB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFBhc3NTdHlsZSwgUGFzc1N0eWxlSGVscGVyPn0gSGVscGVyc1JlY29yZFxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVyc1xuICogQHJldHVybnMge0hlbHBlcnNSZWNvcmR9XG4gKi9cbmNvbnN0IG1ha2VIZWxwZXJUYWJsZSA9IHBhc3NTdHlsZUhlbHBlcnMgPT4ge1xuICBjb25zdCBIZWxwZXJUYWJsZSA9IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgY29weUFycmF5OiB1bmRlZmluZWQsXG4gICAgYnl0ZUFycmF5OiB1bmRlZmluZWQsXG4gICAgY29weVJlY29yZDogdW5kZWZpbmVkLFxuICAgIHRhZ2dlZDogdW5kZWZpbmVkLFxuICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgcmVtb3RhYmxlOiB1bmRlZmluZWQsXG4gIH07XG4gIGZvciAoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpIHtcbiAgICBjb25zdCB7IHN0eWxlTmFtZSB9ID0gaGVscGVyO1xuICAgIHN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZSB8fCBGYWlsYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBGYWlsYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSA9IGhlbHBlcjtcbiAgfVxuICBmb3IgKGNvbnN0IHN0eWxlTmFtZSBvZiBvd25LZXlzKEhlbHBlclRhYmxlKSkge1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgRmFpbGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge0hlbHBlcnNSZWNvcmR9ICovIChcbiAgICAvKiogQHR5cGUge3Vua25vd259ICovIChoYXJkZW4oSGVscGVyVGFibGUpKVxuICApO1xufTtcblxuLyoqXG4gKiBUaGUgYGFzc2VydFJlc3RWYWxpZGAgYXNzdW1lcyB0aGF0IHRoZSBgY2FuQmVWYWxpZGAgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICogQ29udGV4dHMgd2hlcmUgd2UgY2Fubm90IGFzc3VtZSB0aGF0IHNob3VsZCBjYWxsIGBhc3NlcnRWYWxpZGAgaW5zdGVhZCxcbiAqIHdoaWNoIGNoZWNrcyBib3RoIGNvbmRpdGlvbnMgaW4gdGhlIHJpZ2h0IG9yZGVyLlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyfSBoZWxwZXJcbiAqIEBwYXJhbSB7YW55fSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7KHZhbDogYW55KSA9PiBQYXNzU3R5bGV9IHBhc3NTdHlsZU9mUmVjdXJcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBhc3NlcnRWYWxpZCA9IChoZWxwZXIsIGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICBoZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpO1xuICBoZWxwZXIuYXNzZXJ0UmVzdFZhbGlkKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cik7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnMgVGhlIHBhc3NTdHlsZUhlbHBlcnMgdG8gcmVnaXN0ZXIsXG4gKiBpbiBwcmlvcml0eSBvcmRlci5cbiAqIE5PVEUgVGhlc2UgbXVzdCBhbGwgYmUgXCJ0cnVzdGVkXCIsXG4gKiBjb21wbGV0ZSwgYW5kIG5vbi1jb2xsaWRpbmcuIGBtYWtlUGFzc1N0eWxlT2ZgIG1heSAqYXNzdW1lKiB0aGF0IGVhY2ggaGVscGVyXG4gKiBkb2VzIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uIGBtYWtlUGFzc1N0eWxlT2ZgIGlzIG5vdCB0cnlpbmcgdG8gZGVmZW5kXG4gKiBpdHNlbGYgYWdhaW5zdCBtYWxpY2lvdXMgaGVscGVycywgdGhvdWdoIGl0IGRvZXMgZGVmZW5kIGFnYWluc3Qgc29tZVxuICogYWNjaWRlbnRzLlxuICogQHJldHVybnMge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2YgPSBwYXNzU3R5bGVIZWxwZXJzID0+IHtcbiAgY29uc3QgSGVscGVyVGFibGUgPSBtYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG4gIGNvbnN0IHJlbW90YWJsZUhlbHBlciA9IEhlbHBlclRhYmxlLnJlbW90YWJsZTtcblxuICAvKipcbiAqIFB1cmVseSBmb3IgcGVyZm9ybWFuY2UuIEhvd2V2ZXIgaXQgaXMgbXV0YWJsZSBzdGF0aWMgc3RhdGUsIGFuZFxuICogaXQgZG9lcyBoYXZlIHNvbWUgb2JzZXJ2YWJpbGl0eSBvbiBwcm94aWVzLiBUT0RPIG5lZWQgdG8gYXNzZXNzXG4gKiB3aGV0aGVyIHRoaXMgY3JlYXRlcyBhIHN0YXRpYyBjb21tdW5pY2F0aW9ucyBjaGFubmVsLlxuICpcbiAqIHBhc3NTdHlsZU9mIGRvZXMgYSBmdWxsIHJlY3Vyc2l2ZSB3YWxrIG9mIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgaW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB0aGV5IGFyZSBhY3ljbGljLiBJbiBhZGRpdGlvblxuICogaXQgaXMgdXNlZCBieSBvdGhlciBhbGdvcml0aG1zIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2UgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBzbyB3aXRob3V0IHRoaXMgY2FjaGUsIHRoZXNlIGFsZ29yaXRobXMgY291bGQgYmVcbiAqIE8oTioqMikgb3Igd29yc2UuXG4gKlxuICogQHR5cGUge1dlYWtNYXA8V2Vha0tleSwgUGFzc1N0eWxlPn1cbiAqL1xuICBjb25zdCBwYXNzU3R5bGVNZW1vID0gbmV3IFdlYWtNYXAoKTtcblxuICAvKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICBjb25zdCBwYXNzU3R5bGVPZiA9IHBhc3NhYmxlID0+IHtcbiAgICAvKiBFdmVuIHdoZW4gYSBXZWFrU2V0IGlzIGNvcnJlY3QsIHdoZW4gdGhlIHNldCBoYXMgYSBzaG9ydGVyIGxpZmV0aW1lKi9cbiAgICAvKiB0aGFuIGl0cyBrZXlzLCB3ZSBwcmVmZXIgYSBTZXQgZHVlIHRvIGV4cGVjdGVkIGltcGxlbWVudGF0aW9uKi9cbiAgICAvKiB0cmFkZW9mZnMuKi9cbiAgICBjb25zdCBpblByb2dyZXNzID0gbmV3IFNldCgpO1xuXG4gICAgY29uc3QgcGFzc1N0eWxlT2ZSZWN1ciA9IGlubmVyID0+IHtcbiAgICAgIGNvbnN0IGlubmVySXNPYmplY3QgPSAhaXNQcmltaXRpdmUoaW5uZXIpO1xuICAgICAgaWYgKGlubmVySXNPYmplY3QpIHtcbiAgICAgICAgY29uc3QgaW5uZXJTdHlsZSA9IHBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbiAgICAgICAgaWYgKGlubmVyU3R5bGUpIHtcbiAgICAgICAgICByZXR1cm4gaW5uZXJTdHlsZTtcbiAgICAgICAgfVxuICAgICAgICAhaW5Qcm9ncmVzcy5oYXMoaW5uZXIpIHx8XG4gICAgICAgICAgRmFpbGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbiAgICAgICAgaW5Qcm9ncmVzcy5hZGQoaW5uZXIpO1xuICAgICAgfVxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuICAgICAgaWYgKGlubmVySXNPYmplY3QpIHtcbiAgICAgICAgcGFzc1N0eWxlTWVtby5zZXQoaW5uZXIsIHBhc3NTdHlsZSk7XG4gICAgICAgIGluUHJvZ3Jlc3MuZGVsZXRlKGlubmVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXNzU3R5bGU7XG4gICAgfTtcblxuICAgIGNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWwgPSBpbm5lciA9PiB7XG4gICAgICBjb25zdCB0eXBlc3RyID0gdHlwZW9mIGlubmVyO1xuICAgICAgc3dpdGNoICh0eXBlc3RyKSB7XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgcmV0dXJuIHR5cGVzdHI7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICAgIGFzc2VydFBhc3NhYmxlU3RyaW5nKGlubmVyKTtcbiAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sKGlubmVyKTtcbiAgICAgICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICAgIGlmIChpbm5lciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFpc0Zyb3plbihpbm5lcikpIHtcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICAvKiBUeXBlZEFycmF5cyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgaW4gaGFyZGVuKCkqL1xuICAgICAgICAgICAgICAvKiBhbmQgYSBjb3JyZXNwb25kaW5nIHNwZWNpYWwgZXJyb3IgbWVzc2FnZSBoZXJlLiovXG4gICAgICAgICAgICAgIGlzVHlwZWRBcnJheShpbm5lcilcbiAgICAgICAgICAgICAgICA/IFhgQ2Fubm90IHBhc3MgbXV0YWJsZSB0eXBlZCBhcnJheXMgbGlrZSAke2lubmVyfS5gXG4gICAgICAgICAgICAgICAgOiBYYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzUHJvbWlzZShpbm5lcikpIHtcbiAgICAgICAgICAgIGFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbiAgICAgICAgICAgIHJldHVybiAncHJvbWlzZSc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHR5cGVvZiBpbm5lci50aGVuICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICBGYWlsYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG4gICAgICAgICAgY29uc3QgcGFzc1N0eWxlVGFnID0gaW5uZXJbUEFTU19TVFlMRV07XG4gICAgICAgICAgaWYgKHBhc3NTdHlsZVRhZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywgJ3N0cmluZycpO1xuICAgICAgICAgICAgY29uc3QgaGVscGVyID0gSGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbiAgICAgICAgICAgIGhlbHBlciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIEZhaWxgVW5yZWNvZ25pemVkIFBhc3NTdHlsZTogJHtxKHBhc3NTdHlsZVRhZyl9YDtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkKGhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7UGFzc1N0eWxlfSAqLyAocGFzc1N0eWxlVGFnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycykge1xuICAgICAgICAgICAgaWYgKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSkge1xuICAgICAgICAgICAgICBoZWxwZXIuYXNzZXJ0UmVzdFZhbGlkKGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2VydFZhbGlkKHJlbW90YWJsZUhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgIHJldHVybiAncmVtb3RhYmxlJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmdW5jdGlvbic6IHtcbiAgICAgICAgICBpc0Zyb3plbihpbm5lcikgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWA7XG4gICAgICAgICAgdHlwZW9mIGlubmVyLnRoZW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbiAgICAgICAgICBhc3NlcnRWYWxpZChyZW1vdGFibGVIZWxwZXIsIGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICByZXR1cm4gJ3JlbW90YWJsZSc7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFhgVW5yZWNvZ25pemVkIHR5cGVvZiAke3EodHlwZXN0cil9YCwgVHlwZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcGFzc1N0eWxlT2ZSZWN1cihwYXNzYWJsZSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4ocGFzc1N0eWxlT2YpO1xufTtcblxuICAgICAgIGNvbnN0IFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sID0gU3ltYm9sLmZvcignQGVuZG8gcGFzc1N0eWxlT2YnKTtcblxuLyoqXG4gKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wgcHJvcGVydHkgb24gdGhlIGdsb2JhbCxcbiAqIHRoZW4gcHJlc3VtYWJseSBpdCB3YXMgZW5kb3dlZCBmb3IgdXMgYnkgbGl2ZXNsb3RzIHdpdGggYSBgcGFzc1N0eWxlT2ZgXG4gKiBmdW5jdGlvbiwgc28gd2Ugc2hvdWxkIHVzZSBhbmQgZXhwb3J0IHRoYXQgb25lIGluc3RlYWQuXG4gKiBPdGhlciBzb2Z0d2FyZSBtYXkgaGF2ZSBsZWZ0IGl0IGZvciB1cyBoZXJlLFxuICogYnV0IGl0IHdvdWxkIHJlcXVpcmUgd3JpdGUgYWNjZXNzIHRvIG91ciBnbG9iYWwsIG9yIHRoZSBhYmlsaXR5IHRvXG4gKiBwcm92aWRlIGVuZG93bWVudHMgdG8gb3VyIGdsb2JhbCwgYm90aCBvZiB3aGljaCBzZWVtcyBhZGVxdWF0ZSBhcyBhIHRlc3Qgb2ZcbiAqIHdoZXRoZXIgaXQgaXMgYXV0aG9yaXplZCB0byBzZXJ2ZSB0aGUgc2FtZSByb2xlIGFzIGxpdmVzbG90cy5cbiAqXG4gKiBOT1RFIEhBWkFSRDogVGhpcyB1c2UgYnkgbGl2ZXNsb3RzIGRvZXMgcmVseSBvbiBgcGFzc1N0eWxlT2ZgIGJlaW5nXG4gKiBkZXRlcm1pbmlzdGljLiBJZiBpdCBpcyBub3QsIHRoZW4gaW4gYSBsaXZlc2xvdC1saWtlIHZpcnR1YWxpemVkXG4gKiBlbnZpcm9ubWVudCwgaXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IEdDLlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqLyRozY9fb25jZS5QYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbChQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCk7XG4gICAgICAgY29uc3QgcGFzc1N0eWxlT2YgPVxuICAoZ2xvYmFsVGhpcyAmJiBnbG9iYWxUaGlzW1Bhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sXSkgfHxcbiAgbWFrZVBhc3NTdHlsZU9mKFtcbiAgICBDb3B5QXJyYXlIZWxwZXIsXG4gICAgQnl0ZUFycmF5SGVscGVyLFxuICAgIENvcHlSZWNvcmRIZWxwZXIsXG4gICAgVGFnZ2VkSGVscGVyLFxuICAgIEVycm9ySGVscGVyLFxuICAgIFJlbW90YWJsZUhlbHBlcixcbiAgXSk7JGjNj19vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlID0gdmFsID0+IHtcbiAgcGFzc1N0eWxlT2YodmFsKTsgLyogdGhyb3dzIGlmIHZhbCBpcyBub3QgYSBwYXNzYWJsZSovXG59OyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZShhc3NlcnRQYXNzYWJsZSk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGUpO1xuXG4vKipcbiAqIElzIGBzcGVjaW1lbmAgUGFzc2FibGU/IFRoaXMgcmV0dXJucyB0cnVlIGlmZiBgcGFzc1N0eWxlT2Yoc3BlY2ltZW4pYFxuICogcmV0dXJucyBhIHN0cmluZy4gVGhpcyByZXR1cm5zIGBmYWxzZWAgaWZmIGBwYXNzU3R5bGVPZihzcGVjaW1lbilgIHRocm93cy5cbiAqIFVuZGVyIG5vIG5vcm1hbCBjaXJjdW1zdGFuY2Ugc2hvdWxkIGBpc1Bhc3NhYmxlKHNwZWNpbWVuKWAgdGhyb3cuXG4gKlxuICogVE9ETyBEZXByZWNhdGUgYW5kIHVsdGltYXRlbHkgZGVsZXRlIEBhZ29yaWMvYmFzZS16b25lJ3MgYGlzUGFzc2FibGUnIGluXG4gKiBmYXZvciBvZiB0aGlzIG9uZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzIwOTZcbiAqXG4gKiBUT0RPIGltcGxlbWVudCBhbiBpc1Bhc3NhYmxlIHRoYXQgZG9lcyBub3QgcmVseSBvbiB0cnkvY2F0Y2guXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGp1c3QgYSBzdGFuZGluIHVudGlsIHRoZW4uXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8yMDk2XG4gKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7c3BlY2ltZW4gaXMgUGFzc2FibGV9XG4gKi9cbiAgICAgICBjb25zdCBpc1Bhc3NhYmxlID0gc3BlY2ltZW4gPT4ge1xuICB0cnkge1xuICAgIC8qIEluIGZhY3QsIGl0IG5ldmVyIHJldHVybnMgdW5kZWZpbmVkLiBJdCBlaXRoZXIgcmV0dXJucyBhKi9cbiAgICAvKiBzdHJpbmcgb3IgdGhyb3dzLiovXG4gICAgcmV0dXJuIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSAhPT0gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59OyRozY9fb25jZS5pc1Bhc3NhYmxlKGlzUGFzc2FibGUpO1xuaGFyZGVuKGlzUGFzc2FibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1Byb3BlcnR5RGVzY3JpcHRvcn0gZGVzY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9IChuYW1lLCBkZXNjKSA9PlxuICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhuYW1lLCBkZXNjLCBwYXNzU3R5bGVPZik7XG5cbi8qKlxuICogQWZ0ZXIgaGFyZGVuaW5nLCBpZiBgZXJyYCBpcyBhIHBhc3NhYmxlIGVycm9yLCByZXR1cm4gaXQuXG4gKlxuICogT3RoZXJ3aXNlLCByZXR1cm4gYSBuZXcgcGFzc2FibGUgZXJyb3IgdGhhdCBwcm9wYWdhdGVzIHRoZSBkaWFnbm9zdGljXG4gKiBpbmZvIG9mIHRoZSBvcmlnaW5hbCwgYW5kIGlzIGxpbmtlZCB0byB0aGUgb3JpZ2luYWwgYXMgYSBub3RlLlxuICpcbiAqIFRPRE8gQWRvcHQgYSBtb3JlIGZsZXhpYmxlIG5vdGlvbiBvZiBwYXNzYWJsZSBlcnJvciwgaW4gd2hpY2hcbiAqIGEgcGFzc2FibGUgZXJyb3IgY2FuIGNvbnRhaW4gb3RoZXIgb3duIGRhdGEgcHJvcGVydGllcyB3aXRoXG4gKiB0aHJvd2FibGUgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHJldHVybnMge0Vycm9yfVxuICovXG4gICAgICAgY29uc3QgdG9QYXNzYWJsZUVycm9yID0gZXJyID0+IHtcbiAgaGFyZGVuKGVycik7XG4gIGlmIChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIsIHBhc3NTdHlsZU9mKSkge1xuICAgIHJldHVybiBlcnI7XG4gIH1cbiAgY29uc3QgeyBuYW1lLCBtZXNzYWdlIH0gPSBlcnI7XG4gIGNvbnN0IHsgY2F1c2U6IGNhdXNlRGVzYywgZXJyb3JzOiBlcnJvcnNEZXNjIH0gPVxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoZXJyKTtcbiAgbGV0IGNhdXNlO1xuICBsZXQgZXJyb3JzO1xuICBpZiAoY2F1c2VEZXNjICYmIGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnY2F1c2UnLCBjYXVzZURlc2MpKSB7XG4gICAgY2F1c2UgPSBjYXVzZURlc2MudmFsdWU7XG4gIH1cbiAgaWYgKGVycm9yc0Rlc2MgJiYgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKCdlcnJvcnMnLCBlcnJvcnNEZXNjKSkge1xuICAgIGVycm9ycyA9IGVycm9yc0Rlc2MudmFsdWU7XG4gIH1cblxuICBjb25zdCBlcnJDb25zdHJ1Y3RvciA9IGdldEVycm9yQ29uc3RydWN0b3IoYCR7bmFtZX1gKSB8fCBFcnJvcjtcbiAgY29uc3QgbmV3RXJyb3IgPSBtYWtlRXJyb3IoYCR7bWVzc2FnZX1gLCBlcnJDb25zdHJ1Y3Rvciwge1xuICAgIC8qIEB0cy1pZ25vcmUgQXNzdW1pbmcgY2F1c2UgaXMgRXJyb3IgfCB1bmRlZmluZWQqL1xuICAgIGNhdXNlLFxuICAgIGVycm9ycyxcbiAgfSk7XG4gIC8qIFN0aWxsIG5lZWRlZCwgYmVjYXVzZSBgbWFrZUVycm9yYCBvbmx5IGRvZXMgYSBzaGFsbG93IGZyZWV6ZS4qL1xuICBoYXJkZW4obmV3RXJyb3IpO1xuICAvKiBFdmVuIHRoZSBjbGVhbmVkIHVwIGVycm9yIGNvcHksIGlmIHNlbnQgdG8gdGhlIGNvbnNvbGUsIHNob3VsZCovXG4gIC8qIGNhdXNlIGhpZGRlbiBkaWFnbm9zdGljIGluZm9ybWF0aW9uIG9mIHRoZSBvcmlnaW5hbCBlcnJvciovXG4gIC8qIHRvIGJlIGxvZ2dlZC4qL1xuICBhbm5vdGF0ZUVycm9yKG5ld0Vycm9yLCBYYGNvcGllZCBmcm9tIGVycm9yICR7ZXJyfWApO1xuICBwYXNzU3R5bGVPZihuZXdFcnJvcikgPT09ICdlcnJvcicgfHxcbiAgICBGYWlsYEV4cGVjdGVkICR7bmV3RXJyb3J9IHRvIGJlIGEgcGFzc2FibGUgZXJyb3JgO1xuICByZXR1cm4gbmV3RXJyb3I7XG59OyRozY9fb25jZS50b1Bhc3NhYmxlRXJyb3IodG9QYXNzYWJsZUVycm9yKTtcbmhhcmRlbih0b1Bhc3NhYmxlRXJyb3IpO1xuXG4vKipcbiAqIEFmdGVyIGhhcmRlbmluZywgaWYgYHNwZWNpbWVuYCBpcyB0aHJvd2FibGUsIHJldHVybiBpdC5cbiAqIEEgc3BlY2ltZW4gaXMgdGhyb3dhYmxlIGlmZiBpdCBpcyBQYXNzYWJsZSBhbmQgY29udGFpbnMgbm8gUGFzc2FibGVDYXBzLFxuICogaS5lLiwgbm8gUmVtb3RhYmxlcyBvciBQcm9taXNlcy5cbiAqIElPVywgaWYgaXQgY29udGFpbnMgb25seSBjb3B5LWRhdGEgYW5kIHBhc3NhYmxlIGVycm9ycy5cbiAqXG4gKiBPdGhlcndpc2UsIGlmIGBzcGVjaW1lbmAgaXMgKmFsbW9zdCogdGhyb3dhYmxlLCBmb3IgZXhhbXBsZSwgaXQgaXNcbiAqIGFuIGVycm9yIHRoYXQgY2FuIGJlIG1hZGUgdGhyb3dhYmxlIGJ5IGB0b1Bhc3NhYmxlRXJyb3JgLCB0aGVuXG4gKiByZXR1cm4gYHNwZWNpbWVuYCBjb252ZXJ0ZWQgdG8gYSB0aHJvd2FibGUuXG4gKlxuICogT3RoZXJ3aXNlLCB0aHJvdyBhIGRpYWdub3N0aWMgaW5kaWNhdGluZyBhIGZhaWx1cmUgdG8gY29lcmNlLlxuICpcbiAqIFRoaXMgaXMgaW4gc3VwcG9ydCBvZiB0aGUgZXhvIGJvdW5kYXJ5IHRocm93aW5nIG9ubHkgdGhyb3dhYmxlcywgdG8gZWFzZVxuICogc2VjdXJpdHkgcmV2aWV3LlxuICpcbiAqIFRPRE8gQWRvcHQgYSBtb3JlIGZsZXhpdGJsZSBub3Rpb24gb2YgdGhyb3dhYmxlLCBpbiB3aGljaFxuICogZGF0YSBjb250YWluZXJzIGNvbnRhaW5pbmcgbm9uLXBhc3NhYmxlIGVycm9ycyBjYW4gdGhlbXNlbHZlcyBiZSBjb2VyY2VkXG4gKiB0byB0aHJvd2FibGUgYnkgY29lcmNpbmcgdG8gYSBzaW1pbGFyIGNvbnRhaW5lcnMgY29udGFpbmluZ1xuICogdGhlIHJlc3VsdHMgb2YgY29lcmNpbmcgdGhvc2UgZXJyb3JzIHRvIHBhc3NhYmxlIGVycm9ycy5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7UGFzc2FibGU8bmV2ZXIsIEVycm9yPn1cbiAqL1xuICAgICAgIGNvbnN0IHRvVGhyb3dhYmxlID0gc3BlY2ltZW4gPT4ge1xuICBoYXJkZW4oc3BlY2ltZW4pO1xuICBpZiAoaXNFcnJvckxpa2Uoc3BlY2ltZW4pKSB7XG4gICAgcmV0dXJuIHRvUGFzc2FibGVFcnJvcigvKiogQHR5cGUge0Vycm9yfSAqLyAoc3BlY2ltZW4pKTtcbiAgfVxuICBpZiAoIWlzUHJpbWl0aXZlKHNwZWNpbWVuKSkge1xuICAgIC8qIE5vdGUgdGhhdCB0aGlzIHN0ZXAgd2lsbCBmYWlsIGlmIGBzcGVjaW1lbmAgd291bGQgYmUgYSBwYXNzYWJsZSBjb250YWluZXIqL1xuICAgIC8qIGV4Y2VwdCB0aGF0IGl0IGNvbnRhaW5zIG5vbi1wYXNzYWJsZSBlcnJvcnMgdGhhdCBjb3VsZCBiZSBjb252ZXJ0ZWQuKi9cbiAgICAvKiBUaGlzIHdpbGwgbmVlZCB0byBiZSBmaXhlZCB0byBkbyB0aGUgVE9ETyBhYm92ZS4qL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IC8qKiBAdHlwZSB7UGFzc1N0eWxlfSAqLyAocGFzc1N0eWxlT2Yoc3BlY2ltZW4pKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IC8qKiBAdHlwZSB7Q29weUFycmF5fSAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICBlbGVtZW50ID09PSB0b1Rocm93YWJsZShlbGVtZW50KSB8fFxuICAgICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtlbGVtZW50fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICBjb25zdCByZWMgPSAvKiogQHR5cGUge0NvcHlSZWNvcmR9ICovIChzcGVjaW1lbik7XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlcyhyZWMpKSB7XG4gICAgICAgICAgdmFsID09PSB0b1Rocm93YWJsZSh2YWwpIHx8XG4gICAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke3ZhbH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICBjb25zdCB0ZyA9IC8qKiBAdHlwZSB7Q29weVRhZ2dlZH0gKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgY29uc3QgeyBwYXlsb2FkIH0gPSB0ZztcbiAgICAgICAgcGF5bG9hZCA9PT0gdG9UaHJvd2FibGUocGF5bG9hZCkgfHxcbiAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke3BheWxvYWR9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgY29uc3QgZXIgPSAvKiogQHR5cGUge0Vycm9yfSAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBlciA9PT0gdG9UaHJvd2FibGUoZXIpIHx8XG4gICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtlcn1gO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBBICR7cShwYXNzU3R5bGUpfSBpcyBub3QgdGhyb3dhYmxlOiAke3NwZWNpbWVufWA7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAvKiogQHR5cGUge1Bhc3NhYmxlPG5ldmVyLG5ldmVyPn0gKi8gKHNwZWNpbWVuKTtcbn07JGjNj19vbmNlLnRvVGhyb3dhYmxlKHRvVGhyb3dhYmxlKTtcbmhhcmRlbih0b1Rocm93YWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCI6WyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCJdLCJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiJdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSJdLCJpc1Bhc3NhYmxlIjpbImlzUGFzc2FibGUiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdLCJ0b1Rocm93YWJsZSI6WyJ0b1Rocm93YWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD7nJ+yMC4AADAuAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3JlbW90YWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiY2FuQmVNZXRob2QiLCJnZXRJbnRlcmZhY2VPZiIsImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLGdldE1ldGhvZE5hbWVzLGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxjaGVja1RhZ1JlY29yZCxjaGVja0Z1bmN0aW9uVGFnUmVjb3JkLGlzUHJpbWl0aXZlLGdldFRhZyxDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLFskaM2PX2EgPT4gKGdldE1ldGhvZE5hbWVzID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja1RhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkXCIsWyRozY9fYSA9PiAoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDaGVja2VyLCBSZW1vdGFibGVNZXRob2ROYW1lfSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7SW50ZXJmYWNlU3BlYywgUGFzc1N0eWxlZH0gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge1Bhc3NTdHlsZUhlbHBlcn0gZnJvbSAnLi9pbnRlcm5hbC10eXBlcy5qcydcbiAqIEBpbXBvcnQge1JlbW90YWJsZU9iamVjdH0gZnJvbSAnLi90eXBlcy5qcydcbiAqL1xuXG4vKipcbiAqIEZvciBhIGZ1bmN0aW9uIHRvIGJlIGEgdmFsaWQgbWV0aG9kLCBpdCBtdXN0IG5vdCBiZSBwYXNzYWJsZS5cbiAqIE90aGVyd2lzZSwgd2UgcmlzayBjb25mdXNpbmcgcGFzcy1ieS1jb3B5IGRhdGEgY2FycnlpbmdcbiAqIGZhciBmdW5jdGlvbnMgd2l0aCBhdHRlbXB0cyBhdCBmYXIgb2JqZWN0cyB3aXRoIG1ldGhvZHMuXG4gKlxuICogVE9ETyBIQVpBUkQgQmVjYXVzZSB3ZSBjaGVjayB0aGlzIG9uIHRoZSB3YXkgdG8gaGFyZGVuaW5nIGEgcmVtb3RhYmxlLFxuICogd2UgY2Fubm90IHlldCBjaGVjayB0aGF0IGBmdW5jYCBpcyBoYXJkZW5lZC4gSG93ZXZlciwgd2l0aG91dFxuICogZG9pbmcgc28sIGl0J3MgaW5oZXJpdGFuY2UgbWlnaHQgY2hhbmdlIGFmdGVyIHRoZSBgUEFTU19TVFlMRWBcbiAqIGNoZWNrIGJlbG93LlxuICpcbiAqIEBwYXJhbSB7YW55fSBmdW5jXG4gKiBAcmV0dXJucyB7ZnVuYyBpcyBDYWxsYWJsZUZ1bmN0aW9ufVxuICovXG4gICAgICAgY29uc3QgY2FuQmVNZXRob2QgPSBmdW5jID0+XG4gIHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nICYmICEoUEFTU19TVFlMRSBpbiBmdW5jKTskaM2PX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLyogVE9ETyBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzI4ODQqL1xuLyogQWJzdHJhY3Qgb3V0IGNhbkJlTWV0aG9kTmFtZSBzbyBsYXRlciBQUnMgYWdyZWUgb24gbWV0aG9kIG5hbWUgcmVzdHJpY3Rpb25zLiovXG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGtleVxuICogQHJldHVybnMge2tleSBpcyBSZW1vdGFibGVNZXRob2ROYW1lfVxuICovXG5jb25zdCBjYW5CZU1ldGhvZE5hbWUgPSBrZXkgPT5cbiAgLyogdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGtleSA9PT0gJ3N5bWJvbCc7Ki9cbiAgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGtleSA9PT0gJ3N5bWJvbCcgfHwgdHlwZW9mIGtleSA9PT0gJ251bWJlcic7XG5oYXJkZW4oY2FuQmVNZXRob2ROYW1lKTtcblxuLyoqXG4gKiBVc2VzIHRoZSBgZ2V0TWV0aG9kTmFtZXNgIGZyb20gdGhlIGV2ZW50dWFsLXNlbmQgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gdGhhdFxuICogZG9lcyBub3Qga25vdyBhbnl0aGluZyBhYm91dCByZW1vdGFibGVzLlxuICpcbiAqIEN1cnJlbnRseSwganVzdCBhbGlhcyBgZ2V0TWV0aG9kTmFtZXNgIGJ1dCB0aGlzIGFic3RyYWN0aW9uIGV4aXN0cyBzb1xuICogYSBmdXR1cmUgUFIgY2FuIGVuZm9yY2UgcmVzdHJpY3Rpb25zIG9uIG1ldGhvZCBuYW1lcyBvZiByZW1vdGFibGVzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgQ2FsbGFibGVGdW5jdGlvbj59IFRcbiAqIEBwYXJhbSB7VH0gYmVoYXZpb3JNZXRob2RzXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlTWV0aG9kTmFtZVtdfVxuICovXG4gICAgICAgY29uc3QgZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMgPSBiZWhhdmlvck1ldGhvZHMgPT5cbiAgZ2V0TWV0aG9kTmFtZXMoYmVoYXZpb3JNZXRob2RzKTskaM2PX29uY2UuZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMoZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMpO1xuaGFyZGVuKGdldFJlbW90YWJsZU1ldGhvZE5hbWVzKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHtcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgaGFzT3duLFxufSA9IE9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tJZmFjZSA9IChpZmFjZSwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICAvKiBUT0RPIG90aGVyIHBvc3NpYmxlIGlmYWNlcywgb25jZSB3ZSBoYXZlIHRoaXJkIHBhcnR5IHZlcmFjaXR5Ki9cbiAgICAodHlwZW9mIGlmYWNlID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkgJiZcbiAgICAoaWZhY2UgPT09ICdSZW1vdGFibGUnIHx8XG4gICAgICBpZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKSB8fFxuICAgICAgaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goY2hlY2spYEZvciBub3csIGlmYWNlICR7cShcbiAgICAgICAgICBpZmFjZSxcbiAgICAgICAgKX0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCI7IHVuaW1wbGVtZW50ZWRgKSlcbiAgKTtcbn07XG5cbi8qKlxuICogQW4gYGlmYWNlYCBtdXN0IGJlIHB1cmUuIFJpZ2h0IG5vdyBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aGljaCBpcyBwdXJlLlxuICogTGF0ZXIgd2UgZXhwZWN0IHRvIGluY2x1ZGUgc29tZSBvdGhlciB2YWx1ZXMgdGhhdCBxdWFsaWZ5IGFzIGBQdXJlRGF0YWAsXG4gKiB3aGljaCBpcyBhIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBlbmRpbmcgb25seSBpbiBwcmltaXRpdmVzIG9yXG4gKiBlbXB0eSBwYXNzLWJ5LWNvcHkgY29tcG9zaXRlcy4gTm8gcmVtb3RhYmxlcywgcHJvbWlzZXMsIG9yIGVycm9ycy5cbiAqIFdlICphc3N1bWUqIGZvciBub3cgdGhhdCB0aGUgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGNvbnRhaW5zIG5vXG4gKiBwcm94aWVzLlxuICpcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydElmYWNlID0gaWZhY2UgPT4gY2hlY2tJZmFjZShpZmFjZSwgYXNzZXJ0Q2hlY2tlcik7JGjNj19vbmNlLmFzc2VydElmYWNlKGFzc2VydElmYWNlKTtcbmhhcmRlbihhc3NlcnRJZmFjZSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3QgfCBGdW5jdGlvbn0gb3JpZ2luYWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlUHJvdG9PZiA9IChvcmlnaW5hbCwgY2hlY2spID0+IHtcbiAgIWlzUHJpbWl0aXZlKG9yaWdpbmFsKSB8fFxuICAgIEZhaWxgUmVtb3RhYmxlcyBtdXN0IGJlIG9iamVjdHMgb3IgZnVuY3Rpb25zOiAke29yaWdpbmFsfWA7XG5cbiAgLyogQSB2YWxpZCByZW1vdGFibGUgb2JqZWN0IG11c3QgaW5oZXJpdCBmcm9tIGEgXCJ0YWcgcmVjb3JkXCIgLS0gYSovXG4gIC8qIHBsYWluLW9iamVjdCBwcm90b3R5cGUgY29uc2lzdGluZyBvZiBvbmx5Ki9cbiAgLyogYSBgUEFTU19TVFlMRWAgcHJvcGVydHkgd2l0aCB2YWx1ZSBcInJlbW90YWJsZVwiIGFuZCBhIHN1aXRhYmxlIGBTeW1ib2wudG9TdHJpbmdUYWdgKi9cbiAgLyogcHJvcGVydHkuIFRoZSByZW1vdGFibGUgY291bGQgaW5oZXJpdCBkaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLCBvciovXG4gIC8qIGl0IGNvdWxkIGluaGVyaXQgZnJvbSBhbm90aGVyIHZhbGlkIHJlbW90YWJsZSwgdGhhdCB0aGVyZWZvcmUgaXRzZWxmKi9cbiAgLyogaW5oZXJpdHMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLiovXG4gIC8qKi9cbiAgLyogVE9ETzogSXQgd291bGQgYmUgbmljZSB0byB0eXBlZGVmIHRoaXMgc2hhcGUsIGJ1dCB3ZSBjYW4ndCBkZWNsYXJlIGEgdHlwZSovXG4gIC8qIHdpdGggUEFTU19TVFlMRSBmcm9tIEpTRG9jLiovXG4gIC8qKi9cbiAgLyogQHR5cGUge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcsKi9cbiAgLyogW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZywqL1xuICAvKiB9fSovXG4gIC8qKi9cbiAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG4gIGlmIChcbiAgICBwcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgcHJvdG8gPT09IG51bGwgfHxcbiAgICBwcm90byA9PT0gRnVuY3Rpb24ucHJvdG90eXBlXG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUmVtb3RhYmxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQ6ICR7cShvcmlnaW5hbCl9YFxuICAgICk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9yaWdpbmFsID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IHByb3RvUHJvdG8gPSBnZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgaWYgKHByb3RvUHJvdG8gIT09IG9iamVjdFByb3RvdHlwZSAmJiBwcm90b1Byb3RvICE9PSBudWxsKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgcmV0dXJuIGNoZWNrUmVtb3RhYmxlKHByb3RvLCBjaGVjayk7XG4gICAgfVxuICAgIGlmICghY2hlY2tUYWdSZWNvcmQocHJvdG8sICdyZW1vdGFibGUnLCBjaGVjaykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9yaWdpbmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCAncmVtb3RhYmxlJywgY2hlY2spKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbiAgY29uc3QgcGFzc1N0eWxlS2V5ID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoUEFTU19TVFlMRSk7XG4gIGNvbnN0IHRhZ0tleSA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKFN5bWJvbC50b1N0cmluZ1RhZyk7XG4gIGNvbnN0IHtcbiAgICAvKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG4gICAgWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFzc1N0eWxlS2V5KV06IF9wYXNzU3R5bGVEZXNjLFxuICAgIFsvKiogQHR5cGUge3N0cmluZ30gKi8gKHRhZ0tleSldOiB7IHZhbHVlOiBpZmFjZSB9LFxuICAgIC4uLnJlc3REZXNjc1xuICB9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbiAgcmV0dXJuIChcbiAgICAob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkgJiZcbiAgICBjaGVja0lmYWNlKGlmYWNlLCBjaGVjaylcbiAgKTtcbn07XG5cbi8qKlxuICogS2VlcCBhIHdlYWsgc2V0IG9mIGNvbmZpcm1lZCByZW1vdGFibGVzIGZvciBtYXJzaGFsIHBlcmZvcm1hbmNlXG4gKiAod2l0aG91dCB3aGljaCB3ZSB3b3VsZCBpbmN1ciBhIHJlZHVuZGFudCB2ZXJpZmljYXRpb24gaW5cbiAqIGdldEludGVyZmFjZU9mKS5cbiAqIFdlIGRvbid0IHJlbWVtYmVyIHJlamVjdGlvbnMgYmVjYXVzZSB0aGV5IGFyZSBwb3NzaWJsZSB0byBjb3JyZWN0XG4gKiB3aXRoIGUuZy4gYGhhcmRlbmAuXG4gKlxuICogQHR5cGUge1dlYWtTZXQ8UmVtb3RhYmxlT2JqZWN0Pn1cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7dmFsIGlzIFJlbW90YWJsZU9iamVjdH1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGUgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghaXNGcm96ZW4odmFsKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWBcbiAgICApO1xuICB9XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gIGlmICghUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLCBjaGVjaykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBTaW1wbGUgc2VtYW50aWNzLCBqdXN0IHRlbGwgd2hhdCBpbnRlcmZhY2Ugc3BlYyBhIFJlbW90YWJsZSBoYXMsXG4gKiBvciB1bmRlZmluZWQgaWYgbm90IGRlZW1lZCB0byBiZSBhIFJlbW90YWJsZS5cbiAqXG4gKiBAdHlwZSB7e1xuICogPFQgZXh0ZW5kcyBzdHJpbmc+KHZhbDogUGFzc1N0eWxlZDxhbnksIFQ+KTogVDtcbiAqICh2YWw6IGFueSk6IEludGVyZmFjZVNwZWMgfCB1bmRlZmluZWQ7XG4gKiB9fVxuICovXG4gICAgICAgY29uc3QgZ2V0SW50ZXJmYWNlT2YgPSB2YWwgPT4ge1xuICBpZiAoXG4gICAgaXNQcmltaXRpdmUodmFsKSB8fFxuICAgIHZhbFtQQVNTX1NUWUxFXSAhPT0gJ3JlbW90YWJsZScgfHxcbiAgICAhY2hlY2tSZW1vdGFibGUodmFsKVxuICApIHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICByZXR1cm4gZ2V0VGFnKHZhbCk7XG59OyRozY9fb25jZS5nZXRJbnRlcmZhY2VPZihnZXRJbnRlcmZhY2VPZik7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlT2YpO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAncmVtb3RhYmxlJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IHZhbGlkVHlwZSA9XG4gICAgICAoIWlzUHJpbWl0aXZlKGNhbmRpZGF0ZSkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAoIWlzQXJyYXkoY2FuZGlkYXRlKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIGFycmF5cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuICAgIGlmICghdmFsaWRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG4gICAgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvKiBFdmVyeSBvd24gcHJvcGVydHkgKHJlZ2FyZGxlc3Mgb2YgZW51bWVyYWJpbGl0eSkqL1xuICAgICAgLyogbXVzdCBoYXZlIGEgZnVuY3Rpb24gdmFsdWUuKi9cbiAgICAgIHJldHVybiBvd25LZXlzKGRlc2NzKS5ldmVyeShrZXkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8qIFR5cGVjYXN0IG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbiAgICAgICAgICAoaGFzT3duKGRlc2NzWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoa2V5KV0sICd2YWx1ZScpIHx8XG4gICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuICAgICAgICAgICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICAgICAgICApfSBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgICAoKGtleSA9PT0gU3ltYm9sLnRvU3RyaW5nVGFnICYmIGNoZWNrSWZhY2UoY2FuZGlkYXRlW2tleV0sIGNoZWNrKSkgfHxcbiAgICAgICAgICAgICgoY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pIHx8XG4gICAgICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIG5vbi1tZXRob2RzIGxpa2UgJHtxKFxuICAgICAgICAgICAgICAgICAgU3RyaW5nKGtleSksXG4gICAgICAgICAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgICAgIChrZXkgIT09IFBBU1NfU1RZTEUgfHxcbiAgICAgICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICAgICAgQ1goY2hlY2spYEEgcGFzcy1ieS1yZW1vdGUgY2Fubm90IHNoYWRvdyAke3EoUEFTU19TVFlMRSl9YCkpKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLyogRmFyIGZ1bmN0aW9ucyBjYW5ub3QgYmUgbWV0aG9kcywgYW5kIGNhbm5vdCBoYXZlIG1ldGhvZHMuKi9cbiAgICAgIC8qIFRoZXkgbXVzdCBoYXZlIGV4YWN0bHkgZXhwZWN0ZWQgYC5uYW1lYCBhbmQgYC5sZW5ndGhgIHByb3BlcnRpZXMqL1xuICAgICAgY29uc3Qge1xuICAgICAgICBuYW1lOiBuYW1lRGVzYyxcbiAgICAgICAgbGVuZ3RoOiBsZW5ndGhEZXNjLFxuICAgICAgICAvKiBAdHMtaWdub3JlIFRTIGRvZXNuJ3QgbGlrZSBzeW1ib2xzIGFzIGNvbXB1dGVkIGluZGV4ZXM/PyovXG4gICAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiB0b1N0cmluZ1RhZ0Rlc2MsXG4gICAgICAgIC4uLnJlc3REZXNjc1xuICAgICAgfSA9IGRlc2NzO1xuICAgICAgY29uc3QgcmVzdEtleXMgPSBvd25LZXlzKHJlc3REZXNjcyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoKG5hbWVEZXNjICYmIHR5cGVvZiBuYW1lRGVzYy52YWx1ZSA9PT0gJ3N0cmluZycpIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKGNoZWNrKWBGYXIgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgKChsZW5ndGhEZXNjICYmIHR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlID09PSAnbnVtYmVyJykgfHxcbiAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgKWBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAodG9TdHJpbmdUYWdEZXNjID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoKHR5cGVvZiB0b1N0cmluZ1RhZ0Rlc2MudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgICAgKWBGYXIgZnVuY3Rpb24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgICAgIGNoZWNrSWZhY2UodG9TdHJpbmdUYWdEZXNjLnZhbHVlLCBjaGVjaykpKSAmJlxuICAgICAgICAocmVzdEtleXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9ucyB1bmV4cGVjdGVkIHByb3BlcnRpZXMgYmVzaWRlcyAubmFtZSBhbmQgLmxlbmd0aCAke3Jlc3RLZXlzfWApKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuICEhY2hlY2sgJiYgQ1goY2hlY2spYHVucmVjb2duaXplZCB0eXBlb2YgJHtjYW5kaWRhdGV9YDtcbiAgfSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IGNhbmRpZGF0ZSA9PiBjaGVja1JlbW90YWJsZShjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpLFxuXG4gIGV2ZXJ5OiAoX3Bhc3NhYmxlLCBfZm4pID0+IHRydWUsXG59KTskaM2PX29uY2UuUmVtb3RhYmxlSGVscGVyKFJlbW90YWJsZUhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYW5CZU1ldGhvZCI6WyJjYW5CZU1ldGhvZCJdLCJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyI6WyJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyJdLCJhc3NlcnRJZmFjZSI6WyJhc3NlcnRJZmFjZSJdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiJdLCJSZW1vdGFibGVIZWxwZXIiOlsiUmVtb3RhYmxlSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIeADyhSFgAAUhYAACsAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc2FmZS1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbImFzc2VydFNhZmVQcm9taXNlIiwiaXNTYWZlUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGlzUHJvbWlzZSxxLGFzc2VydENoZWNrZXIsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtDaGVja2VyfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IGlzRnJvemVuLCBnZXRQcm90b3R5cGVPZiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLCBoYXNPd24gfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgdG9TdHJpbmdUYWcgfSA9IFN5bWJvbDtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2V9IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzID0gKHByLCBjaGVjaykgPT4ge1xuICBjb25zdCBrZXlzID0gb3duS2V5cyhwcik7XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAqIFRoaXMgZXhjbHVkZXMgdGhvc2Ugc3ltYm9sLW5hbWVkIG93biBwcm9wZXJ0aWVzIHRoYXQgYXJlIGFsc28gZm91bmQgb25cbiAqIGBQcm9taXNlLnByb3RvdHlwZWAsIHNvIHRoYXQgb3ZlcnJpZGVzIG9mIHRoZXNlIHByb3BlcnRpZXMgY2FuIGJlXG4gKiBleHBsaWNpdGx5IHRvbGVyYXRlZCBpZiB0aGV5IHBhc3MgdGhlIGBjaGVja1NhZmVPd25LZXlgIGNoZWNrIGJlbG93LlxuICogSW4gcGFydGljdWxhciwgd2Ugd2lzaCB0byB0b2xlcmF0ZVxuICogICAqIEFuIG92ZXJyaWRpbmcgYHRvU3RyaW5nVGFnYCBub24tZW51bWVyYWJsZSBkYXRhIHByb3BlcnR5XG4gKiAgICAgd2l0aCBhIHN0cmluZyB2YWx1ZS5cbiAqICAgKiBUaG9zZSBvd24gcHJvcGVydGllcyB0aGF0IG1pZ2h0IGJlIGFkZGVkIGJ5IE5vZGUncyBhc3luY19ob29rcy5cbiAqL1xuICBjb25zdCB1bmtub3duS2V5cyA9IGtleXMuZmlsdGVyKFxuICAgIGtleSA9PiB0eXBlb2Yga2V5ICE9PSAnc3ltYm9sJyB8fCAhaGFzT3duKFByb21pc2UucHJvdG90eXBlLCBrZXkpLFxuICApO1xuXG4gIGlmICh1bmtub3duS2V5cy5sZW5ndGggIT09IDApIHtcbiAgICByZXR1cm4gQ1goXG4gICAgICBjaGVjayxcbiAgICApYCR7cHJ9IC0gTXVzdCBub3QgaGF2ZSBhbnkgb3duIHByb3BlcnRpZXM6ICR7cSh1bmtub3duS2V5cyl9YDtcbiAgfVxuXG4gIC8qKlxuICogRXhwbGljaXRseSB0b2xlcmF0ZSBhIGB0b1N0cmluZ1RhZ2Agc3ltYm9sLW5hbWVkIG5vbi1lbnVtZXJhYmxlXG4gKiBkYXRhIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIGEgc3RyaW5nLiBPdGhlcndpc2UsIHRvbGVyYXRlIHRob3NlXG4gKiBzeW1ib2wtbmFtZWQgcHJvcGVydGllcyB0aGF0IG1pZ2h0IGJlIGFkZGVkIGJ5IE5vZGVKUydzIGFzeW5jX2hvb2tzLFxuICogaWYgdGhleSBvYmV5IHRoZSBleHBlY3RlZCBzYWZldHkgcHJvcGVydGllcy5cbiAqXG4gKiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIE5vZGUncyBhc3luY19ob29rcyBjb250YWlucyB0aGVcbiAqIGZvbGxvd2luZyBjb2RlLCB3aGljaCB3ZSBjYW4gc2FmZWx5IHRvbGVyYXRlXG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIGRlc3Ryb3lUcmFja2luZyhwcm9taXNlLCBwYXJlbnQpIHtcbiAqICAgdHJhY2tQcm9taXNlKHByb21pc2UsIHBhcmVudCk7XG4gKiAgIGNvbnN0IGFzeW5jSWQgPSBwcm9taXNlW2FzeW5jX2lkX3N5bWJvbF07XG4gKiAgIGNvbnN0IGRlc3Ryb3llZCA9IHsgZGVzdHJveWVkOiBmYWxzZSB9O1xuICogICBwcm9taXNlW2Rlc3Ryb3llZFN5bWJvbF0gPSBkZXN0cm95ZWQ7XG4gKiAgIHJlZ2lzdGVyRGVzdHJveUhvb2socHJvbWlzZSwgYXN5bmNJZCwgZGVzdHJveWVkKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0ga2V5XG4gKi9cbiAgY29uc3QgY2hlY2tTYWZlT3duS2V5ID0ga2V5ID0+IHtcbiAgICBpZiAoa2V5ID09PSB0b1N0cmluZ1RhZykge1xuICAgICAgLyogVE9ETyBzaG91bGQgd2UgYWxzbyBlbmZvcmNlIGFueXRoaW5nIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nLCovXG4gICAgICAvKiBzdWNoIGFzIHRoYXQgaXQgbXVzdCBzdGFydCB3aXRoIGAnUHJvbWlzZSdgPyovXG4gICAgICBjb25zdCB0YWdEZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByLCB0b1N0cmluZ1RhZyk7XG4gICAgICBhc3NlcnQodGFnRGVzYyAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChoYXNPd24odGFnRGVzYywgJ3ZhbHVlJykgfHxcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIGRhdGEgcHJvcGVydHksIG5vdCBhbiBhY2Nlc3NvcjogJHtxKHRhZ0Rlc2MpfWApICYmXG4gICAgICAgICh0eXBlb2YgdGFnRGVzYy52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgT3duIEBAdG9TdHJpbmdUYWcgdmFsdWUgbXVzdCBiZSBhIHN0cmluZzogJHtxKHRhZ0Rlc2MudmFsdWUpfWApICYmXG4gICAgICAgICghdGFnRGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICAgQ1goY2hlY2spYE93biBAQHRvU3RyaW5nVGFnIG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7cSh0YWdEZXNjKX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsID0gcHJba2V5XTtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJlxuICAgICAgdmFsICE9PSBudWxsICYmXG4gICAgICBpc0Zyb3plbih2YWwpICYmXG4gICAgICBnZXRQcm90b3R5cGVPZih2YWwpID09PSBPYmplY3QucHJvdG90eXBlXG4gICAgKSB7XG4gICAgICBjb25zdCBzdWJLZXlzID0gb3duS2V5cyh2YWwpO1xuICAgICAgaWYgKHN1YktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHN1YktleXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIHN1YktleXNbMF0gPT09ICdkZXN0cm95ZWQnICYmXG4gICAgICAgIHZhbC5kZXN0cm95ZWQgPT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBDWChcbiAgICAgIGNoZWNrLFxuICAgIClgVW5leHBlY3RlZCBOb2RlIGFzeW5jX2hvb2tzIGFkZGl0aW9ucyB0byBwcm9taXNlOiAke3ByfS4ke3EoXG4gICAgICBTdHJpbmcoa2V5KSxcbiAgICApfSBpcyAke3ZhbH1gO1xuICB9O1xuXG4gIHJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZU93bktleSk7XG59O1xuXG4vKipcbiAqIFVuZGVyIEhhcmRlbmVkIEpTIGEgcHJvbWlzZSBpcyBcInNhZmVcIiBpZiBpdHMgYHRoZW5gIG1ldGhvZCBjYW4gYmUgY2FsbGVkXG4gKiBzeW5jaHJvbm91c2x5IHdpdGhvdXQgZ2l2aW5nIHRoZSBwcm9taXNlIGFuIG9wcG9ydHVuaXR5IGZvciBhXG4gKiByZWVudHJhbmN5IGF0dGFjayBkdXJpbmcgdGhhdCBjYWxsLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOVxuICogcmFpc2VzIHRoZSBpc3N1ZSBvZiB0ZXN0aW5nIHRoYXQgYSBzcGVjaW1lbiBpcyBhIHNhZmUgcHJvbWlzZVxuICogc3VjaCB0aGF0IHRoZSB0ZXN0IGFsc28gZG9lcyBub3QgZ2l2ZSB0aGUgc3BlY2ltZW4gYVxuICogcmVlbnRyYW5jeSBvcHBvcnR1bml0eS4gVGhhdCBpcyB3ZWxsIGJleW9uZCB0aGUgYW1iaXRpb24gaGVyZS5cbiAqIFRPRE8gVGhvdWdoIGlmIHdlIGZpZ3VyZSBvdXQgYSBuaWNlIHNvbHV0aW9uLCBpdCBtaWdodCBiZSBnb29kIHRvXG4gKiB1c2UgaXQgaGVyZSBhcyB3ZWxsLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrU2FmZVByb21pc2UgPSAocHIsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgKGlzRnJvemVuKHByKSB8fCBDWChjaGVjaylgJHtwcn0gLSBNdXN0IGJlIGZyb3plbmApICYmXG4gICAgKGlzUHJvbWlzZShwcikgfHwgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBiZSBhIHByb21pc2VgKSAmJlxuICAgIChnZXRQcm90b3R5cGVPZihwcikgPT09IFByb21pc2UucHJvdG90eXBlIHx8XG4gICAgICBDWChjaGVjaylgJHtwcn0gLSBNdXN0IGluaGVyaXQgZnJvbSBQcm9taXNlLnByb3RvdHlwZTogJHtxKFxuICAgICAgICBnZXRQcm90b3R5cGVPZihwciksXG4gICAgICApfWApICYmXG4gICAgY2hlY2tQcm9taXNlT3duS2V5cygvKiogQHR5cGUge1Byb21pc2V9ICovIChwciksIGNoZWNrKVxuICApO1xufTtcbmhhcmRlbihjaGVja1NhZmVQcm9taXNlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuICAgICAgIGNvbnN0IGlzU2FmZVByb21pc2UgPSBwciA9PiBjaGVja1NhZmVQcm9taXNlKHByLCB4ID0+IHgpOyRozY9fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0U2FmZVByb21pc2UgPSBwciA9PiBjaGVja1NhZmVQcm9taXNlKHByLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0U2FmZVByb21pc2UoYXNzZXJ0U2FmZVByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPyo2QfbDwAA2w8AACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc3RyaW5nLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb24sRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoga25vdyBhYm91dGBpc1dlbGxGb3JtZWRgKi9cbmNvbnN0IGhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2QgPSAhIVN0cmluZy5wcm90b3R5cGUuaXNXZWxsRm9ybWVkO1xuXG4vKipcbiAqIElzIHRoZSBhcmd1bWVudCBhIHdlbGwtZm9ybWVkIHN0cmluZz9cbiAqXG4gKiBVbmZvcnR1bmF0ZWx5LCB0aGVcbiAqIFtzdGFuZGFyZCBidWlsdC1pbiBgU3RyaW5nLnByb3RvdHlwZS5pc1dlbGxGb3JtZWRgXShodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pcy11c3Ytc3RyaW5nKVxuICogZG9lcyBhIFRvU3RyaW5nIG9uIGl0cyBpbnB1dCwgY2F1c2luZyBpdCB0byBqdWRnZSBub24tc3RyaW5ncyB0byBiZVxuICogd2VsbC1mb3JtZWQgc3RyaW5ncyBpZiB0aGV5IGNvZXJjZSB0byBhIHdlbGwtZm9ybWVkIHN0cmluZ3MuIFRoaXNcbiAqIHJlY2FwaXR1bGF0ZXMgdGhlIG1pc3Rha2UgaW4gaGF2aW5nIHRoZSBnbG9iYWwgYGlzTmFOYCBjb2VyY2UgaXRzIGlucHV0cyxcbiAqIGNhdXNpbmcgaXQgdG8ganVkZ2Ugbm9uLXN0cmluZyB0byBiZSBOYU4gaWYgdGhleSBjb2VyY2UgdG8gTmFOLlxuICpcbiAqIFRoaXMgYGlzV2VsbEZvcm1lZFN0cmluZ2AgZnVuY3Rpb24gb25seSBqdWRnZXMgd2VsbC1mb3JtZWQgc3RyaW5ncyB0byBiZVxuICogd2VsbC1mb3JtZWQgc3RyaW5ncy4gRm9yIGFsbCBub24tc3RyaW5ncyBpdCByZXR1cm5zIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3RyXG4gKiBAcmV0dXJucyB7c3RyIGlzIHN0cmluZ31cbiAqL1xuICAgICAgIGNvbnN0IGlzV2VsbEZvcm1lZFN0cmluZyA9IGhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2RcbiAgPyBzdHIgPT4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyLmlzV2VsbEZvcm1lZCgpXG4gIDogc3RyID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNoIG9mIHN0cikge1xuICAgICAgICAvKiBUaGUgc3RyaW5nIGl0ZXJhdG9yIGl0ZXJhdGVzIGJ5IFVuaWNvZGUgY29kZSBwb2ludCwgbm90Ki9cbiAgICAgICAgLyogVVRGMTYgY29kZSB1bml0LiBCdXQgaWYgaXQgZW5jb3VudGVycyBhbiB1bnBhaXJlZCBzdXJyb2dhdGUsKi9cbiAgICAgICAgLyogaXQgd2lsbCBwcm9kdWNlIGl0LiovXG4gICAgICAgIGNvbnN0IGNwID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChjaC5jb2RlUG9pbnRBdCgwKSk7XG4gICAgICAgIGlmIChjcCA+PSAweGQ4MDAgJiYgY3AgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgLyogQWxsIHN1cnJvZ2F0ZXMgYXJlIGluIHRoaXMgcmFuZ2UuIFRoZSBzdHJpbmcgaXRlcmF0b3Igb25seSovXG4gICAgICAgICAgLyogcHJvZHVjZXMgYSBjaGFyYWN0ZXIgaW4gdGhpcyByYW5nZSBmb3IgdW5wYWlyZWQgc3Vycm9nYXRlcywqL1xuICAgICAgICAgIC8qIHdoaWNoIG9ubHkgaGFwcGVucyBpZiB0aGUgc3RyaW5nIGlzIG5vdCB3ZWxsLWZvcm1lZC4qL1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTskaM2PX29uY2UuaXNXZWxsRm9ybWVkU3RyaW5nKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oaXNXZWxsRm9ybWVkU3RyaW5nKTtcblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGx5IHdoZW4gYGlzV2VsbEZvcm1lZFN0cmluZyhzdHIpYCB3b3VsZCByZXR1cm4gdHJ1ZS5cbiAqIFRocm93cyBhIGRpYWdub3N0aWMgZXJyb3Igd2hlbiBgaXNXZWxsRm9ybWVkU3RyaW5nKHN0cilgIHdvdWxkIHJldHVybiBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHN0clxuICogQHJldHVybnMge2Fzc2VydHMgc3RyIGlzIHN0cmluZ31cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFdlbGxGb3JtZWRTdHJpbmcgPSBzdHIgPT4ge1xuICBpc1dlbGxGb3JtZWRTdHJpbmcoc3RyKSB8fCBGYWlsYEV4cGVjdGVkIHdlbGwtZm9ybWVkIHVuaWNvZGUgc3RyaW5nOiAke3N0cn1gO1xufTskaM2PX29uY2UuYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyhhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKTtcbmhhcmRlbihhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKTtcblxuY29uc3QgT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFID1cbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24oJ09OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRScsICdkaXNhYmxlZCcsIFtcbiAgICAnZW5hYmxlZCcsXG4gIF0pID09PSAnZW5hYmxlZCc7XG5cbi8qKlxuICogRm9yIG5vdyxcbiAqIGlmIGBPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEVgIGVudmlyb25tZW50IG9wdGlvbiBpcyBgJ2VuYWJsZWQnYCxcbiAqIHRoZW4gYGFzc2VydFBhc3NhYmxlU3RyaW5nYCBpcyB0aGUgc2FtZSBhcyBgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZ2AuXG4gKiBPdGhlcndpc2UgYGFzc2VydFBhc3NhYmxlU3RyaW5nYCBqdXN0IGFzc2VydHMgdGhhdCBgc3RyYCBpcyBhIHN0cmluZy5cbiAqXG4gKiBDdXJyZW50bHksIGBPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEVgIGRlZmF1bHRzIHRvIGAnZGlzYWJsZWQnYFxuICogYmVjYXVzZSB3ZSBkbyBub3QgeWV0IGtub3cgdGhlIHBlcmZvcm1hbmNlIGltcGFjdC4gTGF0ZXIsIGlmIHdlIGRlY2lkZSB3ZVxuICogY2FuIGFmZm9yZCBpdCwgd2UnbGwgZmlyc3QgY2hhbmdlIHRoZSBkZWZhdWx0IHRvIGAnZW5hYmxlZCdgIGFuZCB1bHRpbWF0ZWx5XG4gKiByZW1vdmUgdGhlIHN3aXRjaCBhbHRvZ2V0aGVyLiBCZSBwcmVwYXJlZCBmb3IgdGhlc2UgY2hhbmdlcy5cbiAqXG4gKiBUT0RPIG9uY2UgdGhlIHN3aXRjaCBpcyByZW1vdmVkLCBzaW1wbGlmeSBgYXNzZXJ0UGFzc2FibGVTdHJpbmdgIHRvXG4gKiBzaW1wbHkgYmUgYGFzc2VydFdlbGxGb3JtZWRTdHJpbmdgLlxuICpcbiAqIEBwYXJhbSB7IHVua25vd24gfSBzdHJcbiAqIEByZXR1cm5zIHthc3NlcnRzIHN0ciBpcyBzdHJpbmcgfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSBzdHIgPT4ge1xuICB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyB8fCBGYWlsYEV4cGVjdGVkIHN0cmluZyAke3N0cn1gO1xuICAhT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFIHx8IGFzc2VydFdlbGxGb3JtZWRTdHJpbmcoc3RyKTtcbn07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3RyaW5nKGFzc2VydFBhc3NhYmxlU3RyaW5nKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1dlbGxGb3JtZWRTdHJpbmciOlsiaXNXZWxsRm9ybWVkU3RyaW5nIl0sImFzc2VydFdlbGxGb3JtZWRTdHJpbmciOlsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRQYXNzYWJsZVN0cmluZyI6WyJhc3NlcnRQYXNzYWJsZVN0cmluZyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAC9zQiwxQAAMMUAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3N5bWJvbC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJ1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qKlxuICogVGhlIHdlbGwga25vd24gc3ltYm9scyBhcmUgc3RhdGljIHN5bWJvbCB2YWx1ZXMgb24gdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yLlxuICovXG5jb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcyA9IG5ldyBNYXAoXG4gIG93bktleXMoU3ltYm9sKVxuICAgIC5maWx0ZXIoXG4gICAgICBuYW1lID0+IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgU3ltYm9sW25hbWVdID09PSAnc3ltYm9sJyxcbiAgICApXG4gICAgLmZpbHRlcihuYW1lID0+IHtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiAgICAgICFuYW1lLnN0YXJ0c1dpdGgoJ0BAJykgfHxcbiAgICAgICAgRmFpbGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgKX1gO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSlcbiAgICAvKiBAdHMtaWdub3JlIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovXG4gICAgLm1hcChuYW1lID0+IFtTeW1ib2xbbmFtZV0sIGBAQCR7bmFtZX1gXSksXG4pO1xuXG4vKipcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IHN5bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBpc1Bhc3NhYmxlU3ltYm9sID0gc3ltID0+XG4gIHR5cGVvZiBzeW0gPT09ICdzeW1ib2wnICYmXG4gICh0eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pID09PSAnc3RyaW5nJyB8fCB3ZWxsS25vd25TeW1ib2xOYW1lcy5oYXMoc3ltKSk7JGjNj19vbmNlLmlzUGFzc2FibGVTeW1ib2woaXNQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oaXNQYXNzYWJsZVN5bWJvbCk7XG5cbiAgICAgICBjb25zdCBhc3NlcnRQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PlxuICBpc1Bhc3NhYmxlU3ltYm9sKHN5bSkgfHxcbiAgRmFpbGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuXG4vKipcbiAqIElmIGBzeW1gIGlzIGEgcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXNcbiAqIHN5bWJvbC4gSWYgYHN5bWAgaXMgYSBub24tcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy4gU2luY2UgdGhlIHJlZ2lzdHJhdGlvbiBzdHJpbmcgb2YgYSByZWdpc3RlcmVkIHN5bWJvbCBjYW4gYmUgYW55XG4gKiBzdHJpbmcsIGlmIHdlIHNpbXBseSB1c2VkIHRoYXQgdG8gaWRlbnRpZnkgdGhvc2Ugc3ltYm9scywgdGhlcmUgd291bGQgbm90XG4gKiBiZSBhbnkgcmVtYWluaW5nIHN0cmluZ3MgbGVmdCBvdmVyIHRvIGlkZW50aWZ5IHRoZSB3ZWxsLWtub3duIHN5bWJvbHMuXG4gKiBJbnN0ZWFkLCB3ZSByZXNlcnZlIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYFwiQEBcImAgZm9yIHB1cnBvc2VzIG9mIHRoaXNcbiAqIGVuY29kaW5nLiBXZSBpZGVudGlmeSBhIHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXMgYFN5bWJvbC5pdGVyYXRvcmBcbiAqIGJ5IHByZWZpeGluZyB0aGUgcHJvcGVydHkgbmFtZSB3aXRoIGBcIkBAXCJgLCBzdWNoIGFzIGBcIkBAaXRlcmF0b3JcImAuXG4gKiBGb3IgcmVnaXN0ZXJlZCBzeW1ib2xzIHdob3NlIG5hbWUgaGFwcGVucyB0byBiZWdpbiB3aXRoIGBcIkBAXCJgLCBzdWNoXG4gKiBhcyBgU3ltYm9sLmZvcignQEBpdGVyYXRvcicpYCBvciBgU3ltYm9sLmZvcignQEBmb28nKWAsIHdlIGlkZW50aWZ5XG4gKiB0aGVtIGJ5IHByZWZpeGluZyB0aGVtIHdpdGggYW4gZXh0cmEgYFwiQEBcImAsIHN1Y2ggYXNcbiAqIGBcIkBAQEBpdGVyYXRvclwiYCBvciBgXCJAQEBAZm9vXCJgLiAoVGhpcyBpcyB0aGUgSGlsYmVydCBIb3RlbCBlbmNvZGluZ1xuICogdGVjaG5pcXVlLilcbiAqXG4gKiBAcGFyYW0ge3N5bWJvbH0gc3ltXG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqL1xuICAgICAgIGNvbnN0IG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBTeW1ib2wua2V5Rm9yKHN5bSk7XG4gIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gIH1cbiAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgIHJldHVybiBgQEAke25hbWV9YDtcbiAgfVxuICByZXR1cm4gbmFtZTtcbn07JGjNj19vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuID0gL15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogSWYgYG5hbWVgIGlzIGEgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5XG4gKiBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCwgcmV0dXJuIHRoZSBzeW1ib2wgYXJndW1lbnQgaXQgd2FzIHByb2R1Y2VkIHRvXG4gKiByZXByZXNlbnQuXG4gKlxuICogICAgSWYgYG5hbWVgIGRvZXMgbm90IGJlZ2luIHdpdGggYFwiQEBcImAsIHRoZW4ganVzdCB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICByZWdpc3RlcmVkIHN5bWJvbCwgYFN5bWJvbC5mb3IobmFtZSlgLlxuICogICAgSWYgYG5hbWVgIGlzIGBcIkBAXCJgIGZvbGxvd2VkIGJ5IGEgd2VsbCBrbm93biBzeW1ib2wncyBwcm9wZXJ0eSBuYW1lIG9uXG4gKiAgICAgIGBTeW1ib2xgIHN1Y2ggYFwiQEBpdGVyYXRvclwiLCByZXR1cm4gdGhhdCB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzXG4gKiAgICAgIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiAgICBJZiBgbmFtZWAgYmVnaW5zIHdpdGggYFwiQEBAQFwiYCBpdCBlbmNvZGVzIHRoZSByZWdpc3RlcmVkIHN5bWJvbCB3aG9zZVxuICogICAgICBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGluc3RlYWQuXG4gKiAgICBPdGhlcndpc2UsIGlmIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaXQgbWF5IGVuY29kZSBhIHJlZ2lzdGVyZWQgc3ltYm9sXG4gKiAgICAgIGZyb20gYSBmdXR1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0LCBidXQgaXQgaXMgbm90IG9uZSB3ZSBjYW4gZGVjb2RlXG4gKiAgICAgIHlldCwgc28gdGhyb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2x9XG4gKi9cbiAgICAgICBjb25zdCBwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSBuYW1lID0+IHtcbiAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgRmFpbGAke3EobmFtZSl9IG11c3QgYmUgYSBzdHJpbmcsIG5vdCAke3EodHlwZW9mIG5hbWUpfWA7XG4gIGNvbnN0IG1hdGNoID0gQXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gbWF0Y2hbMV07XG4gICAgaWYgKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKSB7XG4gICAgICByZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzeW0gPSBTeW1ib2xbc3VmZml4XTtcbiAgICAgIGlmICh0eXBlb2Ygc3ltID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gc3ltO1xuICAgICAgfVxuICAgICAgRmFpbGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG59OyRozY9fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sfVxuICovXG4gICAgICAgY29uc3QgdW5wYXNzYWJsZVN5bWJvbEZvck5hbWUgPSBuYW1lID0+IFN5bWJvbChuYW1lKTskaM2PX29uY2UudW5wYXNzYWJsZVN5bWJvbEZvck5hbWUodW5wYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZVN5bWJvbCI6WyJpc1Bhc3NhYmxlU3ltYm9sIl0sImFzc2VydFBhc3NhYmxlU3ltYm9sIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLCJ1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJ1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABcuFDZZAkAAGQJAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsZ2V0T3duRGF0YURlc2NyaXB0b3IsY2hlY2tQYXNzU3R5bGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja1RhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsWyRozY9fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NTdHlsZUhlbHBlcn0gZnJvbSAnLi9pbnRlcm5hbC10eXBlcy5qcydcbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgfSA9IE9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IFRhZ2dlZEhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ3RhZ2dlZCcsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gICAgY2hlY2tQYXNzU3R5bGUoY2FuZGlkYXRlLCBjYW5kaWRhdGVbUEFTU19TVFlMRV0sICd0YWdnZWQnLCBjaGVjayksXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgY2hlY2tUYWdSZWNvcmQoY2FuZGlkYXRlLCAndGFnZ2VkJywgYXNzZXJ0Q2hlY2tlcik7XG5cbiAgICAvKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuICAgIGNvbnN0IHBhc3NTdHlsZUtleSA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKFBBU1NfU1RZTEUpO1xuICAgIGNvbnN0IHRhZ0tleSA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKFN5bWJvbC50b1N0cmluZ1RhZyk7XG4gICAgY29uc3Qge1xuICAgICAgLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuICAgICAgWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFzc1N0eWxlS2V5KV06IF9wYXNzU3R5bGVEZXNjLFxuICAgICAgWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAodGFnS2V5KV06IF9sYWJlbERlc2MsXG4gICAgICBwYXlsb2FkOiBfcGF5bG9hZERlc2MsIC8qIHZhbHVlIGNoZWNrZWQgYnkgcmVjdXJzaXZlIHdhbGsgYXQgdGhlIGVuZCovXG4gICAgICAuLi5yZXN0RGVzY3NcbiAgICB9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICAgIG93bktleXMocmVzdERlc2NzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuICAgIC8qIFZhbGlkYXRlIHRoYXQgdGhlICdwYXlsb2FkJyBwcm9wZXJ0eSBpcyBvd24vZGF0YS9lbnVtZXJhYmxlKi9cbiAgICAvKiBhbmQgaXRzIGFzc29jaWF0ZWQgdmFsdWUgaXMgcmVjdXJzaXZlbHkgcGFzc2FibGUuKi9cbiAgICBwYXNzU3R5bGVPZlJlY3VyKFxuICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCAncGF5bG9hZCcsIHRydWUsIGFzc2VydENoZWNrZXIpLnZhbHVlLFxuICAgICk7XG4gIH0sXG59KTskaM2PX29uY2UuVGFnZ2VkSGVscGVyKFRhZ2dlZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALddPVwmFgAAJhYAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyIsIi4vcGFzc1N0eWxlT2YuanMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0QXRvbSIsImFzc2VydEJ5dGVBcnJheSIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFJlY29yZCIsImFzc2VydFJlbW90YWJsZSIsImlzQXRvbSIsImlzQnl0ZUFycmF5IiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLFgsaWRlbnRDaGVja2VyLHBhc3NTdHlsZU9mLGFzc2VydENoZWNrZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q29weUFycmF5LCBDb3B5UmVjb3JkLCBQYXNzYWJsZSwgUmVtb3RhYmxlT2JqZWN0LCBCeXRlQXJyYXksIENoZWNrZXIsIEF0b219IGZyb20gJy4vdHlwZXMuanMnXG4gKi9cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBhcnJheSwgQUtBIGEgXCJjb3B5QXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7YW55fSBhcnJcbiAqIEByZXR1cm5zIHthcnIgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlBcnJheSA9IGFyciA9PiBwYXNzU3R5bGVPZihhcnIpID09PSAnY29weUFycmF5JzskaM2PX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBiaW5hcnkgZGF0YSwgQUtBIGEgXCJieXRlQXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFyclxuICogQHJldHVybnMge2FyciBpcyBCeXRlQXJyYXl9XG4gKi9cbiAgICAgICBjb25zdCBpc0J5dGVBcnJheSA9IGFyciA9PiBwYXNzU3R5bGVPZihhcnIpID09PSAnYnl0ZUFycmF5JzskaM2PX29uY2UuaXNCeXRlQXJyYXkoaXNCeXRlQXJyYXkpO1xuaGFyZGVuKGlzQnl0ZUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQsIEFLQSBhXG4gKiBcImNvcHlSZWNvcmRcIiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHthbnl9IHJlY29yZFxuICogQHJldHVybnMge3JlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbiAgICAgICBjb25zdCBpc1JlY29yZCA9IHJlY29yZCA9PiBwYXNzU3R5bGVPZihyZWNvcmQpID09PSAnY29weVJlY29yZCc7JGjNj19vbmNlLmlzUmVjb3JkKGlzUmVjb3JkKTtcbmhhcmRlbihpc1JlY29yZCk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSByZW1vdGFibGUuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7cmVtb3RhYmxlIGlzIFJlbW90YWJsZU9iamVjdH1cbiAqL1xuICAgICAgIGNvbnN0IGlzUmVtb3RhYmxlID0gcmVtb3RhYmxlID0+IHBhc3NTdHlsZU9mKHJlbW90YWJsZSkgPT09ICdyZW1vdGFibGUnOyRozY9fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBhcnJcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFyciBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlBcnJheSA9IChhcnIsIG9wdE5hbWVPZkFycmF5ID0gJ0FsbGVnZWQgYXJyYXknKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKGFycik7XG4gIHBhc3NTdHlsZSA9PT0gJ2NvcHlBcnJheScgfHxcbiAgICBGYWlsYCR7cShvcHROYW1lT2ZBcnJheSl9ICR7YXJyfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxuICAgICAgcGFzc1N0eWxlLFxuICAgICl9YDtcbn07JGjNj19vbmNlLmFzc2VydENvcHlBcnJheShhc3NlcnRDb3B5QXJyYXkpO1xuaGFyZGVuKGFzc2VydENvcHlBcnJheSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnIgaXMgQnl0ZUFycmF5fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0Qnl0ZUFycmF5ID0gKGFyciwgb3B0TmFtZU9mQXJyYXkgPSAnQWxsZWdlZCBieXRlQXJyYXknKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKGFycik7XG4gIHBhc3NTdHlsZSA9PT0gJ2J5dGVBcnJheScgfHxcbiAgICBGYWlsYCR7cShcbiAgICAgIG9wdE5hbWVPZkFycmF5LFxuICAgICl9ICR7YXJyfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGJpbmFyeSBkYXRhLCBub3QgJHtxKHBhc3NTdHlsZSl9YDtcbn07JGjNj19vbmNlLmFzc2VydEJ5dGVBcnJheShhc3NlcnRCeXRlQXJyYXkpO1xuaGFyZGVuKGFzc2VydEJ5dGVBcnJheSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlY29yZFxuICogQHBhcmFtIHthbnl9IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRSZWNvcmQgPSAocmVjb3JkLCBvcHROYW1lT2ZSZWNvcmQgPSAnQWxsZWdlZCByZWNvcmQnKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHJlY29yZCk7XG4gIHBhc3NTdHlsZSA9PT0gJ2NvcHlSZWNvcmQnIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mUmVjb3JkKX0gJHtyZWNvcmR9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBub3QgJHtxKFxuICAgICAgcGFzc1N0eWxlLFxuICAgICl9YDtcbn07JGjNj19vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlbW90YWJsZVxuICogQHJldHVybnMge2Fzc2VydHMgcmVtb3RhYmxlIGlzIFJlbW90YWJsZU9iamVjdH1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFJlbW90YWJsZSA9IChcbiAgcmVtb3RhYmxlLFxuICBvcHROYW1lT2ZSZW1vdGFibGUgPSAnQWxsZWdlZCByZW1vdGFibGUnLFxuKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHJlbW90YWJsZSk7XG4gIHBhc3NTdHlsZSA9PT0gJ3JlbW90YWJsZScgfHxcbiAgICBGYWlsYCR7cShvcHROYW1lT2ZSZW1vdGFibGUpfSAke3JlbW90YWJsZX0gbXVzdCBiZSBhIHJlbW90YWJsZSwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWwgTm90IG5lY2Vzc2FyaWx5IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7dmFsIGlzIEF0b219XG4gKi9cbmNvbnN0IGNoZWNrQXRvbSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGxldCBwYXNzU3R5bGU7XG4gIHRyeSB7XG4gICAgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoZWNrICE9PSBpZGVudENoZWNrZXIgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYE5vdCBldmVuIFBhc3NhYmxlOiAke3EoZXJyKX06ICR7dmFsfWApXG4gICAgKTtcbiAgfVxuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgY2FzZSAnbnVsbCc6XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdiaWdpbnQnOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnYnl0ZUFycmF5JzpcbiAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAvKiBUaGUgQXRvbVN0eWxlIGNhc2VzKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICAvKiBUaGUgb3RoZXIgUGFzc1N0eWxlIGNhc2VzKi9cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrICE9PSBpZGVudENoZWNrZXIgJiZcbiAgICAgICAgY2hlY2soZmFsc2UsIFhgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGFuIGF0b206ICR7dmFsfWApXG4gICAgICApO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7dmFsIGlzIEF0b219XG4gKi9cbiAgICAgICBjb25zdCBpc0F0b20gPSB2YWwgPT4gY2hlY2tBdG9tKHZhbCwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNBdG9tKGlzQXRvbSk7XG5oYXJkZW4oaXNBdG9tKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbCBpcyBBdG9tfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0QXRvbSA9IHZhbCA9PiB7XG4gIGNoZWNrQXRvbSh2YWwsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0QXRvbShhc3NlcnRBdG9tKTtcbmhhcmRlbihhc3NlcnRBdG9tKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzQnl0ZUFycmF5IjpbImlzQnl0ZUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0Qnl0ZUFycmF5IjpbImFzc2VydEJ5dGVBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXSwiaXNBdG9tIjpbImlzQXRvbSJdLCJhc3NlcnRBdG9tIjpbImFzc2VydEF0b20iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1TZLc7w4AAO8OAAAeAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiLCIuL3NyYy9rZXlzL2NvcHlTZXQuanMiLCIuL3NyYy9rZXlzL2NvcHlCYWcuanMiLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiYmFnVW5pb24iLCJiYWdVbmlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciIsInNldENvbXBhcmUiLCJzZXRDb21wYXJlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2tleXMvY2hlY2tLZXkuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weVNldC5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5QmFnLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjpbWyJpc0tleSIsImlzS2V5Il0sWyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiXSxbImFzc2VydFNjYWxhcktleSIsImFzc2VydFNjYWxhcktleSJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il0sWyJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0Q29weVNldCJdLFsibWFrZUNvcHlTZXQiLCJtYWtlQ29weVNldCJdLFsiZ2V0Q29weVNldEtleXMiLCJnZXRDb3B5U2V0S2V5cyJdLFsiaXNDb3B5QmFnIiwiaXNDb3B5QmFnIl0sWyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weUJhZyJdLFsibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZyJdLFsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLFsiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5QmFnRW50cmllcyJdLFsiaXNDb3B5TWFwIiwiaXNDb3B5TWFwIl0sWyJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weU1hcCJdLFsibWFrZUNvcHlNYXAiLCJtYWtlQ29weU1hcCJdLFsiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjpbWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdXSwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjpbWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXV0sIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOltbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSJdLFsiY29tcGFyZUtleXMiLCJjb21wYXJlS2V5cyJdLFsia2V5TFQiLCJrZXlMVCJdLFsia2V5TFRFIiwia2V5TFRFIl0sWyJrZXlFUSIsImtleUVRIl0sWyJrZXlHVEUiLCJrZXlHVEUiXSxbImtleUdUIiwia2V5R1QiXV0sIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6W1siZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOltbImJhZ0lzU3VwZXJiYWciLCJiYWdJc1N1cGVyYmFnIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOltbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJtdXN0TWF0Y2giLCJtdXN0TWF0Y2giXSxbImlzQXdhaXRBcmdHdWFyZCIsImlzQXdhaXRBcmdHdWFyZCJdLFsiYXNzZXJ0QXdhaXRBcmdHdWFyZCIsImFzc2VydEF3YWl0QXJnR3VhcmQiXSxbImlzUmF3R3VhcmQiLCJpc1Jhd0d1YXJkIl0sWyJhc3NlcnRSYXdHdWFyZCIsImFzc2VydFJhd0d1YXJkIl0sWyJhc3NlcnRNZXRob2RHdWFyZCIsImFzc2VydE1ldGhvZEd1YXJkIl0sWyJhc3NlcnRJbnRlcmZhY2VHdWFyZCIsImFzc2VydEludGVyZmFjZUd1YXJkIl0sWyJraW5kT2YiLCJraW5kT2YiXSxbImNvbnRhaW5lckhhc1NwbGl0IiwiY29udGFpbmVySGFzU3BsaXQiXV0sIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiOltbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIiwiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSxbImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLFsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sWyJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIiwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdXSwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6W1sibGlzdERpZmZlcmVuY2UiLCJsaXN0RGlmZmVyZW5jZSJdXSwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOltbIm9iamVjdE1hcCIsIm9iamVjdE1hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqiED6QtIAAALSAAAKgAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jaGVja0tleS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiLi9jb3B5U2V0LmpzIiwiLi9jb3B5QmFnLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUJhZyIsImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0S2V5IiwiYXNzZXJ0U2NhbGFyS2V5IiwiY2hlY2tDb3B5QmFnIiwiY2hlY2tDb3B5TWFwIiwiY2hlY2tDb3B5U2V0IiwiY2hlY2tLZXkiLCJjaGVja1NjYWxhcktleSIsImNvcHlNYXBLZXlTZXQiLCJldmVyeUNvcHlCYWdFbnRyeSIsImV2ZXJ5Q29weU1hcEtleSIsImV2ZXJ5Q29weU1hcFZhbHVlIiwiZXZlcnlDb3B5U2V0S2V5IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyeUFycmF5IiwiZ2V0Q29weU1hcEtleXMiLCJnZXRDb3B5TWFwVmFsdWVzIiwiZ2V0Q29weVNldEtleXMiLCJpc0NvcHlCYWciLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJpc0tleSIsImlzU2NhbGFyS2V5IiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHEsRmFpbCxpZGVudENoZWNrZXIsYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaXNBdG9tLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGNoZWNrRWxlbWVudHMsbWFrZVNldE9mRWxlbWVudHMsY2hlY2tCYWdFbnRyaWVzLG1ha2VCYWdPZkVudHJpZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0F0b21cIixbJGjNj19hID0+IChpc0F0b20gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiY2hlY2tFbGVtZW50c1wiLFskaM2PX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaM2PX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIixbJGjNj19hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRozY9fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiY2hlY2tCYWdFbnRyaWVzXCIsWyRozY9fYSA9PiAoY2hlY2tCYWdFbnRyaWVzID0gJGjNj19hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIixbJGjNj19hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGUsIEF0b20sIENoZWNrZXJ9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKiBAaW1wb3J0IHtDb3B5QmFnLCBDb3B5TWFwLCBDb3B5U2V0LCBLZXksIFNjYWxhcktleX0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vIEF0b20gYW5kIFNjYWxhciBrZXlzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrU2NhbGFyS2V5ID0gKHZhbCwgY2hlY2spID0+IHtcbiAgaWYgKGlzQXRvbSh2YWwpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsKTtcbiAgaWYgKHBhc3NTdHlsZSA9PT0gJ3JlbW90YWJsZScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgc2NhbGFyIGtleTogJHt2YWx9YCk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHt2YWwgaXMgU2NhbGFyS2V5fVxuICovJGjNj19vbmNlLmNoZWNrU2NhbGFyS2V5KGNoZWNrU2NhbGFyS2V5KTtcbiAgICAgICBjb25zdCBpc1NjYWxhcktleSA9IHZhbCA9PiBjaGVja1NjYWxhcktleSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzU2NhbGFyS2V5KGlzU2NhbGFyS2V5KTtcbmhhcmRlbihpc1NjYWxhcktleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWwgaXMgU2NhbGFyS2V5fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0U2NhbGFyS2V5ID0gdmFsID0+IHtcbiAgY2hlY2tTY2FsYXJLZXkodmFsLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydFNjYWxhcktleShhc3NlcnRTY2FsYXJLZXkpO1xuaGFyZGVuKGFzc2VydFNjYWxhcktleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogQHRzLWV4cGVjdC1lcnJvciBLZXkgZG9lcyBub3Qgc2F0aXNmeSBXZWFrS2V5Ki9cbi8qKiBAdHlwZSB7V2Vha1NldDxLZXk+fSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBLZXkgZG9lcyBub3Qgc2F0aXNmeSBXZWFrS2V5Ki9cbmNvbnN0IGtleU1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrS2V5ID0gKHZhbCwgY2hlY2spID0+IHtcbiAgaWYgKGlzQXRvbSh2YWwpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gIGlmIChrZXlNZW1vLmhhcyh2YWwpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tLZXlJbnRlcm5hbCh2YWwsIGNoZWNrKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIC8qIERvbid0IGNhY2hlIHRoZSB1bmRlZmluZWQgY2FzZXMsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQgYWdhaW4qL1xuICAgIC8qIHdpdGggYGFzc2VydENoZWNrZXJgIGl0J2xsIHRocm93IGEgZGlhZ25vc3RpYyBhZ2FpbiovXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAga2V5TWVtby5hZGQodmFsKTtcbiAgfVxuICAvKiBOb3RlIHRoYXQgd2UgZG8gbm90IG1lbW9pemUgYSBuZWdhdGl2ZSBqdWRnZW1lbnQsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQqL1xuICAvKiBhZ2FpbiB3aXRoIGEgY2hlY2tlciwgaXQgd2lsbCBzdGlsbCBwcm9kdWNlIGEgdXNlZnVsIGRpYWdub3N0aWMuKi9cbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmNoZWNrS2V5KGNoZWNrS2V5KTtcbmhhcmRlbihjaGVja0tleSk7XG5cbi8qKlxuICogQHR5cGUge3tcbiAqICAgKHZhbDogUGFzc2FibGUpOiB2YWwgaXMgS2V5O1xuICogICAodmFsOiBhbnkpOiBib29sZWFuO1xuICogfX1cbiAqL1xuICAgICAgIGNvbnN0IGlzS2V5ID0gdmFsID0+IGNoZWNrS2V5KHZhbCwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNLZXkoaXNLZXkpO1xuaGFyZGVuKGlzS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge0tleX0gdmFsXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWwgaXMgS2V5fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0S2V5ID0gdmFsID0+IHtcbiAgY2hlY2tLZXkodmFsLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEtleShhc3NlcnRLZXkpO1xuaGFyZGVuKGFzc2VydEtleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weVNldCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5U2V0IGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weVNldD59ICovXG5jb25zdCBjb3B5U2V0TWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tDb3B5U2V0ID0gKHMsIGNoZWNrKSA9PiB7XG4gIGlmIChjb3B5U2V0TWVtby5oYXMocykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCByZXN1bHQgPVxuICAgICgocGFzc1N0eWxlT2YocykgPT09ICd0YWdnZWQnICYmIGdldFRhZyhzKSA9PT0gJ2NvcHlTZXQnKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgTm90IGEgY29weVNldDogJHtzfWApKSAmJlxuICAgIGNoZWNrRWxlbWVudHMocy5wYXlsb2FkLCBjaGVjaykgJiZcbiAgICBjaGVja0tleShzLnBheWxvYWQsIGNoZWNrKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvcHlTZXRNZW1vLmFkZChzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tDb3B5U2V0KGNoZWNrQ29weVNldCk7XG5oYXJkZW4oY2hlY2tDb3B5U2V0KTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc1xuICogQHJldHVybnMge3MgaXMgQ29weVNldH1cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weVNldCA9IHMgPT4gY2hlY2tDb3B5U2V0KHMsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHMgaXMgQ29weVNldH1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlTZXR9ICovXG4gICAgICAgY29uc3QgYXNzZXJ0Q29weVNldCA9IHMgPT4ge1xuICBjaGVja0NvcHlTZXQocywgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRDb3B5U2V0KGFzc2VydENvcHlTZXQpO1xuaGFyZGVuKGFzc2VydENvcHlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5U2V0S2V5cyA9IHMgPT4ge1xuICBhc3NlcnRDb3B5U2V0KHMpO1xuICByZXR1cm4gcy5wYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0Q29weVNldEtleXMoZ2V0Q29weVNldEtleXMpO1xuaGFyZGVuKGdldENvcHlTZXRLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcGFyYW0geyhrZXk6IEssIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGV2ZXJ5Q29weVNldEtleSA9IChzLCBmbikgPT5cbiAgZ2V0Q29weVNldEtleXMocykuZXZlcnkoKGtleSwgaW5kZXgpID0+IGZuKGtleSwgaW5kZXgpKTskaM2PX29uY2UuZXZlcnlDb3B5U2V0S2V5KGV2ZXJ5Q29weVNldEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5U2V0S2V5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUNvcHlTZXQgPSBlbGVtZW50SXRlciA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VTZXRPZkVsZW1lbnRzKGVsZW1lbnRJdGVyKTtcbiAgYXNzZXJ0Q29weVNldChyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubWFrZUNvcHlTZXQobWFrZUNvcHlTZXQpO1xuaGFyZGVuKG1ha2VDb3B5U2V0KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5QmFnIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlCYWcgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5QmFnPn0gKi9cbmNvbnN0IGNvcHlCYWdNZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gYlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja0NvcHlCYWcgPSAoYiwgY2hlY2spID0+IHtcbiAgaWYgKGNvcHlCYWdNZW1vLmhhcyhiKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgKChwYXNzU3R5bGVPZihiKSA9PT0gJ3RhZ2dlZCcgJiYgZ2V0VGFnKGIpID09PSAnY29weUJhZycpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBOb3QgYSBjb3B5QmFnOiAke2J9YCkpICYmXG4gICAgY2hlY2tCYWdFbnRyaWVzKGIucGF5bG9hZCwgY2hlY2spICYmXG4gICAgY2hlY2tLZXkoYi5wYXlsb2FkLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBjb3B5QmFnTWVtby5hZGQoYik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmNoZWNrQ29weUJhZyhjaGVja0NvcHlCYWcpO1xuaGFyZGVuKGNoZWNrQ29weUJhZyk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGJcbiAqIEByZXR1cm5zIHtiIGlzIENvcHlCYWd9XG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlCYWcgPSBiID0+IGNoZWNrQ29weUJhZyhiLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0NvcHlCYWcoaXNDb3B5QmFnKTtcbmhhcmRlbihpc0NvcHlCYWcpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5QmFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiIGlzIENvcHlCYWd9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5QmFnfSAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlCYWcgPSBiID0+IHtcbiAgY2hlY2tDb3B5QmFnKGIsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weUJhZyhhc3NlcnRDb3B5QmFnKTtcbmhhcmRlbihhc3NlcnRDb3B5QmFnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtDb3B5QmFnPEs+fSBiXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPlsncGF5bG9hZCddfVxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weUJhZ0VudHJpZXMgPSBiID0+IHtcbiAgYXNzZXJ0Q29weUJhZyhiKTtcbiAgcmV0dXJuIGIucGF5bG9hZDtcbn07JGjNj19vbmNlLmdldENvcHlCYWdFbnRyaWVzKGdldENvcHlCYWdFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5QmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHBhcmFtIHsoZW50cnk6IFtLLCBiaWdpbnRdLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlCYWdFbnRyeSA9IChiLCBmbikgPT5cbiAgZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LCBpbmRleCkgPT4gZm4oZW50cnksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weUJhZyA9IGJhZ0VudHJ5SXRlciA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VCYWdPZkVudHJpZXMoYmFnRW50cnlJdGVyKTtcbiAgYXNzZXJ0Q29weUJhZyhyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubWFrZUNvcHlCYWcobWFrZUNvcHlCYWcpO1xuaGFyZGVuKG1ha2VDb3B5QmFnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUNvcHlCYWdGcm9tRWxlbWVudHMgPSBlbGVtZW50SXRlciA9PiB7XG4gIC8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4gIC8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuICBjb25zdCBzb3J0ZWQgPSBzb3J0QnlSYW5rKGVsZW1lbnRJdGVyLCBmdWxsQ29tcGFyZSk7XG4gIC8qKiBAdHlwZSB7W0ssYmlnaW50XVtdfSAqL1xuICBjb25zdCBlbnRyaWVzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkLmxlbmd0aDsgKSB7XG4gICAgY29uc3QgayA9IHNvcnRlZFtpXTtcbiAgICBsZXQgaiA9IGkgKyAxO1xuICAgIHdoaWxlIChqIDwgc29ydGVkLmxlbmd0aCAmJiBmdWxsQ29tcGFyZShrLCBzb3J0ZWRbal0pID09PSAwKSB7XG4gICAgICBqICs9IDE7XG4gICAgfVxuICAgIGVudHJpZXMucHVzaChbaywgQmlnSW50KGogLSBpKV0pO1xuICAgIGkgPSBqO1xuICB9XG4gIHJldHVybiBtYWtlQ29weUJhZyhlbnRyaWVzKTtcbn07JGjNj19vbmNlLm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcbmhhcmRlbihtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weU1hcCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5TWFwJ3Mga2V5cyBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PENvcHlNYXA+fSAqL1xuY29uc3QgY29weU1hcE1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBtXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrQ29weU1hcCA9IChtLCBjaGVjaykgPT4ge1xuICBpZiAoY29weU1hcE1lbW8uaGFzKG0pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCEocGFzc1N0eWxlT2YobSkgPT09ICd0YWdnZWQnICYmIGdldFRhZyhtKSA9PT0gJ2NvcHlNYXAnKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBOb3QgYSBjb3B5TWFwOiAke219YCk7XG4gIH1cbiAgY29uc3QgeyBwYXlsb2FkIH0gPSBtO1xuICBpZiAocGFzc1N0eWxlT2YocGF5bG9hZCkgIT09ICdjb3B5UmVjb3JkJykge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3QgYmUgYSByZWNvcmQ6ICR7bX1gKTtcbiAgfVxuICBjb25zdCB7IGtleXMsIHZhbHVlcywgLi4ucmVzdCB9ID0gcGF5bG9hZDtcbiAgY29uc3QgcmVzdWx0ID1cbiAgICAob3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3Qgb25seSBoYXZlIC5rZXlzIGFuZCAudmFsdWVzOiAke219YCxcbiAgICAgICkpICYmXG4gICAgY2hlY2tFbGVtZW50cyhrZXlzLCBjaGVjaykgJiZcbiAgICBjaGVja0tleShrZXlzLCBjaGVjaykgJiZcbiAgICAocGFzc1N0eWxlT2YodmFsdWVzKSA9PT0gJ2NvcHlBcnJheScgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgY29weU1hcCdzIC52YWx1ZXMgbXVzdCBiZSBhIGNvcHlBcnJheTogJHttfWApKSAmJlxuICAgIChrZXlzLmxlbmd0aCA9PT0gdmFsdWVzLmxlbmd0aCB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEEgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXMgYW5kIHZhbHVlczogJHttfWAsXG4gICAgICApKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvcHlNYXBNZW1vLmFkZChtKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tDb3B5TWFwKGNoZWNrQ29weU1hcCk7XG5oYXJkZW4oY2hlY2tDb3B5TWFwKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gbVxuICogQHJldHVybnMge20gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weU1hcCA9IG0gPT4gY2hlY2tDb3B5TWFwKG0sIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuaGFyZGVuKGlzQ29weU1hcCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHJldHVybnMge2Fzc2VydHMgbSBpcyBDb3B5TWFwPEtleSwgUGFzc2FibGU+fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0Q29weU1hcCA9IG0gPT4ge1xuICBjaGVja0NvcHlNYXAobSwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRDb3B5TWFwKGFzc2VydENvcHlNYXApO1xuaGFyZGVuKGFzc2VydENvcHlNYXApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0tbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlNYXBLZXlzID0gbSA9PiB7XG4gIGFzc2VydENvcHlNYXAobSk7XG4gIHJldHVybiBtLnBheWxvYWQua2V5cztcbn07JGjNj19vbmNlLmdldENvcHlNYXBLZXlzKGdldENvcHlNYXBLZXlzKTtcbmhhcmRlbihnZXRDb3B5TWFwS2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7VltdfVxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcFZhbHVlcyA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICByZXR1cm4gbS5wYXlsb2FkLnZhbHVlcztcbn07JGjNj19vbmNlLmdldENvcHlNYXBWYWx1ZXMoZ2V0Q29weU1hcFZhbHVlcyk7XG5oYXJkZW4oZ2V0Q29weU1hcFZhbHVlcyk7XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhIENvcHlNYXAncyBlbnRyaWVzIGluIHN0b3JhZ2Ugb3JkZXIuXG4gKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7QXJyYXk8W0ssVl0+fVxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcEVudHJ5QXJyYXkgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgY29uc3Qge1xuICAgIHBheWxvYWQ6IHsga2V5cywgdmFsdWVzIH0sXG4gIH0gPSBtO1xuICByZXR1cm4gaGFyZGVuKGtleXMubWFwKChrZXksIGkpID0+IFtrZXksIHZhbHVlc1tpXV0pKTtcbn07JGjNj19vbmNlLmdldENvcHlNYXBFbnRyeUFycmF5KGdldENvcHlNYXBFbnRyeUFycmF5KTtcbmhhcmRlbihnZXRDb3B5TWFwRW50cnlBcnJheSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W0ssVl0+fVxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcEVudHJpZXMgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgY29uc3Qge1xuICAgIHBheWxvYWQ6IHsga2V5cywgdmFsdWVzIH0sXG4gIH0gPSBtO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8gKGtleXMpO1xuICByZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8W0ssVl0sdm9pZD59ICovXG4gICAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBba2V5c1tpXSwgdmFsdWVzW2ldXSB9KTtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLmdldENvcHlNYXBFbnRyaWVzKGdldENvcHlNYXBFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyhrZXk6IEssIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGV2ZXJ5Q29weU1hcEtleSA9IChtLCBmbikgPT5cbiAgZ2V0Q29weU1hcEtleXMobSkuZXZlcnkoKGtleSwgaW5kZXgpID0+IGZuKGtleSwgaW5kZXgpKTskaM2PX29uY2UuZXZlcnlDb3B5TWFwS2V5KGV2ZXJ5Q29weU1hcEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwS2V5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KHZhbHVlOiBWLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlNYXBWYWx1ZSA9IChtLCBmbikgPT5cbiAgZ2V0Q29weU1hcFZhbHVlcyhtKS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBmbih2YWx1ZSwgaW5kZXgpKTskaM2PX29uY2UuZXZlcnlDb3B5TWFwVmFsdWUoZXZlcnlDb3B5TWFwVmFsdWUpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcFZhbHVlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG4gICAgICAgY29uc3QgY29weU1hcEtleVNldCA9IG0gPT5cbiAgLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUgYWxyZWFkeSBpbiB0aGUgaW50ZXJuYWwgZm9ybSB1c2VkIGJ5IGNvcHlTZXRzLiovXG4gIG1ha2VUYWdnZWQoJ2NvcHlTZXQnLCBtLnBheWxvYWQua2V5cyk7JGjNj19vbmNlLmNvcHlNYXBLZXlTZXQoY29weU1hcEtleVNldCk7XG5oYXJkZW4oY29weU1hcEtleVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIFZdPn0gZW50cmllc1xuICogQHJldHVybnMge0NvcHlNYXA8SyxWPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb3B5TWFwID0gZW50cmllcyA9PiB7XG4gIC8qIFRoaXMgaXMgd2VpcmQsIGJ1dCByZXZlcnNlIHJhbmsgc29ydGluZyB0aGUgZW50cmllcyBpcyBhIGdvb2QgZmlyc3Qgc3RlcCovXG4gIC8qIGZvciBnZXR0aW5nIHRoZSByYW5rIHNvcnRlZCBrZXlzIHRvZ2V0aGVyIHdpdGggdGhlIHZhbHVlcyovXG4gIC8qIG9yZ2FuaXplZCBieSB0aG9zZSBrZXlzLiBBbHNvLCBhbW9uZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoKi9cbiAgLyoga2V5cyBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzcywgdGhvc2UgYXJlIHJhbmsgc29ydGVkLiovXG4gIC8qIFRPRE8gVGhpcyovXG4gIC8qIGNvdWxkIHNvbHZlIHRoZSBjb3B5TWFwIGNvdmVyIGlzc3VlIGV4cGxhaW5lZCBpbiBwYXR0ZXJuTWF0Y2hlcnMuanMuKi9cbiAgLyogQnV0IG9ubHkgaWYgd2UgaW5jbHVkZSB0aGlzIGNyaXRlcmlhIGluIG91ciB2YWxpZGF0aW9uIG9mIGNvcHlNYXBzLCovXG4gIC8qIHdoaWNoIHdlIGN1cnJlbnRseSBkbyBub3QuKi9cbiAgY29uc3Qgc29ydGVkRW50cmllcyA9IHNvcnRCeVJhbmsoZW50cmllcywgY29tcGFyZUFudGlSYW5rKTtcbiAgY29uc3Qga2V5cyA9IHNvcnRlZEVudHJpZXMubWFwKChbaywgX3ZdKSA9PiBrKTtcbiAgY29uc3QgdmFsdWVzID0gc29ydGVkRW50cmllcy5tYXAoKFtfaywgdl0pID0+IHYpO1xuICBjb25zdCByZXN1bHQgPSBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgeyBrZXlzLCB2YWx1ZXMgfSk7XG4gIGFzc2VydENvcHlNYXAocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLm1ha2VDb3B5TWFwKG1ha2VDb3B5TWFwKTtcbmhhcmRlbihtYWtlQ29weU1hcCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIFJlY3VyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBgY2hlY2tLZXlJbnRlcm5hbGAgaXMgb25seSBjYWxsZWQgaWYgYHZhbGAgaXMgUGFzc2FibGUgYnV0IGlzIG5vdCBhbiBBdG9tLlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0tleUludGVybmFsID0gKHZhbCwgY2hlY2spID0+IHtcbiAgY29uc3QgY2hlY2tJdCA9IGNoaWxkID0+IGNoZWNrS2V5KGNoaWxkLCBjaGVjayk7XG5cbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsKTtcbiAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAvKiBBIHJlbW90YWJsZSBpcyBhIFNjYWxhcktleSBidXQgbm90IGFuIEF0b20sIHNvIHdlIHBpY2sgaXQgdXAgaGVyZS4qL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAvKiBBIGNvcHlSZWNvcmQgaXMgYSBrZXkgaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGtleXMqL1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModmFsKS5ldmVyeShjaGVja0l0KTtcbiAgICB9XG4gICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgLyogQSBjb3B5QXJyYXkgaXMgYSBrZXkgaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGtleXMqL1xuICAgICAgcmV0dXJuIHZhbC5ldmVyeShjaGVja0l0KTtcbiAgICB9XG4gICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHZhbCk7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgIHJldHVybiBjaGVja0NvcHlTZXQodmFsLCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tDb3B5QmFnKHZhbCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNoZWNrQ29weU1hcCh2YWwsIGNoZWNrKSAmJlxuICAgICAgICAgICAgLyogRm9yIGEgY29weU1hcCB0byBiZSBhIGtleSwgYWxsIGl0cyBrZXlzIGFuZCB2YWx1ZXMgbXVzdCovXG4gICAgICAgICAgICAvKiBiZSBrZXlzLiBLZXlzIGFscmVhZHkgY2hlY2tlZCBieSBgY2hlY2tDb3B5TWFwYCBzaW5jZSovXG4gICAgICAgICAgICAvKiB0aGF0J3MgYSBjb3B5TWFwIHJlcXVpcmVtZW50IGluIGdlbmVyYWwuKi9cbiAgICAgICAgICAgIGV2ZXJ5Q29weU1hcFZhbHVlKHZhbCwgY2hlY2tJdClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY2hlY2sgIT09IGlkZW50Q2hlY2tlciAmJlxuICAgICAgICAgICAgY2hlY2soZmFsc2UsIFhgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHt2YWx9YClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNhc2UgJ2Vycm9yJzpcbiAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIGtleWApO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICAvKiBVbmV4cGVjdGVkIHRhZ3MgYXJlIGp1c3Qgbm9uLWtleXMsIGJ1dCBhbiB1bmV4cGVjdGVkIHBhc3NTdHlsZSovXG4gICAgICAvKiBpcyBhbHdheXMgYW4gZXJyb3IuKi9cbiAgICAgIHRocm93IEZhaWxgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3ZhbH1gO1xuICAgIH1cbiAgfVxufTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNoZWNrU2NhbGFyS2V5IjpbImNoZWNrU2NhbGFyS2V5Il0sImlzU2NhbGFyS2V5IjpbImlzU2NhbGFyS2V5Il0sImFzc2VydFNjYWxhcktleSI6WyJhc3NlcnRTY2FsYXJLZXkiXSwiY2hlY2tLZXkiOlsiY2hlY2tLZXkiXSwiaXNLZXkiOlsiaXNLZXkiXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSJdLCJjaGVja0NvcHlTZXQiOlsiY2hlY2tDb3B5U2V0Il0sImlzQ29weVNldCI6WyJpc0NvcHlTZXQiXSwiYXNzZXJ0Q29weVNldCI6WyJhc3NlcnRDb3B5U2V0Il0sImdldENvcHlTZXRLZXlzIjpbImdldENvcHlTZXRLZXlzIl0sImV2ZXJ5Q29weVNldEtleSI6WyJldmVyeUNvcHlTZXRLZXkiXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiXSwiY2hlY2tDb3B5QmFnIjpbImNoZWNrQ29weUJhZyJdLCJpc0NvcHlCYWciOlsiaXNDb3B5QmFnIl0sImFzc2VydENvcHlCYWciOlsiYXNzZXJ0Q29weUJhZyJdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyJdLCJldmVyeUNvcHlCYWdFbnRyeSI6WyJldmVyeUNvcHlCYWdFbnRyeSJdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyJdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLCJjaGVja0NvcHlNYXAiOlsiY2hlY2tDb3B5TWFwIl0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwiYXNzZXJ0Q29weU1hcCI6WyJhc3NlcnRDb3B5TWFwIl0sImdldENvcHlNYXBLZXlzIjpbImdldENvcHlNYXBLZXlzIl0sImdldENvcHlNYXBWYWx1ZXMiOlsiZ2V0Q29weU1hcFZhbHVlcyJdLCJnZXRDb3B5TWFwRW50cnlBcnJheSI6WyJnZXRDb3B5TWFwRW50cnlBcnJheSJdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyJdLCJldmVyeUNvcHlNYXBLZXkiOlsiZXZlcnlDb3B5TWFwS2V5Il0sImV2ZXJ5Q29weU1hcFZhbHVlIjpbImV2ZXJ5Q29weU1hcFZhbHVlIl0sImNvcHlNYXBLZXlTZXQiOlsiY29weU1hcEtleVNldCJdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD/2yuQPygAAD8oAAAtAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NoZWNrS2V5LmpzIiwiLi9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyJdLCJleHBvcnRzIjpbImJhZ0NvbXBhcmUiLCJjb21wYXJlS2V5cyIsImtleUVRIiwia2V5R1QiLCJrZXlHVEUiLCJrZXlMVCIsImtleUxURSIsInNldENvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixnZXRUYWcsY29tcGFyZU51bWVyaWNzLGNvbXBhcmVSYW5rLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyxxLEZhaWwsYXNzZXJ0S2V5LGdldENvcHlCYWdFbnRyaWVzLGdldENvcHlNYXBFbnRyeUFycmF5LGdldENvcHlTZXRLZXlzLG1ha2VDb21wYXJlQ29sbGVjdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImNvbXBhcmVOdW1lcmljc1wiLFskaM2PX2EgPT4gKGNvbXBhcmVOdW1lcmljcyA9ICRozY9fYSldXSxbXCJjb21wYXJlUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dLFtcInJlY29yZE5hbWVzXCIsWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsWyRozY9fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLFskaM2PX2EgPT4gKGFzc2VydEtleSA9ICRozY9fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlCYWdFbnRyaWVzID0gJGjNj19hKV1dLFtcImdldENvcHlNYXBFbnRyeUFycmF5XCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJ5QXJyYXkgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIixbJGjNj19hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRozY9fYSldXV1dLFtcIi4va2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNcIiwgW1tcIm1ha2VDb21wYXJlQ29sbGVjdGlvblwiLFskaM2PX2EgPT4gKG1ha2VDb21wYXJlQ29sbGVjdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7Q29weVNldCwgS2V5LCBLZXlDb21wYXJlfSBmcm9tICcuLi90eXBlcy5qcycgKi9cblxuLyoqXG4gKiBDb3B5U2V0IFggaXMgc21hbGxlciB0aGFuIENvcHlTZXQgWSBpZmYgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnMgaG9sZDpcbiAqIDEuIEZvciBldmVyeSB4IGluIFgsIHggaXMgYWxzbyBpbiBZLlxuICogMi4gVGhlcmUgaXMgYSB5IGluIFkgdGhhdCBpcyBub3QgaW4gWC5cbiAqXG4gKiBYIGlzIGVxdWl2YWxlbnQgdG8gWSBpZmYgdGhlIGNvbmRpdGlvbiAxIGhvbGRzIGJ1dCBjb25kaXRpb24gMiBkb2VzIG5vdC5cbiAqL1xuICAgICAgIGNvbnN0IHNldENvbXBhcmUgPSBtYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG4gIC8qKiBAdHlwZSB7PEsgZXh0ZW5kcyBLZXk+KHM6IENvcHlTZXQ8Sz4pID0+IEFycmF5PFtLLCAxXT59ICovIChcbiAgICBzID0+IGhhcmRlbihnZXRDb3B5U2V0S2V5cyhzKS5tYXAoa2V5ID0+IFtrZXksIDFdKSlcbiAgKSxcbiAgMCxcbiAgY29tcGFyZU51bWVyaWNzLFxuKTskaM2PX29uY2Uuc2V0Q29tcGFyZShzZXRDb21wYXJlKTtcbmhhcmRlbihzZXRDb21wYXJlKTtcblxuLyoqXG4gKiBDb3B5QmFnIFggaXMgc21hbGxlciB0aGFuIENvcHlCYWcgWSBpZmYgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnMgaG9sZFxuICogKHdoZXJlIGBjb3VudChBLCBhKWAgaXMgc2hvcnRoYW5kIGZvciB0aGUgY291bnQgYXNzb2NpYXRlZCB3aXRoIGBhYCBpbiBgQWApOlxuICogMS4gRm9yIGV2ZXJ5IHggaW4gWCwgeCBpcyBhbHNvIGluIFkgYW5kIGNvdW50KFgsIHgpIDw9IGNvdW50KFksIHgpLlxuICogMi4gVGhlcmUgaXMgYSB5IGluIFkgc3VjaCB0aGF0IHkgaXMgbm90IGluIFggb3IgY291bnQoWCwgeSkgPCBjb3VudChZLCB5KS5cbiAqXG4gKiBYIGlzIGVxdWl2YWxlbnQgdG8gWSBpZmYgdGhlIGNvbmRpdGlvbiAxIGhvbGRzIGJ1dCBjb25kaXRpb24gMiBkb2VzIG5vdC5cbiAqL1xuICAgICAgIGNvbnN0IGJhZ0NvbXBhcmUgPSBtYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG4gIGdldENvcHlCYWdFbnRyaWVzLFxuICAwbixcbiAgY29tcGFyZU51bWVyaWNzLFxuKTskaM2PX29uY2UuYmFnQ29tcGFyZShiYWdDb21wYXJlKTtcbmhhcmRlbihiYWdDb21wYXJlKTtcblxuLyogVE9ETyBUaGUgZGVzaXJlZCBzZW1hbnRpY3MgZm9yIENvcHlNYXAgY29tcGFyaXNvbiBoYXZlIG5vdCB5ZXQgYmVlbiBkZWNpZGVkLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTczNyNwdWxscmVxdWVzdHJldmlldy0xNTk2NTk1NDExKi9cbi8qIFRoZSBiZWxvdyBpcyBhIGN1cnJlbnRseS11bnVzZWQgZXh0ZW5zaW9uIG9mIENvcHlCYWcgc2VtYW50aWNzIChpLmUuLCBhYnNlbnQqL1xuLyogZW50cmllcyB0cmVhdGVkIGFzIHByZXNlbnQgd2l0aCBhIHZhbHVlIHRoYXQgaXMgc21hbGxlciB0aGFuIGV2ZXJ5dGhpbmcpLiovXG4vKipcbiAqIEEgdW5pcXVlIGxvY2FsIHZhbHVlIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBub3QgZXhpc3QgaW4gYW55IGluYm91bmQgZGF0YVxuICogc3RydWN0dXJlICh3aGljaCB3b3VsZCBub3QgYmUgdGhlIGNhc2UgaWYgd2UgdXNlZCBgU3ltYm9sLmZvcmApLlxuICogTm90ZSB0aGF0IGBBQlNFTlRgIGlzIG5vdCBwYXNzYWJsZSwgYW5kIHNvIG9ubHkgZXhpc3RzIGF0IHRoZSBKUyBsZXZlbCBvZlxuICogYWJzdHJhY3Rpb24sIG5vdCBwYXNzLXN0eWxlLlxuICovXG5jb25zdCBBQlNFTlQgPSBTeW1ib2woJ2Fic2VudCcpO1xuXG4vKipcbiAqIENvcHlNYXAgWCBpcyBzbWFsbGVyIHRoYW4gQ29weU1hcCBZIGlmZiBhbGwgb2YgdGhlc2UgY29uZGl0aW9ucyBob2xkOlxuICogMS4gWCBhbmQgWSBhcmUgYm90aCBLZXlzIChpLmUuLCBuZWl0aGVyIGNvbnRhaW5zIG5vbi1jb21wYXJhYmxlIGRhdGEpLlxuICogMi4gRm9yIGV2ZXJ5IHggaW4gWCwgeCBpcyBhbHNvIGluIFkgYW5kIFhbeF0gaXMgc21hbGxlciB0aGFuIG9yIGVxdWl2YWxlbnQgdG8gWVt4XS5cbiAqIDMuIFRoZXJlIGlzIGEgeSBpbiBZIHN1Y2ggdGhhdCB5IGlzIG5vdCBpbiBYIG9yIFhbeV0gaXMgc21hbGxlciB0aGFuIFlbeV0uXG4gKlxuICogWCBpcyBlcXVpdmFsZW50IHRvIFkgaWZmIGNvbmRpdGlvbnMgMSBhbmQgMiBob2xkIGJ1dCBjb25kaXRpb24gMyBkb2VzIG5vdC5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVyc2NvcmUtZGFuZ2xlKi9cbmNvbnN0IF9tYXBDb21wYXJlID0gbWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuICBnZXRDb3B5TWFwRW50cnlBcnJheSxcbiAgQUJTRU5ULFxuICAobGVmdFZhbHVlLCByaWdodFZhbHVlKSA9PiB7XG4gICAgaWYgKGxlZnRWYWx1ZSA9PT0gQUJTRU5UICYmIHJpZ2h0VmFsdWUgPT09IEFCU0VOVCkge1xuICAgICAgdGhyb3cgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBhYnNlbnQgZW50cnkgcGFpcmA7XG4gICAgfSBlbHNlIGlmIChsZWZ0VmFsdWUgPT09IEFCU0VOVCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gZWxzZSBpZiAocmlnaHRWYWx1ZSA9PT0gQUJTRU5UKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIHJldHVybiBjb21wYXJlS2V5cyhsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpO1xuICAgIH1cbiAgfSxcbik7XG5oYXJkZW4oX21hcENvbXBhcmUpO1xuXG4vKiogQHR5cGUge0tleUNvbXBhcmV9ICovXG4gICAgICAgY29uc3QgY29tcGFyZUtleXMgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgYXNzZXJ0S2V5KGxlZnQpO1xuICBhc3NlcnRLZXkocmlnaHQpO1xuICBjb25zdCBsZWZ0U3R5bGUgPSBwYXNzU3R5bGVPZihsZWZ0KTtcbiAgY29uc3QgcmlnaHRTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0KTtcbiAgaWYgKGxlZnRTdHlsZSAhPT0gcmlnaHRTdHlsZSkge1xuICAgIC8qIERpZmZlcmVudCBwYXNzU3R5bGVzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuICBzd2l0Y2ggKGxlZnRTdHlsZSkge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgY2FzZSAnbnVsbCc6XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnYmlnaW50JzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ2J5dGVBcnJheSc6XG4gICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgLyogZm9yIHRoZXNlLCBrZXlzIGNvbXBhcmUgdGhlIHNhbWUgYXMgcmFuayovXG4gICAgICByZXR1cm4gY29tcGFyZVJhbmsobGVmdCwgcmlnaHQpO1xuICAgIH1cbiAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICBjb25zdCByYW5rQ29tcCA9IGNvbXBhcmVSYW5rKGxlZnQsIHJpZ2h0KTtcbiAgICAgIGlmIChyYW5rQ29tcCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGlmIChOdW1iZXIuaXNOYU4obGVmdCkgfHwgTnVtYmVyLmlzTmFOKHJpZ2h0KSkge1xuICAgICAgICAvKiBOYU4gaXMgZXF1YWwgdG8gaXRzZWxmLCBidXQgaW5jb21tZW5zdXJhdGUgd2l0aCBldmVyeXRoaW5nIGVsc2UqL1xuICAgICAgICBhc3NlcnQoIU51bWJlci5pc05hTihsZWZ0KSB8fCAhTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgICAvKiBBbW9uZyBub24tTmFOIG51bWJlcnMsIGtleSBvcmRlciBpcyB0aGUgc2FtZSBhcyByYW5rIG9yZGVyLiBOb3RlIHRoYXQqL1xuICAgICAgLyogaW4gYm90aCBvcmRlcnMsIGAtMGAgaXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MgYXMgYDBgLiovXG4gICAgICByZXR1cm4gcmFua0NvbXA7XG4gICAgfVxuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIGlmIChsZWZ0ID09PSByaWdodCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIC8qIElmIHR3byByZW1vdGFibGVzIGFyZSBub3QgaWRlbnRpY2FsLCB0aGVuIGFzIGtleXMgdGhleSBhcmUqL1xuICAgICAgLyogaW5jb21tZW5zdXJhdGUuKi9cbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgIC8qIExleGljb2dyYXBoaWMgYnkga2V5IG9yZGVyLiBSYW5rIG9yZGVyIG9mIGFycmF5cyBpcyBsZXhpY29ncmFwaGljIGJ5Ki9cbiAgICAgIC8qIHJhbmsgb3JkZXIuKi9cbiAgICAgIC8qIEJlY2F1c2UgdGhlIGludmFyaWFudHMgYWJvdmUgYXBwbHkgdG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSwqL1xuICAgICAgLyogdGhleSBhcHBseSB0byB0aGUgYXJyYXkgYXMgYSB3aG9sZS4qL1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmVLZXlzKGxlZnRbaV0sIHJpZ2h0W2ldKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyBhcmUga2V5RVEsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbiAgICAgIC8qIFRodXMsIGlmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGlzIHNtYWxsZXIgdGhhbiBZLiovXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIHJldHVybiBjb21wYXJlUmFuayhsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICB9XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIC8qIFBhcmV0byBwYXJ0aWFsIG9yZGVyIGNvbXBhcmlzb24uKi9cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgbGVmdE5hbWVzID0gcmVjb3JkTmFtZXMobGVmdCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IHJpZ2h0TmFtZXMgPSByZWNvcmROYW1lcyhyaWdodCk7XG5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBpZiAoIWtleUVRKGxlZnROYW1lcywgcmlnaHROYW1lcykpIHtcbiAgICAgICAgLyogSWYgdGhleSBkbyBub3QgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnRpZXMsKi9cbiAgICAgICAgLyogdGhleSBhcmUgaW5jb21tZW5zdXJhdGUuKi9cbiAgICAgICAgLyogTm90ZSB0aGF0IHJhbmsgc29ydGluZyBvZiBjb3B5UmVjb3JkcyBncm91cHMgYWxsIGNvcHlSZWNvcmRzIHdpdGgqL1xuICAgICAgICAvKiB0aGUgc2FtZSBrZXlzIHRvZ2V0aGVyLCBlbmFibGluZyByYW5nZSBzZWFyY2hpbmcgb3ZlciBjb3B5UmVjb3JkcyovXG4gICAgICAgIC8qIHRvIGF2b2lkIG1vcmUgaXJyZWxldmFudCBvbmVzLiovXG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IGxlZnRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMobGVmdCwgbGVmdE5hbWVzKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgcmlnaHRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMocmlnaHQsIHJpZ2h0TmFtZXMpO1xuICAgICAgLyogUHJlc3VtZSB0aGF0IGJvdGggY29weVJlY29yZHMgaGF2ZSB0aGUgc2FtZSBrZXkgb3JkZXIqL1xuICAgICAgLyogdW50aWwgZW5jb3VudGVyaW5nIGEgcHJvcGVydHkgZGlzcHJvdmluZyB0aGF0IGh5cG90aGVzaXMuKi9cbiAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWZ0VmFsdWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlS2V5cyhsZWZ0VmFsdWVzW2ldLCByaWdodFZhbHVlc1tpXSk7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4oY29tcCkpIHtcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQgIT09IGNvbXAgJiYgY29tcCAhPT0gMCkge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbXA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgKHJlc3VsdCA9PT0gLTEgJiYgY29tcCA9PT0gMSkgfHwgKHJlc3VsdCA9PT0gMSAmJiBjb21wID09PSAtMSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qIElmIGNvcHlSZWNvcmQgWCBpcyBzbWFsbGVyIHRoYW4gY29weVJlY29yZCBZLCB0aGVuIHRoZXkgbXVzdCBoYXZlIHRoZSovXG4gICAgICAvKiBzYW1lIHByb3BlcnR5IG5hbWVzIGFuZCBldmVyeSB2YWx1ZSBpbiBYIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byovXG4gICAgICAvKiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiBZICh3aXRoIGF0IGxlYXN0IG9uZSB2YWx1ZSBzbWFsbGVyKS4qL1xuICAgICAgLyogVGhlIHJhbmsgb3JkZXIgb2YgWCBhbmQgWSBpcyBiYXNlZCBvbiBsZXhpY29ncmFwaGljIHJhbmsgb3JkZXIgb2YqL1xuICAgICAgLyogdGhlaXIgdmFsdWVzLCBhcyBvcmdhbml6ZWQgYnkgcmV2ZXJzZSBsZXhpY29ncmFwaGljIG9yZGVyIG9mIHRoZWlyKi9cbiAgICAgIC8qIHByb3BlcnR5IG5hbWVzLiovXG4gICAgICAvKiBUaHVzIGlmIGNvbXBhcmVLZXlzKFgsWSkgPCAwIHRoZW4gY29tcGFyZVJhbmsoWCxZKSA8IDAuKi9cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgbGVmdFRhZyA9IGdldFRhZyhsZWZ0KTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgcmlnaHRUYWcgPSBnZXRUYWcocmlnaHQpO1xuICAgICAgaWYgKGxlZnRUYWcgIT09IHJpZ2h0VGFnKSB7XG4gICAgICAgIC8qIGRpZmZlcmVudCB0YWdzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGxlZnRUYWcpIHtcbiAgICAgICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgICAgICByZXR1cm4gc2V0Q29tcGFyZShsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgICAgICByZXR1cm4gYmFnQ29tcGFyZShsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgICAvKiBUT0RPIFRoZSBkZXNpcmVkIHNlbWFudGljcyBmb3IgQ29weU1hcCBjb21wYXJpc29uIGhhdmUgbm90IHlldCBiZWVuIGRlY2lkZWQuKi9cbiAgICAgICAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTczNyNwdWxscmVxdWVzdHJldmlldy0xNTk2NTk1NDExKi9cbiAgICAgICAgICB0aHJvdyBGYWlsYE1hcCBjb21wYXJpc29uIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7bGVmdH0gdnMgJHtyaWdodH1gO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBGYWlsYHVuZXhwZWN0ZWQgdGFnICR7cShsZWZ0VGFnKX06ICR7bGVmdH1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IEZhaWxgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKGxlZnRTdHlsZSl9OiAke2xlZnR9YDtcbiAgICB9XG4gIH1cbn07JGjNj19vbmNlLmNvbXBhcmVLZXlzKGNvbXBhcmVLZXlzKTtcbmhhcmRlbihjb21wYXJlS2V5cyk7XG5cbiAgICAgICBjb25zdCBrZXlMVCA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpIDwgMDskaM2PX29uY2Uua2V5TFQoa2V5TFQpO1xuaGFyZGVuKGtleUxUKTtcblxuICAgICAgIGNvbnN0IGtleUxURSA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpIDw9IDA7JGjNj19vbmNlLmtleUxURShrZXlMVEUpO1xuaGFyZGVuKGtleUxURSk7XG5cbiAgICAgICBjb25zdCBrZXlFUSA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID09PSAwOyRozY9fb25jZS5rZXlFUShrZXlFUSk7XG5oYXJkZW4oa2V5RVEpO1xuXG4gICAgICAgY29uc3Qga2V5R1RFID0gKGxlZnQsIHJpZ2h0KSA9PiBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPj0gMDskaM2PX29uY2Uua2V5R1RFKGtleUdURSk7XG5oYXJkZW4oa2V5R1RFKTtcblxuICAgICAgIGNvbnN0IGtleUdUID0gKGxlZnQsIHJpZ2h0KSA9PiBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPiAwOyRozY9fb25jZS5rZXlHVChrZXlHVCk7XG5oYXJkZW4oa2V5R1QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0Q29tcGFyZSI6WyJzZXRDb21wYXJlIl0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSJdLCJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyJdLCJrZXlMVCI6WyJrZXlMVCJdLCJrZXlMVEUiOlsia2V5TFRFIl0sImtleUVRIjpbImtleUVRIl0sImtleUdURSI6WyJrZXlHVEUiXSwia2V5R1QiOlsia2V5R1QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANFtTY00VAABNFQAAKQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb3B5QmFnLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRCYWdFbnRyaWVzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIiwiY2hlY2tCYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwibWFrZUJhZ09mRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcImlzUmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKiBAaW1wb3J0IHtDaGVja2VyLCBGdWxsQ29tcGFyZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCdcbiAqIEBpbXBvcnQge0NvcHlCYWcsIEtleX0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeVxuICoga25vd24gdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXRcbiAqIHJhdGhlciB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlXG4gKiBhcnJheSBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZS1rZXlzIGZpbmRpbmcgYXMgd2VsbCwgaW5kZXBlbmRlbnRcbiAqIG9mIHRoZSBgZnVsbE9yZGVyYCB1c2UgdG8gcmVhY2ggdGhpcyBmaW5kaW5nLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVLZXlzID0gKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlLCBjaGVjaykgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4gIC8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbiAgLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG4gIGZ1bGxDb21wYXJlID0gZnVsbENvbXBhcmUgfHwgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuICAvKiBTaW5jZSB0aGUga2V5IGlzIG1vcmUgc2lnbmlmaWNhbnQgdGhhbiB0aGUgdmFsdWUgKHRoZSBjb3VudCksKi9cbiAgLyogc29ydGluZyBieSBmdWxsT3JkZXIgaXMgZ3VhcmFudGVlZCB0byBtYWtlIGR1cGxpY2F0ZSBrZXlzKi9cbiAgLyogYWRqYWNlbnQgaW5kZXBlbmRlbnQgb2YgdGhlaXIgY291bnRzLiovXG4gIGJhZ0VudHJpZXMgPSBzb3J0QnlSYW5rKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGJhZ0VudHJpZXM7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBrMCA9IGJhZ0VudHJpZXNbaSAtIDFdWzBdO1xuICAgIGNvbnN0IGsxID0gYmFnRW50cmllc1tpXVswXTtcbiAgICBpZiAoZnVsbENvbXBhcmUoazAsIGsxKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYHZhbHVlIGhhcyBkdXBsaWNhdGUga2V5czogJHtrMH1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gW2Z1bGxDb21wYXJlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnROb0R1cGxpY2F0ZUtleXMgPSAoYmFnRW50cmllcywgZnVsbENvbXBhcmUgPSB1bmRlZmluZWQpID0+IHtcbiAgY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcywgZnVsbENvbXBhcmUsIGFzc2VydENoZWNrZXIpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1tQYXNzYWJsZSxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjNj19vbmNlLmFzc2VydE5vRHVwbGljYXRlS2V5cyhhc3NlcnROb0R1cGxpY2F0ZUtleXMpO1xuICAgICAgIGNvbnN0IGNoZWNrQmFnRW50cmllcyA9IChiYWdFbnRyaWVzLCBjaGVjaykgPT4ge1xuICBpZiAocGFzc1N0eWxlT2YoYmFnRW50cmllcykgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCxcbiAgICApO1xuICB9XG4gIGlmICghaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsIGNvbXBhcmVBbnRpUmFuaykpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtiYWdFbnRyaWVzfWAsXG4gICAgKTtcbiAgfVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGJhZ0VudHJpZXMpIHtcbiAgICBpZiAoXG4gICAgICBwYXNzU3R5bGVPZihlbnRyeSkgIT09ICdjb3B5QXJyYXknIHx8XG4gICAgICBlbnRyeS5sZW5ndGggIT09IDIgfHxcbiAgICAgIHR5cGVvZiBlbnRyeVsxXSAhPT0gJ2JpZ2ludCdcbiAgICApIHtcbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGVudHJ5WzFdIDwgMSkge1xuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggS2V5IHR5cGVzKi9cbiAgcmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsIHVuZGVmaW5lZCwgY2hlY2spO1xufTskaM2PX29uY2UuY2hlY2tCYWdFbnRyaWVzKGNoZWNrQmFnRW50cmllcyk7XG5oYXJkZW4oY2hlY2tCYWdFbnRyaWVzKTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJucy1jaGVjayAtLSBkb2Vzbid0IHVuZGVyc3RhbmQgYXNzZXJ0cyovXG4vKipcbiAqIEBwYXJhbSB7W1Bhc3NhYmxlLGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHJldHVybnMge2Fzc2VydHMgYmFnRW50cmllcyBpcyBbUGFzc2FibGUsYmlnaW50XVtdfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0QmFnRW50cmllcyA9IGJhZ0VudHJpZXMgPT4ge1xuICBjaGVja0JhZ0VudHJpZXMoYmFnRW50cmllcywgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRCYWdFbnRyaWVzKGFzc2VydEJhZ0VudHJpZXMpO1xuaGFyZGVuKGFzc2VydEJhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBiaWdpbnRdPn0gYmFnRW50cmllc0xpc3RcbiAqL1xuICAgICAgIGNvbnN0IGNvZXJjZVRvQmFnRW50cmllcyA9IGJhZ0VudHJpZXNMaXN0ID0+IHtcbiAgY29uc3QgYmFnRW50cmllcyA9IHNvcnRCeVJhbmsoYmFnRW50cmllc0xpc3QsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGFzc2VydEJhZ0VudHJpZXMoYmFnRW50cmllcyk7XG4gIHJldHVybiBiYWdFbnRyaWVzO1xufTskaM2PX29uY2UuY29lcmNlVG9CYWdFbnRyaWVzKGNvZXJjZVRvQmFnRW50cmllcyk7XG5oYXJkZW4oY29lcmNlVG9CYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQmFnT2ZFbnRyaWVzID0gYmFnRW50cnlJdGVyID0+XG4gIG1ha2VUYWdnZWQoJ2NvcHlCYWcnLCBjb2VyY2VUb0JhZ0VudHJpZXMoYmFnRW50cnlJdGVyKSk7JGjNj19vbmNlLm1ha2VCYWdPZkVudHJpZXMobWFrZUJhZ09mRW50cmllcyk7XG5oYXJkZW4obWFrZUJhZ09mRW50cmllcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIl0sImNoZWNrQmFnRW50cmllcyI6WyJjaGVja0JhZ0VudHJpZXMiXSwiYXNzZXJ0QmFnRW50cmllcyI6WyJhc3NlcnRCYWdFbnRyaWVzIl0sImNvZXJjZVRvQmFnRW50cmllcyI6WyJjb2VyY2VUb0JhZ0VudHJpZXMiXSwibWFrZUJhZ09mRW50cmllcyI6WyJtYWtlQmFnT2ZFbnRyaWVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACwjgyYsEQAALBEAACkAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29weVNldC5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0RWxlbWVudHMiLCJhc3NlcnROb0R1cGxpY2F0ZXMiLCJjaGVja0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyIsIm1ha2VTZXRPZkVsZW1lbnRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqIEBpbXBvcnQge0NoZWNrZXIsIEZ1bGxDb21wYXJlfSBmcm9tICdAZW5kby9tYXJzaGFsJ1xuICogQGltcG9ydCB7Q29weVNldCwgS2V5fSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBlbGVtZW50c2AgaXMgYWxyZWFkeSBrbm93blxuICogdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXQgcmF0aGVyXG4gKiB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlIGFycmF5XG4gKiBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZSBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlcyA9IChlbGVtZW50cywgZnVsbENvbXBhcmUsIGNoZWNrKSA9PiB7XG4gIC8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4gIC8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbiAgLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuICAvKiBsaW5lIHNob3VsZCBiZSByZXdyaXR0ZW4gdXNpbmcgaXQuKi9cbiAgZnVsbENvbXBhcmUgPSBmdWxsQ29tcGFyZSB8fCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIGVsZW1lbnRzID0gc29ydEJ5UmFuayhlbGVtZW50cywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gZWxlbWVudHM7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBrMCA9IGVsZW1lbnRzW2kgLSAxXTtcbiAgICBjb25zdCBrMSA9IGVsZW1lbnRzW2ldO1xuICAgIGlmIChmdWxsQ29tcGFyZShrMCwgazEpID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydE5vRHVwbGljYXRlcyA9IChlbGVtZW50cywgZnVsbENvbXBhcmUgPSB1bmRlZmluZWQpID0+IHtcbiAgY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsIGZ1bGxDb21wYXJlLCBhc3NlcnRDaGVja2VyKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaM2PX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVzKGFzc2VydE5vRHVwbGljYXRlcyk7XG4gICAgICAgY29uc3QgY2hlY2tFbGVtZW50cyA9IChlbGVtZW50cywgY2hlY2spID0+IHtcbiAgaWYgKHBhc3NTdHlsZU9mKGVsZW1lbnRzKSAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtlbGVtZW50c31gLFxuICAgICk7XG4gIH1cbiAgaWYgKCFpc1JhbmtTb3J0ZWQoZWxlbWVudHMsIGNvbXBhcmVBbnRpUmFuaykpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsIHVuZGVmaW5lZCwgY2hlY2spO1xufTskaM2PX29uY2UuY2hlY2tFbGVtZW50cyhjaGVja0VsZW1lbnRzKTtcbmhhcmRlbihjaGVja0VsZW1lbnRzKTtcblxuICAgICAgIGNvbnN0IGFzc2VydEVsZW1lbnRzID0gZWxlbWVudHMgPT4ge1xuICBjaGVja0VsZW1lbnRzKGVsZW1lbnRzLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEVsZW1lbnRzKGFzc2VydEVsZW1lbnRzKTtcbmhhcmRlbihhc3NlcnRFbGVtZW50cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRzTGlzdFxuICovXG4gICAgICAgY29uc3QgY29lcmNlVG9FbGVtZW50cyA9IGVsZW1lbnRzTGlzdCA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gc29ydEJ5UmFuayhlbGVtZW50c0xpc3QsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGFzc2VydEVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgcmV0dXJuIGVsZW1lbnRzO1xufTskaM2PX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVNldE9mRWxlbWVudHMgPSBlbGVtZW50SXRlciA9PlxuICBtYWtlVGFnZ2VkKCdjb3B5U2V0JywgY29lcmNlVG9FbGVtZW50cyhlbGVtZW50SXRlcikpOyRozY9fb25jZS5tYWtlU2V0T2ZFbGVtZW50cyhtYWtlU2V0T2ZFbGVtZW50cyk7XG5oYXJkZW4obWFrZVNldE9mRWxlbWVudHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVzIjpbImFzc2VydE5vRHVwbGljYXRlcyJdLCJjaGVja0VsZW1lbnRzIjpbImNoZWNrRWxlbWVudHMiXSwiYXNzZXJ0RWxlbWVudHMiOlsiYXNzZXJ0RWxlbWVudHMiXSwiY29lcmNlVG9FbGVtZW50cyI6WyJjb2VyY2VUb0VsZW1lbnRzIl0sIm1ha2VTZXRPZkVsZW1lbnRzIjpbIm1ha2VTZXRPZkVsZW1lbnRzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANs1mkDDIgAAwyIAADkAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzIiwiQGVuZG8vY29tbW9uL21ha2UtYXJyYXktaXRlcmF0b3IuanMiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyIsIm1ha2VDb21wYXJlQ29sbGVjdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssbWFrZUl0ZXJhdG9yLG1ha2VBcnJheUl0ZXJhdG9yLHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIixbJGjNj19hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL21ha2UtaXRlcmF0b3IuanNcIiwgW1tcIm1ha2VJdGVyYXRvclwiLFskaM2PX2EgPT4gKG1ha2VJdGVyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzXCIsIFtbXCJtYWtlQXJyYXlJdGVyYXRvclwiLFskaM2PX2EgPT4gKG1ha2VBcnJheUl0ZXJhdG9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogUmVmaW5lcyBhIHNlcXVlbmNlIG9mIGVudHJpZXMgdGhhdCBpcyBhbHJlYWR5IHNvcnRlZCBvdmVyIGl0cyBrZXlzIGJ5IHRoZVxuICogYHJhbmtDb21wYXJlYCBwcmVvcmRlciwgd2hlcmUgdGhlcmUgbWF5IGJlIGludGVybmFsIHJ1bnMgdGllZCBmb3IgdGhlIHNhbWVcbiAqIHJhbmssIGludG8gYW4gaXRlcmFibGUgdGhhdCByZXNvbHZlcyB0aG9zZSB0aWVzIHVzaW5nIGBmdWxsQ29tcGFyZWAuXG4gKlxuICogQHRlbXBsYXRlIFtWPXVua25vd25dXG4gKiBAcGFyYW0ge0FycmF5PFtLZXksIFZdPn0gZW50cmllc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGVJdGVyYXRvcjxbS2V5LCBWXT59XG4gKi9cbmNvbnN0IGdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXMgPSAoZW50cmllcywgcmFua0NvbXBhcmUsIGZ1bGxDb21wYXJlKSA9PiB7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIEtleSB0eXBlcyovXG4gIGFzc2VydFJhbmtTb3J0ZWQoZW50cmllcywgcmFua0NvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gZW50cmllcztcbiAgbGV0IGkgPSAwO1xuICBsZXQgc2FtZVJhbmtJdGVyYXRvcjtcbiAgcmV0dXJuIG1ha2VJdGVyYXRvcigoKSA9PiB7XG4gICAgaWYgKHNhbWVSYW5rSXRlcmF0b3IpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNhbWVSYW5rSXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKCFyZXN1bHQuZG9uZSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgc2FtZVJhbmtJdGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXTtcbiAgICAgIC8qIExvb2sgYWhlYWQgZm9yIHNhbWUtcmFuayB0aWVzLiovXG4gICAgICBsZXQgaiA9IGkgKyAxO1xuICAgICAgd2hpbGUgKGogPCBsZW5ndGggJiYgcmFua0NvbXBhcmUoZW50cnlbMF0sIGVudHJpZXNbal1bMF0pID09PSAwKSB7XG4gICAgICAgIGogKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChqID09PSBpICsgMSkge1xuICAgICAgICAvKiBObyB0aWVzIGZvdW5kLiovXG4gICAgICAgIGkgPSBqO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBlbnRyeSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRpZXMgPSBlbnRyaWVzLnNsaWNlKGksIGopO1xuICAgICAgaSA9IGo7XG5cbiAgICAgIC8qIFNvcnQgdGhlIHRpZXMgYnkgYGZ1bGxDb21wYXJlYCwgZW5mb3JjZSBrZXkgdW5pcXVlbmVzcywgYW5kIGRlbGVnYXRlIHRvKi9cbiAgICAgIC8qIGEgc3ViLWl0ZXJhdG9yLiovXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBLZXkgdHlwZXMqL1xuICAgICAgY29uc3Qgc29ydGVkVGllcyA9IHNvcnRCeVJhbmsodGllcywgZnVsbENvbXBhcmUpO1xuICAgICAgZm9yIChsZXQgayA9IDE7IGsgPCBzb3J0ZWRUaWVzLmxlbmd0aDsgayArPSAxKSB7XG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIEtleSB0eXBlcyovXG4gICAgICAgIGNvbnN0IFtrZXkwXSA9IHNvcnRlZFRpZXNbayAtIDFdO1xuICAgICAgICBjb25zdCBba2V5MV0gPSBzb3J0ZWRUaWVzW2tdO1xuICAgICAgICBNYXRoLnNpZ24oZnVsbENvbXBhcmUoa2V5MCwga2V5MSkpIHx8XG4gICAgICAgICAgRmFpbGBEdXBsaWNhdGUgZW50cnkga2V5OiAke2tleTB9YDtcbiAgICAgIH1cbiAgICAgIHNhbWVSYW5rSXRlcmF0b3IgPSBtYWtlQXJyYXlJdGVyYXRvcihzb3J0ZWRUaWVzKTtcbiAgICAgIHJldHVybiBzYW1lUmFua0l0ZXJhdG9yLm5leHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gIH0pO1xufTtcbmhhcmRlbihnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgbWVyZ2VzIHJldmVyc2UtcmFuay1zb3J0ZWQgW2tleSwgdmFsdWVdIGVudHJpZXMgb2ZcbiAqIHR3byBLZXlDb2xsZWN0aW9ucyBpbnRvIGEgcmV2ZXJzZS1mdWxsLXNvcnRlZCBba2V5LCB2YWx1ZTEsIHZhbHVlMl0gZW50cmllc1xuICogYnkgdGhlIGtleSB0aGV5IGhhdmUgaW4gY29tbW9uLCByZXByZXNlbnRpbmcgdGhlIHZhbHVlIGZvciBhbiBhYnNlbnQgZW50cnkgaW5cbiAqIGVpdGhlciBjb2xsZWN0aW9uIGFzIGBhYnNlbnRWYWx1ZWAuXG4gKlxuICogQHRlbXBsYXRlIFtDPUtleUNvbGxlY3Rpb25dXG4gKiBAdGVtcGxhdGUgW1Y9dW5rbm93bl1cbiAqIEBwYXJhbSB7Q30gYzFcbiAqIEBwYXJhbSB7Q30gYzJcbiAqIEBwYXJhbSB7KGNvbGxlY3Rpb246IEMpID0+IEFycmF5PFtLZXksIFZdPn0gZ2V0RW50cmllc1xuICogQHBhcmFtIHthbnl9IGFic2VudFZhbHVlXG4gKiBAcmV0dXJucyB7SXRlcmFibGVJdGVyYXRvcjxbS2V5LCBWIHwgYWJzZW50VmFsdWUsIFYgfCBhYnNlbnRWYWx1ZV0+fVxuICovXG4gICAgICAgY29uc3QgZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMgPSAoXG4gIGMxLFxuICBjMixcbiAgZ2V0RW50cmllcyxcbiAgYWJzZW50VmFsdWUsXG4pID0+IHtcbiAgY29uc3QgZTEgPSBnZXRFbnRyaWVzKGMxKTtcbiAgY29uc3QgZTIgPSBnZXRFbnRyaWVzKGMyKTtcblxuICAvKiBFc3RhYmxpc2ggYSBoaXN0b3J5LWRlcGVuZGVudCBjb21wYXJpc29uIHNjb3BlZCB0byB0aGUgYWN0aXZlIGludm9jYXRpb24qL1xuICAvKiBhbmQgdXNlIGl0IHRvIG1hcCByZXZlcnNlLXByZW9yZGVyZWQgZW50cmllcyBpbnRvIGFuIGl0ZXJhdG9yIHdpdGggYSovXG4gIC8qIG5hcnJvd2VyIHRvdGFsIG9yZGVyLiovXG4gIGNvbnN0IGZ1bGxDb21wYXJlID0gbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcbiAgY29uc3QgeCA9IGdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXMoZTEsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB5ID0gZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyhlMiwgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG5cbiAgLyogTWFpbnRhaW4gYSBzaW5nbGUtcmVzdWx0IHsgZG9uZSwga2V5LCB2YWx1ZSB9IGJ1ZmZlciBmb3IgZWFjaCBpdGVyYXRvciovXG4gIC8qIHNvIHRoZXkgY2FuIGJlIG1lcmdlZC4qL1xuICBsZXQgeERvbmU7XG4gIGxldCB4S2V5O1xuICBsZXQgeFZhbHVlO1xuICBsZXQgeURvbmU7XG4gIGxldCB5S2V5O1xuICBsZXQgeVZhbHVlO1xuICBjb25zdCBub25FbnRyeSA9IFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG4gIGNvbnN0IG5leHRYID0gKCkgPT4ge1xuICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICBjb25zdCByZXN1bHQgPSB4VmFsdWU7XG4gICAgKHsgZG9uZTogeERvbmUsIHZhbHVlOiBbeEtleSwgeFZhbHVlXSA9IG5vbkVudHJ5IH0gPSB4Lm5leHQoKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbmV4dFgoKTtcbiAgY29uc3QgbmV4dFkgPSAoKSA9PiB7XG4gICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIG11c3Qgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgIGNvbnN0IHJlc3VsdCA9IHlWYWx1ZTtcbiAgICAoeyBkb25lOiB5RG9uZSwgdmFsdWU6IFt5S2V5LCB5VmFsdWVdID0gbm9uRW50cnkgfSA9IHkubmV4dCgpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBuZXh0WSgpO1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIC8qKiBAdHlwZSB7W0tleSwgViB8IGFic2VudFZhbHVlLCBWIHwgYWJzZW50VmFsdWVdfSAqL1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoeERvbmUgJiYgeURvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgdmFsdWUgPSBbdW5kZWZpbmVkLCBhYnNlbnRWYWx1ZSwgYWJzZW50VmFsdWVdO1xuICAgIH0gZWxzZSBpZiAoeERvbmUpIHtcbiAgICAgIHZhbHVlID0gW3lLZXksIGFic2VudFZhbHVlLCBuZXh0WSgpXTtcbiAgICB9IGVsc2UgaWYgKHlEb25lKSB7XG4gICAgICB2YWx1ZSA9IFt4S2V5LCBuZXh0WCgpLCBhYnNlbnRWYWx1ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIENvbXBhcmUgdGhlIGtleXMgdG8gZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCByZXR1cm4gYSBtZXJnZWQgcmVzdWx0Ki9cbiAgICAgIC8qIG9yIGEgb25lLXNpZGVkIHJlc3VsdC4qL1xuICAgICAgY29uc3QgY29tcCA9IGZ1bGxDb21wYXJlKHhLZXksIHlLZXkpO1xuICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgdmFsdWUgPSBbeEtleSwgbmV4dFgoKSwgbmV4dFkoKV07XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgIHZhbHVlID0gW3hLZXksIG5leHRYKCksIGFic2VudFZhbHVlXTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA+IDApIHtcbiAgICAgICAgdmFsdWUgPSBbeUtleSwgYWJzZW50VmFsdWUsIG5leHRZKCldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRmFpbGBVbmV4cGVjdGVkIGtleSBjb21wYXJpc29uICR7cShjb21wKX0gZm9yICR7eEtleX0gdnMgJHt5S2V5fWA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oeyBkb25lLCB2YWx1ZSB9KTtcbiAgfSk7XG59OyRozY9fb25jZS5nZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyk7XG5oYXJkZW4oZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMpO1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiBmb3IgY29tcGFyaW5nIHR3byBLZXlDb2xsZWN0aW9ucyBvZiB0aGUgc2FtZSB0eXBlIHVzaW5nXG4gKiB0aGUgcHJvdmlkZWQgZW50cmllcyBmYWN0b3J5IGFuZCBzYW1lLWtleSBlbnRyeSB2YWx1ZSBjb21wYXJhdG9yICh3aGVyZSB0aGVcbiAqIHZhbHVlIGZvciBhbiBhYnNlbnQgZW50cnkgaW4gb25lIGNvbGxlY3Rpb24gaXMgYGFic2VudFZhbHVlYCkuXG4gKlxuICogSWYgdGhlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBmb3IgYW55IHNpbmdsZSBrZXkgYXJlIGluY29tcGFyYWJsZSBvciB0aGVcbiAqIGNvbXBhcmlzb24gcmVzdWx0IGhhcyB0aGUgb3Bwb3NpdGUgc2lnbiBvZiB0aGUgcmVzdWx0IGZvciBhIGRpZmZlcmVudCBrZXksXG4gKiB0aGVuIHRoZSBLZXlDb2xsZWN0aW9ucyBhcmUgaW5jb21wYXJhYmxlLiBPdGhlcndpc2UsIHRoZSBjb2xsZWN0aW9ucyBjb21wYXJlXG4gKiBieSB0aGUgcmVzdWx0IG9mIGFueSBub24tZXF1YWwgZW50cnkgY29tcGFyaXNvbiwgb3IgY29tcGFyZSBlcXVhbCBpZiB0aGVyZSBpc1xuICogbm8gbm9uLWVxdWFsIGVudHJ5IGNvbXBhcmlzb24gcmVzdWx0LlxuICogRm9yIGV4YW1wbGUsIGdpdmVuIENvcHlCYWdzIFggYW5kIFkgYW5kIGEgdmFsdWUgY29tcGFyYXRvciB0aGF0IGdvZXMgYnkgY291bnRcbiAqIChkZWZhdWx0aW5nIGFic2VudCBrZXlzIHRvIGEgY291bnQgb2YgMCksIFggaXMgc21hbGxlciB0aGFuIFkgKGByZXN1bHQgPCAwYClcbiAqIGlmZiB0aGVyZSBhcmUgbm8ga2V5cyBpbiBYIHRoYXQgYXJlIGVpdGhlciBhYnNlbnQgZnJvbSBZXG4gKiAoYGNvbXBhcmVWYWx1ZXMoeENvdW50LCBhYnNlbnRWYWx1ZSkgPiAwYCkgb3IgcHJlc2VudCBpbiBZIHdpdGggYSBsb3dlciBjb3VudFxuICogKGBjb21wYXJlVmFsdWVzKHhDb3VudCwgeUNvdW50KSA+IDBgKSBBTkQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGtleSBpbiBZIHRoYXRcbiAqIGlzIGVpdGhlciBhYnNlbnQgZnJvbSBYIChgY29tcGFyZVZhbHVlcyhhYnNlbnRWYWx1ZSwgeUNvdW50KSA8IDBgKSBvciBwcmVzZW50XG4gKiB3aXRoIGEgbG93ZXIgY291bnQgKGBjb21wYXJlVmFsdWVzKHhDb3VudCwgeUNvdW50KSA8IDBgKS5cbiAqXG4gKiBUaGlzIGNhbiBiZSBnZW5lcmFsaXplZCB0byB2aXJ0dWFsIGNvbGxlY3Rpb25zIGluIHRoZSBmdXR1cmUgYnkgcmVwbGFjaW5nXG4gKiBgZ2V0RW50cmllcyA9PiBBcnJheWAgd2l0aCBgZ2VuZXJhdGVFbnRyaWVzID0+IEl0ZXJhYmxlSXRlcmF0b3JgLlxuICpcbiAqIEB0ZW1wbGF0ZSBbQz1LZXlDb2xsZWN0aW9uXVxuICogQHRlbXBsYXRlIFtWPXVua25vd25dXG4gKiBAcGFyYW0geyhjb2xsZWN0aW9uOiBDKSA9PiBBcnJheTxbS2V5LCBWXT59IGdldEVudHJpZXNcbiAqIEBwYXJhbSB7Vn0gYWJzZW50VmFsdWVcbiAqIEBwYXJhbSB7S2V5Q29tcGFyZX0gY29tcGFyZVZhbHVlc1xuICogQHJldHVybnMgeyhsZWZ0OiBDLCByaWdodDogQykgPT4gS2V5Q29tcGFyaXNvbn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb21wYXJlQ29sbGVjdGlvbiA9IChnZXRFbnRyaWVzLCBhYnNlbnRWYWx1ZSwgY29tcGFyZVZhbHVlcykgPT5cbiAgaGFyZGVuKChsZWZ0LCByaWdodCkgPT4ge1xuICAgIGNvbnN0IG1lcmdlZCA9IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKFxuICAgICAgbGVmdCxcbiAgICAgIHJpZ2h0LFxuICAgICAgZ2V0RW50cmllcyxcbiAgICAgIGFic2VudFZhbHVlLFxuICAgICk7XG4gICAgbGV0IGxlZnRJc0JpZ2dlciA9IGZhbHNlO1xuICAgIGxldCByaWdodElzQmlnZ2VyID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBbX2tleSwgbGVmdFZhbHVlLCByaWdodFZhbHVlXSBvZiBtZXJnZWQpIHtcbiAgICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlVmFsdWVzKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7XG4gICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWUqL1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgLyogQmFzZWQgb24gdGhpcyBrZXksIGxlZnQgPCByaWdodC4qL1xuICAgICAgICByaWdodElzQmlnZ2VyID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA+IDApIHtcbiAgICAgICAgLyogQmFzZWQgb24gdGhpcyBrZXksIGxlZnQgPiByaWdodC4qL1xuICAgICAgICBsZWZ0SXNCaWdnZXIgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTnVtYmVyLmlzTmFOKGNvbXApIHx8XG4gICAgICAgICAgLyogcHJldHRpZXItaWdub3JlKi9cbiAgICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgdmFsdWUgY29tcGFyaXNvbiAke3EoY29tcCl9IGZvciAke2xlZnRWYWx1ZX0gdnMgJHtyaWdodFZhbHVlfWA7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgICBpZiAobGVmdElzQmlnZ2VyICYmIHJpZ2h0SXNCaWdnZXIpIHtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbiAgICByZXR1cm4gbGVmdElzQmlnZ2VyID8gMSA6IHJpZ2h0SXNCaWdnZXIgPyAtMSA6IDA7XG4gIH0pOyRozY9fb25jZS5tYWtlQ29tcGFyZUNvbGxlY3Rpb24obWFrZUNvbXBhcmVDb2xsZWN0aW9uKTtcbmhhcmRlbihtYWtlQ29tcGFyZUNvbGxlY3Rpb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMiOlsiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMiXSwibWFrZUNvbXBhcmVDb2xsZWN0aW9uIjpbIm1ha2VDb21wYXJlQ29sbGVjdGlvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACZxDgBVygAAFcoAAA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyIsIi4vY29weUJhZy5qcyJdLCJleHBvcnRzIjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJc0Rpc2pvaW50IiwiYmFnSXNTdXBlcmJhZyIsImJhZ1VuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxxLEZhaWwsYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzLG1ha2VCYWdPZkVudHJpZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlS2V5c1wiLFskaM2PX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlS2V5cyA9ICRozY9fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsWyRozY9fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtGdWxsQ29tcGFyZSwgUmFua0NvbXBhcmV9IGZyb20gJ0BlbmRvL21hcnNoYWwnXG4gKiBAaW1wb3J0IHtLZXl9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qIEJhc2VkIG9uIG1lcmdlLXNldC1vcGVyYXRvcnMuanMsIGJ1dCBhbHRlcmVkIGZvciB0aGUgYmFnIHJlcHJlc2VudGF0aW9uLiovXG4vKiBUT0RPIHNoYXJlIG1vcmUgY29kZSB3aXRoIHRoYXQgZmlsZSBhbmQga2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMuKi9cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHkgcmFuayBzb3J0ZWQgYnkgYHJhbmtDb21wYXJlYCwgd2hlcmVcbiAqIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGJhZ0VudHJpZXMgd2hvc2Uga2V5cyBhcmUgdGllZCBmb3IgdGhlIHNhbWVcbiAqIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBiYWdFbnRyaWVzIGluIG9yZGVyXG4gKiBhY2NvcmRpbmcgdG8gYGZ1bGxPcmRlcmAsIHdoaWNoIHNob3VsZCBkaWZmZXIgZnJvbSBgcmFua09yZGVyYCBvbmx5XG4gKiBieSBiZWluZyBtb3JlIHByZWNpc2UuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byByZXNvcnRpbmcgdGhlIGVudGlyZSBgYmFnRW50cmllc2AgYXJyYXlcbiAqIGFjY29yZGluZ1xuICogdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIHtLZXl9IFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgYmFnV2luZG93UmVzb3J0ID0gKGJhZ0VudHJpZXMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKGJhZ0VudHJpZXMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGJhZ0VudHJpZXM7XG4gIGxldCBpID0gMDtcbiAgbGV0IG9wdElubmVySXRlcmF0b3I7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PlxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChvcHRJbm5lckl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2gqL1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYmFnRW50cmllc1tpXTtcbiAgICAgICAgICAgIGxldCBqID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgIGogPCBsZW5ndGggJiZcbiAgICAgICAgICAgICAgcmFua0NvbXBhcmUoZW50cnlbMF0sIGJhZ0VudHJpZXNbal1bMF0pID09PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaiArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPT09IGkgKyAxKSB7XG4gICAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBlbnRyeSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNpbWlsYXJSdW4gPSBiYWdFbnRyaWVzLnNsaWNlKGksIGopO1xuICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICBjb25zdCByZXNvcnRlZCA9IHNvcnRCeVJhbmsoc2ltaWxhclJ1biwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgICAgLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuICAgICAgICAgICAgLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuICAgICAgICAgICAgLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuICAgICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKHJlc29ydGVkLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSByYXcgSlMgYXJyYXkgaXRlcmF0b3Igd2hvc2UgYC5uZXh0KClgIG1ldGhvZCovXG4gICAgICAgICAgICAvKiBkb2VzIG5vdCBoYXJkZW4gdGhlIEl0ZXJhdG9yUmVzdWx0LCBpbiB2aW9sYXRpb24gb2Ygb3VyKi9cbiAgICAgICAgICAgIC8qIGNvbnZlbnRpb25zLiBGaXhpbmcgdGhpcyBpcyBleHBlbnNpdmUgYW5kIEknbSBjb25maWRlbnQgdGhlKi9cbiAgICAgICAgICAgIC8qIHVuZnJvemVuIHZhbHVlIGRvZXMgbm90IGVzY2FwZSB0aGlzIGZpbGUsIHNvIEknbSBsZWF2aW5nIHRoaXMqL1xuICAgICAgICAgICAgLyogYXMgaXMuKi9cbiAgICAgICAgICAgIG9wdElubmVySXRlcmF0b3IgPSByZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgICAgICByZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogW251bGwsIDBuXSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB5YmFnRW50cmllc1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2UgPSAoeGJhZ0VudHJpZXMsIHliYWdFbnRyaWVzKSA9PiB7XG4gIC8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4gIC8qIHRvIHRoaXMgb25lIGBtZXJnZWAgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgY29uc3QgeHMgPSBiYWdXaW5kb3dSZXNvcnQoeGJhZ0VudHJpZXMsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB5cyA9IGJhZ1dpbmRvd1Jlc29ydCh5YmFnRW50cmllcywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAvKiBUaGVzZSBzaXggYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuICAgICAgLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbiAgICAgIC8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuICAgICAgLyoqIEB0eXBlIHtUfSAqL1xuICAgICAgbGV0IHg7XG4gICAgICBsZXQgeGM7XG4gICAgICBsZXQgeERvbmU7XG4gICAgICAvKiogQHR5cGUge1R9ICovXG4gICAgICBsZXQgeTtcbiAgICAgIGxldCB5YztcbiAgICAgIGxldCB5RG9uZTtcblxuICAgICAgY29uc3QgeGkgPSB4c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBuZXh0WCA9ICgpID0+IHtcbiAgICAgICAgIXhEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgICAgICh7XG4gICAgICAgICAgZG9uZTogeERvbmUsXG4gICAgICAgICAgdmFsdWU6IFt4LCB4Y10sXG4gICAgICAgIH0gPSB4aS5uZXh0KCkpO1xuICAgICAgfTtcbiAgICAgIG5leHRYKCk7XG5cbiAgICAgIGNvbnN0IHlpID0geXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFkgPSAoKSA9PiB7XG4gICAgICAgICF5RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoe1xuICAgICAgICAgIGRvbmU6IHlEb25lLFxuICAgICAgICAgIHZhbHVlOiBbeSwgeWNdLFxuICAgICAgICB9ID0geWkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WSgpO1xuXG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIC8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG4gICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgIGlmICh4RG9uZSAmJiB5RG9uZSkge1xuICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG4gICAgICAgICAgICB2YWx1ZSA9IFtudWxsLCAwbiwgMG5dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeERvbmUpIHtcbiAgICAgICAgICAgIC8qIG9ubHkgeXMgYXJlIGxlZnQqL1xuICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIHljXTtcbiAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh5RG9uZSkge1xuICAgICAgICAgICAgLyogb25seSB4cyBhcmUgbGVmdCovXG4gICAgICAgICAgICB2YWx1ZSA9IFt4LCB4YywgMG5dO1xuICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29tcCA9IGZ1bGxDb21wYXJlKHgsIHkpO1xuICAgICAgICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgICAgICAgLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCB4YywgeWNdO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkge1xuICAgICAgICAgICAgICAvKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG4gICAgICAgICAgICAgIHZhbHVlID0gW3gsIHhjLCAwbl07XG4gICAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG4gICAgICAgICAgICAgIGNvbXAgPiAwIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbiAgICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIHljXTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmUsIHZhbHVlIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59O1xuaGFyZGVuKG1lcmdlKTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc1N1cGVyc2V0IGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgYmFnSXRlcklzU3VwZXJiYWcgPSB4eWkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPCB5Yykge1xuICAgICAgLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJiYWcgb2YgeSovXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc0Rpc2pvaW50IGFzIHdlbGwuKi9cbi8qIFRoZSBjb2RlIGlzIGlkZW50aWNhbC4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc0Rpc2pvaW50ID0geHlpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDFuICYmIHljID49IDFuKSB7XG4gICAgICAvKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludCxiaWdpbnRdW119IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlclVuaW9uID0geHlpID0+IHtcbiAgLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIHJlc3VsdC5wdXNoKFttLCB4YyArIHljXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJbnRlcnNlY3Rpb24gPSB4eWkgPT4ge1xuICAvKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgY29uc3QgbWMgPSB4YyA8PSB5YyA/IHhjIDogeWM7XG4gICAgcmVzdWx0LnB1c2goW20sIG1jXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0ID0geHlpID0+IHtcbiAgLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGNvbnN0IG1jID0geGMgLSB5YztcbiAgICBtYyA+PSAwbiB8fCBGYWlsYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuICAgIGlmIChtYyA+PSAxbikge1xuICAgICAgLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbiAgICAgIHJlc3VsdC5wdXNoKFttLCBtY10pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgbWVyZ2VpZnkgPSBiYWdJdGVyT3AgPT4gKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykgPT5cbiAgYmFnSXRlck9wKG1lcmdlKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykpO1xuXG5jb25zdCBiYWdFbnRyaWVzSXNTdXBlcmJhZyA9IG1lcmdlaWZ5KGJhZ0l0ZXJJc1N1cGVyYmFnKTtcbmNvbnN0IGJhZ0VudHJpZXNJc0Rpc2pvaW50ID0gbWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uID0gbWVyZ2VpZnkoYmFnSXRlclVuaW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24gPSBtZXJnZWlmeShiYWdJdGVySW50ZXJzZWN0aW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0ID0gbWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnkgPSBiYWdFbnRyaWVzT3AgPT4gKHhiYWcsIHliYWcpID0+XG4gIGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQsIHliYWcucGF5bG9hZCk7XG5cbmNvbnN0IGJhZ2lmeSA9IGJhZ0VudHJpZXNPcCA9PiAoeGJhZywgeWJhZykgPT5cbiAgbWFrZUJhZ09mRW50cmllcyhiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLCB5YmFnLnBheWxvYWQpKTtcblxuICAgICAgIGNvbnN0IGJhZ0lzU3VwZXJiYWcgPSByYXdCYWdpZnkoYmFnRW50cmllc0lzU3VwZXJiYWcpOyRozY9fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuICAgICAgIGNvbnN0IGJhZ0lzRGlzam9pbnQgPSByYXdCYWdpZnkoYmFnRW50cmllc0lzRGlzam9pbnQpOyRozY9fb25jZS5iYWdJc0Rpc2pvaW50KGJhZ0lzRGlzam9pbnQpO1xuICAgICAgIGNvbnN0IGJhZ1VuaW9uID0gYmFnaWZ5KGJhZ0VudHJpZXNVbmlvbik7JGjNj19vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbiAgICAgICBjb25zdCBiYWdJbnRlcnNlY3Rpb24gPSBiYWdpZnkoYmFnRW50cmllc0ludGVyc2VjdGlvbik7JGjNj19vbmNlLmJhZ0ludGVyc2VjdGlvbihiYWdJbnRlcnNlY3Rpb24pO1xuICAgICAgIGNvbnN0IGJhZ0Rpc2pvaW50U3VidHJhY3QgPSBiYWdpZnkoYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QpOyRozY9fb25jZS5iYWdEaXNqb2ludFN1YnRyYWN0KGJhZ0Rpc2pvaW50U3VidHJhY3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIl0sImJhZ0lzRGlzam9pbnQiOlsiYmFnSXNEaXNqb2ludCJdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiJdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIl0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB0H48ZZS8AAGUvAAA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyIsIi4vY29weVNldC5qcyJdLCJleHBvcnRzIjpbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFVuaW9uIiwic2V0SW50ZXJzZWN0aW9uIiwic2V0SXNEaXNqb2ludCIsInNldElzU3VwZXJzZXQiLCJzZXRVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmsscSxGYWlsLGFzc2VydE5vRHVwbGljYXRlcyxtYWtlU2V0T2ZFbGVtZW50czskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIixbJGjNj19hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVzXCIsWyRozY9fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVzID0gJGjNj19hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsWyRozY9fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7RnVsbENvbXBhcmUsIFJhbmtDb21wYXJlfSBmcm9tICdAZW5kby9tYXJzaGFsJ1xuICogQGltcG9ydCB7S2V5Q29tcGFyaXNvbn0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKi9cblxuLyogVE9ETyBzaGFyZSBtb3JlIGNvZGUgd2l0aCBrZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcy4qL1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgZWxlbWVudHNgIGlzIGFscmVhZHkgcmFuayBzb3J0ZWQgYnkgYHJhbmtDb21wYXJlYCwgd2hlcmUgdGhlcmVcbiAqIG1heSBiZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgZWxlbWVudHMgdGllZCBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCB3aWxsIGVudW1lcmF0ZSBhbGwgdGhlIGVsZW1lbnRzIGluIG9yZGVyXG4gKiBhY2NvcmRpbmcgdG8gYGZ1bGxPcmRlcmAsIHdoaWNoIHNob3VsZCBkaWZmZXIgZnJvbSBgcmFua09yZGVyYCBvbmx5XG4gKiBieSBiZWluZyBtb3JlIHByZWNpc2UuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byByZXNvcnRpbmcgdGhlIGVudGlyZSBgZWxlbWVudHNgIGFycmF5IGFjY29yZGluZ1xuICogIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0IHdpbmRvd1Jlc29ydCA9IChlbGVtZW50cywgcmFua0NvbXBhcmUsIGZ1bGxDb21wYXJlKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoZWxlbWVudHMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGVsZW1lbnRzO1xuICBsZXQgaSA9IDA7XG4gIGxldCBvcHRJbm5lckl0ZXJhdG9yO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT5cbiAgICAgIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAob3B0SW5uZXJJdGVyYXRvcikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoKi9cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnRzW2ldO1xuICAgICAgICAgICAgbGV0IGogPSBpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICYmIHJhbmtDb21wYXJlKHZhbHVlLCBlbGVtZW50c1tqXSkgPT09IDApIHtcbiAgICAgICAgICAgICAgaiArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPT09IGkgKyAxKSB7XG4gICAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2ltaWxhclJ1biA9IGVsZW1lbnRzLnNsaWNlKGksIGopO1xuICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICBjb25zdCByZXNvcnRlZCA9IHNvcnRCeVJhbmsoc2ltaWxhclJ1biwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgICAgLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuICAgICAgICAgICAgLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuICAgICAgICAgICAgLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuICAgICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVzKHJlc29ydGVkLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSByYXcgSlMgYXJyYXkgaXRlcmF0b3Igd2hvc2UgYC5uZXh0KClgIG1ldGhvZCovXG4gICAgICAgICAgICAvKiBkb2VzIG5vdCBoYXJkZW4gdGhlIEl0ZXJhdG9yUmVzdWx0LCBpbiB2aW9sYXRpb24gb2Ygb3VyKi9cbiAgICAgICAgICAgIC8qIGNvbnZlbnRpb25zLiBGaXhpbmcgdGhpcyBpcyBleHBlbnNpdmUgYW5kIEknbSBjb25maWRlbnQgdGhlKi9cbiAgICAgICAgICAgIC8qIHVuZnJvemVuIHZhbHVlIGRvZXMgbm90IGVzY2FwZSB0aGlzIGZpbGUsIHNvIEknbSBsZWF2aW5nIHRoaXMqL1xuICAgICAgICAgICAgLyogYXMgaXMuKi9cbiAgICAgICAgICAgIG9wdElubmVySXRlcmF0b3IgPSByZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgICAgICByZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7VFtdfSB4ZWxlbWVudHNcbiAqIEBwYXJhbSB7VFtdfSB5ZWxlbWVudHNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlID0gKHhlbGVtZW50cywgeWVsZW1lbnRzKSA9PiB7XG4gIC8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4gIC8qIHRvIHRoaXMgb25lIGBtZXJnZWAgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgY29uc3QgeHMgPSB3aW5kb3dSZXNvcnQoeGVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeXMgPSB3aW5kb3dSZXNvcnQoeWVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIC8qIFRoZXNlIGZvdXIgYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuICAgICAgLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbiAgICAgIC8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuICAgICAgLyoqIEB0eXBlIHtUfSAqL1xuICAgICAgbGV0IHg7XG4gICAgICBsZXQgeERvbmU7XG4gICAgICAvKiogQHR5cGUge1R9ICovXG4gICAgICBsZXQgeTtcbiAgICAgIGxldCB5RG9uZTtcblxuICAgICAgY29uc3QgeGkgPSB4c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBuZXh0WCA9ICgpID0+IHtcbiAgICAgICAgIXhEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgICAgICh7IGRvbmU6IHhEb25lLCB2YWx1ZTogeCB9ID0geGkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WCgpO1xuXG4gICAgICBjb25zdCB5aSA9IHlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IG5leHRZID0gKCkgPT4ge1xuICAgICAgICAheURvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICAgICAgKHsgZG9uZTogeURvbmUsIHZhbHVlOiB5IH0gPSB5aS5uZXh0KCkpO1xuICAgICAgfTtcbiAgICAgIG5leHRZKCk7XG5cbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICAgICAgLyoqIEB0eXBlIHtbVCxiaWdpbnQsYmlnaW50XX0gKi9cbiAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgaWYgKHhEb25lICYmIHlEb25lKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbiAgICAgICAgICAgIHZhbHVlID0gW251bGwsIDBuLCAwbl07XG4gICAgICAgICAgfSBlbHNlIGlmICh4RG9uZSkge1xuICAgICAgICAgICAgLyogb25seSB5cyBhcmUgbGVmdCovXG4gICAgICAgICAgICB2YWx1ZSA9IFt5LCAwbiwgMW5dO1xuICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHlEb25lKSB7XG4gICAgICAgICAgICAvKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbiAgICAgICAgICAgIHZhbHVlID0gW3gsIDFuLCAwbl07XG4gICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21wID0gZnVsbENvbXBhcmUoeCwgeSk7XG4gICAgICAgICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICAgICAgICAvKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG4gICAgICAgICAgICAgIHZhbHVlID0gW3gsIDFuLCAxbl07XG4gICAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgICAgICAgIC8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgMW4sIDBuXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbiAgICAgICAgICAgICAgY29tcCA+IDAgfHwgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt5LCAwbiwgMW5dO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZSwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07XG5oYXJkZW4obWVyZ2UpO1xuXG5jb25zdCBpdGVySXNTdXBlcnNldCA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgX3ljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPT09IDBuKSB7XG4gICAgICAvKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcnNldCBvZiB5Ki9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXRlcklzRGlzam9pbnQgPSB4eWkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMW4gJiYgeWMgPj0gMW4pIHtcbiAgICAgIC8qIFNvbWV0aGluZyBpbiBib3RoLCBzbyBub3QgZGlzam9pbnQqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtLZXlDb21wYXJpc29ufVxuICovXG5jb25zdCBpdGVyQ29tcGFyZSA9IHh5aSA9PiB7XG4gIGxldCBsb25lWSA9IGZhbHNlO1xuICBsZXQgbG9uZVggPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbX20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID09PSAwbikge1xuICAgICAgLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG4gICAgICBsb25lWSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh5YyA9PT0gMG4pIHtcbiAgICAgIC8qIHNvbWV0aGluZyBpbiB4IGlzIG5vdCBpbiB5LCBzbyB5IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHgqL1xuICAgICAgbG9uZVggPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobG9uZVggJiYgbG9uZVkpIHtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICB9XG4gIGlmIChsb25lWCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2UgaWYgKGxvbmVZKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2Uge1xuICAgICghbG9uZVggJiYgIWxvbmVZKSB8fFxuICAgICAgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCwgbG9uZVldKX1gO1xuICAgIHJldHVybiAwO1xuICB9XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyVW5pb24gPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMG4pIHtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB5YyA+PSAwbiB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbiAgICAgIC8qIGlmIHggYW5kIHkgd2VyZSBib3RoIHJlYWR5LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50IGFuZCovXG4gICAgICAvKiBhYm92ZSBjbGF1c2UgYWxyZWFkeSB0b29rIGNhcmUgb2YgaXQuIE90aGVyd2lzZSBwdXNoIGhlcmUuKi9cbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50VW5pb24gPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICB4YyA9PT0gMG4gfHwgeWMgPT09IDBuIHx8IEZhaWxgU2V0cyBtdXN0IG5vdCBoYXZlIGNvbW1vbiBlbGVtZW50czogJHttfWA7XG4gICAgaWYgKHhjID49IDFuKSB7XG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgeWMgPj0gMW4gfHwgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJJbnRlcnNlY3Rpb24gPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMW4gJiYgeWMgPj0gMW4pIHtcbiAgICAgIC8qIElmIHRoZXkgYXJlIGJvdGggcHJlc2VudCwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCovXG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFN1YnRyYWN0ID0geHlpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgeGMgPj0gMW4gfHwgRmFpbGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbiAgICBpZiAoeWMgPT09IDBuKSB7XG4gICAgICAvKiB0aGUgeCB3YXMgbm90IGluIHkqL1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBtZXJnZWlmeSA9IGl0ZXJPcCA9PiAoeGVsZW1lbnRzLCB5ZWxlbWVudHMpID0+XG4gIGl0ZXJPcChtZXJnZSh4ZWxlbWVudHMsIHllbGVtZW50cykpO1xuXG4gICAgICAgY29uc3QgZWxlbWVudHNJc1N1cGVyc2V0ID0gbWVyZ2VpZnkoaXRlcklzU3VwZXJzZXQpOyRozY9fb25jZS5lbGVtZW50c0lzU3VwZXJzZXQoZWxlbWVudHNJc1N1cGVyc2V0KTtcbiAgICAgICBjb25zdCBlbGVtZW50c0lzRGlzam9pbnQgPSBtZXJnZWlmeShpdGVySXNEaXNqb2ludCk7JGjNj19vbmNlLmVsZW1lbnRzSXNEaXNqb2ludChlbGVtZW50c0lzRGlzam9pbnQpO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzQ29tcGFyZSA9IG1lcmdlaWZ5KGl0ZXJDb21wYXJlKTskaM2PX29uY2UuZWxlbWVudHNDb21wYXJlKGVsZW1lbnRzQ29tcGFyZSk7XG4gICAgICAgY29uc3QgZWxlbWVudHNVbmlvbiA9IG1lcmdlaWZ5KGl0ZXJVbmlvbik7JGjNj19vbmNlLmVsZW1lbnRzVW5pb24oZWxlbWVudHNVbmlvbik7XG4gICAgICAgY29uc3QgZWxlbWVudHNEaXNqb2ludFVuaW9uID0gbWVyZ2VpZnkoaXRlckRpc2pvaW50VW5pb24pOyRozY9fb25jZS5lbGVtZW50c0Rpc2pvaW50VW5pb24oZWxlbWVudHNEaXNqb2ludFVuaW9uKTtcbiAgICAgICBjb25zdCBlbGVtZW50c0ludGVyc2VjdGlvbiA9IG1lcmdlaWZ5KGl0ZXJJbnRlcnNlY3Rpb24pOyRozY9fb25jZS5lbGVtZW50c0ludGVyc2VjdGlvbihlbGVtZW50c0ludGVyc2VjdGlvbik7XG4gICAgICAgY29uc3QgZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0ID0gbWVyZ2VpZnkoaXRlckRpc2pvaW50U3VidHJhY3QpOyRozY9fb25jZS5lbGVtZW50c0Rpc2pvaW50U3VidHJhY3QoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3U2V0aWZ5ID0gZWxlbWVudHNPcCA9PiAoeHNldCwgeXNldCkgPT5cbiAgZWxlbWVudHNPcCh4c2V0LnBheWxvYWQsIHlzZXQucGF5bG9hZCk7XG5cbmNvbnN0IHNldGlmeSA9IGVsZW1lbnRzT3AgPT4gKHhzZXQsIHlzZXQpID0+XG4gIG1ha2VTZXRPZkVsZW1lbnRzKGVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLCB5c2V0LnBheWxvYWQpKTtcblxuICAgICAgIGNvbnN0IHNldElzU3VwZXJzZXQgPSByYXdTZXRpZnkoZWxlbWVudHNJc1N1cGVyc2V0KTskaM2PX29uY2Uuc2V0SXNTdXBlcnNldChzZXRJc1N1cGVyc2V0KTtcbiAgICAgICBjb25zdCBzZXRJc0Rpc2pvaW50ID0gcmF3U2V0aWZ5KGVsZW1lbnRzSXNEaXNqb2ludCk7JGjNj19vbmNlLnNldElzRGlzam9pbnQoc2V0SXNEaXNqb2ludCk7XG4gICAgICAgY29uc3Qgc2V0VW5pb24gPSBzZXRpZnkoZWxlbWVudHNVbmlvbik7JGjNj19vbmNlLnNldFVuaW9uKHNldFVuaW9uKTtcbiAgICAgICBjb25zdCBzZXREaXNqb2ludFVuaW9uID0gc2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRVbmlvbik7JGjNj19vbmNlLnNldERpc2pvaW50VW5pb24oc2V0RGlzam9pbnRVbmlvbik7XG4gICAgICAgY29uc3Qgc2V0SW50ZXJzZWN0aW9uID0gc2V0aWZ5KGVsZW1lbnRzSW50ZXJzZWN0aW9uKTskaM2PX29uY2Uuc2V0SW50ZXJzZWN0aW9uKHNldEludGVyc2VjdGlvbik7XG4gICAgICAgY29uc3Qgc2V0RGlzam9pbnRTdWJ0cmFjdCA9IHNldGlmeShlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpOyRozY9fb25jZS5zZXREaXNqb2ludFN1YnRyYWN0KHNldERpc2pvaW50U3VidHJhY3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZWxlbWVudHNJc1N1cGVyc2V0IjpbImVsZW1lbnRzSXNTdXBlcnNldCJdLCJlbGVtZW50c0lzRGlzam9pbnQiOlsiZWxlbWVudHNJc0Rpc2pvaW50Il0sImVsZW1lbnRzQ29tcGFyZSI6WyJlbGVtZW50c0NvbXBhcmUiXSwiZWxlbWVudHNVbmlvbiI6WyJlbGVtZW50c1VuaW9uIl0sImVsZW1lbnRzRGlzam9pbnRVbmlvbiI6WyJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSwiZWxlbWVudHNJbnRlcnNlY3Rpb24iOlsiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IjpbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLCJzZXRJc1N1cGVyc2V0IjpbInNldElzU3VwZXJzZXQiXSwic2V0SXNEaXNqb2ludCI6WyJzZXRJc0Rpc2pvaW50Il0sInNldFVuaW9uIjpbInNldFVuaW9uIl0sInNldERpc2pvaW50VW5pb24iOlsic2V0RGlzam9pbnRVbmlvbiJdLCJzZXRJbnRlcnNlY3Rpb24iOlsic2V0SW50ZXJzZWN0aW9uIl0sInNldERpc2pvaW50U3VidHJhY3QiOlsic2V0RGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABdGlpCKy8AACsvAAA2AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiLi9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuLi9rZXlzL2NoZWNrS2V5LmpzIl0sImV4cG9ydHMiOlsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiLCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiLCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgb2JqZWN0TWFwLEFyZ0d1YXJkTGlzdFNoYXBlLEF3YWl0QXJnR3VhcmRTaGFwZSxJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSxJbnRlcmZhY2VHdWFyZFNoYXBlLE0sTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsTWV0aG9kR3VhcmRTaGFwZSxSYXdHdWFyZFNoYXBlLFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFN5bmNWYWx1ZUd1YXJkU2hhcGUsYXNzZXJ0QXdhaXRBcmdHdWFyZCxtYXRjaGVzLG11c3RNYXRjaCxnZXRDb3B5TWFwS2V5cyxtYWtlQ29weU1hcDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCIuL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wiQXJnR3VhcmRMaXN0U2hhcGVcIixbJGjNj19hID0+IChBcmdHdWFyZExpc3RTaGFwZSA9ICRozY9fYSldXSxbXCJBd2FpdEFyZ0d1YXJkU2hhcGVcIixbJGjNj19hID0+IChBd2FpdEFyZ0d1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGVcIixbJGjNj19hID0+IChJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSA9ICRozY9fYSldXSxbXCJJbnRlcmZhY2VHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoSW50ZXJmYWNlR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJNZXRob2RHdWFyZFBheWxvYWRTaGFwZVwiLFskaM2PX2EgPT4gKE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlID0gJGjNj19hKV1dLFtcIk1ldGhvZEd1YXJkU2hhcGVcIixbJGjNj19hID0+IChNZXRob2RHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIlJhd0d1YXJkU2hhcGVcIixbJGjNj19hID0+IChSYXdHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlXCIsWyRozY9fYSA9PiAoU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUgPSAkaM2PX2EpXV0sW1wiU3luY1ZhbHVlR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKFN5bmNWYWx1ZUd1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0QXdhaXRBcmdHdWFyZFwiLFskaM2PX2EgPT4gKGFzc2VydEF3YWl0QXJnR3VhcmQgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiZ2V0Q29weU1hcEtleXNcIixbJGjNj19hID0+IChnZXRDb3B5TWFwS2V5cyA9ICRozY9fYSldXSxbXCJtYWtlQ29weU1hcFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1JlbW90YWJsZU1ldGhvZE5hbWV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7QXdhaXRBcmdHdWFyZCwgQXdhaXRBcmdHdWFyZFBheWxvYWQsIEludGVyZmFjZUd1YXJkLCBJbnRlcmZhY2VHdWFyZFBheWxvYWQsIE1ldGhvZEd1YXJkLCBNZXRob2RHdWFyZFBheWxvYWR9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qIFRoZSBnZXQqR3VhcmRQYXlsb2FkIGZ1bmN0aW9ucyBleGlzdCB0byBhZGFwdCB0byB0aGUgd29ybGRzIGJvdGgqL1xuLyogYmVmb3JlIGFuZCBhZnRlciBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyIC4gV2hlbiovXG4vKiBnaXZlbiBzb21ldGhpbmcgdGhhdCB3b3VsZCBiZSB0aGUgZXhwZWN0ZWQgZ3VhcmQgaW4gZWl0aGVyIHdvcmxkLCovXG4vKiBpdCByZXR1cm5zIGEgKkd1YXJkUGF5bG9hZCB0aGF0IGlzIHZhbGlkIGluIHRoZSBjdXJyZW50IHdvcmxkLiBUaHVzKi9cbi8qIGl0IGhlbHBzIG5ldyBjb25zdW1lcnMgb2YgdGhlc2UgZ3VhcmRzIGNvcGUgd2l0aCBvbGQgY29kZSB0aGF0Ki9cbi8qIHdvdWxkIGNvbnN0cnVjdCBhbmQgc2VuZCB0aGVzZSBndWFyZHMuKi9cblxuLyogQmVjYXVzZSB0aGUgbWFpbiB1c2UgY2FzZSBmb3IgdGhpcyBsZWdhY3kgYWRhcHRhdGlvbiBpcyBpbiBAZW5kby9leG8qL1xuLyogb3IgcGFja2FnZXMgdGhhdCBkZXBlbmQgb24gaXQsIHRoZSB0ZXN0cyBmb3IgdGhpcyBsZWdhY3kgYWRhcHRhdGlvbiovXG4vKiBhcmUgZm91bmQgaW4gdGhlIEBlbmRvL2V4byBgdGVzdC1sZWdhY3ktZ3VhcmQtdG9sZXJhbmNlLmpzYC4qL1xuXG4vKiBVbmxpa2UgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlLCBMZWdhY3lNZXRob2RHdWFyZFNoYXBlLCovXG4vKiBhbmQgTGVnYWN5SW50ZXJmYWNlR3VhcmRTaGFwZSwgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYSovXG4vKiBMZWdhY3lSYXdHdWFyZFNoYXBlLCBiZWNhdXNlIHJhdyBndWFyZHMgd2VyZSBpbnRyb2R1Y2VkIGF0Ki9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE4MzEgLCB3aGljaCB3YXMgbWVyZ2VkIHdlbGwgYWZ0ZXIqL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMiAuIFRodXMsIHRoZXJlIHdhcyBuZXZlciBhKi9cbi8qIGBrbGFzczpgIGZvcm0gb2YgdGhlIHJhdyBndWFyZC4qL1xuXG4vKiBUT0RPIEF0IHN1Y2ggYSB0aW1lIHRoYXQgd2UgZGVjaWRlIHdlIG5vIGxvbmdlciBuZWVkIHRvIHN1cHBvcnQgY29kZSovXG4vKiBwcmVjZWRpbmcgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMiBvciBndWFyZCBkYXRhKi9cbi8qIGdlbmVyYXRlZCBieSB0aGF0IGNvZGUsIGFsbCB0aGUgYWRhcHRhdGlvbiBjb21wbGV4aXR5IGluIHRoaXMgZmlsZSovXG4vKiBzaG91bGQgYmUgZGVsZXRlZC4qL1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggQXdhaXRBcmdHdWFyZFBheWxvYWRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSA9IGhhcmRlbih7XG4gIGtsYXNzOiAnYXdhaXRBcmcnLFxuICBhcmdHdWFyZDogTS5wYXR0ZXJuKCksXG59KTtcblxuLyoqXG4gKiBCeSB1c2luZyB0aGlzIGFic3RyYWN0aW9uIHJhdGhlciB0aGFuIGFjY2Vzc2luZyB0aGUgcHJvcGVydGllcyBkaXJlY3RseSxcbiAqIHdlIHNtb290aCB0aGUgdHJhbnNpdGlvbiB0byBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyLFxuICogdG9sZXJhdGluZyBib3RoIHRoZSBsZWdhY3kgYW5kIGN1cnJlbnQgZ3VhcmQgc2hhcGVzLlxuICpcbiAqIE5vdGUgdGhhdCB0ZWNobmljYWxseSwgdG9sZXJhdGluZyB0aGUgb2xkIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZVxuICogaXMgYW4gZXhwbG9pdGFibGUgYnVnLCBpbiB0aGF0IGEgcmVjb3JkIHRoYXQgbWF0Y2hlcyB0aGlzXG4gKiBzaGFwZSBpcyBhbHNvIGEgdmFsaWQgcGFyYW1ldGVyIHBhdHRlcm4gdGhhdCBzaG91bGQgYWxsb3dcbiAqIGFuIGFyZ3VtZW50IHRoYXQgbWF0Y2hlcyB0aGF0IHBhdHRlcm4sIGkuZS4sIGEgY29weVJlY29yZCBhcmd1bWVudCB0aGF0XG4gKiBhdCBsZWFzdCBjb250YWlucyBhIGBrbGFzczogJ2F3YWl0QXJnR3VhcmQnYCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge0F3YWl0QXJnR3VhcmR9IGF3YWl0QXJnR3VhcmRcbiAqIEByZXR1cm5zIHtBd2FpdEFyZ0d1YXJkUGF5bG9hZH1cbiAqL1xuICAgICAgIGNvbnN0IGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkID0gYXdhaXRBcmdHdWFyZCA9PiB7XG4gIGlmIChtYXRjaGVzKGF3YWl0QXJnR3VhcmQsIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSkpIHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIGNvbnN0IHsga2xhc3M6IF8sIC4uLnBheWxvYWQgfSA9IGF3YWl0QXJnR3VhcmQ7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuICBhc3NlcnRBd2FpdEFyZ0d1YXJkKGF3YWl0QXJnR3VhcmQpO1xuICByZXR1cm4gYXdhaXRBcmdHdWFyZC5wYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKTtcblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIFN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeVN5bmNNZXRob2RHdWFyZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGtsYXNzOiAnbWV0aG9kR3VhcmQnLFxuICAgIGNhbGxLaW5kOiAnc3luYycsXG4gICAgYXJnR3VhcmRzOiBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxcbiAgICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbiAge1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzOiBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxcbiAgICByZXN0QXJnR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG4gIH0sXG4pO1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggQXJnR3VhcmRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeUFyZ0d1YXJkU2hhcGUgPSBNLm9yKFxuICBSYXdHdWFyZFNoYXBlLFxuICBBd2FpdEFyZ0d1YXJkU2hhcGUsXG4gIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSxcbiAgTS5wYXR0ZXJuKCksXG4pO1xuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIEFyZ0d1YXJkTGlzdFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5QXJnR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoTGVnYWN5QXJnR3VhcmRTaGFwZSk7XG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBBc3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5QXN5bmNNZXRob2RHdWFyZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGtsYXNzOiAnbWV0aG9kR3VhcmQnLFxuICAgIGNhbGxLaW5kOiAnYXN5bmMnLFxuICAgIGFyZ0d1YXJkczogTGVnYWN5QXJnR3VhcmRMaXN0U2hhcGUsXG4gICAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG4gIH0sXG4gIHtcbiAgICBvcHRpb25hbEFyZ0d1YXJkczogQXJnR3VhcmRMaXN0U2hhcGUsXG4gICAgcmVzdEFyZ0d1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuKTtcblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSA9IE0ub3IoXG4gIExlZ2FjeVN5bmNNZXRob2RHdWFyZFNoYXBlLFxuICBMZWdhY3lBc3luY01ldGhvZEd1YXJkU2hhcGUsXG4pO1xuXG5jb25zdCBhZGFwdExlZ2FjeUFyZ0d1YXJkID0gYXJnR3VhcmQgPT5cbiAgbWF0Y2hlcyhhcmdHdWFyZCwgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlKVxuICAgID8gTS5hd2FpdChnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZChhcmdHdWFyZCkuYXJnR3VhcmQpXG4gICAgOiBhcmdHdWFyZDtcblxuLyoqXG4gKiBCeSB1c2luZyB0aGlzIGFic3RyYWN0aW9uIHJhdGhlciB0aGFuIGFjY2Vzc2luZyB0aGUgcHJvcGVydGllcyBkaXJlY3RseSxcbiAqIHdlIHNtb290aCB0aGUgdHJhbnNpdGlvbiB0byBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyLFxuICogdG9sZXJhdGluZyBib3RoIHRoZSBsZWdhY3kgYW5kIGN1cnJlbnQgZ3VhcmQgc2hhcGVzLlxuICpcbiAqIFVubGlrZSBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUsIHRvbGVyYXRpbmcgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZVxuICogZG9lcyBub3Qgc2VlbSBsaWtlIGEgY3VycmVudGx5IGV4cGxvaXRhYmxlIGJ1ZywgYmVjYXVzZSB0aGVyZSBpcyBub3RcbiAqIGN1cnJlbnRseSBhbnkgY29udGV4dCB3aGVyZSBlaXRoZXIgYSBtZXRob2RHdWFyZCBvciBhIGNvcHlSZWNvcmQgd291bGRcbiAqIGJvdGggYmUgbWVhbmluZ2Z1bC5cbiAqXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHJldHVybnMge01ldGhvZEd1YXJkUGF5bG9hZH1cbiAqL1xuICAgICAgIGNvbnN0IGdldE1ldGhvZEd1YXJkUGF5bG9hZCA9IG1ldGhvZEd1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMobWV0aG9kR3VhcmQsIE1ldGhvZEd1YXJkU2hhcGUpKSB7XG4gICAgcmV0dXJuIG1ldGhvZEd1YXJkLnBheWxvYWQ7XG4gIH1cbiAgbXVzdE1hdGNoKG1ldGhvZEd1YXJkLCBMZWdhY3lNZXRob2RHdWFyZFNoYXBlLCAnbGVnYWN5TWV0aG9kR3VhcmQnKTtcbiAgY29uc3Qge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAga2xhc3M6IF8sXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICBjYWxsS2luZCxcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIHJldHVybkd1YXJkLFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgcmVzdEFyZ0d1YXJkLFxuICB9ID0gbWV0aG9kR3VhcmQ7XG4gIGxldCB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICBhcmdHdWFyZHMsXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICBvcHRpb25hbEFyZ0d1YXJkcyxcbiAgfSA9IG1ldGhvZEd1YXJkO1xuICBpZiAoY2FsbEtpbmQgPT09ICdhc3luYycpIHtcbiAgICBhcmdHdWFyZHMgPSBhcmdHdWFyZHMubWFwKGFkYXB0TGVnYWN5QXJnR3VhcmQpO1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzID1cbiAgICAgIG9wdGlvbmFsQXJnR3VhcmRzICYmIG9wdGlvbmFsQXJnR3VhcmRzLm1hcChhZGFwdExlZ2FjeUFyZ0d1YXJkKTtcbiAgfVxuICBjb25zdCBwYXlsb2FkID0gaGFyZGVuKHtcbiAgICBjYWxsS2luZCxcbiAgICBhcmdHdWFyZHMsXG4gICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgcmVzdEFyZ0d1YXJkLFxuICAgIHJldHVybkd1YXJkLFxuICB9KTtcbiAgLyogZW5zdXJlIHRoZSBhZGFwdGF0aW9uIHN1Y2NlZWRlZC4qL1xuICBtdXN0TWF0Y2gocGF5bG9hZCwgTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsICdpbnRlcm5hbE1ldGhvZEd1YXJkQWRhcHRvcicpO1xuICByZXR1cm4gcGF5bG9hZDtcbn07JGjNj19vbmNlLmdldE1ldGhvZEd1YXJkUGF5bG9hZChnZXRNZXRob2RHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldE1ldGhvZEd1YXJkUGF5bG9hZCk7XG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAga2xhc3M6ICdJbnRlcmZhY2UnLFxuICAgIGludGVyZmFjZU5hbWU6IE0uc3RyaW5nKCksXG4gICAgbWV0aG9kR3VhcmRzOiBNLnJlY29yZE9mKFxuICAgICAgTS5zdHJpbmcoKSxcbiAgICAgIE0ub3IoTWV0aG9kR3VhcmRTaGFwZSwgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSksXG4gICAgKSxcbiAgfSxcbiAge1xuICAgIGRlZmF1bHRHdWFyZHM6IE0ub3IoTS51bmRlZmluZWQoKSwgJ3Bhc3NhYmxlJywgJ3JhdycpLFxuICAgIHNsb3BweTogTS5ib29sZWFuKCksXG4gICAgLyogVGhlcmUgaXMgbm8gbmVlZCB0byBhY2NvbW1vZGF0ZSBMZWdhY3lNZXRob2RHdWFyZFNoYXBlIGluKi9cbiAgICAvKiB0aGlzIHBvc2l0aW9uLCBzaW5jZSBgc3ltYm9sTWV0aG9kR3VhcmRzIGhhcHBlbmVkKi9cbiAgICAvKiBhZnRlciBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyKi9cbiAgICBzeW1ib2xNZXRob2RHdWFyZHM6IE0ubWFwT2YoTS5zeW1ib2woKSwgTWV0aG9kR3VhcmRTaGFwZSksXG4gIH0sXG4pO1xuXG5jb25zdCBhZGFwdE1ldGhvZEd1YXJkID0gbWV0aG9kR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhtZXRob2RHdWFyZCwgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSkpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsS2luZCxcbiAgICAgIGFyZ0d1YXJkcyxcbiAgICAgIG9wdGlvbmFsQXJnR3VhcmRzID0gW10sXG4gICAgICByZXN0QXJnR3VhcmQgPSBNLmFueSgpLFxuICAgICAgcmV0dXJuR3VhcmQsXG4gICAgfSA9IGdldE1ldGhvZEd1YXJkUGF5bG9hZChtZXRob2RHdWFyZCk7XG4gICAgY29uc3QgbUNhbGwgPSBjYWxsS2luZCA9PT0gJ3N5bmMnID8gTS5jYWxsIDogTS5jYWxsV2hlbjtcbiAgICByZXR1cm4gbUNhbGwoLi4uYXJnR3VhcmRzKVxuICAgICAgLm9wdGlvbmFsKC4uLm9wdGlvbmFsQXJnR3VhcmRzKVxuICAgICAgLnJlc3QocmVzdEFyZ0d1YXJkKVxuICAgICAgLnJldHVybnMocmV0dXJuR3VhcmQpO1xuICB9XG4gIHJldHVybiBtZXRob2RHdWFyZDtcbn07XG5cbi8qKlxuICogQnkgdXNpbmcgdGhpcyBhYnN0cmFjdGlvbiByYXRoZXIgdGhhbiBhY2Nlc3NpbmcgdGhlIHByb3BlcnRpZXMgZGlyZWN0bHksXG4gKiB3ZSBzbW9vdGggdGhlIHRyYW5zaXRpb24gdG8gaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMixcbiAqIHRvbGVyYXRpbmcgYm90aCB0aGUgbGVnYWN5IGFuZCBjdXJyZW50IGd1YXJkIHNoYXBlcy5cbiAqXG4gKiBVbmxpa2UgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlLCB0b2xlcmF0aW5nIExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGVcbiAqIGRvZXMgbm90IHNlZW0gbGlrZSBhIGN1cnJlbnRseSBleHBsb2l0YWJsZSBidWcsIGJlY2F1c2UgdGhlcmUgaXMgbm90XG4gKiBjdXJyZW50bHkgYW55IGNvbnRleHQgd2hlcmUgZWl0aGVyIGFuIGludGVyZmFjZUd1YXJkIG9yIGEgY29weVJlY29yZCB3b3VsZFxuICogYm90aCBiZSBtZWFuaW5nZnVsLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFJlbW90YWJsZU1ldGhvZE5hbWUsIE1ldGhvZEd1YXJkPn0gW1Q9UmVjb3JkPFJlbW90YWJsZU1ldGhvZE5hbWUsIE1ldGhvZEd1YXJkPl1cbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQ8VD59IGludGVyZmFjZUd1YXJkXG4gKiBAcmV0dXJucyB7SW50ZXJmYWNlR3VhcmRQYXlsb2FkPFQ+fVxuICovXG4gICAgICAgY29uc3QgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gaW50ZXJmYWNlR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhpbnRlcmZhY2VHdWFyZCwgSW50ZXJmYWNlR3VhcmRTaGFwZSkpIHtcbiAgICByZXR1cm4gaW50ZXJmYWNlR3VhcmQucGF5bG9hZDtcbiAgfVxuICBtdXN0TWF0Y2goaW50ZXJmYWNlR3VhcmQsIExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGUsICdsZWdhY3lJbnRlcmZhY2VHdWFyZCcpO1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbiAgbGV0IHsga2xhc3M6IF8sIGludGVyZmFjZU5hbWUsIG1ldGhvZEd1YXJkcywgLi4ucmVzdCB9ID0gaW50ZXJmYWNlR3VhcmQ7XG4gIG1ldGhvZEd1YXJkcyA9IG9iamVjdE1hcChtZXRob2RHdWFyZHMsIGFkYXB0TWV0aG9kR3VhcmQpO1xuICBjb25zdCBwYXlsb2FkID0gaGFyZGVuKHtcbiAgICBpbnRlcmZhY2VOYW1lLFxuICAgIG1ldGhvZEd1YXJkcyxcbiAgICAuLi5yZXN0LFxuICB9KTtcbiAgbXVzdE1hdGNoKFxuICAgIHBheWxvYWQsXG4gICAgSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsXG4gICAgJ2ludGVybmFsSW50ZXJmYWNlR3VhcmRBZGFwdG9yJyxcbiAgKTtcbiAgcmV0dXJuIHBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQpO1xuXG5jb25zdCBlbXB0eUNvcHlNYXAgPSBtYWtlQ29weU1hcChbXSk7XG5cbi8qKlxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEByZXR1cm5zIHsoc3RyaW5nIHwgc3ltYm9sKVtdfVxuICovXG4gICAgICAgY29uc3QgZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyA9IGludGVyZmFjZUd1YXJkID0+IHtcbiAgY29uc3QgeyBtZXRob2RHdWFyZHMsIHN5bWJvbE1ldGhvZEd1YXJkcyA9IGVtcHR5Q29weU1hcCB9ID1cbiAgICBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoaW50ZXJmYWNlR3VhcmQpO1xuICAvKiogQHR5cGUgeyhzdHJpbmcgfCBzeW1ib2wpW119ICovXG4gIC8qIFRPRE8gYXQtdHMtZXhwZWN0LWVycm9yIHdvcmtzIGxvY2FsbHkgYnV0IG5vdCBmcm9tIEBlbmRvL2V4byovXG4gIC8qIEB0cy1pZ25vcmUgaW5mZXJlbmNlIGlzIHRvbyB3ZWFrIHRvIHNlZSB0aGlzIGlzIG9rKi9cbiAgcmV0dXJuIGhhcmRlbihbXG4gICAgLi4uUmVmbGVjdC5vd25LZXlzKG1ldGhvZEd1YXJkcyksXG4gICAgLi4uZ2V0Q29weU1hcEtleXMoc3ltYm9sTWV0aG9kR3VhcmRzKSxcbiAgXSk7XG59OyRozY9fb25jZS5nZXRJbnRlcmZhY2VNZXRob2RLZXlzKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xuaGFyZGVuKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiOlsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIjpbImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiOlsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sImdldEludGVyZmFjZU1ldGhvZEtleXMiOlsiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABmpO57vjIBAL4yAQA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiLCJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiLCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyIsIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIi4uL2tleXMvY29tcGFyZUtleXMuanMiLCIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4va2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyJdLCJleHBvcnRzIjpbIkFyZ0d1YXJkTGlzdFNoYXBlIiwiQXdhaXRBcmdHdWFyZFNoYXBlIiwiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUiLCJJbnRlcmZhY2VHdWFyZFNoYXBlIiwiTSIsIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlIiwiTWV0aG9kR3VhcmRTaGFwZSIsIlJhd0d1YXJkU2hhcGUiLCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSIsIlN5bmNWYWx1ZUd1YXJkU2hhcGUiLCJhc3NlcnRBd2FpdEFyZ0d1YXJkIiwiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiLCJhc3NlcnRNZXRob2RHdWFyZCIsImFzc2VydFBhdHRlcm4iLCJhc3NlcnRSYXdHdWFyZCIsImNoZWNrTWF0Y2hlcyIsImNvbnRhaW5lckhhc1NwbGl0IiwiZGVmYXVsdExpbWl0cyIsImdldFJhbmtDb3ZlciIsImlzQXdhaXRBcmdHdWFyZCIsImlzUGF0dGVybiIsImlzUmF3R3VhcmQiLCJraW5kT2YiLCJtYXRjaGVzIiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxiLFgsRmFpbCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixpZGVudENoZWNrZXIsYXBwbHlMYWJlbGluZ0Vycm9yLGZyb21VbmlxdWVFbnRyaWVzLGxpc3REaWZmZXJlbmNlLGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxjb21wYXJlUmFuayxnZXRQYXNzU3R5bGVDb3ZlcixpbnRlcnNlY3RSYW5rQ292ZXJzLHVuaW9uUmFua0NvdmVycyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMscXAsa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZyxnZXRDb3B5TWFwRW50cnlBcnJheSxtYWtlQ29weU1hcCxtYWtlQ29weVNldCxtYWtlQ29weUJhZyxnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYlwiLFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qc1wiLCBbW1wiYXBwbHlMYWJlbGluZ0Vycm9yXCIsWyRozY9fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanNcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzXCIsIFtbXCJsaXN0RGlmZmVyZW5jZVwiLFskaM2PX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV0sW1wiZ2V0UGFzc1N0eWxlQ292ZXJcIixbJGjNj19hID0+IChnZXRQYXNzU3R5bGVDb3ZlciA9ICRozY9fYSldXSxbXCJpbnRlcnNlY3RSYW5rQ292ZXJzXCIsWyRozY9fYSA9PiAoaW50ZXJzZWN0UmFua0NvdmVycyA9ICRozY9fYSldXSxbXCJ1bmlvblJhbmtDb3ZlcnNcIixbJGjNj19hID0+ICh1bmlvblJhbmtDb3ZlcnMgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV0sW1wicXBcIixbJGjNj19hID0+IChxcCA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMvY29tcGFyZUtleXMuanNcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wia2V5R1RcIixbJGjNj19hID0+IChrZXlHVCA9ICRozY9fYSldXSxbXCJrZXlHVEVcIixbJGjNj19hID0+IChrZXlHVEUgPSAkaM2PX2EpXV0sW1wia2V5TFRcIixbJGjNj19hID0+IChrZXlMVCA9ICRozY9fYSldXSxbXCJrZXlMVEVcIixbJGjNj19hID0+IChrZXlMVEUgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiY2hlY2tLZXlcIixbJGjNj19hID0+IChjaGVja0tleSA9ICRozY9fYSldXSxbXCJpc0tleVwiLFskaM2PX2EgPT4gKGlzS2V5ID0gJGjNj19hKV1dLFtcImNoZWNrU2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoY2hlY2tTY2FsYXJLZXkgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5U2V0XCIsWyRozY9fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjNj19hKV1dLFtcImNoZWNrQ29weU1hcFwiLFskaM2PX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRozY9fYSldXSxbXCJjb3B5TWFwS2V5U2V0XCIsWyRozY9fYSA9PiAoY29weU1hcEtleVNldCA9ICRozY9fYSldXSxbXCJjaGVja0NvcHlCYWdcIixbJGjNj19hID0+IChjaGVja0NvcHlCYWcgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJ5QXJyYXlcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cnlBcnJheSA9ICRozY9fYSldXSxbXCJtYWtlQ29weU1hcFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlCYWdcIixbJGjNj19hID0+IChtYWtlQ29weUJhZyA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNcIiwgW1tcImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q2hlY2tlciwgQ29weUFycmF5LCBDb3B5UmVjb3JkLCBDb3B5VGFnZ2VkLCBQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqIEBpbXBvcnQge0NvcHlTZXQsIENvcHlCYWcsIEFyZ0d1YXJkLCBBd2FpdEFyZ0d1YXJkLCBDaGVja1BhdHRlcm4sIEdldFJhbmtDb3ZlciwgSW50ZXJmYWNlR3VhcmQsIE1hdGNoZXJOYW1lc3BhY2UsIE1ldGhvZEd1YXJkLCBNZXRob2RHdWFyZE1ha2VyLCBQYXR0ZXJuLCBSYXdHdWFyZCwgU3luY1ZhbHVlR3VhcmQsIEtpbmQsIExpbWl0cywgQWxsTGltaXRzLCBLZXksIERlZmF1bHRHdWFyZFR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7TWF0Y2hIZWxwZXIsIFBhdHRlcm5LaXR9IGZyb20gJy4vdHlwZXMuanMnXG4gKi9cblxuY29uc3QgeyBlbnRyaWVzLCB2YWx1ZXMsIGhhc093biB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8UGF0dGVybj59ICovXG5jb25zdCBwYXR0ZXJuTWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGNoIEhlbHBlcnMgSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBGb3IgZm9yd2FyZCByZWZlcmVuY2VzIHRvIGBNYCAqL1xubGV0IE1NO1xuXG4vKipcbiAqIFRoZSBhY3R1YWwgZGVmYXVsdCB2YWx1ZXMgaGVyZSBhcmUsIGF0IHRoZSBwcmVzZW50IHRpbWUsIGZhaXJseVxuICogYXJiaXRyYXJ5IGNob2ljZXMgYW5kIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgc2V0dGxlIGRvd24uIE9mIGNvdXJzZVxuICogYXQgc29tZSBwb2ludCB3ZSdsbCBuZWVkIHRvIHN0b3AgY2hhbmdpbmcgdGhlbS4gQnV0IHdlIHNob3VsZCBmaXJzdFxuICogc2VlIGhvdyBvdXIgc3lzdGVtIGhvbGRzIHVwIHdpdGggdGhlc2UgY2hvaWNlcy4gVGhlIG1haW4gY3JpdGVyaWFcbiAqIGlzIHRoYXQgdGhleSBiZSBiaWcgZW5vdWdoIHRoYXQgXCJub3JtYWxcIiBpbm5vY2VudCBwcm9ncmFtcyByYXJlbHlcbiAqIGVuY291bnRlciB0aGVzZSBsaW1pdHMuXG4gKlxuICogRXhwb3J0ZWQgcHJpbWFyaWx5IGZvciB0ZXN0aW5nLlxuICovXG4gICAgICAgY29uc3QgZGVmYXVsdExpbWl0cyA9IGhhcmRlbih7XG4gIGRlY2ltYWxEaWdpdHNMaW1pdDogMTAwLFxuICBzdHJpbmdMZW5ndGhMaW1pdDogMTAwXzAwMCxcbiAgc3ltYm9sTmFtZUxlbmd0aExpbWl0OiAxMDAsXG4gIG51bVByb3BlcnRpZXNMaW1pdDogODAsXG4gIHByb3BlcnR5TmFtZUxlbmd0aExpbWl0OiAxMDAsXG4gIGFycmF5TGVuZ3RoTGltaXQ6IDEwXzAwMCxcbiAgYnl0ZUxlbmd0aExpbWl0OiAxMDBfMDAwLFxuICBudW1TZXRFbGVtZW50c0xpbWl0OiAxMF8wMDAsXG4gIG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQ6IDEwXzAwMCxcbiAgbnVtTWFwRW50cmllc0xpbWl0OiA1MDAwLFxufSk7XG5cbi8qKlxuICogVXNlIHRoZSByZXN1bHQgb25seSB0byBnZXQgdGhlIGxpbWl0cyB5b3UgbmVlZCBieSBkZXN0cnVjdHVyaW5nLlxuICogVGh1cywgdGhlIHJlc3VsdCBvbmx5IG5lZWRzIHRvIHN1cHBvcnQgZGVzdHJ1Y3R1cmluZy4gVGhlIGN1cnJlbnRcbiAqIGltcGxlbWVudGF0aW9uIHVzZXMgaW5oZXJpdGFuY2UgYXMgYSBjaGVhcCBoYWNrLlxuICpcbiAqIEBwYXJhbSB7TGltaXRzfSBbbGltaXRzXVxuICogQHJldHVybnMge0FsbExpbWl0c31cbiAqLyRozY9fb25jZS5kZWZhdWx0TGltaXRzKGRlZmF1bHRMaW1pdHMpO1xuY29uc3QgbGltaXQgPSAobGltaXRzID0ge30pID0+XG4gIC8qKiBAdHlwZSB7QWxsTGltaXRzfSAqLyAoaGFyZGVuKHsgX19wcm90b19fOiBkZWZhdWx0TGltaXRzLCAuLi5saW1pdHMgfSkpO1xuXG5jb25zdCBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdCA9IChcbiAgcGF5bG9hZCxcbiAgbWFpblBheWxvYWRTaGFwZSxcbiAgY2hlY2ssXG4gIGxhYmVsLFxuKSA9PiB7XG4gIGFzc2VydChBcnJheS5pc0FycmF5KG1haW5QYXlsb2FkU2hhcGUpKTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHBheWxvYWQpKSB7XG4gICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYCR7cShsYWJlbCl9IHBheWxvYWQgbXVzdCBiZSBhbiBhcnJheTogJHtwYXlsb2FkfWApO1xuICB9XG5cbiAgLyogV2FzIHRoZSBmb2xsb3dpbmcsIGJ1dCBpdHMgb3ZlcnVzZSBvZiBwYXR0ZXJucyBjYXVzZWQgYW4gaW5maW5pdGUgcmVncmVzcyovXG4gIC8qIGNvbnN0IHBheWxvYWRMaW1pdFNoYXBlID0gaGFyZGVuKCovXG4gIC8qIE0uc3BsaXQoKi9cbiAgLyogbWFpblBheWxvYWRTaGFwZSwqL1xuICAvKiBNLnBhcnRpYWwoaGFyZGVuKFtNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0ubnVtYmVyKCkpXSksIGhhcmRlbihbXSkpLCovXG4gIC8qICksKi9cbiAgLyogKTsqL1xuICAvKiByZXR1cm4gY2hlY2tNYXRjaGVzKHBheWxvYWQsIHBheWxvYWRMaW1pdFNoYXBlLCBjaGVjaywgbGFiZWwpOyovXG5cbiAgY29uc3QgbWFpbkxlbmd0aCA9IG1haW5QYXlsb2FkU2hhcGUubGVuZ3RoO1xuICBpZiAoIShwYXlsb2FkLmxlbmd0aCA9PT0gbWFpbkxlbmd0aCB8fCBwYXlsb2FkLmxlbmd0aCA9PT0gbWFpbkxlbmd0aCArIDEpKSB7XG4gICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYCR7cShsYWJlbCl9IHBheWxvYWQgdW5leHBlY3RlZCBzaXplOiAke3BheWxvYWR9YCk7XG4gIH1cbiAgY29uc3QgbGltaXRzID0gcGF5bG9hZFttYWluTGVuZ3RoXTtcbiAgcGF5bG9hZCA9IGhhcmRlbihwYXlsb2FkLnNsaWNlKDAsIG1haW5MZW5ndGgpKTtcbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgaWYgKCFjaGVja01hdGNoZXMocGF5bG9hZCwgbWFpblBheWxvYWRTaGFwZSwgY2hlY2ssIGxhYmVsKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGltaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIChwYXNzU3R5bGVPZihsaW1pdHMpID09PSAnY29weVJlY29yZCcgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYExpbWl0cyBtdXN0IGJlIGEgcmVjb3JkOiAke3EobGltaXRzKX1gKSkgJiZcbiAgICBlbnRyaWVzKGxpbWl0cykuZXZlcnkoXG4gICAgICAoW2tleSwgdmFsdWVdKSA9PlxuICAgICAgICBwYXNzU3R5bGVPZih2YWx1ZSkgPT09ICdudW1iZXInIHx8XG4gICAgICAgIGNoZWNrKGZhbHNlLCBYYFZhbHVlIG9mIGxpbWl0ICR7cShrZXkpfSBidXQgYmUgYSBudW1iZXI6ICR7cSh2YWx1ZSl9YCksXG4gICAgKVxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcGFyYW0ge251bWJlcn0gZGVjaW1hbERpZ2l0c0xpbWl0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbmNvbnN0IGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0ID0gKHNwZWNpbWVuLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrKSA9PiB7XG4gIGlmIChcbiAgICBNYXRoLmZsb29yKE1hdGgubG9nMTAoTWF0aC5hYnMoTnVtYmVyKHNwZWNpbWVuKSkpKSArIDEgPD1cbiAgICBkZWNpbWFsRGlnaXRzTGltaXRcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoZWNrKFxuICAgIGZhbHNlLFxuICAgIFhgYmlnaW50ICR7c3BlY2ltZW59IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7ZGVjaW1hbERpZ2l0c0xpbWl0fSBkaWdpdHNgLFxuICApO1xufTtcblxuLyoqXG4gKiBAcmV0dXJucyB7UGF0dGVybktpdH1cbiAqL1xuY29uc3QgbWFrZVBhdHRlcm5LaXQgPSAoKSA9PiB7XG4gIC8qKlxuICogSWYgdGhpcyBpcyBhIHJlY29nbml6ZWQgbWF0Y2ggdGFnLCByZXR1cm4gdGhlIE1hdGNoSGVscGVyLlxuICogT3RoZXJ3aXNlIHJlc3VsdCB1bmRlZmluZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge01hdGNoSGVscGVyIHwgdW5kZWZpbmVkfVxuICovXG4gIGNvbnN0IG1heWJlTWF0Y2hIZWxwZXIgPSB0YWcgPT5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIEhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbiAgLyoqXG4gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpbmRpY2F0ZXMgYWJzZW5jZSBieSByZXR1cm5pbmcgYHVuZGVmaW5lZGAsXG4gKiBldmVuIHRob3VnaCBgdW5kZWZpbmVkYCBpcyBhIHZhbGlkIHBhdHRlcm4uIFRvIGV2YWRlIHRoaXMgY29uZnVzaW9uLFxuICogdG8gcmVnaXN0ZXIgYSBwYXlsb2FkIHNoYXBlIHdpdGggdGhhdCBtZWFuaW5nLCB1c2UgYE1NLnVuZGVmaW5lZCgpYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7UGF0dGVybiB8IHVuZGVmaW5lZH1cbiAqL1xuICBjb25zdCBtYXliZVBheWxvYWRTaGFwZSA9IHRhZyA9PlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgR3VhcmRQYXlsb2FkU2hhcGVzW3RhZ107XG5cbiAgLyoqIEB0eXBlIHtNYXA8S2luZCwgdW5rbm93bj59ICovXG4gIGNvbnN0IHNpbmdsZXRvbktpbmRzID0gbmV3IE1hcChbXG4gICAgWydudWxsJywgbnVsbF0sXG4gICAgWyd1bmRlZmluZWQnLCB1bmRlZmluZWRdLFxuICBdKTtcblxuICAvKipcbiAqIEB0eXBlIHtXZWFrTWFwPENvcHlUYWdnZWQsIEtpbmQ+fVxuICogT25seSBmb3IgdGFnZ2VkIHJlY29yZHMgb2YgcmVjb2duaXplZCBraW5kcyB3aG9zZSBzdG9yZS1sZXZlbCBpbnZhcmlhbnRzXG4gKiBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICovXG4gIGNvbnN0IHRhZ01lbW8gPSBuZXcgV2Vha01hcCgpO1xuXG4gIC8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCB0YWdzLCBhbmQgb25seSBpZiB0aGUgdGFnZ2VkXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdGFnZ2VkXG4gKiBAcGFyYW0ge0tpbmR9IHRhZ1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tUYWdnZWQgPSAodGFnZ2VkLCB0YWcsIGNoZWNrKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hIZWxwZXIgPSBtYXliZU1hdGNoSGVscGVyKHRhZyk7XG4gICAgaWYgKG1hdGNoSGVscGVyKSB7XG4gICAgICAvKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuICAgICAgLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbiAgICAgIHJldHVybiBtYXRjaEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCh0YWdnZWQucGF5bG9hZCwgY2hlY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXlsb2FkU2hhcGUgPSBtYXliZVBheWxvYWRTaGFwZSh0YWcpO1xuICAgICAgaWYgKHBheWxvYWRTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICAgIHJldHVybiBjaGVja01hdGNoZXModGFnZ2VkLnBheWxvYWQsIHBheWxvYWRTaGFwZSwgY2hlY2ssIHRhZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICByZXR1cm4gY2hlY2tDb3B5U2V0KHRhZ2dlZCwgY2hlY2spO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29weUJhZyh0YWdnZWQsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgIHJldHVybiBjaGVja0NvcHlNYXAodGFnZ2VkLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfTogJHt0YWdnZWR9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gKiBSZXR1cm5zIG9ubHkgYSByZWNvZ25pemVkIGtpbmQsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lbiBwYXNzZXMgdGhlXG4gKiBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICogT3RoZXJ3aXNlLCBgY2hlY2soZmFsc2UsIC4uLilgIGFuZCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7S2luZCB8IHVuZGVmaW5lZH1cbiAqL1xuICBjb25zdCBraW5kT2YgPSAoc3BlY2ltZW4sIGNoZWNrID0gaWRlbnRDaGVja2VyKSA9PiB7XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuICAgIGlmIChwYXNzU3R5bGUgIT09ICd0YWdnZWQnKSB7XG4gICAgICByZXR1cm4gcGFzc1N0eWxlO1xuICAgIH1cbiAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBzcGVjaW1lbiBpcyB3ZWxsIGZvcm1lZCovXG4gICAgLyogYXMgYSB0YWdnZWQgcmVjb3JkLCB3aGljaCBpcyBkZWZpbmVkIGF0IHRoZSBtYXJzaGFsIGxldmVsIG9mIGFic3RyYWN0aW9uLCovXG4gICAgLyogc2luY2UgYHBhc3NTdHlsZU9mYCBjaGVja3MgdGhvc2UgaW52YXJpYW50cy4qL1xuICAgIGlmICh0YWdNZW1vLmhhcyhzcGVjaW1lbikpIHtcbiAgICAgIHJldHVybiB0YWdNZW1vLmdldChzcGVjaW1lbik7XG4gICAgfVxuICAgIGNvbnN0IHRhZyA9IGdldFRhZyhzcGVjaW1lbik7XG4gICAgaWYgKGNoZWNrVGFnZ2VkKHNwZWNpbWVuLCB0YWcsIGNoZWNrKSkge1xuICAgICAgdGFnTWVtby5zZXQoc3BlY2ltZW4sIHRhZyk7XG4gICAgICByZXR1cm4gdGFnO1xuICAgIH1cbiAgICBpZiAoY2hlY2sgIT09IGlkZW50Q2hlY2tlcikge1xuICAgICAgY2hlY2soZmFsc2UsIFhgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9YCk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG4gIGhhcmRlbihraW5kT2YpO1xuXG4gIC8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tpbmR9IGtpbmRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrS2luZCA9IChzcGVjaW1lbiwga2luZCwgY2hlY2spID0+IHtcbiAgICAvKiBjaGVjayBudWxsIGFuZCB1bmRlZmluZWQgYXMgS2V5cyovXG4gICAgaWYgKHNpbmdsZXRvbktpbmRzLmhhcyhraW5kKSkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgc2luZ2xldG9uS2luZHMuZ2V0KGtpbmQpLCBjaGVjayk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhbEtpbmQgPSBraW5kT2Yoc3BlY2ltZW4sIGNoZWNrKTtcbiAgICBpZiAoa2luZCA9PT0gcmVhbEtpbmQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY2hlY2sgIT09IGlkZW50Q2hlY2tlcikge1xuICAgICAgLyogYGtpbmRgIGFuZCBgcmVhbEtpbmRgIGNhbiBiZSBlbWJlZGRlZCB3aXRob3V0IHF1b3RlcyovXG4gICAgICAvKiBiZWNhdXNlIHRoZXkgYXJlIGRyYXduIGZyb20gdGhlIGVudW1lcmF0ZWQgY29sbGVjdGlvbiBvZiBrbm93biBLaW5kcy4qL1xuICAgICAgY2hlY2soZmFsc2UsIFhgJHtiKHJlYWxLaW5kKX0gJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgJHtiKGtpbmQpfWApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIGtpbmRzLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW5cbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgaXNLaW5kID0gKHNwZWNpbWVuLCBraW5kKSA9PiBjaGVja0tpbmQoc3BlY2ltZW4sIGtpbmQsIGlkZW50Q2hlY2tlcik7XG5cbiAgLyoqXG4gKiBDaGVja3MgaWYgYSBwYXR0ZXJuIG1hdGNoZXMgb25seSBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgaXNVbmRlZmluZWRQYXR0ID0gcGF0dCA9PlxuICAgIHBhdHQgPT09IHVuZGVmaW5lZCB8fFxuICAgIChpc0tpbmQocGF0dCwgJ21hdGNoOmtpbmQnKSAmJiBwYXR0LnBheWxvYWQgPT09ICd1bmRlZmluZWQnKTtcblxuICAvKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtLZXl9IGtleUFzUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tBc0tleVBhdHQgPSAoc3BlY2ltZW4sIGtleUFzUGF0dGVybiwgY2hlY2spID0+IHtcbiAgICBpZiAoaXNLZXkoc3BlY2ltZW4pICYmIGtleUVRKHNwZWNpbWVuLCBrZXlBc1BhdHRlcm4pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGNoZWNrICE9PSBpZGVudENoZWNrZXIgJiZcbiAgICAgIC8qIFdoZW4gdGhlIG1pc21hdGNoIG9jY3VycyBhZ2FpbnN0IGEga2V5IHVzZWQgYXMgYSBwYXR0ZXJuLCovXG4gICAgICAvKiB0aGUgcGF0dGVybiBzaG91bGQgc3RpbGwgYmUgcmVkYWN0ZWQuKi9cbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZTogJHtrZXlBc1BhdHRlcm59YClcbiAgICApO1xuICB9O1xuXG4gIC8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGlzUGF0dGVybiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgLyoqIEB0eXBlIHtDaGVja1BhdHRlcm59ICovXG4gIGNvbnN0IGNoZWNrUGF0dGVybiA9IChwYXR0LCBjaGVjaykgPT4ge1xuICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgLyogQWxsIGtleXMgYXJlIHBhdHRlcm5zLiBGb3IgdGhlc2UsIHRoZSBrZXlNZW1vIHdpbGwgZG8uKi9cbiAgICAgIC8qIEFsbCBwcmltaXRpdmVzIHRoYXQgYXJlIHBhdHRlcm5zIGFyZSBhbHNvIGtleXMsIHdoaWNoIHRoaXMqL1xuICAgICAgLyogYWxzbyB0YWtlcyBjYXJlIG9mIHdpdGhvdXQgbWVtby4gVGhlIHJlc3Qgb2Ygb3VyIGNoZWNraW5nIGxvZ2ljKi9cbiAgICAgIC8qIGlzIG9ubHkgY29uY2VybmVkIHdpdGggbm9uLWtleSBwYXR0ZXJucy4qL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChwYXR0ZXJuTWVtby5oYXMocGF0dCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrUGF0dGVybkludGVybmFsKHBhdHQsIGNoZWNrKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBwYXR0ZXJuTWVtby5hZGQocGF0dCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0IC0ga25vd24gbm90IHRvIGJlIGEga2V5LCBhbmQgdGhlcmVmb3JlIGtub3duXG4gKiBub3QgdG8gYmUgcHJpbWl0aXZlLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tQYXR0ZXJuSW50ZXJuYWwgPSAocGF0dCwgY2hlY2spID0+IHtcbiAgICAvKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4gICAgLyogTW9zdCBvZiB0aGUgdGV4dCBvZiB0aGUgc3dpdGNoIGJlbG93IG5vdCBkZWFsaW5nIHdpdGggbWF0Y2hlcnMgaXMqL1xuICAgIC8qIGVzc2VudGlhbGx5IGlkZW50aWNhbC4qL1xuICAgIGNvbnN0IGNoZWNrSXQgPSBjaGlsZCA9PiBjaGVja1BhdHRlcm4oY2hpbGQsIGNoZWNrKTtcblxuICAgIGNvbnN0IGtpbmQgPSBraW5kT2YocGF0dCwgY2hlY2spO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6IHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLyogQSBjb3B5UmVjb3JkIGlzIGEgcGF0dGVybiBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUqL1xuICAgICAgICAvKiBwYXR0ZXJucyovXG4gICAgICAgIHJldHVybiB2YWx1ZXMocGF0dCkuZXZlcnkoY2hlY2tJdCk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIC8qIEEgY29weUFycmF5IGlzIGEgcGF0dGVybiBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUqL1xuICAgICAgICAvKiBwYXR0ZXJucyovXG4gICAgICAgIHJldHVybiBwYXR0LmV2ZXJ5KGNoZWNrSXQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUga2V5cyBhbmQgdGhlcmVmb3JlIGFscmVhZHkga25vd24gdG8gYmUqL1xuICAgICAgICAvKiBwYXR0ZXJucy4qL1xuICAgICAgICAvKiBBIGNvcHlNYXAgaXMgYSBwYXR0ZXJuIGlmIGl0cyB2YWx1ZXMgYXJlIHBhdHRlcm5zLiovXG4gICAgICAgIHJldHVybiBjaGVja1BhdHRlcm4ocGF0dC52YWx1ZXMsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBBICR7cShraW5kKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBpZiAobWF5YmVNYXRjaEhlbHBlcihraW5kKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgQSBwYXNzYWJsZSBvZiBraW5kICR7cShraW5kKX0gaXMgbm90IGEgcGF0dGVybjogJHtwYXR0fWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgaXNQYXR0ZXJuID0gcGF0dCA9PiBjaGVja1BhdHRlcm4ocGF0dCwgaWRlbnRDaGVja2VyKTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICovXG4gIGNvbnN0IGFzc2VydFBhdHRlcm4gPSBwYXR0ID0+IHtcbiAgICBjaGVja1BhdHRlcm4ocGF0dCwgYXNzZXJ0Q2hlY2tlcik7XG4gIH07XG5cbiAgLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gbWF0Y2hlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuICAvKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrTWF0Y2hlcyA9IChzcGVjaW1lbiwgcGF0dGVybiwgY2hlY2ssIGxhYmVsID0gdW5kZWZpbmVkKSA9PlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgYXBwbHlMYWJlbGluZ0Vycm9yKGNoZWNrTWF0Y2hlc0ludGVybmFsLCBbc3BlY2ltZW4sIHBhdHRlcm4sIGNoZWNrXSwgbGFiZWwpO1xuXG4gIC8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrTWF0Y2hlc0ludGVybmFsID0gKHNwZWNpbWVuLCBwYXR0LCBjaGVjaykgPT4ge1xuICAgIC8qIFdvcnRoIGJlaW5nIGEgYml0IHZlcmJvc2UgYW5kIHJlcGV0aXRpdmUgaW4gb3JkZXIgdG8gb3B0aW1pemUqL1xuICAgIGNvbnN0IHBhdHRlcm5LaW5kID0ga2luZE9mKHBhdHQsIGNoZWNrKTtcbiAgICBjb25zdCBzcGVjaW1lbktpbmQgPSBraW5kT2Yoc3BlY2ltZW4pOyAvKiBtYXkgYmUgdW5kZWZpbmVkKi9cbiAgICBzd2l0Y2ggKHBhdHRlcm5LaW5kKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICByZXR1cm4gRmFpbGBwYXR0ZXJuIGV4cGVjdGVkOiAke3BhdHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIHJldHVybiBGYWlsYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgcmV0dXJuIEZhaWxgZXJyb3JzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdiaWdpbnQnOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICBjYXNlICdieXRlQXJyYXknOlxuICAgICAgY2FzZSAnY29weVNldCc6XG4gICAgICBjYXNlICdjb3B5QmFnJzpcbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgLyogVGhlc2Uga2luZHMgYXJlIG5lY2Vzc2FyaWx5IGtleXMqL1xuICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAgICAgLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4gICAgICAgICAgLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xuICAgICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3FwKFxuICAgICAgICAgICAgICBwYXR0LFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHBhdHQ7XG4gICAgICAgIGlmIChzcGVjaW1lbi5sZW5ndGggIT09IGxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGBBcnJheSAke3NwZWNpbWVufSAtIE11c3QgYmUgYXMgbG9uZyBhcyBjb3B5QXJyYXkgcGF0dGVybjogJHtxcChcbiAgICAgICAgICAgICAgcGF0dCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXR0LmV2ZXJ5KChwLCBpKSA9PiBjaGVja01hdGNoZXMoc3BlY2ltZW5baV0sIHAsIGNoZWNrLCBpKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgICAgICAvKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbiAgICAgICAgICAvKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG4gICAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWNpbWVuS2luZCAhPT0gJ2NvcHlSZWNvcmQnKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cXAoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBUT0RPIERldGVjdCBhbmQgYWNjdW11bGF0ZSBkaWZmZXJlbmNlIGluIG9uZSBwYXNzLiovXG4gICAgICAgIC8qIFJhdGhlciB0aGFuIHVzaW5nIHR3byBjYWxscyB0byBgbGlzdERpZmZlcmVuY2VgIHRvIGRldGVjdCBhbmQqL1xuICAgICAgICAvKiByZXBvcnQgaWYgYW5kIGhvdyB0aGVzZSBsaXN0cyBkaWZmZXIsIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkqL1xuICAgICAgICAvKiBpbiBzb3J0ZWQgb3JkZXIsIHdlIHNob3VsZCBpbnN0ZWFkIHVzZSBhbiBhbGdvcml0aG0gbGlrZSovXG4gICAgICAgIC8qIGBpdGVyRGlzam9pbnRVbmlvbmAgZnJvbSBtZXJnZS1zb3J0LW9wZXJhdG9ycy5qcyovXG4gICAgICAgIGNvbnN0IHNwZWNpbWVuTmFtZXMgPSByZWNvcmROYW1lcyhzcGVjaW1lbik7XG4gICAgICAgIGNvbnN0IHBhdHROYW1lcyA9IHJlY29yZE5hbWVzKHBhdHQpO1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gbGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLCBzcGVjaW1lbk5hbWVzKTtcbiAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGhhdmUgbWlzc2luZyBwcm9wZXJ0aWVzICR7cShtaXNzaW5nKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdW5leHBlY3RlZCA9IGxpc3REaWZmZXJlbmNlKHNwZWNpbWVuTmFtZXMsIHBhdHROYW1lcyk7XG4gICAgICAgIGlmICh1bmV4cGVjdGVkLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbiAgICAgICAgICAgICAgdW5leHBlY3RlZCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNwZWNpbWVuVmFsdWVzID0gcmVjb3JkVmFsdWVzKHNwZWNpbWVuLCBzcGVjaW1lbk5hbWVzKTtcbiAgICAgICAgY29uc3QgcGF0dFZhbHVlcyA9IHJlY29yZFZhbHVlcyhwYXR0LCBwYXR0TmFtZXMpO1xuICAgICAgICByZXR1cm4gcGF0dE5hbWVzLmV2ZXJ5KChsYWJlbCwgaSkgPT5cbiAgICAgICAgICBjaGVja01hdGNoZXMoc3BlY2ltZW5WYWx1ZXNbaV0sIHBhdHRWYWx1ZXNbaV0sIGNoZWNrLCBsYWJlbCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgICAgICAvKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbiAgICAgICAgICAvKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG4gICAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWNpbWVuS2luZCAhPT0gJ2NvcHlNYXAnKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlNYXAgdG8gbWF0Y2ggYSBjb3B5TWFwIHBhdHRlcm46ICR7cXAoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBDb21wYXJlIGtleXMgYXMgY29weVNldHMqL1xuICAgICAgICBjb25zdCBwYXR0S2V5U2V0ID0gY29weU1hcEtleVNldChwYXR0KTtcbiAgICAgICAgY29uc3Qgc3BlY2ltZW5LZXlTZXQgPSBjb3B5TWFwS2V5U2V0KHNwZWNpbWVuKTtcbiAgICAgICAgaWYgKCFjaGVja01hdGNoZXMoc3BlY2ltZW5LZXlTZXQsIHBhdHRLZXlTZXQsIGNoZWNrKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvKiBDb21wYXJlIHZhbHVlcyBhcyBjb3B5QXJyYXlzIGFmdGVyIGFwcGx5aW5nIGEgc2hhcmVkIHRvdGFsIG9yZGVyLiovXG4gICAgICAgIC8qIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGFudGlSYW5rT3JkZXIgc29ydGluZyBvZiBlYWNoIG1hcCdzKi9cbiAgICAgICAgLyogZW50cmllcyBpcyBhIHByZW9yZGVyIHRoYXQgYWRtaXRzIHRpZXMuKi9cbiAgICAgICAgY29uc3QgcGF0dFZhbHVlcyA9IFtdO1xuICAgICAgICBjb25zdCBzcGVjaW1lblZhbHVlcyA9IFtdO1xuICAgICAgICBjb25zdCBlbnRyeVBhaXJzID0gZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMoXG4gICAgICAgICAgcGF0dCxcbiAgICAgICAgICBzcGVjaW1lbixcbiAgICAgICAgICBnZXRDb3B5TWFwRW50cnlBcnJheSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3QgW19rZXksIHBhdHRWYWx1ZSwgc3BlY2ltZW5WYWx1ZV0gb2YgZW50cnlQYWlycykge1xuICAgICAgICAgIHBhdHRWYWx1ZXMucHVzaChwYXR0VmFsdWUpO1xuICAgICAgICAgIHNwZWNpbWVuVmFsdWVzLnB1c2goc3BlY2ltZW5WYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoZWNrTWF0Y2hlcyhoYXJkZW4oc3BlY2ltZW5WYWx1ZXMpLCBoYXJkZW4ocGF0dFZhbHVlcyksIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbWF0Y2hIZWxwZXIgPSBtYXliZU1hdGNoSGVscGVyKHBhdHRlcm5LaW5kKTtcbiAgICAgICAgaWYgKG1hdGNoSGVscGVyKSB7XG4gICAgICAgICAgcmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrTWF0Y2hlcyhzcGVjaW1lbiwgcGF0dC5wYXlsb2FkLCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogc2hvdWxkIGhhdmUgcmVjb2duaXplZCAke3EocGF0dGVybktpbmQpfSBgO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBtYXRjaGVzID0gKHNwZWNpbWVuLCBwYXR0KSA9PlxuICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCwgaWRlbnRDaGVja2VyKTtcblxuICAvKipcbiAqIFJldHVybmluZyBub3JtYWxseSBpbmRpY2F0ZXMgc3VjY2Vzcy4gTWF0Y2ggZmFpbHVyZSBpcyBpbmRpY2F0ZWQgYnlcbiAqIHRocm93aW5nLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqL1xuICBjb25zdCBtdXN0TWF0Y2ggPSAoc3BlY2ltZW4sIHBhdHQsIGxhYmVsID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgbGV0IGlubmVyRXJyb3I7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGlkZW50Q2hlY2tlciwgdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgIGlubmVyRXJyb3IgPSBlcjtcbiAgICB9XG4gICAgLyogc2hvdWxkIG9ubHkgdGhyb3cqL1xuICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCwgYXNzZXJ0Q2hlY2tlciwgbGFiZWwpO1xuICAgIGNvbnN0IG91dGVyRXJyb3IgPSBtYWtlRXJyb3IoXG4gICAgICBYYGludGVybmFsOiAke2xhYmVsfTogaW5jb25zaXN0ZW50IHBhdHRlcm4gbWF0Y2g6ICR7cXAocGF0dCl9YCxcbiAgICApO1xuICAgIGlmIChpbm5lckVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFubm90YXRlRXJyb3Iob3V0ZXJFcnJvciwgWGBjYXVzZWQgYnkgJHtpbm5lckVycm9yfWApO1xuICAgIH1cbiAgICB0aHJvdyBvdXRlckVycm9yO1xuICB9O1xuXG4gIC8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGdldFJhbmtDb3ZlciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgLyoqIEB0eXBlIHtHZXRSYW5rQ292ZXJ9ICovXG4gIGNvbnN0IGdldFJhbmtDb3ZlciA9IChwYXR0LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVBhc3NhYmxlKHBhdHQpO1xuICAgICAgaWYgKGVuY29kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW2VuY29kZWQsIGAke2VuY29kZWR9fmBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXR0KTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICAvKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4gICAgICAgIC8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbiAgICAgICAgLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5QXJyYXlzLiovXG4gICAgICAgIC8qKi9cbiAgICAgICAgLyogY29uc3QgcmFua0NvdmVycyA9IHBhdHQubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSk7Ki9cbiAgICAgICAgLyogcmV0dXJuIGhhcmRlbihbKi9cbiAgICAgICAgLyogcmFua0NvdmVycy5tYXAoKFtsZWZ0LCBfcmlnaHRdKSA9PiBsZWZ0KSwqL1xuICAgICAgICAvKiByYW5rQ292ZXJzLm1hcCgoW19sZWZ0LCByaWdodF0pID0+IHJpZ2h0KSwqL1xuICAgICAgICAvKiBdKTsqL1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIC8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbiAgICAgICAgLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuICAgICAgICAvKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlSZWNvcmRzLiovXG4gICAgICAgIC8qKi9cbiAgICAgICAgLyogY29uc3QgcGF0dEtleXMgPSBvd25LZXlzKHBhdHQpOyovXG4gICAgICAgIC8qIGNvbnN0IHBhdHRFbnRyaWVzID0gaGFyZGVuKHBhdHRLZXlzLm1hcChrZXkgPT4gW2tleSwgcGF0dFtrZXldXSkpOyovXG4gICAgICAgIC8qIGNvbnN0IFtsZWZ0RW50cmllc0xpbWl0LCByaWdodEVudHJpZXNMaW1pdF0gPSovXG4gICAgICAgIC8qIGdldFJhbmtDb3ZlcihwYXR0RW50cmllcyk7Ki9cbiAgICAgICAgLyogcmV0dXJuIGhhcmRlbihbKi9cbiAgICAgICAgLyogZnJvbVVuaXF1ZUVudHJpZXMobGVmdEVudHJpZXNMaW1pdCksKi9cbiAgICAgICAgLyogZnJvbVVuaXF1ZUVudHJpZXMocmlnaHRFbnRyaWVzTGltaXQpLCovXG4gICAgICAgIC8qIF0pOyovXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICBjb25zdCB0YWcgPSBnZXRUYWcocGF0dCk7XG4gICAgICAgIGNvbnN0IG1hdGNoSGVscGVyID0gbWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuICAgICAgICBpZiAobWF0Y2hIZWxwZXIpIHtcbiAgICAgICAgICAvKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuICAgICAgICAgIC8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG4gICAgICAgICAgcmV0dXJuIG1hdGNoSGVscGVyLmdldFJhbmtDb3ZlcihwYXR0LnBheWxvYWQsIGVuY29kZVBhc3NhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgICAgICAvKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4gICAgICAgICAgICAvKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4gICAgICAgICAgICAvKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlTZXRzLiovXG4gICAgICAgICAgICAvKiovXG4gICAgICAgICAgICAvKiAvLyBTaG91bGQgYWxyZWFkeSBiZSB2YWxpZGF0ZWQgYnkgY2hlY2tQYXR0ZXJuLiBCdXQgYmVjYXVzZSB0aGlzKi9cbiAgICAgICAgICAgIC8qIC8vIGlzIGEgY2hlY2sgdGhhdCBtYXkgbG9vc2VuIG92ZXIgdGltZSwgd2UgYWxzbyBhc3NlcnQqL1xuICAgICAgICAgICAgLyogLy8gZXZlcnl3aGVyZSB3ZSBzdGlsbCByZWx5IG9uIHRoZSByZXN0cmljdGlvbi4qL1xuICAgICAgICAgICAgLyogYGBganMqL1xuICAgICAgICAgICAgLyogcGF0dC5wYXlsb2FkLmxlbmd0aCA9PT0gMSB8fCovXG4gICAgICAgICAgICAvKiBGYWlsYE5vbi1zaW5nbGV0b24gY29weVNldHMgd2l0aCBtYXRjaGVyIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7cGF0dH1gOyovXG4gICAgICAgICAgICAvKiBgYGAqL1xuICAgICAgICAgICAgLyoqL1xuICAgICAgICAgICAgLyogY29uc3QgW2xlZnRFbGVtZW50TGltaXQsIHJpZ2h0RWxlbWVudExpbWl0XSA9IGdldFJhbmtDb3ZlcigqL1xuICAgICAgICAgICAgLyogcGF0dC5wYXlsb2FkWzBdLCovXG4gICAgICAgICAgICAvKiApOyovXG4gICAgICAgICAgICAvKiByZXR1cm4gaGFyZGVuKFsqL1xuICAgICAgICAgICAgLyogbWFrZUNvcHlTZXQoW2xlZnRFbGVtZW50TGltaXRdKSwqL1xuICAgICAgICAgICAgLyogbWFrZUNvcHlTZXQoW3JpZ2h0RWxlbWVudExpbWl0XSksKi9cbiAgICAgICAgICAgIC8qIF0pOyovXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgICAgIC8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbiAgICAgICAgICAgIC8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbiAgICAgICAgICAgIC8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weU1hcHMuKi9cbiAgICAgICAgICAgIC8qKi9cbiAgICAgICAgICAgIC8qIC8vIEEgbWF0Y2hpbmcgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUga2V5cywgb3IgYXQgbW9zdCBvbmUqL1xuICAgICAgICAgICAgLyogLy8gbm9uLWtleSBrZXkgcGF0dGVybi4gVGh1cyB3ZSBjYW4gYXNzdW1lIHRoYXQgdmFsdWUgcG9zaXRpb25zKi9cbiAgICAgICAgICAgIC8qIC8vIG1hdGNoIDEtdG8tMS4qL1xuICAgICAgICAgICAgLyogLy8qL1xuICAgICAgICAgICAgLyogLy8gVE9ETyBJIG1heSBiZSBvdmVybG9va2luZyB0aGF0IHRoZSBsZXNzIHByZWNpc2UgcmFua09yZGVyKi9cbiAgICAgICAgICAgIC8qIC8vIGVxdWl2YWxlbmNlIGNsYXNzIG1heSBjYXVzZSB2YWx1ZXMgdG8gYmUgb3V0IG9mIG9yZGVyLCovXG4gICAgICAgICAgICAvKiAvLyBtYWtpbmcgdGhpcyByYW5rQ292ZXIgbm90IGFjdHVhbGx5IGNvdmVyLiBJbiB0aGF0IGNhc2UsIGZvciovXG4gICAgICAgICAgICAvKiAvLyBhbGwgdGhlIHZhbHVlcyBmb3Iga2V5cyBhdCB0aGUgc2FtZSByYW5rLCB3ZSBzaG91bGQgdW5pb24gdGhlaXIqL1xuICAgICAgICAgICAgLyogLy8gcmFuayBjb3ZlcnMuIFRPRE8gUE9TU0lCTEUgU0lMRU5UIENPUlJFQ1RORVNTIEJVRyovXG4gICAgICAgICAgICAvKiAvLyovXG4gICAgICAgICAgICAvKiAvLyBJZiB0aGlzIGlzIGEgYnVnLCBpdCBwcm9iYWJseSBhZmZlY3RzIHRoZSBnZXRSYW5rQ292ZXIqL1xuICAgICAgICAgICAgLyogLy8gY2FzZXMgb2YgbWF0Y2hMVEVIZWxwZXIgYW5kIG1hdGNoR1RFSGVscGVyIG9uIGNvcHlNYXAgYXMqL1xuICAgICAgICAgICAgLyogLy8gd2VsbC4gU2VlIG1ha2VDb3B5TWFwIGZvciBhbiBpZGVhIG9uIGZpeGluZyovXG4gICAgICAgICAgICAvKiAvLyB0aGlzIGJ1Zy4qL1xuICAgICAgICAgICAgLyogY29uc3QgW2xlZnRQYXlsb2FkTGltaXQsIHJpZ2h0UGF5bG9hZExpbWl0XSA9IGdldFJhbmtDb3ZlcigqL1xuICAgICAgICAgICAgLyogcGF0dC5wYXlsb2FkLCovXG4gICAgICAgICAgICAvKiBlbmNvZGVQYXNzYWJsZSwqL1xuICAgICAgICAgICAgLyogKTsqL1xuICAgICAgICAgICAgLyogcmV0dXJuIGhhcmRlbihbKi9cbiAgICAgICAgICAgIC8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCBsZWZ0UGF5bG9hZExpbWl0KSwqL1xuICAgICAgICAgICAgLyogbWFrZVRhZ2dlZCgnY29weU1hcCcsIHJpZ2h0UGF5bG9hZExpbWl0KSwqL1xuICAgICAgICAgICAgLyogXSk7Ki9cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBicmVhazsgLyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhazsgLyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBicmVhazsgLyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gYXJyYXlcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbFByZWZpeF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGFycmF5RXZlcnlNYXRjaFBhdHRlcm4gPSAoYXJyYXksIHBhdHQsIGNoZWNrLCBsYWJlbFByZWZpeCA9ICcnKSA9PiB7XG4gICAgaWYgKGlzS2luZChwYXR0LCAnbWF0Y2g6YW55JykpIHtcbiAgICAgIC8qIGlmIHRoZSBwYXR0ZXJuIGlzIE0uYW55KCksIHdlIGtub3cgaXRzIHRydWUqL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhcnJheS5ldmVyeSgoZWwsIGkpID0+XG4gICAgICBjaGVja01hdGNoZXMoZWwsIHBhdHQsIGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSxcbiAgICApO1xuICB9O1xuXG4gIC8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGNoIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hBbnlIZWxwZXIgPSBGYXIoJ21hdGNoOmFueSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoX3NwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIF9jaGVjaykgPT4gdHJ1ZSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAobWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgbWF0Y2hlclBheWxvYWQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgbWF0Y2g6YW55IHBheWxvYWQ6ICR7bWF0Y2hlclBheWxvYWR9IC0gTXVzdCBiZSB1bmRlZmluZWRgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWycnLCAneyddLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEFuZEhlbHBlciA9IEZhcignbWF0Y2g6YW5kIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcGF0dHMsIGNoZWNrKSA9PiB7XG4gICAgICByZXR1cm4gcGF0dHMuZXZlcnkocGF0dCA9PiBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZFBhdHRzLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgY2hlY2tJdCA9IHBhdHQgPT4gY2hlY2tQYXR0ZXJuKHBhdHQsIGNoZWNrKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpID09PSAnY29weUFycmF5JyB8fFxuICAgICAgICAgIGNoZWNrKGZhbHNlLCBYYE5lZWRzIGFycmF5IG9mIHN1Yi1wYXR0ZXJuczogJHtxcChhbGxlZ2VkUGF0dHMpfWApKSAmJlxuICAgICAgICBhbGxlZ2VkUGF0dHMuZXZlcnkoY2hlY2tJdClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGdldFJhbmtDb3ZlcjogKHBhdHRzLCBlbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGludGVyc2VjdFJhbmtDb3ZlcnMoXG4gICAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgICBwYXR0cy5tYXAocCA9PiBnZXRSYW5rQ292ZXIocCwgZW5jb2RlUGFzc2FibGUpKSxcbiAgICAgICksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoT3JIZWxwZXIgPSBGYXIoJ21hdGNoOm9yIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcGF0dHMsIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcGF0dHM7XG4gICAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gbm8gcGF0dGVybiBkaXNqdW5jdHMgdG8gbWF0Y2g6ICR7cXAocGF0dHMpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvKiBTcGVjaWFsIGNhc2UgZGlzanVuY3Rpb25zIHJlcHJlc2VudGluZyBhIHNpbmdsZSBvcHRpb25hbCBwYXR0ZXJuIGZvciovXG4gICAgICAvKiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbiAgICAgIGNvbnN0IGJpbmFyeVVuZGVmUGF0dElkeCA9XG4gICAgICAgIHBhdHRzLmxlbmd0aCA9PT0gMlxuICAgICAgICAgID8gcGF0dHMuZmluZEluZGV4KHBhdHQgPT4gaXNVbmRlZmluZWRQYXR0KHBhdHQpKVxuICAgICAgICAgIDogLTE7XG4gICAgICBpZiAoYmluYXJ5VW5kZWZQYXR0SWR4ICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHNwZWNpbWVuID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHRzWzEgLSBiaW5hcnlVbmRlZlBhdHRJZHhdLCBjaGVjaylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXR0cy5zb21lKHBhdHQgPT4gbWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBtYXRjaCBvbmUgb2YgJHtxcChwYXR0cyl9YCk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFuZEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKHBhdHRzLCBlbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIHVuaW9uUmFua0NvdmVycyhcbiAgICAgICAgY29tcGFyZVJhbmssXG4gICAgICAgIHBhdHRzLm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpLFxuICAgICAgKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hOb3RIZWxwZXIgPSBGYXIoJ21hdGNoOm5vdCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgICBpZiAobWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCkpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3FwKHBhdHQpfWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrUGF0dGVybixcblxuICAgIGdldFJhbmtDb3ZlcjogKF9wYXR0LCBfZW5jb2RlUGFzc2FibGUpID0+IFsnJywgJ3snXSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXIgPSBGYXIoJ21hdGNoOnNjYWxhciBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja1NjYWxhcktleShzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hLZXlIZWxwZXIgPSBGYXIoJ21hdGNoOmtleSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0tleShzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyID0gRmFyKCdtYXRjaDpwYXR0ZXJuIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgX21hdGNoZXJQYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrUGF0dGVybihzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hLaW5kSGVscGVyID0gRmFyKCdtYXRjaDpraW5kIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IGNoZWNrS2luZCxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZEtleUtpbmQsIGNoZWNrKSA9PlxuICAgICAgdHlwZW9mIGFsbGVnZWRLZXlLaW5kID09PSAnc3RyaW5nJyB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2AsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoa2luZCwgX2VuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgICBsZXQgc3R5bGU7XG4gICAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSAnY29weVNldCc6XG4gICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgc3R5bGUgPSAndGFnZ2VkJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgc3R5bGUgPSBraW5kO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIoc3R5bGUpO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoVGFnZ2VkSGVscGVyID0gRmFyKCdtYXRjaDp0YWdnZWQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbdGFnUGF0dCwgcGF5bG9hZFBhdHRdLCBjaGVjaykgPT4ge1xuICAgICAgaWYgKHBhc3NTdHlsZU9mKHNwZWNpbWVuKSAhPT0gJ3RhZ2dlZCcpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgRXhwZWN0ZWQgdGFnZ2VkIG9iamVjdCwgbm90ICR7cShcbiAgICAgICAgICAgIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSxcbiAgICAgICAgICApfTogJHtzcGVjaW1lbn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tNYXRjaGVzKGdldFRhZyhzcGVjaW1lbiksIHRhZ1BhdHQsIGNoZWNrLCAndGFnJykgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLnBheWxvYWQsIHBheWxvYWRQYXR0LCBjaGVjaywgJ3BheWxvYWQnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnRhZ2dlZCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfa2luZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQmlnaW50SGVscGVyID0gRmFyKCdtYXRjaDpiaWdpbnQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnYmlnaW50JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmJpZ2ludCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoTmF0SGVscGVyID0gRmFyKCdtYXRjaDpuYXQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnYmlnaW50JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qKiBAdHlwZSB7YmlnaW50fSAqLyAoc3BlY2ltZW4pID49IDBuLFxuICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIG5vbi1uZWdhdGl2ZWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2spXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6bmF0IHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIC8qIFRPRE8gQ291bGQgYmUgbW9yZSBwcmVjaXNlKi9cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTdHJpbmdIZWxwZXIgPSBGYXIoJ21hdGNoOnN0cmluZyBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBzdHJpbmdMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIC8qIHByZXR0aWVyLWlnbm9yZSovXG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdzdHJpbmcnLCBjaGVjaykgJiZcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG4gICAgICAgICAgKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc3BlY2ltZW4pLmxlbmd0aCA8PSBzdHJpbmdMZW5ndGhMaW1pdCB8fFxuICAgICAgICAgIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYHN0cmluZyAke3NwZWNpbWVufSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N0cmluZ0xlbmd0aExpbWl0fWAsXG4gICAgICAgICAgKSlcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtdKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpzdHJpbmcgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ3N0cmluZycpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFN5bWJvbEhlbHBlciA9IEZhcignbWF0Y2g6c3ltYm9sIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IHN5bWJvbE5hbWVMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIGlmICghY2hlY2tLaW5kKHNwZWNpbWVuLCAnc3ltYm9sJywgY2hlY2spKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN5bWJvbE5hbWUgPSBuYW1lRm9yUGFzc2FibGVTeW1ib2woc3BlY2ltZW4pO1xuXG4gICAgICBpZiAodHlwZW9mIHN5bWJvbE5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFBhc3NhYmxlIHN5bWJvbCAke3NwZWNpbWVufSBtdXN0IGhhdmUgYSBwYXNzYWJsZSBuYW1lYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgc3ltYm9sTmFtZS5sZW5ndGggPD0gc3ltYm9sTmFtZUxlbmd0aExpbWl0LFxuICAgICAgICBYYFN5bWJvbCBuYW1lICR7cShcbiAgICAgICAgICBzeW1ib2xOYW1lLFxuICAgICAgICApfSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N5bWJvbE5hbWVMZW5ndGhMaW1pdH1gLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnN5bWJvbCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3Zlcignc3ltYm9sJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoUmVtb3RhYmxlSGVscGVyID0gRmFyKCdtYXRjaDpyZW1vdGFibGUgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByZW1vdGFibGVEZXNjLCBjaGVjaykgPT4ge1xuICAgICAgaWYgKGlzS2luZChzcGVjaW1lbiwgJ3JlbW90YWJsZScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoZWNrID09PSBpZGVudENoZWNrZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBsYWJlbCB9ID0gcmVtb3RhYmxlRGVzYztcbiAgICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbiAgICAgIGNvbnN0IGtpbmREZXRhaWxzID1cbiAgICAgICAgcGFzc1N0eWxlICE9PSAndGFnZ2VkJ1xuICAgICAgICAgID8gLyogUGFzcyBzdHlsZSBjYW4gYmUgZW1iZWRkZWQgaW4gZGV0YWlscyB3aXRob3V0IHF1b3Rlcy4qL1xuICAgICAgICAgICAgYihwYXNzU3R5bGUpXG4gICAgICAgICAgOiAvKiBUYWcgbXVzdCBiZSBxdW90ZWQgYmVjYXVzZSBpdCBpcyBwb3RlbnRpYWxseSBhdHRhY2tlci1jb250cm9sbGVkKi9cbiAgICAgICAgICAgIC8qICh1bmxpa2UgYGtpbmRPZmAsIHRoaXMgZG9lcyBub3QgcmVqZWN0IHVucmVjb2duaXplZCB0YWdzKS4qL1xuICAgICAgICAgICAgcShnZXRUYWcoc3BlY2ltZW4pKTtcbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIC8qIGBsYWJlbGAgY2FuIGJlIGVtYmVkZGVkIHdpdGhvdXQgcXVvdGVzIGJlY2F1c2UgaXQgaXMgcHJvdmlkZWQgYnkqL1xuICAgICAgICAvKiBsb2NhbCBjb2RlIGxpa2UgYE0ucmVtb3RhYmxlKFwiLi4uXCIpYC4qL1xuICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIHJlbW90YWJsZSAke2IobGFiZWwpfSwgbm90ICR7a2luZERldGFpbHN9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZFJlbW90YWJsZURlc2MsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICBhbGxlZ2VkUmVtb3RhYmxlRGVzYyxcbiAgICAgICAgaGFyZGVuKHsgbGFiZWw6IE1NLnN0cmluZygpIH0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnJlbW90YWJsZSBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfcmVtb3RhYmxlRGVzYywgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ3JlbW90YWJsZScpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaExURUhlbHBlciA9IEZhcignbWF0Y2g6bHRlIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUxURShzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDw9ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocmlnaHRPcGVyYW5kLCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbiAgICAgIC8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4gICAgICAvKiB0byBiZSBgbGV0YCovXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbiAgICAgIGxldCBbbGVmdEJvdW5kLCByaWdodEJvdW5kXSA9IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gICAgICBjb25zdCBuZXdSaWdodEJvdW5kID0gYCR7ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKX1+YDtcbiAgICAgIGlmIChuZXdSaWdodEJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmlnaHRCb3VuZCA9IG5ld1JpZ2h0Qm91bmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF07XG4gICAgfSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hMVEhlbHBlciA9IEZhcignbWF0Y2g6bHQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5TFQoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiBtYXRjaExURUhlbHBlci5nZXRSYW5rQ292ZXIsXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoR1RFSGVscGVyID0gRmFyKCdtYXRjaDpndGUgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5R1RFKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPj0gJHtyaWdodE9wZXJhbmR9YCksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tLZXksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChyaWdodE9wZXJhbmQsIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuICAgICAgLyogVGhlIHByZWZlci1jb25zdCBtYWtlcyBubyBzZW5zZSB3aGVuIHNvbWUgb2YgdGhlIHZhcmlhYmxlcyBuZWVkKi9cbiAgICAgIC8qIHRvIGJlIGBsZXRgKi9cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QqL1xuICAgICAgbGV0IFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdID0gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbiAgICAgIGNvbnN0IG5ld0xlZnRCb3VuZCA9IGVuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCk7XG4gICAgICBpZiAobmV3TGVmdEJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGVmdEJvdW5kID0gbmV3TGVmdEJvdW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoR1RIZWxwZXIgPSBGYXIoJ21hdGNoOmd0IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUdUKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPiAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogbWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFJlY29yZE9mSGVscGVyID0gRmFyKCdtYXRjaDpyZWNvcmRPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtrZXlQYXR0LCB2YWx1ZVBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtUHJvcGVydGllc0xpbWl0LCBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlSZWNvcmQnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgb3duS2V5cyhzcGVjaW1lbikubGVuZ3RoIDw9IG51bVByb3BlcnRpZXNMaW1pdCxcbiAgICAgICAgICBYYE11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbiAgICAgICAgICAgIG51bVByb3BlcnRpZXNMaW1pdCxcbiAgICAgICAgICApfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4gICAgICAgICAgKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcihcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBrZXkubGVuZ3RoIDw9IHByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuICAgICAgICAgICAgICAgIFhgUHJvcGVydHkgbmFtZSBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAke3EoXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCxcbiAgICAgICAgICAgICAgICApfWAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgICAgICAgaGFyZGVuKFtrZXksIHZhbHVlXSksXG4gICAgICAgICAgICAgIGhhcmRlbihba2V5UGF0dCwgdmFsdWVQYXR0XSksXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IF9lbnRyeVBhdHQgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hBcnJheU9mSGVscGVyID0gRmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW3N1YlBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGFycmF5TGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICAvKiBwcmV0dGllci1pZ25vcmUqL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUFycmF5JywgY2hlY2spICYmXG4gICAgICAgICgvKiogQHR5cGUge0FycmF5fSAqLyAoc3BlY2ltZW4pLmxlbmd0aCA8PSBhcnJheUxlbmd0aExpbWl0IHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgQXJyYXkgbGVuZ3RoICR7c3BlY2ltZW4ubGVuZ3RofSBtdXN0IGJlIDw9IGxpbWl0ICR7YXJyYXlMZW5ndGhMaW1pdH1gLFxuICAgICAgICAgICkpICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4sIHN1YlBhdHQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5JyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQnl0ZUFycmF5SGVscGVyID0gRmFyKCdtYXRjaDpieXRlQXJyYXkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgYnl0ZUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgLyogcHJldHRpZXItaWdub3JlKi9cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2J5dGVBcnJheScsIGNoZWNrKSAmJlxuICAgICAgICAoLyoqIEB0eXBlIHtBcnJheUJ1ZmZlcn0gKi8gKHNwZWNpbWVuKS5ieXRlTGVuZ3RoIDw9IGJ5dGVMZW5ndGhMaW1pdCB8fFxuICAgICAgICAgIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYGJ5dGVBcnJheSAke3NwZWNpbWVufSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke2J5dGVMZW5ndGhMaW1pdH1gLFxuICAgICAgICAgICkpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6Ynl0ZUFycmF5IHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdieXRlQXJyYXknKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTZXRPZkhlbHBlciA9IEZhcignbWF0Y2g6c2V0T2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBba2V5UGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtU2V0RWxlbWVudHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlTZXQnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgLyoqIEB0eXBlIHtBcnJheX0gKi8gKHNwZWNpbWVuLnBheWxvYWQpLmxlbmd0aCA8IG51bVNldEVsZW1lbnRzTGltaXQsXG4gICAgICAgICAgWGBTZXQgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKG51bVNldEVsZW1lbnRzTGltaXQpfSBlbGVtZW50czogJHtcbiAgICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQubGVuZ3RoXG4gICAgICAgICAgfWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLCBrZXlQYXR0LCBjaGVjaywgJ3NldCBlbGVtZW50cycpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6c2V0T2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQmFnT2ZIZWxwZXIgPSBGYXIoJ21hdGNoOmJhZ09mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW2tleVBhdHQsIGNvdW50UGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LCBkZWNpbWFsRGlnaXRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5QmFnJywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovIChzcGVjaW1lbi5wYXlsb2FkKS5sZW5ndGggPD1cbiAgICAgICAgICAgIG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsXG4gICAgICAgICAgWGBCYWcgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxuICAgICAgICAgICAgbnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxcbiAgICAgICAgICApfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKSAmJlxuICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuICAgICAgICAgIChba2V5LCBjb3VudF0sIGkpID0+XG4gICAgICAgICAgICBjaGVja01hdGNoZXMoa2V5LCBrZXlQYXR0LCBjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkgJiZcbiAgICAgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcihcbiAgICAgICAgICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG4gICAgICAgICAgICAgIFtjb3VudCwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVja10sXG4gICAgICAgICAgICAgIGBiYWcgY291bnRzWyR7aX1dYCxcbiAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgIGNoZWNrTWF0Y2hlcyhjb3VudCwgY291bnRQYXR0LCBjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6YmFnT2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qKlxuICogQHBhcmFtIHtDb3B5QXJyYXl9IGVsZW1lbnRzXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRQYXR0XG4gKiBAcGFyYW0ge2JpZ2ludH0gYm91bmQgTXVzdCBiZSA+PSAxblxuICogQHBhcmFtIHtDb3B5QXJyYXl9IFtpblJlc3VsdHNdXG4gKiBAcGFyYW0ge0NvcHlBcnJheX0gW291dFJlc3VsdHNdXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGVsZW1lbnRzSGFzU3BsaXQgPSAoXG4gICAgZWxlbWVudHMsXG4gICAgZWxlbWVudFBhdHQsXG4gICAgYm91bmQsXG4gICAgaW5SZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIG91dFJlc3VsdHMgPSB1bmRlZmluZWQsXG4gICAgY2hlY2sgPSBpZGVudENoZWNrZXIsXG4gICkgPT4ge1xuICAgIGxldCBjb3VudCA9IDBuO1xuICAgIC8qIFNpbmNlIHRoaXMgZmVhdHVyZSBpcyBtb3RpdmF0ZWQgYnkgRVJUUCdzIHVzZSBvbiovXG4gICAgLyogbm9uLWZ1bmdpYmxlIChgc2V0YCwgYGNvcHlTZXRgKSBhbW91bnRzLCovXG4gICAgLyogdGhlaXIgYXJyYXlzIHN0b3JlIHRoZWlyIGVsZW1lbnRzIGluIGRlY2VuZGluZyBsZXhpY29ncmFwaGljIG9yZGVyLiovXG4gICAgLyogQnV0IHRoaXMgZnVuY3Rpb24gaGFzIHRvIG1ha2Ugc29tZSBjaG9pY2UgYW1vdW5nIGVxdWFsbHkgZ29vZCBtaW5pbWFsKi9cbiAgICAvKiByZXN1bHRzLiBJdCBpcyBtb3JlIGludHVpdGl2ZSBmb3IgdGhlIGNob2ljZSB0byBiZSB0aGUgZmlyc3QgYGJvdW5kYCovXG4gICAgLyogbWF0Y2hpbmcgZWxlbWVudHMgaW4gYXNjZW5kaW5nIGxleGljaWdyYXBoaWMgb3JkZXIsIHJhdGhlciB0aGFuKi9cbiAgICAvKiBkZWNlbmRpbmcuIFRodXMgd2UgaXRlcmF0ZSBgZWxlbWVudHNgIGluIHJldmVyc2Ugb3JkZXIuKi9cbiAgICBmb3IgKGxldCBpID0gZWxlbWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmIChjb3VudCA8IGJvdW5kKSB7XG4gICAgICAgIGlmIChtYXRjaGVzKGVsZW1lbnQsIGVsZW1lbnRQYXR0KSkge1xuICAgICAgICAgIGNvdW50ICs9IDFuO1xuICAgICAgICAgIGlmIChpblJlc3VsdHMpIGluUmVzdWx0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKG91dFJlc3VsdHMpIHtcbiAgICAgICAgICBvdXRSZXN1bHRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob3V0UmVzdWx0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0UmVzdWx0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBjb3VudCA+PSBib3VuZCxcbiAgICAgIFhgSGFzIG9ubHkgJHtxKGNvdW50KX0gbWF0Y2hlcywgYnV0IG5lZWRzICR7cShib3VuZCl9YCxcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtDb3B5QXJyYXk8W0tleSwgYmlnaW50XT59IHBhaXJzXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRQYXR0XG4gKiBAcGFyYW0ge2JpZ2ludH0gYm91bmQgTXVzdCBiZSA+PSAxblxuICogQHBhcmFtIHtDb3B5QXJyYXk8W0tleSwgYmlnaW50XT59IFtpblJlc3VsdHNdXG4gKiBAcGFyYW0ge0NvcHlBcnJheTxbS2V5LCBiaWdpbnRdPn0gW291dFJlc3VsdHNdXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IHBhaXJzSGFzU3BsaXQgPSAoXG4gICAgcGFpcnMsXG4gICAgZWxlbWVudFBhdHQsXG4gICAgYm91bmQsXG4gICAgaW5SZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIG91dFJlc3VsdHMgPSB1bmRlZmluZWQsXG4gICAgY2hlY2sgPSBpZGVudENoZWNrZXIsXG4gICkgPT4ge1xuICAgIGxldCBjb3VudCA9IDBuO1xuICAgIC8qIFNpbmNlIHRoaXMgZmVhdHVyZSBpcyBtb3RpdmF0ZWQgYnkgRVJUUCdzIHVzZSBvbiovXG4gICAgLyogc2VtaS1mdW5naWJsZSAoYGNvcHlCYWdgKSBhbW91bnRzLCovXG4gICAgLyogdGhlaXIgYXJyYXlzIHN0b3JlIHRoZWlyIGVsZW1lbnRzIGluIGRlY2VuZGluZyBsZXhpY29ncmFwaGljIG9yZGVyLiovXG4gICAgLyogQnV0IHRoaXMgZnVuY3Rpb24gaGFzIHRvIG1ha2Ugc29tZSBjaG9pY2UgYW1vdW5nIGVxdWFsbHkgZ29vZCBtaW5pbWFsKi9cbiAgICAvKiByZXN1bHRzLiBJdCBpcyBtb3JlIGludHVpdGl2ZSBmb3IgdGhlIGNob2ljZSB0byBiZSB0aGUgZmlyc3QgYGJvdW5kYCovXG4gICAgLyogbWF0Y2hpbmcgZWxlbWVudHMgaW4gYXNjZW5kaW5nIGxleGljaWdyYXBoaWMgb3JkZXIsIHJhdGhlciB0aGFuKi9cbiAgICAvKiBkZWNlbmRpbmcuIFRodXMgd2UgaXRlcmF0ZSBgcGFpcnNgIGluIHJldmVyc2Ugb3JkZXIuKi9cbiAgICBmb3IgKGxldCBpID0gcGFpcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgIGNvbnN0IFtlbGVtZW50LCBudW1dID0gcGFpcnNbaV07XG4gICAgICBjb25zdCBudW1SZXN0ID0gYm91bmQgLSBjb3VudDtcbiAgICAgIGlmIChudW1SZXN0ID49IDFuKSB7XG4gICAgICAgIGlmIChtYXRjaGVzKGVsZW1lbnQsIGVsZW1lbnRQYXR0KSkge1xuICAgICAgICAgIGlmIChudW0gPD0gbnVtUmVzdCkge1xuICAgICAgICAgICAgY291bnQgKz0gbnVtO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0cykgaW5SZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBudW1JbiA9IG51bVJlc3Q7XG4gICAgICAgICAgICBjb3VudCArPSBudW1JbjtcbiAgICAgICAgICAgIGlmIChpblJlc3VsdHMpIGluUmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW1SZXN0XSk7XG4gICAgICAgICAgICBpZiAob3V0UmVzdWx0cykgb3V0UmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW0gLSBudW1SZXN0XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG91dFJlc3VsdHMpIHtcbiAgICAgICAgICBvdXRSZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG91dFJlc3VsdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGNvdW50ID49IGJvdW5kLFxuICAgICAgWGBIYXMgb25seSAke3EoY291bnQpfSBtYXRjaGVzLCBidXQgbmVlZHMgJHtxKGJvdW5kKX1gLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gKiBAdHlwZWRlZiB7Q29weUFycmF5IHwgQ29weVNldCB8IENvcHlCYWd9IENvbnRhaW5lclxuICogQHBhcmFtIHtDb250YWluZXJ9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRQYXR0XG4gKiBAcGFyYW0ge2JpZ2ludH0gYm91bmQgTXVzdCBiZSA+PSAxblxuICogQHBhcmFtIHtib29sZWFufSBbbmVlZEluUmVzdWx0c11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW25lZWRPdXRSZXN1bHRzXVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7W0NvbnRhaW5lciB8IHVuZGVmaW5lZCwgQ29udGFpbmVyIHwgdW5kZWZpbmVkXSB8IGZhbHNlfVxuICovXG4gIGNvbnN0IGNvbnRhaW5lckhhc1NwbGl0ID0gKFxuICAgIHNwZWNpbWVuLFxuICAgIGVsZW1lbnRQYXR0LFxuICAgIGJvdW5kLFxuICAgIG5lZWRJblJlc3VsdHMgPSBmYWxzZSxcbiAgICBuZWVkT3V0UmVzdWx0cyA9IGZhbHNlLFxuICAgIGNoZWNrID0gaWRlbnRDaGVja2VyLFxuICApID0+IHtcbiAgICBjb25zdCBpblJlc3VsdHMgPSBuZWVkSW5SZXN1bHRzID8gW10gOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3V0UmVzdWx0cyA9IG5lZWRPdXRSZXN1bHRzID8gW10gOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qga2luZCA9IGtpbmRPZihzcGVjaW1lbik7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhZWxlbWVudHNIYXNTcGxpdChcbiAgICAgICAgICAgIHNwZWNpbWVuLFxuICAgICAgICAgICAgZWxlbWVudFBhdHQsXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGluUmVzdWx0cyxcbiAgICAgICAgICAgIG91dFJlc3VsdHMsXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIC8qIGNoZWNrIGxvZ2ljIGFscmVhZHkgcGVyZm9ybWVkIGJ5IGVsZW1lbnRzSGFzU3BsaXQqL1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2luUmVzdWx0cywgb3V0UmVzdWx0c107XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWVsZW1lbnRzSGFzU3BsaXQoXG4gICAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLFxuICAgICAgICAgICAgZWxlbWVudFBhdHQsXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGluUmVzdWx0cyxcbiAgICAgICAgICAgIG91dFJlc3VsdHMsXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGluUmVzdWx0cyAmJiBtYWtlQ29weVNldChpblJlc3VsdHMpLFxuICAgICAgICAgIG91dFJlc3VsdHMgJiYgbWFrZUNvcHlTZXQob3V0UmVzdWx0cyksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXBhaXJzSGFzU3BsaXQoXG4gICAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLFxuICAgICAgICAgICAgZWxlbWVudFBhdHQsXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGluUmVzdWx0cyxcbiAgICAgICAgICAgIG91dFJlc3VsdHMsXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGluUmVzdWx0cyAmJiBtYWtlQ29weUJhZyhpblJlc3VsdHMpLFxuICAgICAgICAgIG91dFJlc3VsdHMgJiYgbWFrZUNvcHlCYWcob3V0UmVzdWx0cyksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGB1bmV4cGVjdGVkICR7cShraW5kKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hDb250YWluZXJIYXNIZWxwZXIgPSBGYXIoJ00uY29udGFpbmVySGFzIGhlbHBlcicsIHtcbiAgICAvKipcbiAqIEBwYXJhbSB7Q29weUFycmF5IHwgQ29weVNldCB8IENvcHlCYWd9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1tQYXR0ZXJuLCBiaWdpbnQsIExpbWl0cz9dfSBwYXlsb2FkXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW2VsZW1lbnRQYXR0LCBib3VuZCwgbGltaXRzID0gdW5kZWZpbmVkXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qga2luZCA9IGtpbmRPZihzcGVjaW1lbiwgY2hlY2spO1xuICAgICAgY29uc3QgeyBkZWNpbWFsRGlnaXRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICBpZiAoXG4gICAgICAgICFhcHBseUxhYmVsaW5nRXJyb3IoXG4gICAgICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG4gICAgICAgICAgW2JvdW5kLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrXSxcbiAgICAgICAgICBgJHtraW5kfSBtYXRjaGVzYCxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhIWNvbnRhaW5lckhhc1NwbGl0KFxuICAgICAgICBzcGVjaW1lbixcbiAgICAgICAgZWxlbWVudFBhdHQsXG4gICAgICAgIGJvdW5kLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGNoZWNrLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0uZ3RlKDFuKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ00uY29udGFpbmVySGFzIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaE1hcE9mSGVscGVyID0gRmFyKCdtYXRjaDptYXBPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtrZXlQYXR0LCB2YWx1ZVBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtTWFwRW50cmllc0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weU1hcCcsIGNoZWNrKSAmJlxuICAgICAgICBjaGVjayhcbiAgICAgICAgICAvKiogQHR5cGUge0FycmF5fSAqLyAoc3BlY2ltZW4ucGF5bG9hZC5rZXlzKS5sZW5ndGggPD1cbiAgICAgICAgICAgIG51bU1hcEVudHJpZXNMaW1pdCxcbiAgICAgICAgICBYYENvcHlNYXAgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiAke3EoXG4gICAgICAgICAgICBudW1NYXBFbnRyaWVzTGltaXQsXG4gICAgICAgICAgKX0gZW50cmllczogJHtzcGVjaW1lbn1gLFxuICAgICAgICApICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG4gICAgICAgICAgc3BlY2ltZW4ucGF5bG9hZC5rZXlzLFxuICAgICAgICAgIGtleVBhdHQsXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgJ21hcCBrZXlzJyxcbiAgICAgICAgKSAmJlxuICAgICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQudmFsdWVzLFxuICAgICAgICAgIHZhbHVlUGF0dCxcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAnbWFwIHZhbHVlcycsXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOm1hcE9mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogX2VudHJ5UGF0dCA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJuW119IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgcmVzdFNwZWNpbWVuOiBQYXNzYWJsZVtdXG4gKiB9fVxuICovXG4gIGNvbnN0IHNwbGl0QXJyYXlQYXJ0cyA9IChzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpID0+IHtcbiAgICBjb25zdCBudW1SZXF1aXJlZCA9IHJlcXVpcmVkUGF0dC5sZW5ndGg7XG4gICAgY29uc3QgbnVtT3B0aW9uYWwgPSBvcHRpb25hbFBhdHQubGVuZ3RoO1xuICAgIGNvbnN0IHJlcXVpcmVkU3BlY2ltZW4gPSBzcGVjaW1lbi5zbGljZSgwLCBudW1SZXF1aXJlZCk7XG4gICAgY29uc3Qgb3B0aW9uYWxTcGVjaW1lbiA9IHNwZWNpbWVuLnNsaWNlKFxuICAgICAgbnVtUmVxdWlyZWQsXG4gICAgICBudW1SZXF1aXJlZCArIG51bU9wdGlvbmFsLFxuICAgICk7XG4gICAgY29uc3QgcmVzdFNwZWNpbWVuID0gc3BlY2ltZW4uc2xpY2UobnVtUmVxdWlyZWQgKyBudW1PcHRpb25hbCk7XG4gICAgcmV0dXJuIGhhcmRlbih7IHJlcXVpcmVkU3BlY2ltZW4sIG9wdGlvbmFsU3BlY2ltZW4sIHJlc3RTcGVjaW1lbiB9KTtcbiAgfTtcblxuICAvKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIGVsZW1lbnRzIHdoaWNoIGFyZSBgdW5kZWZpbmVkYCBwYXNzIHVuY29uZGl0aW9uYWxseS5cbiAqIFdlIGVuY29kZSB0aGlzIHdpdGggdGhlIGBNLm9yYCBwYXR0ZXJuIHNvIGl0IGFsc28gcHJvZHVjZXMgYSBnb29kXG4gKiBjb21wcmVzc2lvbiBkaXN0aW5ndWlzaGluZyBgdW5kZWZpbmVkYCBmcm9tIGFic2VuY2UuXG4gKlxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICogQHJldHVybnMge1BhdHRlcm5bXX0gVGhlIHBhcnRpYWxQYXR0XG4gKi9cbiAgY29uc3QgYWRhcHRBcnJheVBhdHRlcm4gPSAob3B0aW9uYWxQYXR0LCBsZW5ndGgpID0+XG4gICAgaGFyZGVuKG9wdGlvbmFsUGF0dC5zbGljZSgwLCBsZW5ndGgpLm1hcChwYXR0ID0+IE1NLm9wdChwYXR0KSkpO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU3BsaXRBcnJheUhlbHBlciA9IEZhcignbWF0Y2g6c3BsaXRBcnJheSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IFtdLCByZXN0UGF0dCA9IE1NLmFueSgpXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5QXJyYXknLCBjaGVjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyByZXF1aXJlZFNwZWNpbWVuLCBvcHRpb25hbFNwZWNpbWVuLCByZXN0U3BlY2ltZW4gfSA9XG4gICAgICAgIHNwbGl0QXJyYXlQYXJ0cyhzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpO1xuICAgICAgY29uc3QgcGFydGlhbFBhdHQgPSBhZGFwdEFycmF5UGF0dGVybihcbiAgICAgICAgb3B0aW9uYWxQYXR0LFxuICAgICAgICBvcHRpb25hbFNwZWNpbWVuLmxlbmd0aCxcbiAgICAgICk7XG4gICAgICBsZXQgYXJnTnVtID0gMDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChyZXF1aXJlZFNwZWNpbWVuLmxlbmd0aCA9PT0gcmVxdWlyZWRQYXR0Lmxlbmd0aCB8fFxuICAgICAgICAgIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYEV4cGVjdGVkIGF0IGxlYXN0ICR7cShcbiAgICAgICAgICAgICAgcmVxdWlyZWRQYXR0Lmxlbmd0aCxcbiAgICAgICAgICAgICl9IGFyZ3VtZW50czogJHtzcGVjaW1lbn1gLFxuICAgICAgICAgICkpICYmXG4gICAgICAgIHJlcXVpcmVkUGF0dC5ldmVyeSgocCwgaSkgPT5cbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuW2ldLCBwLCBjaGVjaywgYGFyZyAke2FyZ051bSsrfWApLFxuICAgICAgICApICYmXG4gICAgICAgIHBhcnRpYWxQYXR0LmV2ZXJ5KChwLCBpKSA9PlxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG4gICAgICAgICAgY2hlY2tNYXRjaGVzKG9wdGlvbmFsU3BlY2ltZW5baV0sIHAsIGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9P2ApLFxuICAgICAgICApICYmXG4gICAgICAgIGNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4sIHJlc3RQYXR0LCBjaGVjaywgJy4uLnJlc3QnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBzcGxpdEFycmF5XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHNwbGl0QXJyYXksIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAoc3BsaXRBcnJheS5sZW5ndGggPj0gMSB8fCBzcGxpdEFycmF5Lmxlbmd0aCA8PSAzKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCwgcmVzdFBhdHQgPSB1bmRlZmluZWRdID1cbiAgICAgICAgICBzcGxpdEFycmF5O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkgJiZcbiAgICAgICAgICBwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAgIChvcHRpb25hbFBhdHQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKGlzUGF0dGVybihvcHRpb25hbFBhdHQpICYmXG4gICAgICAgICAgICAgIHBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCkgPT09ICdjb3B5QXJyYXknKSkgJiZcbiAgICAgICAgICAocmVzdFBhdHQgPT09IHVuZGVmaW5lZCB8fCBpc1BhdHRlcm4ocmVzdFBhdHQpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IGFycmF5LCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgYXJyYXksIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuICAgICAgICAgIHNwbGl0QXJyYXksXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGdldFJhbmtDb3ZlcjogKFtcbiAgICAgIF9yZXF1aXJlZFBhdHQsXG4gICAgICBfb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLFxuICAgICAgX3Jlc3RQYXR0ID0gdW5kZWZpbmVkLFxuICAgIF0pID0+IGdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKSxcbiAgfSk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGFzc2FibGU+fSBzcGVjaW1lblxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcmV0dXJucyB7e1xuICogICByZXF1aXJlZFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPixcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIHJlc3RTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT5cbiAqIH19XG4gKi9cbiAgY29uc3Qgc3BsaXRSZWNvcmRQYXJ0cyA9IChzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpID0+IHtcbiAgICAvKiBOb3QgZnJvemVuISBNdXRhdGVkIGluIHBsYWNlKi9cbiAgICAvKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuICAgIGNvbnN0IHJlcXVpcmVkRW50cmllcyA9IFtdO1xuICAgIC8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG4gICAgY29uc3Qgb3B0aW9uYWxFbnRyaWVzID0gW107XG4gICAgLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbiAgICBjb25zdCByZXN0RW50cmllcyA9IFtdO1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBlbnRyaWVzKHNwZWNpbWVuKSkge1xuICAgICAgaWYgKGhhc093bihyZXF1aXJlZFBhdHQsIG5hbWUpKSB7XG4gICAgICAgIHJlcXVpcmVkRW50cmllcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIGlmIChoYXNPd24ob3B0aW9uYWxQYXR0LCBuYW1lKSkge1xuICAgICAgICBvcHRpb25hbEVudHJpZXMucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3RFbnRyaWVzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgcmVxdWlyZWRTcGVjaW1lbjogZnJvbVVuaXF1ZUVudHJpZXMocmVxdWlyZWRFbnRyaWVzKSxcbiAgICAgIG9wdGlvbmFsU3BlY2ltZW46IGZyb21VbmlxdWVFbnRyaWVzKG9wdGlvbmFsRW50cmllcyksXG4gICAgICByZXN0U3BlY2ltZW46IGZyb21VbmlxdWVFbnRyaWVzKHJlc3RFbnRyaWVzKSxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIHZhbHVlcyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge0NvcHlSZWNvcmQ8UGF0dGVybj59IFRoZSBwYXJ0aWFsUGF0dFxuICovXG4gIGNvbnN0IGFkYXB0UmVjb3JkUGF0dGVybiA9IChvcHRpb25hbFBhdHQsIG5hbWVzKSA9PlxuICAgIGZyb21VbmlxdWVFbnRyaWVzKG5hbWVzLm1hcChuYW1lID0+IFtuYW1lLCBNTS5vcHQob3B0aW9uYWxQYXR0W25hbWVdKV0pKTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFNwbGl0UmVjb3JkSGVscGVyID0gRmFyKCdtYXRjaDpzcGxpdFJlY29yZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IHt9LCByZXN0UGF0dCA9IE1NLmFueSgpXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5UmVjb3JkJywgY2hlY2spKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgcmVxdWlyZWRTcGVjaW1lbiwgb3B0aW9uYWxTcGVjaW1lbiwgcmVzdFNwZWNpbWVuIH0gPVxuICAgICAgICBzcGxpdFJlY29yZFBhcnRzKHNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCk7XG5cbiAgICAgIGNvbnN0IHBhcnRpYWxOYW1lcyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChvd25LZXlzKG9wdGlvbmFsU3BlY2ltZW4pKTtcbiAgICAgIGNvbnN0IHBhcnRpYWxQYXR0ID0gYWRhcHRSZWNvcmRQYXR0ZXJuKG9wdGlvbmFsUGF0dCwgcGFydGlhbE5hbWVzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIGNoZWNrKSAmJlxuICAgICAgICBwYXJ0aWFsTmFtZXMuZXZlcnkobmFtZSA9PlxuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgICAgIG9wdGlvbmFsU3BlY2ltZW5bbmFtZV0sXG4gICAgICAgICAgICBwYXJ0aWFsUGF0dFtuYW1lXSxcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgYCR7bmFtZX0/YCxcbiAgICAgICAgICApLFxuICAgICAgICApICYmXG4gICAgICAgIGNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4sIHJlc3RQYXR0LCBjaGVjaywgJy4uLnJlc3QnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBzcGxpdEFycmF5XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHNwbGl0QXJyYXksIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAoc3BsaXRBcnJheS5sZW5ndGggPj0gMSB8fCBzcGxpdEFycmF5Lmxlbmd0aCA8PSAzKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCwgcmVzdFBhdHQgPSB1bmRlZmluZWRdID1cbiAgICAgICAgICBzcGxpdEFycmF5O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkgJiZcbiAgICAgICAgICBwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpID09PSAnY29weVJlY29yZCcgJiZcbiAgICAgICAgICAob3B0aW9uYWxQYXR0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChpc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSAmJlxuICAgICAgICAgICAgICBwYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpID09PSAnY29weVJlY29yZCcpKSAmJlxuICAgICAgICAgIChyZXN0UGF0dCA9PT0gdW5kZWZpbmVkIHx8IGlzUGF0dGVybihyZXN0UGF0dCkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgcmVjb3JkLCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgcmVjb3JkLCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbiAgICAgICAgICBzcGxpdEFycmF5LFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChbXG4gICAgICByZXF1aXJlZFBhdHQsXG4gICAgICBfb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLFxuICAgICAgX3Jlc3RQYXR0ID0gdW5kZWZpbmVkLFxuICAgIF0pID0+IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkpLFxuICB9KTtcblxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIE1hdGNoSGVscGVyPn0gKi9cbiAgY29uc3QgSGVscGVyc0J5TWF0Y2hUYWcgPSBoYXJkZW4oe1xuICAgICdtYXRjaDphbnknOiBtYXRjaEFueUhlbHBlcixcbiAgICAnbWF0Y2g6YW5kJzogbWF0Y2hBbmRIZWxwZXIsXG4gICAgJ21hdGNoOm9yJzogbWF0Y2hPckhlbHBlcixcbiAgICAnbWF0Y2g6bm90JzogbWF0Y2hOb3RIZWxwZXIsXG5cbiAgICAnbWF0Y2g6c2NhbGFyJzogbWF0Y2hTY2FsYXJIZWxwZXIsXG4gICAgJ21hdGNoOmtleSc6IG1hdGNoS2V5SGVscGVyLFxuICAgICdtYXRjaDpwYXR0ZXJuJzogbWF0Y2hQYXR0ZXJuSGVscGVyLFxuICAgICdtYXRjaDpraW5kJzogbWF0Y2hLaW5kSGVscGVyLFxuICAgICdtYXRjaDp0YWdnZWQnOiBtYXRjaFRhZ2dlZEhlbHBlcixcbiAgICAnbWF0Y2g6YmlnaW50JzogbWF0Y2hCaWdpbnRIZWxwZXIsXG4gICAgJ21hdGNoOm5hdCc6IG1hdGNoTmF0SGVscGVyLFxuICAgICdtYXRjaDpzdHJpbmcnOiBtYXRjaFN0cmluZ0hlbHBlcixcbiAgICAnbWF0Y2g6c3ltYm9sJzogbWF0Y2hTeW1ib2xIZWxwZXIsXG4gICAgJ21hdGNoOnJlbW90YWJsZSc6IG1hdGNoUmVtb3RhYmxlSGVscGVyLFxuXG4gICAgJ21hdGNoOmx0JzogbWF0Y2hMVEhlbHBlcixcbiAgICAnbWF0Y2g6bHRlJzogbWF0Y2hMVEVIZWxwZXIsXG4gICAgJ21hdGNoOmd0ZSc6IG1hdGNoR1RFSGVscGVyLFxuICAgICdtYXRjaDpndCc6IG1hdGNoR1RIZWxwZXIsXG5cbiAgICAnbWF0Y2g6YXJyYXlPZic6IG1hdGNoQXJyYXlPZkhlbHBlcixcbiAgICAnbWF0Y2g6Ynl0ZUFycmF5JzogbWF0Y2hCeXRlQXJyYXlIZWxwZXIsXG4gICAgJ21hdGNoOnJlY29yZE9mJzogbWF0Y2hSZWNvcmRPZkhlbHBlcixcbiAgICAnbWF0Y2g6c2V0T2YnOiBtYXRjaFNldE9mSGVscGVyLFxuICAgICdtYXRjaDpiYWdPZic6IG1hdGNoQmFnT2ZIZWxwZXIsXG4gICAgJ21hdGNoOmNvbnRhaW5lckhhcyc6IG1hdGNoQ29udGFpbmVySGFzSGVscGVyLFxuICAgICdtYXRjaDptYXBPZic6IG1hdGNoTWFwT2ZIZWxwZXIsXG4gICAgJ21hdGNoOnNwbGl0QXJyYXknOiBtYXRjaFNwbGl0QXJyYXlIZWxwZXIsXG4gICAgJ21hdGNoOnNwbGl0UmVjb3JkJzogbWF0Y2hTcGxpdFJlY29yZEhlbHBlcixcbiAgfSk7XG5cbiAgY29uc3QgbWFrZU1hdGNoZXIgPSAodGFnLCBwYXlsb2FkKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlciA9IG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKTtcbiAgICBhc3NlcnRQYXR0ZXJuKG1hdGNoZXIpO1xuICAgIHJldHVybiBtYXRjaGVyO1xuICB9O1xuXG4gIGNvbnN0IG1ha2VLaW5kTWF0Y2hlciA9IGtpbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmtpbmQnLCBraW5kKTtcblxuICBjb25zdCBBbnlTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDphbnknLCB1bmRlZmluZWQpO1xuICBjb25zdCBTY2FsYXJTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDpzY2FsYXInLCB1bmRlZmluZWQpO1xuICBjb25zdCBLZXlTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDprZXknLCB1bmRlZmluZWQpO1xuICBjb25zdCBQYXR0ZXJuU2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IEJvb2xlYW5TaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcignYm9vbGVhbicpO1xuICBjb25zdCBOdW1iZXJTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG4gIGNvbnN0IEJpZ0ludFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6YmlnaW50JywgW10pO1xuICBjb25zdCBOYXRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsIFtdKTtcbiAgY29uc3QgU3RyaW5nU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpzdHJpbmcnLCBbXSk7XG4gIGNvbnN0IFN5bWJvbFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6c3ltYm9sJywgW10pO1xuICBjb25zdCBSZWNvcmRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJywgW0FueVNoYXBlLCBBbnlTaGFwZV0pO1xuICBjb25zdCBBcnJheVNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsIFtBbnlTaGFwZV0pO1xuICBjb25zdCBCeXRlQXJyYXlTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmJ5dGVBcnJheScsIFtdKTtcbiAgY29uc3QgU2V0U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsIFtBbnlTaGFwZV0pO1xuICBjb25zdCBCYWdTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmJhZ09mJywgW0FueVNoYXBlLCBBbnlTaGFwZV0pO1xuICBjb25zdCBNYXBTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOm1hcE9mJywgW0FueVNoYXBlLCBBbnlTaGFwZV0pO1xuICBjb25zdCBSZW1vdGFibGVTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcigncmVtb3RhYmxlJyk7XG4gIGNvbnN0IEVycm9yU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG4gIGNvbnN0IFByb21pc2VTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcigncHJvbWlzZScpO1xuICBjb25zdCBVbmRlZmluZWRTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcigndW5kZWZpbmVkJyk7XG5cbiAgLyoqXG4gKiBGb3Igd2hlbiB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBwYXlsb2FkIGlzIHRoZSBvcHRpb25hbCBsaW1pdHMsXG4gKiBzbyB0aGF0IHdoZW4gaXQgaXMgYHVuZGVmaW5lZGAgaXQgaXMgZHJvcHBlZCBmcm9tIHRoZSBlbmQgb2YgdGhlXG4gKiBwYXlsb2FkcyBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBheWxvYWRcbiAqL1xuICBjb25zdCBtYWtlTGltaXRzTWF0Y2hlciA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgICBpZiAocGF5bG9hZFtwYXlsb2FkLmxlbmd0aCAtIDFdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBheWxvYWQgPSBoYXJkZW4ocGF5bG9hZC5zbGljZSgwLCBwYXlsb2FkLmxlbmd0aCAtIDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VNYXRjaGVyKHRhZywgcGF5bG9hZCk7XG4gIH07XG5cbiAgY29uc3QgbWFrZVJlbW90YWJsZU1hdGNoZXIgPSAobGFiZWwgPSB1bmRlZmluZWQpID0+XG4gICAgbGFiZWwgPT09IHVuZGVmaW5lZFxuICAgICAgPyBSZW1vdGFibGVTaGFwZVxuICAgICAgOiBtYWtlTWF0Y2hlcignbWF0Y2g6cmVtb3RhYmxlJywgaGFyZGVuKHsgbGFiZWwgfSkpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gZW1wdHlcbiAqIEBwYXJhbSB7VH0gYmFzZVxuICogQHBhcmFtIHtUfSBbb3B0aW9uYWxdXG4gKiBAcGFyYW0ge1R9IFtyZXN0XVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuICBjb25zdCBtYWtlU3BsaXRQYXlsb2FkID0gKFxuICAgIGVtcHR5LFxuICAgIGJhc2UsXG4gICAgb3B0aW9uYWwgPSB1bmRlZmluZWQsXG4gICAgcmVzdCA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgaWYgKHJlc3QpIHtcbiAgICAgIHJldHVybiBbYmFzZSwgb3B0aW9uYWwgfHwgZW1wdHksIHJlc3RdO1xuICAgIH1cbiAgICBpZiAob3B0aW9uYWwpIHtcbiAgICAgIHJldHVybiBbYmFzZSwgb3B0aW9uYWxdO1xuICAgIH1cbiAgICByZXR1cm4gW2Jhc2VdO1xuICB9O1xuXG4gIC8qIC8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgLyoqIEB0eXBlIHtNYXRjaGVyTmFtZXNwYWNlfSAqL1xuICBjb25zdCBNID0gaGFyZGVuKHtcbiAgICBhbnk6ICgpID0+IEFueVNoYXBlLFxuICAgIGFuZDogKC4uLnBhdHRzKSA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6YW5kJywgcGF0dHMpLFxuICAgIG9yOiAoLi4ucGF0dHMpID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpvcicsIHBhdHRzKSxcbiAgICBub3Q6IHN1YlBhdHQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOm5vdCcsIHN1YlBhdHQpLFxuXG4gICAgc2NhbGFyOiAoKSA9PiBTY2FsYXJTaGFwZSxcbiAgICBrZXk6ICgpID0+IEtleVNoYXBlLFxuICAgIHBhdHRlcm46ICgpID0+IFBhdHRlcm5TaGFwZSxcbiAgICBraW5kOiBtYWtlS2luZE1hdGNoZXIsXG4gICAgdGFnZ2VkOiAodGFnUGF0dCA9IE0uc3RyaW5nKCksIHBheWxvYWRQYXR0ID0gTS5hbnkoKSkgPT5cbiAgICAgIG1ha2VNYXRjaGVyKCdtYXRjaDp0YWdnZWQnLCBoYXJkZW4oW3RhZ1BhdHQsIHBheWxvYWRQYXR0XSkpLFxuICAgIGJvb2xlYW46ICgpID0+IEJvb2xlYW5TaGFwZSxcbiAgICBudW1iZXI6ICgpID0+IE51bWJlclNoYXBlLFxuICAgIGJpZ2ludDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiaWdpbnQnLCBbbGltaXRzXSkgOiBCaWdJbnRTaGFwZSxcbiAgICBuYXQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bmF0JywgW2xpbWl0c10pIDogTmF0U2hhcGUsXG4gICAgc3RyaW5nOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN0cmluZycsIFtsaW1pdHNdKSA6IFN0cmluZ1NoYXBlLFxuICAgIHN5bWJvbDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzeW1ib2wnLCBbbGltaXRzXSkgOiBTeW1ib2xTaGFwZSxcbiAgICByZWNvcmQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLnJlY29yZE9mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBSZWNvcmRTaGFwZSxcbiAgICAvKiBzdHJ1Y3Q6IEEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weVJlY29yZHMgd2l0aCBhIGZpeGVkIHF1YW50aXR5IG9mKi9cbiAgICAvKiBlbnRyaWVzIHdoZXJlIHRoZSB2YWx1ZXMgbWF0Y2ggcGF0dGVybnMgZm9yIGNvcnJlc3BvbmRpbmcga2V5cyBpcyBtZXJlbHkqL1xuICAgIC8qIGEgaGFyZGVuZWQgb2JqZWN0IHdpdGggcGF0dGVybnMgaW4gdGhlIHBsYWNlcyBvZiB2YWx1ZXMgZm9yKi9cbiAgICAvKiBjb3JyZXNwb25kaW5nIGtleXMuKi9cbiAgICAvKiBGb3IgZXhhbXBsZSwgYSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBDb3B5UmVjb3JkcyB0aGF0IGhhdmUgYSBzdHJpbmcgdmFsdWUqL1xuICAgIC8qIGZvciB0aGUga2V5ICd4JyBhbmQgYSBudW1iZXIgZm9yIHRoZSBrZXkgJ3knIGlzOiovXG4gICAgLyogaGFyZGVuKHsgeDogTS5zdHJpbmcoKSwgeTogTS5udW1iZXIoKSB9KS4qL1xuICAgIGFycmF5OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gTS5hcnJheU9mKE0uYW55KCksIGxpbWl0cykgOiBBcnJheVNoYXBlLFxuICAgIC8qIHR1cGxlOiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlBcnJheXMgd2l0aCBhIGZpeGVkIHF1YW50aXR5IG9mIHZhbHVlcyovXG4gICAgLyogdGhhdCBtYXRjaCBhIGhldGVyb2dlbmVvdXMgYXJyYXkgb2YgcGF0dGVybnMgaXMgbWVyZWx5IGEgaGFyZGVuZWQgYXJyYXkqL1xuICAgIC8qIG9mIHRoZSByZXNwZWN0aXZlIHBhdHRlcm5zLiovXG4gICAgLyogRm9yIGV4YW1wbGUsIGEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weUFycmF5cyBvZiBsZW5ndGggMiB0aGF0IGhhdmUgYSovXG4gICAgLyogc3RyaW5nIGF0IGluZGV4IDAgYW5kIGEgbnVtYmVyIGF0IGluZGV4IDEgaXM6Ki9cbiAgICAvKiBoYXJkZW4oWyBNLnN0cmluZygpLCBNLm51bWJlcigpIF0pLiovXG4gICAgYnl0ZUFycmF5OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJ5dGVBcnJheScsIFtsaW1pdHNdKSA6IEJ5dGVBcnJheVNoYXBlLFxuICAgIHNldDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT4gKGxpbWl0cyA/IE0uc2V0T2YoTS5hbnkoKSwgbGltaXRzKSA6IFNldFNoYXBlKSxcbiAgICBiYWc6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLmJhZ09mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBCYWdTaGFwZSxcbiAgICBtYXA6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLm1hcE9mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBNYXBTaGFwZSxcbiAgICAvKiBoZXRlcm9nZW5lb3VzIG1hcDogQSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBDb3B5TWFwcyB3aXRoIGEgZml4ZWQgcXVhbnRpdHkqL1xuICAgIC8qIG9mIGVudHJpZXMgd2hlcmUgdGhlIHZhbHVlIGZvciBlYWNoIGtleSBtYXRjaGVzIGEgY29ycmVzcG9uZGluZyBwYXR0ZXJuKi9cbiAgICAvKiBpcyBtZXJlbHkgYSAoaGFyZGVuZWQpIENvcHlNYXAgd2l0aCBwYXR0ZXJucyBpbnN0ZWFkIG9mIHZhbHVlcyBmb3IgdGhlKi9cbiAgICAvKiBjb3JyZXNwb25kaW5nIGtleXMuKi9cbiAgICAvKiBGb3IgZXhhbXBsZSwgYSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBDb3B5TWFwcyB3aGVyZSB0aGUgdmFsdWUgZm9yIHRoZSBrZXkqL1xuICAgIC8qICd4JyBpcyBhIG51bWJlciBhbmQgdGhlIHZhbHVlIGZvciB0aGUga2V5ICd5JyBpcyBhIHN0cmluZyBpczoqL1xuICAgIC8qIG1ha2VDb3B5TWFwKFtbJ3gnLCBNLm51bWJlcigpXSwgWyd5JywgTS5zdHJpbmcoKV1dKS4qL1xuICAgIHJlbW90YWJsZTogbWFrZVJlbW90YWJsZU1hdGNoZXIsXG4gICAgZXJyb3I6ICgpID0+IEVycm9yU2hhcGUsXG4gICAgcHJvbWlzZTogKCkgPT4gUHJvbWlzZVNoYXBlLFxuICAgIHVuZGVmaW5lZDogKCkgPT4gVW5kZWZpbmVkU2hhcGUsXG4gICAgbnVsbDogKCkgPT4gbnVsbCxcblxuICAgIGx0OiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmx0JywgcmlnaHRPcGVyYW5kKSxcbiAgICBsdGU6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6bHRlJywgcmlnaHRPcGVyYW5kKSxcbiAgICBlcToga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleShrZXkpO1xuICAgICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gTS51bmRlZmluZWQoKSA6IGtleTtcbiAgICB9LFxuICAgIG5lcToga2V5ID0+IE0ubm90KE0uZXEoa2V5KSksXG4gICAgZ3RlOiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmd0ZScsIHJpZ2h0T3BlcmFuZCksXG4gICAgZ3Q6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6Z3QnLCByaWdodE9wZXJhbmQpLFxuXG4gICAgcmVjb3JkT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgdmFsdWVQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnJlY29yZE9mJywgW2tleVBhdHQsIHZhbHVlUGF0dCwgbGltaXRzXSksXG4gICAgYXJyYXlPZjogKHN1YlBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YXJyYXlPZicsIFtzdWJQYXR0LCBsaW1pdHNdKSxcbiAgICBzZXRPZjogKGtleVBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c2V0T2YnLCBba2V5UGF0dCwgbGltaXRzXSksXG4gICAgYmFnT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgY291bnRQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJhZ09mJywgW2tleVBhdHQsIGNvdW50UGF0dCwgbGltaXRzXSksXG4gICAgY29udGFpbmVySGFzOiAoZWxlbWVudFBhdHQgPSBNLmFueSgpLCBjb3VudFBhdHQgPSAxbiwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmNvbnRhaW5lckhhcycsIFtlbGVtZW50UGF0dCwgY291bnRQYXR0LCBsaW1pdHNdKSxcbiAgICBtYXBPZjogKGtleVBhdHQgPSBNLmFueSgpLCB2YWx1ZVBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bWFwT2YnLCBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHNdKSxcbiAgICBzcGxpdEFycmF5OiAoYmFzZSwgb3B0aW9uYWwgPSB1bmRlZmluZWQsIHJlc3QgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTWF0Y2hlcihcbiAgICAgICAgJ21hdGNoOnNwbGl0QXJyYXknLFxuICAgICAgICBtYWtlU3BsaXRQYXlsb2FkKFtdLCBiYXNlLCBvcHRpb25hbCwgcmVzdCksXG4gICAgICApLFxuICAgIHNwbGl0UmVjb3JkOiAoYmFzZSwgb3B0aW9uYWwgPSB1bmRlZmluZWQsIHJlc3QgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTWF0Y2hlcihcbiAgICAgICAgJ21hdGNoOnNwbGl0UmVjb3JkJyxcbiAgICAgICAgbWFrZVNwbGl0UGF5bG9hZCh7fSwgYmFzZSwgb3B0aW9uYWwsIHJlc3QpLFxuICAgICAgKSxcbiAgICBzcGxpdDogKGJhc2UsIHJlc3QgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpID09PSAnY29weUFycmF5Jykge1xuICAgICAgICAvKiBUT0RPIGF0LXRzLWV4cGVjdC1lcnJvciB3b3JrcyBsb2NhbGx5IGJ1dCBub3QgZnJvbSBAZW5kby9leG8qL1xuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgaXQgc2hvdWxkIGJlIGFuIGFycmF5Ki9cbiAgICAgICAgcmV0dXJuIE0uc3BsaXRBcnJheShiYXNlLCByZXN0ICYmIFtdLCByZXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNLnNwbGl0UmVjb3JkKGJhc2UsIHJlc3QgJiYge30sIHJlc3QpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcGFydGlhbDogKGJhc2UsIHJlc3QgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpID09PSAnY29weUFycmF5Jykge1xuICAgICAgICAvKiBUT0RPIGF0LXRzLWV4cGVjdC1lcnJvciB3b3JrcyBsb2NhbGx5IGJ1dCBub3QgZnJvbSBAZW5kby9leG8qL1xuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgaXQgc2hvdWxkIGJlIGFuIGFycmF5Ki9cbiAgICAgICAgcmV0dXJuIE0uc3BsaXRBcnJheShbXSwgYmFzZSwgcmVzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTS5zcGxpdFJlY29yZCh7fSwgYmFzZSwgcmVzdCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGVyZWY6IHQgPT4gTS5vcih0LCBNLnByb21pc2UoKSksXG4gICAgb3B0OiB0ID0+IE0ub3IoTS51bmRlZmluZWQoKSwgdCksXG5cbiAgICBpbnRlcmZhY2U6IChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMpID0+XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgbWFrZUludGVyZmFjZUd1YXJkKGludGVyZmFjZU5hbWUsIG1ldGhvZEd1YXJkcywgb3B0aW9ucyksXG4gICAgY2FsbDogKC4uLmFyZ1BhdHRlcm5zKSA9PlxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIG1ha2VNZXRob2RHdWFyZE1ha2VyKCdzeW5jJywgYXJnUGF0dGVybnMpLFxuICAgIGNhbGxXaGVuOiAoLi4uYXJnR3VhcmRzKSA9PlxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIG1ha2VNZXRob2RHdWFyZE1ha2VyKCdhc3luYycsIGFyZ0d1YXJkcyksXG5cbiAgICBhd2FpdDogYXJnUGF0dGVybiA9PlxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIG1ha2VBd2FpdEFyZ0d1YXJkKGFyZ1BhdHRlcm4pLFxuICAgIHJhdzogKCkgPT5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBtYWtlUmF3R3VhcmQoKSxcbiAgfSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgY2hlY2tNYXRjaGVzLFxuICAgIG1hdGNoZXMsXG4gICAgbXVzdE1hdGNoLFxuICAgIGFzc2VydFBhdHRlcm4sXG4gICAgaXNQYXR0ZXJuLFxuICAgIGdldFJhbmtDb3ZlcixcbiAgICBNLFxuICAgIGtpbmRPZixcbiAgICBjb250YWluZXJIYXNTcGxpdCxcbiAgfSk7XG59O1xuXG4vKiBPbmx5IGluY2x1ZGUgdGhvc2Ugd2hvc2UgbWVhbmluZyBpcyBpbmRlcGVuZGVudCBvZiBhbiBpbXB1dGVkIHNvcnQgb3JkZXIqL1xuLyogb2YgcmVtb3RhYmxlcywgb3Igb2YgZW5jb2Rpbmcgb2YgcGFzc2FibGUgYXMgc29ydGFibGUgc3RyaW5ncy4gVGh1cywqL1xuLyogZ2V0UmFua0NvdmVyIGlzIG9taXR0ZWQuIFRvIGdldCBvbmUsIHlvdSdkIG5lZWQgdG8gaW5zdGFudGlhdGUqL1xuLyogYG1ha2VQYXR0ZXJuS2l0KClgIHlvdXJzZWxmLiBTaW5jZSB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGV4dGVybmFsKi9cbi8qIHVzZXMgb2YgYGdldFJhbmtDb3ZlcmAsIGZvciBjbGFyaXR5IGR1cmluZyBkZXZlbG9wbWVudCwgYG1ha2VQYXR0ZXJuS2l0YCovXG4vKiBpcyBub3QgY3VycmVudGx5IGV4cG9ydGVkLiovXG4gICAgICAgY29uc3Qge1xuICBjaGVja01hdGNoZXMsXG4gIG1hdGNoZXMsXG4gIG11c3RNYXRjaCxcbiAgYXNzZXJ0UGF0dGVybixcbiAgaXNQYXR0ZXJuLFxuICBnZXRSYW5rQ292ZXIsXG4gIE0sXG4gIGtpbmRPZixcbiAgY29udGFpbmVySGFzU3BsaXQsXG59ID0gbWFrZVBhdHRlcm5LaXQoKTskaM2PX29uY2UuY2hlY2tNYXRjaGVzKGNoZWNrTWF0Y2hlcyk7JGjNj19vbmNlLm1hdGNoZXMobWF0Y2hlcyk7JGjNj19vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpOyRozY9fb25jZS5hc3NlcnRQYXR0ZXJuKGFzc2VydFBhdHRlcm4pOyRozY9fb25jZS5pc1BhdHRlcm4oaXNQYXR0ZXJuKTskaM2PX29uY2UuZ2V0UmFua0NvdmVyKGdldFJhbmtDb3Zlcik7JGjNj19vbmNlLk0oTSk7JGjNj19vbmNlLmtpbmRPZihraW5kT2YpOyRozY9fb25jZS5jb250YWluZXJIYXNTcGxpdChjb250YWluZXJIYXNTcGxpdCk7XG5cbk1NID0gTTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBHdWFyZHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTS5hd2FpdCguLi4pKi9cbmNvbnN0IEF3YWl0QXJnR3VhcmRQYXlsb2FkU2hhcGUgPSBoYXJkZW4oe1xuICBhcmdHdWFyZDogTS5wYXR0ZXJuKCksXG59KTtcblxuICAgICAgIGNvbnN0IEF3YWl0QXJnR3VhcmRTaGFwZSA9IE0ua2luZCgnZ3VhcmQ6YXdhaXRBcmdHdWFyZCcpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge3NwZWNpbWVuIGlzIEF3YWl0QXJnR3VhcmR9XG4gKi8kaM2PX29uY2UuQXdhaXRBcmdHdWFyZFNoYXBlKEF3YWl0QXJnR3VhcmRTaGFwZSk7XG4gICAgICAgY29uc3QgaXNBd2FpdEFyZ0d1YXJkID0gc3BlY2ltZW4gPT5cbiAgbWF0Y2hlcyhzcGVjaW1lbiwgQXdhaXRBcmdHdWFyZFNoYXBlKTskaM2PX29uY2UuaXNBd2FpdEFyZ0d1YXJkKGlzQXdhaXRBcmdHdWFyZCk7XG5oYXJkZW4oaXNBd2FpdEFyZ0d1YXJkKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIEF3YWl0QXJnR3VhcmR9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRBd2FpdEFyZ0d1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIEF3YWl0QXJnR3VhcmRTaGFwZSwgJ2F3YWl0QXJnR3VhcmQnKTtcbn07JGjNj19vbmNlLmFzc2VydEF3YWl0QXJnR3VhcmQoYXNzZXJ0QXdhaXRBcmdHdWFyZCk7XG5oYXJkZW4oYXNzZXJ0QXdhaXRBcmdHdWFyZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBhcmdQYXR0ZXJuXG4gKiBAcmV0dXJucyB7QXdhaXRBcmdHdWFyZH1cbiAqL1xuY29uc3QgbWFrZUF3YWl0QXJnR3VhcmQgPSBhcmdQYXR0ZXJuID0+IHtcbiAgLyoqIEB0eXBlIHtBd2FpdEFyZ0d1YXJkfSAqL1xuICBjb25zdCByZXN1bHQgPSBtYWtlVGFnZ2VkKCdndWFyZDphd2FpdEFyZ0d1YXJkJywge1xuICAgIGFyZ0d1YXJkOiBhcmdQYXR0ZXJuLFxuICB9KTtcbiAgYXNzZXJ0QXdhaXRBcmdHdWFyZChyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogTS5yYXcoKSovXG5cbmNvbnN0IFJhd0d1YXJkUGF5bG9hZFNoYXBlID0gTS5yZWNvcmQoKTtcblxuICAgICAgIGNvbnN0IFJhd0d1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOnJhd0d1YXJkJyk7JGjNj19vbmNlLlJhd0d1YXJkU2hhcGUoUmF3R3VhcmRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBpc1Jhd0d1YXJkID0gc3BlY2ltZW4gPT4gbWF0Y2hlcyhzcGVjaW1lbiwgUmF3R3VhcmRTaGFwZSk7JGjNj19vbmNlLmlzUmF3R3VhcmQoaXNSYXdHdWFyZCk7XG5cbiAgICAgICBjb25zdCBhc3NlcnRSYXdHdWFyZCA9IHNwZWNpbWVuID0+XG4gIG11c3RNYXRjaChzcGVjaW1lbiwgUmF3R3VhcmRTaGFwZSwgJ3Jhd0d1YXJkJyk7XG5cbi8qKlxuICogQHJldHVybnMge1Jhd0d1YXJkfVxuICovJGjNj19vbmNlLmFzc2VydFJhd0d1YXJkKGFzc2VydFJhd0d1YXJkKTtcbmNvbnN0IG1ha2VSYXdHdWFyZCA9ICgpID0+IG1ha2VUYWdnZWQoJ2d1YXJkOnJhd0d1YXJkJywge30pO1xuXG4vKiBNLmNhbGwoLi4uKSovXG4vKiBNLmNhbGxXaGVuKC4uLikqL1xuXG4gICAgICAgY29uc3QgU3luY1ZhbHVlR3VhcmRTaGFwZSA9IE0ub3IoUmF3R3VhcmRTaGFwZSwgTS5wYXR0ZXJuKCkpOyRozY9fb25jZS5TeW5jVmFsdWVHdWFyZFNoYXBlKFN5bmNWYWx1ZUd1YXJkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoU3luY1ZhbHVlR3VhcmRTaGFwZSk7JGjNj19vbmNlLlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKTtcblxuY29uc3QgQXJnR3VhcmRTaGFwZSA9IE0ub3IoUmF3R3VhcmRTaGFwZSwgQXdhaXRBcmdHdWFyZFNoYXBlLCBNLnBhdHRlcm4oKSk7XG4gICAgICAgY29uc3QgQXJnR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoQXJnR3VhcmRTaGFwZSk7JGjNj19vbmNlLkFyZ0d1YXJkTGlzdFNoYXBlKEFyZ0d1YXJkTGlzdFNoYXBlKTtcblxuY29uc3QgU3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgY2FsbEtpbmQ6ICdzeW5jJyxcbiAgYXJnR3VhcmRzOiBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxcbiAgb3B0aW9uYWxBcmdHdWFyZHM6IE0ub3B0KFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKSxcbiAgcmVzdEFyZ0d1YXJkOiBNLm9wdChTeW5jVmFsdWVHdWFyZFNoYXBlKSxcbiAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG59KTtcblxuY29uc3QgQXN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9IGhhcmRlbih7XG4gIGNhbGxLaW5kOiAnYXN5bmMnLFxuICBhcmdHdWFyZHM6IEFyZ0d1YXJkTGlzdFNoYXBlLFxuICBvcHRpb25hbEFyZ0d1YXJkczogTS5vcHQoQXJnR3VhcmRMaXN0U2hhcGUpLFxuICByZXN0QXJnR3VhcmQ6IE0ub3B0KFN5bmNWYWx1ZUd1YXJkU2hhcGUpLFxuICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbn0pO1xuXG4gICAgICAgY29uc3QgTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSBNLm9yKFxuICBTeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4gIEFzeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4pOyRozY9fb25jZS5NZXRob2RHdWFyZFBheWxvYWRTaGFwZShNZXRob2RHdWFyZFBheWxvYWRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBNZXRob2RHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDptZXRob2RHdWFyZCcpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgTWV0aG9kR3VhcmR9XG4gKi8kaM2PX29uY2UuTWV0aG9kR3VhcmRTaGFwZShNZXRob2RHdWFyZFNoYXBlKTtcbiAgICAgICBjb25zdCBhc3NlcnRNZXRob2RHdWFyZCA9IHNwZWNpbWVuID0+IHtcbiAgbXVzdE1hdGNoKHNwZWNpbWVuLCBNZXRob2RHdWFyZFNoYXBlLCAnbWV0aG9kR3VhcmQnKTtcbn07JGjNj19vbmNlLmFzc2VydE1ldGhvZEd1YXJkKGFzc2VydE1ldGhvZEd1YXJkKTtcbmhhcmRlbihhc3NlcnRNZXRob2RHdWFyZCk7XG5cbi8qKlxuICogQHBhcmFtIHsnc3luYyd8J2FzeW5jJ30gY2FsbEtpbmRcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gYXJnR3VhcmRzXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IFtvcHRpb25hbEFyZ0d1YXJkc11cbiAqIEBwYXJhbSB7U3luY1ZhbHVlR3VhcmR9IFtyZXN0QXJnR3VhcmRdXG4gKiBAcmV0dXJucyB7TWV0aG9kR3VhcmRNYWtlcn1cbiAqL1xuY29uc3QgbWFrZU1ldGhvZEd1YXJkTWFrZXIgPSAoXG4gIGNhbGxLaW5kLFxuICBhcmdHdWFyZHMsXG4gIG9wdGlvbmFsQXJnR3VhcmRzID0gdW5kZWZpbmVkLFxuICByZXN0QXJnR3VhcmQgPSB1bmRlZmluZWQsXG4pID0+XG4gIGhhcmRlbih7XG4gICAgb3B0aW9uYWw6ICguLi5vcHRBcmdHdWFyZHMpID0+IHtcbiAgICAgIG9wdGlvbmFsQXJnR3VhcmRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBDYW4gb25seSBoYXZlIG9uZSBzZXQgb2Ygb3B0aW9uYWwgZ3VhcmRzYDtcbiAgICAgIHJlc3RBcmdHdWFyZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgb3B0aW9uYWwgYXJnIGd1YXJkcyBtdXN0IGNvbWUgYmVmb3JlIHJlc3QgYXJnYDtcbiAgICAgIHJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihjYWxsS2luZCwgYXJnR3VhcmRzLCBvcHRBcmdHdWFyZHMpO1xuICAgIH0sXG4gICAgcmVzdDogckFyZ0d1YXJkID0+IHtcbiAgICAgIHJlc3RBcmdHdWFyZCA9PT0gdW5kZWZpbmVkIHx8IEZhaWxgQ2FuIG9ubHkgaGF2ZSBvbmUgcmVzdCBhcmdgO1xuICAgICAgcmV0dXJuIG1ha2VNZXRob2RHdWFyZE1ha2VyKFxuICAgICAgICBjYWxsS2luZCxcbiAgICAgICAgYXJnR3VhcmRzLFxuICAgICAgICBvcHRpb25hbEFyZ0d1YXJkcyxcbiAgICAgICAgckFyZ0d1YXJkLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHJldHVybnM6IChyZXR1cm5HdWFyZCA9IE0udW5kZWZpbmVkKCkpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7TWV0aG9kR3VhcmR9ICovXG4gICAgICBjb25zdCByZXN1bHQgPSBtYWtlVGFnZ2VkKCdndWFyZDptZXRob2RHdWFyZCcsIHtcbiAgICAgICAgY2FsbEtpbmQsXG4gICAgICAgIGFyZ0d1YXJkcyxcbiAgICAgICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgICAgIHJlc3RBcmdHdWFyZCxcbiAgICAgICAgcmV0dXJuR3VhcmQsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydE1ldGhvZEd1YXJkKHJlc3VsdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH0pO1xuXG4gICAgICAgY29uc3QgSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAgaW50ZXJmYWNlTmFtZTogTS5zdHJpbmcoKSxcbiAgICBtZXRob2RHdWFyZHM6IE0ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTWV0aG9kR3VhcmRTaGFwZSksXG4gIH0sXG4gIHtcbiAgICBkZWZhdWx0R3VhcmRzOiBNLm9yKE0udW5kZWZpbmVkKCksICdwYXNzYWJsZScsICdyYXcnKSxcbiAgICBzbG9wcHk6IE0uYm9vbGVhbigpLFxuICAgIHN5bWJvbE1ldGhvZEd1YXJkczogTS5tYXBPZihNLnN5bWJvbCgpLCBNZXRob2RHdWFyZFNoYXBlKSxcbiAgfSxcbik7JGjNj19vbmNlLkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlKEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IEludGVyZmFjZUd1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOmludGVyZmFjZUd1YXJkJyk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBJbnRlcmZhY2VHdWFyZH1cbiAqLyRozY9fb25jZS5JbnRlcmZhY2VHdWFyZFNoYXBlKEludGVyZmFjZUd1YXJkU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydEludGVyZmFjZUd1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIEludGVyZmFjZUd1YXJkU2hhcGUsICdpbnRlcmZhY2VHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0SW50ZXJmYWNlR3VhcmQoYXNzZXJ0SW50ZXJmYWNlR3VhcmQpO1xuaGFyZGVuKGFzc2VydEludGVyZmFjZUd1YXJkKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgTWV0aG9kR3VhcmQ+fSBbTSA9IFJlY29yZDxQcm9wZXJ0eUtleSwgTWV0aG9kR3VhcmQ+XVxuICogQHBhcmFtIHtzdHJpbmd9IGludGVyZmFjZU5hbWVcbiAqIEBwYXJhbSB7TX0gbWV0aG9kR3VhcmRzXG4gKiBAcGFyYW0ge3sgc2xvcHB5PzogYm9vbGVhbiwgZGVmYXVsdEd1YXJkcz86IERlZmF1bHRHdWFyZFR5cGUgfX0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SW50ZXJmYWNlR3VhcmQ8TT59XG4gKi9cbmNvbnN0IG1ha2VJbnRlcmZhY2VHdWFyZCA9IChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7IHNsb3BweSA9IGZhbHNlLCBkZWZhdWx0R3VhcmRzID0gc2xvcHB5ID8gJ3Bhc3NhYmxlJyA6IHVuZGVmaW5lZCB9ID1cbiAgICBvcHRpb25zO1xuICAvKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHN0cmluZy1rZXllZCBtZXRob2QgZ3VhcmRzIGFyZSByZXByZXNlbnRlZCBpbiovXG4gIC8qIGEgQ29weVJlY29yZC4gQnV0IHN5bWJvbC1rZXllZCBtZXRob2RzIGNhbm5vdCBiZSwgc28gd2UgcHV0IHRob3NlIGluIGEqL1xuICAvKiBDb3B5TWFwIHdoZW4gcHJlc2VudC4qL1xuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIE1ldGhvZEd1YXJkPn0gKi9cbiAgY29uc3Qgc3RyaW5nTWV0aG9kR3VhcmRzID0ge307XG4gIC8qKiBAdHlwZSB7QXJyYXk8W3N5bWJvbCwgTWV0aG9kR3VhcmRdPn0gKi9cbiAgY29uc3Qgc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcyA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBvd25LZXlzKG1ldGhvZEd1YXJkcykpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1ldGhvZEd1YXJkc1svKiogQHR5cGUge3N0cmluZ30gKi8gKGtleSldO1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3ltYm9sJykge1xuICAgICAgc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmluZ01ldGhvZEd1YXJkc1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIC8qKiBAdHlwZSB7SW50ZXJmYWNlR3VhcmR9ICovXG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOmludGVyZmFjZUd1YXJkJywge1xuICAgIGludGVyZmFjZU5hbWUsXG4gICAgbWV0aG9kR3VhcmRzOiBzdHJpbmdNZXRob2RHdWFyZHMsXG4gICAgLi4uKHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMubGVuZ3RoXG4gICAgICA/IHsgc3ltYm9sTWV0aG9kR3VhcmRzOiBtYWtlQ29weU1hcChzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzKSB9XG4gICAgICA6IHt9KSxcbiAgICBkZWZhdWx0R3VhcmRzLFxuICB9KTtcbiAgYXNzZXJ0SW50ZXJmYWNlR3VhcmQocmVzdWx0KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7SW50ZXJmYWNlR3VhcmQ8TT59ICovIChyZXN1bHQpO1xufTtcblxuY29uc3QgR3VhcmRQYXlsb2FkU2hhcGVzID0gaGFyZGVuKHtcbiAgJ2d1YXJkOmF3YWl0QXJnR3VhcmQnOiBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlLFxuICAnZ3VhcmQ6cmF3R3VhcmQnOiBSYXdHdWFyZFBheWxvYWRTaGFwZSxcbiAgJ2d1YXJkOm1ldGhvZEd1YXJkJzogTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4gICdndWFyZDppbnRlcmZhY2VHdWFyZCc6IEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlLFxufSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0TGltaXRzIjpbImRlZmF1bHRMaW1pdHMiXSwiY2hlY2tNYXRjaGVzIjpbImNoZWNrTWF0Y2hlcyJdLCJtYXRjaGVzIjpbIm1hdGNoZXMiXSwibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiJdLCJnZXRSYW5rQ292ZXIiOlsiZ2V0UmFua0NvdmVyIl0sIk0iOlsiTSJdLCJraW5kT2YiOlsia2luZE9mIl0sImNvbnRhaW5lckhhc1NwbGl0IjpbImNvbnRhaW5lckhhc1NwbGl0Il0sIkF3YWl0QXJnR3VhcmRTaGFwZSI6WyJBd2FpdEFyZ0d1YXJkU2hhcGUiXSwiaXNBd2FpdEFyZ0d1YXJkIjpbImlzQXdhaXRBcmdHdWFyZCJdLCJhc3NlcnRBd2FpdEFyZ0d1YXJkIjpbImFzc2VydEF3YWl0QXJnR3VhcmQiXSwiUmF3R3VhcmRTaGFwZSI6WyJSYXdHdWFyZFNoYXBlIl0sImlzUmF3R3VhcmQiOlsiaXNSYXdHdWFyZCJdLCJhc3NlcnRSYXdHdWFyZCI6WyJhc3NlcnRSYXdHdWFyZCJdLCJTeW5jVmFsdWVHdWFyZFNoYXBlIjpbIlN5bmNWYWx1ZUd1YXJkU2hhcGUiXSwiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiOlsiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiXSwiQXJnR3VhcmRMaXN0U2hhcGUiOlsiQXJnR3VhcmRMaXN0U2hhcGUiXSwiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiOlsiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiXSwiTWV0aG9kR3VhcmRTaGFwZSI6WyJNZXRob2RHdWFyZFNoYXBlIl0sImFzc2VydE1ldGhvZEd1YXJkIjpbImFzc2VydE1ldGhvZEd1YXJkIl0sIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIjpbIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIl0sIkludGVyZmFjZUd1YXJkU2hhcGUiOlsiSW50ZXJmYWNlR3VhcmRTaGFwZSJdLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCI6WyJhc3NlcnRJbnRlcmZhY2VHdWFyZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAiAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAALArFhswkAALMJAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQsbWVtb1JhY2U7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLFskaM2PX2EgPT4gKG1lbW9SYWNlID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCduYW1lJyx7dmFsdWU6XCJtYWtlUHJvbWlzZUtpdFwifSk7JGjNj19vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCduYW1lJyx7dmFsdWU6XCJyYWNlUHJvbWlzZXNcIn0pOyRozY9fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTtcblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2UgPSBnbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlIHx8IFByb21pc2U7XG5cbi8qKlxuICogbWFrZVByb21pc2VLaXQoKSBidWlsZHMgYSBQcm9taXNlIG9iamVjdCwgYW5kIHJldHVybnMgYSByZWNvcmRcbiAqIGNvbnRhaW5pbmcgdGhlIHByb21pc2UgaXRzZWxmLCBhcyB3ZWxsIGFzIHNlcGFyYXRlIGZhY2V0cyBmb3IgcmVzb2x2aW5nXG4gKiBhbmQgcmVqZWN0aW5nIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3NyYy90eXBlcy5qcycpLlByb21pc2VLaXQ8VD59XG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlUHJvbWlzZUtpdCgpIHtcbiAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0gPSBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuICBjb25zdCBwcm9taXNlID0gbmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfSk7XG59XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vKiBOQjogQW5vdGhlciBpbXBsZW1lbnRhdGlvbiBmb3IgUHJvbWlzZS5yYWNlIHdvdWxkIGJlIHRvIHVzZSB0aGUgcmVsZWFzaW5nIGV4ZWN1dG9yLCovXG4vKiBIb3dldmVyIHdoaWxlIGl0IHdvdWxkIG5vIGxvbmdlciBsZWFrIHRoZSByYWNlZCBwcm9taXNlIG9iamVjdHMgdGhlbXNlbHZlcywgaXQgd291bGQqL1xuLyogc3RpbGwgbGVhayByZWFjdGlvbnMgb24gdGhlIG5vbi1yZXNvbHZlZCBwcm9taXNlcyBjb250ZW5kaW5nIGZvciB0aGUgcmFjZS4qL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUge3JlYWRvbmx5IHVua25vd25bXSB8IFtdfSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbiAgICAgICBmdW5jdGlvbiByYWNlUHJvbWlzZXModmFsdWVzKSB7XG4gIHJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLCB2YWx1ZXMpKTtcbn1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADnrhCZAwMAAAMDAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsJ25hbWUnLHt2YWx1ZTpcImlzUHJvbWlzZVwifSk7JGjNj19vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOy8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBtYXliZVByb21pc2UgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHttYXliZVByb21pc2UgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuICAgICAgIGZ1bmN0aW9uIGlzUHJvbWlzZShtYXliZVByb21pc2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpID09PSBtYXliZVByb21pc2U7XG59XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAx2hNn0QWAABEFgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogSW5pdGlhbCB2ZXJzaW9uIGF1dGhvcmVkIGJ5IEJyaWFuIEtpbTpcbmh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMTc0NjkjaXNzdWVjb21tZW50LTY4NTIxNjc3N1xuIFRoaXMgaXMgZnJlZSBhbmQgdW5lbmN1bWJlcmVkIHNvZnR3YXJlIHJlbGVhc2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4uXG4gQW55b25lIGlzIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBwdWJsaXNoLCB1c2UsIGNvbXBpbGUsIHNlbGwsIG9yXG5kaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGVpdGhlciBpbiBzb3VyY2UgY29kZSBmb3JtIG9yIGFzIGEgY29tcGlsZWRcbmJpbmFyeSwgZm9yIGFueSBwdXJwb3NlLCBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsLCBhbmQgYnkgYW55XG5tZWFucy5cbiBJbiBqdXJpc2RpY3Rpb25zIHRoYXQgcmVjb2duaXplIGNvcHlyaWdodCBsYXdzLCB0aGUgYXV0aG9yIG9yIGF1dGhvcnNcbm9mIHRoaXMgc29mdHdhcmUgZGVkaWNhdGUgYW55IGFuZCBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZVxuc29mdHdhcmUgdG8gdGhlIHB1YmxpYyBkb21haW4uIFdlIG1ha2UgdGhpcyBkZWRpY2F0aW9uIGZvciB0aGUgYmVuZWZpdFxub2YgdGhlIHB1YmxpYyBhdCBsYXJnZSBhbmQgdG8gdGhlIGRldHJpbWVudCBvZiBvdXIgaGVpcnMgYW5kXG5zdWNjZXNzb3JzLiBXZSBpbnRlbmQgdGhpcyBkZWRpY2F0aW9uIHRvIGJlIGFuIG92ZXJ0IGFjdCBvZlxucmVsaW5xdWlzaG1lbnQgaW4gcGVycGV0dWl0eSBvZiBhbGwgcHJlc2VudCBhbmQgZnV0dXJlIHJpZ2h0cyB0byB0aGlzXG5zb2Z0d2FyZSB1bmRlciBjb3B5cmlnaHQgbGF3LlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SXG5PVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSxcbkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUlxuT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG8gPGh0dHA6Ly91bmxpY2Vuc2Uub3JnLz5cbiovXG5cblxuXG5cblxuXG5cbi8qKlxuICogVE9ETyBDb25zb2xpZGF0ZSB3aXRoIGBpc1ByaW1pdGl2ZWAgdGhhdCdzIGN1cnJlbnRseSBpbiBgQGVuZG8vcGFzcy1zdHlsZWAuXG4gKiBMYXllcmluZyBjb25zdHJhaW50cyBtYWtlIHRoaXMgdHJpY2t5LCB3aGljaCBpcyB3aHkgd2UgaGF2ZW4ndCB5ZXQgZmlndXJlZFxuICogb3V0IGhvdyB0byBkbyB0aGlzLlxuICpcbiAqIEB0eXBlIHsodmFsOiB1bmtub3duKSA9PiB2YWwgaXMgKHVuZGVmaW5lZFxuICogfCBudWxsXG4gKiB8IGJvb2xlYW5cbiAqIHwgbnVtYmVyXG4gKiB8IGJpZ2ludFxuICogfCBzdHJpbmdcbiAqIHwgc3ltYm9sKX1cbiAqL1xuY29uc3QgaXNQcmltaXRpdmUgPSB2YWwgPT5cbiAgIXZhbCB8fCAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZmVycmVkXG4gKiBAcHJvcGVydHkgeyh2YWx1ZT86IElNUE9SVChcIi4vdHlwZXMuanNcIikuRVJlZjxUPiApID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwcm9wZXJ0eSB7KGVycj86IGFueSApID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBuZXZlclxuICogIHwge3NldHRsZWQ6IGZhbHNlLCBkZWZlcnJlZHM6IFNldDxEZWZlcnJlZD59XG4gKiAgfCB7c2V0dGxlZDogdHJ1ZSwgZGVmZXJyZWRzPzogdW5kZWZpbmVkfVxuICogfSBQcm9taXNlTWVtb1JlY29yZFxuICovXG5cbi8qIEtleXMgYXJlIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIHJhY2UsIHZhbHVlcyBhcmUgYSByZWNvcmQgb2YgZGF0YSBjb250YWluaW5nIGEqL1xuLyogc2V0IG9mIGRlZmVycmVkcyBhbmQgd2hldGhlciB0aGUgdmFsdWUgaGFzIHNldHRsZWQuKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIFByb21pc2VNZW1vUmVjb3JkPn0gKi9cbmNvbnN0IGtub3duUHJvbWlzZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZU1lbW9SZWNvcmQgfCB1bmRlZmluZWR9IHJlY29yZFxuICogQHJldHVybnMge1NldDxEZWZlcnJlZD59XG4gKi9cbmNvbnN0IG1hcmtTZXR0bGVkID0gcmVjb3JkID0+IHtcbiAgaWYgKCFyZWNvcmQgfHwgcmVjb3JkLnNldHRsZWQpIHtcbiAgICByZXR1cm4gbmV3IFNldCgpO1xuICB9XG5cbiAgY29uc3QgeyBkZWZlcnJlZHMgfSA9IHJlY29yZDtcbiAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIHtcbiAgICBkZWZlcnJlZHM6IHVuZGVmaW5lZCxcbiAgICBzZXR0bGVkOiB0cnVlLFxuICB9KTtcbiAgT2JqZWN0LmZyZWV6ZShyZWNvcmQpO1xuICByZXR1cm4gZGVmZXJyZWRzO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZU1lbW9SZWNvcmR9XG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQgPSB2YWx1ZSA9PiB7XG4gIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAvKiBJZiB0aGUgY29udGVuZGVyIGlzIGEgcHJpbWl0aXZlLCBhdHRlbXB0aW5nIHRvIHVzZSBpdCBhcyBhIGtleSBpbiB0aGUqL1xuICAgIC8qIHdlYWttYXAgd291bGQgdGhyb3cgYW4gZXJyb3IuIEx1Y2tpbHksIGl0IGlzIHNhZmUgdG8gY2FsbCovXG4gICAgLyogYFByb21pc2UucmVzb2x2ZShjb250ZW5kZXIpLnRoZW5gIG9uIGEgcHJpbWl0aXZlIHZhbHVlIG11bHRpcGxlIHRpbWVzKi9cbiAgICAvKiBiZWNhdXNlIHRoZSBwcm9taXNlIGZ1bGZpbGxzIGltbWVkaWF0ZWx5LiBTbyB3ZSBmYWtlIGEgc2V0dGxlZCByZWNvcmQuKi9cbiAgICByZXR1cm4gaGFyZGVuKHsgc2V0dGxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIGxldCByZWNvcmQgPSBrbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZWNvcmQgPSB7IGRlZmVycmVkczogbmV3IFNldCgpLCBzZXR0bGVkOiBmYWxzZSB9O1xuICAgIGtub3duUHJvbWlzZXMuc2V0KHZhbHVlLCByZWNvcmQpO1xuICAgIC8qIFRoaXMgY2FsbCB0byBgdGhlbmAgaGFwcGVucyBvbmNlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHZhbHVlLiovXG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuICAgICAgdmFsID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlc29sdmUgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlamVjdCB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCB7IHJhY2UgfSA9IHtcbiAgLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIHtyZWFkb25seSB1bmtub3duW10gfCBbXX0gVFxuICogQHRlbXBsYXRlIHtQcm9taXNlQ29uc3RydWN0b3J9IFtQPVByb21pc2VDb25zdHJ1Y3Rvcl1cbiAqIEB0aGlzIHtQfVxuICogQHBhcmFtIHtUfSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFRbbnVtYmVyXT4+fSBBIG5ldyBQcm9taXNlLlxuICovXG4gIHJhY2UodmFsdWVzKSB7XG4gICAgbGV0IGRlZmVycmVkO1xuICAgIC8qKiBAdHlwZSB7Wy4uLlRdfSAqL1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgZmlsbGVkIGJ5IHRoZSBsb29wKi9cbiAgICBjb25zdCBjYWNoZWRWYWx1ZXMgPSBbXTtcbiAgICBjb25zdCBDID0gdGhpcztcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgQygocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBkZWZlcnJlZCA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBjYWNoZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHsgc2V0dGxlZCwgZGVmZXJyZWRzIH0gPSBnZXRNZW1vUmVjb3JkKHZhbHVlKTtcbiAgICAgICAgaWYgKHNldHRsZWQpIHtcbiAgICAgICAgICAvKiBJZiB0aGUgY29udGVuZGVyIGlzIHNldHRsZWQgKGluY2x1ZGluZyBwcmltaXRpdmVzKSwgaXQgaXMgc2FmZSovXG4gICAgICAgICAgLyogdG8gY2FsbCBgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuYCBvbiBpdC4qL1xuICAgICAgICAgIEMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKiBUaGUgZmluYWxseSBjYWxsYmFjayBleGVjdXRlcyB3aGVuIGFueSB2YWx1ZSBzZXR0bGVzLCBwcmV2ZW50aW5nIGFueSBvZiovXG4gICAgLyogdGhlIHVucmVzb2x2ZWQgdmFsdWVzIGZyb20gcmV0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZXNvbHZlZCB2YWx1ZS4qL1xuICAgIHJldHVybiByZXN1bHQuZmluYWxseSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcykge1xuICAgICAgICBjb25zdCB7IGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChkZWZlcnJlZHMpIHtcbiAgICAgICAgICBkZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTskaM2PX29uY2UucmFjZShyYWNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACJ+oaB0IAAAdCAAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvciBUaGUgcHJvbWlzZSBleGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IElNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpIGJ1aWxkcyByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgd2hpY2ggZHJvcCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIGdhdGhlcmVkIGZyb20gYW4gZXhlY3V0b3IgdG8gYmUgdXNlZCB3aXRoIGFcbiAqIHByb21pc2UgY29uc3RydWN0b3IuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQaWNrPElNUE9SVCgnLi90eXBlcy5qcycpLlByb21pc2VLaXQ8VD4sICdyZXNvbHZlJyB8ICdyZWplY3QnPiAmIHsgZXhlY3V0b3I6IFByb21pc2VFeGVjdXRvcjxUPn19XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAoKSA9PiB7XG4gIC8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgodmFsdWU6IElNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWQpfSAqL1xuICBsZXQgaW50ZXJuYWxSZXNvbHZlO1xuICAvKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZCl9ICovXG4gIGxldCBpbnRlcm5hbFJlamVjdDtcblxuICAvKiogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+fSB2YWx1ZSAqL1xuICBjb25zdCByZXNvbHZlID0gdmFsdWUgPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlc29sdmUpIHtcbiAgICAgIGludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG4gICAgICBpbnRlcm5hbFJlc29sdmUgPSBudWxsO1xuICAgICAgaW50ZXJuYWxSZWplY3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIEBwYXJhbSB7dW5rbm93bn0gcmVhc29uICovXG4gIGNvbnN0IHJlamVjdCA9IHJlYXNvbiA9PiB7XG4gICAgaWYgKGludGVybmFsUmVqZWN0KSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChyZWFzb24pO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVqZWN0ID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZXhlY3V0b3IgPSAocmVzLCByZWopID0+IHtcbiAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSB1bmRlZmluZWQgJiYgaW50ZXJuYWxSZWplY3QgPT09IHVuZGVmaW5lZCk7XG4gICAgaW50ZXJuYWxSZXNvbHZlID0gcmVzO1xuICAgIGludGVybmFsUmVqZWN0ID0gcmVqO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0pO1xufTskaM2PX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACzme7pRHAAAURwAAB0AAABAZW5kby9zdHJlYW0tdjEuMi4xMy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJtYWtlUGlwZSIsIm1ha2VRdWV1ZSIsIm1ha2VTdHJlYW0iLCJtYXBSZWFkZXIiLCJtYXBXcml0ZXIiLCJwcmltZSIsInB1bXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLG1ha2VQcm9taXNlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBUeXBlU2NyaXB0IFJlYWRPbmx5IHNlbWFudGljcyBhcmUgbm90IHN1ZmZpY2llbnRseSBleHByZXNzaXZlIHRvIGRpc3Rpbmd1aXNoKi9cbi8qIGEgdmFsdWUgb25lIHByb21pc2VzIG5vdCB0byBhbHRlciBmcm9tIGEgdmFsdWUgb25lIG11c3Qgbm90IGFsdGVyLCovXG4vKiBtYWtpbmcgaXQgdXNlbGVzcy4qL1xuY29uc3QgZnJlZXplID0gLyoqIEB0eXBlIHs8VD4odjogVCB8IFJlYWRvbmx5PFQ+KSA9PiBUfSAqLyAoT2JqZWN0LmZyZWV6ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Bc3luY1F1ZXVlPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVF1ZXVlID0gKCkgPT4ge1xuICBsZXQgeyBwcm9taXNlOiB0YWlsUHJvbWlzZSwgcmVzb2x2ZTogdGFpbFJlc29sdmUgfSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gIHJldHVybiB7XG4gICAgcHV0KHZhbHVlKSB7XG4gICAgICBjb25zdCB7IHJlc29sdmUsIHByb21pc2UgfSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gICAgICB0YWlsUmVzb2x2ZShmcmVlemUoeyB2YWx1ZSwgcHJvbWlzZSB9KSk7XG4gICAgICB0YWlsUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSxcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCBwcm9taXNlID0gdGFpbFByb21pc2UudGhlbihuZXh0ID0+IG5leHQudmFsdWUpO1xuICAgICAgdGFpbFByb21pc2UgPSB0YWlsUHJvbWlzZS50aGVuKG5leHQgPT4gbmV4dC5wcm9taXNlKTtcbiAgICAgIHJldHVybiBoYXJkZW4ocHJvbWlzZSk7XG4gICAgfSxcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VRdWV1ZShtYWtlUXVldWUpO1xuaGFyZGVuKG1ha2VRdWV1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRSZWFkXG4gKiBAdGVtcGxhdGUgVFdyaXRlXG4gKiBAdGVtcGxhdGUgVFJlYWRSZXR1cm5cbiAqIEB0ZW1wbGF0ZSBUV3JpdGVSZXR1cm5cbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXN5bmNTcHJpbmc8SXRlcmF0b3JSZXN1bHQ8VFJlYWQsIFRSZWFkUmV0dXJuPj59IGFja3NcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXN5bmNTaW5rPEl0ZXJhdG9yUmVzdWx0PFRXcml0ZSwgVFdyaXRlUmV0dXJuPj59IGRhdGFcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTdHJlYW0gPSAoYWNrcywgZGF0YSkgPT4ge1xuICBjb25zdCBzdHJlYW0gPSBoYXJkZW4oe1xuICAgIC8qKlxuICogQHBhcmFtIHtUV3JpdGV9IHZhbHVlXG4gKi9cbiAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAvKiBOb3RlIHRoZSBzaGFsbG93IGZyZWV6ZSBzaW5jZSB2YWx1ZSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBmcmVlemFibGUqL1xuICAgICAgLyogKHR5cGVkIGFycmF5cyBhcmUgbm90KS4qL1xuICAgICAgZGF0YS5wdXQoZnJlZXplKHsgdmFsdWUsIGRvbmU6IGZhbHNlIH0pKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgLyoqXG4gKiBAcGFyYW0ge1RXcml0ZVJldHVybn0gdmFsdWVcbiAqL1xuICAgIHJldHVybih2YWx1ZSkge1xuICAgICAgZGF0YS5wdXQoZnJlZXplKHsgdmFsdWUsIGRvbmU6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuIGFja3MuZ2V0KCk7XG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKi9cbiAgICB0aHJvdyhlcnJvcikge1xuICAgICAgZGF0YS5wdXQoaGFyZGVuKFByb21pc2UucmVqZWN0KGVycm9yKSkpO1xuICAgICAgcmV0dXJuIGFja3MuZ2V0KCk7XG4gICAgfSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHN0cmVhbTtcbn07JGjNj19vbmNlLm1ha2VTdHJlYW0obWFrZVN0cmVhbSk7XG5oYXJkZW4obWFrZVN0cmVhbSk7XG5cbi8qIEpTRG9jIFR5cGVTY3JpcHQgc2VlbXMgdW5hYmxlIHRvIGV4cHJlc3MgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uJ3MqL1xuLyogZW50YW5nbGVtZW50IG9mIHF1ZXVlcywgYnV0IHRoZSBkZWZpbml0aW9uIGluIHR5cGVzLmQudHMgd29ya3MgZm9yIHRoZSBlbmQqL1xuLyogdXNlci4qL1xuICAgICAgIGNvbnN0IG1ha2VQaXBlID0gKCkgPT4ge1xuICBjb25zdCBkYXRhID0gbWFrZVF1ZXVlKCk7XG4gIGNvbnN0IGFja3MgPSBtYWtlUXVldWUoKTtcbiAgY29uc3QgcmVhZGVyID0gbWFrZVN0cmVhbShhY2tzLCBkYXRhKTtcbiAgY29uc3Qgd3JpdGVyID0gbWFrZVN0cmVhbShkYXRhLCBhY2tzKTtcbiAgcmV0dXJuIGhhcmRlbihbd3JpdGVyLCByZWFkZXJdKTtcbn07JGjNj19vbmNlLm1ha2VQaXBlKG1ha2VQaXBlKTtcbmhhcmRlbihtYWtlUGlwZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRSZWFkXG4gKiBAdGVtcGxhdGUgVFdyaXRlXG4gKiBAdGVtcGxhdGUgVFJlYWRSZXR1cm5cbiAqIEB0ZW1wbGF0ZSBUV3JpdGVSZXR1cm5cbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuU3RyZWFtPFRXcml0ZSwgVFJlYWQsIFRXcml0ZVJldHVybiwgVFJlYWRSZXR1cm4+fSB3cml0ZXJcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuU3RyZWFtPFRSZWFkLCBUV3JpdGUsIFRSZWFkUmV0dXJuLCBUV3JpdGVSZXR1cm4+fSByZWFkZXJcbiAqIEBwYXJhbSB7VFdyaXRlfSBwcmltZXJcbiAqL1xuICAgICAgIGNvbnN0IHB1bXAgPSBhc3luYyAod3JpdGVyLCByZWFkZXIsIHByaW1lcikgPT4ge1xuICAvKiogQHBhcmFtIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmVhZFJldHVybj4+fSBwcm9taXNlICovXG4gIGNvbnN0IHRpY2sgPSBwcm9taXNlID0+XG4gICAgRS53aGVuKFxuICAgICAgcHJvbWlzZSxcbiAgICAgIHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHJldHVybiB3cml0ZXIucmV0dXJuKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyogQmVob2xkOiBtdXR1YWwgcmVjdXJzaW9uLiovXG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgICAgICByZXR1cm4gdG9jayh3cml0ZXIubmV4dChyZXN1bHQudmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgvKiogQHR5cGUge0Vycm9yfSAqLyBlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gd3JpdGVyLnRocm93KGVycm9yKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgLyoqIEBwYXJhbSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUV3JpdGUsIFRXcml0ZVJldHVybj4+fSBwcm9taXNlICovXG4gIGNvbnN0IHRvY2sgPSBwcm9taXNlID0+XG4gICAgRS53aGVuKFxuICAgICAgcHJvbWlzZSxcbiAgICAgIHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHJldHVybiByZWFkZXIucmV0dXJuKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRpY2socmVhZGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoLyoqIEB0eXBlIHtFcnJvcn0gKi8gZXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlYWRlci50aHJvdyhlcnJvcik7XG4gICAgICB9LFxuICAgICk7XG4gIGF3YWl0IHRpY2socmVhZGVyLm5leHQocHJpbWVyKSk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59OyRozY9fb25jZS5wdW1wKHB1bXApO1xuaGFyZGVuKHB1bXApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUUmVhZFxuICogQHRlbXBsYXRlIFRXcml0ZVxuICogQHRlbXBsYXRlIFRSZXR1cm5cbiAqIEBwYXJhbSB7QXN5bmNHZW5lcmF0b3I8VFJlYWQsIFRSZXR1cm4sIFRXcml0ZT59IGdlbmVyYXRvclxuICogQHBhcmFtIHtUV3JpdGV9IHByaW1lclxuICovXG4gICAgICAgY29uc3QgcHJpbWUgPSAoZ2VuZXJhdG9yLCBwcmltZXIpID0+IHtcbiAgLyogV2UgY2FwdHVyZSB0aGUgZmlyc3QgcmV0dXJuZWQgcHJvbWlzZS4qL1xuICBjb25zdCBmaXJzdCA9IGdlbmVyYXRvci5uZXh0KHByaW1lcik7XG4gIC8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8VFJlYWQsIFRSZXR1cm4+PX0gKi9cbiAgbGV0IHJlc3VsdDtcbiAgY29uc3QgcHJpbWVkID0gaGFyZGVuKHtcbiAgICAvKiogQHBhcmFtIHtUV3JpdGV9IHZhbHVlICovXG4gICAgYXN5bmMgbmV4dCh2YWx1ZSkge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAamVzc2llLmpzL3NhZmUtYXdhaXQtc2VwYXJhdG9yKi9cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmlyc3Q7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBnZW5lcmF0b3IubmV4dCh2YWx1ZSk7XG4gICAgfSxcbiAgICAvKiogQHBhcmFtIHtUUmV0dXJufSB2YWx1ZSAqL1xuICAgIGFzeW5jIHJldHVybih2YWx1ZSkge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAamVzc2llLmpzL3NhZmUtYXdhaXQtc2VwYXJhdG9yKi9cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmlyc3Q7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBnZW5lcmF0b3IucmV0dXJuKHZhbHVlKTtcbiAgICB9LFxuICAgIC8qKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAqL1xuICAgIGFzeW5jIHRocm93KGVycm9yKSB7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBqZXNzaWUuanMvc2FmZS1hd2FpdC1zZXBhcmF0b3IqL1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBmaXJzdDtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBnZW5lcmF0b3IudGhyb3coZXJyb3IpO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gcHJpbWVkO1xufTskaM2PX29uY2UucHJpbWUocHJpbWUpO1xuaGFyZGVuKHByaW1lKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVEluXG4gKiBAdGVtcGxhdGUgVE91dFxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkZXI8VEluPn0gcmVhZGVyXG4gKiBAcGFyYW0geyh2YWx1ZTogVEluKSA9PiBUT3V0fSB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkZXI8VE91dD59XG4gKi9cbiAgICAgICBjb25zdCBtYXBSZWFkZXIgPSAocmVhZGVyLCB0cmFuc2Zvcm0pID0+IHtcbiAgYXN5bmMgZnVuY3Rpb24qIHRyYW5zZm9ybUdlbmVyYXRvcigpIHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIHJlYWRlcikge1xuICAgICAgeWllbGQgdHJhbnNmb3JtKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBoYXJkZW4odHJhbnNmb3JtR2VuZXJhdG9yKTtcbiAgcmV0dXJuIGhhcmRlbih0cmFuc2Zvcm1HZW5lcmF0b3IoKSk7XG59OyRozY9fb25jZS5tYXBSZWFkZXIobWFwUmVhZGVyKTtcbmhhcmRlbihtYXBSZWFkZXIpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUSW5cbiAqIEB0ZW1wbGF0ZSBUT3V0XG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLldyaXRlcjxUT3V0Pn0gd3JpdGVyXG4gKiBAcGFyYW0geyh2YWx1ZTogVEluKSA9PiBUT3V0fSB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Xcml0ZXI8VEluPn1cbiAqL1xuICAgICAgIGNvbnN0IG1hcFdyaXRlciA9ICh3cml0ZXIsIHRyYW5zZm9ybSkgPT4ge1xuICBjb25zdCB0cmFuc2Zvcm1lZFdyaXRlciA9IGhhcmRlbih7XG4gICAgLyoqXG4gKiBAcGFyYW0ge1RJbn0gdmFsdWVcbiAqL1xuICAgIGFzeW5jIG5leHQodmFsdWUpIHtcbiAgICAgIHJldHVybiB3cml0ZXIubmV4dCh0cmFuc2Zvcm0odmFsdWUpKTtcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqL1xuICAgIGFzeW5jIHRocm93KGVycm9yKSB7XG4gICAgICByZXR1cm4gd3JpdGVyLnRocm93KGVycm9yKTtcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHt1bmRlZmluZWR9IHZhbHVlXG4gKi9cbiAgICBhc3luYyByZXR1cm4odmFsdWUpIHtcbiAgICAgIHJldHVybiB3cml0ZXIucmV0dXJuKHZhbHVlKTtcbiAgICB9LFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbn07JGjNj19vbmNlLm1hcFdyaXRlcihtYXBXcml0ZXIpO1xuaGFyZGVuKG1hcFdyaXRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUXVldWUiOlsibWFrZVF1ZXVlIl0sIm1ha2VTdHJlYW0iOlsibWFrZVN0cmVhbSJdLCJtYWtlUGlwZSI6WyJtYWtlUGlwZSJdLCJwdW1wIjpbInB1bXAiXSwicHJpbWUiOlsicHJpbWUiXSwibWFwUmVhZGVyIjpbIm1hcFJlYWRlciJdLCJtYXBXcml0ZXIiOlsibWFwV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO5b9r/RAQAA0QEAABwAAABqZXNzaWUuanMtdjAuMy40L3NyYy9tYWluLmpzeyJpbXBvcnRzIjpbIi4vcmluZzAvbWFpbi5qcyIsIi4vcmluZzEvbWFpbi5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vcmluZzAvbWFpbi5qcyIsIi4vcmluZzEvbWFpbi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3JpbmcwL21haW4uanNcIiwgW11dLFtcIi4vcmluZzEvbWFpbi5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD2YCXkgQEAAIEBAAAfAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvRS5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyJAZW5kby9mYXIiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN6HOIP1AwAA9QMAACwAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXN5bmNHZW5lcmF0ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFJldHVybiBhbiBhc3luYyBpdGVyYWJsZSB0aGF0IHByb2R1Y2VzIGl0ZXJhdG9yIHJlc3VsdHMgdmlhIGBuZXh0YC5cbiAqXG4gKiBUaGlzIHdvcmtzIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBTeW1ib2wuXG4gKlxuICogQHRlbXBsYXRlIFQsVFJldHVyblxuICogQHBhcmFtIHsoKSA9PiBJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPiB8XG4gKiAgICAgICAgICAgICAgIFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+XG4gKiB9IG5leHQgcHJvZHVjZSBhIHNpbmdsZS1zdGVwIGl0ZXJhdG9yIHJlc3VsdFxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8VD59XG4gKi9cbiAgICAgICBjb25zdCBhc3luY0dlbmVyYXRlID0gbmV4dCA9PiB7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiBhc3luYyAoKSA9PiBoYXJkZW4obmV4dCgpKSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UuYXN5bmNHZW5lcmF0ZShhc3luY0dlbmVyYXRlKTtcbmhhcmRlbihhc3luY0dlbmVyYXRlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jR2VuZXJhdGUiOlsiYXN5bmNHZW5lcmF0ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD+evn99AEAAPQBAAAiAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFpbi5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL21ha2Vycy5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL0UuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIiwiLi9tYWtlcnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtdXSxbXCIuL21ha2Vycy5qc1wiLCBbXV0sW1wiLi9hc3luYy1nZW5lcmF0ZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADDGbF4MwkAADMJAAAkAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFrZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlTWFwIiwibWFrZVByb21pc2UiLCJtYWtlU2V0IiwibWFrZVdlYWtNYXAiLCJtYWtlV2Vha1NldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuLyogVGhlc2Ugd29yayBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgYG5ld2AuKi9cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIgLz4qL1xuXG4vKipcbiAqIEB0eXBlIHs8VD4oZXhlY3V0b3I6IChcbiAqICAgcmVzb2x2ZTogKHZhbHVlOiBUKSA9PiB2b2lkLFxuICogICByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWRcbiAqICkgPT4gdm9pZCkgPT4gUHJvbWlzZTxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQcm9taXNlID0gZXhlY3V0b3IgPT4gaGFyZGVuKG5ldyBQcm9taXNlKGV4ZWN1dG9yKSk7JGjNj19vbmNlLm1ha2VQcm9taXNlKG1ha2VQcm9taXNlKTtcbmhhcmRlbihtYWtlUHJvbWlzZSk7XG5cbi8qKiBAdHlwZWRlZiB7PEssIFY+KGVudHJpZXM/OiByZWFkb25seSAocmVhZG9ubHkgW0ssIFZdKVtdKSA9PiBNYXA8SywgVj59IE1hcEZyb21FbnRyaWVzICovXG4vKiogQHR5cGVkZWYgezxLLCBWPihpdGVyYWJsZTogSXRlcmFibGU8cmVhZG9ubHkgW0ssIFZdPikgPT4gTWFwPEssIFY+fSBNYXBGcm9tSXRlcmFibGUgKi9cblxuLyoqIEB0eXBlIHtNYXBGcm9tRW50cmllcyAmIE1hcEZyb21JdGVyYWJsZX0gKi9cbiAgICAgICBjb25zdCBtYWtlTWFwID0gZW50cmllc09ySXRlcmFibGUgPT4gaGFyZGVuKG5ldyBNYXAoZW50cmllc09ySXRlcmFibGUpKTskaM2PX29uY2UubWFrZU1hcChtYWtlTWFwKTtcbmhhcmRlbihtYWtlTWFwKTtcblxuLyoqIEB0eXBlZGVmIHs8VD4odmFsdWVzPzogcmVhZG9ubHkgVFtdKSA9PiBTZXQ8VD59IFNldEZyb21WYWx1ZXMgKi9cbi8qKiBAdHlwZWRlZiB7PFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPikgPT4gU2V0PFQ+fSBTZXRGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7U2V0RnJvbVZhbHVlcyAmIFNldEZyb21JdGVyYWJsZX0gKi9cbiAgICAgICBjb25zdCBtYWtlU2V0ID0gdmFsdWVzID0+IGhhcmRlbihuZXcgU2V0KHZhbHVlcykpOyRozY9fb25jZS5tYWtlU2V0KG1ha2VTZXQpO1xuaGFyZGVuKG1ha2VTZXQpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8SyBleHRlbmRzIHt9LCBWID0gYW55PihcbiAqICAgIGVudHJpZXM/OiByZWFkb25seSBbSywgVl1bXSB8IG51bGxcbiAqICkgPT4gV2Vha01hcDxLLCBWPn0gV2Vha01hcEZyb21FbnRyaWVzXG4gKi9cbi8qKiBAdHlwZWRlZiB7PEsgZXh0ZW5kcyB7fSwgVj4oaXRlcmFibGU6IEl0ZXJhYmxlPFtLLCBWXT4pID0+IFdlYWtNYXA8SywgVj59IFdlYWtNYXBGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7V2Vha01hcEZyb21FbnRyaWVzICYgV2Vha01hcEZyb21JdGVyYWJsZX0gKi9cbiAgICAgICBjb25zdCBtYWtlV2Vha01hcCA9IGVudHJpZXMgPT4gaGFyZGVuKG5ldyBXZWFrTWFwKGVudHJpZXMpKTskaM2PX29uY2UubWFrZVdlYWtNYXAobWFrZVdlYWtNYXApO1xuaGFyZGVuKG1ha2VXZWFrTWFwKTtcblxuLyoqIEB0eXBlZGVmIHs8VCBleHRlbmRzIHt9Pih2YWx1ZXM/OiByZWFkb25seSBUW10pID0+IFdlYWtTZXQ8VD59IFdlYWtTZXRGcm9tVmFsdWVzICovXG4vKiogQHR5cGVkZWYgezxUIGV4dGVuZHMge30+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPikgPT4gV2Vha1NldDxUPn0gV2Vha1NldEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtXZWFrU2V0RnJvbVZhbHVlcyAmIFdlYWtTZXRGcm9tSXRlcmFibGV9ICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtTZXQgPSB2YWx1ZXMgPT4gaGFyZGVuKG5ldyBXZWFrU2V0KHZhbHVlcykpOyRozY9fb25jZS5tYWtlV2Vha1NldChtYWtlV2Vha1NldCk7XG5oYXJkZW4obWFrZVdlYWtTZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2UiOlsibWFrZVByb21pc2UiXSwibWFrZU1hcCI6WyJtYWtlTWFwIl0sIm1ha2VTZXQiOlsibWFrZVNldCJdLCJtYWtlV2Vha01hcCI6WyJtYWtlV2Vha01hcCJdLCJtYWtlV2Vha1NldCI6WyJtYWtlV2Vha1NldCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABpVHheUgUAAFIFAAApAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanN7ImltcG9ydHMiOlsiLi4vcmluZzAvbWFpbi5qcyJdLCJleHBvcnRzIjpbImFzeW5jRG9XaGlsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VQcm9taXNlOyRozY9faW1wb3J0cyhbW1wiLi4vcmluZzAvbWFpbi5qc1wiLCBbW1wibWFrZVByb21pc2VcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIFJlc29sdmUgcmV0dXJuZWQgcHJvbWlzZSB3aXRoIHVuZGVmaW5lZCB3aGVuIGBib2R5YCByZXR1cm5zIGZhbHN5LlxuICpcbiAqIFRoaXMgd29ya3MgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIGBhd2FpdGAgbm90IGF0IHRoZSBmdW5jdGlvbi1sZXZlbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUIHwgUHJvbWlzZTxUPn0gYm9keSBwZXJmb3JtIHNpZGUtZWZmZWN0cywgYW5kIHJldHVybiB0cnV0aHkgaWZcbiAqIHdlIHNob3VsZCBydW4gYWdhaW5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICAgY29uc3QgYXN5bmNEb1doaWxlID0gYm9keSA9PiB7XG4gIHJldHVybiBtYWtlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgbG9vcCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRvQ29udGludWUgPSBhd2FpdCBib2R5KCk7XG4gICAgICBpZiAoIWRvQ29udGludWUpIHtcbiAgICAgICAgLyogUmVzb2x2ZSB0aGUgb3V0ZXJtb3N0IHByb21pc2UuKi9cbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qIERvIHRoZSBsb29wIGFnYWluLiAgV2UgYXJlIGNhcmVmdWwgbm90IHRvIGF3YWl0IHNvIHRoYXQgd2UgZG9uJ3QgY3JlYXRlIGEqL1xuICAgICAgLyogcHJvbWlzZSBjaGFpbi4qL1xuICAgICAgbG9vcCgpLmNhdGNoKHJlamVjdCk7XG4gICAgfTtcblxuICAgIGxvb3AoKS5jYXRjaChyZWplY3QpO1xuICB9KTtcbn07JGjNj19vbmNlLmFzeW5jRG9XaGlsZShhc3luY0RvV2hpbGUpO1xuaGFyZGVuKGFzeW5jRG9XaGlsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0RvV2hpbGUiOlsiYXN5bmNEb1doaWxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABtoNwOWAQAAlgEAACIAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMS9tYWluLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vYXN5bmMtdG9vbHMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAQIeAwoAAAAAAAAAAAAiX4xC3eYAAN3mAAAUAAAAAAAAAAAAAACkgQAAAABjb21wYXJ0bWVudC1tYXAuanNvblBLAQIeAwoAAAAAAAAAAAAxgEj4jQEAAI0BAAAgAAAAAAAAAAAAAACkgQ/nAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAAAAAAAAAAACkgdroAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAEzMFkfMLAADzCwAAJAAAAAAAAAAAAAAApIF36gAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9oZWFwLmpzUEsBAh4DCgAAAAAAAAAAABVusfp5AgAAeQIAACUAAAAAAAAAAAAAAKSBrPYAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAALUzVkSEDAAAhAwAAKwAAAAAAAAAAAAAApIFo+QAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pcy1wYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAABsFac/IgQAACIEAAAkAAAAAAAAAAAAAACkgdL8AABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2tleXMuanNQSwECHgMKAAAAAAAAAAAAqRuNqvoOAAD6DgAAKQAAAAAAAAAAAAAApIE2AQEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9tYWtlLW9uY2UuanNQSwECHgMKAAAAAAAAAAAAYL/aGKsNAACrDQAALQAAAAAAAAAAAAAApIF3EAEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy93YXRjaC1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAOGDnYDnPAAA5zwAACYAAAAAAAAAAAAAAKSBbR4BAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzUEsBAh4DCgAAAAAAAAAAAF/pvV56BQAAegUAACcAAAAAAAAAAAAAAKSBmFsBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABDvXvZdAYAAHQGAAAnAAAAAAAAAAAAAACkgVdhAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanNQSwECHgMKAAAAAAAAAAAA819NA00CAABNAgAAIQAAAAAAAAAAAAAApIEQaAEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGg+kHPHPAAAxzwAACUAAAAAAAAAAAAAAKSBnGoBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pc3N1ZXJLaXQuanNQSwECHgMKAAAAAAAAAAAAuKF0QB8ZAAAfGQAAMgAAAAAAAAAAAAAApIGmpwEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2xlZ2FjeS1wYXltZW50LWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAVOfcJRMGAAATBgAAOgAAAAAAAAAAAAAApIEVwQEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABaHe9JJgYAACYGAAA6AAAAAAAAAAAAAACkgYDHAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAABnzLX7PBgAAzwYAADYAAAAAAAAAAAAAAKSB/s0BAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAA93DX//QcAAP0HAAA2AAAAAAAAAAAAAACkgSHVAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAMnLESlgFAABYBQAAIwAAAAAAAAAAAAAApIFy3QEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanNQSwECHgMKAAAAAAAAAAAA2CdIdr42AAC+NgAAKQAAAAAAAAAAAAAApIEL4wEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanNQSwECHgMKAAAAAAAAAAAAPiCeiZccAACXHAAAIQAAAAAAAAAAAAAApIEQGgIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3B1cnNlLmpzUEsBAh4DCgAAAAAAAAAAAGDkrFsZBwAAGQcAAC0AAAAAAAAAAAAAAKSB5jYCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAADl+t+rQC0AAEAtAAAmAAAAAAAAAAAAAACkgUo+AgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAAAAAAAAAAACkgc5rAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAAa7/y9/8yAAD/MgAANAAAAAAAAAAAAAAApIFrbQIAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9mZWVEaXN0cmlidXRvci5qc1BLAQIeAwoAAAAAAAAAAAAFGAvc2SwAANksAAAnAAAAAAAAAAAAAACkgbygAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2FsbGJhY2suanNQSwECHgMKAAAAAAAAAAAAozZPpvUEAAD1BAAAKAAAAAAAAAAAAAAApIHazQIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NsaS11dGlscy5qc1BLAQIeAwoAAAAAAAAAAABtDXgVygwAAMoMAAAlAAAAAAAAAAAAAACkgRXTAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY29uZmlnLmpzUEsBAh4DCgAAAAAAAAAAAI29pgGuCAAArggAACQAAAAAAAAAAAAAAKSBIuACAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9kZWJ1Zy5qc1BLAQIeAwoAAAAAAAAAAACxk9WOXgMAAF4DAAAlAAAAAAAAAAAAAACkgRLpAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvZXJyb3JzLmpzUEsBAh4DCgAAAAAAAAAAAGgc7Br+BAAA/gQAACQAAAAAAAAAAAAAAKSBs+wCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACq1a+NpiUAAKYlAAAnAAAAAAAAAAAAAACkgfPxAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvanMtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAIvVS1awHAACsBwAAKAAAAAAAAAAAAAAApIHeFwMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2tleU1pcnJvci5qc1BLAQIeAwoAAAAAAAAAAAClbB70VS0AAFUtAAAvAAAAAAAAAAAAAACkgdAfAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1BLAQIeAwoAAAAAAAAAAACkg8+esQMAALEDAAAwAAAAAAAAAAAAAACkgXJNAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC9wdXJlLWRhdGEuanNQSwECHgMKAAAAAAAAAAAAK+0QRfENAADxDQAAKwAAAAAAAAAAAAAApIFxUQMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldGhvZC10b29scy5qc1BLAQIeAwoAAAAAAAAAAACQ/SB4oEIAAKBCAAAmAAAAAAAAAAAAAACkgatfAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0cmljcy5qc1BLAQIeAwoAAAAAAAAAAACKuVrytg4AALYOAAArAAAAAAAAAAAAAACkgY+iAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbmF0dXJhbC1zb3J0LmpzUEsBAh4DCgAAAAAAAAAAAE/EJZdqSAAAakgAACgAAAAAAAAAAAAAAKSBjrEDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9zZXMtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAA2ojbK9YDAADWAwAAJQAAAAAAAAAAAAAApIE++gMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3RtcERpci5qc1BLAQIeAwoAAAAAAAAAAABOYqeWoQQAAKEEAAAoAAAAAAAAAAAAAACkgVf+AwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUNoZWNrLmpzUEsBAh4DCgAAAAAAAAAAAKt8dcSjBQAAowUAACkAAAAAAAAAAAAAAKSBPgMEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACoAAAAAAAAAAAAAAKSBKAkEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADXhxk9cAwAAHAMAAAqAAAAAAAAAAAAAACkgcgKBABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXBncmFkZS1hcGkuanNQSwECHgMKAAAAAAAAAAAAP+FBPBkUAAAZFAAAMwAAAAAAAAAAAAAApIGAFwQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzUEsBAh4DCgAAAAAAAAAAAMI+7bjrBwAA6wcAACQAAAAAAAAAAAAAAKSB6isEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACzSf9OxRsAAMUbAAAnAAAAAAAAAAAAAACkgRc0BABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvbm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAAGyEXozNCAAAzQgAAKgAAAAAAAAAAAAAApIEhUAQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3B1Ymxpc2gta2l0LmpzUEsBAh4DCgAAAAAAAAAAACxIRDeqDAAAqgwAAC4AAAAAAAAAAAAAAKSBnJIEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZWQtbm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAAeuZOXiQmAAAkJgAAJwAAAAAAAAAAAAAApIGSnwQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3Jlc3ViLmpzUEsBAh4DCgAAAAAAAAAAAGQOvXzyKQAA8ikAACgAAAAAAAAAAAAAAKSB+8UEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmUuanNQSwECHgMKAAAAAAAAAAAAV6oEkSkNAAApDQAAKQAAAAAAAAAAAAAApIEz8AQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZXIuanNQSwECHgMKAAAAAAAAAAAAd+ZKRpUGAACVBgAAJAAAAAAAAAAAAAAApIGj/QQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3RvcGljLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACoAAAAAAAAAAAAAAKSBegQFAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABHGnKTRg4AAEYOAAAhAAAAAAAAAAAAAACkgRoGBQBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAD9JGLuILAADiCwAALAAAAAAAAAAAAAAApIGfFAUAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanNQSwECHgMKAAAAAAAAAAAA28RCNW0HAABtBwAAMAAAAAAAAAAAAAAApIHLIAUAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzUEsBAh4DCgAAAAAAAAAAANehQUbqGAAA6hgAADEAAAAAAAAAAAAAAKSBhigFAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAApkJKtRERAAAREQAAMQAAAAAAAAAAAAAApIG/QQUAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAD5NfOn7RYAAO0WAAA1AAAAAAAAAAAAAACkgR9TBQBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACUWqUbThEAAE4RAAA1AAAAAAAAAAAAAACkgV9qBQBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACqV+8u2xoAANsaAAAuAAAAAAAAAAAAAACkgQB8BQBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAAAAAAAAAAAAAKSBJ5cFAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADt9ZibMAIAADACAAAcAAAAAAAAAAAAAACkgcSYBQBAYWdvcmljL3RpbWUtdjAuMy4yL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALQzbZQKJQAACiUAACMAAAAAAAAAAAAAAKSBLpsFAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3RpbWVNYXRoLmpzUEsBAh4DCgAAAAAAAAAAADT2FcTzCQAA8wkAACUAAAAAAAAAAAAAAKSBecAFAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAAAAAAAAAAAApIGvygUAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAANg9YlC0sAAAtLAAAKAAAAAAAAAAAAAAApIFLzAUAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2V4by11dGlscy5qc1BLAQIeAwoAAAAAAAAAAADPnOvptggAALYIAAAkAAAAAAAAAAAAAACkgb74BQBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA73e+MDkjAAA5IwAAMAAAAAAAAAAAAAAApIG2AQYAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzUEsBAh4DCgAAAAAAAAAAAAHT9EtISwAASEsAACUAAAAAAAAAAAAAAKSBPSUGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAA2fSTtJYBAACWAQAAHgAAAAAAAAAAAAAApIHIcAYAQGFnb3JpYy96b25lLXYwLjIuMi9kdXJhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAIAyUsraEwAA2hMAACIAAAAAAAAAAAAAAKSBmnIGAEBhZ29yaWMvem9uZS12MC4yLjIvc3JjL2R1cmFibGUuanNQSwECHgMKAAAAAAAAAAAAb1Ehj2ELAABhCwAALAAAAAAAAAAAAAAApIG0hgYAQGVuZG8vY29tbW9uLXYxLjIuMTMvYXBwbHktbGFiZWxpbmctZXJyb3IuanNQSwECHgMKAAAAAAAAAAAASPhCyt0FAADdBQAAKwAAAAAAAAAAAAAApIFfkgYAQGVuZG8vY29tbW9uLXYxLjIuMTMvZnJvbS11bmlxdWUtZW50cmllcy5qc1BLAQIeAwoAAAAAAAAAAAC3lVPuJQgAACUIAAAlAAAAAAAAAAAAAACkgYWYBgBAZW5kby9jb21tb24tdjEuMi4xMy9pZGVudC1jaGVja2VyLmpzUEsBAh4DCgAAAAAAAAAAAGGv/Gq4BAAAuAQAACcAAAAAAAAAAAAAAKSB7aAGAEBlbmRvL2NvbW1vbi12MS4yLjEzL2xpc3QtZGlmZmVyZW5jZS5qc1BLAQIeAwoAAAAAAAAAAAAl7F33eQQAAHkEAAArAAAAAAAAAAAAAACkgeqlBgBAZW5kby9jb21tb24tdjEuMi4xMy9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzUEsBAh4DCgAAAAAAAAAAAF02r3oGAwAABgMAACUAAAAAAAAAAAAAAKSBrKoGAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtaXRlcmF0b3IuanNQSwECHgMKAAAAAAAAAAAAduerGW8KAABvCgAAIgAAAAAAAAAAAAAApIH1rQYAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1hcC5qc1BLAQIeAwoAAAAAAAAAAAComiDaOwkAADsJAAAnAAAAAAAAAAAAAACkgaS4BgBAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWV0YS1tYXAuanNQSwECHgMKAAAAAAAAAAAA2LNBgpkFAACZBQAAJQAAAAAAAAAAAAAApIEkwgYAQGVuZG8vY29tbW9uLXYxLjIuMTMvdGhyb3ctbGFiZWxlZC5qc1BLAQIeAwoAAAAAAAAAAAA0oqGpogEAAKIBAAAiAAAAAAAAAAAAAACkgQDIBgBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALwBM4I4FgAAOBYAACwAAAAAAAAAAAAAAKSB4skGAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvc3JjL2Vudi1vcHRpb25zLmpzUEsBAh4DCgAAAAAAAAAAAGpmduJkDQAAZA0AAB0AAAAAAAAAAAAAAKSBZOAGAEBlbmRvL2Vycm9ycy12MS4yLjEzL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAANPpRggQRwAAEEcAACMAAAAAAAAAAAAAAKSBA+4GAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACkAAAAAAAAAAAAAAKSBVDUHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAHOVMVJyFAAAchQAACcAAAAAAAAAAAAAAKSB8zYHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9sb2NhbC5qc1BLAQIeAwoAAAAAAAAAAACHeIi59BgAAPQYAAA1AAAAAAAAAAAAAACkgapLBwBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1BLAQIeAwoAAAAAAAAAAAApE1XZ1gUAANYFAAApAAAAAAAAAAAAAACkgfFkBwBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAAAzKKSOVxIAAFcSAAAtAAAAAAAAAAAAAACkgQ5rBwBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAe6GgR2QCAABkAgAAIwAAAAAAAAAAAAAApIGwfQcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAA3EXZo2ACAABgAgAAGgAAAAAAAAAAAAAApIFVgAcAQGVuZG8vZXhvLXYxLjUuMTIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAsZMQ/xAgAAAQIAAAIwAAAAAAAAAAAAAApIHtggcAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by1tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAFaP+6y5GAAAuRgAAIgAAAAAAAAAAAAAApIE+owcAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by10b29scy5qc1BLAQIeAwoAAAAAAAAAAADJJdo2CwUAAAsFAAAmAAAAAAAAAAAAAACkgazpBwBAZW5kby9leG8tdjEuNS4xMi9zcmMvZ2V0LWludGVyZmFjZS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAeAAAAAAAAAAAAAACkgfvuBwBAZW5kby9leG8tdjEuNS4xMi9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIAAAAAAAAAAAAAAApIGP8AcAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAqSbWUJgCAACYAgAAHgAAAAAAAAAAAAAApIEl8gcAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHVGf9kHCAAABwgAAB0AAAAAAAAAAAAAAKSB+fQHAEBlbmRvL21hcnNoYWwtdjEuOC4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGC/aqjJfQAAyX0AACoAAAAAAAAAAAAAAKSBO/0HAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAADVwnO6F0QAABdEAAArAAAAAAAAAAAAAACkgUx7CABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzUEsBAh4DCgAAAAAAAAAAAA1TX470RQAA9EUAAC0AAAAAAAAAAAAAAKSBrL8IAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc1BLAQIeAwoAAAAAAAAAAABCdBXpvkIAAL5CAAAqAAAAAAAAAAAAAACkgesFCQBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1qdXN0aW4uanNQSwECHgMKAAAAAAAAAAAAq3GB+KEJAAChCQAALQAAAAAAAAAAAAAApIHxSAkAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAAGVYhbV8PwAAfD8AACMAAAAAAAAAAAAAAKSB3VIJAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAIGivjHoWQAA6FkAACUAAAAAAAAAAAAAAKSBmpIJAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIQAAAAAAAAAAAAAApIHF7AkAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAOMQ3SNJDAAASQwAAB0AAAAAAAAAAAAAAKSBXO4JAEBlbmRvL25hdC12NS4xLjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAG5u3nM2CwAANgsAACAAAAAAAAAAAAAAAKSB4PoJAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAE6FbiMVDQAAFQ0AACgAAAAAAAAAAAAAAKSBVAYKAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9ieXRlQXJyYXkuanNQSwECHgMKAAAAAAAAAAAAmae90ggIAAAICAAAKAAAAAAAAAAAAAAApIGvEwoAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAABHL7odZwsAAGcLAAApAAAAAAAAAAAAAACkgf0bCgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAACeOsLT2BkAANgZAAAuAAAAAAAAAAAAAACkgasnCgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAAGrLJkbNHQAAzR0AACQAAAAAAAAAAAAAAKSBz0EKAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9lcnJvci5qc1BLAQIeAwoAAAAAAAAAAAB7Bop6fAkAAHwJAAArAAAAAAAAAAAAAACkgd5fCgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvaXRlci1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAKEnjMn0JQAA9CUAACcAAAAAAAAAAAAAAKSBo2kKAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlLWZhci5qc1BLAQIeAwoAAAAAAAAAAACcUmBpgwUAAIMFAAApAAAAAAAAAAAAAACkgdyPCgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZVRhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAB8Jer96iEAAOohAAAwAAAAAAAAAAAAAACkgaaVCgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAJgKOt2I/AABiPwAAKgAAAAAAAAAAAAAApIHetwoAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAAPucn7IwLgAAMC4AACgAAAAAAAAAAAAAAKSBiPcKAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAAh4APKFIWAABSFgAAKwAAAAAAAAAAAAAApIH+JQsAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3NhZmUtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAD8qNkH2w8AANsPAAAlAAAAAAAAAAAAAACkgZk8CwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc3RyaW5nLmpzUEsBAh4DCgAAAAAAAAAAAAL3NCLDFAAAwxQAACUAAAAAAAAAAAAAAKSBt0wLAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAAXLhQ2WQJAABkCQAAJQAAAAAAAAAAAAAApIG9YQsAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAC3XT1cJhYAACYWAAApAAAAAAAAAAAAAACkgWRrCwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAkAAAAAAAAAAAAAACkgdGBCwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAdU2S3O8OAADvDgAAHgAAAAAAAAAAAAAApIFrgwsAQGVuZG8vcGF0dGVybnMtdjEuNy4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKohA+kLSAAAC0gAACoAAAAAAAAAAAAAAKSBlpILAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAAD/2yuQPygAAD8oAAAtAAAAAAAAAAAAAACkgenaCwBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29tcGFyZUtleXMuanNQSwECHgMKAAAAAAAAAAAANFtTY00VAABNFQAAKQAAAAAAAAAAAAAApIFzAwwAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlCYWcuanNQSwECHgMKAAAAAAAAAAAALCODJiwRAAAsEQAAKQAAAAAAAAAAAAAApIEHGQwAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAA2zWaQMMiAADDIgAAOQAAAAAAAAAAAAAApIF6KgwAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAJnEOAFXKAAAVygAADUAAAAAAAAAAAAAAKSBlE0MAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAHQfjxllLwAAZS8AADUAAAAAAAAAAAAAAKSBPnYMAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAF0aWkIrLwAAKy8AADYAAAAAAAAAAAAAAKSB9qUMAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc1BLAQIeAwoAAAAAAAAAAABmpO57vjIBAL4yAQA1AAAAAAAAAAAAAACkgXXVDABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAiAAAAAAAAAAAAAACkgYYIDgBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAAsCsWGzCQAAswkAACIAAAAAAAAAAAAAAKSBHgoOAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA564QmQMDAAADAwAAKwAAAAAAAAAAAAAApIERFA4AQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAADHaE2fRBYAAEQWAAAqAAAAAAAAAAAAAACkgV0XDgBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9tZW1vLXJhY2UuanNQSwECHgMKAAAAAAAAAAAACJ+oaB0IAAAdCAAANQAAAAAAAAAAAAAApIHpLQ4AQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAAAAAAAAAAAApIFZNg4AQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAALOZ7ulEcAABRHAAAHQAAAAAAAAAAAAAApIH1Nw4AQGVuZG8vc3RyZWFtLXYxLjIuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA7lv2v9EBAADRAQAAHAAAAAAAAAAAAAAApIGBVA4AamVzc2llLmpzLXYwLjMuNC9zcmMvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAAD2YCXkgQEAAIEBAAAfAAAAAAAAAAAAAACkgYxWDgBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9FLmpzUEsBAh4DCgAAAAAAAAAAAN6HOIP1AwAA9QMAACwAAAAAAAAAAAAAAKSBSlgOAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzUEsBAh4DCgAAAAAAAAAAAP56+f30AQAA9AEAACIAAAAAAAAAAAAAAKSBiVwOAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21haW4uanNQSwECHgMKAAAAAAAAAAAAwxmxeDMJAAAzCQAAJAAAAAAAAAAAAAAApIG9Xg4AamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAAGlUeF5SBQAAUgUAACkAAAAAAAAAAAAAAKSBMmgOAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAABtoNwOWAQAAlgEAACIAAAAAAAAAAAAAAKSBy20OAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL21haW4uanNQSwUGAAAAAJgAmAAZMwAAoW8OAAAA","endoZipBase64Sha512":"3e6d6d461cff6b3651decde2943842fa5bbddc4a74e7e3cc96350830f187d77113aa4b53ec1db68b910fdc370e4e53106804ee0e51cf5b55f99e41f2d5ea816e"};
|