@agoric/inter-protocol 0.16.2-dev-fed2b5e.0 → 0.16.2-dev-35e67be.0
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/bundles/bundle-econCommitteeCharter-js-meta.json +82 -82
- package/bundles/bundle-fluxAggregatorKit-js-meta.json +115 -115
- package/bundles/bundle-psm-js-meta.json +113 -113
- package/package.json +18 -20
- package/scripts/build-bundles.js +5 -21
- package/bundles/bundle-auctioneer-js-meta.json +0 -742
- package/bundles/bundle-auctioneer.js +0 -1
- package/bundles/bundle-feeDistributor-js-meta.json +0 -478
- package/bundles/bundle-feeDistributor.js +0 -1
- package/bundles/bundle-reserve-js-meta.json +0 -682
- package/bundles/bundle-reserve.js +0 -1
- package/bundles/bundle-scaledPriceAuthority-js-meta.json +0 -554
- package/bundles/bundle-scaledPriceAuthority.js +0 -1
- package/bundles/bundle-vaultFactory-js-meta.json +0 -810
- package/bundles/bundle-vaultFactory.js +0 -1
- package/scripts/add-STARS.js +0 -43
- package/scripts/add-collateral-core.js +0 -112
- package/scripts/deploy-contracts.js +0 -110
- package/scripts/init-core.js +0 -197
- package/scripts/invite-committee-core.js +0 -42
- package/scripts/manual-price-feed.js +0 -122
- package/scripts/price-feed-core.js +0 -104
- package/scripts/start-local-chain.sh +0 -84
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAA3q+3c9pIBAPaSAQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICJtb2R1bGUiOiAiLi9zcmMvYXVjdGlvbi9hdWN0aW9uZWVyLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC42LjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Fzc2VydC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXNzZXJ0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWE2NDc1OTNlOWZjZGM3NTEwOTIxMGUyNjZiOGU3YTljMGU5OWQwMTM2ZjczYjk5MmExNWM0NmE5ZTg3ZDAxYzljZDZmMGEyZjhhZTVhODBjNGJiYjVlYjBjYWYzNWY0MmMwNDI4ZTljY2YyMjk4NTNkMzVjMGU5NGUyYjMyMzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTEyMWQxNWRjYjEwZjg1Zjc3YjQwZDQ4ZWU4N2Q1ZDVkNzZmOWQ0OTAyZTBlOGM3ZDg4YzMxN2MwYjJmZTNhMmIwZGVlZmZhNzg3NjI5NDExOGZkZjY1MWFlNGZhYzg3MzkxNzU2OTE3MjdkYzc0OTIzNGMxNDQ1Mjg1YTg0NWEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9iYXNlLXpvbmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZS90b29scy8qIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvKiIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaGVhcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJoZWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2FmOTcwNjVjMTNhNWY0ODBkOTUwNTIzYzMxNTliNjJmYjgyNzhiZjc4ZTliODlkZTQzMmYwMjkzY2I0ZDViZDdjMWM0ZjY1MWE3NTdjYjhmMTRlYmU2MTY4MGFkNjZhODFiOWUzYWVlNTFlMmEwNGJmNzc4YWQ2YmVlNTNhOWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVhcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVhcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMwZWVlYjA1ZjI4YzdiODZmOTEzZDNmOGM2ZmU4MjBlYzY1MWM2MTMzZTI2MjRlODY2OTJjM2UxMzlhZDIxMzczNzgyMmJmNzQ4N2IwNmE2Y2EwYzhhMDlmNDgzNTFjOWRmZDg1YWUxNGQwMGU0YTJlNGQ2YjEwNzE2NmY4ZTc5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRmMzM2ODZmMjYzZmI3ZjVlOGNhZGEzZWQyODZlZjkxMTIxNWEyMzg3MjY0Njc1YTdiOTc0YmYzYWM3YjlkNTA2ZTAzZDFjNjhhMTZkNTE2NGVlM2RjOWIxYjRjYzg0NWU2ZmYyYWZjOGM1NmRjMjk3YTMwNjUyNGVlNTI3N2M3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiMWEwOWE1ODUzN2Q0YTM1NzliYTc1ZjJjODg3ZTM3N2ViMDhiNWFlYjNjNmY2OGIzNDEyZTVmNzI4NmU3NzdhNjY2NDU5OWU2NDNiOWU3ZjkyY2U3NWJjOWRhNzE0ZDY0ODczMTlmNjc5MzA4OTU2MDY4Y2YwM2MzNDdhMjA3NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLW9uY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2Utb25jZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlhZWM2ZDQ2MDBhM2NmZjk2ODBmZTRhNzhhYWJiMDBmYjMxODc5NWQ3M2UxYWE4YzFhN2YzMzM5OWJjOWY3ZjFlZGE1NTk1ZDg2NDY1Njg5YTQ2ODNhNDRkMWJkYTQwZTcyNmVkODg2MGM4ZjczMTBjYzVmNDdjNTE3ZTFiNDg0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEzNzc2ZTMyYjA0Mjc3NDU0OWNiZWJhYmZiNjIxZDZmOGVmOTJlMDNhZTdjMmQzMWQzMTg5NmFjMmVlY2VjOThkMWU5YjY5MjlhNGI1OTQ4MzQ2NzY4ZGI1MjFmZTIwNGFlZWRjZjVmZmYzNTlmZTJlNGNhMDVkNjNmNWE0OWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudE1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudE1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYWEwOWQwOGQwMDQxMjM1MGJhMjk2YjI1YTIxYTYzZjI2YWU5MzJmMWVmODM4NTU2NDQ2MmM0NTM0ZjE0NDI3ODQ2NmM2OTMxMGIxNjE0ZmE4MjkyMzMyODFmNzc4YjA3ZGFmYWEyMmUxNTcyZDgxNDI4MTdhM2IzZmZlN2ZkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kaXNwbGF5SW5mby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGlzcGxheUluZm8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiMTBiNjI2M2MyNTIyYjU5M2MxZWE3Y2E1MzJjZjE4YzBhM2M4OWQ3YjdmNmFhMGNlODIzYmZlMmNhMjRiMjg5NDEyY2UyYWJjYjRlYjBlMWIzMzkzNDNmYWM2NzJjMDM2NDFmNzA5ZjEwYzcxMDI1N2ExNThlM2E5Y2Y2ODRmNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzM2E4MTQzNzhmNDFlMWI4ZTZiYzU2N2QzYmZkNGI0YTc4ZTg3ZTQ3YmE3ZjUxOWU5NTgwMjFlYTdmMGExMmFlOWFjOWY3NjZiNDcwNTI4ZDQ5ODhhNzY4ODE4ZjBiYWIxYTE0YWMwMTUxOTBkNTQzMWM4ZTU1YzFmMzNjNWNjZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlcktpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjliOWI1ZDM1ZDVmMWZhZGExZjdmMDQwNDFkZDUwMjdiNmZkMzNlMzVhYmNmNzg1MzlmYjY1MDIyNGRiYmQwOTVkMTliNDhhNDE2Yjk5NzEwMjg4OGFlNGI3NGNlY2I5ODhhMDA5ZDBjMDJjZjMzNGEyMzBiMjUzMGY0YWVhMjE5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODMyNWU1MzVhNzg0OWM3ZjYxNjJiY2QwMzAwYWNiYzMxMjk1MmM2OGJiYmE3ZGExZGVlN2E4MmM5MDE4NTg1YWVlYTBiZWE5OGI4NjRmZTA5MDgzNzA1MWY5OWE3ZGRlZjdjZDZlMTcxNzA2Nzk4Zjc5YTlhYWY1NDBjMWIwM2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxOWNlMDQ3MjlmNjlmOTVmYTAzZjE3NGQyMTNlOGYwN2RkNDVkZTk4MDVkZmNkY2YxNDU2NjM3Zjg3ZTY5YzU5YTczZWViNDAxODU5NjZmMTgwZTJhMzE0MTNkMmJhM2U1ZDcwZDhmYjJiMDQ1Njg0ODU3MGUxOGU1ZDg5MWJkMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMDE1MWE2YTE1NGIwNjY4MDYzYzRhNjgyMWY1MTdkNjlhYjY2MWE3MzJjNTU5OWRlYmIzYjA2ZDYzZmZlODczMmIzNWVmM2Y2NmRmMmVkMTE1NmJiMTZjY2Q4YmU4OTA4NjdhOWVlMzI3NGVlYzA3NGRjMTQ5ZTViOWNjOWJlNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiOTlhMDc5NWJkM2FjMDUyNDRlNDJjYWI1Zjk3NDlhMTQ0YTJmZTViNzNiNWU3OWMyMGEyYTM3YzFlYTU5ZjI1ZmM3YjdjZGYxNjI1M2U3MGNiOTYxYWE5MjYyZmM1N2RiYjczYTQ0NDExNTE0OGEwNjQ1ZmY4YjQyNmZiZDA2ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmZkN2Y5OWI4YmVjYTY5MzJmN2MzN2I2YTU0MjhmMTU3ZDE0YjM2NzNmNWIxODk1M2NkYjM4NTc5YThjZDQ2MTE5OTc1OTdkYjIzM2EzYzBkYTRiMDJhZTJhYTAyYjQ3YmU5MzM3ZDNmM2JjOTIyODRhYTZkZWU4ZjYxNjk1YjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudExlZGdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudExlZGdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1ODUzMzFhZGQ3ODU0N2M3MzBkMGUxYTMzYzNkZTZlOTIyNmZlZjQ0ZTA0MmI3NzBmODc3Mzk3MDE0NmVkZmU2Y2Q1Y2ZhMTY1MTY4Yzk1YzdkZjY2NmIxZTFkYmY0ZWIwZDFmOGUyZTljMTQwNzNlMDQ0OGU0NjRhZjY5ZGYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1cnNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdXJzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0OGI5ZDkwOGI0MzBlZjBiMzY1MzAwODIxMjUzZmQ3YmE2NjIzODhmYTYxZTQ4NzYxNjFhODU5ZWZkNTA2OGI4OTBjMDhkMWQ4NTlkZjQ4MWM4Yzg5MzY0ZGU3Nzg1NWU5ZTgwNzY5ZDM0NTZjNjM1ZmIyZjYxMjg4ZWI3NGRhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFuc2llbnROb3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAxMjk2YWExMWYyNmFjYzRkYjZjNjRlZTZhMDRiZTk4ZTRkMTY4ZGRmMDBmNDU5MWExNmMxYzM0MjE5YWQwNWQ3ZTY5MjRmNjg5MmVlNWZiMGQ2MzhmOGRhNzQyZWZjMDRhMDEwZmMxZmIxMGExNjgxODg4NmRkYzFjZmUwMzM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NTc1Zjc3MzIzZGQyYzVmMmNjOWRjNjY3NzFiNmVmOTMxNGU0MzU2ZjExNWM5NGZmYmNmZDQyOGI5Nzk3OGY2Y2RkYzk0ZTI4N2U0MTQyZjJiNGQyMDgxZGNjNzQ4NDBmNGUwZWIzZWJkNzI0MjcxOTZiMWU0ODk1Mzg1OGEwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2FiN2FkYmI5NzRkZWExNzI3ZjM0MWExNDA3YjcwY2FjNDU1NDJiZGJmODM4Njc5MTgzYzExNDdhNjQ2OTFmOTQ0NDNmMzkxMGViY2JlNmFhM2Y4M2E5YmU5ZTI2YTdkN2IzMWE2NTVjNGFjMzA2ZWZlYTgwN2FjMDIxMDBlNjQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2dvdmVybmFuY2UiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cC9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9nb3Zlcm5hbmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmV0d29yayI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25ldHdvcmstdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9uZXR3b3JrL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmV0d29yay12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY2xlYW5Qcm9wb3NhbC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvY2xlYW5Qcm9wb3NhbC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFrZUhhbmRsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9jYWNoZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vY2FjaGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12My4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgImltcG9ydC1tZXRhLXJlc29sdmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiaW1wb3J0LW1ldGEtcmVzb2x2ZS12Mi4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMzc3NmUzMmIwNDI3NzQ1NDljYmViYWJmYjYyMWQ2ZjhlZjkyZTAzYWU3YzJkMzFkMzE4OTZhYzJlZWNlYzk4ZDFlOWI2OTI5YTRiNTk0ODM0Njc2OGRiNTIxZmUyMDRhZWVkY2Y1ZmZmMzU5ZmUyZTRjYTA1ZDYzZjVhNDlkNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb25zdGFudHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnN0YW50cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI5ZWZhZGQxNTBlMDY2YjQ3N2M2MTQwNzNhYWQ0YzlmODllYWMwZjM5N2Q2ZWZkZjI3OWYxOTdjMmY4ZmZjMjJmMmI0ZjlkMGI5OWJjYzUxZDFhYjM3ZjdhNzIxOThlZGZkMTZjMmEwODY3MmI1OGY0OWEzN2M3MWI1MWQ4YzczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9hc3NlcnRpb25zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvYXNzZXJ0aW9ucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMxMGYwOGFjMDViNDdiMjA0YWExNzFiNWY0ZmJhOWQ3MDljNGRlNWUyNjRjMGNiMDIzNmI4NmYxMWU2Njc1ZjA1ZDA5YjFmZDlkYzk0OGE3OGU5OWZjZjI3MzFiNzA2ZDYwZGY0ZDQyMTlkOGQ2NDNjMzUzZmM0NWU2MDQ3MzNhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5BcGkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5BcGkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NzU4ZDY4YzI5ZDE3YTMyMjVlMWMxY2ZkZGEzNzE3ZTNkZGZlZGY0NTE0NTIyYzVjYzRlZjEyMjVjZGY2Mzk4N2EyNjhkYmE2ZmE1M2JlMzY3MjI0MDhjYWIwOTAzMjkyZDllNjZiNTRhZjc0Y2UxMzAxZjVlYzg0YzQ0OGZkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuRmlsdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuRmlsdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2IyOGMxY2NhY2M2NjBjZDU4OGVjMDFmNDEyMWJmY2JmYmViOGI1OTFkOWI2NDY4ZjY1NGQ3YzlmZDBkZTNhYTMyNDY4NzEzZmIzZmQ5YTEzMTgzNGQ4YTgzMzIwNjE5N2UyNGI3YjA1ZDQ4MWYzOTVkMmEzNTBkOGViNDViMDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiOGVlMjdjMGRmZGJlNTY3YmQ4MmYzMTc1NmNlNzA3ZTUwMWI2NjZhZmJiNTEyZTBlZGY4MTllN2FmY2ZiNGFjZDFjYmY2MDRjYzRmNWEyMGU1ZjcwMzIzZTAxYWQ4MmIxMDM3ZmFhMTJhZWU5YjQ0ZWIzODc3YWJkYzJkNjkxMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDhlNDM4M2I2MjU1OTg4NjM1YmMzZDE2MzViYWRiZjFhYTAxMDNhN2U5ZDMyN2UwYTdlM2M5MGYwNmJmNjQ0NDg4NDRiNjQwYTFlMjc0ZjgzZDcxYzlhMDNkMTNiNjk4NzM2OTZkYWVlMThhY2RmYThmYTU2YTc5YTQ5ODk2ZTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMzg2YWJmZjg1NDk4ZWI5ZWNkZjBkM2VjYzU3NzNlNThkZjhkODY0NDQ4NWM0YmQ4MzhmYTkzZDI1OWY3YmEwZTNmYzkyOTkyOWRkMWY0YmMyN2ZmMTI0NWE3MTE2MTA5NjM0ZDg1ZmVlODE4YTVlYWYxZDY3YzMyMjI4NDNiMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzk4OTRmYWIxNjMwMDhlYmRhNzIwN2VjMDFhYWU4ZGJkNDI5NDdhZDFlMDFlZTU4ZDE1YjQ3NGQ4NGExMjNjNTQ4ZGY3ZmJmMzRlZTFlZTZlMzUxNjUwOGFjMmVlYjk4NDZlMzA2MTNiYjUwNWY5ZTU2MThkMzJlM2Y4YTM3Y2MiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5vcktpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5vcktpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU0MjgwMjc3ODVjYmY3ZWFlYWQzMmFhZjI1OTcyM2Q3MTViNWE0OWQxMTc0ZTdmMTY3MDUwZTZmZDEzZWZjYTA2YzYyNGY1Y2UwZmRlNjZmNzM3N2Q3MTY5ZDNkM2ZiMDBiODEyYmU1N2EzMzE1N2ZmOWM3NTc3ODg4OWI2OGViIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0SGVscGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEhlbHBlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyZGM4ZDg3NGVlYmQ2ODMyYTZhMmM5MWY3ZDlkZmRmNzI5MjI1ZDExZGJjZjQxMjFhMzI0MmVlM2I4Y2I5ZjQ1MjUwMjJiMzQ3MzczYzA4ZWIzOTdhOTk3YzRmNzBmNDVmMDJjZjg3OGRhMGY5NmI3OGYzYmQ3NmFiNjlmNzJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkxNWUzNmZiNjIyYTRkMTI5YzIyNGE0NDJlOWMyZjMzNTJiMjFjZTI0MTFlMjY3NTJkMTgxZmRmOTU3MTZkZjE3NDM0YjJiNGMzMWNmYzE3ZWI4MzZlY2JjZTI0OTMxOTAwMGM0ZGVjNTM2ODc1ODQ5ZGVmNGFkYmNjYzI0YWFiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3F1ZXN0aW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9xdWVzdGlvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRhM2RmMWE4Y2MzZjVlYzExMWMwZWY5NGEwMDg5MDI2ODc3NTk4M2M5ZWY1MGM0MWY0NjAyYTIxNmI2ZTEzNTBhOGJiMmY2MjhiYzkwNjI4NjM0MDFhMDViYmVkYzgwYWRlM2EwYjljMjM5YTI0N2I2YThiOGFiMDJmNDdmZjIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1YTQ2ZTI0ZGRmNDQ5ZGUwM2M2MDg5ZDlkYjE5MjNkODZlNzRlNWY3NzAyOGViNzQ0NjEyZGM2ODc4ZDM4NzcwNzY2YTkzZjJkNzk5ODc2NmVhYzk0MWE5MjdmMjBjODg2MGZmODZmMzcwOGE5OWZlOGE1YjM4NmNlMWFhOWY3OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzM0YzZjZGI5MTBlMjI1ZTJlMWQ3YTAyODJiMGVmOGUyOTdkZDdiZTlkMTA2MjIxODBkOGE4NjM0NDAxZDZmN2Q5M2JmZmFiNWI1ZmVkOWVlYjcwMTA4OThjMzIzN2VlZWNlZmYzNmUzZjMxZDU0NGE1M2FjOGU5ODM5NDg0MDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmFsaWRhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmFsaWRhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRkZjNjMzNiZWI4OWViNzIzMDczMjU0YTJjMzY0NTg0MGUyOWJkZGIzMWY1ODY1YmY0ODdmODZhNDNlMWFjYjM2MTQwOWZhZWI1NWI0NDZiNzBmMzFjZGI3MmIxNzI1ZDYwNTcxNjBlYTk5NDdiMTY2YzY1ZmFkZWJjNjY0N2MwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9nb3Zlcm5hbmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9nb3Zlcm5hbmNlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvem9lU2VydmljZS96b2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12My4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFpbi5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hdWN0aW9uL2F1Y3Rpb25Cb29rLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hdWN0aW9uL2F1Y3Rpb25Cb29rLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGMwNTMwYzcyZGQ0YzlmZjJmMmZmZGVlYWM5YTQ0Y2JmZGI0NzcyMjUzZjFhYmYxZGM4OTE4MGFmYmMwMzZlOGM1Nzk0NmI5MWJiZTJlMzQwNmEyOTcyMzc4NjBkNWY0MTk4YmZiYTdlMzgxZjY1NDBlOWQ2NjdkODc3NGUxMWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYXVjdGlvbi9hdWN0aW9uZWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hdWN0aW9uL2F1Y3Rpb25lZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ODRjNDZhMzNiMDU1ZDA5MGU3ZmM2YzJiYWYwYTdiYjgxOTdmMmQ4OWQ4MzVmYjRiMjgyMjVhZjMyZjM5MDUxNGJmYTBiNTA3YTJiMzA3MTEwYmI4MmVmOTIxYjA2ZmYzOWY2YmYyN2UxOWE0MGUxYTBkNzlhODFkOTQ0MDIzZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hdWN0aW9uL29mZmVyQm9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXVjdGlvbi9vZmZlckJvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZWM2ZTFiNDdmNjMxYTI1ZTY0ZjhjN2VkZmUyYzkwNTA0NmU1ZGNiNTZmZGY2ZDYyNzFkNGRkYmI3YWMxNGQ5ZThmZTNhOTRjNTE3ZTcwOTRlNWM1N2UxZTc3NzcwZDJjZWY5NTFiMmQxNTE2NzdkMTVkMDMxNTIyMWViOTQ4ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hdWN0aW9uL3BhcmFtcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXVjdGlvbi9wYXJhbXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZDM0Yzk1ZDI0ZTI5OTA4NzBjYmM4NTc2MjFkODZiMTg0NzM5N2M0YjYzMDczYTJmNmQ1N2FiMGViN2VmNzRlNTEwZGFhNWMzMDA4NzFlYjM5YzE0NGY2ZWE0OTdkODAwNzI2ODQxODVhYzg2MzJhN2JmNTdhMGNhNDFlZDI1OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hdWN0aW9uL3NjaGVkdWxlTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXVjdGlvbi9zY2hlZHVsZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MDhkMGZjNzY3MzU2MzdhNDkxMmFmYzNiMGUyNGY2YzU0ODBiNWIwZmJlYzZkMmQzODJmYzFkM2Y3ZWVkNjdmOWRmZWIzMTY1YzI3ZGYwNWY2M2I0NTgyOTA2OGNhOTkzNDlhMmRiMzQzYWE4Y2YyNGZkYzMxMmQxMTU0NDkzNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hdWN0aW9uL3NjaGVkdWxlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXVjdGlvbi9zY2hlZHVsZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZjFiYmNhNzVkY2Y4OWEzOWQ2ZmU2MTI5MGRmMmI1M2MzZTUxNWUxZDg2MTBkYWFkMWVlYjM0MzZkNjA0YzM4YjE5Mjc3NTBkNjczMjlmMTcwODYxMjU3NjQ5NjE5MTA0ZGZjODBhOTkzYzdjNDM3MWFiNzZhMzIwMTgwMGU2NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hdWN0aW9uL3NvcnRlZE9mZmVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXVjdGlvbi9zb3J0ZWRPZmZlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMTU4ZWI1NjFhNDJhMDVjNjRkOWM3OGRmOTVjN2ZjODdjOWIxMzcyYjQwYjQ3NDUzMzY1Njk4M2MxN2NhNjBlYWU0OTQzOTUwNzc2NTZkMmNlNDg5ZjhjNmQzYWE5NmIxOThjZmUzODU0NjVhMzAzOTNlNzc4ZmJlYWQ0ZmRjNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hdWN0aW9uL3V0aWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2F1Y3Rpb24vdXRpbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc5NTliNjM0ODdkMTE2NTViMDQzNWU1ZWM5ODYyMjI0NDM4MDJjMzVmZjA2YjNmOTZjZTcyZmE2NzUxNTdlY2MyN2RjY2E5MGU4OGQ0YTk1YjdlOTQ3ZWM1NWYxNDRiNTdjNjBlN2Y4NjgwMzY3MDc4ODNmYmZhYmExZGZhYjFkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjVmMjkwNjZlOTY4NDBiYjI1YjgzODQxMThhY2ZiZWQ1OWNjYTk3NDQyYTg3NWNlNTJkOGUxZTQ0YjZjYTcyNDY2MzYxZTlmYjU4Y2NlYWNkZGVhZGU0N2NiN2M0ZDVmMGM4YzdmNmQ3YWNmODFiMDkxMDY5ZDY4MjRiNjZlZTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF1bHRGYWN0b3J5L3N0b3JlVXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdWx0RmFjdG9yeS9zdG9yZVV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzkxNDU2ZjM2NzNhNzY0ODFkY2JmZDFlZTM1N2ExZTkwMmM0MTZkMzYwOWViMmIwZjI5ZTE2ZWY1ZmRhMjMxYzVmZDZhMDkzZWFhNWViNDcwMDFhNjAwNjZlNmRhYTdhOTdiYzk1YjI4MWNjZTEzYWM0MmMxYTMwNzhkNTI5YjMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVybmFsIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZS90b29scy8qIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvKiIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvZGVidWcuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWJ1Zy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L2xlZ2FjeS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xlZ2FjeS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS1idW5kbGUtc291cmNlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcHJlLWJ1bmRsZS1zb3VyY2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9wcmUtcmVtb3RpbmcuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUtcmVtb3RpbmcuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9wcmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC91bnNhZmUtZmFzdC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Vuc2FmZS1mYXN0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0cmVhbSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgImFueWxvZ2dlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhbnlsb2dnZXItdjAuMjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYW55bG9nZ2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFpbi5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jYWxsYmFjay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2FsbGJhY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YjI5MWM2Mjk5ZjYzYzE1YjFiMjI3MzM2ZjlkNGUyYTE2MDQwNWQ2NzRjYzE4MjQ3ODYwMjk4OTc0ZDQwZTFhYWQ1MDU4MjM3MmEyMTc3OWIyYjc4ZDA4YzhhOTU1NzY5YmRlOGVjMWVlN2U4MDliMjQ3MDljZWI3YjA2YTU5OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb25maWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbmZpZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhMzE4ZTEzNzliZTdhODg3MmRkOGRhOWU3ZmFhMGQ3OTIwNWI1Yzg5OWM1NDEwZmI5MGE0YmM4OTViNzU4NTVjYzcyYTdhOWZkZTM1ZGEwYTA3NWQwNmNhNzdhNWYwMGRjOGI2YmI0MDA5Y2UzZjE5NDNkOWJkY2NjYmJjZDUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlYnVnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWJ1Zy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUwMDFlYWNhNGIzYjI0NDc5NmFmNzFhZDQ5OTFlYjA5ZjkwMGRhOGFkNDY4MDRjMjJiMDgxYTg2MTk0ZTQ2MWIxNTEyNDU1ZWYyM2E1ZmFiMTJlMzdmZDYzOWY1MDdmMTkyNTZiOGNlMTA1M2ZkY2Q4NzA5ZTIyYWZmNjNhYWYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc0NzY2NWE3MGJjZjRmZmZlZjA2MzA3NzliM2FkM2YyYTU2YjgwMzI2NjZhNTEzMDdiOWVlYThkYzQ0OTJlZGU3YTA3NDQ3NTc3ODg5YmE0ZGVkMzk4MDkzNmQ4OTA0ZjA1MGU4NDcwZjEzYWUyYmI1MTlmOGY5Y2Y5YzYyYjU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNTVjZTFiY2U4YjU2NGNhNDNiNDg4NTQwOWMwMmY2MTA0NGJjNzIyYjA5YzE1NTY2OTIxODU5NzAxNDBhODNlYzUyNTI3MDc0NGQyZDFkOTM2MGVlYWE3ODEyM2NhYmFkOGZlOGIzMGI3YmFhMzg0MDJmMDI4YmEyMjRhMjgzYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXRob2QtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldGhvZC10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjViMGVmZjM5YzkzNzAwMWU5MDlhN2I2YWE1ZmE2OWY3MWM2Y2ZmOGQyODRlNjQyMDQzNjczNWY0OTk1NTNmZTdmMTYzZDFlN2RlNjM2MTM4YjZlNjA3MmNmMzVmNWYwNzBlZmRkNmIxZGVjMjRjMTIxOGU1OTFjODRhZmMxZWI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Rlc3RpbmctdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Rlc3RpbmctdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjYmZmN2RlNTFlZDJmODc0NDdhODJiMmZhNmU4NjAzNGI2MGE3NjE5YjM0ODA4Zjg4MGIyOWJkMjVjYThiNTY2Njc3Yjc4NDExNWM0YWQzYTMyNTJhM2UwNThmZjM5ZDg4NWQxZGEzYTg0MDA5ZGQwYjEwOWMxOGE2ZmMzYmRiNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDA0N2IwZDk1ZjU5ZWUzYjZmMTA0MTc4Y2Y3M2ZjYjZjYzdiNTJiYzUzMTIxYTE4ODMxNTVkMTRmY2MzNjdjNTA1YTk2YjgyODNjN2ZiYTE3MDJkYzNmMmNmM2IzZTc4YzY1MjUwMmQ3OWFlM2Y0NjU2ODZjMmM5MjhiZWVkNjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3VwZ3JhZGUtYXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjAxZWIzM2Q3MjRlMTdmMGEwYmI0Zjc3YWYxNzMzMmFlNWU2YjljOGFlZjg4NzJlMmEzZGYxYWJlZWQyMDU4NDgyMjE5MmUxNmQ5YzQ3YmQwOGY3ZmRjMmQxNTUwNzZkYzM1YWMwNDgzMDYwOTE0ZmU2YTA4MDJhYWM0ZWQ0YzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3V0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2IxMTRiYmUzYTQ5YjM5ZDhmNWQ0NmZiNjA1NWUzOWMxYWQwMTI5OGI3NGRiODRjMzlmZDE5MDBlY2M0OTVlOTU2OGIwYTQ5MDg2ODQ2MDVhYjBmZDlmODJiOTQ3ZTdmMzE0MWE4Njk5NWI0NmU2ZTI5ZmIzNTA4ODAyNDQxYmIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbmV0d29yay12MC4xLjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvbmV0d29yayIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25ldHdvcmstdjAuMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbmV0d29yay12MC4xLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25ldHdvcmsiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9uZXR3b3JrLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmV0d29yay9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25ldHdvcmstdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2F0b2IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2F0b2IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2J0b2EuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J0b2EuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2RlY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGVjb2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9lbmNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VuY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFhYTQ2MGJiYTc2NDQ0M2Q1Y2FmYjMzZjUyMjc5M2JiZTI5ZThkMjRmMmM1ZTc3YzdiNmExZWMwNDE1MGFmODAwYzdiZjFjMDVmZTUwNDUwZGZkMjk4Y2NkOTJhNzk4NjAxYjFiNDhhMmZjNDRhOWY5YmRiYjY4ZTA5MGNlYTI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM1N2JiYjdhZTUxMDc4ZDhjYWNiNzBkODNmODc3NGI5MmZjMjY4YmFlYmZhM2UzMDFhYTFiNWE4MmNkM2Q3ZWFkMjliNTg2OGVmNmJmNmU0ZWYxZGRmMWY5ZTdmYmUwNGNiYTYxNjJlOWQ0Mzg3Y2RlNDBhNjg3MTdlNmI3ODI1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9ub3RpZmllciIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy90ZXN0aW5nLXV0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdXBncmFkZS1hcGkuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zdWJzY3JpYmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEzNzc2ZTMyYjA0Mjc3NDU0OWNiZWJhYmZiNjIxZDZmOGVmOTJlMDNhZTdjMmQzMWQzMTg5NmFjMmVlY2VjOThkMWU5YjY5MjlhNGI1OTQ4MzQ2NzY4ZGI1MjFmZTIwNGFlZWRjZjVmZmYzNTlmZTJlNGNhMDVkNjNmNWE0OWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU0MTU0YjRhYWZiODFjNTJiNmUxZWQyMjU5MDFjZGJmYWM2NWI0ZGU4YjNjZGQ5Zjc1MjY2MzgwZGY2OTY1YmUzYzI5MWQ4ZmU5ZjRmODU5MTgwODFmZGU4NDZhMzJlMGZlNTM1ZDNiYTZiZjkwMTU4NzVmZDM2YWRiNzkwYWM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVjMmY4YTI4NTY2MDNhYmM5MzJjMDNjYzY0OGUyMTYyNWNiMWZiOWIyZDA2NjE3MmY1OWI5YWQ3ODY2MjRiNTU1MjQwZTMyYjMzMzFlMWI3Mjk4YzlkZjMzNjAzZDAyNGUyY2U2NTY5Yjc5ZTUwYTEwYWUyYWM0NzhlYjFiOGVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc5MDhiNmFlMDBjMTEwY2EzZWZlNTY2MTVkOTZjNjYwNjIxMDdlOTI2MWJmNWE2NWI1MTM4ZDQ2NzEzMjJmNjEzYzdhNWU5MmZmZGZiZjk3ODU0Zjc2NDE5N2NjOGUwYzFkMGUyOGRiNGIzNzUwMWM5OWM2MDNlMTA3MjBmODYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc5NWJkOGQ2YjU0N2FhZTBlMWMyM2JhZmRhYTFlYWM0Yjk1YTliZDE4ZTI4YmM4YzQ5ODZiZjkzNThhMDg1Y2U4OWQ1MzEwNWFlZTdjMjNmMDM1YjdkNzYyM2Q0N2I0NTUxYzYyNWRjZDhhMmE1MjMwYTViN2JlNzM3YzJhMGJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC1ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLW5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTc2NDllYTIyOWE1NDg1NDBlOWJiNGE1NDdjZDE4NDViNDE4MTU0Mjg2NTJjOTc1YzBhOTk2ZjFmZjY4NzhmZTkwNGNjNjgzNzllMGMxYzk5ZjRiM2NkYjI2MDYyYjEzZjhhOTFhYzNlZjYyMDUxM2MzMTdkZGJmMjNmZDdhNzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTBhNDBkNmRjMjY5YjMwMjQzNjRmMjk0OWE4MWExMTU3OTQ1YzhjZjhkNTBhNzMwZTU5YjYyM2ZlMDMxZTUyNTc3MGZkMjlhMzZjNDQzNThiMjkxYWJmZDRkMjZhOGUxMGNiODJjMmYzZTk2ZmYwZGI5NjJmNjE3ZTU4NDJmZWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZDFjMzc3YTU4Y2U1Njc0YjMwMTgzNzEwYzgwMjY1ODNmZjI5NGVlODZjMDRiZDczZjBkNjFjNGNlMTMxN2ZmMWU4N2IwNzE5YWMyYTkyMTI5M2IwNzMyOGRiZGM1OGUzNWY3MWIwOTczMzAwOWZjYzAyMGQ1YmNkYzQ5YTUyYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDlmMTIxZDJhMWEyMWYyOTEwZmMwMzMxNjg4YjgxNGU2YmZhNDFiN2Q4ZmZlNWZhZGM2NDMwMGNmOTg3NDI5ZTgxZDc1MzUyMzE3ZjllNzlmMWEzNWQ0OWYzYzEzYWI4NGViZjI1ODkyNzg3ZWIxNDg1MWE1YWM5ZDQ5Njg2MWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdG9waWMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RvcGljLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWFiZWM1ZTk3YTk5OGI1OGMxMDVmYjFkNThlYzJjYzhiYzIzMjMwMTFmOTY4OTZhNjZjMjZiMjFjZjBiMTA1OTZjMTViYjg5ZDA5NTVlN2U1ZWM3YzNlZGY1MThlYzI5ZDc4Y2NhMmIwZTBkNzkzOTMzODQ4NGZlNzQxOWJkOTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtYW1iaWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZlMTdiOWRiNjczYzRhMTNmM2U3ZWY5YTBjYmNlZjE3OTI3ZjE2ZTE5M2M0MzgwOWM4YzZiYmFmNGI1NWU2ZDkwMTYwZDMyMmZjNzU5ZTk2NTA0NDVlOTM3NzIzYjE0ZWFkYTI5ZGI2MTczZDJiZGQ1YWZiOWEzNWMzOWY0NjNlIgogICAgICAgIH0sCiAgICAgICAgIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInRvb2xzL3Rlc3RTdXBwb3J0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE1ZWI1OWIxY2FmZGRhMTNjOWRhMjVkYzRlNzFiYzhjZTg5NjgwN2I5ODFhMjRmYzgxMDhmM2IyMDExNmI3NTFmY2RiMWNhMjE0OTM5YWNkNTkyOTYxNGE3YjgyZmQwYzViMDU3NTJhNmQ2NjhlYzNlMTUyZTI5ZDJiMGNhNjc5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3N0b3JlLXYwLjkuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9zdG9yZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4byI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8vcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8vdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImV4cG9ydGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWFhNDYwYmJhNzY0NDQzZDVjYWZiMzNmNTIyNzkzYmJlMjllOGQyNGYyYzVlNzdjN2I2YTFlYzA0MTUwYWY4MDBjN2JmMWMwNWZlNTA0NTBkZmQyOThjY2Q5MmE3OTg2MDFiMWI0OGEyZmM0NGE5ZjliZGJiNjhlMDkwY2VhMjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODFmZmI0NjhhMTQ0YmUwZWJmY2U5YWU3MzI3NjY0YWI2Y2U4YjczZjJmMWE2NjYzNmFhMGNkN2QxMDE3ZGVkOWY3NGRlMjFkYzg5MzZlMDIxNjZkYWNmYTk2NWJhN2NjNTg5YzkzOGE1YTNlMWU0ZmU0OTAyNjk5NWMzYmQwMDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY5MjYwNDBkY2YyMDliM2E0OGVlMzZkYWViMjcwZWVjYTBiMWJhZDk1YjYyMzEwM2U0YTU4OWE3YmE4NGY4N2E5NzAwYmNjNDk5MjQ5ODc4MDc0MjNmODk0MzQyMjU0ODE0YWZkYTE2MjJmMjNmNDY1MzdiZjQ0MzQ1OWVjMGJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg4Y2ZiNWMyZmIyYmY2MmY2YThiOTY3NzM5NDFmYTgyOWFjZjJiYjk5NWM3ZGYzYTkzZTA3ZmI1M2E3MTZlMDMzMjAwMDM4NDE3MTQwZDAxNmIyZjJhYjExMGI2MWNmODdlNTFkMGU3ZDMzNWM1YmIwMDkwODExNmMxNjVhY2UwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzMxNGM2ZDNhOWJmNzY2MTEyNjE5ODA1MjM5ZjhiMjI1ZDlmOWFlMmZlOTcwZTQ4OGExNjI4MGEyZWM2YzhkNmMyZGUwZWIyMzA0MmZhOTRkN2FmOGEwYzkwZDM3YTc4ZTQ0YzI4NDI0YzA3ZmIzNDcwZTY0YTA5NjUwYjJmZWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NWIxODk3ZjE4YTY4ZmNkMTk3MjBlYWE1ZDA2NDdkY2QxYWRlODE1Y2Y3OWEyYzg5MjA0MTRiMzAwYzUwMjNkMTEyODEzMmMxMDcyNmM2YzRjOTFmZjMyZTBiMmI3MDdmZTMyMTQ3ZGYzYmJlYjM4OWYwZjE4M2U5Y2ZiMTdlZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQ3Mzc0NzQ4NWJjNGQxODM3ZDBhNzc4MTQzNzIzMzYzMjBiNTQ1NjE5MDVlM2IyYjczNGVhZDQ0NGZiMDg5ODcwOWY1NTZkOWJlNDVlNmNjMDBiZDFmMDVhY2Q3YTI0Y2MxNzQzZjI5OTMyZWNmNjE2MGRmOTcyZTkyYjM4MDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRhM2RhODYzZjEwNzdjM2RiMTVmNDJiMmI1ZDhmZTljZjIwMDk3ZjAwZjVmZGQwODNmZjJiN2Y2MWExZmY3ZGNkYjkzZDFjYzJmYTgxYThjZDcxOGIyMjZlNzllNzJkNjMwOGQwZTcyOTA0M2QwZThjYTgzNDYzZjFjZjBhMTYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGZlMTZhNmQ4MTI4YjUwYTI4YjM5Y2RmOTZhODdkMWIyMTJhNmJiZjA2Zjc1MjAyZjY4ZDVlNWE4YzA5MmIwYTJmZjVmYzRjZjg2MjM5ZDE0NGRlMTQ0NDVkZmU5ZThkNTYwNjhkOWNkNmRlNTBjNWQ3N2IzMWU0OTk1N2QzYzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTA4MWQ4NDQ2OTg0MmE1NjcyOWE1NWVlYjU0MTJjN2YyZmZjNWNiNjJlMzdmMGQzMzVjNTEzNmVhOGQ3OWI4Nzk4MjYwMDBkYTRlYmMwYmNmN2I3YjUzN2E3NzQ4MmExZTUwNDlmMDU1N2U0NjQxMDhjZmQ3NTMxYWE2YTQ0NDMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzIuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nLXN0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmctc3RvcmUtdjAuOS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMtdjAuMTAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXhzbmFwLXN1cGVydmlzb3IiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC14c25hcC1zdXBlcnZpc29yLXYwLjEwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXhzbmFwLXN1cGVydmlzb3IvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQteHNuYXAtc3VwZXJ2aXNvci12MC4xMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3hzbmFwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMveHNuYXAtdjAuMTQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMveHNuYXAtbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy94c25hcC1sb2NrZG93bi12MC4xNC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYXRvYi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXRvYi5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYnRvYS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnRvYS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZGVjb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2VuY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW5jb2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9jYWNoZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vY2FjaGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12My4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jaGVjay1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2hlY2stYnVuZGxlLXYwLjIuMTkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NoZWNrLWJ1bmRsZS9saXRlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NoZWNrLWJ1bmRsZS12MC4yLjE5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saXRlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NoZWNrLWJ1bmRsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2hlY2stYnVuZGxlLXYwLjIuMTkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2FyY2hpdmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYnVuZGxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J1bmRsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW1wb3J0LWFyY2hpdmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL25vZGUtcG93ZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL25vZGUtcG93ZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuMy41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvZGVidWcuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWJ1Zy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L2xlZ2FjeS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xlZ2FjeS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS1idW5kbGUtc291cmNlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcHJlLWJ1bmRsZS1zb3VyY2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9wcmUtcmVtb3RpbmcuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUtcmVtb3RpbmcuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9wcmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC91bnNhZmUtZmFzdC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Vuc2FmZS1mYXN0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zZXMtYXZhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Nlcy1hdmEtdjAuMi40MSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc2VzLWF2YS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zZXMtYXZhLXYwLjIuNDEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Nlcy1hdmEvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Nlcy1hdmEtdjAuMi40MSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4zMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4zMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9yZWFkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMzIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3JlYWRlci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvd3JpdGVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjMyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi93cml0ZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYW5zaS1zdHlsZXMtdjYuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJhbnlsb2dnZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYW55bG9nZ2VyLXYwLjIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2FueWxvZ2dlci5qcyIKICAgICAgICB9LAogICAgICAgICJhdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYXZhLXY1LjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW50cnlwb2ludHMvbWFpbi5tanMiCiAgICAgICAgfSwKICAgICAgICAiYXZhL2VzbGludC1wbHVnaW4taGVscGVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImF2YS12NS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VudHJ5cG9pbnRzL2VzbGludC1wbHVnaW4taGVscGVyLmNqcyIKICAgICAgICB9LAogICAgICAgICJhdmEvcGx1Z2luIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImF2YS12NS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VudHJ5cG9pbnRzL3BsdWdpbi5tanMiCiAgICAgICAgfSwKICAgICAgICAiYmV0dGVyLXNxbGl0ZTMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYmV0dGVyLXNxbGl0ZTMtdjguMi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saWIvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiaW1wb3J0LW1ldGEtcmVzb2x2ZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJpbXBvcnQtbWV0YS1yZXNvbHZlLXYyLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAibWljcm90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIm1pY3JvdGltZS12My4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4IgogICAgICAgIH0sCiAgICAgICAgInNlbXZlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZW12ZXItdjYuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zZW12ZXIuanMiCiAgICAgICAgfSwKICAgICAgICAidG1wIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInRtcC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpYi90bXAuanMiCiAgICAgICAgfSwKICAgICAgICAieWFyZ3MtcGFyc2VyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInlhcmdzLXBhcnNlci12MjEuMS4xLW4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idWlsZC9saWIvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAieWFyZ3MtcGFyc2VyL2Jyb3dzZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAieWFyZ3MtcGFyc2VyLXYyMS4xLjEtbjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Jyb3dzZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3RpbWUtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3RpbWUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NWRmZDRlYWI3MmE2YzhhODdlYjc4NjNlN2QxNmZkYTEwNzhkMDg4ZTQ4ZWQ1NTJiYmU3Y2FiYzVjZWQ5OGM5NjViODIwZGY0Nzg3Mjg1OTc0NWFmNzM0ODRkMWQ4YjIxNTM1YzZmZjFmYzRiNWU3NTRlNjYxMGQzZDFmMzc0NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90aW1lTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGltZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYTA2ZDg0MjI5MWZiM2JhNTk5MjdjZmYxNWEzOGQ1NjZiYjg5YjdhZDMwNjFkYmMwNjg3MWE1MzlhMTQxMzM0YzI3OTE4OTE2NGFkMzA2ZmNlNDAyOTgyYTE5NzJlYmVjNTUxNjIzZjZiMDMxZGFjODg5YWJiMWQxODc3OTMyMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTExMjMxYzcwMTJiNGUyNTcyNzQxZTBlOGJlZThkOWE2OTY4YThlODkxMjgxOGY2MjZhMTBkMGRmYjIwM2NjMTU0YzcyOGNiZmRlOGEzNDg3MGE2MjNmNmUwODYyYzM5MjRkNGY2ZTEzNjA5NWZhZWIzMTkwMDY3MDkyYWE2OGQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdC1kYXRhIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzLXYwLjEwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZjY0NThkOTMzZjcwNGMxOWE5MzQ2ZjkyYTQxMjRiMDhhNWY2OGIxZjI4OWE2YTU1NmVmODMyZGQzNjVmZWJmMTA4NGE5OTI1OTFiMDYxNzlhNDQ2YzY4YTU0MjQxN2VhOTZjY2VjMDA3MTNiZWVmYzMwZmVjMWI4NWJhNDBkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhYWI2OWYwNjYyYTI1NjA0ZjY5NjMyMjg2NmE1MDY5MDM2MjE1NGQ2NmM0ZTRmOTExN2VmZmEwZWI1MDRlZGVjZGY5MTA0OWRlY2Y4YWJlNTk3YmE2NjIzNjU4ZWQ3YzIyZjgyM2FkN2E5N2U5ODcwMjlhNDNlN2E1MTRhNGI0YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YmE0YzBkNzY2NTEwOTc5ZWQxMTVhZTdiYmJiNTYwMmUyZmQyY2MyYTJlYTRiNTAwMzQ4OTE1OWJiMDU3MzZmMTU0ZTQxMzBiNWYxOWEwZjliNTI1NThhMmRmNzg5MDkzODJkNzVmZDdlZTVlNzQyMjI3MTk1OTkzMWJjM2E4NiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy96b2UtdjAuMjYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy96b2UiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cy12MC4xMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0L2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2NhY2hlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9jYWNoZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NhcHRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NhcHRwLXYzLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuMy41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInlhcmdzLXBhcnNlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJ5YXJncy1wYXJzZXItdjIxLjEuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVpbGQvbGliL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInlhcmdzLXBhcnNlci9icm93c2VyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInlhcmdzLXBhcnNlci12MjEuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9icm93c2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiOWQ2NzA5ODQxOTJlMzc0Y2RiYWQyY2ExOTU0MzRhOTBjNDBkMWJkNDlkOTExYWJhNjcxZjgyNjQ3NTU1ZTk2NzQxY2QwNTcxZDI0MWFkYTQyYjAwMmNlM2Y1ZDNmYWUyZjllNGJiNTJjNTgzZDk0ODk2MjZhZmE2MTM0YjYwOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jbGVhblByb3Bvc2FsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jbGVhblByb3Bvc2FsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGU5YzBkNjQzOTBkODZmZmYzMGU2YjA0YzA3MDdiOThjYmE1Mzc2ZTQyMmU2ZDU4YTgyMTY2NjI1ZTcwZDNlNzRmZmZmYmJjODE2ODJjOTI3MTJhYjQ2NzMyNTlmYzliMjNiZmY5N2ViZWNjZGQ0Mzc1NzExMTJjMjNkZTJkYzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUyYTJmZWU0NjY3Njc1NzUzYWI4NmZiODZlZWU3NzdhY2EyNzRlMDA3MzFkZWJmMjdmNjdmNjM3ODA1ZWY2NTYxNjllMDYyZDliZjE5ODBlZDEyZGM3YzgyNWI5Y2E4NmM2MmU4Y2M5MmViNDJkNzVhYzE5MDkzZjhlMmE1M2U0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0RmFjZXQvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0RmFjZXQvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwNDkyMGQ4Nzc3ZTZiNjllZmE5Mzg1NjRlZDVmYjdkNmE1MzYzYzNhYjMwNzY5NDYzMjUxOTAyNTk5YjQ2OGQ1MmNmOTE5Y2FmNzA1MDViOGEwODdhOTdiYWVjZjM5NmViYmJiMDUxZWE2ZGVlYjg4M2MzMmJiZTk3YzUyZTA3YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNiZmRlNjA2YWMxMmIxMGE4M2IxOGIyOTU1NmRkOTYyNjliNjFjNjI3Zjg2YjdjZTc4OGIwMDc4NWU0YmQ2MGQyODUwMGJlN2RlMzNjNGJmZjA1Y2NiNWNhY2VhMmNmYTdhMTgzNzRhMDk5MzYxMDgzYzczZDJmNzUzZTMyYWRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9ib25kaW5nQ3VydmVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA0NWM4MmNkNTlkMjA0OTdmZDQxN2RkMGQ0NDhiNzRjOWMyMWRiMDA2ZTVhOGMyZTg3NDQ1Mjc4NWZhYjEzNjQwNmRmNTRkMzYzZTA2OGY2N2Y3Njg0NDhhMDE5Y2Y2ZTZjZjNiNzRhOWM5NDM1YmFhYTdhMjU3YWQzNmJiMmM2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM1Mzg3MzM1OGYzZTJmNzBhNjI2OTFhNTIxMmNjMjA5NjU0YjZhYTkyZDZiZDZjNzI4NTA2MjM4YWJhNWNiYWY2M2Y3NGJlOTM1NWU2NWVkYzM5NDE4ZGVjNWJhNTliMGEzY2Q3ZThjNTYxOTc4NmFjYzc2MGViOWM0NDU2NzZjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDJjMGM5YjIzZDEyZWM3YTJjZTdhMTdjOGYwM2Y3YWI1MDA2ZmZkYjEzZDFhNWIyYmQ3NjllN2FlOGNkMDdmMjE0YzE4MWFmMmRlMDFmNzJlZDUwYjc5OWVhZTUxZjViZjJhYjM3YjFhOTgwMzU2ZmViNjk3ZWU5MjY2YjAwYTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYTJmMThjYjAxZjRmODNhYTRkN2VhMmM0OWEzZjkzYmM3Yjc2Zjk4N2YzMWViYjBmYWFjNTRhMTY1NjM2Yjk5MDM1OTM4N2Q2MTA0Yjc0NmZmM2U0MjNjNmNkNjg4YmVjZWI0MGQyMzA2ZGRlNDlkYWJmZGQ0NDY3ODUyNjQ2MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwOTI4Yzc5ODNjNGQ4ZGI4ZDFjMzE4N2Q0ZTczZDEwMDc5MDE4YjRiMmM5YzRjZTUzYjkwMjA4MDYwYmEzNTMxYmNkOGNhMThlN2EwZDViMWQzYWM0ZWI5ZjMyNjc5NTkzZDZlMjNmMzhmNTExMTI5MmU5YzVkZTQ0MGYzMmE2MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFmODcyNDllZDE3Njc3Mzk1MzY0Njc3YTk2ZGE5Nzc2NGQ0MzRiNzllYTIwOGM5NzFlNmY3ZTQ3NzdhNDQ1ZDA0ZjBhNWI3YjQwMWYxNzkyYzMwY2NlNTg0MGY5ZGM1OGRlNGIxZGViOTA1YmYxZDA4ZjQwNGI3MjYwYTA3NzA1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTE0MTRlZDJhNThjMDk0NjgxODM4YzU1M2JiZmM0NTI4Nzg3ZTA1MTVmYTAzYmNlY2YzZjcyZDczM2Q3NmM2OGIxNDI1OWYxOGU2Zjc0NjczNGU3MTYwMmIzYWM4ZTlmYmU2YzA2NzQwYjI4ZmMwYjgzZjZhZWVmNDIwZTU3OTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3NhZmVNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvc2FmZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjYTI2MjU2OGVlYjU3YjRmNjUwOTVkYmE2MzQzMTJkMmVkOWJmMzMzNjViNzBmYWQ0NGJmNTg2M2RkMDVhZmI2NWZhZGFjZWNjODExMDY1NjEzYjZhZjU5ZTdkZTUxMjk2YjM0N2QyZWNiNDliYmEwNzBhMjc0MjBhNDU5ZTlmMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTI5OGJiMmNjMmYwMDQ5MzcyMTM1YmI3ODEzZWFiMTRhMjdiNzNkMmM2MWQzOGNiNDJhYjI1NmQ5ZmZlYTQ2YWRkMmI3ODMxYTIxZWI0MThhN2Y5ZDQzNzk2MGQxY2QxNjY4Y2JjOTEzM2U1YWE0OWE2ZTJkMTA0ZGRhMTY2YjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0aXN0aWNzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGU2ODQ1MTRmZTM5ZTYzMGQ3OGVmNDk5MGViMDJiZWRhMjgyZjZhNWI3NmU4YjQ0MjgwZmViMTcxNzBhZTRkY2Q0OGMxZTBlZmRmZDAyYTU0ZWMyNTFkZDI1Yjk4NTA4ZDVlZjE1ZGFjNDAwOThmMzA2MjljMGQzMjc0ZWI1YWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3RvcGljcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3RvcGljcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNhNjY3ZjI4N2YyMzZlZWVkMmQ0Zjk1MTNiOGEyOGVlOTNlMTEwYjU0YTZiZmI5NGFjNDMxNDY4ZGE4NjYwMWU4MTJkODY0OTc4NjgxYTQzYzc3ZTdlYzcxZTQwY2E0YjVmMzViMTliMzYyOTY5YmZiNzcyZGU0YzgxNjRjMGZmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTcxYmI0ZDRiN2RkNmVmNTc4ZTYzZmI4MjA5ZGY3M2YyZDY3MjQ3YjczNjQ4YTA3MGU1MTUzZjMyMTZmYmZkMTVhZDE0ZDJlNjQ4ZjIwNmM4ODE5Mjg3YjdkNWNmZTUzNTcyMmYyZDEwZGUxNjZiZDkyNWY0ZGIyZjFiYjk5ZjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTc1ZWI2NGNlMTE1ODYxMjNlOTQxMjI0ZTA4N2QwMDI2OGNlMzU1MTI1YmU0ZTZkY2I5OWQyN2RjNDlkZDZlMzEwNThhYmRmMWI5N2MyYzUzNTNhMDg4ZGU3Mzc0NjQ0MDBmZWM0NjZjNTIzOTM2MjgwM2IyMGQ2OGMwMDZlMTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RzL2NhbGxTcHJlYWQvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0cy9jYWxsU3ByZWFkL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2U5MTJlM2Y2ZWZlODU1NjFhZWJlZjRkNTZlZDA3MmFiOTdmYWI5MjU0OTg0ZDEwNmIzYWU0MjkyN2Q0ZjNmYjQyZjM3OGZlYmZiOGM5NjI3MTU1M2FjMDVlZTdiNDY3OWRkYWJiNzliMTBmOTQwNDgwZTlmYjBiMTY3ZDAwYTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RzL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZDliMzQ1NjJmYTVlNjFjNGIwZjk3ODJjZWE2NDZiNDcyOTczNjMyM2Y4NTBjMGJhM2UxMTJhNWVjYjIxMWY5NjEyN2Y1NjhlNmE1MmMxOGEzZjU2YTM3MzU1NjA1NjU0M2IyNGY2ODZlZjc5ZjczZDNkZWQ0M2Y5YzkxOWMzNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdHMvbG9hbi90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RzL2xvYW4vdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOWJiMzNiZmIyOGI1MDU5NDY1Njk2ODIwYzcwNGI1NTAzOTI1MzEzYmJlZTU2OGQyOTc3ZGVjNTU2ZGY2ZDgyYTVjOTliMzMxNTE1YWExMjUxMDBhODk3NzYxN2JjY2VjZmRhNzUwMzY2N2FiNmRiZGFhMTNhZmI3NDI5MTE0YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdHMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0cy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhlNDZiM2QxMzg2NmU3MTdiZjIyNThiNTU0NDIwODllYzc3ZTgzNTBiMDgyNGZkZjIzMWRhMDJiNDg1YjEwYWU4NjhkYmMzODE4YTkxZGRjNWJlMTVlOTQ1ZWEwZjI1NjJhMjYxYjVhY2YzZGZhNjc5MjE5Y2MzNmExZDUwOGRjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ludGVybmFsLXR5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbnRlcm5hbC10eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFhNGYyODVhYzY2MTA3YjEyY2U3ZTBmNDFiNjEyOTVkOTAwMzNmYzIzYWU5ZGViNGQwM2JjYmU5YTI5NjE5MDAxOGFiZmIxMmE1YTY3Mzg2NGU0Y2MxYzY5ODkzZDkzNzJlYWVmOWIxZTBmYWU0OWFlNWM0ZjQ0NmZiOTM4NWVlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VIYW5kbGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VIYW5kbGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNGNhZTg1YzJkNDM3ZDRhZDRlMjJlZjU0MDhiZTJmNjVhZDQ4MTY4YTk5Y2FjODhkODM0YWE5MDJlZjQyZThjZGUzNmI5YzRlYjVhZTVlOTViNjQ2NTg1MmY3NGZkMTM5NjBhNGYxZjFmOTk2ZGU3MjljMzQyZmQwNjA4OWQ2OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9vYmpBcnJheUNvbnZlcnNpb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL29iakFycmF5Q29udmVyc2lvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRjZjk4NGM5YWFiYTRiNmVjNjA0YTc2YzQwMWYwZDgxYjNlNTVlMWI0YzE2OTI0MTlmZDliOWUwODc0MzZmNmQ2ZTdiOWIzOGE4OGRiNjM5ZmJlN2UxYTFiZjU2MjY2Mzc5ZGVlNDcxNTFlZjMwZWI2Y2FiMDRjOWY1OTk2ZTU0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOWNiZjY0ZjFmMDllZWU4MjI1NjYwYjc4MzM3NjdlODc1OTZkZGIyMTFkZDE3YjlmZTkyZDdhYTBmNzBhMzJmZTQ0Y2I4OWM3MmEzZmM1OTBhMzFhYWI0YjcyNmU2YjRiYTY1NmMxYjdkMjM1ZjQyZmNlOTA5MDA3MjgwYWE1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5YmM3Mjk2ZGRhYTRmN2Y3NDllYmFjM2EwNjZmYzE1NTQ0OWFmMDcwZDBmMjRhNmExODE2YmUxM2FkMzI0MTMxYmQyOWUxMTczNWZmOTNjOWJlNTFlOTM3OTA2NGJmMmViNWFmNzFhNGFlY2NiZGUxZmQ0NTY0ZTRlYWU3MDI5MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy96b2VTZXJ2aWNlL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTc4OTBkN2M5ZjdkMDlkMjQyMzI0N2QyZTkzZWY2ZmFjNjg5YmVlODAxNjRkMzE2MzJiOTJiM2EyYTljZjgwNzE4ZmU4ODJlMzQzZDhlZGVhOGM3YjA0MGY4ZGJlMjVjNTljYzIxOTgyOTY5ZTBmZTZjZTdjMDA2OTgzMzU2OWUiCiAgICAgICAgfSwKICAgICAgICAiLi90b29scy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInRvb2xzL3R5cGVzLWFtYmllbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkODQ3MTlhYTFjYTUwZWVmNGUyYTdhNTlmZmYzODc4ZGQ0NTYxOTU5ODk5NGU5ZGY4YmQwNzU2MWRkMjU5ODc3YmJjN2E0MGU0Njg2ODM1NmM0MWJiNTcwOTBkYmFiYWZkNDIzMzA3YjIzMjE4MDI5ZDU5ODMyZWNhZDc5NDdhMCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY2FwdHAtdjMuMS4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9jYXB0cCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9jYXB0cC12My4xLjIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vY2FwdHAtdjMuMS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NhcHRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NhcHRwLXYzLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYXRvbWljcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXRvbWljcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjExYzM0ODQzYjhkOWZjOWEwMzdkNTE1NDYxYWY0MmU1YjVjNmQ4NTk1YzhkNjcxN2FlM2FiMTBmOWM2NGE4MTg4ZGVhYWQ1Mzk2MWEwZTM2OWU3YzA0NTVjYzBjNzNmYmZmMmVmODFkMmQxYjY0ZmQzODkzYWYxYTRmYTFjNjQyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NhcHRwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jYXB0cC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY4OGQyODE1ZDRiZTVmMGY4MzFmNjc5OWE1OGU0MmQzYjNlYTZjNDk0YTkwMzQyMGZlMzhlNjg4N2ZhNWFkY2FlZDI0MmRmOWEzNmNhM2NjNzhmZDcyZjI2MzEyNDE0ZDE5MzhkZDZhNTJiMTg3NGM0YzExNzMxMWY3YWRlMWFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ZpbmFsaXplLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9maW5hbGl6ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA0ZWFhNWFlZDM3MGQ3ZjJmMjA3Yjg1NTY2ZWU0YjQzMWQ2YjBmZGMwYmZkOTQwYjM1OTlhZmVmMmM5NGEwNTIyYmY2OTNjYTMzMGY2ZjAwNzI5NmU3YjE3NmM2YmVjYTNjYWQ1ZTAxNjU4ZTk2YjQ3MzRmNWQ2NzlkN2FmNDk2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU0OGRmYWRiZjU1MmQ1YzhhMmQ1ZmY4NDM1YThiM2JhODZjYmZiOTlkNGViMDY5ZGFhNjE4Y2JiN2Q5NWQyMmNlMGFlNTAxMjI4ODIzMjIzYTdiYjA1MTQ5NDA1YmRjODQ4Zjg3MzNlZmZmMjU2MjMxOGMxZGQ3YjE2OGQ5NjRjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xvb3BiYWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sb29wYmFjay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA5Y2IxZThjYzY2ZTQxMTI0NjMyZDhhNTRjMjMwYTQ2MTU1NjU2YWE3NjE3NTYxYWIwNDc3NDgyYzNkNTJhNmI4MjFhNmQzMTFlNDgzYzExZjliMTVkNjFmMDViN2RkMjIwOTZjZDU4YjkxNzg1ZWJkYzM4YjFmNTlhNTExMTE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYjQ4M2UwOGQwYzk1ZjZmZjU4OGE1NjAyYTI2YTIzM2YwYzQ5MWZlYTdiYTE1MDc2ZGNiMjgyMjIyNGU0ZGE5ZDJmNDViYTcwODA3NjJjOTVmYzdiYTQ2NDczNmMzYzZhZjg0MjhiNTA4OTlkN2I5MGMzNjIxOWIwODY4YTBkYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NjczZmQ2YWIwZTkyMmFhMzA0NDZjMTNkMTgxN2RmMTcyYjRjZWM4M2IzZjI1YzExMjc4MDY1YjA1NTQ3MjkxZDE2NjUxMDFiNjZiZDRkMzgwMDhkMjE2ZDdjMmNjYjIwYzRjMWQzYWIwOTU1YjU0ZTk4NGMxOGEyZTE0NDZhZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS4xIjogewogICAgICAibmFtZSI6ICJAZW5kby9lbnYtb3B0aW9ucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MC4xLjEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYwLjEuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYwLjEuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZTEwNmVlNmFmODkzOTRkMGRkYjNlMmFmYjMyNjdkMzE3MjY3N2EwYzdjYTk2OWQ1YTEyM2ZmMDkwNDJiMjcxNzUxYzNjODU5MDI0MjBkNWU4YjEwOGI3NWZkNzdiZDYzNTU1MGI2NTM4MDVjYTg3OGQ4ODBjNTA1YmZlZmYwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMDFiMzE3ZTkzYjdmNzRhNzEzNzI2NzBlY2I2ZWFjNTc2OGNhNmVmMThmZDE0OGU5ZmEyOTYyYTMzNjlmODY2MGQ2YjJjM2ExZGY0ZmMzMDE3ZGEyYWY4NDc0MjFlNTMyNjVmZDMwYWU3NzZkMDUyYzA3ODcwM2M2Yzc3MDNkZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4zIjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NzZkYTc4ZDI1NGZmZTlhMGEyZWYyMzJkZjM5ZDc3MTZlYWIwYTIzYzM3NWEwNWU5ZTcwOTAzYzMwZTcxY2JhNGQ5YWI0ZTNiYzk2MDM3N2ZmNjJlNjg2NmYwNWYyMWY0OTM0MWMwNjBkNzI4Mzc2NzYzZTRkMTJkNjEyYjA4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmUyODIwMmNlYjIzZTA2NGQ1ZGNjYmUwMjFhZTdkMWE1ZmRjY2MwMjM0MjcwZGM1NjI0ZmQ5MWRmMjM2ZjkwN2RjYzVkMjU0MzI2ZDFjZDMyYWM1MTE3NjAyZDJmYTIzOWU2ZjMyMDMzMjgyZmQ2N2UyNGYxYTdhNGRlOTU2MzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWUzOTc2M2M5NzUyNjk3NWI1ZDFiY2ViMzk4MGZmMDI4ZGVhZGMxYmIwYjBhYzA2MDE1NTU1ZjI3NWYwZjZjYTRlMWJkZWU5YWNjYTNmMzc2OGIxNWViMzllMDEwOWQ3OWMxNWM4ZDU2NDIwMDRiM2IyYjczOWU1MDIzMTJmYWEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V4by12MC4yLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V4byIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9leG8tdjAuMi4zIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V4by12MC4yLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NzMxOGFjMjhkYWM2YjBmODM5MDhlNTU5N2M4NmYxNzNhZmViNzEyNTA5ZDU5NzU1MDAyNzI3Y2FmYzE4ODcxZWVkNTIwOGUxMjFiNzNlMTYwMmRlMGRkMzY2NGY4MmY5NDNmNmE4YmMzMWYxMjZjODBlZmI3MDY0YzQ4ZjBmOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tbWFrZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWQxZDliMmUzMzRhYjljM2E0YzdjMjhjNGVlZjg2MGFlMGE3OWEyYTViMTJhYzAwMWNmYjIxNjM0MTc5NDgyNTljNDlkMmJmZTJjZTIxYzg3M2NjMTUxMWU1MTViMjFiYzk0NWI0ZDU1OTU5YWExMTJhYjM4NWVhYzFkZGMxZTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZWQ5NjgxNDFkYzkxZmFjM2I2YTkxZmFiMTYxOGM2NzA0NDY1ZDBjOWI4Y2EwZmUzYTNlZTVjMTYxMjYxNjQwM2U4OTg5YjU1ZWEzNWNlYzhkNDhhYmRhZTEwYjljNzJlYzc3Y2FiNjhhOWYyMTRkN2I2MmE2NmM3MjQzMDNhYSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZmFyLXYwLjIuMTkiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ZhciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9mYXItdjAuMi4xOSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9mYXItdjAuMi4xOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ODc0OTdlM2JmNjhjNTI3OWYzNmQ0MGUyOGU0YTc0Mzk3MTU4NDAzMWY2NDBlZTQ5NzJkOTI1NWEyOWU5MWJhZDE4ZmQ0Njk5YzRiZGNiM2IzNjgyYzE5NjVkNzZjMjk5ZDQ3ZmI1ODJkMjYyOGJmZmM0ZmNiN2MwZjNkNmYxYyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MC44LjYiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MC44LjYiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MC44LjYiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhOGZkMzA5ZjIyMjA4YjYzMDgxZTU3MDMxNDU2NzMzZjI5NmFkZDBmN2E4YmJhNGQwNjc0MWM5NDU3MTE2ZGFlMmU0MGU3OGE0NDA3ODExODE1ZjYyMWYxMDA3ZjVjNDljZmJkMWU0OTJmYmQ3OTFiNjU1NTA5MjNlMDBiNzA2ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk3MWFkZjEzZjk3ODQ4NmNhMzU0M2VkNzQ2OGVlMDM2MTk2YWEzN2FlNGZkYzYzZjg2NjA4NDhiMDVmYTI2NDM5MzJjNTM5OThkNjc5NjU3NjFjOWQ2MTUzOWZjNDVmMTVjMTVkMjdkYmZlYmM2ZDhjNWRlZjMxOTFjNDRlZDlhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRhMDJlYzFiMWIxM2VjOGUxZTdiZDc1ZmYwN2EwM2RlZWU1MTg4ZmNkNjIwMWU0YjVhMGNjNGZhNGI2MTU1M2VkMGUyYjgyNGI5MTMyYzVlZDlmZDcwOTAwYmFiMTZmZDNjMTRhNDcxYjAwM2MyNWNlMjYxYWY0MjAzMzFhZTQ5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTJkMWZkZDI1ODBhMTNkZGJlMjgyYTYzMjRjNDQ3ZWNjNGNjMDM1ZjU2M2IwNGMzNjI1NjE2YjJiYjE4ZDg3ZmQxMmIwZjYyOTdhMWM1MWMzODc1N2RjZTNlNDRiYjEyOTM2YjFlNmJiNWQwZjllODgyZDA0YjRiYTk5Njg4MTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGJkMGJiMzk3Y2RmNzMxOWVmZGZhMGQxODAxYzkzZGMxNmRhZGRhZDMwM2UxODgzNzcyODAxMDYxMTBhZTkwMDJjZmM4MTAwMDNjYjVkZGEyZGEyNjc3NmE2NDZjNGI2NDg0NWQxMTVjZGYyOTdmMDU3MWE2OTBmZTg3ZWJhNzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzQ4MjU3ODIyZjZiM2NiOGNiOTZmODkxZDdkMzUxNjE5ZmU3YWFiMDdlYTU4ODM4NjNlMTliZDJhNmI2ZmVhZjczOWJmYzFjNTBhNDE2N2U2ODgxZGYxYzQwZmViMWQ2MmIxZTJjNjhlNThlYzE0NjRjOWVjODYzYTc4NzUxMGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmQ2MzJkNjRmNzYzOWRiMjc5MDA3NmY3ZjU5MzFiNDVjY2UyZDg0Mzg3Y2RhMmM3OGM5MWE0MjI5ZjgxNjM0NDE3NmJiNDcwMDhlMTk3NzA0ZjZiN2RhYWZkMjc0M2RlYjQ1YWQwNmM1YmM2Yjg4YzAzOGRmMGU2ZGZiYTI3ZjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhjMmVmNzkyZDY3NDFmY2EwYjg3NWE2N2U4NTA5NzIxYjJkYjQ1MzQ2NDFlMjBjNzk4ZDhjYjUyYzE4MDVjZjA5MzBjNTYwZGY2NDhlNzZjNDYxMDNlMzQzZDJmN2NiNTg2YTJjMzU0ZDFlYTlhZjE1NTEzYTAzZTI4OWM0YWIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWE1NDg1NzliZWM0YjI3ZmUyMTZkNDI5NjIwNThjYjk3OTg4NWVhMzg4Nzg2MzY5MTExZGNmOTk0ZWJhNTYzMTRhYTY4YzEzMTNkYzE1NTEyMjUzNjkyYTY2NDU5M2YxOWFlZjYxM2ZjNGFjM2ZhMjhlNWUyMDA4MmIxZWFkM2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NC4xLjI4IjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY0LjEuMjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbmF0LXY0LjEuMjgiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY2NmExYjQ2NTlkNTI4NmNjZmE1YjA3N2M2ZDllZWYwZjVlZjI4NTk0ZjhlNGZjMjQxMGZmZGQ2YThmNGFhNGFjYjc3YWUzMGMyYzQzYmIwNjdkYWQyNjgwZDE5Mzg5MDgxM2ZkMGIyYzllZDRkMzc2ZDA2MDEyNTgxMzI4OGFjIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saWIvZXNtL2F2YS1mYXN0LWNoZWNrLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZjQ0NmJkZDJkZmE4ODk3NmJhMmQ5Y2YzMmY2MTA0MjAxYmZjYWEzZjE3OTZhMGQ0MDgwMzEyMmYxZmNlNjJiZDk1Y2ZlNmNjYWU4NzlhYzM4MTAyYmM0ZTJiM2I1NTQwNGNmNzJjNzQ1NmRiOTc3MTBjZjY5ZmFiOWY2ZWJjOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMzOGJiNjBmNzg1NGI0YTdiNjFhMWZkMzNiMjRhN2U5ZDA1OGRhNzkwZTZmMGEyOTY0NDNmNzA5ZjIwNmZlZjczMTUwYjdlMmRlZDc5OWM2MzliNTg4NDhkYzQ1YTRmM2ZjYWE5OWEwZjFlNzI1YTJhZDlhNDNkY2U2OTA4MzkxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NGI4MTI1ZDA5ZDczYjAyNWM4MzlmNjI1MWRjYzA2YTUzZGNkMjVhZTkxOGM5NzNlMzYwMTYxMTYzMDhhNDhjMTgzMGFkMzM4NzNkOWI4ZWVlMDZhZDUwYjgyOWQ0NTAzNmU4YzQ4NjAzNjM5ZTJhNTQ4MmVlMmJhOWNkZDMwZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NGU2MjcyN2NjYThjZjNjMmI1YTNhNzhhNWIyNzlmMzY3OTNhMzhkMzY3MTgxNTJhY2E1YjFlMTg2NjY1YjMwNjM4ZGQxMjRhMWJiOGNjOTQ0YzExMWE3MTI2ODZiNDRkMGY3Y2FhYjRmMmY1ZjAyNzNhMDRmNDI3NmYyNzM4YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ3NmViZjM0ZTczZDA1MDM5Mzc0N2U5ZWFmMzVkOTcwN2ExOTA1ZDRjYzFjNTEwYTRmMTllMTVmYzM1MGVjYjFkYjQ5YjJmNTFmODRmYWFlY2I5YjY3YWY1NDhhY2MyZTUxMmZhYjJmYTE2MTBiMzY4ZGQxYTE3OWVhMGYzMzRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJjZDcwOWQ2ZWNhOWQwNDAyYjAzMWVmNWM5MzlhM2Y4ZjYzYWIyMGEzOWE5NjU1MjY5YTIyMWYwZmE3OWVhODQxNTZmOTlhNmU4MTk4NTdiMTcxNjg4NjM4OWE1ZDdjMzhlYTYzOTJlNDQ5ZGIwOGVhNjUzODBkNWRkYTQ5ZDQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZDBlNGJjNmU0N2UzZjY0Nzk0NmUxYTRiOWEwY2VhNjQ3YzM1MzA3ZTk1NTNlNThmM2MxMzIxNjE4MzZiOWQzYjhjN2U3MDFiM2U2ODYwNzFiNjAxZjRiMGI4MDIzMzI2ZjliYTQ4N2FlYzgwMjUyYzk1Y2FhZDhmZDk5NjE0MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OTVhZWQ4NzRiNDk1NzY0OGYwZTU1YzhjNzU5MmRjN2UxYjY1MzA3OWUyNTg2NTk1YmRjZjg5MzdmNzIyYzJiZTg2N2FkY2ExNjNkMDQwNDMyNTEwNjYxMzBlMDJkZGM4Y2I3NjYzY2Y4ZDg3NjRiMTBiZjZhMjZhOTYyNGYxMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlT2YuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOWRlZDNjZmE2MDYyMDJmOTRmNDdkMzUzYWEzNGMwNTA5ZTM1ODQ1ZDliNDQwNjdmY2JlMDBmODk2YWRjM2U0MDA4YzFhOGI5Y2NjNTkyNjNjMmViODM3YjBiNzZmMGUwNWFiZDgwYTZjNWI0NTgwMDExZTE4ZDk1Mzk2OTU2NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZW1vdGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1ODQyZmU4MjUxZDRlMDk2ZjEzY2JlNWViZjdlMGIzMGM2YjUzMGEwMGIzNGZhMDdiZTgwNGQ1ZDdiNDAwYTAyYjI2ZmY0MjY4YjE0ZGQ4NzdlOTZlMWFlMzNhZDA4ZWYyYWI4ODEyOTYzMmQ2Mjg3NTk1MmVhZmQwMTcyMTFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZS1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjVmNmQ4ZTVjYjQ0NjBiNmRlNjVkZDRkOWZhNDhlYTY0ZWQ2MzM5ZWM3NmJlOTlmOWRiYTE0ZDYyMDNjMTQ5OWQxYmQ1MDk1MWY5ZjBmYTA4NzYwZWM5MGQ5NGViOTI0ZDE4MDY3MGRhZjI3YmMyM2Q4MDFjZmZkMmY5MzFlNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiOTkxOWI3OGQwNzM2OWM2N2NiZTY4ZTg2ODBiMmM5MTlkNjA5ZDJkYmNiYjIxZDJjODBjZmYyNjJhMzY0NTM0N2E1MzBlNzM5MWQ0MWU3OGE0NDhkNzUxODMyNmExY2UzZWNiOWM5OWQxNjM0MzkwMTYzOTY1NDkyYWRlMDQ5YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQzOWYzMDViYzc5ZjFkYjlhNmNmYmY5NTI1MTkyNWIyZWU1NmJkMjliYjE1NTdmMjQ0Njk4ZmMyMzVkMGFmOWU3MjdhYzU3MjAyMjZlMzJkYzgwZmM4YWYzNjE3YjBhNGQ1M2NlNzcyZTcwM2UyNWZmMGI5ZWJlZDc0Yzc1NzM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NDE3MGM0ZTE2ZDUzNzk1YTg0NzlkMGMxYTc5ZDE5YjE5MGQ5MjJlMTYzMDFlN2EwYmI4YjgxNmQzYzQ5YmQyNWZlMGI4NGU4NzlkYTc4MGMzZmMwNjQxYWQ2OWNjNTdkZDFlNzk1ZWNlN2U4YmIyODEyZjc0MzA1OGFmZjAyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGF0dGVybnMtdjAuMi4zIjogewogICAgICAibmFtZSI6ICJAZW5kby9wYXR0ZXJucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzE3NzdhNzMwNzFkZTM0MmZlZmU4ODRmNDU4MjYwN2ZlOTlhNmQzZTgzYWIyYzE5Yzk5N2ViMTkyZmMwNDI3YThkYTMxNDRkODc5OGM2YjMyYTkxODI1ZGM4OTlmMmEwNjcyMzYzNzM3YmRmNTQ2MDZmZDU3NWE4MjczMTlhM2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jaGVja0tleS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFiM2YyNDJkMmU5NjYyMzI0OGZiMDA4OWRjZThjM2JjMDQwODJiOWNmMWRkMThlYmJlZWRmNTRkODQwNTk4NzkzMzMxYjk1ZDYwNTUxNDgxYWVjZGI4ZjQ5YmI5NGZhMTZjMmQ5MjBiZTE3MmVkNThhOGNkNTExZjJhOGJjNDIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29tcGFyZUtleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTI5MTg3NDM3NWFjYWRlMmM5NzEzMmNiMzViNWM5ZjVkNWM1OGFjN2I1OWI5ZDhiMzkxOGRjOTY4MGMxZTJkYzEzOTYzMzQ5NjMzYTZiNjllNmJmYzk5NWQ3MGJhMzIyMDQxODI2OTEzYTgzMWUxYzkzY2YxYTA0ODBlMmViNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weUJhZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZkZTRmODJmMmM0ZDQ5ZGIzYTk4MTRiZGJjZjFlYzY0ZDcxZDhmYWQ1MjFlMTEwZTY4MTJkM2IzNzNlZDkyOGI4NjFkNzVmMDdhNjdlM2NmNGMzZmVkNmFkZTQ1NTdiYmY0YWQ5NDU3MzVhMjM4ZGVkZGQwNTNjMDkzMmU2YTA2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29weVNldC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb3B5U2V0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGVhYjdlYzI4NGNhZGUxYjA0ZGY0ZjNiZTY4NmMxNzJiMDQzOTFmMGVlZDg1NDhlNDlmOTMxYjNjMmM0YzUxODNlODQxMWVlNjVhMGI5YjZkZmI1ZmRmMWFkYjhlNGEzNjEyNTBhZTAxOTFlMmVjNjBjNTgxNDE4ZThjYTUwNDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YTU5YjE1NmYyYTc3NTc3OTFlYjI4YjVjOGMwYzU3MmEzZTg0NjM3ZGQ3YWUxNzBmMWMwYjQyM2MyYjM0MWE2NGRlN2Y1NWUzYzE2MDVlYmVkMDczNDEzNjBhMjUyYjQyOTY2ZjliNGRmYTljZmI2Y2MxMWVhODQ5MTc3ZDg2ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBmZDRjYTFjMjQwZmFlY2NlM2I1OTA5NjVmZWMzM2I2M2Q3ZmZkNjAxYTBlYzkyOTMwZDdiMTY0YWVmNmI5YmEyOWFhYzI4YjEzMzdmMjRmOGE1NjgyYTMyZWEwMmYyNTM4NDQwZjhlNjU0OTk1OTI3NTY5YjVhNjQ2Nzc5MGY3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzE1ODBiYmY0NzBlNDQyOGZlZmM2OTI2NDQ3OTQ1ZjNlNDE0ODQxMTlmMDhkNWQ2NWNjOTU5NTE1YjZmMTk0OTBhYWUwOWExMzZhZjRhZmMzOTY4MTgxMjg1NDBiZGM5MGNjZmVhNDAzZmZlMmY4ZDdhMGNmODcyZDM3Y2RjZWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3V0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTE0YjNhNDA0MzgyMmY4ZmJmZDIyYWI2MDE5Y2MxYTdlNjBhZGNmN2E1N2Q3MGQyN2U4ZWYxYzExMjI2Mjc1ZjdlMzEzNzZkODQzNmExNDc5OThjYTlhMDQ2MDc2OTIxZDM2NzJlYzkxZGY2ZDZmMzIxMTA1YmNkYWIzZDY3MzAiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTciLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9sb2NrZG93biI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgInNlcy90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyZGI3M2QwYWIwYzI2YTNhODk1YzU3OTUyODdiMDk2MTZlMDMyY2I1MzAwMTliNzIwMTZhMmI4ZmUyZGMzYWIwZWQwZWViNGU5ZGRjYWZhM2ZmOWJiNjc3NDJkMGVlMDdjYTk1NWViNjhlYzgyZjBkNWM3NmRkOTQxYjU3MGRjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxODE0ZGQxNDNkZmY3M2RlM2VlNGMxZjA3NzA3ZTU3N2NhYWNhYTNhYmY0YjA1OTBjZGVkZTEwYjkxOTlhOTJkNzk3ZjBjMTFiYjczODI5NWM0OWYxZTdlZjkwZjNkMTE2ZTI4ZTc0YzA4NjczNGViY2E4YmNkYTFkYzkzOWQ0NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVlYTU1ZmEyY2MxYjczNmUwMmJiODMyMjQ2ZGNjNmZjZDRhMGExZWJjMjQxZTM4MWVmNmY2NGJkOGVjNDZhMTVkM2Y3OTdlYzIyYTM1YzljNWM5NTE0MjRlMzlmZDZhNjg3Y2RiNDE1NWM4ZGI3MWY2ZWZlN2QzZmU5N2U5NDVhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc1ZTgzMzZjYmM0MWNkMmY2MzExNzdjMDYxMDljZjNmOGI1MTgxNGNiMzNlMjIwODJjOGU5ZWVlMDcyZWM0ODkxOWQwOGQ0M2QyOWQ1NjU1MTgyNmM4OTUxMzU4MzU0ZDY4ZTVhYTA5NmM2YWE1NjYxMzQ5ZTBmYTEwODE2Zjc5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9zdHJlYW0tdjAuMy4yNiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vc3RyZWFtIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3N0cmVhbS12MC4zLjI2IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3N0cmVhbS12MC4zLjI2IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdHJlYW0iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RyZWFtLXYwLjMuMjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0cmVhbS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RyZWFtLXYwLjMuMjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9sb2NrZG93biI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgInNlcy90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAwOTQxMzJjYjlhY2U3ZjJhYThmYjI0YTg1YTg2MGQ0OGRkN2MzZTU0NDAwMWZlY2ZlZDBhOTdkYzFhMzdjMmZlM2QzZDFjMGU0NDA5OTBhODYwZTVmNDNlN2U2YjU3ZTNhMGUxNDYwMjRiMDVkOTg4MzA2YzZmOTA2OGI1YTJmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJqZXNzaWUuanMtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJqZXNzaWUuanMiLAogICAgICAibGFiZWwiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFpbi5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDFkY2JlMzRmNGMyMjRkNmQ2ZmZkZGVjYjNkZTViZGYyZmYzMTM4NjY3ZjU2ZjQ5OTU1NjlmMGMyZDlmY2UzYjRkZWM0MzNmMGQ0NTZhMThiOTVkN2YzZjIzN2MxMTk2YzQ4N2JjNDRlNDQ2ZjI5NWNmNjNkMmQ1ODNkNzg4ODkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMyMTI0YmNjYzg0NjAxOTAwNjFmNGNkYmQ4ZGY0OWJkNzIzZDFjNjU1YWI5OWQwMjY3NmY4YTExMWEwZjc0ZTQ3NjJjYWM0M2VjZGVlYjg1ZDI5M2YzN2M4MmViYzI1ZmM0ZTA1MmM5OTIzNzhiYzdlYmUxMGU2ODFjZDgzMDM3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlhOTVkMWRiY2M4ZjRiZTgxNDIwNGY2ODMyYzFlYWMzMDYyMWZjY2IwMzI4YzBlYzQxZWE1YTAzOTE0OTk4YzhlZmY5MDE5ZWZmNjVhZDY2Mjg5YzAxNTkxODFkOWI0OWRiMmNkOTZmM2ZiNTllMjFhZGI4NGQ5YTRjMGU4OTdmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxODM1ZWU5YzYwYWIzNjMxZmFiNWFhMGM5ZGNjYWVlNWVjOTlkNDdlMDkyNjcwMjAyYTNmY2Q2NmZlNjIyOTQ1MDdkZTNkNDlmODg5MjZlMzgxMGQ2MjZiYjkwYzc1YzRhMTZlYmE1NGQxZDE2NjFjYzU4MDljODFjNTRmZTczNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWtlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL21ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgzNTdiYmY2YjExYmJjYmNhM2I5NTljNWVlMWFlYTRmYWVjMzRmZTM0NmI4MzgxOTQwMmU5M2RmYmJkZTdmZjhmZGNlMzllMWY2MDhkYmI3NjU0MGE4MWNhNDk4ZWZkNDY5MjlmNDFlNzg5ZTI5YmI2ZGFmNjdhZDNjMTc1YTVmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9hc3luYy10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcwYmYxMjFhN2E1Njk1MTRjMmUwYzFhYTUxZDE2ZTNlMGQxM2FjNWVhZjkwMTUzYTFjMjU3YzY5YWNiYWNhYjBmNGEyZGM2MTUwM2IzMzcyZWIwYTk4MDZhNjE1MjY1MWY3MDE5YTM3YmU5MmRlODRkOGEyMjU1ZTdmMzMxMDcxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcxL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcxL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZTE0NDkwY2U1M2FmNDJiZTUyNDZjNzE2OTI4ODM0NjZmNzE0ZTg5ODI0YzczM2JjNDMzZWEyOTViMjIyOWNkNGY3YzNiOGJhMDJjNjk5N2M3MmZmMDI3OTRhMTI2N2U5ZTVlNGYxM2EyNWRjNDZiZGU0ZGZlNTIzY2RlNTU0OCIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn1QSwMECgAAAAAAAAAAADmKVgI7CwAAOwsAACMAAABAYWdvcmljL2Fzc2VydC12MC42LjAvc3JjL2Fzc2VydC5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRmFpbCIsIk5vbk51bGxpc2giLCJhbiIsImFzc2VydCIsImRldGFpbHMiLCJpZGVudENoZWNrZXIiLCJtYWtlQXNzZXJ0IiwicSIsInF1b3RlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYW4sICduYW1lJywge3ZhbHVlOiBcImFuXCJ9KTskaOKAjV9vbmNlLmFuKGFuKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuY29uc3R7ZnJlZXplfT1PYmplY3Q7XG5cbi8qKiBAdHlwZSB7QXNzZXJ0fSAqL1xuY29uc3QgZ2xvYmFsQXNzZXJ0PWdsb2JhbFRoaXMuYXNzZXJ0OyRo4oCNX29uY2UuZ2xvYmFsQXNzZXJ0KGdsb2JhbEFzc2VydCk7XG5cbmlmKGdsb2JhbEFzc2VydD09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BhZ29yaWMvYXNzZXJ0J2ApO1xuXG4gfVxuXG5jb25zdCBtaXNzaW5nPS8qKiBAdHlwZSB7Y29uc3R9ICovW1xuJ2ZhaWwnLFxuJ2VxdWFsJyxcbid0eXBlb2YnLFxuJ3N0cmluZycsXG4nbm90ZScsXG4nZGV0YWlscycsXG4nRmFpbCcsXG4ncXVvdGUnLFxuJ21ha2VBc3NlcnQnXS5cbmZpbHRlcigobmFtZSk9Pmdsb2JhbEFzc2VydFtuYW1lXT09PXVuZGVmaW5lZCk7XG5pZihtaXNzaW5nLmxlbmd0aD4wKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgaW5pdGlhbGl6ZSBAYWdvcmljL2Fzc2VydCwgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCBtZXRob2RzICR7bWlzc2luZy5qb2luKFxuJywgJylcbiB9YCk7XG5cbiB9XG5cbmNvbnN0e2RldGFpbHMsRmFpbCxxdW90ZSxtYWtlQXNzZXJ0fT1nbG9iYWxBc3NlcnQ7JGjigI1fb25jZS5kZXRhaWxzKGRldGFpbHMpOyRo4oCNX29uY2UuRmFpbChGYWlsKTskaOKAjV9vbmNlLnF1b3RlKHF1b3RlKTskaOKAjV9vbmNlLm1ha2VBc3NlcnQobWFrZUFzc2VydCk7XG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1QgfCBudWxsIHwgdW5kZWZpbmVkfSB2YWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCAgICAgICAgTm9uTnVsbGlzaD0odmFsLG9wdERldGFpbHM9IGB1bmV4cGVjdGVkICR7cXVvdGUodmFsKX1gKT0+e1xuaWYodmFsIT1udWxsKXtcbi8qIFRoaXMgYCE9IG51bGxgIGlkaW9tIGNoZWNrcyB0aGF0IGB2YWxgIGlzIG5laXRoZXIgYG51bGxgIG5vciBgdW5kZWZpbmVkYC4qL1xucmV0dXJuIHZhbDtcbiB9XG5hc3NlcnQuZmFpbChvcHREZXRhaWxzKTtcbiB9OyRo4oCNX29uY2UuTm9uTnVsbGlzaChOb25OdWxsaXNoKTtcbmhhcmRlbihOb25OdWxsaXNoKTtcblxuLyoqXG4gKiBQcmVwZW5kIHRoZSBjb3JyZWN0IGluZGVmaW5pdGUgYXJ0aWNsZSBvbnRvIGEgbm91biwgdHlwaWNhbGx5IGEgdHlwZW9mIHJlc3VsdFxuICogZS5nLiwgXCJhbiBPYmplY3RcIiB2cy4gXCJhIE51bWJlclwiXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIG5vdW4gdG8gcHJlcGVuZFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIG5vdW4gcHJlcGVuZGVkIHdpdGggYS9hblxuICovXG5mdW5jdGlvbiBhbihzdHIpe1xuc3RyPSBgJHtzdHJ9YDtcbmlmKHN0ci5sZW5ndGg+PTEmJidhZWlvdUFFSU9VJy5pbmNsdWRlcyhzdHJbMF0pKXtcbnJldHVybiBgYW4gJHtzdHJ9YDtcbiB9XG5yZXR1cm4gYGEgJHtzdHJ9YDtcbiB9XG5mcmVlemUoYW4pO1xuXG5cbi8qKlxuICogSW4gdGhlIGBhc3NlcnRGb29gL2Bpc0Zvb2AvYGNoZWNrRm9vYCBwYXR0ZXJuLCBgY2hlY2tGb29gIGhhcyBhIGBjaGVja2BcbiAqIHBhcmFtZXRlciBvZiB0eXBlIGBDaGVja2VyYC4gYGFzc2VydEZvb2AgY2FsbHMgYGNoZWNrRm9vYCBwYXNzZXNcbiAqIGBhc3NlcnRDaGVja2VyYCBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlzRm9vYCBwYXNzZXMgYGlkZW50Q2hlY2tlcmBcbiAqIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaWRlbnRDaGVja2VyYCBhY3RzIHByZWNpc2VseSBsaWtlIGFuXG4gKiBpZGVudGl0eSBmdW5jdGlvbiwgYnV0IGlzIHR5cGVkIGFzIGEgYENoZWNrZXJgIHRvIGluZGljYXRlIGl0c1xuICogaW50ZW5kZWQgdXNlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgaWRlbnRDaGVja2VyPShjb25kLF9kZXRhaWxzKT0+Y29uZDskaOKAjV9vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0IjpbImdsb2JhbEFzc2VydCJdLCJkZXRhaWxzIjpbImRldGFpbHMiXSwiRmFpbCI6WyJGYWlsIl0sInF1b3RlIjpbInF1b3RlIl0sInEiOlsicXVvdGUiXSwibWFrZUFzc2VydCI6WyJtYWtlQXNzZXJ0Il0sImFuIjpbImFuIl0sIk5vbk51bGxpc2giOlsiTm9uTnVsbGlzaCJdLCJpZGVudENoZWNrZXIiOlsiaWRlbnRDaGVja2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAW5h+zaLgAA2i4AACIAAABAYWdvcmljL2Fzc2VydC12MC42LjAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qIEJhc2VkIG9uKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL0hFQUQvcGFja2FnZXMvc2VzL3NyYy9lcnJvci90eXBlcy5qcyovXG4vKiBDb29yZGluYXRlIGVkaXRzIHVudGlsIHdlIHJlZmFjdG9yIHRvIGF2b2lkIHRoaXMgZHVwbGljYXRpb24qL1xuLyogQXQgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzc0Ki9cbi8qIGlzIGEgcmVjb3JkIG9mIGEgZmFpbGVkIGF0dGVtcHQgdG8gcmVtb3ZlIHRoaXMgZHVwbGljYXRpb24uKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQmFzZUFzc2VydFxuICogVGhlIGBhc3NlcnRgIGZ1bmN0aW9uIGl0c2VsZi5cbiAqXG4gKiBAcGFyYW0geyp9IGZsYWcgVGhlIHRydXRoeS9mYWxzeSB2YWx1ZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc10gVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge2Fzc2VydHMgZmxhZ31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFzc2VydE1ha2VFcnJvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXJyb3JOYW1lXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydE1ha2VFcnJvclxuICpcbiAqIFRoZSBgYXNzZXJ0LmVycm9yYCBtZXRob2QsIHJlY29yZGluZyBkZXRhaWxzIGZvciB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZy5cbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEBwYXJhbSB7QXNzZXJ0TWFrZUVycm9yT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0RmFpbFxuICpcbiAqIFRoZSBgYXNzZXJ0LmZhaWxgIG1ldGhvZC5cbiAqXG4gKiBGYWlsIGFuIGFzc2VydGlvbiwgcmVjb3JkaW5nIGZ1bGwgZGV0YWlscyB0byB0aGUgY29uc29sZSBhbmRcbiAqIHJhaXNpbmcgYW4gZXhjZXB0aW9uIHdpdGggYSBtZXNzYWdlIGluIHdoaWNoIGBkZXRhaWxzYCBzdWJzdGl0dXRpb24gdmFsdWVzXG4gKiBoYXZlIGJlZW4gbWFza2VkLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc10gVGhlIGRldGFpbHMgb2Ygd2hhdCB3YXMgYXNzZXJ0ZWRcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge25ldmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEVxdWFsXG4gKiBUaGUgYGFzc2VydC5lcXVhbGAgbWV0aG9kXG4gKlxuICogQXNzZXJ0IHRoYXQgdHdvIHZhbHVlcyBtdXN0IGJlIGBPYmplY3QuaXNgLlxuICogQHBhcmFtIHsqfSBhY3R1YWwgVGhlIHZhbHVlIHdlIHJlY2VpdmVkXG4gKiBAcGFyYW0geyp9IGV4cGVjdGVkIFdoYXQgd2Ugd2FudGVkXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBbRXJyb3JDb25zdHJ1Y3Rvcl0gQW4gb3B0aW9uYWwgYWx0ZXJuYXRlIGVycm9yXG4gKiBjb25zdHJ1Y3RvciB0byB1c2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKiBUeXBlIGFsbCB0aGUgb3ZlcmxvYWRzIG9mIHRoZSBhc3NlcnRUeXBlb2YgZnVuY3Rpb24uKi9cbi8qIFRoZXJlIG1heSBldmVudHVhbGx5IGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLCBidXQqL1xuLyogdGhlbXMgdGhlIGJyZWFrcyB3aXRoIFR5cGVzY3JpcHQgNC4wLiovXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZCaWdpbnRcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYmlnaW50J30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBiaWdpbnR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mQm9vbGVhblxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydib29sZWFuJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBib29sZWFufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkZ1bmN0aW9uXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2Z1bmN0aW9uJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBGdW5jdGlvbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZOdW1iZXJcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnbnVtYmVyJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBudW1iZXJ9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mT2JqZWN0XG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J29iamVjdCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgUmVjb3JkPGFueSwgYW55PiB8IG51bGx9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3RyaW5nXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N0cmluZyd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgc3RyaW5nfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZlN5bWJvbFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydzeW1ib2wnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN5bWJvbH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZVbmRlZmluZWRcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsndW5kZWZpbmVkJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyB1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBUaGUgYGFzc2VydC50eXBlb2ZgIG1ldGhvZFxuICpcbiAqIEB0eXBlZGVmIHtBc3NlcnRUeXBlb2ZCaWdpbnQgJiBBc3NlcnRUeXBlb2ZCb29sZWFuICYgQXNzZXJ0VHlwZW9mRnVuY3Rpb24gJiBBc3NlcnRUeXBlb2ZOdW1iZXIgJiBBc3NlcnRUeXBlb2ZPYmplY3QgJiBBc3NlcnRUeXBlb2ZTdHJpbmcgJiBBc3NlcnRUeXBlb2ZTeW1ib2wgJiBBc3NlcnRUeXBlb2ZVbmRlZmluZWR9IEFzc2VydFR5cGVvZlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFN0cmluZ1xuICogVGhlIGBhc3NlcnQuc3RyaW5nYCBtZXRob2QuXG4gKlxuICogYGFzc2VydC5zdHJpbmcodilgIGlzIGVxdWl2YWxlbnQgdG8gYGFzc2VydC50eXBlb2YodiwgJ3N0cmluZycpYC4gV2VcbiAqIHNwZWNpYWwgY2FzZSB0aGlzIG9uZSBiZWNhdXNlIGl0IGlzIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZC5cbiAqXG4gKiBBc3NlcnQgYW4gZXhwZWN0ZWQgdHlwZW9mIHJlc3VsdC5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lbiBUaGUgdmFsdWUgdG8gZ2V0IHRoZSB0eXBlb2ZcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Tm90ZVxuICogVGhlIGBhc3NlcnQubm90ZWAgbWV0aG9kLlxuICpcbiAqIEFubm90YXRlIGFuIGVycm9yIHdpdGggZGV0YWlscywgcG90ZW50aWFsbHkgdG8gYmUgdXNlZCBieSBhblxuICogYXVnbWVudGVkIGNvbnNvbGUgc3VjaCBhcyB0aGUgY2F1c2FsIGNvbnNvbGUgb2YgYGNvbnNvbGUuanNgLCB0b1xuICogcHJvdmlkZSBleHRyYSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggbG9nZ2VkIGVycm9ycy5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICogQHBhcmFtIHtEZXRhaWxzfSBkZXRhaWxzTm90ZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7fX0gRGV0YWlsc1Rva2VuXG4gKiBBIGNhbGwgdG8gdGhlIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIG1ha2VzIGFuZCByZXR1cm5zIGEgZnJlc2ggZGV0YWlsc1xuICogdG9rZW4sIHdoaWNoIGlzIGEgZnJvemVuIGVtcHR5IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGFyZ3VtZW50cyBvZiB0aGF0XG4gKiBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCBleHByZXNzaW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZyB8IERldGFpbHNUb2tlbn0gRGV0YWlsc1xuICogRWl0aGVyIGEgcGxhaW4gc3RyaW5nLCBvciBtYWRlIGJ5IHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCB0YWcuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdHJpbmdhYmxlUGF5bG9hZFxuICogSG9sZHMgdGhlIHBheWxvYWQgcGFzc2VkIHRvIHF1b3RlIHNvIHRoYXQgaXRzIHByaW50ZWQgZm9ybSBpcyB2aXNpYmxlLlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IHRvU3RyaW5nIEhvdyB0byBwcmludCB0aGUgcGF5bG9hZFxuICovXG5cbi8qKlxuICogVG8gXCJkZWNsYXNzaWZ5XCIgYW5kIHF1b3RlIGEgc3Vic3RpdHV0aW9uIHZhbHVlIHVzZWQgaW4gYVxuICogYGBgIGRldGFpbHNgLi4uYCBgYGAgdGVtcGxhdGUgbGl0ZXJhbCwgZW5jbG9zZSB0aGF0IHN1YnN0aXR1dGlvbiBleHByZXNzaW9uXG4gKiBpbiBhIGNhbGwgdG8gYHF1b3RlYC4gVGhpcyBtYWtlcyB0aGUgdmFsdWUgYXBwZWFyIHF1b3RlZFxuICogKGFzIGlmIHdpdGggYEpTT04uc3RyaW5naWZ5YCkgaW4gdGhlIG1lc3NhZ2Ugb2YgdGhlIHRocm93biBlcnJvci4gVGhlXG4gKiBwYXlsb2FkIGl0c2VsZiBpcyBzdGlsbCBwYXNzZWQgdW5xdW90ZWQgdG8gdGhlIGNvbnNvbGUgYXMgaXQgd291bGQgYmVcbiAqIHdpdGhvdXQgYHF1b3RlYC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB3aWxsIHJldmVhbCB0aGUgZXhwZWN0ZWQgc2t5IGNvbG9yLCBidXQgbm90IHRoZVxuICogYWN0dWFsIGluY29ycmVjdCBza3kgY29sb3IsIGluIHRoZSB0aHJvd24gZXJyb3IncyBtZXNzYWdlOlxuICogYGBganNcbiAqIHNreS5jb2xvciA9PT0gZXhwZWN0ZWRDb2xvciB8fCBGYWlsYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxdW90ZShleHBlY3RlZENvbG9yKX1gO1xuICogYGBgXG4gKlxuICogVGhlIG5vcm1hbCBjb252ZW50aW9uIGlzIHRvIGxvY2FsbHkgcmVuYW1lIGBkZXRhaWxzYCB0byBgWGAgYW5kIGBxdW90ZWAgdG8gYHFgXG4gKiBsaWtlIGBjb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxIH0gPSBhc3NlcnQ7YCwgc28gdGhlIGFib3ZlIGV4YW1wbGUgd291bGQgdGhlbiBiZVxuICogYGBganNcbiAqIHNreS5jb2xvciA9PT0gZXhwZWN0ZWRDb2xvciB8fCBGYWlsYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxKGV4cGVjdGVkQ29sb3IpfWA7XG4gKiBgYGBcbiAqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UXVvdGVcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZCBXaGF0IHRvIGRlY2xhc3NpZnlcbiAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSBbc3BhY2VzXVxuICogQHJldHVybnMge1N0cmluZ2FibGVQYXlsb2FkfSBUaGUgZGVjbGFzc2lmaWVkIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSYWlzZVxuICpcbiAqIFRvIG1ha2UgYW4gYGFzc2VydGAgd2hpY2ggdGVybWluYXRlcyBzb21lIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uXG4gKiBsaWtlIGEgdHJhbnNhY3Rpb24sIHZhdCwgb3IgcHJvY2VzcywgY2FsbCBgbWFrZUFzc2VydGAgd2l0aCBhIGBSYWlzZWBcbiAqIGNhbGxiYWNrLCB3aGVyZSB0aGF0IGNhbGxiYWNrIGFjdHVhbGx5IHBlcmZvcm1zIHRoYXQgbGFyZ2VyIHRlcm1pbmF0aW9uLlxuICogSWYgcG9zc2libGUsIHRoZSBjYWxsYmFjayBzaG91bGQgYWxzbyByZXBvcnQgaXRzIGByZWFzb25gIHBhcmFtZXRlciBhc1xuICogdGhlIGFsbGVnZWQgcmVhc29uIGZvciB0aGUgdGVybWluYXRpb24uXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gcmVhc29uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUFzc2VydFxuICpcbiAqIE1ha2VzIGFuZCByZXR1cm5zIGFuIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdCB0aGF0IHNoYXJlcyB0aGUgYm9va2tlZXBpbmdcbiAqIHN0YXRlIGRlZmluZWQgYnkgdGhpcyBtb2R1bGUgd2l0aCBvdGhlciBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3RzIG1hZGUgYnlcbiAqIGBtYWtlQXNzZXJ0YC4gVGhpcyBzdGF0ZSBpcyBwZXItbW9kdWxlLWluc3RhbmNlIGFuZCBpcyBleHBvc2VkIGJ5IHRoZVxuICogYGxvZ2dlZEVycm9ySGFuZGxlcmAgYWJvdmUuIFdlIHJlZmVyIHRvIGBhc3NlcnRgIGFzIGEgXCJmdW5jdGlvbiBvYmplY3RcIlxuICogYmVjYXVzZSBpdCBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGFzIGEgZnVuY3Rpb24sIGJ1dCBhbHNvIGhhcyBtZXRob2RzIHRoYXRcbiAqIGNhbiBiZSBjYWxsZWQuXG4gKlxuICogSWYgYG9wdFJhaXNlYCBpcyBwcm92aWRlZCwgdGhlIHJldHVybmVkIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdCB3aWxsIGNhbGxcbiAqIGBvcHRSYWlzZShyZWFzb24pYCBiZWZvcmUgdGhyb3dpbmcgdGhlIGVycm9yLiBUaGlzIGVuYWJsZXMgYG9wdFJhaXNlYCB0b1xuICogZW5nYWdlIGluIGV2ZW4gbW9yZSB2aW9sZW50IHRlcm1pbmF0aW9uIGJlaGF2aW9yLCBsaWtlIHRlcm1pbmF0aW5nIHRoZSB2YXQsXG4gKiB0aGF0IHByZXZlbnRzIGV4ZWN1dGlvbiBmcm9tIHJlYWNoaW5nIHRoZSBmb2xsb3dpbmcgdGhyb3cuIEhvd2V2ZXIsIGlmXG4gKiBgb3B0UmFpc2VgIHJldHVybnMgbm9ybWFsbHksIHdoaWNoIHdvdWxkIGJlIHVudXN1YWwsIHRoZSB0aHJvdyBmb2xsb3dpbmdcbiAqIGBvcHRSYWlzZShyZWFzb24pYCB3b3VsZCBzdGlsbCBoYXBwZW4uXG4gKlxuICogQHBhcmFtIHtSYWlzZX0gW29wdFJhaXNlXVxuICogQHBhcmFtIHtib29sZWFufSBbdW5yZWRhY3RlZF1cbiAqIEByZXR1cm5zIHtBc3NlcnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IERldGFpbHNUb2tlbn0gRGV0YWlsc1RhZ1xuICpcbiAqIFVzZSB0aGUgYGRldGFpbHNgIGZ1bmN0aW9uIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdG8gY3JlYXRlXG4gKiBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlcy4gVGhlIGFzc2VydGlvbiBmdW5jdGlvbnMgdGFrZSBzdWNoIG1lc3NhZ2VzXG4gKiBhcyBvcHRpb25hbCBhcmd1bWVudHM6XG4gKiBgYGBqc1xuICogYXNzZXJ0KHNreS5pc0JsdWUoKSwgZGV0YWlsc2Ake3NreS5jb2xvcn0gc2hvdWxkIGJlIFwiYmx1ZVwiYCk7XG4gKiBgYGBcbiAqIG9yIGZvbGxvd2luZyB0aGUgbm9ybWFsIGNvbnZlbnRpb24gdG8gbG9jYWxseSByZW5hbWUgYGRldGFpbHNgIHRvIGBYYFxuICogYW5kIGBxdW90ZWAgdG8gYHFgIGxpa2UgYGNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEgfSA9IGFzc2VydDtgOlxuICogYGBganNcbiAqIGFzc2VydChza3kuaXNCbHVlKCksIFhgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImApO1xuICogYGBgXG4gKiBIb3dldmVyLCBub3RlIHRoYXQgaW4gbW9zdCBjYXNlcyBpdCBpcyBwcmVmZXJhYmxlIHRvIGluc3RlYWQgdXNlIHRoZSBgRmFpbGBcbiAqIHRlbXBsYXRlIGxpdGVyYWwgdGFnICh3aGljaCBoYXMgdGhlIHNhbWUgaW5wdXQgc2lnbmF0dXJlIGFzIGBkZXRhaWxzYFxuICogYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhbmQgdGhyb3dzIGFuIGVycm9yKTpcbiAqIGBgYGpzXG4gKiBza3kuaXNCbHVlKCkgfHwgRmFpbGAke3NreS5jb2xvcn0gc2hvdWxkIGJlIFwiYmx1ZVwiYDtcbiAqIGBgYFxuICpcbiAqIFRoZSBkZXRhaWxzIHRlbXBsYXRlIHRhZyByZXR1cm5zIGEgYERldGFpbHNUb2tlbmAgb2JqZWN0IHRoYXQgY2FuIHByaW50XG4gKiBpdHNlbGYgd2l0aCB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgaW4gdHdvIHdheXMuXG4gKiBJdCB3aWxsIHJlcG9ydCBmdWxsIGRldGFpbHMgdG8gdGhlIGNvbnNvbGUsIGJ1dFxuICogbWFzayBlbWJlZGRlZCBzdWJzdGl0dXRpb24gdmFsdWVzIHdpdGggdGhlaXIgdHlwZW9mIGluZm9ybWF0aW9uIGluIHRoZSB0aHJvd24gZXJyb3JcbiAqIHRvIHByZXZlbnQgcmV2ZWFsaW5nIHNlY3JldHMgdXAgdGhlIGV4Y2VwdGlvbmFsIHBhdGguIEluIHRoZSBleGFtcGxlXG4gKiBhYm92ZSwgdGhlIHRocm93biBlcnJvciBtYXkgcmV2ZWFsIG9ubHkgdGhhdCBgc2t5LmNvbG9yYCBpcyBhIHN0cmluZyxcbiAqIHdoZXJlYXMgdGhlIHNhbWUgZGlhZ25vc3RpYyBwcmludGVkIHRvIHRoZSBjb25zb2xlIHJldmVhbHMgdGhhdCB0aGVcbiAqIHNreSB3YXMgZ3JlZW4uIFRoaXMgbWFza2luZyBjYW4gYmUgZGlzYWJsZWQgZm9yIGFuIGluZGl2aWR1YWwgc3Vic3RpdHV0aW9uIHZhbHVlXG4gKiB1c2luZyBgcXVvdGVgLlxuICpcbiAqIFRoZSBgcmF3YCBwcm9wZXJ0eSBvZiBhbiBpbnB1dCB0ZW1wbGF0ZSBhcnJheSBpcyBpZ25vcmVkLCBzbyBhIHNpbXBsZVxuICogYXJyYXkgb2Ygc3RyaW5ncyBtYXkgYmUgcHJvdmlkZWQgZGlyZWN0bHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IG5ldmVyfSBGYWlsVGFnXG4gKlxuICogVXNlIHRoZSBgRmFpbGAgZnVuY3Rpb24gYXMgYSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0byBlZmZpY2llbnRseVxuICogY3JlYXRlIGFuZCB0aHJvdyBhIGBkZXRhaWxzYC1zdHlsZSBlcnJvciBvbmx5IHdoZW4gYSBjb25kaXRpb24gaXMgbm90IHNhdGlzZmllZC5cbiAqIGBgYGpzXG4gKiBjb25kaXRpb24gfHwgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogYGBgXG4gKiBUaGlzIGF2b2lkcyB0aGUgb3ZlcmhlYWQgb2YgY3JlYXRpbmcgdXN1YWxseS11bm5lY2Vzc2FyeSBlcnJvcnMgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChjb25kaXRpb24sIGRldGFpbHNgLi4uY29tcGxhaW50Li4uYCk7XG4gKiBgYGBcbiAqIHdoaWxlIGltcHJvdmluZyByZWFkYWJpbGl0eSBvdmVyIGFsdGVybmF0aXZlcyBsaWtlXG4gKiBgYGBqc1xuICogY29uZGl0aW9uIHx8IGFzc2VydC5mYWlsKGRldGFpbHNgLi4uY29tcGxhaW50Li4uYCk7XG4gKiBgYGBcbiAqXG4gKiBIb3dldmVyLCBkdWUgdG8gY3VycmVudCB3ZWFrbmVzcyBpbiBUeXBlU2NyaXB0LCBzdGF0aWMgcmVhc29uaW5nXG4gKiBpcyBsZXNzIHBvd2VyZnVsIHdpdGggdGhlIGB8fGAgcGF0dGVybnMgdGhhbiB3aXRoIGFuIGBhc3NlcnRgIGNhbGwuXG4gKiBVbnRpbC91bmxlc3MgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MTQyNiBpcyBmaXhlZCxcbiAqIGZvciBgfHxgLXN0eWxlIGFzc2VydGlvbnMgd2hlcmUgdGhpcyBsb3NzIG9mIHN0YXRpYyByZWFzb25pbmcgaXMgYSBwcm9ibGVtLFxuICogaW5zdGVhZCBleHByZXNzIHRoZSBhc3NlcnRpb24gYXNcbiAqIGBgYGpzXG4gKiAgIGlmICghY29uZGl0aW9uKSB7XG4gKiAgICAgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogICB9XG4gKiBgYGBcbiAqIG9yLCBpZiBuZWVkZWQsXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmRpdGlvbikge1xuICogICAgIC8vIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLCBidXQgaXQgaW1wcm92ZXMgc3RhdGljIGFuYWx5c2lzXG4gKiAgICAgdGhyb3cgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogICB9XG4gKiBgYGBcbiAqL1xuXG4vKipcbiAqIGFzc2VydCB0aGF0IGV4cHIgaXMgdHJ1dGh5LCB3aXRoIGFuIG9wdGlvbmFsIGRldGFpbHMgdG8gZGVzY3JpYmVcbiAqIHRoZSBhc3NlcnRpb24uIEl0IGlzIGEgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChleHByLCBkZXRhaWxzYC4uLi5gKTtgXG4gKiBgYGBcbiAqXG4gKiBUaGUgbGl0ZXJhbCBwb3J0aW9ucyBvZiB0aGUgdGVtcGxhdGUgYXJlIGFzc3VtZWQgbm9uLXNlbnNpdGl2ZSwgYXNcbiAqIGFyZSB0aGUgYHR5cGVvZmAgdHlwZXMgb2YgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMuIFRoZXNlIGFyZVxuICogYXNzZW1ibGVkIGludG8gdGhlIHRocm93biBlcnJvciBtZXNzYWdlLiBUaGUgYWN0dWFsIGNvbnRlbnRzIG9mIHRoZVxuICogc3Vic3RpdHV0aW9uIHZhbHVlcyBhcmUgYXNzdW1lZCBzZW5zaXRpdmUsIHRvIGJlIHJldmVhbGVkIHRvXG4gKiB0aGUgY29uc29sZSBvbmx5LiBXZSBhc3N1bWUgb25seSB0aGUgdmlydHVhbCBwbGF0Zm9ybSdzIG93bmVyIGNhbiByZWFkXG4gKiB3aGF0IGlzIHdyaXR0ZW4gdG8gdGhlIGNvbnNvbGUsIHdoZXJlIHRoZSBvd25lciBpcyBpbiBhIHByaXZpbGVnZWRcbiAqIHBvc2l0aW9uIG92ZXIgY29tcHV0YXRpb24gcnVubmluZyBvbiB0aGF0IHBsYXRmb3JtLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlZGVmIHsgQmFzZUFzc2VydCAmIHtcbiAqICAgdHlwZW9mOiBBc3NlcnRUeXBlb2YsXG4gKiAgIGVycm9yOiBBc3NlcnRNYWtlRXJyb3IsXG4gKiAgIGZhaWw6IEFzc2VydEZhaWwsXG4gKiAgIGVxdWFsOiBBc3NlcnRFcXVhbCxcbiAqICAgc3RyaW5nOiBBc3NlcnRTdHJpbmcsXG4gKiAgIG5vdGU6IEFzc2VydE5vdGUsXG4gKiAgIGRldGFpbHM6IERldGFpbHNUYWcsXG4gKiAgIEZhaWw6IEZhaWxUYWcsXG4gKiAgIHF1b3RlOiBBc3NlcnRRdW90ZSxcbiAqICAgbWFrZUFzc2VydDogTWFrZUFzc2VydCxcbiAqIH0gfSBBc3NlcnRcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAJW/y1aQEAAGkBAAAgAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL2hlYXAuanN7ImltcG9ydHMiOlsiLi9zcmMvaGVhcC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2hlYXAuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9oZWFwLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAATrxqB7AoAAOwKAAAkAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9oZWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBlbmRvL2V4byIsIkBhZ29yaWMvc3RvcmUiLCIuL21ha2Utb25jZS5qcyIsIi4va2V5cy5qcyIsIi4vaXMtcGFzc2FibGUuanMiXSwiZXhwb3J0cyI6WyJtYWtlSGVhcFpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLG1ha2VFeG8sZGVmaW5lRXhvQ2xhc3MsZGVmaW5lRXhvQ2xhc3NLaXQsbWFrZVNjYWxhck1hcFN0b3JlLG1ha2VTY2FsYXJTZXRTdG9yZSxtYWtlU2NhbGFyV2Vha01hcFN0b3JlLG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUsbWFrZU9uY2VLaXQsa2V5cyxpc1Bhc3NhYmxlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXhvXCIsIFtbXCJtYWtlRXhvXCIsIFskaOKAjV9hID0+IChtYWtlRXhvID0gJGjigI1fYSldXSxbXCJkZWZpbmVFeG9DbGFzc1wiLCBbJGjigI1fYSA9PiAoZGVmaW5lRXhvQ2xhc3MgPSAkaOKAjV9hKV1dLFtcImRlZmluZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChkZWZpbmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyU2V0U3RvcmUgPSAkaOKAjV9hKV1dLFtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlLW9uY2UuanNcIiwgW1tcIm1ha2VPbmNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlT25jZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2tleXMuanNcIiwgW1tcImFnb3JpY1ZhdERhdGFLZXlzXCIsIFskaOKAjV9hID0+IChrZXlzID0gJGjigI1fYSldXV1dLFtcIi4vaXMtcGFzc2FibGUuanNcIiwgW1tcImlzUGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGlzUGFzc2FibGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlN0b3Jlc31cbiAqL1xuY29uc3QgZGV0YWNoZWRIZWFwU3RvcmVzPUZhcignaGVhcFN0b3Jlcycse1xuZGV0YWNoZWQ6KCk9PmRldGFjaGVkSGVhcFN0b3JlcyxcbmlzU3RvcmFibGU6aXNQYXNzYWJsZSxcblxuc2V0U3RvcmU6bWFrZVNjYWxhclNldFN0b3JlLFxubWFwU3RvcmU6bWFrZVNjYWxhck1hcFN0b3JlLFxud2Vha01hcFN0b3JlOm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsXG53ZWFrU2V0U3RvcmU6bWFrZVNjYWxhcldlYWtTZXRTdG9yZX0pO1xuXG5cbi8qKlxuICogQ3JlYXRlIGEgaGVhcCAoaW4tbWVtb3J5KSB6b25lIHRoYXQgdXNlcyB0aGUgZGVmYXVsdCBleG8gYW5kIHN0b3JlIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VMYWJlbF1cbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuWm9uZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VIZWFwWm9uZT0oYmFzZUxhYmVsPSdoZWFwWm9uZScpPT57XG5jb25zdHttYWtlT25jZSx3cmFwUHJvdmlkZXJ9PW1ha2VPbmNlS2l0KGJhc2VMYWJlbCxkZXRhY2hlZEhlYXBTdG9yZXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHBhcmFtIHthbnl9IF9vcHRpb25zXG4gKi9cbmNvbnN0IG1ha2VTdWJab25lPShsYWJlbCxfb3B0aW9ucyk9PlxubWFrZUhlYXBab25lKCBgJHtiYXNlTGFiZWx9LiR7bGFiZWx9YCk7XG5cbnJldHVybiBGYXIoJ2hlYXBab25lJyx7XG5leG86d3JhcFByb3ZpZGVyKG1ha2VFeG8sa2V5cy5leG8pLFxuZXhvQ2xhc3M6d3JhcFByb3ZpZGVyKGRlZmluZUV4b0NsYXNzLGtleXMuZXhvQ2xhc3MpLFxuZXhvQ2xhc3NLaXQ6d3JhcFByb3ZpZGVyKGRlZmluZUV4b0NsYXNzS2l0LGtleXMuZXhvQ2xhc3NLaXQpLFxuc3ViWm9uZTp3cmFwUHJvdmlkZXIobWFrZVN1YlpvbmUpLFxuXG5tYWtlT25jZSxcbmRldGFjaGVkOmRldGFjaGVkSGVhcFN0b3Jlcy5kZXRhY2hlZCxcbmlzU3RvcmFibGU6ZGV0YWNoZWRIZWFwU3RvcmVzLmlzU3RvcmFibGUsXG5cbm1hcFN0b3JlOndyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMubWFwU3RvcmUpLFxuc2V0U3RvcmU6d3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy5zZXRTdG9yZSksXG53ZWFrTWFwU3RvcmU6d3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy53ZWFrTWFwU3RvcmUpLFxud2Vha1NldFN0b3JlOndyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMud2Vha1NldFN0b3JlKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VIZWFwWm9uZShtYWtlSGVhcFpvbmUpO1xuaGFyZGVuKG1ha2VIZWFwWm9uZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUhlYXBab25lIjpbIm1ha2VIZWFwWm9uZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAqfoo+kQQAAJEEAAArAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pcy1wYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiaXNQYXNzYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBJcyBgc3BlY2ltZW5gIFBhc3NhYmxlPyBUaGlzIHJldHVybnMgdHJ1ZSBpZmYgYHBhc3NTdHlsZU9mKHNwZWNpbWVuKWBcbiAqIHJldHVybnMgYSBzdHJpbmcuIFRoaXMgcmV0dXJucyBgZmFsc2VgIGlmZiBgcGFzc1N0eWxlT2Yoc3BlY2ltZW4pYCB0aHJvd3MuXG4gKiBVbmRlciBubyBub3JtYWwgY2lyY3Vtc3RhbmNlIHNob3VsZCBgaXNQYXNzYWJsZShzcGVjaW1lbilgIHRocm93LlxuICpcbiAqIFRPRE8gaW1wbGVtZW50IGFuIGlzUGFzc2FibGUgdGhhdCBkb2VzIG5vdCByZWx5IG9uIHRyeS9jYXRjaCwgYW5kXG4gKiBtb3ZlIGl0IHRvIEBlbmRvL3Bhc3Mtc3R5bGUuXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGp1c3QgYSBzdGFuZGluIHVudGlsIHRoZW5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtzcGVjaW1lbiBpcyBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIGlzUGFzc2FibGU9KHNwZWNpbWVuKT0+e1xudHJ5e1xuLyogSW4gZmFjdCwgaXQgbmV2ZXIgcmV0dXJucyB1bmRlZmluZWQuIEl0IGVpdGhlciByZXR1cm5zIGEqL1xuLyogc3RyaW5nIG9yIHRocm93cy4qL1xucmV0dXJuIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSE9PXVuZGVmaW5lZDtcbiB9Y2F0Y2goXyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH07JGjigI1fb25jZS5pc1Bhc3NhYmxlKGlzUGFzc2FibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGUiOlsiaXNQYXNzYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC/YR9zyQMAAMkDAAAkAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9rZXlzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhZ29yaWNWYXREYXRhS2V5cyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgKi9cbmNvbnN0IGtpbmQ9KGxhYmVsKT0+IGAke2xhYmVsfV9raW5kSGFuZGxlYDtcblxuLyoqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAqL1xuY29uc3Qgc2luZ2xldG9uPShsYWJlbCk9PiBgJHtsYWJlbH1fc2luZ2xldG9uYDtcblxuLyoqXG4gKiBLZXlNYWtlcnMgY29tcGF0aWJsZSB3aXRoIGBAYWdvcmljL3ZhdC1kYXRhYC5cbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLktleU1ha2Vyc31cbiAqL1xuY29uc3QgICAgICAgIGFnb3JpY1ZhdERhdGFLZXlzPXtcbmV4b0NsYXNzOihsYWJlbCk9PmhhcmRlbihba2luZChsYWJlbCldKSxcbmV4b0NsYXNzS2l0OihsYWJlbCk9PmhhcmRlbihba2luZChsYWJlbCldKSxcbmV4bzoobGFiZWwpPT5oYXJkZW4oW2tpbmQobGFiZWwpLHNpbmdsZXRvbihsYWJlbCldKSxcbnN0b3JlOihsYWJlbCk9PmhhcmRlbihbbGFiZWxdKSxcbnpvbmU6KGxhYmVsKT0+aGFyZGVuKFtsYWJlbF0pfTskaOKAjV9vbmNlLmFnb3JpY1ZhdERhdGFLZXlzKGFnb3JpY1ZhdERhdGFLZXlzKTtcblxuaGFyZGVuKGFnb3JpY1ZhdERhdGFLZXlzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhZ29yaWNWYXREYXRhS2V5cyI6WyJhZ29yaWNWYXREYXRhS2V5cyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADOSDYZwQ0AAMENAAApAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9tYWtlLW9uY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VPbmNlS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAqL1xuY29uc3QgZGVmYXVsdExhYmVsVG9LZXlzPShsYWJlbCk9PmhhcmRlbihbbGFiZWxdKTtcbmhhcmRlbihkZWZhdWx0TGFiZWxUb0tleXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWJ1Z05hbWUgT25seSB1c2VkIGludGVybmFsbHkgZm9yIGRpYWdub3N0aWNzLCBub3QgYXZhaWxhYmxlIHRvIHVzZXIgY29kZVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU3RvcmVzfSBzdG9yZXNcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5NYXBTdG9yZTxzdHJpbmcsIGFueT59IFtiYWNraW5nU3RvcmVdXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlT25jZUtpdD0oZGVidWdOYW1lLHN0b3JlcyxiYWNraW5nU3RvcmU9dW5kZWZpbmVkKT0+e1xuLyogV2UgbmVlZCBhIGRldGFjaGVkIHNldFN0b3JlIHNvIHRoYXQgaXQgaXNuJ3QgcGVyc2lzdGVkIGFzIHBhcnQgb2YgdGhlIHpvbmUuKi9cbi8qIFRoYXQgd2F5LCBvdXIgdXNlZEtleXMgYXJlIG9ubHkgdHJhY2tlZCBmb3IgdGhlIGN1cnJlbnQgaW5jYXJuYXRpb24sIHdoaWNoKi9cbi8qIGlzIHdoYXQgd2Ugd2FudC4gIFVzaW5nIGBkZWJ1Z05hbWVgIGluIHRoZSBsYWJlbCBpcyBnb29kIGZvciBkaWFnbm9zdGljcywqL1xuLyogYW5kIHNpbmNlIGl0IGlzIG9ubHkgZm9yIGEgZGV0YWNoZWQgc3RvcmUsIGl0IHNob3VsZCBub3QgYmUgdmlzaWJsZSB0byB0aGUqL1xuLyogYmFja2luZyBzdG9yZS4qL1xuY29uc3QgdXNlZEtleXM9c3RvcmVzLmRldGFjaGVkKCkuc2V0U3RvcmUoIGAke2RlYnVnTmFtZX0gdXNlZCBrZXlzYCk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICovXG5jb25zdCBhc3NlcnRPbmx5T25jZT0oa2V5KT0+e1xudHlwZW9mIGtleT09PSdzdHJpbmcnfHxGYWlsIGBrZXkgJHtrZXl9IG11c3QgYmUgYSBzdHJpbmdgO1xuIXVzZWRLZXlzLmhhcyhrZXkpfHxcbkZhaWwgYGtleSAke2tleX0gaGFzIGFscmVhZHkgYmVlbiB1c2VkIGluIHRoaXMgem9uZSBhbmQgaW5jYXJuYXRpb25gO1xuXG4vKiBNYXJrIHRoaXMga2V5IGFzIHVzZWQuICBXZSBtYWtlIG5vIGF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIGludmFsaWQgbWFrZXJzKi9cbi8qIG9yIGJhY2tpbmdTdG9yZXMuKi9cbnVzZWRLZXlzLmFkZChrZXkpO1xuIH07XG5cbi8qKlxuICogRW5zdXJlIHRoZSB3cmFwcGVkIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIG9uY2UgcGVyIGluY2FybmF0aW9uLiAgSXQgaXNcbiAqIGV4cGVjdGVkIHRvIHVwZGF0ZSB0aGUgYmFja2luZyBzdG9yZSBkaXJlY3RseS5cbiAqXG4gKiBAdGVtcGxhdGUgeyhrZXk6IHN0cmluZywgLi4ucmVzdDogdW5rbm93bltdKSA9PiBhbnl9IFRcbiAqIEBwYXJhbSB7VH0gcHJvdmlkZXJcbiAqIEBwYXJhbSB7KGxhYmVsOiBzdHJpbmcpID0+IHN0cmluZ1tdfSBbbGFiZWxUb0tleXNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3Qgd3JhcFByb3ZpZGVyPShwcm92aWRlcixsYWJlbFRvS2V5cz1kZWZhdWx0TGFiZWxUb0tleXMpPT57XG4vKiogQHR5cGUgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBSZXR1cm5UeXBlPFQ+fSAqL1xuY29uc3Qgd3JhcHBlcj0obGFiZWwsLi4ucmVzdCk9PntcbmZvcihjb25zdCBrZXkgb2YgbGFiZWxUb0tleXMobGFiZWwpKXtcbmFzc2VydE9ubHlPbmNlKGtleSk7XG4gfVxucmV0dXJuIHByb3ZpZGVyKGxhYmVsLC4uLnJlc3QpO1xuIH07XG5yZXR1cm4gKC8qKiBAdHlwZSB7VH0gKi93cmFwcGVyKTtcbiB9O1xuXG4vKipcbiAqIFRoZSBiZXN0IHdheSB0byB1bmRlcnN0YW5kIHRoZSBwdXJwb3NlIG9mIGBtYWtlT25jZWAgaXMgdG8gZmlyc3QgdW5kZXJzdGFuZFxuICogd2hhdCBgbWFrZU9uY2VgIGRvZXMgb24gYSBkdXJhYmxlIHpvbmUuIFVzZWQgY29ycmVjdGx5LCBgbWFrZU9uY2VgIHNob3VsZCBvbmx5XG4gKiBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlIG9uIGFueSB6b25lLGtleSBwYWlyIGR1cmluZyBhbnkgdmF0IGluY2FybmF0aW9uLlxuICogR2l2ZW4gdGhhdCBjb25zdHJhaW50LCBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgdmFsdWUgYm91bmQgdG8gdGhhdFxuICogem9uZSxrZXkgcGFpciwgaXQgbXVzdCBoYXZlIGJlZW4gbGVmdCB0aGVyZSBieSBhIHByZXZpb3VzIGluY2FybmF0aW9uIGFuZFxuICogYG1ha2VPbmNlYCB3aWxsIHNpbXBseSByZXR1cm4gaXQuIElmIG5vdCwgdGhlbiBgbWFrZXIoa2V5KWAgaXMgY2FsbGVkIHRvXG4gKiBkZXRlcm1pbmUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhhdCBzbG90LCB3aGljaCB3aWxsIG5vcm1hbGx5IGJlIHByZXNlcnZlZFxuICogYnkgc2ltaWxhciBjYWxscyB0byBgbWFrZU9uY2VgIGluIGZ1dHVyZSBpbmNhcm5hdGlvbnMgLS0tIHRob3VnaCB0aGF0IHdpbGwgYmVcbiAqIHVwIHRvIHRoZW0uXG4gKlxuICogQWxzbyBlbnN1cmVzIHRoZSBtYWtlciByZXR1cm5zIGEgc3RvcmFibGUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHN0cmluZyBuYW1lIG9mIHRoZSBab25lIHNsb3QgdG8gcHJvdmlkZS5cbiAqIEBwYXJhbSB7KGtleTogc3RyaW5nKSA9PiBWfSBtYWtlciBDYWxsZWQgdG8gY3JlYXRlIGEgZnJlc2ggdmFsdWUgdG8gZmlsbCBhbiBlbXB0eSBzbG90LlxuICogQHJldHVybnMge1Z9IFRoZSB2YWx1ZSBvZiB0aGUga2V5J3Mgc2xvdC5cbiAqL1xuY29uc3QgbWFrZU9uY2U9KGtleSxtYWtlcik9PntcbmFzc2VydE9ubHlPbmNlKGtleSk7XG5pZihiYWNraW5nU3RvcmUmJmJhY2tpbmdTdG9yZS5oYXMoa2V5KSl7XG5yZXR1cm4gYmFja2luZ1N0b3JlLmdldChrZXkpO1xuIH1cbmNvbnN0IHZhbHVlPW1ha2VyKGtleSk7XG5zdG9yZXMuaXNTdG9yYWJsZSh2YWx1ZSl8fFxuRmFpbCBgbWFrZXIgcmV0dXJuIHZhbHVlICR7dmFsdWV9IGlzIG5vdCBzdG9yYWJsZWA7XG5iYWNraW5nU3RvcmUmJmJhY2tpbmdTdG9yZS5pbml0KGtleSx2YWx1ZSk7XG5yZXR1cm4gdmFsdWU7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7bWFrZU9uY2Usd3JhcFByb3ZpZGVyfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VPbmNlS2l0KG1ha2VPbmNlS2l0KTtcbmhhcmRlbihtYWtlT25jZUtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU9uY2VLaXQiOlsibWFrZU9uY2VLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAq4ojpmwBAABsAQAAIAAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiD2WJjw3AAA8NwAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZW1vdGFibGUgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1wiLCBbW1wibmF0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKG5hdE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcInNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChzZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5U2V0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlCYWdNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAoY29weUJhZ01hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIENvbnN0YW50cyBmb3IgdGhlIGtpbmRzIG9mIGFzc2V0cyB3ZSBzdXBwb3J0LlxuICpcbiAqIEB0eXBlIHt7XG4gKiAgIE5BVDogJ25hdCc7XG4gKiAgIFNFVDogJ3NldCc7XG4gKiAgIENPUFlfU0VUOiAnY29weVNldCc7XG4gKiAgIENPUFlfQkFHOiAnY29weUJhZyc7XG4gKiB9fVxuICovXG5jb25zdCBBc3NldEtpbmQ9aGFyZGVuKHtcbk5BVDonbmF0JyxcblNFVDonc2V0JyxcbkNPUFlfU0VUOidjb3B5U2V0JyxcbkNPUFlfQkFHOidjb3B5QmFnJ30pOyRo4oCNX29uY2UuQXNzZXRLaW5kKEFzc2V0S2luZCk7XG5cbmNvbnN0IGFzc2V0S2luZE5hbWVzPWhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyoqIEBwYXJhbSB7QXNzZXRLaW5kfSBhbGxlZ2VkQUsgKi9cbmNvbnN0IGFzc2VydEFzc2V0S2luZD0oYWxsZWdlZEFLKT0+e1xuYXNzZXRLaW5kTmFtZXMuaW5jbHVkZXMoYWxsZWdlZEFLKXx8XG5GYWlsIGBUaGUgYXNzZXRLaW5kICR7YWxsZWdlZEFLfSBtdXN0IGJlIG9uZSBvZiAke3EoYXNzZXRLaW5kTmFtZXMpfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydEFzc2V0S2luZChhc3NlcnRBc3NldEtpbmQpO1xuaGFyZGVuKGFzc2VydEFzc2V0S2luZCk7XG5cbi8qKlxuICogQW1vdW50cyBkZXNjcmliZSBkaWdpdGFsIGFzc2V0cy4gRnJvbSBhbiBhbW91bnQsIHlvdSBjYW4gbGVhcm4gdGhlIGJyYW5kIG9mXG4gKiBkaWdpdGFsIGFzc2V0IGFzIHdlbGwgYXMgXCJob3cgbXVjaFwiIG9yIFwiaG93IG1hbnlcIi4gQW1vdW50cyBoYXZlIHR3byBwYXJ0czogYVxuICogYnJhbmQgKGxvb3NlbHkgc3BlYWtpbmcsIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQpIGFuZCB0aGUgdmFsdWUgKHRoZSBhbnN3ZXJcbiAqIHRvIFwiaG93IG11Y2hcIikuIEZvciBleGFtcGxlLCBpbiB0aGUgcGhyYXNlIFwiNSBidWNrc1wiLCBcImJ1Y2tzXCIgdGFrZXMgdGhlIHJvbGVcbiAqIG9mIHRoZSBicmFuZCBhbmQgdGhlIHZhbHVlIGlzIDUuIEFtb3VudHMgY2FuIGRlc2NyaWJlIGZ1bmdpYmxlIGFuZFxuICogbm9uLWZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzLiBBbW91bnRzIGFyZSBwYXNzLWJ5LWNvcHkgYW5kIGNhbiBiZSBtYWRlIGJ5IGFuZFxuICogc2VudCB0byBhbnlvbmUuXG4gKlxuICogVGhlIGlzc3VlciBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzb3VyY2Ugb2YgdGhlIGFtb3VudCBpbiBwYXltZW50cyBhbmQgcHVyc2VzLlxuICogVGhlIGlzc3VlciBtdXN0IGJlIGFibGUgdG8gZG8gdGhpbmdzIHN1Y2ggYXMgYWRkIGRpZ2l0YWwgYXNzZXRzIHRvIGEgcHVyc2VcbiAqIGFuZCB3aXRoZHJhdyBkaWdpdGFsIGFzc2V0cyBmcm9tIGEgcHVyc2UuIFRvIGRvIHNvLCBpdCBtdXN0IGtub3cgaG93IHRvIGFkZFxuICogYW5kIHN1YnRyYWN0IGRpZ2l0YWwgYXNzZXRzLiBSYXRoZXIgdGhhbiBoYXJkLWNvZGluZyBhIHBhcnRpY3VsYXIgc29sdXRpb24sXG4gKiB3ZSBjaG9zZSB0byBwYXJhbWV0ZXJpemUgdGhlIGlzc3VlciB3aXRoIGEgY29sbGVjdGlvbiBvZiBwb2x5bW9ycGhpY1xuICogZnVuY3Rpb25zLCB3aGljaCB3ZSBjYWxsIGBBbW91bnRNYXRoYC4gVGhlc2UgbWF0aCBmdW5jdGlvbnMgaW5jbHVkZSBjb25jZXB0c1xuICogbGlrZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uXG4gKlxuICogV2UgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb25mdXNpb24gYXMgdG8gd2hhdCBraW5kIG9mIGFzc2V0IHdlXG4gKiBhcmUgdXNpbmcuIFRodXMsIEFtb3VudE1hdGggaW5jbHVkZXMgY2hlY2tzIG9mIHRoZSBgYnJhbmRgLCB0aGUgdW5pcXVlXG4gKiBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0LiBJZiB0aGUgd3JvbmcgYnJhbmQgaXMgdXNlZCBpblxuICogQW1vdW50TWF0aCwgYW4gZXJyb3IgaXMgdGhyb3duIGFuZCB0aGUgb3BlcmF0aW9uIGRvZXMgbm90IHN1Y2NlZWQuXG4gKlxuICogQW1vdW50TWF0aCB1c2VzIG1hdGhIZWxwZXJzIHRvIGRvIG1vc3Qgb2YgdGhlIHdvcmssIGJ1dCB0aGVuIGFkZHMgdGhlIGJyYW5kXG4gKiB0byB0aGUgcmVzdWx0LiBUaGUgZnVuY3Rpb24gYHZhbHVlYCBnZXRzIHRoZSB2YWx1ZSBmcm9tIHRoZSBhbW91bnQgYnlcbiAqIHJlbW92aW5nIHRoZSBicmFuZCAoYW1vdW50IC0+IHZhbHVlKSwgYW5kIHRoZSBmdW5jdGlvbiBgbWFrZWAgYWRkcyB0aGUgYnJhbmRcbiAqIHRvIHByb2R1Y2UgYW4gYW1vdW50ICh2YWx1ZSAtPiBhbW91bnQpLiBUaGUgZnVuY3Rpb24gYGNvZXJjZWAgdGFrZXMgYW4gYW1vdW50XG4gKiBhbmQgY2hlY2tzIGl0LCByZXR1cm5pbmcgYW4gYW1vdW50IChhbW91bnQgLT4gYW1vdW50KS5cbiAqXG4gKiBFYWNoIGlzc3VlciBvZiBkaWdpdGFsIGFzc2V0cyBoYXMgYW4gYXNzb2NpYXRlZCBicmFuZCBpbiBhIG9uZS10by1vbmVcbiAqIG1hcHBpbmcuIEluIHVudHJ1c3RlZCBjb250ZXh0cywgc3VjaCBhcyBpbiBhbmFseXppbmcgcGF5bWVudHMgYW5kIGFtb3VudHMsIHdlXG4gKiBjYW4gZ2V0IHRoZSBicmFuZCBhbmQgZmluZCB0aGUgaXNzdWVyIHdoaWNoIG1hdGNoZXMgdGhlIGJyYW5kLiBUaGUgaXNzdWVyIGFuZFxuICogdGhlIGJyYW5kIG11dHVhbGx5IHZhbGlkYXRlIGVhY2ggb3RoZXIuXG4gKi9cblxuY29uc3QgaGVscGVycz17XG5uYXQ6bmF0TWF0aEhlbHBlcnMsXG5zZXQ6c2V0TWF0aEhlbHBlcnMsXG5jb3B5U2V0OmNvcHlTZXRNYXRoSGVscGVycyxcbmNvcHlCYWc6Y29weUJhZ01hdGhIZWxwZXJzfTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlIHsodmFsdWU6IFYpID0+IEFzc2V0S2luZEZvclZhbHVlPFY+fVxuICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZD0odmFsdWUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsdWUpO1xuaWYocGFzc1N0eWxlPT09J2JpZ2ludCcpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiduYXQnO1xuIH1cbmlmKHBhc3NTdHlsZT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nc2V0JztcbiB9XG5pZihtYXRjaGVzKHZhbHVlLE0uc2V0KCkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nY29weVNldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLmJhZygpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlCYWcnO1xuIH1cbi8qIFRPRE8gVGhpcyBpc24ndCBxdWl0ZSB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSwgaW4gY2FzZSB2YWx1ZVBhc3NTdHlsZSovXG4vKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbi8qIG9iamVjdCBpdCBpcy4qL1xuLyogQWxzbywgdGhpcyBraW5kIG9mIG1hbnVhbCBsaXN0aW5nIGlzIGEgbWFpbnRlbmFuY2UgaGF6YXJkIHdlKi9cbi8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cbnRocm93IEZhaWwgYHZhbHVlICR7dmFsdWV9IG11c3QgYmUgYSBiaWdpbnQsIGNvcHlTZXQsIGNvcHlCYWcsIG9yIGFuIGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHZhbHVlIGlzIGEgdmFsaWQgQW1vdW50TWF0aCBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaGVscGVycy5cbiAqXG4gKiBNYWRlIGF2YWlsYWJsZSBvbmx5IGZvciB0ZXN0aW5nLCBidXQgaXQgaXMgaGFybWxlc3MgZm9yIG90aGVyIHVzZXMuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHBhcmFtIHtWfSB2YWx1ZVxuICogQHJldHVybnMge01hdGhIZWxwZXJzPFY+fVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0VmFsdWVHZXRIZWxwZXJzPSh2YWx1ZSk9PlxuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbmhlbHBlcnNbYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpXTtcblxuLyoqIEB0eXBlIHsoYWxsZWdlZEJyYW5kOiBCcmFuZCwgYnJhbmQ/OiBCcmFuZCkgPT4gdm9pZH0gKi8kaOKAjV9vbmNlLmFzc2VydFZhbHVlR2V0SGVscGVycyhhc3NlcnRWYWx1ZUdldEhlbHBlcnMpO1xuY29uc3Qgb3B0aW9uYWxCcmFuZENoZWNrPShhbGxlZ2VkQnJhbmQsYnJhbmQpPT57XG5pZihicmFuZCE9PXVuZGVmaW5lZCl7XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hbGxlZ2VkQnJhbmQ9PT1icmFuZHx8XG5GYWlsIGBhbW91bnQncyBicmFuZCAke3EoYWxsZWdlZEJyYW5kKX0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBicmFuZCAke3EoXG5icmFuZClcbiB9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPiB8IHVuZGVmaW5lZH0gYnJhbmRcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczxhbnk+fVxuICovXG5jb25zdCBjaGVja0xSQW5kR2V0SGVscGVycz0obGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQobGVmdEFtb3VudCwnbGVmdEFtb3VudCcpO1xuYXNzZXJ0UmVjb3JkKHJpZ2h0QW1vdW50LCdyaWdodEFtb3VudCcpO1xuY29uc3R7dmFsdWU6bGVmdFZhbHVlLGJyYW5kOmxlZnRCcmFuZH09bGVmdEFtb3VudDtcbmNvbnN0e3ZhbHVlOnJpZ2h0VmFsdWUsYnJhbmQ6cmlnaHRCcmFuZH09cmlnaHRBbW91bnQ7XG5hc3NlcnRSZW1vdGFibGUobGVmdEJyYW5kLCdsZWZ0QnJhbmQnKTtcbmFzc2VydFJlbW90YWJsZShyaWdodEJyYW5kLCdyaWdodEJyYW5kJyk7XG5vcHRpb25hbEJyYW5kQ2hlY2sobGVmdEJyYW5kLGJyYW5kKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhyaWdodEJyYW5kLGJyYW5kKTtcbmxlZnRCcmFuZD09PXJpZ2h0QnJhbmR8fFxuRmFpbCBgQnJhbmRzIGluIGxlZnQgJHtxKGxlZnRCcmFuZCl9IGFuZCByaWdodCAke3EoXG5yaWdodEJyYW5kKVxuIH0gc2hvdWxkIG1hdGNoIGJ1dCBkbyBub3RgO1xuY29uc3QgbGVmdEhlbHBlcnM9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGxlZnRWYWx1ZSk7XG5jb25zdCByaWdodEhlbHBlcnM9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHJpZ2h0VmFsdWUpO1xubGVmdEhlbHBlcnM9PT1yaWdodEhlbHBlcnN8fFxuRmFpbCBgVGhlIGxlZnQgJHtsZWZ0QW1vdW50fSBhbmQgcmlnaHQgYW1vdW50ICR7cmlnaHRBbW91bnR9IGhhZCBkaWZmZXJlbnQgYXNzZXRLaW5kc2A7XG5yZXR1cm4gbGVmdEhlbHBlcnM7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtNYXRoSGVscGVyczxBc3NldFZhbHVlRm9yS2luZDxLPj59IGhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEByZXR1cm5zIHtbSywgS119XG4gKi9cbmNvbnN0IGNvZXJjZUxSPShoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpPT57XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGFyYml0cmFyeSBzdWJ0eXBlKi9cbnJldHVybltoLmRvQ29lcmNlKGxlZnRBbW91bnQudmFsdWUpLGguZG9Db2VyY2UocmlnaHRBbW91bnQudmFsdWUpXTtcbiB9O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJpZ2h0QW1vdW50LlxuICogVGhlIG5vdGlvbiBvZiBcImdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1wiIGRlcGVuZHMgb24gdGhlIGtpbmQgb2YgYW1vdW50LCBhc1xuICogZGVmaW5lZCBieSB0aGUgTWF0aEhlbHBlcnMuIEZvciBleGFtcGxlLCB3aGV0aGVyIHJlY3RhbmdsZSBBIGlzIGdyZWF0ZXIgdGhhblxuICogcmVjdGFuZ2xlIEIgZGVwZW5kcyBvbiB3aGV0aGVyIHJlY3RhbmdsZSBBIGluY2x1ZGVzIHJlY3RhbmdsZSBCIGFzIGRlZmluZWQgYnlcbiAqIHRoZSBsb2dpYyBpbiBNYXRoSGVscGVycy5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzR1RFPShsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5yZXR1cm4gaC5kb0lzR1RFKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuIH07XG5cbi8qKlxuICogTG9naWMgZm9yIG1hbmlwdWxhdGluZyBhbW91bnRzLlxuICpcbiAqIEFtb3VudHMgYXJlIHRoZSBjYW5vbmljYWwgZGVzY3JpcHRpb24gb2YgdHJhZGFibGUgZ29vZHMuIFRoZXkgYXJlIG1hbmlwdWxhdGVkXG4gKiBieSBpc3N1ZXJzIGFuZCBtaW50cywgYW5kIHJlcHJlc2VudCB0aGUgZ29vZHMgYW5kIGN1cnJlbmN5IGNhcnJpZWQgYnkgcHVyc2VzXG4gKiBhbmQgcGF5bWVudHMuIFRoZXkgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoaW5ncyBsaWtlIGN1cnJlbmN5LCBzdG9jaywgYW5kXG4gKiB0aGUgYWJzdHJhY3QgcmlnaHQgdG8gcGFydGljaXBhdGUgaW4gYSBwYXJ0aWN1bGFyIGV4Y2hhbmdlLlxuICovXG5jb25zdCBBbW91bnRNYXRoPXtcbi8qKlxuICogTWFrZSBhbiBhbW91bnQgZnJvbSBhIHZhbHVlIGJ5IGFkZGluZyB0aGUgYnJhbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fSBhbGxlZ2VkVmFsdWVcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbi8qIGFsbGVnZWRWYWx1ZSBoYXMgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGZvciB0eXBlIHdpZGVuaW5nLCB0byBwcmV2ZW50IFYgYmVpbmcgYm91bmQgdG8gYSBhIGxpdGVyYWwgbGlrZSAxbiovXG5tYWtlOihicmFuZCxhbGxlZ2VkVmFsdWUpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5jb25zdCBoPWFzc2VydFZhbHVlR2V0SGVscGVycyhhbGxlZ2VkVmFsdWUpO1xuY29uc3QgdmFsdWU9aC5kb0NvZXJjZShhbGxlZ2VkVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBNYWtlIHN1cmUgdGhpcyBhbW91bnQgaXMgdmFsaWQgZW5vdWdoLCBhbmQgcmV0dXJuIGEgY29ycmVzcG9uZGluZyB2YWxpZFxuICogYW1vdW50IGlmIHNvLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFsbGVnZWRBbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbmNvZXJjZTooYnJhbmQsYWxsZWdlZEFtb3VudCk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydFJlY29yZChhbGxlZ2VkQW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZTphbGxlZ2VkVmFsdWV9PWFsbGVnZWRBbW91bnQ7XG5icmFuZD09PWFsbGVnZWRCcmFuZHx8XG5GYWlsIGBUaGUgYnJhbmQgaW4gdGhlIGFsbGVnZWRBbW91bnQgJHthbGxlZ2VkQW1vdW50fSBpbiAnY29lcmNlJyBkaWRuJ3QgbWF0Y2ggdGhlIHNwZWNpZmllZCBicmFuZCAke2JyYW5kfS5gO1xuLyogV2lsbCB0aHJvdyBvbiBpbmFwcHJvcHJpYXRlIHZhbHVlKi9cbnJldHVybiBBbW91bnRNYXRoLm1ha2UoYnJhbmQsYWxsZWdlZFZhbHVlKTtcbiB9LFxuLyoqXG4gKiBFeHRyYWN0IGFuZCByZXR1cm4gdGhlIHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFtb3VudFxuICogQHJldHVybnMge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fVxuICovXG5nZXRWYWx1ZTooYnJhbmQsYW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYW1vdW50KS52YWx1ZSxcbi8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudC4gVGhpcyBpcyB0aGUgaWRlbnRpdHlcbiAqIGVsZW1lbnQgZm9yIE1hdGhIZWxwZXJzLmFkZCBhbmQgTWF0SGVscGVycy5zdWJ0cmFjdC5cbiAqXG4gKiBAdHlwZSB7e1xuICogICAoYnJhbmQ6IEJyYW5kKTogQW1vdW50PCduYXQnPjtcbiAqICAgPEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGJyYW5kOiBCcmFuZCwgYXNzZXRLaW5kOiBLKTogQW1vdW50PEs+O1xuICogfX1cbiAqL1xubWFrZUVtcHR5OihicmFuZCxhc3NldEtpbmQ9LyoqIEB0eXBlIHtjb25zdH0gKi8nbmF0Jyk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuY29uc3QgdmFsdWU9aGVscGVyc1thc3NldEtpbmRdLmRvTWFrZUVtcHR5KCk7XG5yZXR1cm4gaGFyZGVuKHticmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQsIHVzaW5nIGFub3RoZXIgYW1vdW50IGFzIHRoZVxuICogdGVtcGxhdGUgZm9yIHRoZSBicmFuZCBhbmQgYXNzZXRLaW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5tYWtlRW1wdHlGcm9tQW1vdW50OihhbW91bnQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kLHZhbHVlfT1hbW91bnQ7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuY29uc3QgYXNzZXRLaW5kPWFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCAoaWdub3JlIGIvYyBlcnJvcmluZyBpbiBDSSBidXQgbm90IG15IElERSkqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIEFtb3VudCBpcyBlbXB0eS4gT3RoZXJ3aXNlIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0VtcHR5OihhbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZDphbGxlZ2VkQnJhbmQsdmFsdWV9PWFtb3VudDtcbmFzc2VydFJlbW90YWJsZShhbGxlZ2VkQnJhbmQsJ2JyYW5kJyk7XG5vcHRpb25hbEJyYW5kQ2hlY2soYWxsZWdlZEJyYW5kLGJyYW5kKTtcbmNvbnN0IGg9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHZhbHVlKTtcbnJldHVybiBoLmRvSXNFbXB0eShoLmRvQ29lcmNlKHZhbHVlKSk7XG4gfSxcbmlzR1RFLFxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgZXF1YWxzIHRoZSByaWdodEFtb3VudC4gV2UgYXNzdW1lIHRoYXQgaWZcbiAqIGlzR1RFIGlzIHRydWUgaW4gYm90aCBkaXJlY3Rpb25zLCBpc0VxdWFsIGlzIGFsc28gdHJ1ZVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuaXNFcXVhbDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0VxdWFsKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuIH0sXG4vKipcbiAqIFJldHVybnMgYSBuZXcgYW1vdW50IHRoYXQgaXMgdGhlIHVuaW9uIG9mIGJvdGggbGVmdEFtb3VudCBhbmQgcmlnaHRBbW91bnQuXG4gKlxuICogRm9yIGZ1bmdpYmxlIGFtb3VudCB0aGlzIG1lYW5zIGFkZGluZyB0aGUgdmFsdWVzLiBGb3Igb3RoZXIga2luZHMgb2ZcbiAqIGFtb3VudCwgaXQgdXN1YWxseSBtZWFucyBpbmNsdWRpbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIGJvdGggbGVmdCBhbmRcbiAqIHJpZ2h0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5hZGQ6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbmNvbnN0IHZhbHVlPWguZG9BZGQoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZDpsZWZ0QW1vdW50LmJyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgbGVmdEFtb3VudCBtaW51cyB0aGUgcmlnaHRBbW91bnQgKGkuZS5cbiAqIGV2ZXJ5dGhpbmcgaW4gdGhlIGxlZnRBbW91bnQgdGhhdCBpcyBub3QgaW4gdGhlIHJpZ2h0QW1vdW50KS4gSWYgbGVmdEFtb3VudFxuICogZG9lc24ndCBpbmNsdWRlIHJpZ2h0QW1vdW50IChzdWJ0cmFjdGlvbiByZXN1bHRzIGluIGEgbmVnYXRpdmUpLCB0aHJvdyBhblxuICogZXJyb3IuIEJlY2F1c2UgdGhlIGxlZnQgYW1vdW50IG11c3QgaW5jbHVkZSB0aGUgcmlnaHQgYW1vdW50LCB0aGlzIGlzIE5PVFxuICogZXF1aXZhbGVudCB0byBzZXQgc3VidHJhY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbnN1YnRyYWN0OihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5jb25zdCB2YWx1ZT1oLmRvU3VidHJhY3QoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZDpsZWZ0QW1vdW50LmJyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyB0aGUgbWluIHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHlcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1pbjooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbmlzR1RFKHgseSxicmFuZCk/XG55OlxuaXNHVEUoeSx4LGJyYW5kKT9cbng6XG5GYWlsIGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgLFxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXggdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB4XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geVxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xubWF4Oih4LHksYnJhbmQ9dW5kZWZpbmVkKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xuaXNHVEUoeCx5LGJyYW5kKT9cbng6XG5pc0dURSh5LHgpP1xueTpcbkZhaWwgYCR7eH0gYW5kICR7eX0gYXJlIGluY29tcGFyYWJsZWB9OyRo4oCNX29uY2UuQW1vdW50TWF0aChBbW91bnRNYXRoKTtcblxuaGFyZGVuKEFtb3VudE1hdGgpO1xuXG4vKiogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAqL1xuY29uc3QgZ2V0QXNzZXRLaW5kPShhbW91bnQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e3ZhbHVlfT1hbW91bnQ7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QgKGlnbm9yZSBiL2MgZXJyb3JpbmcgaW4gQ0kgYnV0IG5vdCBteSBJREUpKi9cbnJldHVybiBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG4gfTskaOKAjV9vbmNlLmdldEFzc2V0S2luZChnZXRBc3NldEtpbmQpO1xuaGFyZGVuKGdldEFzc2V0S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQXNzZXRLaW5kIjpbIkFzc2V0S2luZCJdLCJhc3NlcnRBc3NldEtpbmQiOlsiYXNzZXJ0QXNzZXRLaW5kIl0sIkFtb3VudE1hdGgiOlsiQW1vdW50TWF0aCJdLCJnZXRBc3NldEtpbmQiOlsiZ2V0QXNzZXRLaW5kIl0sImFzc2VydFZhbHVlR2V0SGVscGVycyI6WyJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwEtCX9UFAADVBQAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9kaXNwbGF5SW5mby5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYWlsLG11c3RNYXRjaCxEaXNwbGF5SW5mb1NoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRGlzcGxheUluZm9TaGFwZVwiLCBbJGjigI1fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gYWxsZWdlZERpc3BsYXlJbmZvXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcmV0dXJucyB7RGlzcGxheUluZm99XG4gKi9cbmNvbnN0ICAgICAgICBjb2VyY2VEaXNwbGF5SW5mbz0oYWxsZWdlZERpc3BsYXlJbmZvLGFzc2V0S2luZCk9Pntcbm11c3RNYXRjaChhbGxlZ2VkRGlzcGxheUluZm8sRGlzcGxheUluZm9TaGFwZSwnZGlzcGxheUluZm8nKTtcblxuaWYoYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZCE9PXVuZGVmaW5lZCl7XG5hbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kPT09YXNzZXRLaW5kfHxcbkZhaWwgYGRpc3BsYXlJbmZvLmFzc2V0S2luZCB3YXMgcHJlc2VudCAoJHthbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kfSkgYW5kIGRpZCBub3QgbWF0Y2ggdGhlIGFzc2V0S2luZCBhcmd1bWVudCAoJHthc3NldEtpbmR9KWA7XG4gfVxuY29uc3QgZGlzcGxheUluZm89aGFyZGVuKHsuLi5hbGxlZ2VkRGlzcGxheUluZm8sYXNzZXRLaW5kfSk7XG5cbmlmKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMhPT11bmRlZmluZWQpe1xuTnVtYmVyLmlzU2FmZUludGVnZXIoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyl8fFxuRmFpbCBgZGVjaW1hbFBsYWNlcyAke2Rpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXN9IGlzIG5vdCBhIHNhZmUgaW50ZWdlcmA7XG4gfVxuXG5yZXR1cm4gZGlzcGxheUluZm87XG4gfTskaOKAjV9vbmNlLmNvZXJjZURpc3BsYXlJbmZvKGNvZXJjZURpc3BsYXlJbmZvKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb2VyY2VEaXNwbGF5SW5mbyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABDMHvc6AEAAOgBAAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2Ftb3VudE1hdGguanNcIiwgW11dLFtcIi4vaXNzdWVyS2l0LmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMY1p2fWIAAA1iAAACUAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaXNzdWVyS2l0LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIl0sImV4cG9ydHMiOlsiaGFzSXNzdWVyIiwibWFrZUR1cmFibGVJc3N1ZXJLaXQiLCJtYWtlSXNzdWVyS2l0IiwicHJlcGFyZUlzc3VlcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsYXNzZXJ0UGF0dGVybixtYWtlU2NhbGFyQmlnTWFwU3RvcmUsQXNzZXRLaW5kLGFzc2VydEFzc2V0S2luZCxjb2VyY2VEaXNwbGF5SW5mbyxwcmVwYXJlUGF5bWVudExlZGdlcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kID0gJGjigI1fYSldXSxbXCJhc3NlcnRBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFzc2V0S2luZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2Rpc3BsYXlJbmZvLmpzXCIsIFtbXCJjb2VyY2VEaXNwbGF5SW5mb1wiLCBbJGjigI1fYSA9PiAoY29lcmNlRGlzcGxheUluZm8gPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXltZW50TGVkZ2VyLmpzXCIsIFtbXCJwcmVwYXJlUGF5bWVudExlZGdlclwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVBheW1lbnRMZWRnZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtLfSBhc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBkaXNwbGF5SW5mb1xuICogQHByb3BlcnR5IHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0lzc3VlclJlY29yZDxLPn0gaXNzdWVyUmVjb3JkXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCBzZXR1cElzc3VlcktpdD0oXG57bmFtZSxhc3NldEtpbmQsZGlzcGxheUluZm8sZWxlbWVudFNoYXBlfSxcbmlzc3VlckJhZ2dhZ2UsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuXG4vKiBBZGQgYXNzZXRLaW5kIHRvIGRpc3BsYXlJbmZvLCBvciBvdmVycmlkZSBpZiBwcmVzZW50Ki9cbmNvbnN0IGNsZWFuRGlzcGxheUluZm89Y29lcmNlRGlzcGxheUluZm8oZGlzcGxheUluZm8sYXNzZXRLaW5kKTtcbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlLCdmdW5jdGlvbicpO1xuIH1cblxuaWYoZWxlbWVudFNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oZWxlbWVudFNoYXBlKTtcbiB9XG5cbi8qIEF0dGVudWF0ZSB0aGUgcG93ZXJmdWwgYXV0aG9yaXR5IHRvIG1pbnQgYW5kIGNoYW5nZSBiYWxhbmNlcyovXG4vKiogQHR5cGUge1BheW1lbnRMZWRnZXI8Sz59ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5jb25zdHtpc3N1ZXIsbWludCxicmFuZCxtaW50UmVjb3ZlcnlQdXJzZX09cHJlcGFyZVBheW1lbnRMZWRnZXIoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmNsZWFuRGlzcGxheUluZm8sXG5lbGVtZW50U2hhcGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmJyYW5kLFxuaXNzdWVyLFxubWludCxcbm1pbnRSZWNvdmVyeVB1cnNlLFxuZGlzcGxheUluZm86Y2xlYW5EaXNwbGF5SW5mb30pO1xuXG4gfTtcbmhhcmRlbihzZXR1cElzc3VlcktpdCk7XG5cbi8qKiBUaGUga2V5IGF0IHdoaWNoIHRoZSBpc3N1ZXIgcmVjb3JkIGlzIHN0b3JlZC4gKi9cbmNvbnN0IElOU1RBTkNFX0tFWT0naXNzdWVyJztcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVJc3N1ZXJLaXQ9KFxuaXNzdWVyQmFnZ2FnZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBpc3N1ZXJSZWNvcmQ9aXNzdWVyQmFnZ2FnZS5nZXQoSU5TVEFOQ0VfS0VZKTtcbnJldHVybiBzZXR1cElzc3VlcktpdChpc3N1ZXJSZWNvcmQsaXNzdWVyQmFnZ2FnZSxvcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcbiB9OyRo4oCNX29uY2UucHJlcGFyZUlzc3VlcktpdChwcmVwYXJlSXNzdWVyS2l0KTtcbmhhcmRlbihwcmVwYXJlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBEb2VzIGJhZ2dhZ2UgYWxyZWFkeSBoYXZlIGFuIGlzc3VlciBmcm9tIHByZXBhcmVJc3N1ZXJLaXQoKT8gVGhhdCBpczogZG9lcyBpdFxuICogaGF2ZSB0aGUgcmVsZXZhbnQga2V5cyBkZWZpbmVkP1xuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICovXG5jb25zdCAgICAgICAgaGFzSXNzdWVyPShiYWdnYWdlKT0+YmFnZ2FnZS5oYXMoSU5TVEFOQ0VfS0VZKTtcblxuLyoqIEB0eXBlZGVmIHtQYXJ0aWFsPHsgZWxlbWVudFNoYXBlOiBQYXR0ZXJuIH0+fSBJc3N1ZXJPcHRpb25zUmVjb3JkICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEsgVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldFxuICogICBkZXNjcmlwdGlvbnMuIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqICAgYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuIEZvclxuICogICBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXQgaXQgaXNcbiAqICAgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZyB0byB0aGF0IGlzc3VlclxuICogICBhbmQgYnJhbmQuXG4gKlxuICogICBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVycyBmcm9tIHRoZVxuICogICBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZSBkZWZhdWx0LCBpcyB1c2VkIGZvclxuICogICBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kPUFzc2V0S2luZC5OQVRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvPXt9XVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovJGjigI1fb25jZS5oYXNJc3N1ZXIoaGFzSXNzdWVyKTtcbmNvbnN0ICAgICAgICBtYWtlRHVyYWJsZUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QgaXNzdWVyRGF0YT1oYXJkZW4oe25hbWUsYXNzZXRLaW5kLGRpc3BsYXlJbmZvLGVsZW1lbnRTaGFwZX0pO1xuaXNzdWVyQmFnZ2FnZS5pbml0KElOU1RBTkNFX0tFWSxpc3N1ZXJEYXRhKTtcbnJldHVybiBzZXR1cElzc3VlcktpdChpc3N1ZXJEYXRhLGlzc3VlckJhZ2dhZ2Usb3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEdXJhYmxlSXNzdWVyS2l0KG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcbmhhcmRlbihtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPSduYXQnXSBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0XG4gKiAgIGRlc2NyaXB0aW9ucy4gVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogICBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS4gRm9yXG4gKiAgIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dCBpdCBpc1xuICogICBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nIHRvIHRoYXQgaXNzdWVyXG4gKiAgIGFuZCBicmFuZC5cbiAqXG4gKiAgIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzIGZyb20gdGhlXG4gKiAgIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlIGRlZmF1bHQsIGlzIHVzZWQgZm9yXG4gKiAgIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kPSduYXQnXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mbz17fV1cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge0lzc3Vlck9wdGlvbnNSZWNvcmR9IFtvcHRpb25zXVxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJLaXQ9KFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9PlxuXG5tYWtlRHVyYWJsZUlzc3VlcktpdChcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZHJvcHBlZCBpc3N1ZXIga2l0Jyx7ZHVyYWJsZTp0cnVlfSksXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxue2VsZW1lbnRTaGFwZX0pOyRo4oCNX29uY2UubWFrZUlzc3VlcktpdChtYWtlSXNzdWVyS2l0KTtcblxuaGFyZGVuKG1ha2VJc3N1ZXJLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVJc3N1ZXJLaXQiOlsicHJlcGFyZUlzc3VlcktpdCJdLCJoYXNJc3N1ZXIiOlsiaGFzSXNzdWVyIl0sIm1ha2VEdXJhYmxlSXNzdWVyS2l0IjpbIm1ha2VEdXJhYmxlSXNzdWVyS2l0Il0sIm1ha2VJc3N1ZXJLaXQiOlsibWFrZUlzc3VlcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABOwhnarQUAAK0FAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiLi4vdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBrZXlFUSxtYWtlQ29weUJhZyxtdXN0TWF0Y2gsTSxnZXRDb3B5QmFnRW50cmllcyxiYWdJc1N1cGVyYmFnLGJhZ1VuaW9uLGJhZ0Rpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlCYWcgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaOKAjV9hKV1dLFtcImJhZ0lzU3VwZXJiYWdcIiwgWyRo4oCNX2EgPT4gKGJhZ0lzU3VwZXJiYWcgPSAkaOKAjV9hKV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9hID0+IChiYWdVbmlvbiA9ICRo4oCNX2EpXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge0NvcHlCYWd9ICovXG5jb25zdCBlbXB0eT1tYWtlQ29weUJhZyhbXSk7XG5cbi8qKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weUJhZz59ICovXG5jb25zdCAgICAgICAgY29weUJhZ01hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZTooYmFnKT0+e1xubXVzdE1hdGNoKGJhZyxNLmJhZygpLCdiYWcgb2YgYW1vdW50Jyk7XG5yZXR1cm4gYmFnO1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGJhZyk9PmdldENvcHlCYWdFbnRyaWVzKGJhZykubGVuZ3RoPT09MCxcbmRvSXNHVEU6YmFnSXNTdXBlcmJhZyxcbmRvSXNFcXVhbDprZXlFUSxcbmRvQWRkOmJhZ1VuaW9uLFxuZG9TdWJ0cmFjdDpiYWdEaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5QmFnTWF0aEhlbHBlcnMoY29weUJhZ01hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5QmFnTWF0aEhlbHBlcnMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFwp/j7BBQAAwQUAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuLi90eXBlcy1hbWJpZW50LmpzIl0sImV4cG9ydHMiOlsiY29weVNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5U2V0LG11c3RNYXRjaCxNLGdldENvcHlTZXRLZXlzLHNldElzU3VwZXJzZXQsc2V0RGlzam9pbnRVbmlvbixzZXREaXNqb2ludFN1YnRyYWN0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjigI1fYSldXSxbXCJzZXRJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChzZXRJc1N1cGVyc2V0ID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weVNldH0gKi9cbmNvbnN0IGVtcHR5PW1ha2VDb3B5U2V0KFtdKTtcblxuLyoqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5U2V0Pn0gKi9cbmNvbnN0ICAgICAgICBjb3B5U2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihzZXQpPT57XG5tdXN0TWF0Y2goc2V0LE0uc2V0KCksJ3NldCBvZiBhbW91bnQnKTtcbnJldHVybiBzZXQ7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooc2V0KT0+Z2V0Q29weVNldEtleXMoc2V0KS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpzZXRJc1N1cGVyc2V0LFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6c2V0RGlzam9pbnRVbmlvbixcbmRvU3VidHJhY3Q6c2V0RGlzam9pbnRTdWJ0cmFjdH0pOyRo4oCNX29uY2UuY29weVNldE1hdGhIZWxwZXJzKGNvcHlTZXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weVNldE1hdGhIZWxwZXJzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADxAWHrJgYAACYGAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIi4uL3R5cGVzLWFtYmllbnQuanMiXSwiZXhwb3J0cyI6WyJuYXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsaXNOYXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV0sW1wiaXNOYXRcIiwgWyRo4oCNX2EgPT4gKGlzTmF0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3QgZW1wdHk9MG47XG5cbi8qKlxuICogRnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdXNlIHRoZSBuYXRNYXRoSGVscGVycyB0byBtYW5hZ2UgYmFsYW5jZXMgLSB0aGVcbiAqIG9wZXJhdGlvbnMgYXJlIG1lcmVseSBhcml0aG1ldGljIG9uIG5hdHVyYWwsIG5vbi1uZWdhdGl2ZSBudW1iZXJzLlxuICpcbiAqIE5hdHVyYWwgbnVtYmVycyBhcmUgdXNlZCBmb3IgZnVuZ2libGUgZXJpZ2h0cyBzdWNoIGFzIG1vbmV5IGJlY2F1c2Ugcm91bmRpbmdcbiAqIGlzc3VlcyBtYWtlIGZsb2F0cyBwcm9ibGVtYXRpYy4gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGJlIGRvbmUgd2l0aCB0aGVcbiAqIHNtYWxsZXN0IHdob2xlIHVuaXQgc3VjaCB0aGF0IHRoZSBgbmF0TWF0aEhlbHBlcnNgIG5ldmVyIGRlYWxzIHdpdGhcbiAqIGZyYWN0aW9uYWwgcGFydHMuXG4gKlxuICogQHR5cGUge01hdGhIZWxwZXJzPE5hdFZhbHVlPn1cbiAqL1xuY29uc3QgICAgICAgIG5hdE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobmF0KT0+e1xuLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuYXNzZXJ0LnR5cGVvZihuYXQsJ2JpZ2ludCcpO1xuaXNOYXQobmF0KXx8RmFpbCBgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmA7XG5yZXR1cm4gTmF0KG5hdCk7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eToobmF0KT0+bmF0PT09ZW1wdHksXG5kb0lzR1RFOihsZWZ0LHJpZ2h0KT0+bGVmdD49cmlnaHQsXG5kb0lzRXF1YWw6KGxlZnQscmlnaHQpPT5sZWZ0PT09cmlnaHQsXG4vKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuZG9BZGQ6KGxlZnQscmlnaHQpPT5sZWZ0K3JpZ2h0LFxuZG9TdWJ0cmFjdDoobGVmdCxyaWdodCk9Pk5hdChsZWZ0LXJpZ2h0KX0pOyRo4oCNX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGNJkNqfBwAAnwcAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCIuLi90eXBlcy1hbWJpZW50LmpzIl0sImV4cG9ydHMiOlsic2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0S2V5LGVsZW1lbnRzSXNTdXBlcnNldCxlbGVtZW50c0Rpc2pvaW50VW5pb24sZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LGNvZXJjZVRvRWxlbWVudHMsZWxlbWVudHNDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChlbGVtZW50c0lzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY29lcmNlVG9FbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIE9wZXJhdGlvbnMgZm9yIGFycmF5cyB3aXRoIHVuaXF1ZSBvYmplY3RzIGlkZW50aWZ5aW5nIGFuZCBwcm92aWRpbmcqL1xuLyogaW5mb3JtYXRpb24gYWJvdXQgZGlnaXRhbCBhc3NldHMuIFVzZWQgZm9yIFpvZSBpbnZpdGVzLiovXG4vKiogQHR5cGUge1NldFZhbHVlfSAqL1xuY29uc3QgZW1wdHk9aGFyZGVuKFtdKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlIGFycmF5LWJhc2VkIFNldE1hdGggd2l0aCBDb3B5U2V0LWJhc2VkIENvcHlTZXRNYXRoXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8U2V0VmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgc2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihsaXN0KT0+e1xubGlzdD1jb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuLyogQXNzZXJ0IHRoYXQgbGlzdCBjb250YWlucyBvbmx5Ki9cbi8qICogcGFzcy1ieS1jb3B5IHByaW1pdGl2ZXMsKi9cbi8qICogcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnMgY29udGFpbmluZyBrZXlzLCovXG4vKiAqIHJlbW90YWJsZXMuKi9cbmFzc2VydEtleShsaXN0KTtcbnJldHVybiBsaXN0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGxpc3QpPT5wYXNzU3R5bGVPZihsaXN0KT09PSdjb3B5QXJyYXknJiZsaXN0Lmxlbmd0aD09PTAsXG5kb0lzR1RFOmVsZW1lbnRzSXNTdXBlcnNldCxcbmRvSXNFcXVhbDooeCx5KT0+ZWxlbWVudHNDb21wYXJlKHgseSk9PT0wLFxuZG9BZGQ6ZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDplbGVtZW50c0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLnNldE1hdGhIZWxwZXJzKHNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRNYXRoSGVscGVycyI6WyJzZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACwOKgfpQQAAKUEAAAjAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHByZXBhcmVFeG9DbGFzczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBQYXltZW50SVxuICogQHJldHVybnMgeygpID0+IFBheW1lbnQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUGF5bWVudEtpbmQ9KGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk9PntcbmNvbnN0IG1ha2VQYXltZW50PXByZXBhcmVFeG9DbGFzcyhcbmlzc3VlckJhZ2dhZ2UsXG4gYCR7bmFtZX0gcGF5bWVudGAsXG5QYXltZW50SSxcbmluaXRFbXB0eSxcbntcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH19KTtcblxuXG5yZXR1cm4gbWFrZVBheW1lbnQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50S2luZChwcmVwYXJlUGF5bWVudEtpbmQpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRLaW5kIjpbInByZXBhcmVQYXltZW50S2luZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADzN2zfwzEAAMMxAAApAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIi4vYW1vdW50TWF0aC5qcyIsIi4vcGF5bWVudC5qcyIsIi4vcHVyc2UuanMiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLG11c3RNYXRjaCxNLGtleUVRLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByZXBhcmVFeG8scHJvdmlkZSxBbW91bnRNYXRoLHByZXBhcmVQYXltZW50S2luZCxwcmVwYXJlUHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9cIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG8gPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRLaW5kXCIsIFskaOKAjV9hID0+IChwcmVwYXJlUGF5bWVudEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1wicHJlcGFyZVB1cnNlS2luZFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVB1cnNlS2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLCBbJGjigI1fYSA9PiAoQnJhbmRJID0gJGjigI1fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLCBbJGjigI1fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKi9cbmNvbnN0IGFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZT0oYnJhbmQsYXNzZXRLaW5kLGVsZW1lbnRTaGFwZSk9PntcbmxldCB2YWx1ZVNoYXBlO1xuc3dpdGNoKGFzc2V0S2luZCl7XG5jYXNlJ25hdCc6e1xudmFsdWVTaGFwZT1NLm5hdCgpO1xuZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkfHxcbkZhaWwgYEZ1bmdpYmxlIGFzc2V0cyBjYW5ub3QgaGF2ZSBhbiBlbGVtZW50U2hhcGU6ICR7cShlbGVtZW50U2hhcGUpfWA7XG5icmVhaztcbiB9XG5jYXNlJ3NldCc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmFycmF5T2YoTS5hbmQoTS5rZXkoKSxlbGVtZW50U2hhcGUpKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlTZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uc2V0KCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYmFnKCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uYmFnT2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbkZhaWwgYHVuZXhwZWN0ZWQgYXNzZXQga2luZCAke3EoYXNzZXRLaW5kKX1gO1xuIH19XG5cblxuY29uc3QgYW1vdW50U2hhcGU9aGFyZGVuKHtcbmJyYW5kLC8qIG1hdGNoZXMgb25seSB0aGlzIGV4YWN0IGJyYW5kKi9cbnZhbHVlOnZhbHVlU2hhcGV9KTtcblxucmV0dXJuIGFtb3VudFNoYXBlO1xuIH07XG5cbi8qKlxuICogTWFrZSB0aGUgcGF5bWVudExlZGdlciwgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGJhbGFuY2VzIG9mIHBheW1lbnRzLiBBbGxcbiAqIG1pbnRpbmcgYW5kIHRyYW5zZmVyIGF1dGhvcml0eSBvcmlnaW5hdGVzIGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge0Rpc3BsYXlJbmZvPEs+fSBkaXNwbGF5SW5mb1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdXG4gKiBAcmV0dXJucyB7UGF5bWVudExlZGdlcjxLPn1cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVQYXltZW50TGVkZ2VyPShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5lbGVtZW50U2hhcGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuLyoqIEB0eXBlIHtCcmFuZDxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIGNhbGxXaGVuKi9cbmNvbnN0IGJyYW5kPXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gYnJhbmRgLEJyYW5kSSx7XG5pc015SXNzdWVyKGFsbGVnZWRJc3N1ZXIpe1xuLyogQnJhbmRJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBhbGxlZ2VkSXNzdWVyYCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gYWxsZWdlZElzc3Vlcj09PWlzc3VlcjtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG4vKiBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuKi9cbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbmdldEFtb3VudFNoYXBlKCl7XG5yZXR1cm4gYW1vdW50U2hhcGU7XG4gfX0pO1xuXG5cbmNvbnN0IGFtb3VudFNoYXBlPWFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZShcbmJyYW5kLFxuYXNzZXRLaW5kLFxuZWxlbWVudFNoYXBlKTtcblxuXG5jb25zdHtJc3N1ZXJJLE1pbnRJLFBheW1lbnRJLFB1cnNlSUtpdH09bWFrZUlzc3VlckludGVyZmFjZXMoXG5icmFuZCxcbmFzc2V0S2luZCxcbmFtb3VudFNoYXBlKTtcblxuXG5jb25zdCBtYWtlUGF5bWVudD1wcmVwYXJlUGF5bWVudEtpbmQoaXNzdWVyQmFnZ2FnZSxuYW1lLGJyYW5kLFBheW1lbnRJKTtcblxuLyoqIEB0eXBlIHtTaHV0ZG93bldpdGhGYWlsdXJlfSAqL1xuY29uc3Qgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZT0ocmVhc29uKT0+e1xuLyogVE9ETyBUaGlzIHNob3VsZCBhbHNvIGRlc3Ryb3kgbGVkZ2VyIHN0YXRlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0Ki9cbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xudHJ5e1xub3B0U2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pO1xuIH1jYXRjaChlcnJJblNodXRkb3duKXtcbmFzc2VydC5ub3RlKGVyckluU2h1dGRvd24sWCBgQ2F1c2VkIGJ5OiAke3JlYXNvbn1gKTtcbnRocm93IGVyckluU2h1dGRvd247XG4gfVxuIH1cbnRocm93IHJlYXNvbjtcbiB9O1xuXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBBbW91bnQ+fSAqL1xuY29uc3QgcGF5bWVudExlZGdlcj1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShcbmlzc3VlckJhZ2dhZ2UsXG4ncGF5bWVudExlZGdlcicsXG57dmFsdWVTaGFwZTphbW91bnRTaGFwZX0pO1xuXG5cbi8qKlxuICogQSB3aXRoZHJhd24gbGl2ZSBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjb3Zlcnkgc2V0IG9mIHRoZSBwdXJzZVxuICogaXQgd2FzIHdpdGhkcmF3biBmcm9tLiBMZXQncyBjYWxsIHRoZXNlIFwicmVjb3ZlcmFibGVcIiBwYXltZW50cy4gQWxsXG4gKiByZWNvdmVyYWJsZSBwYXltZW50cyBhcmUgbGl2ZSwgYnV0IG5vdCBhbGwgbGl2ZSBwYXltZW50cyBhcmUgcmVjb3ZlcmFibGUuXG4gKiBXZSBkbyB0aGUgYm9va2tlZXBpbmcgZm9yIHBheW1lbnQgcmVjb3Zlcnkgd2l0aCB0aGlzIHdlYWttYXAgZnJvbVxuICogcmVjb3ZlcmFibGUgcGF5bWVudHMgdG8gdGhlIHJlY292ZXJ5IHNldCB0aGV5IGFyZSBpbi4gQSBidW5jaCBvZlxuICogaW50ZXJlc3RpbmcgaW52YXJpYW50cyBoZXJlOlxuICpcbiAqIC0gRXZlcnkgcGF5bWVudCB0aGF0IGlzIGEga2V5IGluIHRoZSBvdXRlciBgcGF5bWVudFJlY292ZXJ5U2V0c2Agd2Vha01hcCBpc1xuICogICBhbHNvIGluIHRoZSByZWNvdmVyeSBzZXQgaW5kZXhlZCBieSB0aGF0IHBheW1lbnQuXG4gKiAtIEltcGxpZWQgYnkgdGhlIGFib3ZlIGJ1dCB3b3J0aCBzdGF0aW5nOiB0aGUgcGF5bWVudCBpcyBvbmx5IGluIGF0IG1vc3Qgb25lXG4gKiAgIHJlY292ZXJ5IHNldC5cbiAqIC0gQSByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBzdWNoIHBheW1lbnRzLlxuICogLSBFdmVyeSBwdXJzZSBpcyBhc3NvY2lhdGVkIHdpdGggZXhhY3RseSBvbmUgcmVjb3Zlcnkgc2V0IHVuaXF1ZSB0byBpdC5cbiAqIC0gQSBwdXJzZSdzIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tIHRoYXQgcHVyc2UgYW5kXG4gKiAgIG5vdCB5ZXQgY29uc3VtZWQuXG4gKlxuICogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBTZXRTdG9yZTxQYXltZW50Pj59XG4gKi9cbmNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHM9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRSZWNvdmVyeVNldHMnKTtcblxuXG4vKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgaW5pdFBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5IGNhbGwgdG8gYHBheW1lbnRMZWRnZXIuaW5pdGAuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSBbb3B0UmVjb3ZlcnlTZXRdXG4gKi9cbmNvbnN0IGluaXRQYXltZW50PShwYXltZW50LGFtb3VudCxvcHRSZWNvdmVyeVNldD11bmRlZmluZWQpPT57XG5pZihvcHRSZWNvdmVyeVNldCE9PXVuZGVmaW5lZCl7XG5vcHRSZWNvdmVyeVNldC5hZGQocGF5bWVudCk7XG5wYXltZW50UmVjb3ZlcnlTZXRzLmluaXQocGF5bWVudCxvcHRSZWNvdmVyeVNldCk7XG4gfVxucGF5bWVudExlZGdlci5pbml0KHBheW1lbnQsYW1vdW50KTtcbiB9O1xuXG4vKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgZGVsZXRlUGF5bWVudGAgc2hvdWxkIGNvbnRhaW4gdGhlIG9ubHkgY2FsbCB0byBgcGF5bWVudExlZGdlci5kZWxldGVgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICovXG5jb25zdCBkZWxldGVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG5pZihwYXltZW50UmVjb3ZlcnlTZXRzLmhhcyhwYXltZW50KSl7XG5jb25zdCByZWNvdmVyeVNldD1wYXltZW50UmVjb3ZlcnlTZXRzLmdldChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuZGVsZXRlKHBheW1lbnQpO1xucmVjb3ZlcnlTZXQuZGVsZXRlKHBheW1lbnQpO1xuIH1cbiB9O1xuXG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IEFtb3VudH0gKi9cbmNvbnN0IGFkZD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguYWRkKGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBBbW91bnR9ICovXG5jb25zdCBzdWJ0cmFjdD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguc3VidHJhY3QobGVmdCxyaWdodCxicmFuZCk7XG4vKiogQHR5cGUgeyhhbGxlZ2VkQW1vdW50OiBBbW91bnQpID0+IEFtb3VudH0gKi9cbmNvbnN0IGNvZXJjZT0oYWxsZWdlZEFtb3VudCk9PkFtb3VudE1hdGguY29lcmNlKGJyYW5kLGFsbGVnZWRBbW91bnQpO1xuLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBib29sZWFufSAqL1xuXG4vKipcbiAqIE1ldGhvZHMgbGlrZSBkZXBvc2l0KCkgaGF2ZSBhbiBvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyIGBvcHRBbW91bnRTaGFwZWBcbiAqIHdoaWNoLCBpZiBwcmVzZW50LCBpcyBzdXBwb3NlZCB0byBtYXRjaCB0aGUgYmFsYW5jZSBvZiB0aGUgcGF5bWVudC4gVGhpc1xuICogaGVscGVyIGZ1bmN0aW9uIGRvZXMgdGhhdCBjaGVjay5cbiAqXG4gKiBOb3RlOiBgb3B0QW1vdW50U2hhcGVgIGlzIHVzZXItc3VwcGxpZWQgd2l0aCBubyBwcmV2aW91cyB2YWxpZGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBwYXltZW50QmFsYW5jZVxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgYXNzZXJ0QW1vdW50Q29uc2lzdGVudD0ocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpPT57XG5pZihvcHRBbW91bnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2gocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUsJ2Ftb3VudCcpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydExpdmVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5oYXMocGF5bWVudCl8fFxuRmFpbCBgJHtwYXltZW50fSB3YXMgbm90IGEgbGl2ZSBwYXltZW50IGZvciBicmFuZCAke3EoXG5icmFuZClcbiB9LiBJdCBjb3VsZCBiZSBhIHVzZWQtdXAgcGF5bWVudCwgYSBwYXltZW50IGZvciBhbm90aGVyIGJyYW5kLCBvciBpdCBtaWdodCBub3QgYmUgYSBwYXltZW50IGF0IGFsbC5gO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2UuZGVwb3NpdFxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlIGJlZm9yZSBhXG4gKiAgIGRlcG9zaXRcbiAqIEBwYXJhbSB7KG5ld1B1cnNlQmFsYW5jZTogQW1vdW50KSA9PiB2b2lkfSB1cGRhdGVQdXJzZUJhbGFuY2UgLSBjb21taXQgdGhlXG4gKiAgIHB1cnNlIGJhbGFuY2VcbiAqIEBwYXJhbSB7UGF5bWVudH0gc3JjUGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG5jb25zdCBkZXBvc2l0SW50ZXJuYWw9KFxuY3VycmVudEJhbGFuY2UsXG51cGRhdGVQdXJzZUJhbGFuY2UsXG5zcmNQYXltZW50LFxub3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKT0+XG57XG4haXNQcm9taXNlKHNyY1BheW1lbnQpfHxcbmFzc2VydC5mYWlsKFxuIGBkZXBvc2l0IGRvZXMgbm90IGFjY2VwdCBwcm9taXNlcyBhcyBmaXJzdCBhcmd1bWVudC4gSW5zdGVhZCBvZiBwYXNzaW5nIHRoZSBwcm9taXNlIChkZXBvc2l0KHBheW1lbnRQcm9taXNlKSksIGNvbnNpZGVyIHVud3JhcHBpbmcgdGhlIHByb21pc2UgZmlyc3Q6IEUud2hlbihwYXltZW50UHJvbWlzZSwgKGFjdHVhbFBheW1lbnQgPT4gZGVwb3NpdChhY3R1YWxQYXltZW50KSlgLFxuVHlwZUVycm9yKTtcblxuYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG5jb25zdCBzcmNQYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQoc3JjUGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xuY29uc3QgbmV3UHVyc2VCYWxhbmNlPWFkZChzcmNQYXltZW50QmFsYW5jZSxjdXJyZW50QmFsYW5jZSk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQqL1xuLyogTW92ZSB0aGUgYXNzZXRzIGluIGBzcmNQYXltZW50YCBpbnRvIHRoaXMgcHVyc2UsIHVzaW5nIHVwIHRoZSovXG4vKiBzb3VyY2UgcGF5bWVudCwgc3VjaCB0aGF0IHRvdGFsIGFzc2V0cyBhcmUgY29uc2VydmVkLiovXG5kZWxldGVQYXltZW50KHNyY1BheW1lbnQpO1xudXBkYXRlUHVyc2VCYWxhbmNlKG5ld1B1cnNlQmFsYW5jZSk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2Uud2l0aGRyYXdcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gY3VycmVudEJhbGFuY2UgLSB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoZSBwdXJzZSBiZWZvcmUgYVxuICogICB3aXRoZHJhd2FsXG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC0gY29tbWl0IHRoZVxuICogICBwdXJzZSBiYWxhbmNlXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50IC0gdGhlIGFtb3VudCB0byBiZSB3aXRoZHJhd25cbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IHJlY292ZXJ5U2V0XG4gKiBAcmV0dXJucyB7UGF5bWVudH1cbiAqL1xuY29uc3Qgd2l0aGRyYXdJbnRlcm5hbD0oXG5jdXJyZW50QmFsYW5jZSxcbnVwZGF0ZVB1cnNlQmFsYW5jZSxcbmFtb3VudCxcbnJlY292ZXJ5U2V0KT0+XG57XG5hbW91bnQ9Y29lcmNlKGFtb3VudCk7XG5BbW91bnRNYXRoLmlzR1RFKGN1cnJlbnRCYWxhbmNlLGFtb3VudCl8fFxuRmFpbCBgV2l0aGRyYXdhbCBvZiAke2Ftb3VudH0gZmFpbGVkIGJlY2F1c2UgdGhlIHB1cnNlIG9ubHkgY29udGFpbmVkICR7Y3VycmVudEJhbGFuY2V9YDtcbmNvbnN0IG5ld1B1cnNlQmFsYW5jZT1zdWJ0cmFjdChjdXJyZW50QmFsYW5jZSxhbW91bnQpO1xuXG5jb25zdCBwYXltZW50PW1ha2VQYXltZW50KCk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQgTW92ZSB0aGUgd2l0aGRyYXduIGFzc2V0cyBmcm9tIHRoaXMgcHVyc2UgaW50byovXG4vKiBwYXltZW50LiBUb3RhbCBhc3NldHMgbXVzdCByZW1haW4gY29uc2VydmVkLiovXG51cGRhdGVQdXJzZUJhbGFuY2UobmV3UHVyc2VCYWxhbmNlKTtcbmluaXRQYXltZW50KHBheW1lbnQsYW1vdW50LHJlY292ZXJ5U2V0KTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gcGF5bWVudDtcbiB9O1xuXG5jb25zdCBtYWtlRW1wdHlQdXJzZT1wcmVwYXJlUHVyc2VLaW5kKFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5icmFuZCxcblB1cnNlSUtpdCxcbmhhcmRlbih7XG5kZXBvc2l0SW50ZXJuYWwsXG53aXRoZHJhd0ludGVybmFsfSkpO1xuXG5cblxuLyoqIEB0eXBlIHtJc3N1ZXI8Sz59ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QgZHVlIHRvIGNhbGxXaGVuIGRpc2NyZXBhbmN5Ki9cbmNvbnN0IGlzc3Vlcj1wcmVwYXJlRXhvKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IGlzc3VlcmAsSXNzdWVySSx7XG5nZXRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH0sXG5nZXRBbGxlZ2VkTmFtZSgpe1xucmV0dXJuIG5hbWU7XG4gfSxcbmdldEFzc2V0S2luZCgpe1xucmV0dXJuIGFzc2V0S2luZDtcbiB9LFxuZ2V0RGlzcGxheUluZm8oKXtcbnJldHVybiBkaXNwbGF5SW5mbztcbiB9LFxubWFrZUVtcHR5UHVyc2UoKXtcbnJldHVybiBtYWtlRW1wdHlQdXJzZSgpO1xuIH0sXG4vKiogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW4gKi9cbmlzTGl2ZShwYXltZW50KXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbnJldHVybiBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KTtcbiB9LFxuLyoqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudCBhd2FpdGVkIGJ5IGNhbGxXaGVuICovXG5nZXRBbW91bnRPZihwYXltZW50KXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xucmV0dXJuIHBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuIH0sXG4vKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudCBhd2FpdGVkIGJ5IGNhbGxXaGVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IG9wdEFtb3VudFNoYXBlXG4gKi9cbmJ1cm4ocGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG5jb25zdCBwYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5ULiovXG5kZWxldGVQYXltZW50KHBheW1lbnQpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBwYXltZW50QmFsYW5jZTtcbiB9fSk7XG5cblxuLyoqXG4gKiBQcm92aWRlcyBmb3IgdGhlIHJlY292ZXJ5IG9mIG5ld2x5IG1pbnRlZCBidXQgbm90LXlldC1kZXBvc2l0ZWQgcGF5bWVudHMuXG4gKlxuICogQmVjYXVzZSB0aGUgYG1pbnRSZWNvdmVyeVB1cnNlYCBpcyBwbGFjZWQgaW4gYmFnZ2FnZSwgZXZlbiBpZiB0aGUgY2FsbGVyIG9mXG4gKiBgbWFrZUlzc3VlcktpdGAgZHJvcHMgaXQgb24gdGhlIGZsb29yLCBpdCBjYW4gc3RpbGwgYmUgcmVjb3ZlcmVkIGluIGFuXG4gKiBlbWVyZ2VuY3kgdXBncmFkZS5cbiAqXG4gKiBAdHlwZSB7UHVyc2U8Sz59XG4gKi9cbmNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlPXByb3ZpZGUoaXNzdWVyQmFnZ2FnZSwnbWludFJlY292ZXJ5UHVyc2UnLCgpPT5cbm1ha2VFbXB0eVB1cnNlKCkpO1xuXG5cbi8qKiBAdHlwZSB7TWludDxLPn0gKi9cbmNvbnN0IG1pbnQ9cHJlcGFyZUV4byhpc3N1ZXJCYWdnYWdlLCBgJHtuYW1lfSBtaW50YCxNaW50SSx7XG5nZXRJc3N1ZXIoKXtcbnJldHVybiBpc3N1ZXI7XG4gfSxcbm1pbnRQYXltZW50KG5ld0Ftb3VudCl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNoZWNrZWQgY2FzdCovXG5uZXdBbW91bnQ9Y29lcmNlKG5ld0Ftb3VudCk7XG5tdXN0TWF0Y2gobmV3QW1vdW50LGFtb3VudFNoYXBlLCdtaW50ZWQgYW1vdW50Jyk7XG4vKiBgcmF3UGF5bWVudGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgcmVjb3Zlcnkgc2V0LCBhbmQqL1xuLyogc28gbXVzdCBub3QgZXNjYXBlLiovXG5jb25zdCByYXdQYXltZW50PW1ha2VQYXltZW50KCk7XG5pbml0UGF5bWVudChyYXdQYXltZW50LG5ld0Ftb3VudCx1bmRlZmluZWQpO1xuXG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZT1taW50UmVjb3ZlcnlQdXJzZS5nZXRDdXJyZW50QW1vdW50KCk7XG5taW50UmVjb3ZlcnlQdXJzZS5kZXBvc2l0KHJhd1BheW1lbnQsbmV3QW1vdW50KTtcbmNvbnN0IHBheW1lbnQ9bWludFJlY292ZXJ5UHVyc2Uud2l0aGRyYXcobmV3QW1vdW50KTtcbmNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlQWZ0ZXI9bWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xuYXNzZXJ0KGtleUVRKG1pbnRSZWNvdmVyeVB1cnNlQmVmb3JlLG1pbnRSZWNvdmVyeVB1cnNlQWZ0ZXIpKTtcbnJldHVybiBwYXltZW50O1xuIH19KTtcblxuXG5jb25zdCBpc3N1ZXJLaXQ9aGFyZGVuKHtpc3N1ZXIsbWludCxicmFuZCxtaW50UmVjb3ZlcnlQdXJzZX0pO1xucmV0dXJuIGlzc3VlcktpdDtcbiB9OyRo4oCNX29uY2UucHJlcGFyZVBheW1lbnRMZWRnZXIocHJlcGFyZVBheW1lbnRMZWRnZXIpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUGF5bWVudExlZGdlciI6WyJwcmVwYXJlUGF5bWVudExlZGdlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAQy9mwwA8AAMAPAAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3B1cnNlLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiLi9hbW91bnRNYXRoLmpzIiwiLi90cmFuc2llbnROb3RpZmllci5qcyJdLCJleHBvcnRzIjpbInByZXBhcmVQdXJzZUtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTSxwcmVwYXJlRXhvQ2xhc3NLaXQsbWFrZVNjYWxhckJpZ1NldFN0b3JlLEFtb3VudE1hdGgsbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaOKAjV9hKV1dLFtcIm1ha2VTY2FsYXJCaWdTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ1NldFN0b3JlID0gJGjigI1fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzXCIsIFtbXCJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICBwcmVwYXJlUHVyc2VLaW5kPShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5wdXJzZU1ldGhvZHMpPT5cbntcbmNvbnN0IGFtb3VudFNoYXBlPWJyYW5kLmdldEFtb3VudFNoYXBlKCk7XG5cbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG5jb25zdHtwcm92aWRlTm90aWZpZXIsdXBkYXRlOnVwZGF0ZUJhbGFuY2V9PW1ha2VUcmFuc2llbnROb3RpZmllcktpdCgpO1xuXG5jb25zdCB1cGRhdGVQdXJzZUJhbGFuY2U9KHN0YXRlLG5ld1B1cnNlQmFsYW5jZSxwdXJzZSk9PntcbnN0YXRlLmN1cnJlbnRCYWxhbmNlPW5ld1B1cnNlQmFsYW5jZTtcbnVwZGF0ZUJhbGFuY2UocHVyc2UscHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpKTtcbiB9O1xuXG4vKiAtIFRoaXMga2luZCBpcyBhIHBhaXIgb2YgcHVyc2UgYW5kIGRlcG9zaXRGYWNldCB0aGF0IGhhdmUgYSAxOjEqL1xuLyogY29ycmVzcG9uZGVuY2UuKi9cbi8qIC0gVGhleSBhcmUgdmlydHVhbGl6ZWQgdG9nZXRoZXIgdG8gc2hhcmUgYSBzaW5nbGUgc3RhdGUgcmVjb3JkLiovXG4vKiAtIEFuIGFsdGVybmF0aXZlIGRlc2lnbiBjb25zaWRlcmVkIHdhcyB0byBoYXZlIHRoaXMgcmV0dXJuIGEgUHVyc2UgYWxvbmUqL1xuLyogdGhhdCBjcmVhdGVkIGRlcG9zaXRGYWNldCBhcyBuZWVkZWQuIEJ1dCB0aGlzIGFwcHJvYWNoIGVuc3VyZXMgYSBjb25zdGFudCovXG4vKiBpZGVudGl0eSBmb3IgdGhlIGZhY2V0IGFuZCBleGVyY2lzZXMgdGhlIG11bHRpLWZhY2V0ZWQgb2JqZWN0IHN0eWxlLiovXG5jb25zdHtkZXBvc2l0SW50ZXJuYWwsd2l0aGRyYXdJbnRlcm5hbH09cHVyc2VNZXRob2RzO1xuY29uc3QgbWFrZVB1cnNlS2l0PXByZXBhcmVFeG9DbGFzc0tpdChcbmlzc3VlckJhZ2dhZ2UsXG4gYCR7bmFtZX0gUHVyc2VgLFxuUHVyc2VJS2l0LFxuKCk9PntcbmNvbnN0IGN1cnJlbnRCYWxhbmNlPUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5cbi8qKiBAdHlwZSB7U2V0U3RvcmU8UGF5bWVudD59ICovXG5jb25zdCByZWNvdmVyeVNldD1tYWtlU2NhbGFyQmlnU2V0U3RvcmUoJ3JlY292ZXJ5IHNldCcse1xuZHVyYWJsZTp0cnVlfSk7XG5cblxucmV0dXJue1xuY3VycmVudEJhbGFuY2UsXG5yZWNvdmVyeVNldH07XG5cbiB9LFxue1xucHVyc2U6e1xuZGVwb3NpdChzcmNQYXltZW50LG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCl7XG4vKiBQdXJzZUkgZG9lcyAqbm90KiBkZWxheSBgZGVwb3NpdGAgdW50aWwgYHNyY1BheW1lbnRgIGlzIGZ1bGZ1bGxlZC4qL1xuLyogU2VlIHRoZSBjb21tZW50cyBvbiBQdXJzZUkuZGVwb3NpdCBpbiB0eXBlR3VhcmRzLmpzKi9cbmNvbnN0e3N0YXRlfT10aGlzO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIGRlcG9zaXQuKi9cbnJldHVybiBkZXBvc2l0SW50ZXJuYWwoXG5zdGF0ZS5jdXJyZW50QmFsYW5jZSxcbihuZXdQdXJzZUJhbGFuY2UpPT5cbnVwZGF0ZVB1cnNlQmFsYW5jZShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UsdGhpcy5mYWNldHMucHVyc2UpLFxuc3JjUGF5bWVudCxcbm9wdEFtb3VudFNoYXBlKTtcblxuIH0sXG53aXRoZHJhdyhhbW91bnQpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gd2l0aGRyYXcuKi9cbnJldHVybiB3aXRoZHJhd0ludGVybmFsKFxuc3RhdGUuY3VycmVudEJhbGFuY2UsXG4obmV3UHVyc2VCYWxhbmNlKT0+XG51cGRhdGVQdXJzZUJhbGFuY2Uoc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHRoaXMuZmFjZXRzLnB1cnNlKSxcbmFtb3VudCxcbnN0YXRlLnJlY292ZXJ5U2V0KTtcblxuIH0sXG5nZXRDdXJyZW50QW1vdW50KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5jdXJyZW50QmFsYW5jZTtcbiB9LFxuZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyKCl7XG5yZXR1cm4gcHJvdmlkZU5vdGlmaWVyKHRoaXMuZmFjZXRzLnB1cnNlKTtcbiB9LFxuZ2V0QWxsZWdlZEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5nZXREZXBvc2l0RmFjZXQoKXtcbnJldHVybiB0aGlzLmZhY2V0cy5kZXBvc2l0RmFjZXQ7XG4gfSxcblxuZ2V0UmVjb3ZlcnlTZXQoKXtcbnJldHVybiB0aGlzLnN0YXRlLnJlY292ZXJ5U2V0LnNuYXBzaG90KCk7XG4gfSxcbnJlY292ZXJBbGwoKXtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcbmxldCBhbW91bnQ9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbmZvcihjb25zdCBwYXltZW50IG9mIHN0YXRlLnJlY292ZXJ5U2V0LmtleXMoKSl7XG4vKiBUaGlzIGRvZXMgY2F1c2UgZGVsZXRpb25zIGZyb20gdGhlIHNldCB3aGlsZSBpdGVyYXRpbmcsKi9cbi8qIGJ1dCB0aGlzIHNwZWNpYWwgY2FzZSBpcyBhbGxvd2VkLiovXG5jb25zdCBkZWx0YT1mYWNldHMucHVyc2UuZGVwb3NpdChwYXltZW50KTtcbmFtb3VudD1BbW91bnRNYXRoLmFkZChhbW91bnQsZGVsdGEsYnJhbmQpO1xuIH1cbnN0YXRlLnJlY292ZXJ5U2V0LmdldFNpemUoKT09PTB8fFxuRmFpbCBgaW50ZXJuYWw6IFJlbWFpbmluZyB1bnJlY292ZXJlZCBwYXltZW50czogJHtmYWNldHMucHVyc2UuZ2V0UmVjb3ZlcnlTZXQoKX1gO1xucmV0dXJuIGFtb3VudDtcbiB9fSxcblxuZGVwb3NpdEZhY2V0OntcbnJlY2VpdmUoLi4uYXJncyl7XG5yZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiB9fX0sXG5cblxue1xuc3RhdGVTaGFwZTp7XG5jdXJyZW50QmFsYW5jZTphbW91bnRTaGFwZSxcbnJlY292ZXJ5U2V0Ok0ucmVtb3RhYmxlKCdyZWNvdmVyeVNldCcpfX0pO1xuXG5cblxucmV0dXJuKCk9Pm1ha2VQdXJzZUtpdCgpLnB1cnNlO1xuIH07JGjigI1fb25jZS5wcmVwYXJlUHVyc2VLaW5kKHByZXBhcmVQdXJzZUtpbmQpO1xuaGFyZGVuKHByZXBhcmVQdXJzZUtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQdXJzZUtpbmQiOlsicHJlcGFyZVB1cnNlS2luZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+rFNgFAYAABQGAAAtAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9ub3RpZmllciJdLCJleHBvcnRzIjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLHByb3ZpZGVMYXp5LG1ha2VOb3RpZmllcktpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcInByb3ZpZGVMYXp5XCIsIFskaOKAjV9hID0+IChwcm92aWRlTGF6eSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlTm90aWZpZXJLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VOb3RpZmllcktpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG5jb25zdCAgICAgICAgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0PSgpPT57XG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQdXJzZSwgTm90aWZpZXJSZWNvcmQ8YW55Pj59ICovXG5jb25zdCB0cmFuc2llbnROb3RpZmVyS2l0cz1tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKFxuJ3RyYW5zaWVudE5vdGlmZXJLaXRzJyk7XG5cblxuY29uc3QgcHJvdmlkZU5vdGlmaWVyS2l0PShrZXkpPT5cbnByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLGtleSwoKT0+XG5tYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSkpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcj0oa2V5KT0+cHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG5jb25zdCB1cGRhdGU9KGtleSxuZXdWYWx1ZSk9PntcbmlmKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKXtcbmNvbnN0e3VwZGF0ZXJ9PXRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xudXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gfVxuIH07XG5cbnJldHVybntwcm92aWRlTm90aWZpZXIsdXBkYXRlfTtcbiB9OyRo4oCNX29uY2UubWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG5oYXJkZW4obWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMUSFG7+JgAA/iYAACYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiQW1vdW50U2hhcGUiLCJBc3NldEtpbmRTaGFwZSIsIkJyYW5kSSIsIkJyYW5kU2hhcGUiLCJEZXBvc2l0RmFjZXRTaGFwZSIsIkRpc3BsYXlJbmZvU2hhcGUiLCJJc3N1ZXJLaXRTaGFwZSIsIklzc3VlclNoYXBlIiwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIiwiTWludFNoYXBlIiwiTm90aWZpZXJTaGFwZSIsIlBheW1lbnRTaGFwZSIsIlB1cnNlU2hhcGUiLCJSYXRpb1NoYXBlIiwiaXNDb3B5QmFnVmFsdWUiLCJpc0NvcHlTZXRWYWx1ZSIsImlzTmF0VmFsdWUiLCJpc1NldFZhbHVlIiwibWFrZUlzc3VlckludGVyZmFjZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTSxtYXRjaGVzOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0ICAgICAgICBCcmFuZFNoYXBlPU0ucmVtb3RhYmxlKCdCcmFuZCcpOyRo4oCNX29uY2UuQnJhbmRTaGFwZShCcmFuZFNoYXBlKTtcbmNvbnN0ICAgICAgICBJc3N1ZXJTaGFwZT1NLnJlbW90YWJsZSgnSXNzdWVyJyk7JGjigI1fb25jZS5Jc3N1ZXJTaGFwZShJc3N1ZXJTaGFwZSk7XG5jb25zdCAgICAgICAgUGF5bWVudFNoYXBlPU0ucmVtb3RhYmxlKCdQYXltZW50Jyk7JGjigI1fb25jZS5QYXltZW50U2hhcGUoUGF5bWVudFNoYXBlKTtcbmNvbnN0ICAgICAgICBQdXJzZVNoYXBlPU0ucmVtb3RhYmxlKCdQdXJzZScpOyRo4oCNX29uY2UuUHVyc2VTaGFwZShQdXJzZVNoYXBlKTtcbmNvbnN0ICAgICAgICBEZXBvc2l0RmFjZXRTaGFwZT1NLnJlbW90YWJsZSgnRGVwb3NpdEZhY2V0Jyk7JGjigI1fb25jZS5EZXBvc2l0RmFjZXRTaGFwZShEZXBvc2l0RmFjZXRTaGFwZSk7XG5jb25zdCAgICAgICAgTm90aWZpZXJTaGFwZT1NLnJlbW90YWJsZSgnTm90aWZpZXInKTskaOKAjV9vbmNlLk5vdGlmaWVyU2hhcGUoTm90aWZpZXJTaGFwZSk7XG5jb25zdCAgICAgICAgTWludFNoYXBlPU0ucmVtb3RhYmxlKCdNaW50Jyk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIE5hdFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXQgaXMgYVxuICogbm9uLW5lZ2F0aXZlIGJpZ2ludCwgdGhlbiBpdCByZXByZXNlbnRzIHRoYXQgbWFueSB1bml0cyBvZiB0aGUgZnVuZ2libGUgYXNzZXRcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50LiBUaGUgYnJhbmQgb2YgdGhhdCBhbW91bnQgc2hvdWxkIGluZGVlZCByZXByZXNlbnRcbiAqIGEga2luZCBvZiBhc3NldCBjb25zaXN0aW5nIG9mIGEgY291bnRhYmxlIHNldCBvZiBmdW5naWJsZSB1bml0cy5cbiAqLyRo4oCNX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlPU0ubmF0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlTZXQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgc2V0IG9mIHRob3NlIGtleXMsIHdoZXJlIGVhY2gga2V5XG4gKiByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBub24tZnVuZ2libGUgaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZVxuICogbm9uLWZ1bmdpYmxlIGFzc2V0IGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBhbW91bnRcbiAqIGl0c2VsZiByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlclxuICogaXRlbXMgZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlIHRoYXQgd2VcbiAqIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0IHRoZSBjb2RlIHRoYXQgaG9sZHNcbiAqIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBicmFuZCwgb25seVxuICogbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0cyBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnlcbiAqIGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5XG4gKiBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXQgd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlXG4gKiBzYXRpc2ZpZWQuIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5U2V0VmFsdWVTaGFwZT1NLnNldCgpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzIGFcbiAqIENvcHlBcnJheSBvZiBwYXNzYWJsZSBLZXlzLiBUaGlzIHJlcHJlc2VudGF0aW9uIGlzIGRlcHJlY2F0ZWQuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNoYW5nZSBmcm9tIHVzaW5nIGFycmF5LWJhc2VkIFNldFZhbHVlcyB0byBDb3B5U2V0LWJhc2VkXG4gKiAgIENvcHlTZXRWYWx1ZXMuXG4gKi9cbmNvbnN0IFNldFZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5QmFnVmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QmFnLCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIGJhZyAobXVsdGlzZXQpIG9mIHRob3NlIGtleXMsIHdoZXJlIGVhY2hcbiAqIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBzZW1pLWZ1bmdpYmxlIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCxcbiAqIGZyb20gdGhlIHNlbWktZnVuZ2libGUgYXNzZXQgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlXG4gKiBudW1iZXIgb2YgdGltZXMgdGhhdCBrZXkgYXBwZWFycyBpbiB0aGUgYmFnIGlzIHRoZSBudW1iZXIgb2YgZnVuZ2libGUgdW5pdHNcbiAqIG9mIHRoYXQga2V5LiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzIHRoZSBiYWcgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWRcbiAqIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXMgZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlIHRoYXQgd2VcbiAqIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0IHRoZSBjb2RlIHRoYXQgaG9sZHNcbiAqIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBicmFuZCwgb25seVxuICogbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0cyBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnlcbiAqIGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5XG4gKiBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXQgd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlXG4gKiBzYXRpc2ZpZWQuIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5QmFnVmFsdWVTaGFwZT1NLmJhZygpO1xuXG5jb25zdCBBbW91bnRWYWx1ZVNoYXBlPU0ub3IoXG5OYXRWYWx1ZVNoYXBlLFxuQ29weVNldFZhbHVlU2hhcGUsXG5TZXRWYWx1ZVNoYXBlLFxuQ29weUJhZ1ZhbHVlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBBbW91bnRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbnZhbHVlOkFtb3VudFZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLkFtb3VudFNoYXBlKEFtb3VudFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUmF0aW9TaGFwZT1oYXJkZW4oe1xubnVtZXJhdG9yOkFtb3VudFNoYXBlLFxuZGVub21pbmF0b3I6QW1vdW50U2hhcGV9KTtcblxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIE5hdCBiaWdpbnQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBYaW1wb3J0KCcuL3R5cGVzLmpzJykuTmF0VmFsdWV9XG4gKi8kaOKAjV9vbmNlLlJhdGlvU2hhcGUoUmF0aW9TaGFwZSk7XG5jb25zdCAgICAgICAgaXNOYXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLE5hdFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNOYXRWYWx1ZShpc05hdFZhbHVlKTtcbmhhcmRlbihpc05hdFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5U2V0XG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5U2V0fVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0VmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5U2V0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc0NvcHlTZXRWYWx1ZShpc0NvcHlTZXRWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5U2V0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIHBhc3MgYnkgY29weSBhcnJheSBzdHJ1Y3R1cmUuIERvZXMgbm90IGNoZWNrIGZvclxuICogZHVwbGljYXRlcy4gVG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMsIHVzZSBzZXRNYXRoSGVscGVycy5jb2VyY2UuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNoYW5nZSBmcm9tIHVzaW5nIGFycmF5LWJhc2VkIFNldFZhbHVlcyB0byBDb3B5U2V0LWJhc2VkXG4gKiAgIENvcHlTZXRWYWx1ZXMuXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFNldFZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLFNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNTZXRWYWx1ZShpc1NldFZhbHVlKTtcbmhhcmRlbihpc1NldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5QmFnXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5QmFnfVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnVmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5QmFnVmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vKiBPbmUgR09PR09MdGggc2hvdWxkIGJlIGVub3VnaCBkZWNpbWFsIHBsYWNlcyBmb3IgYW55Ym9keS4qL1xuY29uc3QgICAgICAgIE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUz0xMDA7JGjigI1fb25jZS5NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKTtcblxuY29uc3QgICAgICAgIEFzc2V0S2luZFNoYXBlPU0ub3IoJ25hdCcsJ3NldCcsJ2NvcHlTZXQnLCdjb3B5QmFnJyk7JGjigI1fb25jZS5Bc3NldEtpbmRTaGFwZShBc3NldEtpbmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBEaXNwbGF5SW5mb1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57fSxcbntcbmRlY2ltYWxQbGFjZXM6TS5hbmQoXG5NLmd0ZSgtTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbk0ubHRlKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUykpLFxuXG5hc3NldEtpbmQ6QXNzZXRLaW5kU2hhcGV9LFxuXG57XG4vKiBJbmNsdWRpbmcgdGhpcyBlbXB0eSBgcmVzdGAgZW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciovXG4vKiBwcm9wZXJ0aWVzIGJleW9uZCB0aG9zZSBpbiB0aGUgYGJhc2VgIHJlY29yZC4qL30pOyRo4oCNX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBJc3N1ZXJLaXRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbm1pbnQ6TWludFNoYXBlLFxubWludFJlY292ZXJ5UHVyc2U6UHVyc2VTaGFwZSxcbmlzc3VlcjpJc3N1ZXJTaGFwZSxcbmRpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9KTtcblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovJGjigI1fb25jZS5Jc3N1ZXJLaXRTaGFwZShJc3N1ZXJLaXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEk9TS5pbnRlcmZhY2UoJ0JyYW5kJyx7XG5pc015SXNzdWVyOk0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5nZXRBbW91bnRTaGFwZTpNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBbYnJhbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Fzc2V0S2luZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYW1vdW50U2hhcGVdXG4gKi8kaOKAjV9vbmNlLkJyYW5kSShCcmFuZEkpO1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJJbnRlcmZhY2VzPShcbmJyYW5kU2hhcGU9QnJhbmRTaGFwZSxcbmFzc2V0S2luZFNoYXBlPUFzc2V0S2luZFNoYXBlLFxuYW1vdW50U2hhcGU9QW1vdW50U2hhcGUpPT5cbntcbmNvbnN0IElzc3Vlckk9TS5pbnRlcmZhY2UoJ0lzc3Vlcicse1xuZ2V0QnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEFsbGVnZWROYW1lOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXRBc3NldEtpbmQ6TS5jYWxsKCkucmV0dXJucyhhc3NldEtpbmRTaGFwZSksXG5nZXREaXNwbGF5SW5mbzpNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxubWFrZUVtcHR5UHVyc2U6TS5jYWxsKCkucmV0dXJucyhQdXJzZVNoYXBlKSxcblxuaXNMaXZlOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldEFtb3VudE9mOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmJ1cm46TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLlxub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBNaW50ST1NLmludGVyZmFjZSgnTWludCcse1xuZ2V0SXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxubWludFBheW1lbnQ6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSl9KTtcblxuXG5jb25zdCBQYXltZW50ST1NLmludGVyZmFjZSgnUGF5bWVudCcse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSl9KTtcblxuXG5jb25zdCBQdXJzZUk9TS5pbnRlcmZhY2UoJ1B1cnNlJyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnQ6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXI6TS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBSYXRoZXIsIHRoZSBzZW1hbnRpY3Mgb2YgYGRlcG9zaXRgIHJlcXVpcmUgaXQgdG8gcHJvdmlkZSBpdHMqL1xuLyogY2FsbGVycyB3aXRoIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGBkZXBvc2l0YCBtZXNzYWdlcyBhcmUqL1xuLyogcHJvY2Vzc2VkIHdpdGhvdXQgZnVydGhlciBkZWxheSBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuKi9cbi8qIFB1cnNlSSB0aGVyZWZvcmUgcmVxdWlyZXMgdGhhdCB0aGUgYHNyY1BheW1lbnRgIGFyZ3VtZW50IGFscmVhZHkqL1xuLyogYmUgYSByZW1vdGFibGUsIG5vdCBhIHByb21pc2UuKi9cbi8qIFB1cnNlSSBvbmx5IGNhbGxzIHRoaXMgcmF3IG1ldGhvZCBhZnRlciB2YWxpZGF0aW5nIHRoYXQqL1xuLyogYHNyY1BheW1lbnRgIGlzIGEgcmVtb3RhYmxlLCBsZWF2aW5nIGl0Ki9cbi8qIHRvIHRoaXMgcmF3IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgcmVtb3RhYmxlIGlzIGFjdHVhbGx5Ki9cbi8qIGEgbGl2ZSBwYXltZW50IG9mIHRoZSBjb3JyZWN0IGJyYW5kIHdpdGggc3VmZmljaWVudCBmdW5kcy4qL1xuZGVwb3NpdDpNLmNhbGwoUGF5bWVudFNoYXBlKS5vcHRpb25hbChNLnBhdHRlcm4oKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXREZXBvc2l0RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG53aXRoZHJhdzpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmdldFJlY292ZXJ5U2V0Ok0uY2FsbCgpLnJldHVybnMoTS5zZXRPZihQYXltZW50U2hhcGUpKSxcbnJlY292ZXJBbGw6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBEZXBvc2l0RmFjZXRJPU0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLHtcbnJlY2VpdmU6UHVyc2VJLm1ldGhvZEd1YXJkcy5kZXBvc2l0fSk7XG5cblxuY29uc3QgUHVyc2VJS2l0PWhhcmRlbih7XG5wdXJzZTpQdXJzZUksXG5kZXBvc2l0RmFjZXQ6RGVwb3NpdEZhY2V0SX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuSXNzdWVySSxcbk1pbnRJLFxuUGF5bWVudEksXG5QdXJzZUlLaXR9KTtcblxuIH07JGjigI1fb25jZS5tYWtlSXNzdWVySW50ZXJmYWNlcyhtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG5oYXJkZW4obWFrZUlzc3VlckludGVyZmFjZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyYW5kU2hhcGUiOlsiQnJhbmRTaGFwZSJdLCJJc3N1ZXJTaGFwZSI6WyJJc3N1ZXJTaGFwZSJdLCJQYXltZW50U2hhcGUiOlsiUGF5bWVudFNoYXBlIl0sIlB1cnNlU2hhcGUiOlsiUHVyc2VTaGFwZSJdLCJEZXBvc2l0RmFjZXRTaGFwZSI6WyJEZXBvc2l0RmFjZXRTaGFwZSJdLCJOb3RpZmllclNoYXBlIjpbIk5vdGlmaWVyU2hhcGUiXSwiTWludFNoYXBlIjpbIk1pbnRTaGFwZSJdLCJBbW91bnRTaGFwZSI6WyJBbW91bnRTaGFwZSJdLCJSYXRpb1NoYXBlIjpbIlJhdGlvU2hhcGUiXSwiaXNOYXRWYWx1ZSI6WyJpc05hdFZhbHVlIl0sImlzQ29weVNldFZhbHVlIjpbImlzQ29weVNldFZhbHVlIl0sImlzU2V0VmFsdWUiOlsiaXNTZXRWYWx1ZSJdLCJpc0NvcHlCYWdWYWx1ZSI6WyJpc0NvcHlCYWdWYWx1ZSJdLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiOlsiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIl0sIkFzc2V0S2luZFNoYXBlIjpbIkFzc2V0S2luZFNoYXBlIl0sIkRpc3BsYXlJbmZvU2hhcGUiOlsiRGlzcGxheUluZm9TaGFwZSJdLCJJc3N1ZXJLaXRTaGFwZSI6WyJJc3N1ZXJLaXRTaGFwZSJdLCJCcmFuZEkiOlsiQnJhbmRJIl0sIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIjpbIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJfcusBrPwAAaz8AACkAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbW91bnQgQW1vdW50cyBhcmUgZGVzY3JpcHRpb25zIG9mIGRpZ2l0YWwgYXNzZXRzLFxuICogICBhbnN3ZXJpbmcgdGhlIHF1ZXN0aW9ucyBcImhvdyBtdWNoXCIgYW5kIFwib2Ygd2hhdCBraW5kXCIuIEFtb3VudHMgYXJlIHZhbHVlc1xuICogICBsYWJlbGVkIHdpdGggYSBicmFuZC4gQW1vdW50TWF0aCBleGVjdXRlcyB0aGUgbG9naWMgb2YgaG93IGFtb3VudHMgYXJlXG4gKiAgIGNoYW5nZWQgd2hlbiBkaWdpdGFsIGFzc2V0cyBhcmUgbWVyZ2VkLCBzZXBhcmF0ZWQsIG9yIG90aGVyd2lzZVxuICogICBtYW5pcHVsYXRlZC4gRm9yIGV4YW1wbGUsIGEgZGVwb3NpdCBvZiAyIGJ1Y2tzIGludG8gYSBwdXJzZSB0aGF0IGFscmVhZHlcbiAqICAgaGFzIDMgYnVja3MgZ2l2ZXMgYSBuZXcgcHVyc2UgYmFsYW5jZSBvZiA1IGJ1Y2tzLiBBbiBlbXB0eSBwdXJzZSBoYXMgMFxuICogICBidWNrcy4gQW1vdW50TWF0aCByZWxpZXMgaGVhdmlseSBvbiBwb2x5bW9ycGhpYyBNYXRoSGVscGVycywgd2hpY2hcbiAqICAgbWFuaXB1bGF0ZSB0aGUgdW5icmFuZGVkIHBvcnRpb24uXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtBc3NldFZhbHVlRm9yS2luZDxLPn0gdmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtOYXRWYWx1ZSB8IFNldFZhbHVlIHwgQ29weVNldCB8IENvcHlCYWd9IEFtb3VudFZhbHVlIEFuXG4gKiAgIGBBbW91bnRWYWx1ZWAgZGVzY3JpYmVzIGEgc2V0IG9yIHF1YW50aXR5IG9mIGFzc2V0cyB0aGF0IGNhbiBiZSBvd25lZCBvclxuICogICBzaGFyZWQuXG4gKlxuICogICBBIGZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQgdG8gcmVwcmVzZW50IGEgcXVhbnRpdHlcbiAqICAgb2YgdGhhdCBtYW55IGFzc2V0cy5cbiAqXG4gKiAgIEEgbm9uLWZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhbiBhcnJheSBvciBDb3B5U2V0IG9mIGBLZXlgcyB0byByZXByZXNlbnRcbiAqICAgYSBzZXQgb2Ygd2hhdGV2ZXIgYXNzZXQgZWFjaCBrZXkgcmVwcmVzZW50cy4gQSBgS2V5YCBpcyBhIHBhc3NhYmxlIHZhbHVlXG4gKiAgIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gZWxlbWVudCBpbiBhIHNldCAoU2V0U3RvcmUgb3IgQ29weVNldCkgb3IgYXMgdGhlIGtleVxuICogICBpbiBhIG1hcCAoTWFwU3RvcmUgb3IgQ29weU1hcCkuXG4gKlxuICogICBgU2V0VmFsdWVgIGlzIGZvciB0aGUgZGVwcmVjYXRlZCBzZXQgcmVwcmVzZW50YXRpb24sIHVzaW5nIGFuIGFycmF5IGRpcmVjdGx5XG4gKiAgIHRvIHJlcHJlc2VudCB0aGUgYXJyYXkgb2YgaXRzIGVsZW1lbnRzLiBgQ29weVNldGAgaXMgdGhlIHByb3BlclxuICogICByZXByZXNlbnRhdGlvbiB1c2luZyBhIENvcHlTZXQuXG4gKlxuICogICBBIHNlbWktZnVuZ2libGUgYENvcHlCYWdgIGlzIHJlcHJlc2VudGVkIGFzIGEgYENvcHlCYWdgIG9mIGBLZXlgIG9iamVjdHMuXG4gKiAgIFwiQmFnXCIgaXMgc3lub255bW91cyB3aXRoIE11bHRpU2V0LCB3aGVyZSBhbiBlbGVtZW50IG9mIGEgYmFnIGNhbiBiZSBwcmVzZW50XG4gKiAgIG9uY2Ugb3IgbW9yZSB0aW1lcywgaS5lLiwgc29tZSBwb3NpdGl2ZSBiaWdpbnQgbnVtYmVyIG9mIHRpbWVzLFxuICogICByZXByZXNlbnRpbmcgdGhhdCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgcmVwcmVzZW50ZWQgYnkgdGhhdCBrZXkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J25hdCcgfCAnc2V0JyB8ICdjb3B5U2V0JyB8ICdjb3B5QmFnJ30gQXNzZXRLaW5kIFNlZSBkb2MtY29tbWVudFxuICogICBmb3IgYEFtb3VudFZhbHVlYC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAdHlwZWRlZiB7SyBleHRlbmRzICduYXQnXG4gKiAgID8gTmF0VmFsdWVcbiAqICAgOiBLIGV4dGVuZHMgJ3NldCdcbiAqICAgPyBTZXRWYWx1ZVxuICogICA6IEsgZXh0ZW5kcyAnY29weVNldCdcbiAqICAgPyBDb3B5U2V0XG4gKiAgIDogSyBleHRlbmRzICdjb3B5QmFnJ1xuICogICA/IENvcHlCYWdcbiAqICAgOiBuZXZlcn0gQXNzZXRWYWx1ZUZvcktpbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtWIGV4dGVuZHMgTmF0VmFsdWVcbiAqICAgPyAnbmF0J1xuICogICA6IFYgZXh0ZW5kcyBTZXRWYWx1ZVxuICogICA/ICdzZXQnXG4gKiAgIDogViBleHRlbmRzIENvcHlTZXRcbiAqICAgPyAnY29weVNldCdcbiAqICAgOiBWIGV4dGVuZHMgQ29weUJhZ1xuICogICA/ICdjb3B5QmFnJ1xuICogICA6IG5ldmVyfSBBc3NldEtpbmRGb3JWYWx1ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlY2ltYWxQbGFjZXNdIFRlbGxzIHRoZSBkaXNwbGF5IHNvZnR3YXJlIGhvdyBtYW55XG4gKiAgIGRlY2ltYWwgcGxhY2VzIHRvIG1vdmUgdGhlIGRlY2ltYWwgb3ZlciB0byB0aGUgbGVmdCwgb3IgaW4gb3RoZXIgd29yZHMsXG4gKiAgIHdoaWNoIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHdob2xlIG51bWJlcnMuIFdlIHJlcXVpcmUgZnVuZ2libGUgZGlnaXRhbFxuICogICBhc3NldHMgdG8gYmUgcmVwcmVzZW50ZWQgaW4gaW50ZWdlcnMsIGluIHRoZSBzbWFsbGVzdCB1bml0IChpLmUuIFVTRCBtaWdodFxuICogICBiZSByZXByZXNlbnRlZCBpbiBtaWxsLCBhIHRob3VzYW5kdGggb2YgYSBkb2xsYXIuIEluIHRoYXQgY2FzZSxcbiAqICAgYGRlY2ltYWxQbGFjZXNgIHdvdWxkIGJlIDMuKSBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgZm9yXG4gKiAgIG5vbi1mdW5naWJsZSBkaWdpdGFsIGFzc2V0cywgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuIFRoZSBkZWNpbWFsUGxhY2VzXG4gKiAgIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGZvciBfZGlzcGxheSBwdXJwb3NlcyBvbmx5Xy4gQW55IG90aGVyIHVzZSBpcyBhblxuICogICBhbnRpLXBhdHRlcm4uXG4gKiBAcHJvcGVydHkge0t9IGFzc2V0S2luZCAtIHRoZSBraW5kIG9mIGFzc2V0LCBlaXRoZXIgQXNzZXRLaW5kLk5BVCAoZnVuZ2libGUpXG4gKiAgIG9yIEFzc2V0S2luZC5TRVQgb3IgQXNzZXRLaW5kLkNPUFlfU0VUIChub24tZnVuZ2libGUpXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gQnJhbmQgVGhlIGJyYW5kIGlkZW50aWZpZXMgdGhlIGtpbmQgb2YgaXNzdWVyLCBhbmQgaGFzIGFcbiAqICAgZnVuY3Rpb24gdG8gZ2V0IHRoZSBhbGxlZ2VkIG5hbWUgZm9yIHRoZSBraW5kIG9mIGFzc2V0IGRlc2NyaWJlZC4gVGhlXG4gKiAgIGFsbGVnZWQgbmFtZSAoc3VjaCBhcyAnQlRDJyBvciAnbW9vbGEnKSBpcyBwcm92aWRlZCBieSB0aGUgbWFrZXIgb2YgdGhlXG4gKiAgIGlzc3VlciBhbmQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIGFzIGFjY3VyYXRlLlxuICpcbiAqICAgRXZlcnkgYW1vdW50IGNyZWF0ZWQgYnkgYSBwYXJ0aWN1bGFyIEFtb3VudE1hdGggd2lsbCBzaGFyZSB0aGUgc2FtZSBicmFuZCxcbiAqICAgYnV0IHJlY2lwaWVudHMgY2Fubm90IHJlbHkgb24gdGhlIGJyYW5kIHRvIHZlcmlmeSB0aGF0IGEgcHVycG9ydGVkIGFtb3VudFxuICogICByZXByZXNlbnRzIHRoZSBpc3N1ZXIgdGhleSBpbnRlbmRlZCwgc2luY2UgdGhlIHNhbWUgYnJhbmQgY2FuIGJlIHJldXNlZCBieVxuICogICBhIG1pc2JlaGF2aW5nIGlzc3Vlci5cbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRJc3N1ZXI6IEVSZWY8SXNzdWVyPikgPT4gUHJvbWlzZTxib29sZWFuPn0gaXNNeUlzc3VlclxuICogICBTaG91bGQgYmUgdXNlZCB3aXRoIGBpc3N1ZXIuZ2V0QnJhbmRgIHRvIGVuc3VyZSBhbiBpc3N1ZXIgYW5kIGJyYW5kIG1hdGNoLlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldEFsbGVnZWROYW1lXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvPEs+fSBnZXREaXNwbGF5SW5mbyBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvd1xuICogICB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcHJvcGVydHkgeygpID0+IFBhdHRlcm59IGdldEFtb3VudFNoYXBlXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIElzc3VlciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJJc0xpdmUgUmV0dXJuIHRydWUgaWYgdGhlIHBheW1lbnQgY29udGludWVzIHRvIGV4aXN0LlxuICpcbiAqICAgSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uIHJlc29sdXRpb24uXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyR2V0QW1vdW50T2YgR2V0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQuXG4gKiAgIEJlY2F1c2UgdGhlIHBheW1lbnQgaXMgbm90IHRydXN0ZWQsIHdlIGNhbm5vdCBjYWxsIGEgbWV0aG9kIG9uIGl0IGRpcmVjdGx5LFxuICogICBhbmQgbXVzdCB1c2UgdGhlIGlzc3VlciBpbnN0ZWFkLlxuICpcbiAqICAgSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uIHJlc29sdXRpb24uXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFtb3VudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVyQnVybiBCdXJuIGFsbCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQuXG4gKiAgIGBvcHRBbW91bnRgIGlzIG9wdGlvbmFsLiBJZiBgb3B0QW1vdW50YCBpcyBwcmVzZW50LCB0aGUgY29kZSB3aWxsIGluc2lzdFxuICogICB0aGF0IHRoZSBhbW91bnQgb2YgdGhlIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50IGlzIGVxdWFsIHRvXG4gKiAgIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nIHBheW1lbnQgYW5kIG90aGVyIGNvbmZ1c2lvbi5cbiAqXG4gKiAgIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvbiByZXNvbHV0aW9uLlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtQcm9taXNlPEFtb3VudD59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckNsYWltIFRyYW5zZmVyIGFsbCBkaWdpdGFsIGFzc2V0cyBmcm9tIHRoZSBwYXltZW50IHRvIGEgbmV3XG4gKiAgIHBheW1lbnQgYW5kIGRlbGV0ZSB0aGUgb3JpZ2luYWwuIGBvcHRBbW91bnRgIGlzIG9wdGlvbmFsLiBJZiBgb3B0QW1vdW50YCBpc1xuICogICBwcmVzZW50LCB0aGUgY29kZSB3aWxsIGluc2lzdCB0aGF0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiAgIHBheW1lbnQgaXMgZXF1YWwgdG8gYG9wdEFtb3VudGAsIHRvIHByZXZlbnQgc2VuZGluZyB0aGUgd3JvbmcgcGF5bWVudCBhbmRcbiAqICAgb3RoZXIgY29uZnVzaW9uLlxuICpcbiAqICAgSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uIHJlc29sdXRpb24uXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckNvbWJpbmUgQ29tYmluZSBtdWx0aXBsZSBwYXltZW50cyBpbnRvIG9uZSBwYXltZW50LlxuICpcbiAqICAgSWYgYW55IG9mIHRoZSBwYXltZW50cyBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqICAgcmVzb2x1dGlvbi5cbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+PltdfSBwYXltZW50c0FycmF5XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gW29wdFRvdGFsQW1vdW50XVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlclNwbGl0IFNwbGl0IGEgc2luZ2xlIHBheW1lbnQgaW50byB0d28gcGF5bWVudHMsIEEgYW5kIEIsXG4gKiAgIGFjY29yZGluZyB0byB0aGUgcGF5bWVudEFtb3VudEEgcGFzc2VkIGluLlxuICpcbiAqICAgSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uIHJlc29sdXRpb24uXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBwYXltZW50QW1vdW50QVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPltdPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJTcGxpdE1hbnkgU3BsaXQgYSBzaW5nbGUgcGF5bWVudCBpbnRvIG1hbnkgcGF5bWVudHMsXG4gKiAgIGFjY29yZGluZyB0byB0aGUgYW1vdW50cyBwYXNzZWQgaW4uXG4gKlxuICogICBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb24gcmVzb2x1dGlvbi5cbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnRbXX0gYW1vdW50c1xuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFtdPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXIgVGhlIGlzc3VlciBjYW5ub3QgbWludCBhIG5ldyBhbW91bnQsIGJ1dCBpdCBjYW5cbiAqICAgY3JlYXRlIGVtcHR5IHB1cnNlcyBhbmQgcGF5bWVudHMuIFRoZSBpc3N1ZXIgY2FuIGFsc28gdHJhbnNmb3JtIHBheW1lbnRzXG4gKiAgIChzcGxpdHRpbmcgcGF5bWVudHMsIGNvbWJpbmluZyBwYXltZW50cywgYnVybmluZyBwYXltZW50cywgYW5kIGNsYWltaW5nXG4gKiAgIHBheW1lbnRzIGV4Y2x1c2l2ZWx5KS4gVGhlIGlzc3VlciBzaG91bGQgYmUgZ290dGVuIGZyb20gYSB0cnVzdGVkIHNvdXJjZVxuICogICBhbmQgdGhlbiByZWxpZWQgdXBvbiBhcyB0aGUgZGVjaWRlciBvZiB3aGV0aGVyIGFuIHVudHJ1c3RlZCBwYXltZW50IGlzXG4gKiAgIHZhbGlkLlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QnJhbmQgR2V0IHRoZSBCcmFuZCBmb3IgdGhpcyBJc3N1ZXIuIFRoZSBCcmFuZFxuICogICBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCBhbmQgaXMgc2hhcmVkIGJ5IHRoZSBtaW50LCB0aGUgaXNzdWVyLFxuICogICBhbmQgYW55IHB1cnNlcyBhbmQgcGF5bWVudHMgb2YgdGhpcyBwYXJ0aWN1bGFyIGtpbmQuIFRoZSBicmFuZCBpcyBub3RcbiAqICAgY2xvc2VseSBoZWxkLCBzbyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdHJ1c3RlZCB0byBpZGVudGlmeSBhbiBpc3N1ZXJcbiAqICAgYWxvbmUuIEZha2UgZGlnaXRhbCBhc3NldHMgYW5kIGFtb3VudCBjYW4gdXNlIGFub3RoZXIgaXNzdWVyJ3MgYnJhbmQuXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0QWxsZWdlZE5hbWUgR2V0IHRoZSBhbGxlZ2VkTmFtZSBmb3IgdGhpc1xuICogICBtaW50L2lzc3VlclxuICogQHByb3BlcnR5IHsoKSA9PiBBc3NldEtpbmR9IGdldEFzc2V0S2luZCBHZXQgdGhlIGtpbmQgb2YgTWF0aEhlbHBlcnMgdXNlZCBieVxuICogICB0aGlzIElzc3Vlci5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRGlzcGxheUluZm88Sz59IGdldERpc3BsYXlJbmZvIEdpdmUgaW5mb3JtYXRpb24gdG8gVUkgb24gaG93XG4gKiAgIHRvIGRpc3BsYXkgYW1vdW50cyBmb3IgdGhpcyBpc3N1ZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IFB1cnNlPEs+fSBtYWtlRW1wdHlQdXJzZSBNYWtlIGFuIGVtcHR5IHB1cnNlIG9mIHRoaXMgYnJhbmQuXG4gKiBAcHJvcGVydHkge0lzc3VlcklzTGl2ZX0gaXNMaXZlXG4gKiBAcHJvcGVydHkge0lzc3VlckdldEFtb3VudE9mPEs+fSBnZXRBbW91bnRPZlxuICogQHByb3BlcnR5IHtJc3N1ZXJCdXJufSBidXJuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUGF5bWVudExlZGdlclxuICogQHByb3BlcnR5IHtNaW50PEs+fSBtaW50XG4gKiBAcHJvcGVydHkge1B1cnNlPEs+fSBtaW50UmVjb3ZlcnlQdXJzZVxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJLaXRcbiAqIEBwcm9wZXJ0eSB7TWludDxLPn0gbWludFxuICogQHByb3BlcnR5IHtQdXJzZTxLPn0gbWludFJlY292ZXJ5UHVyc2VcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcHJvcGVydHkge0Rpc3BsYXlJbmZvfSBkaXNwbGF5SW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkaXRpb25hbERpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlY2ltYWxQbGFjZXNdIFRlbGxzIHRoZSBkaXNwbGF5IHNvZnR3YXJlIGhvdyBtYW55XG4gKiAgIGRlY2ltYWwgcGxhY2VzIHRvIG1vdmUgdGhlIGRlY2ltYWwgb3ZlciB0byB0aGUgbGVmdCwgb3IgaW4gb3RoZXIgd29yZHMsXG4gKiAgIHdoaWNoIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHdob2xlIG51bWJlcnMuIFdlIHJlcXVpcmUgZnVuZ2libGUgZGlnaXRhbFxuICogICBhc3NldHMgdG8gYmUgcmVwcmVzZW50ZWQgaW4gaW50ZWdlcnMsIGluIHRoZSBzbWFsbGVzdCB1bml0IChpLmUuIFVTRCBtaWdodFxuICogICBiZSByZXByZXNlbnRlZCBpbiBtaWxsLCBhIHRob3VzYW5kdGggb2YgYSBkb2xsYXIuIEluIHRoYXQgY2FzZSxcbiAqICAgYGRlY2ltYWxQbGFjZXNgIHdvdWxkIGJlIDMuKSBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgZm9yXG4gKiAgIG5vbi1mdW5naWJsZSBkaWdpdGFsIGFzc2V0cywgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuIFRoZSBkZWNpbWFsUGxhY2VzXG4gKiAgIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGZvciBfZGlzcGxheSBwdXJwb3NlcyBvbmx5Xy4gQW55IG90aGVyIHVzZSBpcyBhblxuICogICBhbnRpLXBhdHRlcm4uXG4gKiBAcHJvcGVydHkge0Fzc2V0S2luZH0gW2Fzc2V0S2luZF1cbiAqL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuU2h1dGRvd25XaXRoRmFpbHVyZX0gU2h1dGRvd25XaXRoRmFpbHVyZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNaW50IEhvbGRpbmcgYSBNaW50IGNhcnJpZXMgdGhlIHJpZ2h0IHRvIGlzc3VlIG5ldyBkaWdpdGFsXG4gKiAgIGFzc2V0cy4gVGhlc2UgYXNzZXRzIGFsbCBoYXZlIHRoZSBzYW1lIGtpbmQsIHdoaWNoIGlzIGNhbGxlZCBhIEJyYW5kLlxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXI8Sz59IGdldElzc3VlciBHZXRzIHRoZSBJc3N1ZXIgZm9yIHRoaXMgbWludC5cbiAqIEBwcm9wZXJ0eSB7KG5ld0Ftb3VudDogQW1vdW50PEs+KSA9PiBQYXltZW50PEs+fSBtaW50UGF5bWVudCBDcmVhdGVzIGEgbmV3XG4gKiAgIFBheW1lbnQgY29udGFpbmluZyBuZXdseSBtaW50ZWQgYW1vdW50LlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIERlcG9zaXRGYWNldFJlY2VpdmVcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVwb3NpdEZhY2V0XG4gKiBAcHJvcGVydHkge0RlcG9zaXRGYWNldFJlY2VpdmV9IHJlY2VpdmUgRGVwb3NpdCBhbGwgdGhlIGNvbnRlbnRzIG9mIHBheW1lbnRcbiAqICAgaW50byB0aGUgcHVyc2UgdGhhdCBtYWRlIHRoaXMgZmFjZXQsIHJldHVybmluZyB0aGUgYW1vdW50LiBJZiB0aGUgb3B0aW9uYWxcbiAqICAgYXJndW1lbnQgYG9wdEFtb3VudGAgZG9lcyBub3QgZXF1YWwgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGVcbiAqICAgcGF5bWVudCwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogICBJZiBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhyb3cgYW4gZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIFB1cnNlRGVwb3NpdFxuICogQHBhcmFtIHtQYXltZW50PEs+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUHVyc2UgUHVyc2VzIGhvbGQgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIG9mIHRoZSBzYW1lXG4gKiAgIGJyYW5kLCBidXQgdW5saWtlIFBheW1lbnRzLCB0aGV5IGFyZSBub3QgbWVhbnQgdG8gYmUgc2VudCB0byBvdGhlcnMuIFRvXG4gKiAgIHRyYW5zZmVyIGRpZ2l0YWwgYXNzZXRzLCBhIFBheW1lbnQgc2hvdWxkIGJlIHdpdGhkcmF3biBmcm9tIGEgUHVyc2UuIFRoZVxuICogICBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gYSBwdXJzZSBjYW4gY2hhbmdlIHRocm91Z2ggdGhlIGFjdGlvbiBvZlxuICogICBkZXBvc2l0KCkgYW5kIHdpdGhkcmF3KCkuXG4gKlxuICogICBUaGUgcHJpbWFyeSB1c2UgZm9yIFB1cnNlcyBhbmQgUGF5bWVudHMgaXMgZm9yIGN1cnJlbmN5LWxpa2UgYW5kIGdvb2RzLWxpa2VcbiAqICAgZGlnaXRhbCBhc3NldHMsIGJ1dCB0aGV5IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVwcmVzZW50IG90aGVyIGtpbmRzIG9mXG4gKiAgIHJpZ2h0cywgc3VjaCBhcyB0aGUgcmlnaHQgdG8gcGFydGljaXBhdGUgaW4gYSBwYXJ0aWN1bGFyIGNvbnRyYWN0LlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QWxsZWdlZEJyYW5kIEdldCB0aGUgYWxsZWdlZCBCcmFuZCBmb3IgdGhpc1xuICogICBQdXJzZVxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IGdldEN1cnJlbnRBbW91bnQgR2V0IHRoZSBhbW91bnQgY29udGFpbmVkIGluIHRoaXNcbiAqICAgcHVyc2UuXG4gKiBAcHJvcGVydHkgeygpID0+IExhdGVzdFRvcGljPEFtb3VudDxLPj59IGdldEN1cnJlbnRBbW91bnROb3RpZmllciBHZXQgYSBsb3NzeVxuICogICBub3RpZmllciBmb3IgY2hhbmdlcyB0byB0aGlzIHB1cnNlJ3MgYmFsYW5jZS5cbiAqIEBwcm9wZXJ0eSB7UHVyc2VEZXBvc2l0PEs+fSBkZXBvc2l0IERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG9cbiAqICAgdGhpcyBwdXJzZSwgcmV0dXJuaW5nIHRoZSBhbW91bnQuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgb3B0QW1vdW50YCBkb2VzXG4gKiAgIG5vdCBlcXVhbCB0aGUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiAgIElmIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aHJvdyBhbiBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRGVwb3NpdEZhY2V0fSBnZXREZXBvc2l0RmFjZXQgUmV0dXJuIGFuIG9iamVjdCB3aG9zZVxuICogICBgcmVjZWl2ZWAgbWV0aG9kIGRlcG9zaXRzIHRvIHRoZSBjdXJyZW50IFB1cnNlLlxuICogQHByb3BlcnR5IHsoYW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IHdpdGhkcmF3IFdpdGhkcmF3IGFtb3VudCBmcm9tXG4gKiAgIHRoaXMgcHVyc2UgaW50byBhIG5ldyBQYXltZW50LlxuICogQHByb3BlcnR5IHsoKSA9PiBDb3B5U2V0PFBheW1lbnQ8Sz4+fSBnZXRSZWNvdmVyeVNldCBUaGUgc2V0IG9mIHBheW1lbnRzXG4gKiAgIHdpdGhkcmF3biBmcm9tIHRoaXMgcHVyc2UgdGhhdCBhcmUgc3RpbGwgbGl2ZS4gVGhlc2UgYXJlIHRoZSBwYXltZW50cyB0aGF0XG4gKiAgIGNhbiBzdGlsbCBiZSByZWNvdmVyZWQgaW4gZW1lcmdlbmNpZXMgYnksIGZvciBleGFtcGxlLCBkZXBvc2l0aW5nIGludG8gdGhpc1xuICogICBwdXJzZS4gU3VjaCBhIGRlcG9zaXQgYWN0aW9uIGlzIGxpa2UgY2FuY2VsaW5nIGFuIG91dHN0YW5kaW5nIGNoZWNrIGJlY2F1c2VcbiAqICAgeW91J3JlIHRpcmVkIG9mIHdhaXRpbmcgZm9yIGl0LiBPbmNlIHlvdXIgY2FuY2VsbGF0aW9uIGlzIGFja25vd2xlZGdlZCwgeW91XG4gKiAgIGNhbiBzcGVuZCB0aGUgYXNzZXRzIGF0IHN0YWtlIG9uIG90aGVyIHRoaW5ncy4gQWZ0ZXJ3YXJkcywgaWYgdGhlIHJlY2lwaWVudFxuICogICBvZiB0aGUgb3JpZ2luYWwgY2hlY2sgZmluYWxseSBnZXRzIGFyb3VuZCB0byBkZXBvc2l0aW5nIGl0LCB0aGVpciBkZXBvc2l0XG4gKiAgIGZhaWxzLlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IHJlY292ZXJBbGwgRm9yIHVzZSBpbiBlbWVyZ2VuY2llcywgc3VjaCBhcyBjb21pbmdcbiAqICAgYmFjayBmcm9tIGEgdHJhdW1hdGljIGNyYXNoIGFuZCB1cGdyYWRlLiBUaGlzIGRlcG9zaXRzIGFsbCB0aGUgcGF5bWVudHMgaW5cbiAqICAgdGhpcyBwdXJzZSdzIHJlY292ZXJ5IHNldCBpbnRvIHRoZSBwdXJzZSBpdHNlbGYsIHJldHVybmluZyB0aGUgdG90YWwgYW1vdW50XG4gKiAgIG9mIGFzc2V0cyByZWNvdmVyZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUGF5bWVudCBQYXltZW50cyBob2xkIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBvZiB0aGUgc2FtZVxuICogICBicmFuZCBpbiB0cmFuc2l0LiBQYXltZW50cyBjYW4gYmUgZGVwb3NpdGVkIGluIHB1cnNlcywgc3BsaXQgaW50byBtdWx0aXBsZVxuICogICBwYXltZW50cywgY29tYmluZWQsIGFuZCBjbGFpbWVkIChnZXR0aW5nIGFuIGV4Y2x1c2l2ZSBwYXltZW50KS4gUGF5bWVudHNcbiAqICAgYXJlIGxpbmVhciwgbWVhbmluZyB0aGF0IGVpdGhlciBhIHBheW1lbnQgaGFzIHRoZSBzYW1lIGFtb3VudCBvZiBkaWdpdGFsXG4gKiAgIGFzc2V0cyBpdCBzdGFydGVkIHdpdGgsIG9yIGl0IGlzIHVzZWQgdXAgZW50aXJlbHkuIEl0IGlzIGltcG9zc2libGUgdG9cbiAqICAgcGFydGlhbGx5IHVzZSBhIHBheW1lbnQuXG4gKlxuICogICBQYXltZW50cyBhcmUgb2Z0ZW4gcmVjZWl2ZWQgZnJvbSBvdGhlciBhY3RvcnMgYW5kIHRoZXJlZm9yZSBzaG91bGQgbm90IGJlXG4gKiAgIHRydXN0ZWQgdGhlbXNlbHZlcy4gVG8gZ2V0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gYSBwYXltZW50LCB1c2VcbiAqICAgdGhlIHRydXN0ZWQgaXNzdWVyOiBpc3N1ZXIuZ2V0QW1vdW50T2YocGF5bWVudCksXG4gKlxuICogICBQYXltZW50cyBjYW4gYmUgY29udmVydGVkIHRvIFB1cnNlcyBieSBnZXR0aW5nIGEgdHJ1c3RlZCBpc3N1ZXIgYW5kIGNhbGxpbmdcbiAqICAgYGlzc3Vlci5tYWtlRW1wdHlQdXJzZSgpYCB0byBjcmVhdGUgYSBwdXJzZSwgdGhlblxuICogICBgcHVyc2UuZGVwb3NpdChwYXltZW50KWAuXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRBbGxlZ2VkQnJhbmQgR2V0IHRoZSBhbGxlZ2VkQnJhbmQsIGluZGljYXRpbmdcbiAqICAgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCB0aGlzIHBheW1lbnQgcHVycG9ydHMgdG8gYmUsIGFuZCB3aGljaCBpc3N1ZXIgdG9cbiAqICAgdXNlLiBCZWNhdXNlIHBheW1lbnRzIGFyZSBub3QgdHJ1c3RlZCwgYW55IG1ldGhvZCBjYWxscyBvbiBwYXltZW50cyBzaG91bGRcbiAqICAgYmUgdHJlYXRlZCB3aXRoIHN1c3BpY2lvbiBhbmQgdmVyaWZpZWQgZWxzZXdoZXJlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0aEhlbHBlcnMgQWxsIG9mIHRoZSBkaWZmZXJlbmNlIGluIGhvdyBkaWdpdGFsIGFzc2V0XG4gKiAgIGFtb3VudCBhcmUgbWFuaXB1bGF0ZWQgY2FuIGJlIHJlZHVjZWQgdG8gdGhlIGJlaGF2aW9yIG9mIHRoZSBtYXRoIG9uXG4gKiAgIHZhbHVlcy4gV2UgZXh0cmFjdCB0aGlzIGN1c3RvbSBsb2dpYyBpbnRvIG1hdGhIZWxwZXJzLiBNYXRoSGVscGVycyBhcmVcbiAqICAgYWJvdXQgdmFsdWUgYXJpdGhtZXRpYywgd2hlcmVhcyBBbW91bnRNYXRoIGlzIGFib3V0IGFtb3VudHMsIHdoaWNoIGFyZSB0aGVcbiAqICAgdmFsdWVzIGxhYmVsZWQgd2l0aCBhIGJyYW5kLiBBbW91bnRNYXRoIHVzZSBtYXRoSGVscGVycyB0byBkbyB0aGVpciB2YWx1ZVxuICogICBhcml0aG1ldGljLCBhbmQgdGhlbiBicmFuZCB0aGUgcmVzdWx0cywgbWFraW5nIGEgbmV3IGFtb3VudC5cbiAqXG4gKiAgIFRoZSBNYXRoSGVscGVycyBhcmUgZGVzaWduZWQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSBBbW91bnRNYXRoLCBhbmQgc28gYWxsXG4gKiAgIG1ldGhvZHMgYnV0IGNvZXJjZSBjYW4gYXNzdW1lIHRoZWlyIGlucHV0cyBhcmUgdmFsaWQuIFRoZXkgb25seSBuZWVkIHRvIGRvXG4gKiAgIG91dHB1dCB2YWxpZGF0aW9uLCBhbmQgb25seSB3aGVuIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgb2YgaW52YWxpZCBvdXRwdXQuXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkVmFsdWU6IFYpID0+IFZ9IGRvQ29lcmNlIENoZWNrIHRoZSBraW5kIG9mIHRoaXMgdmFsdWUgYW5kXG4gKiAgIHRocm93IGlmIGl0IGlzIG5vdCB0aGUgZXhwZWN0ZWQga2luZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVn0gZG9NYWtlRW1wdHkgR2V0IHRoZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGlkZW50aXR5XG4gKiAgIGVsZW1lbnQgKG9mdGVuIDAgb3IgYW4gZW1wdHkgYXJyYXkpXG4gKiBAcHJvcGVydHkgeyh2YWx1ZTogVikgPT4gYm9vbGVhbn0gZG9Jc0VtcHR5IElzIHRoZSB2YWx1ZSB0aGUgaWRlbnRpdHlcbiAqICAgZWxlbWVudD9cbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBib29sZWFufSBkb0lzR1RFIElzIHRoZSBsZWZ0IGdyZWF0ZXIgdGhhblxuICogICBvciBlcXVhbCB0byB0aGUgcmlnaHQ/XG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0VxdWFsIERvZXMgbGVmdCBlcXVhbCByaWdodD9cbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBWfSBkb0FkZCBSZXR1cm4gdGhlIGxlZnQgY29tYmluZWQgd2l0aCB0aGVcbiAqICAgcmlnaHQuXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gVn0gZG9TdWJ0cmFjdCBSZXR1cm4gd2hhdCByZW1haW5zIGFmdGVyXG4gKiAgIHJlbW92aW5nIHRoZSByaWdodCBmcm9tIHRoZSBsZWZ0LiBJZiBzb21ldGhpbmcgaW4gdGhlIHJpZ2h0IHdhcyBub3QgaW4gdGhlXG4gKiAgIGxlZnQsIHdlIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7YmlnaW50fSBOYXRWYWx1ZSAqL1xuXG4vKiogQHR5cGVkZWYge0tleVtdfSBTZXRWYWx1ZSAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACriiOmbAEAAGwBAAAmAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD3qap29AMAAPQDAAArAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnN0YW50cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiUGFyYW1UeXBlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogRW51bSBvZiBwYXJhbWV0ZXIgdHlwZXNcbiAqXG4gKiBVTktOT1dOIGlzIGFuIGVzY2FwZSBoYXRjaCBmb3IgdHlwZXMgd2UgaGF2ZW4ndCBhZGRlZCB5ZXQuIElmIHlvdSBhcmVcbiAqIGRldmVsb3BpbmcgYSBuZXcgY29udHJhY3QgYW5kIHVzZSBVTktOT1dOLCBwbGVhc2UgYWxzbyBmaWxlIGFuIGlzc3VlIHRvIGFza1xuICogdXMgdG8gc3VwcG9ydCB0aGUgbmV3IHR5cGUuXG4gKi9cbmNvbnN0ICAgICAgICBQYXJhbVR5cGVzPS8qKiBAdHlwZSB7Y29uc3R9ICove1xuQU1PVU5UOidhbW91bnQnLFxuQlJBTkQ6J2JyYW5kJyxcbklOU1RBTExBVElPTjonaW5zdGFsbGF0aW9uJyxcbklOU1RBTkNFOidpbnN0YW5jZScsXG5JTlZJVEFUSU9OOidpbnZpdGF0aW9uJyxcbk5BVDonbmF0JyxcblJBVElPOidyYXRpbycsXG5TVFJJTkc6J3N0cmluZycsXG5QQVNTQUJMRV9SRUNPUkQ6J3JlY29yZCcsXG5USU1FU1RBTVA6J3RpbWVzdGFtcCcsXG5SRUxBVElWRV9USU1FOidyZWxhdGl2ZVRpbWUnLFxuVU5LTk9XTjondW5rbm93bid9OyRo4oCNX29uY2UuUGFyYW1UeXBlcyhQYXJhbVR5cGVzKTtcblxuXG5oYXJkZW4oUGFyYW1UeXBlcyk7XG4vKiogQHR5cGVkZWYge3R5cGVvZiBQYXJhbVR5cGVzW2tleW9mIHR5cGVvZiBQYXJhbVR5cGVzXX0gUGFyYW1UeXBlICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUGFyYW1UeXBlcyI6WyJQYXJhbVR5cGVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD3iTkL8CwAA/AsAAD8AAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2Fzc2VydGlvbnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIl0sImV4cG9ydHMiOlsiYXNzZXJ0UmVsYXRpdmVUaW1lIiwiYXNzZXJ0VGltZXN0YW1wIiwibWFrZUFzc2VydEJyYW5kZWRSYXRpbyIsIm1ha2VBc3NlcnRJbnN0YWxsYXRpb24iLCJtYWtlQXNzZXJ0SW5zdGFuY2UiLCJtYWtlTG9va3NMaWtlQnJhbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNSZW1vdGFibGUsYXNzZXJ0SXNSYXRpbyxtdXN0TWF0Y2gsUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsVGltZXN0YW1wUmVjb3JkU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNSZW1vdGFibGVcIiwgWyRo4oCNX2EgPT4gKGlzUmVtb3RhYmxlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanNcIiwgW1tcImFzc2VydElzUmF0aW9cIiwgWyRo4oCNX2EgPT4gKGFzc2VydElzUmF0aW8gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUgPSAkaOKAjV9hKV1dLFtcIlRpbWVzdGFtcFJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lc3RhbXBSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0IG1ha2VMb29rc0xpa2VCcmFuZD0obmFtZSk9Pntcbi8qKiBAcGFyYW0ge0JyYW5kfSBicmFuZCAqL1xucmV0dXJuKGJyYW5kKT0+e1xuaXNSZW1vdGFibGUoYnJhbmQpfHxGYWlsIGB2YWx1ZSBmb3IgJHtuYW1lfSBtdXN0IGJlIGEgYnJhbmQsIHdhcyAke2JyYW5kfWA7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZUxvb2tzTGlrZUJyYW5kKG1ha2VMb29rc0xpa2VCcmFuZCk7XG5oYXJkZW4obWFrZUxvb2tzTGlrZUJyYW5kKTtcblxuY29uc3QgbWFrZUFzc2VydEluc3RhbGxhdGlvbj0obmFtZSk9PntcbnJldHVybihpbnN0YWxsYXRpb24pPT57XG4vKiBUT0RPKDMzNDQpOiBhZGQgYSBiZXR0ZXIgYXNzZXJ0aW9uIG9uY2UgWm9lIHZhbGlkYXRlcyBpbnN0YWxsYXRpb25zKi9cbnR5cGVvZiBpbnN0YWxsYXRpb249PT0nb2JqZWN0J3x8XG5GYWlsIGB2YWx1ZSBmb3IgJHtuYW1lfSBtdXN0IGJlIGFuIEluc3RhbGxhdGlvbiwgd2FzICR7aW5zdGFsbGF0aW9ufWA7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZUFzc2VydEluc3RhbGxhdGlvbihtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uKTtcbmhhcmRlbihtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uKTtcblxuY29uc3QgbWFrZUFzc2VydEluc3RhbmNlPShuYW1lKT0+e1xucmV0dXJuKGluc3RhbmNlKT0+e1xuLyogVE9ETygzMzQ0KTogYWRkIGEgYmV0dGVyIGFzc2VydGlvbiBvbmNlIFpvZSB2YWxpZGF0ZXMgaW5zdGFuY2VzKi9cbnR5cGVvZiBpbnN0YW5jZT09PSdvYmplY3QnfHxcbkZhaWwgYHZhbHVlIGZvciAke25hbWV9IG11c3QgYmUgYW4gSW5zdGFuY2UsIHdhcyAke2luc3RhbmNlfWA7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZUFzc2VydEluc3RhbmNlKG1ha2VBc3NlcnRJbnN0YW5jZSk7XG5oYXJkZW4obWFrZUFzc2VydEluc3RhbmNlKTtcblxuY29uc3QgbWFrZUFzc2VydEJyYW5kZWRSYXRpbz0obmFtZSxtb2RlbFJhdGlvKT0+e1xucmV0dXJuKHJhdGlvKT0+e1xuYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5yYXRpby5udW1lcmF0b3IuYnJhbmQ9PT1tb2RlbFJhdGlvLm51bWVyYXRvci5icmFuZHx8XG5GYWlsIGBOdW1lcmF0b3IgYnJhbmQgZm9yICR7bmFtZX0gbXVzdCBiZSAke21vZGVsUmF0aW8ubnVtZXJhdG9yLmJyYW5kfWA7XG5yYXRpby5kZW5vbWluYXRvci5icmFuZD09PW1vZGVsUmF0aW8uZGVub21pbmF0b3IuYnJhbmR8fFxuRmFpbCBgRGVub21pbmF0b3IgYnJhbmQgZm9yICR7bmFtZX0gbXVzdCBiZSAke21vZGVsUmF0aW8uZGVub21pbmF0b3IuYnJhbmR9YDtcbnJldHVybiB0cnVlO1xuIH07XG4gfTskaOKAjV9vbmNlLm1ha2VBc3NlcnRCcmFuZGVkUmF0aW8obWFrZUFzc2VydEJyYW5kZWRSYXRpbyk7XG5oYXJkZW4obWFrZUFzc2VydEJyYW5kZWRSYXRpbyk7XG5cbmNvbnN0IGFzc2VydFJlbGF0aXZlVGltZT0odmFsdWUpPT57XG5tdXN0TWF0Y2godmFsdWUsUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZWxhdGl2ZVRpbWUoYXNzZXJ0UmVsYXRpdmVUaW1lKTtcbmhhcmRlbihhc3NlcnRSZWxhdGl2ZVRpbWUpO1xuXG5jb25zdCBhc3NlcnRUaW1lc3RhbXA9KHZhbHVlKT0+e1xubXVzdE1hdGNoKHZhbHVlLFRpbWVzdGFtcFJlY29yZFNoYXBlLCd0aW1lc3RhbXAnKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0VGltZXN0YW1wKGFzc2VydFRpbWVzdGFtcCk7XG5oYXJkZW4oYXNzZXJ0VGltZXN0YW1wKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTG9va3NMaWtlQnJhbmQiOlsibWFrZUxvb2tzTGlrZUJyYW5kIl0sIm1ha2VBc3NlcnRJbnN0YWxsYXRpb24iOlsibWFrZUFzc2VydEluc3RhbGxhdGlvbiJdLCJtYWtlQXNzZXJ0SW5zdGFuY2UiOlsibWFrZUFzc2VydEluc3RhbmNlIl0sIm1ha2VBc3NlcnRCcmFuZGVkUmF0aW8iOlsibWFrZUFzc2VydEJyYW5kZWRSYXRpbyJdLCJhc3NlcnRSZWxhdGl2ZVRpbWUiOlsiYXNzZXJ0UmVsYXRpdmVUaW1lIl0sImFzc2VydFRpbWVzdGFtcCI6WyJhc3NlcnRUaW1lc3RhbXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAY0YIWHURAAB1EQAAPgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSIsIi4uL3F1ZXN0aW9uLmpzIl0sImV4cG9ydHMiOlsibWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMiLCJzZXR1cEFwaUdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsa2V5RVEsQ2hvaWNlTWV0aG9kLFF1b3J1bVJ1bGUsRWxlY3Rpb25UeXBlLGNvZXJjZVF1ZXN0aW9uU3BlYzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9xdWVzdGlvbi5qc1wiLCBbW1wiQ2hvaWNlTWV0aG9kXCIsIFskaOKAjV9hID0+IChDaG9pY2VNZXRob2QgPSAkaOKAjV9hKV1dLFtcIlF1b3J1bVJ1bGVcIiwgWyRo4oCNX2EgPT4gKFF1b3J1bVJ1bGUgPSAkaOKAjV9hKV1dLFtcIkVsZWN0aW9uVHlwZVwiLCBbJGjigI1fYSA9PiAoRWxlY3Rpb25UeXBlID0gJGjigI1fYSldXSxbXCJjb2VyY2VRdWVzdGlvblNwZWNcIiwgWyRo4oCNX2EgPT4gKGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBNYWtlIGEgcGFpciBvZiBwb3NpdGlvbnMgZm9yIGEgcXVlc3Rpb24gYWJvdXQgd2hldGhlciB0byBpbnZva2UgYW4gQVBJLiBJZlxuICogdGhlIHZvdGUgcGFzc2VzLCB0aGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBnb3Zlcm5lZEFwaXMgZmFjZXQgd2l0aCB0aGVcbiAqIGFyZ3VtZW50cyB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwaU1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7dW5rbm93bltdfSBtZXRob2RBcmdzXG4gKi9cbmNvbnN0IG1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zPShhcGlNZXRob2ROYW1lLG1ldGhvZEFyZ3MpPT57XG5jb25zdCBwb3NpdGl2ZT1oYXJkZW4oe2FwaU1ldGhvZE5hbWUsbWV0aG9kQXJnc30pO1xuY29uc3QgbmVnYXRpdmU9aGFyZGVuKHtkb250SW52b2tlOmFwaU1ldGhvZE5hbWV9KTtcbnJldHVybiBoYXJkZW4oe3Bvc2l0aXZlLG5lZ2F0aXZlfSk7XG4gfTtcblxuLyoqXG4gKiBtYW5hZ2UgY29udHJhY3RzIHRoYXQgYWxsb3cgZ292ZXJuYW5jZSB0byBpbnZva2UgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RVJlZjx7IFttZXRob2ROYW1lOiBzdHJpbmddOiAoLi4uYXJnczogYW55KSA9PiB1bmtub3duIH0+fSBnb3Zlcm5lZEFwaXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gZ292ZXJuZWROYW1lcyBuYW1lcyBvZiB0aGUgZ292ZXJuZWQgQVBJIG1ldGhvZHNcbiAqIEBwYXJhbSB7RVJlZjxYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlPn0gdGltZXJcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxQb3NlckZhY2V0Pn0gZ2V0VXBkYXRlZFBvc2VyRmFjZXRcbiAqIEByZXR1cm5zIHtBcGlHb3Zlcm5vcn1cbiAqLyRo4oCNX29uY2UubWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMobWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMpO1xuY29uc3Qgc2V0dXBBcGlHb3Zlcm5hbmNlPShcbmdvdmVybmVkQXBpcyxcbmdvdmVybmVkTmFtZXMsXG50aW1lcixcbmdldFVwZGF0ZWRQb3NlckZhY2V0KT0+XG57XG4vKiogQHR5cGUge1dlYWtTZXQ8SW5zdGFuY2U+fSAqL1xuY29uc3Qgdm90ZUNvdW50ZXJzPW5ldyBXZWFrU2V0KCk7XG5cbi8qKiBAdHlwZSB7Vm90ZU9uQXBpSW52b2NhdGlvbn0gKi9cbmNvbnN0IHZvdGVPbkFwaUludm9jYXRpb249YXN5bmMoXG5hcGlNZXRob2ROYW1lLFxubWV0aG9kQXJncyxcbnZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuZGVhZGxpbmUpPT5cbntcbmdvdmVybmVkTmFtZXMuaW5jbHVkZXMoYXBpTWV0aG9kTmFtZSl8fFxuRmFpbCBgJHthcGlNZXRob2ROYW1lfSBpcyBub3QgYSBnb3Zlcm5lZCBBUEkuYDtcblxuY29uc3R7cG9zaXRpdmUsbmVnYXRpdmV9PW1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zKFxuYXBpTWV0aG9kTmFtZSxcbm1ldGhvZEFyZ3MpO1xuXG5cbi8qKiBAdHlwZSB7QXBpSW52b2NhdGlvbklzc3VlfSAqL1xuY29uc3QgaXNzdWU9aGFyZGVuKHthcGlNZXRob2ROYW1lLG1ldGhvZEFyZ3N9KTtcbmNvbnN0IHF1ZXN0aW9uU3BlYz1jb2VyY2VRdWVzdGlvblNwZWMoe1xubWV0aG9kOkNob2ljZU1ldGhvZC5VTlJBTktFRCxcbmlzc3VlLFxucG9zaXRpb25zOltwb3NpdGl2ZSxuZWdhdGl2ZV0sXG5lbGVjdGlvblR5cGU6RWxlY3Rpb25UeXBlLkFQSV9JTlZPQ0FUSU9OLFxubWF4Q2hvaWNlczoxLFxubWF4V2lubmVyczoxLFxuY2xvc2luZ1J1bGU6e3RpbWVyLGRlYWRsaW5lfSxcbnF1b3J1bVJ1bGU6UXVvcnVtUnVsZS5NQUpPUklUWSxcbnRpZU91dGNvbWU6bmVnYXRpdmV9KTtcblxuXG5jb25zdHtwdWJsaWNGYWNldDpjb3VudGVyUHVibGljRmFjZXQsaW5zdGFuY2U6dm90ZUNvdW50ZXJ9PWF3YWl0IEUoXG5nZXRVcGRhdGVkUG9zZXJGYWNldCgpKS5cbmFkZFF1ZXN0aW9uKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLHF1ZXN0aW9uU3BlYyk7XG5cbnZvdGVDb3VudGVycy5hZGQodm90ZUNvdW50ZXIpO1xuXG4vKiBDUlVDSUFMOiBIZXJlIHdlIHdhaXQgZm9yIHRoZSB2b3RlQ291bnRlciB0byBkZWNsYXJlIGFuIG91dGNvbWUsIGFuZCB0aGVuKi9cbi8qIGF0dGVtcHQgdG8gaW52b2tlIHRoZSBBUEkgaWYgdGhhdCdzIHdoYXQgdGhlIHZvdGUgY2FsbGVkIGZvci4gV2UgbmVlZCB0byovXG4vKiBtYWtlIHN1cmUgdGhhdCBvdXRjb21lT2ZVcGRhdGVQIGlzIHVwZGF0ZWQgd2hhdGV2ZXIgaGFwcGVucy4qL1xuLyoqL1xuLyogKiBJZiB0aGUgdm90ZSBwYXNzZWQsIGludm9rZSB0aGUgQVBJLCBhbmQgcmV0dXJuIHRoZSBwb3NpdGl2ZSBwb3NpdGlvbiovXG4vKiAqIElmIHRoZSB2b3RlIHdhcyBuZWdhdGl2ZSwgcmV0dXJuIHRoZSBuZWdhdGl2ZSBwb3NpdGlvbiovXG4vKiAqIElmIHdlIGNhbid0IGRvIGVpdGhlciwgKHRoZSB2b3RlIGZhaWxlZCBvciB0aGUgQVBJIGludm9jYXRpb24gZmFpbGVkKSovXG4vKiByZXR1cm4gYSBicm9rZW4gcHJvbWlzZS4qL1xuY29uc3Qgb3V0Y29tZU9mVXBkYXRlPUUoY291bnRlclB1YmxpY0ZhY2V0KS5cbmdldE91dGNvbWUoKS5cbnRoZW4oXG4vKiogQHR5cGUgeyhvdXRjb21lOiBQb3NpdGlvbikgPT4gRVJlZjxQb3NpdGlvbj59ICovXG4ob3V0Y29tZSk9PntcbmlmKGtleUVRKHBvc2l0aXZlLG91dGNvbWUpKXtcbmtleUVRKG91dGNvbWUsaGFyZGVuKHthcGlNZXRob2ROYW1lLG1ldGhvZEFyZ3N9KSl8fFxuRmFpbCBgVGhlIHF1ZXN0aW9uJ3MgbWV0aG9kIG5hbWUgKCR7cShcbmFwaU1ldGhvZE5hbWUpXG4gfSkgYW5kIGFyZ3MgKCR7bWV0aG9kQXJnc30pIGRpZG4ndCBtYXRjaCB0aGUgb3V0Y29tZSAke291dGNvbWV9YDtcblxuLyogRShyZW1vdGUpW25hbWVdKGFyZ3MpIGludm9rZXMgdGhlIG1ldGhvZCBuYW1lZCAnbmFtZScgb24gcmVtb3RlLiovXG5yZXR1cm4gRShnb3Zlcm5lZEFwaXMpW1xuYXBpTWV0aG9kTmFtZV0oLi4ubWV0aG9kQXJncykuXG50aGVuKCgpPT57XG5yZXR1cm4gcG9zaXRpdmU7XG4gfSk7XG4gfWVsc2V7XG5yZXR1cm4gbmVnYXRpdmU7XG4gfVxuIH0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xub3V0Y29tZU9mVXBkYXRlLFxuaW5zdGFuY2U6dm90ZUNvdW50ZXIsXG5kZXRhaWxzOkUoY291bnRlclB1YmxpY0ZhY2V0KS5nZXREZXRhaWxzKCl9KTtcblxuIH07XG5cbnJldHVybiBGYXIoJ3BhcmFtR292ZXJub3InLHtcbnZvdGVPbkFwaUludm9jYXRpb24sXG5jcmVhdGVkUXVlc3Rpb246KGIpPT52b3RlQ291bnRlcnMuaGFzKGIpfSk7XG5cbiB9OyRo4oCNX29uY2Uuc2V0dXBBcGlHb3Zlcm5hbmNlKHNldHVwQXBpR292ZXJuYW5jZSk7XG5cbmhhcmRlbihzZXR1cEFwaUdvdmVybmFuY2UpO1xuaGFyZGVuKG1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyI6WyJtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyJdLCJzZXR1cEFwaUdvdmVybmFuY2UiOlsic2V0dXBBcGlHb3Zlcm5hbmNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMbE9OirDwAAqw8AAEEAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiLi4vcXVlc3Rpb24uanMiXSwiZXhwb3J0cyI6WyJtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMiLCJzZXR1cEZpbHRlckdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsbXVzdE1hdGNoLGtleUVRLE0sQ2hvaWNlTWV0aG9kLFF1b3J1bVJ1bGUsRWxlY3Rpb25UeXBlLGNvZXJjZVF1ZXN0aW9uU3BlYzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9xdWVzdGlvbi5qc1wiLCBbW1wiQ2hvaWNlTWV0aG9kXCIsIFskaOKAjV9hID0+IChDaG9pY2VNZXRob2QgPSAkaOKAjV9hKV1dLFtcIlF1b3J1bVJ1bGVcIiwgWyRo4oCNX2EgPT4gKFF1b3J1bVJ1bGUgPSAkaOKAjV9hKV1dLFtcIkVsZWN0aW9uVHlwZVwiLCBbJGjigI1fYSA9PiAoRWxlY3Rpb25UeXBlID0gJGjigI1fYSldXSxbXCJjb2VyY2VRdWVzdGlvblNwZWNcIiwgWyRo4oCNX2EgPT4gKGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogTWFrZSBhIHBhaXIgb2YgcG9zaXRpb25zIGZvciBhIHF1ZXN0aW9uIGFib3V0IHdoZXRoZXIgdG8gdXBkYXRlIHRoZSBvZmZlclxuICogZmlsdGVyLiBJZiB0aGUgdm90ZSBwYXNzZXMsIHRoZSBsaXN0IG9mIGJsb2NrZWQgaW52aXRhdGlvbiBzdHJpbmdzIHdpbGwgYmVcbiAqIHVwZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gc3RyaW5nc1xuICovXG5jb25zdCBtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnM9KHN0cmluZ3MpPT57XG5jb25zdCBwb3NpdGl2ZT1oYXJkZW4oe3N0cmluZ3N9KTtcbmNvbnN0IG5lZ2F0aXZlPWhhcmRlbih7ZG9udFVwZGF0ZTpzdHJpbmdzfSk7XG5yZXR1cm57cG9zaXRpdmUsbmVnYXRpdmV9O1xuIH07XG5cbi8qKlxuICogU2V0dXAgdG8gYWxsb3cgZ292ZXJuYW5jZSB0byBibG9jayBzb21lIGludml0YXRpb25zLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlPn0gdGltZXJcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxQb3NlckZhY2V0Pn0gZ2V0VXBkYXRlZFBvc2VyRmFjZXRcbiAqIEBwYXJhbSB7R292ZXJuZWRDcmVhdG9yRmFjZXQ8e30+fSBnb3Zlcm5lZENGXG4gKiBAcmV0dXJucyB7RmlsdGVyR292ZXJub3J9XG4gKi8kaOKAjV9vbmNlLm1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyhtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMpO1xuY29uc3Qgc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlPSh0aW1lcixnZXRVcGRhdGVkUG9zZXJGYWNldCxnb3Zlcm5lZENGKT0+e1xuLyoqIEB0eXBlIHtXZWFrU2V0PEluc3RhbmNlPn0gKi9cbmNvbnN0IHZvdGVDb3VudGVycz1uZXcgV2Vha1NldCgpO1xuXG4vKiogQHR5cGUge1ZvdGVPbk9mZmVyRmlsdGVyfSAqL1xuY29uc3Qgdm90ZU9uRmlsdGVyPWFzeW5jKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLGRlYWRsaW5lLHN0cmluZ3MpPT57XG5tdXN0TWF0Y2goc3RyaW5ncyxNLmFycmF5T2YoTS5zdHJpbmcoKSkpO1xuY29uc3R7cG9zaXRpdmUsbmVnYXRpdmV9PW1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyhzdHJpbmdzKTtcblxuLyoqIEB0eXBlIHtPZmZlckZpbHRlcklzc3VlfSAqL1xuY29uc3QgaXNzdWU9aGFyZGVuKHtzdHJpbmdzfSk7XG5jb25zdCBxdWVzdGlvblNwZWM9Y29lcmNlUXVlc3Rpb25TcGVjKHtcbm1ldGhvZDpDaG9pY2VNZXRob2QuVU5SQU5LRUQsXG5pc3N1ZSxcbnBvc2l0aW9uczpbcG9zaXRpdmUsbmVnYXRpdmVdLFxuZWxlY3Rpb25UeXBlOkVsZWN0aW9uVHlwZS5PRkZFUl9GSUxURVIsXG5tYXhDaG9pY2VzOjEsXG5tYXhXaW5uZXJzOjEsXG5jbG9zaW5nUnVsZTp7dGltZXIsZGVhZGxpbmV9LFxucXVvcnVtUnVsZTpRdW9ydW1SdWxlLk1BSk9SSVRZLFxudGllT3V0Y29tZTpuZWdhdGl2ZX0pO1xuXG5cbmNvbnN0e3B1YmxpY0ZhY2V0OmNvdW50ZXJQdWJsaWNGYWNldCxpbnN0YW5jZTp2b3RlQ291bnRlcn09YXdhaXQgRShcbmdldFVwZGF0ZWRQb3NlckZhY2V0KCkpLlxuYWRkUXVlc3Rpb24odm90ZUNvdW50ZXJJbnN0YWxsYXRpb24scXVlc3Rpb25TcGVjKTtcblxudm90ZUNvdW50ZXJzLmFkZCh2b3RlQ291bnRlcik7XG5cbi8qIENSVUNJQUw6IEhlcmUgd2Ugd2FpdCBmb3IgdGhlIHZvdGVDb3VudGVyIHRvIGRlY2xhcmUgYW4gb3V0Y29tZSwgYW5kIHRoZW4qL1xuLyogYXR0ZW1wdCB0byBpbnZva2UgdGhlIEFQSSBpZiB0aGF0J3Mgd2hhdCB0aGUgdm90ZSBjYWxsZWQgZm9yLiBXZSBuZWVkIHRvKi9cbi8qIG1ha2Ugc3VyZSB0aGF0IG91dGNvbWVPZlVwZGF0ZVAgaXMgdXBkYXRlZCB3aGF0ZXZlciBoYXBwZW5zLiovXG4vKiovXG4vKiAqIElmIHRoZSB2b3RlIHBhc3NlZCwgaW52b2tlIHRoZSBBUEksIGFuZCByZXR1cm4gdGhlIHBvc2l0aXZlIHBvc2l0aW9uKi9cbi8qICogSWYgdGhlIHZvdGUgd2FzIG5lZ2F0aXZlLCByZXR1cm4gdGhlIG5lZ2F0aXZlIHBvc2l0aW9uKi9cbi8qICogSWYgd2UgY2FuJ3QgZG8gZWl0aGVyLCAodGhlIHZvdGUgZmFpbGVkIG9yIHRoZSBBUEkgaW52b2NhdGlvbiBmYWlsZWQpKi9cbi8qIHJldHVybiBhIGJyb2tlbiBwcm9taXNlLiovXG5jb25zdCBvdXRjb21lT2ZVcGRhdGU9RShjb3VudGVyUHVibGljRmFjZXQpLlxuZ2V0T3V0Y29tZSgpLlxudGhlbihcbi8qKiBAdHlwZSB7KG91dGNvbWU6IFBvc2l0aW9uKSA9PiBFUmVmPFBvc2l0aW9uPn0gKi9cbihvdXRjb21lKT0+e1xuaWYoa2V5RVEob3V0Y29tZSxwb3NpdGl2ZSkpe1xucmV0dXJuIEUoZ292ZXJuZWRDRikuXG5zZXRPZmZlckZpbHRlcihzdHJpbmdzKS5cbnRoZW4oKCk9PntcbnJldHVybiBwb3NpdGl2ZTtcbiB9KTtcbiB9ZWxzZSBpZihrZXlFUShvdXRjb21lLG5lZ2F0aXZlKSl7XG5yZXR1cm4gbmVnYXRpdmU7XG4gfWVsc2V7XG5hc3NlcnQuZmFpbCgndW5yZWNvZ25pemVkIG91dGNvbWUnKTtcbiB9XG4gfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5vdXRjb21lT2ZVcGRhdGUsXG5pbnN0YW5jZTp2b3RlQ291bnRlcixcbmRldGFpbHM6RShjb3VudGVyUHVibGljRmFjZXQpLmdldERldGFpbHMoKX0pO1xuXG4gfTtcblxucmV0dXJuIEZhcignZmlsdGVyR292ZXJub3InLHtcbnZvdGVPbkZpbHRlcixcbmNyZWF0ZWRRdWVzdGlvbjooYik9PnZvdGVDb3VudGVycy5oYXMoYil9KTtcblxuIH07JGjigI1fb25jZS5zZXR1cEZpbHRlckdvdmVybmFuY2Uoc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlKTtcblxuaGFyZGVuKHNldHVwRmlsdGVyR292ZXJuYW5jZSk7XG5oYXJkZW4obWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMiOlsibWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zIl0sInNldHVwRmlsdGVyR292ZXJuYW5jZSI6WyJzZXR1cEZpbHRlckdvdmVybmFuY2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8iJ5TUgWAABIFgAAQAAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiLi4vcXVlc3Rpb24uanMiLCIuLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiQ09OVFJBQ1RfRUxFQ1RPUkFURSIsImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0iLCJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiLCJzZXR1cFBhcmFtR292ZXJuYW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGRlZXBseUZ1bGZpbGxlZCxGYXIsbXVzdE1hdGNoLGtleUVRLENob2ljZU1ldGhvZCxjb2VyY2VRdWVzdGlvblNwZWMsRWxlY3Rpb25UeXBlLFF1b3J1bVJ1bGUsUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIiwgWyRo4oCNX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9xdWVzdGlvbi5qc1wiLCBbW1wiQ2hvaWNlTWV0aG9kXCIsIFskaOKAjV9hID0+IChDaG9pY2VNZXRob2QgPSAkaOKAjV9hKV1dLFtcImNvZXJjZVF1ZXN0aW9uU3BlY1wiLCBbJGjigI1fYSA9PiAoY29lcmNlUXVlc3Rpb25TcGVjID0gJGjigI1fYSldXSxbXCJFbGVjdGlvblR5cGVcIiwgWyRo4oCNX2EgPT4gKEVsZWN0aW9uVHlwZSA9ICRo4oCNX2EpXV0sW1wiUXVvcnVtUnVsZVwiLCBbJGjigI1fYSA9PiAoUXVvcnVtUnVsZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZVwiLCBbJGjigI1fYSA9PiAoUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogVGhlIGVsZWN0b3JhdGUgdGhhdCBnb3Zlcm5zIGNoYW5nZXMgdG8gdGhlIGNvbnRyYWN0J3MgcGFyYW1ldGVycy4gSXQgbXVzdCBiZVxuICogZGVjbGFyZWQgaW4gdGhlIGdvdmVybmVkIGNvbnRyYWN0LlxuICovXG5jb25zdCBDT05UUkFDVF9FTEVDVE9SQVRFPSdFbGVjdG9yYXRlJztcblxuLyoqXG4gKiBSZXR1cm4gYSByZWNvcmQgY29udGFpbmluZyB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHBvc2l0aW9ucyBmb3IgYVxuICogcXVlc3Rpb24gb24gY2hhbmdpbmcgdGhlIHBhcmFtIHRvIHRoZSBwcm9wb3NlZFZhbHVlLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUGFyYW1WYWx1ZT59IGNoYW5nZXNcbiAqIEByZXR1cm5zIHtQYXJhbUNoYW5nZVBvc2l0aW9uc31cbiAqLyRo4oCNX29uY2UuQ09OVFJBQ1RfRUxFQ1RPUkFURShDT05UUkFDVF9FTEVDVE9SQVRFKTtcbmNvbnN0IG1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucz0oY2hhbmdlcyk9Pntcbi8qKiBAdHlwZSB7Q2hhbmdlUGFyYW1zUG9zaXRpb259ICovXG5jb25zdCBwb3NpdGl2ZT17Y2hhbmdlc307XG5jb25zdCBuYW1lc09ubHk9T2JqZWN0LmtleXMoY2hhbmdlcyk7XG5jb25zdCBuZWdhdGl2ZT17bm9DaGFuZ2U6bmFtZXNPbmx5fTtcbnJldHVybiBoYXJkZW4oe3Bvc2l0aXZlLG5lZ2F0aXZlfSk7XG4gfTtcblxuLyoqXG4gKiBhc3NlcnQgdGhhdCB0aGUgcGFyYW1ldGVyIGRlc2NyaWJlZCBieSBwYXJhbVNwZWMgaXMgcHJvcG9zZWQgdG8gYmUgY2hhbmdlZCBpblxuICogdGhlIHF1ZXN0aW9uIGRlc2NyaWJlZCBieSBxdWVzdGlvblNwZWMuXG4gKlxuICogQHBhcmFtIHt7IHBhcmFtZXRlck5hbWU6IHN0cmluZywgcGFyYW1QYXRoOiB1bmtub3dufX0gcGFyYW1TcGVjXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlYzxQYXJhbUNoYW5nZUlzc3VlPHVua25vd24+Pn0gcXVlc3Rpb25TcGVjXG4gKi8kaOKAjV9vbmNlLm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyhtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMpO1xuY29uc3QgYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbT0ocGFyYW1TcGVjLHF1ZXN0aW9uU3BlYyk9Pntcbm11c3RNYXRjaChxdWVzdGlvblNwZWMsUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG5jb25zdHtwYXJhbWV0ZXJOYW1lLHBhcmFtUGF0aH09cGFyYW1TcGVjO1xuY29uc3R7aXNzdWV9PXF1ZXN0aW9uU3BlYztcbmlzc3VlLnNwZWMuY2hhbmdlc1twYXJhbWV0ZXJOYW1lXXx8XG5GYWlsIGBRdWVzdGlvbiAoJHtpc3N1ZS5zcGVjLmNoYW5nZXN9KSBkb2VzIG5vdCBjb25jZXJuICR7cGFyYW1ldGVyTmFtZX1gO1xua2V5RVEoaXNzdWUuc3BlYy5wYXJhbVBhdGgscGFyYW1QYXRoKXx8XG5GYWlsIGBRdWVzdGlvbiBwYXRoICgke2lzc3VlLnNwZWMucGFyYW1QYXRofSkgZG9lc24ndCBtYXRjaCByZXF1ZXN0ICgke3BhcmFtUGF0aH0pYDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RVJlZjxQYXJhbU1hbmFnZXJSZXRyaWV2ZXI+fSBwYXJhbU1hbmFnZXJSZXRyaWV2ZXJcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGNvbnRyYWN0SW5zdGFuY2VcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVyU2VydmljZX0gdGltZXJcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxQb3NlckZhY2V0Pn0gZ2V0VXBkYXRlZFBvc2VyRmFjZXRcbiAqIEByZXR1cm5zIHtQYXJhbUdvdmVybm9yfVxuICovJGjigI1fb25jZS5hc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtKGFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0pO1xuY29uc3Qgc2V0dXBQYXJhbUdvdmVybmFuY2U9KFxucGFyYW1NYW5hZ2VyUmV0cmlldmVyLFxuY29udHJhY3RJbnN0YW5jZSxcbnRpbWVyLFxuZ2V0VXBkYXRlZFBvc2VyRmFjZXQpPT5cbntcbi8qKiBAdHlwZSB7V2Vha1NldDxJbnN0YW5jZT59ICovXG5jb25zdCB2b3RlQ291bnRlcnM9bmV3IFdlYWtTZXQoKTtcblxuLyoqIEB0eXBlIHtWb3RlT25QYXJhbUNoYW5nZXN9ICovXG5jb25zdCB2b3RlT25QYXJhbUNoYW5nZXM9YXN5bmMoXG52b3RlQ291bnRlckluc3RhbGxhdGlvbixcbmRlYWRsaW5lLFxucGFyYW1TcGVjKT0+XG57XG5jb25zdCBwYXJhbU1ncj1hd2FpdCBFKHBhcmFtTWFuYWdlclJldHJpZXZlcikuZ2V0KHBhcmFtU3BlYy5wYXJhbVBhdGgpO1xuY29uc3QgY2hhbmdlUHM9e307XG5mb3IoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhwYXJhbVNwZWMuY2hhbmdlcykpe1xuY29uc3QgcHJvcG9zZWRWYWx1ZT1FKHBhcmFtTWdyKS5nZXRWaXNpYmxlVmFsdWUoXG5uYW1lLFxucGFyYW1TcGVjLmNoYW5nZXNbbmFtZV0pO1xuXG5jaGFuZ2VQc1tuYW1lXT1wcm9wb3NlZFZhbHVlO1xuIH1cbmNvbnN0IGNoYW5nZXM9YXdhaXQgZGVlcGx5RnVsZmlsbGVkKGhhcmRlbihjaGFuZ2VQcykpO1xuXG5jb25zdHtwb3NpdGl2ZSxuZWdhdGl2ZX09bWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zKGNoYW5nZXMpO1xuXG4vKiogQHR5cGUge1BhcmFtQ2hhbmdlSXNzdWU8dW5rbm93bj59ICovXG5jb25zdCBpc3N1ZT1oYXJkZW4oe1xuc3BlYzp7XG5wYXJhbVBhdGg6cGFyYW1TcGVjLnBhcmFtUGF0aCxcbmNoYW5nZXN9LFxuXG5jb250cmFjdDpjb250cmFjdEluc3RhbmNlfSk7XG5cblxuY29uc3QgcXVlc3Rpb25TcGVjPWNvZXJjZVF1ZXN0aW9uU3BlYyh7XG5tZXRob2Q6Q2hvaWNlTWV0aG9kLlVOUkFOS0VELFxuaXNzdWUsXG5wb3NpdGlvbnM6W3Bvc2l0aXZlLG5lZ2F0aXZlXSxcbmVsZWN0aW9uVHlwZTpFbGVjdGlvblR5cGUuUEFSQU1fQ0hBTkdFLFxubWF4Q2hvaWNlczoxLFxubWF4V2lubmVyczoxLFxuY2xvc2luZ1J1bGU6e3RpbWVyLGRlYWRsaW5lfSxcbnF1b3J1bVJ1bGU6UXVvcnVtUnVsZS5NQUpPUklUWSxcbnRpZU91dGNvbWU6bmVnYXRpdmV9KTtcblxuXG5jb25zdHtwdWJsaWNGYWNldDpjb3VudGVyUHVibGljRmFjZXQsaW5zdGFuY2U6dm90ZUNvdW50ZXJ9PWF3YWl0IEUoXG5nZXRVcGRhdGVkUG9zZXJGYWNldCgpKS5cbmFkZFF1ZXN0aW9uKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLHF1ZXN0aW9uU3BlYyk7XG5cbnZvdGVDb3VudGVycy5hZGQodm90ZUNvdW50ZXIpO1xuXG4vKiBDUlVDSUFMOiBIZXJlIHdlIHdhaXQgZm9yIHRoZSB2b3RlQ291bnRlciB0byBkZWNsYXJlIGFuIG91dGNvbWUsIGFuZCB0aGVuKi9cbi8qIGF0dGVtcHQgdG8gdXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIGlmIHRoYXQncyB3aGF0IHRoZSB2b3RlKi9cbi8qIGRlY2lkZWQuIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgb3V0Y29tZU9mVXBkYXRlUCBpcyB1cGRhdGVkIHdoYXRldmVyKi9cbi8qIGhhcHBlbnMuKi9cbi8qICogSWYgdGhlIHZvdGUgd2FzIG5lZ2F0aXZlLCByZXNvbHZlIHRvIHRoZSBvdXRjb21lKi9cbi8qICogSWYgd2UgdXBkYXRlIHRoZSB2YWx1ZSwgc2F5IHNvKi9cbi8qICogSWYgdGhlIHVwZGF0ZSBmYWlscywgcmVqZWN0IHRoZSBwcm9taXNlKi9cbi8qICogaWYgdGhlIHZvdGUgb3V0Y29tZSBmYWlsZWQsIHJlamVjdCB0aGUgcHJvbWlzZS4qL1xuY29uc3Qgb3V0Y29tZU9mVXBkYXRlPUUoY291bnRlclB1YmxpY0ZhY2V0KS5cbmdldE91dGNvbWUoKS5cbnRoZW4oYXN5bmMob3V0Y29tZSk9PntcbmlmKGtleUVRKHBvc2l0aXZlLG91dGNvbWUpKXtcbnJldHVybiBFLndoZW4oXG5FKHBhcmFtTWdyKS51cGRhdGVQYXJhbXMocGFyYW1TcGVjLmNoYW5nZXMpLFxuKCk9PnBvc2l0aXZlKTtcblxuIH1cbnJldHVybiBuZWdhdGl2ZTtcbiB9KTtcblxucmV0dXJue1xub3V0Y29tZU9mVXBkYXRlLFxuaW5zdGFuY2U6dm90ZUNvdW50ZXIsXG5kZXRhaWxzOkUoY291bnRlclB1YmxpY0ZhY2V0KS5nZXREZXRhaWxzKCl9O1xuXG4gfTtcblxucmV0dXJuIEZhcigncGFyYW1Hb3Zlcm5vcicse1xudm90ZU9uUGFyYW1DaGFuZ2VzLFxuY3JlYXRlZFF1ZXN0aW9uOihiKT0+dm90ZUNvdW50ZXJzLmhhcyhiKX0pO1xuXG4gfTskaOKAjV9vbmNlLnNldHVwUGFyYW1Hb3Zlcm5hbmNlKHNldHVwUGFyYW1Hb3Zlcm5hbmNlKTtcblxuaGFyZGVuKHNldHVwUGFyYW1Hb3Zlcm5hbmNlKTtcbmhhcmRlbihtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMpO1xuaGFyZGVuKGFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNPTlRSQUNUX0VMRUNUT1JBVEUiOlsiQ09OVFJBQ1RfRUxFQ1RPUkFURSJdLCJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiOlsibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIl0sImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0iOlsiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSJdLCJzZXR1cFBhcmFtR292ZXJuYW5jZSI6WyJzZXR1cFBhcmFtR292ZXJuYW5jZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAZbcDPEUIAABFCAABBAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvem9lL3NyYy9jbGVhblByb3Bvc2FsLmpzIiwiQGVuZG8vbmF0IiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL2ludGVybmFsIiwiLi4vY29uc3RhbnRzLmpzIiwiLi9hc3NlcnRpb25zLmpzIiwiLi9nb3Zlcm5QYXJhbS5qcyJdLCJleHBvcnRzIjpbImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzIiwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLHBhc3NTdHlsZU9mLEFtb3VudE1hdGgsYXNzZXJ0S2V5d29yZE5hbWUsTmF0LGtleUVRLG1ha2VTY2FsYXJNYXBTdG9yZSxFLGFzc2VydEFsbERlZmluZWQsUGFyYW1UeXBlcyxhc3NlcnRUaW1lc3RhbXAsYXNzZXJ0UmVsYXRpdmVUaW1lLG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8sbWFrZUFzc2VydEluc3RhbGxhdGlvbixtYWtlQXNzZXJ0SW5zdGFuY2UsbWFrZUxvb2tzTGlrZUJyYW5kLENPTlRSQUNUX0VMRUNUT1JBVEU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NsZWFuUHJvcG9zYWwuanNcIiwgW1tcImFzc2VydEtleXdvcmROYW1lXCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXl3b3JkTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjigI1fYSldXV1dLFtcIi4uL2NvbnN0YW50cy5qc1wiLCBbW1wiUGFyYW1UeXBlc1wiLCBbJGjigI1fYSA9PiAoUGFyYW1UeXBlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2Fzc2VydGlvbnMuanNcIiwgW1tcImFzc2VydFRpbWVzdGFtcFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0VGltZXN0YW1wID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZWxhdGl2ZVRpbWVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlbGF0aXZlVGltZSA9ICRo4oCNX2EpXV0sW1wibWFrZUFzc2VydEJyYW5kZWRSYXRpb1wiLCBbJGjigI1fYSA9PiAobWFrZUFzc2VydEJyYW5kZWRSYXRpbyA9ICRo4oCNX2EpXV0sW1wibWFrZUFzc2VydEluc3RhbGxhdGlvblwiLCBbJGjigI1fYSA9PiAobWFrZUFzc2VydEluc3RhbGxhdGlvbiA9ICRo4oCNX2EpXV0sW1wibWFrZUFzc2VydEluc3RhbmNlXCIsIFskaOKAjV9hID0+IChtYWtlQXNzZXJ0SW5zdGFuY2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VMb29rc0xpa2VCcmFuZFwiLCBbJGjigI1fYSA9PiAobWFrZUxvb2tzTGlrZUJyYW5kID0gJGjigI1fYSldXV1dLFtcIi4vZ292ZXJuUGFyYW0uanNcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIiwgWyRo4oCNX2EgPT4gKENPTlRSQUNUX0VMRUNUT1JBVEUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFyYW1NYW5hZ2VyQmFzZX0gcGFyYW1NYW5hZ2VyXG4gKiBAcGFyYW0ge3tbQ09OVFJBQ1RfRUxFQ1RPUkFURV06IFBhcmFtVmFsdWVUeXBlZDwnaW52aXRhdGlvbic+fX0gZ292ZXJuZWRQYXJhbXNcbiAqL1xuY29uc3QgYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXM9KHBhcmFtTWFuYWdlcixnb3Zlcm5lZFBhcmFtcyk9PntcbmNvbnN0IG1hbmFnZXJFbGVjdG9yYXRlPVxucGFyYW1NYW5hZ2VyLmdldEludml0YXRpb25BbW91bnQoQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG5jb25zdHtcbltDT05UUkFDVF9FTEVDVE9SQVRFXTp7dmFsdWU6cGFyYW1FbGVjdG9yYXRlfX09XG5nb3Zlcm5lZFBhcmFtcztcbnBhcmFtRWxlY3RvcmF0ZXx8XG5GYWlsIGBNaXNzaW5nICR7cShDT05UUkFDVF9FTEVDVE9SQVRFKX0gdGVybSBpbiAke3EoZ292ZXJuZWRQYXJhbXMpfWA7XG5rZXlFUShtYW5hZ2VyRWxlY3RvcmF0ZSxwYXJhbUVsZWN0b3JhdGUpfHxcbkZhaWwgYEVsZWN0b3JhdGUgaW4gbWFuYWdlciAoJHttYW5hZ2VyRWxlY3RvcmF0ZX0pfSBpbmNvbXBhdGlibGUgd2l0aCB0ZXJtcyAoJHtwYXJhbUVsZWN0b3JhdGV9YDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtTWFuYWdlckJ1aWxkZXJcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEFtb3VudCkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkQW1vdW50XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBCcmFuZCkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkQnJhbmRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEluc3RhbGxhdGlvbikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkSW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBJbnN0YW5jZSkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkSW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEludml0YXRpb24pID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZEludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IGJpZ2ludCkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkTmF0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBSYXRpbykgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkUmF0aW9cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IFhpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5UmVjb3JkPHVua25vd24+KSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkU3RyaW5nXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRUaW1lc3RhbXBcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5SZWxhdGl2ZVRpbWUpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZFJlbGF0aXZlVGltZVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRVbmtub3duXG4gKiBAcHJvcGVydHkgeygpID0+IEFueVBhcmFtTWFuYWdlcn0gYnVpbGRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy9ub3RpZmllcicpLlN0b3JlZFB1Ymxpc2hlcktpdDxHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGU+fSBwdWJsaXNoZXJLaXRcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gW3pvZV1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMoYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMpO1xuY29uc3QgbWFrZVBhcmFtTWFuYWdlckJ1aWxkZXI9KHB1Ymxpc2hlcktpdCx6b2UpPT57XG4vKiogQHR5cGUge01hcFN0b3JlPEtleXdvcmQsIGFueT59ICovXG5jb25zdCBuYW1lc1RvUGFyYW1zPW1ha2VTY2FsYXJNYXBTdG9yZSgnUGFyYW1ldGVyIE5hbWUnKTtcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1wdWJsaXNoZXJLaXQ7XG5hc3NlcnRBbGxEZWZpbmVkKHtwdWJsaXNoZXIsc3Vic2NyaWJlcn0pO1xuXG5jb25zdCBnZXR0ZXJzPXt9O1xuY29uc3Qgc2V0dGVycz17fTtcbmNvbnN0IHVuZmluaXNoZWRQYXJhbXM9W107XG5cbi8qIFhYWCBsZXQgcGFyYW1zIGJlIGZpbmlzaGVkIGFzeW5jLiBBIGNvbmNlc3Npb24gdG8gdXBncmFkYWJpbGl0eSovXG4vKiBVTlRJTCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzNDMqL1xuY29uc3QgZmluaXNoQnVpbGRpbmc9YXN5bmMoKT0+e1xuYXdhaXQgUHJvbWlzZS5hbGwodW5maW5pc2hlZFBhcmFtcyk7XG51bmZpbmlzaGVkUGFyYW1zLmxlbmd0aD0wO1xuIH07XG5cbmNvbnN0IHB1Ymxpc2g9KCk9Pntcbi8qKiBAdHlwZSB7UGFyYW1TdGF0ZVJlY29yZH0gKi9cbmNvbnN0IGN1cnJlbnQ9T2JqZWN0LmZyb21FbnRyaWVzKFxuWy4uLm5hbWVzVG9QYXJhbXMuZW50cmllcygpXS5tYXAoKFtrLHZdKT0+W2ssdi5tYWtlRGVzY3JpcHRpb24oKV0pKTtcblxucHVibGlzaGVyLnVwZGF0ZVN0YXRlKHtjdXJyZW50fSk7XG4gfTtcblxuLyoqXG4gKiBTdXBwb3J0IGZvciBwYXJhbWV0ZXJzIHRoYXQgYXJlIGNvcHkgb2JqZWN0c1xuICpcbiAqIEBzZWUgYnVpbGRJbnZpdGF0aW9uUGFyYW1cbiAqXG4gKiBAcGFyYW0ge0tleXdvcmR9IG5hbWVcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEBwYXJhbSB7KHZhbCkgPT4gdm9pZH0gYXNzZXJ0aW9uXG4gKiBAcGFyYW0ge1BhcmFtVHlwZX0gdHlwZVxuICovXG5jb25zdCBidWlsZENvcHlQYXJhbT0obmFtZSx2YWx1ZSxhc3NlcnRpb24sdHlwZSk9PntcbmxldCBjdXJyZW50O1xuYXNzZXJ0S2V5d29yZE5hbWUobmFtZSk7XG52YWx1ZSE9PXVuZGVmaW5lZHx8RmFpbCBgcGFyYW0gJHtxKG5hbWUpfSBtdXN0IGJlIGRlZmluZWRgO1xuXG5jb25zdCBzZXRQYXJhbVZhbHVlPShuZXdWYWx1ZSk9PntcbmFzc2VydGlvbihuZXdWYWx1ZSk7XG5jdXJyZW50PW5ld1ZhbHVlO1xucmV0dXJuIGhhcmRlbih7W25hbWVdOm5ld1ZhbHVlfSk7XG4gfTtcbnNldFBhcmFtVmFsdWUodmFsdWUpO1xuXG5jb25zdCBnZXRWaXNpYmxlVmFsdWU9KHByb3Bvc2VkKT0+e1xuYXNzZXJ0aW9uKHByb3Bvc2VkKTtcbnJldHVybiBwcm9wb3NlZDtcbiB9O1xuXG5jb25zdCBwdWJsaWNNZXRob2RzPUZhciggYFBhcmFtZXRlciAke25hbWV9YCx7XG5nZXRWYWx1ZTooKT0+Y3VycmVudCxcbmFzc2VydFR5cGU6YXNzZXJ0aW9uLFxubWFrZURlc2NyaXB0aW9uOigpPT4oe3R5cGUsdmFsdWU6Y3VycmVudH0pLFxuZ2V0VmlzaWJsZVZhbHVlLFxuZ2V0VHlwZTooKT0+dHlwZX0pO1xuXG5cbi8qIG5hbWVzIGFyZSBrZXl3b3JkcyBzbyB0aGV5IHdpbGwgbmVjZXNzYXJpbHkgYmUgVGl0bGVDYXNlKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5nZXR0ZXJzWyBgZ2V0JHtuYW1lfWBdPSgpPT5nZXRUeXBlZFBhcmFtKHR5cGUsbmFtZSk7XG4vKiBDUlVDSUFMOiBoZXJlIHdlJ3JlIGNyZWF0aW5nIHRoZSB1cGRhdGUgZnVuY3Rpb25zIHRoYXQgY2FuIGNoYW5nZSB0aGUqL1xuLyogdmFsdWVzIG9mIHRoZSBnb3Zlcm5lZCBjb250cmFjdCdzIHBhcmFtZXRlcnMuIFdlJ2xsIHJldHVybiB0aGUgdXBkYXRlRm5zKi9cbi8qIHRvIG91ciBjYWxsZXIuIFRoZXkgbXVzdCBoYW5kbGUgdGhlbSBjYXJlZnVsbHkgdG8gZW5zdXJlIHRoYXQgdGhleSBlbmQgdXAqL1xuLyogaW4gYXBwcm9wcmlhdGUgaGFuZHMuKi9cbnNldHRlcnNbIGB1cGRhdGUke25hbWV9YF09c2V0UGFyYW1WYWx1ZTtcbnNldHRlcnNbIGBwcmVwYXJlVG9VcGRhdGUke25hbWV9YF09KHByb3Bvc2VkVmFsdWUpPT5wcm9wb3NlZFZhbHVlO1xubmFtZXNUb1BhcmFtcy5pbml0KG5hbWUscHVibGljTWV0aG9kcyk7XG4gfTtcblxuLyogSEFORExFUlMgRk9SIEVBQ0ggUEFSQU1FVEVSIFRZUEUgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBBbW91bnQsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG5jb25zdCBhZGRBbW91bnQ9KG5hbWUsdmFsdWUsYnVpbGRlcik9PntcbmNvbnN0IGFzc2VydEFtb3VudD0oYSk9PntcbmEuYnJhbmR8fEZhaWwgYEV4cGVjdGVkIGFuIEFtb3VudCBmb3IgJHtxKG5hbWUpfSwgZ290OiAke2F9YDtcbnJldHVybiBBbW91bnRNYXRoLmNvZXJjZSh2YWx1ZS5icmFuZCxhKTtcbiB9O1xuYnVpbGRDb3B5UGFyYW0obmFtZSx2YWx1ZSxhc3NlcnRBbW91bnQsUGFyYW1UeXBlcy5BTU9VTlQpO1xucmV0dXJuIGJ1aWxkZXI7XG4gfTtcblxuLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogQnJhbmQsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG5jb25zdCBhZGRCcmFuZD0obmFtZSx2YWx1ZSxidWlsZGVyKT0+e1xuY29uc3QgYXNzZXJ0QnJhbmQ9bWFrZUxvb2tzTGlrZUJyYW5kKG5hbWUpO1xuYnVpbGRDb3B5UGFyYW0obmFtZSx2YWx1ZSxhc3NlcnRCcmFuZCxQYXJhbVR5cGVzLkJSQU5EKTtcbnJldHVybiBidWlsZGVyO1xuIH07XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEluc3RhbGxhdGlvbjx1bmtub3duPiwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbmNvbnN0IGFkZEluc3RhbGxhdGlvbj0obmFtZSx2YWx1ZSxidWlsZGVyKT0+e1xuY29uc3QgYXNzZXJ0SW5zdGFsbGF0aW9uPW1ha2VBc3NlcnRJbnN0YWxsYXRpb24obmFtZSk7XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydEluc3RhbGxhdGlvbixQYXJhbVR5cGVzLklOU1RBTExBVElPTik7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBJbnN0YW5jZSwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbmNvbnN0IGFkZEluc3RhbmNlPShuYW1lLHZhbHVlLGJ1aWxkZXIpPT57XG5jb25zdCBhc3NlcnRJbnN0YW5jZT1tYWtlQXNzZXJ0SW5zdGFuY2UobmFtZSk7XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydEluc3RhbmNlLFBhcmFtVHlwZXMuSU5TVEFOQ0UpO1xucmV0dXJuIGJ1aWxkZXI7XG4gfTtcblxuLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogYmlnaW50LCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuY29uc3QgYWRkTmF0PShuYW1lLHZhbHVlLGJ1aWxkZXIpPT57XG5jb25zdCBhc3NlcnROYXQ9KHYpPT57XG5hc3NlcnQudHlwZW9mKHYsJ2JpZ2ludCcpO1xuTmF0KHYpO1xucmV0dXJuIHRydWU7XG4gfTtcbmJ1aWxkQ29weVBhcmFtKG5hbWUsdmFsdWUsYXNzZXJ0TmF0LFBhcmFtVHlwZXMuTkFUKTtcbnJldHVybiBidWlsZGVyO1xuIH07XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IFJhdGlvLCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuY29uc3QgYWRkUmF0aW89KG5hbWUsdmFsdWUsYnVpbGRlcik9PntcbmNvbnN0IGFzc2VydEJyYW5kZWRSYXRpbz1tYWtlQXNzZXJ0QnJhbmRlZFJhdGlvKG5hbWUsdmFsdWUpO1xuYnVpbGRDb3B5UGFyYW0obmFtZSx2YWx1ZSxhc3NlcnRCcmFuZGVkUmF0aW8sUGFyYW1UeXBlcy5SQVRJTyk7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVJlY29yZDx1bmtub3duPiwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbmNvbnN0IGFkZFJlY29yZD0obmFtZSx2YWx1ZSxidWlsZGVyKT0+e1xuY29uc3QgYXNzZXJ0UmVjb3JkPSh2KT0+e1xucGFzc1N0eWxlT2Yodik7XG5hc3NlcnQudHlwZW9mKHYsJ29iamVjdCcpO1xuIH07XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydFJlY29yZCxQYXJhbVR5cGVzLlBBU1NBQkxFX1JFQ09SRCk7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG5jb25zdCBhZGRTdHJpbmc9KG5hbWUsdmFsdWUsYnVpbGRlcik9PntcbmNvbnN0IGFzc2VydFN0cmluZz0odik9PmFzc2VydC50eXBlb2Yodiwnc3RyaW5nJyk7XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydFN0cmluZyxQYXJhbVR5cGVzLlNUUklORyk7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wLCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuY29uc3QgYWRkVGltZXN0YW1wPShuYW1lLHZhbHVlLGJ1aWxkZXIpPT57XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydFRpbWVzdGFtcCxQYXJhbVR5cGVzLlRJTUVTVEFNUCk7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuUmVsYXRpdmVUaW1lLCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuY29uc3QgYWRkUmVsYXRpdmVUaW1lPShuYW1lLHZhbHVlLGJ1aWxkZXIpPT57XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydFJlbGF0aXZlVGltZSxQYXJhbVR5cGVzLlJFTEFUSVZFX1RJTUUpO1xucmV0dXJuIGJ1aWxkZXI7XG4gfTtcblxuLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuY29uc3QgYWRkVW5rbm93bj0obmFtZSx2YWx1ZSxidWlsZGVyKT0+e1xuY29uc3QgYXNzZXJ0VW5rbm93bj0oX3YpPT50cnVlO1xuYnVpbGRDb3B5UGFyYW0obmFtZSx2YWx1ZSxhc3NlcnRVbmtub3duLFBhcmFtVHlwZXMuVU5LTk9XTik7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG5jb25zdCBhc3NlcnRJbnZpdGF0aW9uPWFzeW5jKGkpPT57XG5pZighem9lKXtcbnRocm93IEZhaWwgYHpvZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBnb3Zlcm5lZCBJbnZpdGF0aW9ucyAke3pvZX1gO1xuIH1cbmNvbnN0e2luc3RhbmNlLGluc3RhbGxhdGlvbn09YXdhaXQgRSh6b2UpLmdldEludml0YXRpb25EZXRhaWxzKGkpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItdHMtZXhwZWN0LWVycm9yIC0tIHRoZSBidWlsZCBjb25maWcgZG9lc24ndCBleHBlY3QgYW4gZXJyb3IgaGVyZSovXG4vKiBAdHMtaWdub3JlIHR5cGVkZWZzIHNheSB0aGV5J3JlIGd1YXJhbnRlZWQgdHJ1dGh5IGJ1dCBqdXN0IHRvIGJlIHNhZmUqL1xuYXNzZXJ0KGluc3RhbmNlJiZpbnN0YWxsYXRpb24sJ211c3QgYmUgYW4gaW52aXRhdGlvbicpO1xuIH07XG5cbi8qKlxuICogSW52aXRhdGlvbnMgYXJlIGNsb3NlbHkgaGVsZCwgc28gd2Ugc2hvdWxkIHB1YmxpY2x5IHJldmVhbCBvbmx5IHRoZSBhbW91bnQuXG4gKiBUaGUgYXBwcm9hY2ggaGVyZSBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgY29udHJhY3RzIHRvIGdldCB0aGUgYWN0dWFsXG4gKiBpbnZpdGF0aW9uIHByaXZhdGVseSwgYW5kIGxlZ2libHkgYXNzdXJlIGNsaWVudHMgdGhhdCBpdCBtYXRjaGVzIHRoZVxuICogcHVibGljbHkgdmlzaWJsZSBpbnZpdGF0aW9uIGFtb3VudC4gQ29udHJhY3QgcmV2aWV3ZXJzIHN0aWxsIGhhdmUgdG9cbiAqIG1hbnVhbGx5IHZlcmlmeSB0aGF0IHRoZSBhY3R1YWwgaW52aXRhdGlvbiBpcyBoYW5kbGVkIGNhcmVmdWxseS5cbiAqIGBnZXRJbnRlcm5hbFZhbHVlKClgIHdpbGwgb25seSBiZSBhY2Nlc3NpYmxlIHdpdGhpbiB0aGUgY29udHJhY3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7SW52aXRhdGlvbn0gaW52aXRhdGlvblxuICovXG5jb25zdCBidWlsZEludml0YXRpb25QYXJhbT0obmFtZSxpbnZpdGF0aW9uKT0+e1xuaWYoIXpvZSl7XG50aHJvdyBGYWlsIGB6b2UgbXVzdCBiZSBwcm92aWRlZCBmb3IgZ292ZXJuZWQgSW52aXRhdGlvbnMgJHt6b2V9YDtcbiB9XG5sZXQgY3VycmVudEludml0YXRpb247XG5sZXQgY3VycmVudEFtb3VudDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7W0ludml0YXRpb24sIEFtb3VudF19IFNldEludml0YXRpb25QYXJhbVxuICovXG5cbi8qKlxuICogQXN5bmMgcGhhc2UgdG8gcHJlcGFyZSBmb3Igc3luY2hyb25vdXMgc2V0dGluZ1xuICpcbiAqIEBwYXJhbSB7SW52aXRhdGlvbn0gaW52aXRlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTZXRJbnZpdGF0aW9uUGFyYW0+fVxuICovXG5jb25zdCBwcmVwYXJlVG9TZXRJbnZpdGF0aW9uPWFzeW5jKGludml0ZSk9PntcbmNvbnN0W3ByZXBhcmVkQW1vdW50XT1hd2FpdCBQcm9taXNlLmFsbChbXG5FKEUoem9lKS5nZXRJbnZpdGF0aW9uSXNzdWVyKCkpLmdldEFtb3VudE9mKGludml0ZSksXG5hc3NlcnRJbnZpdGF0aW9uKGludml0ZSldKTtcblxuXG5yZXR1cm5baW52aXRlLHByZXBhcmVkQW1vdW50XTtcbiB9O1xuXG4vKipcbiAqIFN5bmNocm9ub3VzIHBoYXNlIG9mIHZhbHVlIHNldHRpbmdcbiAqXG4gKiBAcGFyYW0ge1NldEludml0YXRpb25QYXJhbX0gcGFyYW0wXG4gKi9cbmNvbnN0IHNldEludml0YXRpb249KFtuZXdJbnZpdGF0aW9uLGFtb3VudF0pPT57XG5jdXJyZW50QW1vdW50PWFtb3VudDtcbmN1cnJlbnRJbnZpdGF0aW9uPW5ld0ludml0YXRpb247XG5yZXR1cm4gaGFyZGVuKHtbbmFtZV06Y3VycmVudEFtb3VudH0pO1xuIH07XG5cbmNvbnN0IG1ha2VEZXNjcmlwdGlvbj0oKT0+e1xucmV0dXJue3R5cGU6UGFyYW1UeXBlcy5JTlZJVEFUSU9OLHZhbHVlOmN1cnJlbnRBbW91bnR9O1xuIH07XG5cbmNvbnN0IGdldFZpc2libGVWYWx1ZT1hc3luYyhhbGxlZ2VkSW52aXRhdGlvbik9PlxuRShFKHpvZSkuZ2V0SW52aXRhdGlvbklzc3VlcigpKS5nZXRBbW91bnRPZihhbGxlZ2VkSW52aXRhdGlvbik7XG5cbmNvbnN0IHB1YmxpY01ldGhvZHM9RmFyKCBgUGFyYW1ldGVyICR7bmFtZX1gLHtcbmdldFZhbHVlOigpPT5jdXJyZW50QW1vdW50LFxuZ2V0SW50ZXJuYWxWYWx1ZTooKT0+Y3VycmVudEludml0YXRpb24sXG5hc3NlcnRUeXBlOmFzc2VydEludml0YXRpb24sXG5tYWtlRGVzY3JpcHRpb24sXG5nZXRUeXBlOigpPT5QYXJhbVR5cGVzLklOVklUQVRJT04sXG5nZXRWaXNpYmxlVmFsdWV9KTtcblxuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZ2V0dGVyc1sgYGdldCR7bmFtZX1gXT0oKT0+Z2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOVklUQVRJT04sbmFtZSk7XG4vKiBDUlVDSUFMOiBoZXJlIHdlJ3JlIGNyZWF0aW5nIHRoZSB1cGRhdGUgZnVuY3Rpb25zIHRoYXQgY2FuIGNoYW5nZSB0aGUqL1xuLyogdmFsdWVzIG9mIHRoZSBnb3Zlcm5lZCBjb250cmFjdCdzIHBhcmFtZXRlcnMuIFdlJ2xsIHJldHVybiB1cGRhdGVQYXJhbXMqL1xuLyogKHdoaWNoIGNhbiBpbnZva2UgYWxsIG9mIHRoZW0pIHRvIG91ciBjYWxsZXIuIFRoZXkgbXVzdCBoYW5kbGUgaXQqL1xuLyogY2FyZWZ1bGx5IHRvIGVuc3VyZSB0aGF0IHRoZXkgZW5kIHVwIGluIGFwcHJvcHJpYXRlIGhhbmRzLiovXG5zZXR0ZXJzWyBgcHJlcGFyZVRvVXBkYXRlJHtuYW1lfWBdPXByZXBhcmVUb1NldEludml0YXRpb247XG5zZXR0ZXJzWyBgdXBkYXRlJHtuYW1lfWBdPXNldEludml0YXRpb247XG5cbi8qIFhYWCBsZXQgdGhlIHZhbHVlIGJlIHNldCBhc3luYy4gQSBjb25jZXNzaW9uIHRvIHVwZ3JhZGFiaWxpdHkqL1xuLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzQzKi9cbmNvbnN0IGZpbmlzaEludml0YXRpb25QYXJhbT1FLndoZW4oXG5wcmVwYXJlVG9TZXRJbnZpdGF0aW9uKGludml0YXRpb24pLFxuKGludml0YXRpb25BbmRBbW91bnQpPT57XG5zZXRJbnZpdGF0aW9uKGludml0YXRpb25BbmRBbW91bnQpO1xuLyogZGVsYXkgdW50aWwgY3VycmVudEFtb3VudCBpcyBkZWZpbmVkIGJlY2F1c2UgcmVhZGVycyBleHBlY3QgYSB2YWxpZCB2YWx1ZSovXG5uYW1lc1RvUGFyYW1zLmluaXQobmFtZSxwdWJsaWNNZXRob2RzKTtcbiB9KTtcblxudW5maW5pc2hlZFBhcmFtcy5wdXNoKGZpbmlzaEludml0YXRpb25QYXJhbSk7XG5cbnJldHVybiBuYW1lO1xuIH07XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEludml0YXRpb24sIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG5jb25zdCBhZGRJbnZpdGF0aW9uPShuYW1lLHZhbHVlLGJ1aWxkZXIpPT57XG5hc3NlcnRLZXl3b3JkTmFtZShuYW1lKTtcbnZhbHVlIT09bnVsbHx8RmFpbCBgcGFyYW0gJHtxKG5hbWUpfSBtdXN0IGJlIGRlZmluZWRgO1xuXG5idWlsZEludml0YXRpb25QYXJhbShuYW1lLHZhbHVlKTtcblxucmV0dXJuIGJ1aWxkZXI7XG4gfTtcblxuLyogUEFSQU0gTUFOQUdFUiBNRVRIT0RTIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG5jb25zdCBnZXRUeXBlZFBhcmFtPSh0eXBlLG5hbWUpPT57XG5jb25zdCBwYXJhbT1uYW1lc1RvUGFyYW1zLmdldChuYW1lKTtcbnR5cGU9PT1wYXJhbS5nZXRUeXBlKCl8fEZhaWwgYCR7bmFtZX0gaXMgbm90ICR7dHlwZX1gO1xucmV0dXJuIHBhcmFtLmdldFZhbHVlKCk7XG4gfTtcblxuY29uc3QgZ2V0VmlzaWJsZVZhbHVlPShuYW1lLHByb3Bvc2VkKT0+e1xuY29uc3QgcGFyYW09bmFtZXNUb1BhcmFtcy5nZXQobmFtZSk7XG5yZXR1cm4gcGFyYW0uZ2V0VmlzaWJsZVZhbHVlKHByb3Bvc2VkKTtcbiB9O1xuXG4vKiBzaG91bGQgYmUgZXhwb3NlZCB3aXRoaW4gY29udHJhY3RzLCBhbmQgbm90IGV4dGVybmFsbHksIGZvciBpbnZpdGF0aW9ucyovXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8SW52aXRhdGlvbj59ICovXG5jb25zdCBnZXRJbnRlcm5hbFBhcmFtVmFsdWU9YXN5bmMobmFtZSk9PntcbmF3YWl0IGZpbmlzaEJ1aWxkaW5nKCk7XG5yZXR1cm4gbmFtZXNUb1BhcmFtcy5nZXQobmFtZSkuZ2V0SW50ZXJuYWxWYWx1ZSgpO1xuIH07XG5cbmNvbnN0IGdldFBhcmFtcz1hc3luYygpPT57XG5hd2FpdCBmaW5pc2hCdWlsZGluZygpO1xuLyoqIEB0eXBlIHtQYXJhbVN0YXRlUmVjb3JkfSAqL1xuY29uc3QgZGVzY3JpcHRpb25zPXt9O1xuZm9yKGNvbnN0W25hbWUscGFyYW1db2YgbmFtZXNUb1BhcmFtcy5lbnRyaWVzKCkpe1xuZGVzY3JpcHRpb25zW25hbWVdPXBhcmFtLm1ha2VEZXNjcmlwdGlvbigpO1xuIH1cbnJldHVybiBoYXJkZW4oZGVzY3JpcHRpb25zKTtcbiB9O1xuXG4vKiogQHR5cGUge1VwZGF0ZVBhcmFtc30gKi9cbmNvbnN0IHVwZGF0ZVBhcmFtcz1hc3luYyhwYXJhbUNoYW5nZXMpPT57XG5hd2FpdCBmaW5pc2hCdWlsZGluZygpO1xuY29uc3QgcGFyYW1OYW1lcz1PYmplY3Qua2V5cyhwYXJhbUNoYW5nZXMpO1xuXG4vKiBwcm9taXNlcyB0byBwcmVwYXJlIGV2ZXJ5IHVwZGF0ZSovXG5jb25zdCBhc3luY1Jlc3VsdHM9cGFyYW1OYW1lcy5tYXAoKG5hbWUpPT5cbnNldHRlcnNbIGBwcmVwYXJlVG9VcGRhdGUke25hbWV9YF0ocGFyYW1DaGFuZ2VzW25hbWVdKSk7XG5cbi8qIGlmIGFueSB1cGRhdGUgZG9lc24ndCBzdWNjZWVkLCBmYWlsIHRoZSByZXF1ZXN0Ki9cbmNvbnN0IHByZXBhcmVkPWF3YWl0IFByb21pc2UuYWxsKGFzeW5jUmVzdWx0cyk7XG5cbi8qIGFjdHVhbGx5IHVwZGF0ZSovXG5mb3IoY29uc3RbaSxuYW1lXW9mIHBhcmFtTmFtZXMuZW50cmllcygpKXtcbmNvbnN0IHNldEZuPXNldHRlcnNbIGB1cGRhdGUke25hbWV9YF07XG5zZXRGbihwcmVwYXJlZFtpXSk7XG4gfVxucHVibGlzaCgpO1xuIH07XG5cbi8qIENhbGxlZCBhZnRlciBhbGwgcGFyYW1zIGhhdmUgYmVlbiBhZGRlZCB3aXRoIHRoZWlyIGluaXRpYWwgdmFsdWVzKi9cbmNvbnN0IGJ1aWxkPSgpPT57XG4vKiBYWFggbGV0IHBhcmFtcyBiZSBmaW5pc2hlZCBhc3luYy4gQSBjb25jZXNzaW9uIHRvIHVwZ3JhZGFiaWxpdHkqL1xuLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzQzKi9cbkUud2hlbihmaW5pc2hCdWlsZGluZygpLCgpPT5wdWJsaXNoKCkpO1xuXG4vKiBDUlVDSUFMOiBDb250cmFjdHMgdGhhdCBjYWxsIGJ1aWxkUGFyYW1NYW5hZ2VyIHNob3VsZCBvbmx5IGV4cG9ydCB0aGUqL1xuLyogcmVzdWx0aW5nIHBhcmFtTWFuYWdlciB0byB0aGVpciBjcmVhdG9yRmFjZXQsIHdoZXJlIGl0IHdpbGwgYmUgcGlja2VkIHVwIGJ5Ki9cbi8qIGNvbnRyYWN0R292ZXJub3IuIFRoZSBnZXRQYXJhbXMgbWV0aG9kIGNhbiBiZSBzaGFyZWQgd2lkZWx5LiovXG5yZXR1cm4gRmFyKCdwYXJhbSBtYW5hZ2VyJyx7XG5nZXRQYXJhbXMsXG5nZXRTdWJzY3JpcHRpb246KCk9PnN1YnNjcmliZXIsXG5nZXRBbW91bnQ6KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuQU1PVU5ULG5hbWUpLFxuZ2V0QnJhbmQ6KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuQlJBTkQsbmFtZSksXG5nZXRJbnN0YW5jZToobmFtZSk9PmdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5JTlNUQU5DRSxuYW1lKSxcbmdldEluc3RhbGxhdGlvbjoobmFtZSk9PmdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5JTlNUQUxMQVRJT04sbmFtZSksXG5nZXRJbnZpdGF0aW9uQW1vdW50OihuYW1lKT0+Z2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOVklUQVRJT04sbmFtZSksXG5nZXROYXQ6KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuTkFULG5hbWUpLFxuZ2V0UmF0aW86KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuUkFUSU8sbmFtZSksXG5nZXRSZWNvcmQ6KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuUEFTU0FCTEVfUkVDT1JELG5hbWUpLFxuZ2V0U3RyaW5nOihuYW1lKT0+Z2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlNUUklORyxuYW1lKSxcbmdldFRpbWVzdGFtcDoobmFtZSk9PmdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5USU1FU1RBTVAsbmFtZSksXG5nZXRSZWxhdGl2ZVRpbWU6KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuUkVMQVRJVkVfVElNRSxuYW1lKSxcbmdldFVua25vd246KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuVU5LTk9XTixuYW1lKSxcbmdldFZpc2libGVWYWx1ZSxcbmdldEludGVybmFsUGFyYW1WYWx1ZSxcbi8qIEdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGVhY2ggcGFyYW0gdmFsdWUqL1xuLi4uZ2V0dGVycyxcbnVwZGF0ZVBhcmFtcyxcbi8qIENvbGxlY3Rpb24gb2YgYWxsIGdldHRlcnMgZm9yIHBhc3NpbmcgdG8gcmVhZC1vbmx5IGNvbnRleHRzKi9cbnJlYWRvbmx5OigpPT5oYXJkZW4oZ2V0dGVycyl9KTtcblxuIH07XG5cbi8qKiBAdHlwZSB7UGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbmNvbnN0IGJ1aWxkZXI9e1xuYWRkQW1vdW50OihuLHYpPT5hZGRBbW91bnQobix2LGJ1aWxkZXIpLFxuYWRkQnJhbmQ6KG4sdik9PmFkZEJyYW5kKG4sdixidWlsZGVyKSxcbmFkZEluc3RhbGxhdGlvbjoobix2KT0+YWRkSW5zdGFsbGF0aW9uKG4sdixidWlsZGVyKSxcbmFkZEluc3RhbmNlOihuLHYpPT5hZGRJbnN0YW5jZShuLHYsYnVpbGRlciksXG5hZGRVbmtub3duOihuLHYpPT5hZGRVbmtub3duKG4sdixidWlsZGVyKSxcbmFkZEludml0YXRpb246KG4sdik9PmFkZEludml0YXRpb24obix2LGJ1aWxkZXIpLFxuYWRkTmF0OihuLHYpPT5hZGROYXQobix2LGJ1aWxkZXIpLFxuYWRkUmF0aW86KG4sdik9PmFkZFJhdGlvKG4sdixidWlsZGVyKSxcbmFkZFJlY29yZDoobix2KT0+YWRkUmVjb3JkKG4sdixidWlsZGVyKSxcbmFkZFN0cmluZzoobix2KT0+YWRkU3RyaW5nKG4sdixidWlsZGVyKSxcbmFkZFJlbGF0aXZlVGltZToobix2KT0+YWRkUmVsYXRpdmVUaW1lKG4sdixidWlsZGVyKSxcbmFkZFRpbWVzdGFtcDoobix2KT0+YWRkVGltZXN0YW1wKG4sdixidWlsZGVyKSxcbmJ1aWxkfTtcblxucmV0dXJuIGJ1aWxkZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKTtcblxuaGFyZGVuKGFzc2VydEVsZWN0b3JhdGVNYXRjaGVzKTtcbmhhcmRlbihtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiOlsiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiXSwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiOlsibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANWDzcecXAADnFwAARgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIi4uL2NvbnN0YW50cy5qcyIsIi4vZ292ZXJuUGFyYW0uanMiLCIuL3BhcmFtTWFuYWdlci5qcyJdLCJleHBvcnRzIjpbIm1ha2VQYXJhbU1hbmFnZXIiLCJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zIiwibWFrZVBhcmFtTWFuYWdlclN5bmMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxQYXJhbVR5cGVzLENPTlRSQUNUX0VMRUNUT1JBVEUsbWFrZVBhcmFtTWFuYWdlckJ1aWxkZXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9jb25zdGFudHMuanNcIiwgW1tcIlBhcmFtVHlwZXNcIiwgWyRo4oCNX2EgPT4gKFBhcmFtVHlwZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLCBbJGjigI1fYSA9PiAoQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcmFtTWFuYWdlci5qc1wiLCBbW1wibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgUGFyYW1UeXBlPn0gUGFyYW1UeXBlc01hcFxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1TdGF0ZVJlY29yZH0gTVxuICogQHR5cGVkZWYge3sgW1IgaW4ga2V5b2YgTV06IE1bUl1bJ3R5cGUnXX19IFBhcmFtVHlwZXNNYXBGcm9tUmVjb3JkXG4gKi9cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGVzTWFwfSBNXG4gKiBAdHlwZWRlZiB7eyBbVCBpbiBrZXlvZiBNXTogeyB0eXBlOiBNW1RdLCB2YWx1ZTogUGFyYW1WYWx1ZUZvclR5cGU8TVtUXT4gfSB9fSBQYXJhbVJlY29yZHNGcm9tVHlwZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlc01hcH0gTVxuICogQHR5cGVkZWYge3tcbiAqICAgW0sgaW4ga2V5b2YgTSBhcyBgZ2V0JHtzdHJpbmcgJiBLfWBdOiAoKSA9PiBQYXJhbVZhbHVlRm9yVHlwZTxNW0tdPlxuICogfX0gR2V0dGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGVzTWFwfSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICBbSyBpbiBrZXlvZiBUIGFzIGB1cGRhdGUke3N0cmluZyAmIEt9YF06ICh2YWx1ZTogUGFyYW1WYWx1ZUZvclR5cGU8VFtLXT4pID0+IHZvaWRcbiAqIH19IFVwZGF0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZXNNYXB9IE1cbiAqIEB0eXBlZGVmIHtQYXJhbU1hbmFnZXJCYXNlICYgR2V0dGVyczxNPiAmIFVwZGF0ZXJzPE0+ICYge3JlYWRvbmx5OiAoKSA9PiBHZXR0ZXJzPE0+fSAmIHt1cGRhdGVQYXJhbXM6IFVwZGF0ZVBhcmFtc319IFR5cGVkUGFyYW1NYW5hZ2VyXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1BhcmFtVHlwZX0gdHlwZVxuICovXG5jb25zdCBidWlsZGVyTWV0aG9kTmFtZT0odHlwZSk9PlxuIGBhZGQke3R5cGVbMF0udG9VcHBlckNhc2UoKSt0eXBlLnN1YnN0cmluZygxKX1gO1xuXG4vKiogQHR5cGUge1BhcnRpYWw8UmVjb3JkPFBhcmFtVHlwZSwgYm9vbGVhbj4+fSAqL1xuY29uc3QgaXNBc3luYz17XG5pbnZpdGF0aW9uOnRydWV9O1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGV9IFRcbiAqIEB0eXBlZGVmIHtbdHlwZTogVCwgdmFsdWU6IFBhcmFtVmFsdWVGb3JUeXBlPFQ+XX0gU1QgcGFyYW0gc3BlYyB0dXBsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgdHlwZTogJ2ludml0YXRpb24nLCB2YWx1ZTogQW1vdW50PCdzZXQnPiB9fSBJbnZpdGF0aW9uUGFyYW1cbiAqL1xuXG4vKiBYWFggYmV0dGVyIHRvIHVzZSB0aGUgbWFuaWZlc3QgY29uc3RhbnQgUGFyYW1UeXBlcyovXG4vKiBidXQgaW1wb3J0aW5nIHRoYXQgaGVyZSB0dXJucyB0aGlzIGZpbGUgaW50byBhIG1vZHVsZSwqL1xuLyogYnJlYWtpbmcgdGhlIGFtYmllbnQgdHlwaW5nKi9cbi8qKlxuICogQHR5cGVkZWYge1NUPCdhbW91bnQnPlxuICogfCBTVDwnYnJhbmQnPlxuICogfCBTVDwnaW5zdGFsbGF0aW9uJz5cbiAqIHwgU1Q8J2luc3RhbmNlJz5cbiAqIHwgU1Q8J25hdCc+XG4gKiB8IFNUPCdyYXRpbyc+XG4gKiB8IFNUPCdzdHJpbmcnPlxuICogfCBTVDwndGltZXN0YW1wJz5cbiAqIHwgU1Q8J3JlbGF0aXZlVGltZSc+XG4gKiB8IFNUPCd1bmtub3duJz59IFN5bmNTcGVjVHVwbGVcbiAqXG4gKiBAdHlwZWRlZiB7WydpbnZpdGF0aW9uJywgSW52aXRhdGlvbl19IEFzeW5jU3BlY1R1cGxlXG4gKi9cblxuLyoqXG4gKiBAc2VlIG1ha2VQYXJhbU1hbmFnZXJTeW5jXG4gKiBAdGVtcGxhdGUge1JlY29yZDxLZXl3b3JkLCBBc3luY1NwZWNUdXBsZSB8IFN5bmNTcGVjVHVwbGU+fSBUXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvbm90aWZpZXInKS5TdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gcHVibGlzaGVyS2l0XG4gKiBAcGFyYW0ge1R9IHNwZWNcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEByZXR1cm5zIHtUeXBlZFBhcmFtTWFuYWdlcjx7W0sgaW4ga2V5b2YgVF06IFRbS11bMF19Pn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VQYXJhbU1hbmFnZXI9KHB1Ymxpc2hlcktpdCxzcGVjLHpjZik9PntcbmNvbnN0IGJ1aWxkZXI9bWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIocHVibGlzaGVyS2l0LHpjZi5nZXRab2VTZXJ2aWNlKCkpO1xuXG5jb25zdCBwcm9taXNlcz1bXTtcbmZvcihjb25zdFtuYW1lLFt0eXBlLHZhbHVlXV1vZiBPYmplY3QuZW50cmllcyhzcGVjKSl7XG5jb25zdCBhZGQ9YnVpbGRlcltidWlsZGVyTWV0aG9kTmFtZSh0eXBlKV07XG5pZihpc0FzeW5jW3R5cGVdKXtcbnByb21pc2VzLnB1c2goYWRkKG5hbWUsdmFsdWUpKTtcbiB9ZWxzZXtcbmFkZChuYW1lLHZhbHVlKTtcbiB9XG4gfVxuLyogWFhYIGtpY2sgb2ZmIHByb21pc2VzIGJ1dCBkb24ndCBibG9jay4gVGhpcyBpcyBhIGNvbmNlc3Npb24gdG8gY29udHJhY3QgcmVpbmNhcm5hdGlvbiovXG4vKiB3aGljaCBjYW5ub3QgYmxvY2sgb24gYSByZW1vdGUgY2FsbC4qL1xuLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzQzKi9cbnZvaWQgRS53aGVuKFByb21pc2UuYWxsKHByb21pc2VzKSx1bmRlZmluZWQsKHJlYXNvbik9PlxuemNmLnNodXRkb3duV2l0aEZhaWx1cmUocmVhc29uKSk7XG5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiBidWlsZGVyLmJ1aWxkKCk7XG4gfTskaOKAjV9vbmNlLm1ha2VQYXJhbU1hbmFnZXIobWFrZVBhcmFtTWFuYWdlcik7XG5oYXJkZW4obWFrZVBhcmFtTWFuYWdlcik7XG5cbi8qKlxuICogVXNlZCBvbmx5IHdoZW4gdGhlIGNvbnRyYWN0IGhhcyBtdWx0aXBsZSBwYXJhbSBtYW5hZ2Vycy5cbiAqIEV4YWN0bHkgb25lIG11c3QgbWFuYWdlIHRoZSBlbGVjdG9yYXRlLCB3aGljaCByZXF1aXJlcyB0aGUgYXN5bmMgdmVyc2lvbi5cbiAqXG4gKiBAc2VlIG1ha2VQYXJhbU1hbmFnZXJcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPEtleXdvcmQsIFN5bmNTcGVjVHVwbGU+fSBUXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvbm90aWZpZXInKS5TdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gcHVibGlzaGVyS2l0XG4gKiBAcGFyYW0ge1R9IHNwZWNcbiAqIEByZXR1cm5zIHtUeXBlZFBhcmFtTWFuYWdlcjx7W0sgaW4ga2V5b2YgVF06IFRbS11bMF19Pn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VQYXJhbU1hbmFnZXJTeW5jPShwdWJsaXNoZXJLaXQsc3BlYyk9PntcbmNvbnN0IGJ1aWxkZXI9bWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIocHVibGlzaGVyS2l0KTtcblxuZm9yKGNvbnN0W25hbWUsW3R5cGUsdmFsdWVdXW9mIE9iamVjdC5lbnRyaWVzKHNwZWMpKXtcbmNvbnN0IGFkZD1idWlsZGVyW2J1aWxkZXJNZXRob2ROYW1lKHR5cGUpXTtcbmFkZHx8RmFpbCBgTm8gYnVpbGRlciBtZXRob2QgZm9yIHBhcmFtIHR5cGUgJHtxKHR5cGUpfWA7XG5hZGQobmFtZSx2YWx1ZSk7XG4gfVxuXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTtcbiB9OyRo4oCNX29uY2UubWFrZVBhcmFtTWFuYWdlclN5bmMobWFrZVBhcmFtTWFuYWdlclN5bmMpO1xuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXJTeW5jKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIEludml0YXRpb24+ICYge0VsZWN0b3JhdGU6IEludml0YXRpb259fSBJIFByaXZhdGUgaW52aXRhdGlvbiB2YWx1ZXNcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlc01hcH0gTSBNYXAgb2YgdHlwZXMgb2YgY3VzdG9tIGdvdmVybmVkIHRlcm1zXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvbm90aWZpZXInKS5TdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gcHVibGlzaGVyS2l0XG4gKiBAcGFyYW0ge1pDRjxHb3Zlcm5hbmNlVGVybXM8TT4+fSB6Y2ZcbiAqIEBwYXJhbSB7SX0gaW52aXRhdGlvbnMgaW52aXRhdGlvbiBvYmplY3RzLCB3aGljaCBtdXN0IGNvbWUgZnJvbSBwcml2YXRlQXJnc1xuICogQHBhcmFtIHtNfSBwYXJhbVR5cGVzTWFwXG4gKiBAcmV0dXJucyB7VHlwZWRQYXJhbU1hbmFnZXI8TSAmIHtbSyBpbiBrZXlvZiBJXTogJ2ludml0YXRpb24nfT59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zPShcbnB1Ymxpc2hlcktpdCxcbnpjZixcbmludml0YXRpb25zLFxucGFyYW1UeXBlc01hcCk9Plxue1xuY29uc3R7Z292ZXJuZWRQYXJhbXN9PXpjZi5nZXRUZXJtcygpO1xuLyoqIEB0eXBlIHtBcnJheTxbS2V5d29yZCwgU3luY1NwZWNUdXBsZSB8IEFzeW5jU3BlY1R1cGxlXT59ICovXG5jb25zdCBtYWtlclNwZWNFbnRyaWVzPU9iamVjdC5lbnRyaWVzKHBhcmFtVHlwZXNNYXApLm1hcChcbihbcGFyYW1LZXkscGFyYW1UeXBlXSk9PltcbnBhcmFtS2V5LFxuLyoqIEB0eXBlIHtTeW5jU3BlY1R1cGxlfSAqL1tcbnBhcmFtVHlwZSxcbmdvdmVybmVkUGFyYW1zW3BhcmFtS2V5XS52YWx1ZV1dKTtcblxuXG5cbi8qIEV2ZXJ5IGdvdmVybmVkIGNvbnRyYWN0IGhhcyBhbiBFbGVjdG9yYXRlIHBhcmFtIHRoYXQgc3RhcnRzIGFzIGBpbml0aWFsUG9zZXJJbnZpdGF0aW9uYCBwcml2YXRlIGFyZyovXG5mb3IoY29uc3RbbmFtZSxpbnZpdGF0aW9uXW9mIE9iamVjdC5lbnRyaWVzKGludml0YXRpb25zKSl7XG5tYWtlclNwZWNFbnRyaWVzLnB1c2goW25hbWUsW1BhcmFtVHlwZXMuSU5WSVRBVElPTixpbnZpdGF0aW9uXV0pO1xuIH1cbmNvbnN0IG1ha2VyU3BlYz1PYmplY3QuZnJvbUVudHJpZXMobWFrZXJTcGVjRW50cmllcyk7XG5tYWtlclNwZWNbQ09OVFJBQ1RfRUxFQ1RPUkFURV18fFxuRmFpbCBgbWlzc2luZyBFbGVjdG9yYXRlIGludml0YXRpb24gcGFyYW0gdmFsdWVgO1xuXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuIG1ha2VQYXJhbU1hbmFnZXIocHVibGlzaGVyS2l0LG1ha2VyU3BlYyx6Y2YpO1xuIH07JGjigI1fb25jZS5tYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMpO1xuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQYXJhbU1hbmFnZXIiOlsibWFrZVBhcmFtTWFuYWdlciJdLCJtYWtlUGFyYW1NYW5hZ2VyU3luYyI6WyJtYWtlUGFyYW1NYW5hZ2VyU3luYyJdLCJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zIjpbIm1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbf+G140jAACNIwAAMgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybm9yLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIiwiLi9jb250cmFjdEdvdmVybm9yS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsibWV0YSIsInN0YXJ0IiwidmFsaWRhdGVRdWVzdGlvbkRldGFpbHMiLCJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbXVzdE1hdGNoLEUsbWFrZVRyYWNlcixwcm92aWRlU2luZ2xldG9uLENPTlRSQUNUX0VMRUNUT1JBVEUscHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQsUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJtYWtlVHJhY2VyXCIsIFskaOKAjV9hID0+IChtYWtlVHJhY2VyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qc1wiLCBbW1wicHJvdmlkZVNpbmdsZXRvblwiLCBbJGjigI1fYSA9PiAocHJvdmlkZVNpbmdsZXRvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLCBbJGjigI1fYSA9PiAoQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJub3JLaXQuanNcIiwgW1tcInByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlXCIsIFskaOKAjV9hID0+IChQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuY29uc3QgdHJhY2U9bWFrZVRyYWNlcignQ0dvdicsZmFsc2UpO1xuXG4vKiogQHR5cGUge0NvbnRyYWN0TWV0YX0gKi9cbmNvbnN0ICAgICAgICBtZXRhPXtcbnVwZ3JhZGFiaWxpdHk6J2NhblVwZ3JhZGUnfTskaOKAjV9vbmNlLm1ldGEobWV0YSk7XG5cbmhhcmRlbihtZXRhKTtcblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IHRoZSBxdWVzdGlvbiBkZXRhaWxzIGNvcnJlc3BvbmQgdG8gYSBwYXJhbWV0ZXIgY2hhbmdlIHF1ZXN0aW9uXG4gKiB0aGF0IHRoZSBlbGVjdG9yYXRlIGhvc3RzLCBhbmQgdGhhdCB0aGUgdm90ZUNvdW50ZXIgYW5kIG90aGVyIGRldGFpbHMgYXJlXG4gKiBjb25zaXN0ZW50IHdpdGggaXQuXG4gKlxuICogQHBhcmFtIHtFUmVmPFpvZVNlcnZpY2U+fSB6b2VcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGVsZWN0b3JhdGVcbiAqIEBwYXJhbSB7UGFyYW1DaGFuZ2VJc3N1ZURldGFpbHN9IGRldGFpbHNcbiAqL1xuY29uc3QgICAgICAgIHZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzPWFzeW5jKHpvZSxlbGVjdG9yYXRlLGRldGFpbHMpPT57XG5jb25zdHtcbmNvdW50ZXJJbnN0YW5jZSxcbmlzc3VlOntjb250cmFjdDpnb3Zlcm5lZEluc3RhbmNlfX09XG5kZXRhaWxzO1xubXVzdE1hdGNoKGRldGFpbHMsUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG5jb25zdCBnb3Zlcm5vckluc3RhbmNlPWF3YWl0IEUuZ2V0KEUoem9lKS5nZXRUZXJtcyhnb3Zlcm5lZEluc3RhbmNlKSkuXG5lbGVjdGlvbk1hbmFnZXI7XG5jb25zdCBnb3Zlcm5vclB1YmxpYz1FKHpvZSkuZ2V0UHVibGljRmFjZXQoZ292ZXJub3JJbnN0YW5jZSk7XG5cbnJldHVybiBQcm9taXNlLmFsbChbXG5FKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZVZvdGVDb3VudGVyKGNvdW50ZXJJbnN0YW5jZSksXG5FKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZUVsZWN0b3JhdGUoZWxlY3RvcmF0ZSksXG5FKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZVRpbWVyKGRldGFpbHMuY2xvc2luZ1J1bGUpXSk7XG5cbiB9OyRo4oCNX29uY2UudmFsaWRhdGVRdWVzdGlvbkRldGFpbHModmFsaWRhdGVRdWVzdGlvbkRldGFpbHMpO1xuaGFyZGVuKHZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzKTtcblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IHRoZSBxdWVzdGlvbnMgY291bnRlZCBieSB0aGUgdm90ZUNvdW50ZXIgY29ycmVzcG9uZCB0byBhXG4gKiBwYXJhbWV0ZXIgY2hhbmdlIHF1ZXN0aW9uIHRoYXQgdGhlIGVsZWN0b3JhdGUgaG9zdHMsIGFuZCB0aGF0IHRoZVxuICogdm90ZUNvdW50ZXIgYW5kIG90aGVyIGRldGFpbHMgYXJlIGNvbnNpc3RlbnQuXG4gKlxuICogQHBhcmFtIHtFUmVmPFpvZVNlcnZpY2U+fSB6b2VcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGVsZWN0b3JhdGVcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IHZvdGVDb3VudGVyXG4gKi9cbmNvbnN0ICAgICAgICB2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXI9YXN5bmMoXG56b2UsXG5lbGVjdG9yYXRlLFxudm90ZUNvdW50ZXIpPT5cbntcbmNvbnN0IGNvdW50ZXJQdWJsaWNQPUUoem9lKS5nZXRQdWJsaWNGYWNldCh2b3RlQ291bnRlcik7XG5jb25zdCBxdWVzdGlvbkRldGFpbHM9YXdhaXQgRShjb3VudGVyUHVibGljUCkuZ2V0RGV0YWlscygpO1xuXG5yZXR1cm4gdmFsaWRhdGVRdWVzdGlvbkRldGFpbHMoem9lLGVsZWN0b3JhdGUscXVlc3Rpb25EZXRhaWxzKTtcbiB9OyRo4oCNX29uY2UudmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyKHZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlcik7XG5oYXJkZW4odmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7U3RhbmRhcmRUZXJtc30gQ29udHJhY3RHb3Zlcm5vclRlcm1zXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lclNlcnZpY2V9IHRpbWVyXG4gKiBAcHJvcGVydHkge0luc3RhbGxhdGlvbn0gZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvblxuICovXG5cbi8qKlxuICogQ29udHJhY3RHb3Zlcm5vciBpcyBhbiBFbGVjdGlvbk1hbmFnZXIgdGhhdCBzdGFydHMgdXAgYSBjb250cmFjdCBhbmQgaGFuZHNcbiAqIGl0cyBvd24gY3JlYXRvciBhIGZhY2V0IHRoYXQgYWxsb3dzIHRoZW0gdG8gbWFuYWdlIHRoYXQgY29udHJhY3QncyBBUElzLFxuICogb2ZmZXIgZmlsdGVycywgYW5kIHBhcmFtZXRlcnMuXG4gKlxuICogVGhlIHRlcm1zIGZvciB0aGlzIGNvbnRyYWN0IGluY2x1ZGUgdGhlIFRpbWVyLCBhbmQgdGhlIEluc3RhbGxhdGlvbiB0byBiZVxuICogc3RhcnRlZCwgYXMgd2VsbCBhcyBhbiBpc3N1ZXJLZXl3b3JkUmVjb3JkIG9yIHRlcm1zIG5lZWRlZCBieSB0aGUgZ292ZXJuZWRcbiAqIGNvbnRyYWN0LiBUaG9zZSBkZXRhaWxzIGZvciB0aGUgZ292ZXJuZWQgY29udHJhY3QgYXJlIGluY2x1ZGVkIGluIHRoaXNcbiAqIGNvbnRyYWN0J3MgdGVybXMgYXMgYSBcImdvdmVybmVkXCIgcmVjb3JkLiBJZiB0aGUgY29udHJhY3QgZXhwZWN0cyBwcml2YXRlQXJncyxcbiAqIHRob3NlIHdpbGwgYmUgcHJvdmlkZWQgaW4gdGhpcyBjb250cmFjdCdzIGBwcml2YXRlQXJnc2AgdW5kZXIgJ2dvdmVybmVkOicuXG4gKlxuICogdGVybXMgPSB7XG4gKiAgICB0aW1lcixcbiAqICAgIGdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb24sXG4gKiAgICBnb3Zlcm5lZDogeyBpc3N1ZXJLZXl3b3JkUmVjb3JkLCB0ZXJtcyB9LFxuICogfTtcbiAqXG4gKiBUaGUgZWxlY3RvcmF0ZSB0aGF0IHdpbGwgdm90ZSBvbiBnb3Zlcm5hbmNlIHF1ZXN0aW9ucyBpcyBpdHNlbGYgYSBnb3Zlcm5lZFxuICogcGFyYW1ldGVyLiBJdHMgdmFsdWUgaXMgYXZhaWxhYmxlIGZyb20gdGhlIHB1YmxpY0ZhY2V0IHVzaW5nXG4gKiBnZXRFbGVjdG9yYXRlSW5zdGFuY2UoKS4gV2hlbiBjcmVhdGluZyBuZXcgcXVlc3Rpb25zLCB3ZSB1c2VcbiAqIGdldFVwZGF0ZWRQb3NlckZhY2V0KCkgdG8gaW5mb3JtIHRoZSBlbGVjdG9yYXRlIGFib3V0IHRoZSBuZXcgcXVlc3Rpb24uXG4gKlxuICogVGhlIGdvdmVybmVkQ29udHJhY3QgaXMgcmVzcG9uc2libGUgZm9yIHN1cHBseWluZyBnZXRQYXJhbU1nclJldHJpZXZlcigpIGluXG4gKiBpdHMgY3JlYXRvckZhY2V0LiBnZXRQYXJhbU1nclJldHJpZXZlcigpIHRha2VzIGEgUGFyYW1TcGVjaWZpY2F0aW9uLCB3aGljaFxuICogaWRlbnRpZmllcyB0aGUgcGFyYW1ldGVyIHRvIGJlIHZvdGVkIG9uLiBBIG1pbmltYWwgUGFyYW1TcGVjaWZpY2F0aW9uXG4gKiBzcGVjaWZpZXMgdGhlIGtleSB3aGljaCBpZGVudGlmaWVzIGEgcGFydGljdWxhciBwYXJhbU1hbmFnZXIgKGV2ZW4gaWYgdGhlcmUnc1xuICogb25seSBvbmUpIGFuZCB0aGUgcGFyYW1ldGVyTmFtZS4gVGhlIGludGVycHJldGF0aW9uIG9mIFBhcmFtU3BlY2lmaWNhdGlvbiBpc1xuICogdXAgdG8gdGhlIGNvbnRyYWN0LlxuICpcbiAqIFRoZSBjb250cmFjdEdvdmVybm9yIGNyZWF0b3JGYWNldCBpbmNsdWRlcyBgdm90ZU9uUGFyYW1DaGFuZ2VzYCxcbiAqIGB2b3RlT25GaWx0ZXJgLCBhbmQgYHZvdGVPbkFwaUludm9jYXRpb25gLiBgdm90ZU9uUGFyYW1DaGFuZ2VzYCBpcyB1c2VkIHRvXG4gKiBjcmVhdGUgcXVlc3Rpb25zIHRoYXQgd2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBjb250cmFjdCBwYXJhbWV0ZXJzIGlmXG4gKiBwYXNzZWQuIGB2b3RlT25GaWx0ZXJgIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBxdWVzdGlvbnMgdGhhdCB3aWxsIHByZXZlbnQgdGhlXG4gKiBleGVyY2lzZSBvZiBjZXJ0YWluIGludml0YXRpb25zIGlmIHBhc3NlZC4gYHZvdGVPbkFwaUludm9jYXRpb25gIGNyZWF0ZXNcbiAqIHF1ZXN0aW9ucyB0aGF0IHdpbGwgaW52b2tlIHByZS1kZWZpbmVkIEFQSXMgaW4gdGhlIGNvbnRyYWN0LlxuICpcbiAqIFRoaXMgZmFjZXQgd2lsbCB1c3VhbGx5IGJlIGNsb3NlbHkgaGVsZC4gVGhlIGNyZWF0b3JGYWNldCBjYW4gYWxzbyBiZSB1c2VkIHRvXG4gKiByZXRyaWV2ZSB0aGUgZ292ZXJuZWQgaW5zdGFuY2UsIHB1YmxpY0ZhY2V0LCBhbmQgaXRzIGNyZWF0b3JGYWNldCB3aXRoXG4gKiB0aGUgdm90ZU9uKigpIG1ldGhvZHMgb21pdHRlZC5cbiAqXG4gKiBUaGUgZ292ZXJuZWQgY29udHJhY3QncyB0ZXJtcyBpbmNsdWRlIHRoZSBpbnN0YW5jZSBvZiB0aGlzIChnb3Zlcm5pbmcpXG4gKiBjb250cmFjdCAoYXMgZWxlY3Rpb25NYW5hZ2VyKSBzbyBjbGllbnRzIHdpbGwgYmUgYWJsZSB0byBsb29rIHVwIHRoZSBzdGF0ZVxuICogb2YgdGhlIGdvdmVybmVkIHBhcmFtZXRlcnMuXG4gKlxuICogdGVtcGxhdGUge3t9fSBQRiBQdWJsaWMgZmFjZXQgb2YgZ292ZXJuZWRcbiAqIHRlbXBsYXRlIHtDb250cmFjdFBvd2VyZnVsQ3JlYXRvckZhY2V0fSBDRiBDcmVhdG9yIGZhY2V0IG9mIGdvdmVybmVkXG4gKiB0eXBlIHtDb250cmFjdFN0YXJ0Rm48XG4gKiBHb3Zlcm5vclB1YmxpYyxcbiAqIEdvdmVybm9yQ3JlYXRvckZhY2V0PFBGLENGPixcbiAqIHtcbiAqICAgdGltZXI6IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lclNlcnZpY2UsXG4gKiAgIGdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb246IEluc3RhbGxhdGlvbjxDRj4sXG4gKiAgIGdvdmVybmVkOiB7XG4gKiAgICAgaXNzdWVyS2V5d29yZFJlY29yZDogSXNzdWVyS2V5d29yZFJlY29yZCxcbiAqICAgICB0ZXJtczoge2dvdmVybmVkUGFyYW1zOiB7W0NPTlRSQUNUX0VMRUNUT1JBVEVdOiBJbnZpdGF0aW9uUGFyYW19fSxcbiAqICAgfVxuICogfT59XG4gKi9cblxuLyoqXG4gKiBTdGFydCBhbiBpbnN0YW5jZSBvZiBhIGdvdmVybm9yLCBnb3Zlcm5pbmcgYSBcImdvdmVybmVkXCIgY29udHJhY3Qgc3BlY2lmaWVkIGluIHRlcm1zLlxuICpcbiAqIEB0ZW1wbGF0ZSB7R292ZXJuYWJsZVN0YXJ0Rm59IFNGIFN0YXJ0IGZ1bmN0aW9uIG9mIGdvdmVybmVkIGNvbnRyYWN0XG4gKiBAcGFyYW0ge1pDRjx7XG4gKiAgIHRpbWVyOiBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlLFxuICogICBnb3Zlcm5lZENvbnRyYWN0SW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb248U0Y+LFxuICogICBnb3Zlcm5lZDoge1xuICogICAgIGlzc3VlcktleXdvcmRSZWNvcmQ6IElzc3VlcktleXdvcmRSZWNvcmQsXG4gKiAgICAgdGVybXM6IHtnb3Zlcm5lZFBhcmFtczoge1tDT05UUkFDVF9FTEVDVE9SQVRFXTogWGltcG9ydCgnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnKS5JbnZpdGF0aW9uUGFyYW19fSxcbiAqICAgICBsYWJlbD86IHN0cmluZyxcbiAqICAgfVxuICogfT59IHpjZlxuICogQHBhcmFtIHt7XG4gKiAgIGdvdmVybmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICogfX0gcHJpdmF0ZUFyZ3NcbiAqIEByZXR1cm5zIHtQcm9taXNlPHtcbiAqICAgY3JlYXRvckZhY2V0OiBHb3Zlcm5vckNyZWF0b3JGYWNldDxTRj4sXG4gKiAgIHB1YmxpY0ZhY2V0OiBHb3Zlcm5vclB1YmxpYyxcbiAqIH0+fVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICovXG5jb25zdCAgICAgICAgc3RhcnQ9YXN5bmMoemNmLHByaXZhdGVBcmdzLGJhZ2dhZ2UpPT57XG50cmFjZSgnc3RhcnQnKTtcbmNvbnN0IHpvZT16Y2YuZ2V0Wm9lU2VydmljZSgpO1xudHJhY2UoJ2dldFRlcm1zJyx6Y2YuZ2V0VGVybXMoKSk7XG5jb25zdHtcbnRpbWVyLFxuZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbixcbmdvdmVybmVkOntcbmlzc3VlcktleXdvcmRSZWNvcmQ6Z292ZXJuZWRJc3N1ZXJLZXl3b3JkUmVjb3JkLFxudGVybXM6Y29udHJhY3RUZXJtcyxcbmxhYmVsOmdvdmVybmVkQ29udHJhY3RMYWJlbH19PVxuXG56Y2YuZ2V0VGVybXMoKTtcbnRyYWNlKCdjb250cmFjdFRlcm1zJyxjb250cmFjdFRlcm1zKTtcbmNvbnRyYWN0VGVybXMuZ292ZXJuZWRQYXJhbXNbQ09OVFJBQ1RfRUxFQ1RPUkFURV18fFxuRmFpbCBgQ29udHJhY3QgbXVzdCBkZWNsYXJlICR7Q09OVFJBQ1RfRUxFQ1RPUkFURX0gYXMgYSBnb3Zlcm5lZCBwYXJhbWV0ZXJgO1xuXG5jb25zdCBtYWtlQ29udHJhY3RHb3Zlcm5vcktpdD1wcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdChiYWdnYWdlLHtcbnRpbWVyLFxuem9lfSk7XG5cblxudHJhY2UoJ2F3YWl0aW5nIHByb3ZpZGVTaW5nbGV0b24oKScpO1xuY29uc3QgZ292ZXJub3JLaXQ9YXdhaXQgcHJvdmlkZVNpbmdsZXRvbihcbmJhZ2dhZ2UsXG4nY29udHJhY3RHb3Zlcm5vcktpdCcsXG5hc3luYygpPT57XG5jb25zdCBhdWdtZW50ZWRUZXJtcz1oYXJkZW4oe1xuLi4uY29udHJhY3RUZXJtcyxcbmVsZWN0aW9uTWFuYWdlcjp6Y2YuZ2V0SW5zdGFuY2UoKX0pO1xuXG5cbnRyYWNlKCdzdGFydGluZyBnb3Zlcm5lZENvbnRyYWN0SW5zdGFsbGF0aW9uIG9mJyxnb3Zlcm5lZENvbnRyYWN0TGFiZWwpO1xuY29uc3Qgc3RhcnRlZEluc3RhbmNlS2l0PWF3YWl0IEUoem9lKS5zdGFydEluc3RhbmNlKFxuZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbixcbmdvdmVybmVkSXNzdWVyS2V5d29yZFJlY29yZCxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSB0aGUgYnVpbGQgY29uZmlnIGRvZXNuJ3QgZXhwZWN0IGFuIGVycm9yIGhlcmUqL1xuLyogQHRzLWlnbm9yZSBYWFggZ292ZXJuYW5jZSB0eXBlcyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzcxNzgqL1xuYXVnbWVudGVkVGVybXMsXG5wcml2YXRlQXJncy5nb3Zlcm5lZCxcbmdvdmVybmVkQ29udHJhY3RMYWJlbCk7XG5cbnRyYWNlKCdhd2FpdGluZyByZW1vdGUgbGltaXRlZENyZWF0b3JGYWNldCcpO1xuY29uc3QgbGltaXRlZENyZWF0b3JGYWNldD1hd2FpdCBFKFxuc3RhcnRlZEluc3RhbmNlS2l0LmNyZWF0b3JGYWNldCkuXG5nZXRMaW1pdGVkQ3JlYXRvckZhY2V0KCk7XG5cbnJldHVybiBtYWtlQ29udHJhY3RHb3Zlcm5vcktpdChzdGFydGVkSW5zdGFuY2VLaXQsbGltaXRlZENyZWF0b3JGYWNldCk7XG4gfSk7XG5cblxuLyogQXQgdGhpcyBwb2ludCwgc29tZSByZW1vdGUgY2FsbHMgc3RpbGwgbmVlZCB0byBiZSBtYWRlIHdpdGhpbiB0aGUgZ292ZXJub3JLaXQuKi9cbi8qIFNwZWNpZmljYWxseSwgdG8gdGhlIHZhdCBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3QgZm9yIGl0cyBBUEkgbmFtZXMuIFRoZSBleG8qL1xuLyogZGVmZXJzIHRoYXQgdW50aWwgQVBJIGdvdmVybmFuY2UgaXMgcmVxdWVzdGVkIHRvIGJlIGludm9rZWQgb3IgdmFsaWRhdGVkLiovXG5cbnRyYWNlKCdzdGFydCBjb21wbGV0ZScpO1xuXG4vKiBDUlVDSUFMOiBvbmx5IGNvbnRyYWN0R292ZXJub3Igc2hvdWxkIGdldCB0aGUgYWJpbGl0eSB0byB1cGRhdGUgcGFyYW1zKi9cbnJldHVybntjcmVhdG9yRmFjZXQ6Z292ZXJub3JLaXQuY3JlYXRvcixwdWJsaWNGYWNldDpnb3Zlcm5vcktpdC5wdWJsaWN9O1xuIH07JGjigI1fb25jZS5zdGFydChzdGFydCk7XG5oYXJkZW4oc3RhcnQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ldGEiOlsibWV0YSJdLCJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyI6WyJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyJdLCJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiOlsidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIl0sInN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJb/jg6IHQAAiB0AADUAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5vcktpdC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFpbCxtYWtlVHJhY2VyLHByZXBhcmVFeG9DbGFzc0tpdCxFLHNldHVwQXBpR292ZXJuYW5jZSxzZXR1cEZpbHRlckdvdmVybmFuY2UsQ09OVFJBQ1RfRUxFQ1RPUkFURSxzZXR1cFBhcmFtR292ZXJuYW5jZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJtYWtlVHJhY2VyXCIsIFskaOKAjV9hID0+IChtYWtlVHJhY2VyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzXCIsIFtbXCJzZXR1cEFwaUdvdmVybmFuY2VcIiwgWyRo4oCNX2EgPT4gKHNldHVwQXBpR292ZXJuYW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5GaWx0ZXIuanNcIiwgW1tcInNldHVwRmlsdGVyR292ZXJuYW5jZVwiLCBbJGjigI1fYSA9PiAoc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlID0gJGjigI1fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzXCIsIFtbXCJDT05UUkFDVF9FTEVDVE9SQVRFXCIsIFskaOKAjV9hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjigI1fYSldXSxbXCJzZXR1cFBhcmFtR292ZXJuYW5jZVwiLCBbJGjigI1fYSA9PiAoc2V0dXBQYXJhbUdvdmVybmFuY2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgdHJhY2U9bWFrZVRyYWNlcignQ0dLJyxmYWxzZSk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7e1xuICogICB0aW1lcjogWGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVyU2VydmljZSxcbiAqICAgem9lOiBFUmVmPFpvZVNlcnZpY2U+LFxuICogfX0gcG93ZXJzXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdD0oYmFnZ2FnZSxwb3dlcnMpPT57XG4vKiBUaGVzZSBhcmUgcHJvZHVjZWQganVzdC1pbi10aW1lIGJlY2F1c2UgQVBJIGdvdmVybmFuY2UgbWFrZXMgcmVtb3RlIGNhbGxzLCB3aGljaCBwcmV2ZW50IHZhdCByZXN0YXJ0LiovXG4vKiBUaGUgb3RoZXIgdHdvIGNvdWxkIGhhcHBlbiBkdXJpbmcgcmVzdGFydCBidXQgdGhleSdkIG5lZWQgdG8gaGF2ZSBhIHNlcGFyYXRlIGhvb2ssIHNvIGZvciBjb25zaXN0ZW5jeSovXG4vKiB0aGV5J3JlIGFsbCBsYXp5LiovXG4vKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldHVwRmlsdGVyR292ZXJuYW5jZT59ICovXG5sZXQgZmlsdGVyR292ZXJuYW5jZTtcbi8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0dXBQYXJhbUdvdmVybmFuY2U+fSAqL1xubGV0IHBhcmFtR292ZXJuYW5jZTtcbi8qKiBAdHlwZSB7QXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBzZXR1cEFwaUdvdmVybmFuY2U+Pn0gKi9cbmxldCBhcGlHb3Zlcm5hbmNlO1xuXG4vKiogQHR5cGUge2FueX0gKi9cbmxldCBwb3NlckZhY2V0O1xuXG5jb25zdCBtYWtlQ29udHJhY3RHb3Zlcm5vcktpdD1wcmVwYXJlRXhvQ2xhc3NLaXQoXG5iYWdnYWdlLFxuJ0NvbnRyYWN0R292ZXJub3JLaXQnLFxudW5kZWZpbmVkLFxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvem9lL3NyYy96b2VTZXJ2aWNlL3V0aWxzLmpzJykuU3RhcnRlZEluc3RhbmNlS2l0PEdvdmVybmFibGVTdGFydEZuPn0gc3RhcnRlZEluc3RhbmNlS2l0XG4gKiBAcGFyYW0ge0xpbWl0ZWRDRjx1bmtub3duPn0gbGltaXRlZENyZWF0b3JGYWNldFxuICovXG4oc3RhcnRlZEluc3RhbmNlS2l0LGxpbWl0ZWRDcmVhdG9yRmFjZXQpPT57XG5yZXR1cm57XG4uLi5zdGFydGVkSW5zdGFuY2VLaXQsXG5saW1pdGVkQ3JlYXRvckZhY2V0LFxuY3VycmVudEludml0YXRpb246LyoqIEB0eXBlIHtJbnZpdGF0aW9uPHVua25vd24sIG5ldmVyPj99ICovbnVsbH07XG5cbiB9LFxue1xuaGVscGVyOntcbi8qKiBAdHlwZSB7KCkgPT4gUHJvbWlzZTxJbnN0YW5jZT59ICovXG4gICAgICBhc3luYyBnZXRFbGVjdG9yYXRlSW5zdGFuY2UoKXtcbmNvbnN0e3B1YmxpY0ZhY2V0fT10aGlzLnN0YXRlO1xuY29uc3QgaW52aXRhdGlvbkFtb3VudD1hd2FpdCBFKHB1YmxpY0ZhY2V0KS5nZXRJbnZpdGF0aW9uQW1vdW50KFxuQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG5cbnJldHVybiBpbnZpdGF0aW9uQW1vdW50LnZhbHVlWzBdLmluc3RhbmNlO1xuIH0sXG4vKiogQHR5cGUgeygpID0+IFByb21pc2U8UG9zZXJGYWNldD59ICovXG4gICAgICBhc3luYyBnZXRVcGRhdGVkUG9zZXJGYWNldCgpe1xuY29uc3R7Y3JlYXRvckZhY2V0fT10aGlzLnN0YXRlO1xuY29uc3QgbmV3SW52aXRhdGlvbj1hd2FpdCBFKFxuRShFKGNyZWF0b3JGYWNldCkuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSkuZ2V0KHtcbmtleTonZ292ZXJuZWRQYXJhbXMnfSkpLlxuXG5nZXRJbnRlcm5hbFBhcmFtVmFsdWUoQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG5cbmlmKG5ld0ludml0YXRpb24hPT10aGlzLnN0YXRlLmN1cnJlbnRJbnZpdGF0aW9uKXtcbnBvc2VyRmFjZXQ9RShFKHBvd2Vycy56b2UpLm9mZmVyKG5ld0ludml0YXRpb24pKS5nZXRPZmZlclJlc3VsdCgpO1xudGhpcy5zdGF0ZS5jdXJyZW50SW52aXRhdGlvbj1uZXdJbnZpdGF0aW9uO1xuIH1cbnJldHVybiBwb3NlckZhY2V0O1xuIH0sXG4gICAgICBhc3luYyBwcm92aWRlQXBpR292ZXJuYW5jZSgpe1xuY29uc3R7dGltZXJ9PXBvd2VycztcbmNvbnN0e2NyZWF0b3JGYWNldH09dGhpcy5zdGF0ZTtcbmF3YWl0IG51bGw7XG5pZighYXBpR292ZXJuYW5jZSl7XG50cmFjZSgnYXdhaXRpbmcgZ292ZXJuZWQgQVBJIGRlcGVuZGVuY2llcycpO1xuY29uc3RbZ292ZXJuZWRBcGlzLGdvdmVybmVkTmFtZXNdPWF3YWl0IFByb21pc2UuYWxsKFtcbkUoY3JlYXRvckZhY2V0KS5nZXRHb3Zlcm5lZEFwaXMoKSxcbkUoY3JlYXRvckZhY2V0KS5nZXRHb3Zlcm5lZEFwaU5hbWVzKCldKTtcblxudHJhY2UoJ3NldHVwQXBpR292ZXJuYW5jZScpO1xuYXBpR292ZXJuYW5jZT1nb3Zlcm5lZE5hbWVzLmxlbmd0aD9cbnNldHVwQXBpR292ZXJuYW5jZShnb3Zlcm5lZEFwaXMsZ292ZXJuZWROYW1lcyx0aW1lciwoKT0+XG50aGlzLmZhY2V0cy5oZWxwZXIuZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSk6XG5cbntcbi8qIGlmIHdlIGFyZW4ndCBnb3Zlcm5pbmcgQVBJcywgdm90ZU9uQXBpSW52b2NhdGlvbiBzaG91bGRuJ3QgYmUgY2FsbGVkKi9cbnZvdGVPbkFwaUludm9jYXRpb246KCk9PntcbnRocm93IEVycm9yKCdhcGkgZ292ZXJuYW5jZSBub3QgY29uZmlndXJlZCcpO1xuIH0sXG5jcmVhdGVkUXVlc3Rpb246KCk9PmZhbHNlfTtcblxuIH1cbnJldHVybiBhcGlHb3Zlcm5hbmNlO1xuIH0sXG5wcm92aWRlRmlsdGVyR292ZXJuYW5jZSgpe1xuaWYoIWZpbHRlckdvdmVybmFuY2Upe1xuY29uc3R7dGltZXJ9PXBvd2VycztcbmNvbnN0e2NyZWF0b3JGYWNldH09dGhpcy5zdGF0ZTtcbmZpbHRlckdvdmVybmFuY2U9c2V0dXBGaWx0ZXJHb3Zlcm5hbmNlKFxudGltZXIsXG4oKT0+dGhpcy5mYWNldHMuaGVscGVyLmdldFVwZGF0ZWRQb3NlckZhY2V0KCksXG5jcmVhdG9yRmFjZXQpO1xuXG4gfVxucmV0dXJuIGZpbHRlckdvdmVybmFuY2U7XG4gfSxcbnByb3ZpZGVQYXJhbUdvdmVybmFuY2UoKXtcbmlmKCFwYXJhbUdvdmVybmFuY2Upe1xuY29uc3R7dGltZXJ9PXBvd2VycztcbmNvbnN0e2NyZWF0b3JGYWNldCxpbnN0YW5jZX09dGhpcy5zdGF0ZTtcbnBhcmFtR292ZXJuYW5jZT1zZXR1cFBhcmFtR292ZXJuYW5jZShcbkUoY3JlYXRvckZhY2V0KS5nZXRQYXJhbU1nclJldHJpZXZlcigpLFxuaW5zdGFuY2UsXG50aW1lcixcbigpPT50aGlzLmZhY2V0cy5oZWxwZXIuZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSk7XG5cbiB9XG5yZXR1cm4gcGFyYW1Hb3Zlcm5hbmNlO1xuIH19LFxuXG5jcmVhdG9yOntcbi8qKlxuICogQHBhcmFtIHtJbnZpdGF0aW9ufSBwb3Nlckludml0YXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5yZXBsYWNlRWxlY3RvcmF0ZShwb3Nlckludml0YXRpb24pe1xuY29uc3R7Y3JlYXRvckZhY2V0fT10aGlzLnN0YXRlO1xuLyoqIEB0eXBlIHtQcm9taXNlPFhpbXBvcnQoJy4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzJykuVHlwZWRQYXJhbU1hbmFnZXI8eydFbGVjdG9yYXRlJzogJ2ludml0YXRpb24nfT4+fSAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItdHMtZXhwZWN0LWVycm9yIC0tIHRoZSBidWlsZCBjb25maWcgZG9lc24ndCBleHBlY3QgYW4gZXJyb3IgaGVyZSovXG4vKiBAdHMtaWdub3JlIGNhc3QqL1xuY29uc3QgcGFyYW1NZ3I9RShFKGNyZWF0b3JGYWNldCkuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSkuZ2V0KHtcbmtleTonZ292ZXJuZWRQYXJhbXMnfSk7XG5cblxuLyogVE9ETyB1c2UgdXBkYXRlRWxlY3RvcmF0ZSovXG5yZXR1cm4gRShwYXJhbU1ncikudXBkYXRlUGFyYW1zKHtcbkVsZWN0b3JhdGU6cG9zZXJJbnZpdGF0aW9ufSk7XG5cbiB9LFxuLyoqIEB0eXBlIHtWb3RlT25QYXJhbUNoYW5nZXN9ICovXG52b3RlT25QYXJhbUNoYW5nZXModm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sZGVhZGxpbmUscGFyYW1TcGVjKXtcbmNvbnN0e2hlbHBlcn09dGhpcy5mYWNldHM7XG5yZXR1cm4gaGVscGVyLlxucHJvdmlkZVBhcmFtR292ZXJuYW5jZSgpLlxudm90ZU9uUGFyYW1DaGFuZ2VzKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLGRlYWRsaW5lLHBhcmFtU3BlYyk7XG4gfSxcbi8qKiBAdHlwZSB7Vm90ZU9uQXBpSW52b2NhdGlvbn0gKi9cbnZvdGVPbkFwaUludm9jYXRpb24oXG5hcGlNZXRob2ROYW1lLFxubWV0aG9kQXJncyxcbnZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuZGVhZGxpbmUpXG57XG5jb25zdHtoZWxwZXJ9PXRoaXMuZmFjZXRzO1xucmV0dXJuIEUoaGVscGVyLnByb3ZpZGVBcGlHb3Zlcm5hbmNlKCkpLnZvdGVPbkFwaUludm9jYXRpb24oXG5hcGlNZXRob2ROYW1lLFxubWV0aG9kQXJncyxcbnZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuZGVhZGxpbmUpO1xuXG4gfSxcbi8qKiBAdHlwZSB7Vm90ZU9uT2ZmZXJGaWx0ZXJ9ICovXG52b3RlT25PZmZlckZpbHRlcih2b3RlQ291bnRlckluc3RhbGxhdGlvbixkZWFkbGluZSxzdHJpbmdzKXtcbmNvbnN0e2hlbHBlcn09dGhpcy5mYWNldHM7XG5yZXR1cm4gaGVscGVyLlxucHJvdmlkZUZpbHRlckdvdmVybmFuY2UoKS5cbnZvdGVPbkZpbHRlcih2b3RlQ291bnRlckluc3RhbGxhdGlvbixkZWFkbGluZSxzdHJpbmdzKTtcbiB9LFxuZ2V0Q3JlYXRvckZhY2V0KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5saW1pdGVkQ3JlYXRvckZhY2V0O1xuIH0sXG5nZXRBZG1pbkZhY2V0KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5hZG1pbkZhY2V0O1xuIH0sXG5nZXRJbnN0YW5jZSgpe1xucmV0dXJuIHRoaXMuc3RhdGUuaW5zdGFuY2U7XG4gfSxcbmdldFB1YmxpY0ZhY2V0KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5wdWJsaWNGYWNldDtcbiB9fSxcblxucHVibGljOntcbmdldEVsZWN0b3JhdGUoKXtcbmNvbnN0e2hlbHBlcn09dGhpcy5mYWNldHM7XG5yZXR1cm4gaGVscGVyLmdldEVsZWN0b3JhdGVJbnN0YW5jZSgpO1xuIH0sXG5nZXRHb3Zlcm5lZENvbnRyYWN0KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5pbnN0YW5jZTtcbiB9LFxuLyoqIEBwYXJhbSB7SW5zdGFuY2V9IGNvdW50ZXIgKi9cbiAgICAgIGFzeW5jIHZhbGlkYXRlVm90ZUNvdW50ZXIoY291bnRlcil7XG5jb25zdHtoZWxwZXJ9PXRoaXMuZmFjZXRzO1xuY29uc3QgdmFsaWRhdG9ycz1bXG5FLmdldChoZWxwZXIucHJvdmlkZUFwaUdvdmVybmFuY2UoKSksXG5oZWxwZXIucHJvdmlkZUZpbHRlckdvdmVybmFuY2UoKSxcbmhlbHBlci5wcm92aWRlUGFyYW1Hb3Zlcm5hbmNlKCldO1xuXG5jb25zdCBjaGVja3M9YXdhaXQgUHJvbWlzZS5hbGwoXG52YWxpZGF0b3JzLm1hcCgodmFsaWRhdGUpPT5FKHZhbGlkYXRlLmNyZWF0ZWRRdWVzdGlvbikoY291bnRlcikpKTtcblxuXG5jaGVja3Muc29tZShCb29sZWFuKXx8XG5GYWlsIGBWb3RlQ291bnRlciB3YXMgbm90IGNyZWF0ZWQgYnkgdGhpcyBjb250cmFjdEdvdmVybm9yYDtcbiB9LFxuLyoqIEBwYXJhbSB7SW5zdGFuY2V9IHJlZ1AgKi9cbnZhbGlkYXRlRWxlY3RvcmF0ZShyZWdQKXtcbmNvbnN0e2hlbHBlcn09dGhpcy5mYWNldHM7XG5yZXR1cm4gRS53aGVuKHJlZ1AsYXN5bmMocmVnKT0+e1xuY29uc3QgZWxlY3RvcmF0ZUluc3RhbmNlPWF3YWl0IGhlbHBlci5nZXRFbGVjdG9yYXRlSW5zdGFuY2UoKTtcbmFzc2VydChcbnJlZz09PWVsZWN0b3JhdGVJbnN0YW5jZSxcblwiRWxlY3RvcmF0ZSBkb2Vzbid0IG1hdGNoIG15IEVsZWN0b3JhdGVcIik7XG5cbiB9KTtcbiB9LFxuLyoqIEBwYXJhbSB7Q2xvc2luZ1J1bGV9IGNsb3NpbmdSdWxlICovXG52YWxpZGF0ZVRpbWVyKGNsb3NpbmdSdWxlKXtcbmFzc2VydChcbmNsb3NpbmdSdWxlLnRpbWVyPT09cG93ZXJzLnRpbWVyLFxuJ2Nsb3NpbmcgcnVsZSBtdXN0IHVzZSBteSB0aW1lcicpO1xuXG4gfX19KTtcblxuXG5cblxucmV0dXJuIG1ha2VDb250cmFjdEdvdmVybm9yS2l0O1xuIH07XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdD4+fSBDb250cmFjdEdvdmVybm9yS2l0ICovJGjigI1fb25jZS5wcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdChwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQiOlsicHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFqpnmNErAADRKwAAMAAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEhlbHBlci5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvdGltZSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIkdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkiLCJoYW5kbGVQYXJhbUdvdmVybmFuY2UiLCJwdWJsaWNNaXhpbkFQSSIsInZhbGlkYXRlRWxlY3RvcmF0ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsbWFrZVN0b3JlZFB1Ymxpc2hlcktpdCxnZXRNZXRob2ROYW1lcyxvYmplY3RNYXAsaWdub3JlQ29udGV4dCxwcmVwYXJlRXhvLGtleUVRLE0sQW1vdW50U2hhcGUsQnJhbmRTaGFwZSxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxUaW1lc3RhbXBSZWNvcmRTaGFwZSxFLGFzc2VydEVsZWN0b3JhdGVNYXRjaGVzLG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMsR292ZXJub3JGYWNldFNoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIiwgWyRo4oCNX2EgPT4gKGdldE1ldGhvZE5hbWVzID0gJGjigI1fYSldXSxbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJpZ25vcmVDb250ZXh0XCIsIFskaOKAjV9hID0+IChpZ25vcmVDb250ZXh0ID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudFNoYXBlXCIsIFskaOKAjV9hID0+IChBbW91bnRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiQnJhbmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQnJhbmRTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiVGltZXN0YW1wUmVjb3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFJlY29yZFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzXCIsIFtbXCJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanNcIiwgW1tcIm1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJHb3Zlcm5vckZhY2V0U2hhcGVcIiwgWyRo4oCNX2EgPT4gKEdvdmVybm9yRmFjZXRTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgR09WRVJOQU5DRV9TVE9SQUdFX0tFWT0nZ292ZXJuYW5jZSc7JGjigI1fb25jZS5HT1ZFUk5BTkNFX1NUT1JBR0VfS0VZKEdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkpO1xuXG5jb25zdCBwdWJsaWNNaXhpbkFQST1oYXJkZW4oe1xuZ2V0U3Vic2NyaXB0aW9uOk0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JlZFN1YnNjcmlwdGlvbicpKSxcbmdldEdvdmVybmVkUGFyYW1zOk0uY2FsbCgpLnJldHVybnMoTS5vcihNLnJlY29yZCgpLE0ucHJvbWlzZSgpKSksXG5nZXRBbW91bnQ6TS5jYWxsKCkucmV0dXJucyhBbW91bnRTaGFwZSksXG5nZXRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKEJyYW5kU2hhcGUpLFxuZ2V0SW5zdGFuY2U6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnSW5zdGFuY2UnKSksXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpLFxuZ2V0SW52aXRhdGlvbkFtb3VudDpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldE5hdDpNLmNhbGwoKS5yZXR1cm5zKE0uYmlnaW50KCkpLFxuZ2V0UmF0aW86TS5jYWxsKCkucmV0dXJucyhNLnJlY29yZCgpKSxcbmdldFN0cmluZzpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0VGltZXN0YW1wOk0uY2FsbCgpLnJldHVybnMoVGltZXN0YW1wUmVjb3JkU2hhcGUpLFxuZ2V0UmVsYXRpdmVUaW1lOk0uY2FsbCgpLnJldHVybnMoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpLFxuZ2V0VW5rbm93bjpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1pDRjxHb3Zlcm5hbmNlVGVybXM8e30+ICYge30+fSB6Y2ZcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXInKS5UeXBlZFBhcmFtTWFuYWdlcjxhbnk+fSBwYXJhbU1hbmFnZXJcbiAqLyRo4oCNX29uY2UucHVibGljTWl4aW5BUEkocHVibGljTWl4aW5BUEkpO1xuY29uc3QgICAgICAgIHZhbGlkYXRlRWxlY3RvcmF0ZT0oemNmLHBhcmFtTWFuYWdlcik9PntcbmNvbnN0e2dvdmVybmVkUGFyYW1zfT16Y2YuZ2V0VGVybXMoKTtcbnJldHVybiBFLndoZW4ocGFyYW1NYW5hZ2VyLmdldFBhcmFtcygpLChmaW5pc2hlZFBhcmFtcyk9PntcbnRyeXtcbmtleUVRKGdvdmVybmVkUGFyYW1zLGZpbmlzaGVkUGFyYW1zKXx8XG5GYWlsIGBUaGUgJ2dvdmVybmVkUGFyYW1zJyB0ZXJtIG11c3QgYmUgYW4gb2JqZWN0IGxpa2UgJHtxKFxuZmluaXNoZWRQYXJhbXMpXG4gfSwgYnV0IHdhcyAke3EoZ292ZXJuZWRQYXJhbXMpfWA7XG5hc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyhwYXJhbU1hbmFnZXIsZ292ZXJuZWRQYXJhbXMpO1xuIH1jYXRjaChlcnIpe1xuemNmLnNodXRkb3duV2l0aEZhaWx1cmUoZXJyKTtcbiB9XG4gfSk7XG4gfTskaOKAjV9vbmNlLnZhbGlkYXRlRWxlY3RvcmF0ZSh2YWxpZGF0ZUVsZWN0b3JhdGUpO1xuaGFyZGVuKHZhbGlkYXRlRWxlY3RvcmF0ZSk7XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgYG1ha2VQYXJhbUdvdmVybmFuY2VgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnKS5QYXJhbVR5cGVzTWFwfSBUXG4gKiBAcGFyYW0ge1pDRjxHb3Zlcm5hbmNlVGVybXM8e30+ICYge30+fSB6Y2ZcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXInKS5UeXBlZFBhcmFtTWFuYWdlcjxUPn0gcGFyYW1NYW5hZ2VyXG4gKi9cbmNvbnN0IGZhY2V0SGVscGVycz0oemNmLHBhcmFtTWFuYWdlcik9Pntcbi8qIHZhbGlkYXRlIGFzeW5jIHRvIHdhaXQgZm9yIHBhcmFtcyB0byBiZSBmaW5pc2hlZCovXG4vKiBVTlRJTCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzNDMqL1xudm9pZCB2YWxpZGF0ZUVsZWN0b3JhdGUoemNmLHBhcmFtTWFuYWdlcik7XG5cbmNvbnN0IHR5cGVkQWNjZXNzb3JzPXtcbmdldEFtb3VudDpwYXJhbU1hbmFnZXIuZ2V0QW1vdW50LFxuZ2V0QnJhbmQ6cGFyYW1NYW5hZ2VyLmdldEJyYW5kLFxuZ2V0SW5zdGFuY2U6cGFyYW1NYW5hZ2VyLmdldEluc3RhbmNlLFxuZ2V0SW5zdGFsbGF0aW9uOnBhcmFtTWFuYWdlci5nZXRJbnN0YWxsYXRpb24sXG5nZXRJbnZpdGF0aW9uQW1vdW50OnBhcmFtTWFuYWdlci5nZXRJbnZpdGF0aW9uQW1vdW50LFxuZ2V0TmF0OnBhcmFtTWFuYWdlci5nZXROYXQsXG5nZXRSYXRpbzpwYXJhbU1hbmFnZXIuZ2V0UmF0aW8sXG5nZXRTdHJpbmc6cGFyYW1NYW5hZ2VyLmdldFN0cmluZyxcbmdldFRpbWVzdGFtcDpwYXJhbU1hbmFnZXIuZ2V0VGltZXN0YW1wLFxuZ2V0UmVsYXRpdmVUaW1lOnBhcmFtTWFuYWdlci5nZXRSZWxhdGl2ZVRpbWUsXG5nZXRVbmtub3duOnBhcmFtTWFuYWdlci5nZXRVbmtub3dufTtcblxuXG5jb25zdCBjb21tb25QdWJsaWNNZXRob2RzPXtcbmdldFN1YnNjcmlwdGlvbjooKT0+cGFyYW1NYW5hZ2VyLmdldFN1YnNjcmlwdGlvbigpLFxuZ2V0R292ZXJuZWRQYXJhbXM6KCk9PnBhcmFtTWFuYWdlci5nZXRQYXJhbXMoKX07XG5cblxuLyoqXG4gKiBBZGQgcmVxdWlyZWQgbWV0aG9kcyB0byBwdWJsaWNGYWNldFxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFBGIHB1YmxpYyBmYWNldFxuICogQHBhcmFtIHtQRn0gb3JpZ2luYWxQdWJsaWNGYWNldFxuICogQHJldHVybnMge0dvdmVybmVkUHVibGljRmFjZXQ8UEY+fVxuICovXG5jb25zdCBhdWdtZW50UHVibGljRmFjZXQ9KG9yaWdpbmFsUHVibGljRmFjZXQpPT57XG5yZXR1cm4gRmFyKCdwdWJsaWNGYWNldCcse1xuLi4ub3JpZ2luYWxQdWJsaWNGYWNldCxcbi4uLmNvbW1vblB1YmxpY01ldGhvZHMsXG4uLi50eXBlZEFjY2Vzc29yc30pO1xuXG4gfTtcblxuLyoqXG4gKiBBZGQgcmVxdWlyZWQgbWV0aG9kcyB0byBwdWJsaWNGYWNldCwgZm9yIGEgdmlydHVhbC9kdXJhYmxlIGNvbnRyYWN0XG4gKlxuICogQHBhcmFtIHtPUEZ9IG9yaWdpbmFsUHVibGljRmFjZXRcbiAqIEB0ZW1wbGF0ZSB7e319IE9QRlxuICovXG5jb25zdCBhdWdtZW50VmlydHVhbFB1YmxpY0ZhY2V0PShvcmlnaW5hbFB1YmxpY0ZhY2V0KT0+e1xucmV0dXJuIEZhcigncHVibGljRmFjZXQnLHtcbi4uLm9yaWdpbmFsUHVibGljRmFjZXQsXG4uLi5jb21tb25QdWJsaWNNZXRob2RzLFxuLi4ub2JqZWN0TWFwKHR5cGVkQWNjZXNzb3JzLGlnbm9yZUNvbnRleHQpfSk7XG5cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGXG4gKiBAcGFyYW0ge0NGfSBsaW1pdGVkQ3JlYXRvckZhY2V0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsICguLi5hbnkpID0+IHVua25vd24+fSBbZ292ZXJuZWRBcGlzXVxuICogQHJldHVybnMge0dvdmVybmVkQ3JlYXRvckZhY2V0PENGPn1cbiAqL1xuY29uc3QgbWFrZUZhckdvdmVybm9yRmFjZXQ9KGxpbWl0ZWRDcmVhdG9yRmFjZXQsZ292ZXJuZWRBcGlzPXt9KT0+e1xuY29uc3QgZ292ZXJub3JGYWNldD1GYXIoJ2dvdmVybm9yRmFjZXQnLHtcbmdldFBhcmFtTWdyUmV0cmlldmVyOigpPT5cbkZhcigncGFyYW1SZXRyaWV2ZXInLHtnZXQ6KCk9PnBhcmFtTWFuYWdlcn0pLFxuZ2V0SW52aXRhdGlvbjoobmFtZSk9PnBhcmFtTWFuYWdlci5nZXRJbnRlcm5hbFBhcmFtVmFsdWUobmFtZSksXG5nZXRMaW1pdGVkQ3JlYXRvckZhY2V0OigpPT5saW1pdGVkQ3JlYXRvckZhY2V0LFxuLyogVGhlIGNvbnRyYWN0IHByb3ZpZGVzIGEgZmFjZXQgd2l0aCB0aGUgQVBJcyB0aGF0IGNhbiBiZSBpbnZva2VkIGJ5Ki9cbi8qIGdvdmVybmFuY2UqL1xuLyoqIEB0eXBlIHsoKSA9PiBHb3Zlcm5lZEFwaXN9ICovXG5nZXRHb3Zlcm5lZEFwaXM6KCk9PkZhcignZ292ZXJuZWRBUElzJyxnb3Zlcm5lZEFwaXMpLFxuLyogVGhlIGZhY2V0IHJldHVybmVkIGJ5IGdldEdvdmVybmVkQXBpcyBpcyBGYXIsIHNvIHdlIGNhbid0IHNlZSB3aGF0Ki9cbi8qIG1ldGhvZHMgaXQgaGFzLiBUaGVyZSdzIG5vIGNsZWFuIHdheSB0byBoYXZlIGNvbnRyYWN0cyBzcGVjaWZ5IHRoZSBBUElzKi9cbi8qIHdpdGhvdXQgYWxzbyBzZXBhcmF0ZWx5IHByb3ZpZGluZyB0aGVpciBuYW1lcy4qL1xuZ2V0R292ZXJuZWRBcGlOYW1lczooKT0+T2JqZWN0LmtleXMoZ292ZXJuZWRBcGlzKSxcbnNldE9mZmVyRmlsdGVyOihzdHJpbmdzKT0+emNmLnNldE9mZmVyRmlsdGVyKHN0cmluZ3MpfSk7XG5cblxuLyogZXhjbHVzaXZlbHkgZm9yIGNvbnRyYWN0R292ZXJub3IsIHdoaWNoIG9ubHkgcmV2ZWFscyBsaW1pdGVkQ3JlYXRvckZhY2V0Ki9cbnJldHVybiBnb3Zlcm5vckZhY2V0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0ZcbiAqIEBwYXJhbSB7Q0Z9IG9yaWdpbmFsQ3JlYXRvckZhY2V0XG4gKiBAcGFyYW0ge3t9fSBbZ292ZXJuZWRBcGlzXVxuICogQHJldHVybnMge0dvdmVybmVkQ3JlYXRvckZhY2V0PENGPn1cbiAqL1xuY29uc3QgbWFrZUdvdmVybm9yRmFjZXQ9KG9yaWdpbmFsQ3JlYXRvckZhY2V0LGdvdmVybmVkQXBpcz17fSk9PntcbnJldHVybiBtYWtlRmFyR292ZXJub3JGYWNldChvcmlnaW5hbENyZWF0b3JGYWNldCxnb3Zlcm5lZEFwaXMpO1xuIH07XG5cbi8qKlxuICogQWRkIHJlcXVpcmVkIG1ldGhvZHMgdG8gYSBjcmVhdG9yRmFjZXQgZm9yIGEgZHVyYWJsZSBjb250cmFjdC5cbiAqXG4gKiBAc2VlIHttYWtlRHVyYWJsZUdvdmVybm9yRmFjZXR9XG4gKlxuICogQHBhcmFtIHt7IFttZXRob2ROYW1lOiBzdHJpbmddOiAoY29udGV4dD86IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkgPT4gdW5rbm93bn19IGxpbWl0ZWRDcmVhdG9yRmFjZXRcbiAqL1xuY29uc3QgbWFrZVZpcnR1YWxHb3Zlcm5vckZhY2V0PShsaW1pdGVkQ3JlYXRvckZhY2V0KT0+e1xuLyoqIEB0eXBlIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cycpLkZ1bmN0aW9uc1BsdXNDb250ZXh0PHVua25vd24sIEdvdmVybmVkQ3JlYXRvckZhY2V0PGxpbWl0ZWRDcmVhdG9yRmFjZXQ+Pn0gKi9cbmNvbnN0IGdvdmVybm9yRmFjZXQ9aGFyZGVuKHtcbmdldFBhcmFtTWdyUmV0cmlldmVyOigpPT5cbkZhcigncGFyYW1SZXRyaWV2ZXInLHtnZXQ6KCk9PnBhcmFtTWFuYWdlcn0pLFxuZ2V0SW52aXRhdGlvbjooX2NvbnRleHQsLyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZSk9PlxucGFyYW1NYW5hZ2VyLmdldEludGVybmFsUGFyYW1WYWx1ZShuYW1lKSxcbmdldExpbWl0ZWRDcmVhdG9yRmFjZXQ6KHtmYWNldHN9KT0+ZmFjZXRzLmxpbWl0ZWRDcmVhdG9yRmFjZXQsXG4vKiBUaGUgY29udHJhY3QgcHJvdmlkZXMgYSBmYWNldCB3aXRoIHRoZSBBUElzIHRoYXQgY2FuIGJlIGludm9rZWQgYnkqL1xuLyogZ292ZXJuYW5jZSovXG5nZXRHb3Zlcm5lZEFwaXM6KHtmYWNldHN9KT0+ZmFjZXRzLmdvdmVybmVkQXBpcyxcbi8qIFRoZSBmYWNldCByZXR1cm5lZCBieSBnZXRHb3Zlcm5lZEFwaXMgaXMgRmFyLCBzbyB3ZSBjYW4ndCBzZWUgd2hhdCovXG4vKiBtZXRob2RzIGl0IGhhcy4gVGhlcmUncyBubyBjbGVhbiB3YXkgdG8gaGF2ZSBjb250cmFjdHMgc3BlY2lmeSB0aGUgQVBJcyovXG4vKiB3aXRob3V0IGFsc28gc2VwYXJhdGVseSBwcm92aWRpbmcgdGhlaXIgbmFtZXMuKi9cbmdldEdvdmVybmVkQXBpTmFtZXM6KHtmYWNldHN9KT0+XG5nZXRNZXRob2ROYW1lcyhmYWNldHMuZ292ZXJuZWRBcGlzfHx7fSksXG5zZXRPZmZlckZpbHRlcjooX2NvbnRleHQsc3RyaW5ncyk9PnpjZi5zZXRPZmZlckZpbHRlcihzdHJpbmdzKX0pO1xuXG5cbnJldHVybntnb3Zlcm5vckZhY2V0LGxpbWl0ZWRDcmVhdG9yRmFjZXR9O1xuIH07XG5cbi8qKlxuICogQWRkIHJlcXVpcmVkIG1ldGhvZHMgdG8gYSBjcmVhdG9yRmFjZXQgZm9yIGEgZHVyYWJsZSBjb250cmFjdC5cbiAqXG4gKiBAc2VlIHttYWtlVmlydHVhbEdvdmVybm9yRmFjZXR9XG4gKlxuICogQHRlbXBsYXRlIENGXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge0NGfSBsaW1pdGVkQ3JlYXRvckZhY2V0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsICguLi5hbnkpID0+IHVua25vd24+fSBbZ292ZXJuZWRBcGlzXVxuICovXG5jb25zdCBtYWtlRHVyYWJsZUdvdmVybm9yRmFjZXQ9KFxuYmFnZ2FnZSxcbmxpbWl0ZWRDcmVhdG9yRmFjZXQsXG5nb3Zlcm5lZEFwaXM9e30pPT5cbntcbmNvbnN0IGdvdmVybm9yRmFjZXQ9cHJlcGFyZUV4byhcbmJhZ2dhZ2UsXG4nZ292ZXJub3JGYWNldCcsXG5NLmludGVyZmFjZSgnZ292ZXJub3JGYWNldCcsR292ZXJub3JGYWNldFNoYXBlKSxcbntcbmdldFBhcmFtTWdyUmV0cmlldmVyOigpPT5cbkZhcigncGFyYW1SZXRyaWV2ZXInLHtnZXQ6KCk9PnBhcmFtTWFuYWdlcn0pLFxuZ2V0SW52aXRhdGlvbjoobmFtZSk9PnBhcmFtTWFuYWdlci5nZXRJbnRlcm5hbFBhcmFtVmFsdWUobmFtZSksXG5nZXRMaW1pdGVkQ3JlYXRvckZhY2V0OigpPT5saW1pdGVkQ3JlYXRvckZhY2V0LFxuLyogVGhlIGNvbnRyYWN0IHByb3ZpZGVzIGEgZmFjZXQgd2l0aCB0aGUgQVBJcyB0aGF0IGNhbiBiZSBpbnZva2VkIGJ5Ki9cbi8qIGdvdmVybmFuY2UqL1xuLyoqIEB0eXBlIHsoKSA9PiBHb3Zlcm5lZEFwaXN9ICovXG5nZXRHb3Zlcm5lZEFwaXM6KCk9PkZhcignZ292ZXJuZWRBUElzJyxnb3Zlcm5lZEFwaXMpLFxuLyogVGhlIGZhY2V0IHJldHVybmVkIGJ5IGdldEdvdmVybmVkQXBpcyBpcyBGYXIsIHNvIHdlIGNhbid0IHNlZSB3aGF0Ki9cbi8qIG1ldGhvZHMgaXQgaGFzLiBUaGVyZSdzIG5vIGNsZWFuIHdheSB0byBoYXZlIGNvbnRyYWN0cyBzcGVjaWZ5IHRoZSBBUElzKi9cbi8qIHdpdGhvdXQgYWxzbyBzZXBhcmF0ZWx5IHByb3ZpZGluZyB0aGVpciBuYW1lcy4qL1xuZ2V0R292ZXJuZWRBcGlOYW1lczooKT0+T2JqZWN0LmtleXMoZ292ZXJuZWRBcGlzfHx7fSksXG5zZXRPZmZlckZpbHRlcjooc3RyaW5ncyk9PnpjZi5zZXRPZmZlckZpbHRlcihzdHJpbmdzKX0pO1xuXG5cblxucmV0dXJue2dvdmVybm9yRmFjZXQsbGltaXRlZENyZWF0b3JGYWNldH07XG4gfTtcblxucmV0dXJuIGhhcmRlbih7XG5wdWJsaWNNaXhpbjp7XG4uLi5jb21tb25QdWJsaWNNZXRob2RzLFxuLi4udHlwZWRBY2Nlc3NvcnN9LFxuXG5hdWdtZW50UHVibGljRmFjZXQsXG5hdWdtZW50VmlydHVhbFB1YmxpY0ZhY2V0LFxubWFrZUdvdmVybm9yRmFjZXQsXG5cbm1ha2VGYXJHb3Zlcm5vckZhY2V0LFxubWFrZVZpcnR1YWxHb3Zlcm5vckZhY2V0LFxubWFrZUR1cmFibGVHb3Zlcm5vckZhY2V0LFxuXG5wYXJhbXM6cGFyYW1NYW5hZ2VyLnJlYWRvbmx5KCl9KTtcblxuIH07XG5cbi8qKlxuICogSGVscGVyIGZvciB0aGUgOTAlIG9mIGNvbnRyYWN0cyB0aGF0IHdpbGwgaGF2ZSBvbmx5IGEgc2luZ2xlIHNldCBvZlxuICogcGFyYW1ldGVycy4gVXNpbmcgdGhpcyBmb3IgbWFuYWdlZCBwYXJhbWV0ZXJzLCBhIGNvbnRyYWN0IG9ubHkgaGFzIHRvXG4gKlxuICogLSBEZWZpbmUgdGhlIHBhcmFtZXRlciB0ZW1wbGF0ZSwgd2hpY2ggaW5jbHVkZXMgbmFtZSwgdHlwZSBhbmQgdmFsdWVcbiAqIC0gQWRkIGFueSBtZXRob2RzIG5lZWRlZCBpbiB0aGUgcHVibGljIGFuZCBjcmVhdG9yIGZhY2V0cy5cbiAqXG4gKiBJdCdzIGFsc28gY3J1Y2lhbCB0aGF0IHRoZSBnb3Zlcm5lZCBjb250cmFjdCBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgcHJvZHVjdCBvZlxuICogbWFrZUdvdmVybm9yRmFjZXQoKS4gVGhlIHdyYXBwZWQgY3JlYXRvckZhY2V0IGhhcyB0aGUgcG93ZXIgdG8gY2hhbmdlXG4gKiBwYXJhbWV0ZXIgdmFsdWVzLCBhbmQgdGhlIGdvdmVybmFuY2UgZ3VhcmFudGVlcyBvbmx5IGhvbGQgaWYgdGhleSdyZSBub3QgdXNlZFxuICogZGlyZWN0bHkgYnkgdGhlIGdvdmVybmVkIGNvbnRyYWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXInKS5QYXJhbVR5cGVzTWFwfSBNXG4gKiAgIE1hcCBvZiB0eXBlcyBvZiBjdXN0b20gZ292ZXJuZWQgdGVybXNcbiAqIEBwYXJhbSB7WkNGPEdvdmVybmFuY2VUZXJtczxNPj59IHpjZlxuICogQHBhcmFtIHtJbnZpdGF0aW9ufSBpbml0aWFsUG9zZXJJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge019IHBhcmFtVHlwZXNNYXBcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gW21hcnNoYWxsZXJdXG4gKi9cbmNvbnN0IGhhbmRsZVBhcmFtR292ZXJuYW5jZT0oXG56Y2YsXG5pbml0aWFsUG9zZXJJbnZpdGF0aW9uLFxucGFyYW1UeXBlc01hcCxcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcik9Plxue1xuLyoqIEB0eXBlIHtYaW1wb3J0KCdAYWdvcmljL25vdGlmaWVyJykuU3RvcmVkUHVibGlzaGVyS2l0PEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZT59ICovXG5jb25zdCBwdWJsaXNoZXJLaXQ9bWFrZVN0b3JlZFB1Ymxpc2hlcktpdChcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcixcbkdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkpO1xuXG5jb25zdCBwYXJhbU1hbmFnZXI9bWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyhcbnB1Ymxpc2hlcktpdCxcbnpjZixcbntFbGVjdG9yYXRlOmluaXRpYWxQb3Nlckludml0YXRpb259LFxucGFyYW1UeXBlc01hcCk7XG5cblxucmV0dXJuIGZhY2V0SGVscGVycyh6Y2YscGFyYW1NYW5hZ2VyKTtcbiB9OyRo4oCNX29uY2UuaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlKGhhbmRsZVBhcmFtR292ZXJuYW5jZSk7XG5cbmhhcmRlbihoYW5kbGVQYXJhbUdvdmVybmFuY2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InB1YmxpY01peGluQVBJIjpbInB1YmxpY01peGluQVBJIl0sImhhbmRsZVBhcmFtR292ZXJuYW5jZSI6WyJoYW5kbGVQYXJhbUdvdmVybmFuY2UiXSwiR09WRVJOQU5DRV9TVE9SQUdFX0tFWSI6WyJHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZIl0sInZhbGlkYXRlRWxlY3RvcmF0ZSI6WyJ2YWxpZGF0ZUVsZWN0b3JhdGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA6+mVqwkKAAAJCgAAJwAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25ldHdvcmsvZXhwb3J0ZWQuanMiLCJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3pvZS9leHBvcnRlZC5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIi4vcXVlc3Rpb24uanMiLCIuL2NvbnRyYWN0R292ZXJub3IuanMiLCIuL2NvbnRyYWN0SGVscGVyLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyIsIi4vdmFsaWRhdG9ycy5qcyIsIi4vY29uc3RhbnRzLmpzIl0sImV4cG9ydHMiOlsiRWxlY3Rpb25UeXBlIiwiRWxlY3Rpb25UeXBlIiwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIiwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciIsIm1ha2VQYXJhbU1hbmFnZXJTeW5jIiwibWFrZVBhcmFtTWFuYWdlclN5bmMiLCJwdWJsaWNNaXhpbkFQSSIsInB1YmxpY01peGluQVBJIiwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIiwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIixudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL25ldHdvcmsvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvZXJ0cC9leHBvcnRlZC5qc1wiLCBbXV0sW1wiQGFnb3JpYy96b2UvZXhwb3J0ZWQuanNcIiwgW11dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV0sW1wiLi9xdWVzdGlvbi5qc1wiLCBbXV0sW1wiLi9jb250cmFjdEdvdmVybm9yLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0SGVscGVyLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc1wiLCBbXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qc1wiLCBbXV0sW1wiLi92YWxpZGF0b3JzLmpzXCIsIFtdXSxbXCIuL2NvbnN0YW50cy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3F1ZXN0aW9uLmpzIjpbWyJDaG9pY2VNZXRob2QiLCJDaG9pY2VNZXRob2QiXSxbIkVsZWN0aW9uVHlwZSIsIkVsZWN0aW9uVHlwZSJdLFsiUXVvcnVtUnVsZSIsIlF1b3J1bVJ1bGUiXSxbImNvZXJjZVF1ZXN0aW9uU3BlYyIsImNvZXJjZVF1ZXN0aW9uU3BlYyJdLFsicG9zaXRpb25JbmNsdWRlZCIsInBvc2l0aW9uSW5jbHVkZWQiXSxbImJ1aWxkUXVlc3Rpb24iLCJidWlsZFF1ZXN0aW9uIl1dLCIuL2NvbnRyYWN0R292ZXJub3IuanMiOltbInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIiwidmFsaWRhdGVRdWVzdGlvbkRldGFpbHMiXSxbInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciIsInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciJdXSwiLi9jb250cmFjdEhlbHBlci5qcyI6W1siaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIiwiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIl0sWyJwdWJsaWNNaXhpbkFQSSIsInB1YmxpY01peGluQVBJIl1dLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qcyI6W1siYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSIsImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0iXSxbIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyIsIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyJdLFsic2V0dXBQYXJhbUdvdmVybmFuY2UiLCJzZXR1cFBhcmFtR292ZXJuYW5jZSJdLFsiQ09OVFJBQ1RfRUxFQ1RPUkFURSIsIkNPTlRSQUNUX0VMRUNUT1JBVEUiXV0sIi4vY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qcyI6W1siYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiLCJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyJdLFsibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciJdXSwiLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMiOltbIm1ha2VQYXJhbU1hbmFnZXIiLCJtYWtlUGFyYW1NYW5hZ2VyIl0sWyJtYWtlUGFyYW1NYW5hZ2VyU3luYyIsIm1ha2VQYXJhbU1hbmFnZXJTeW5jIl1dLCIuL3ZhbGlkYXRvcnMuanMiOltbImFzc2VydENvbnRyYWN0R292ZXJuYW5jZSIsImFzc2VydENvbnRyYWN0R292ZXJuYW5jZSJdLFsiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIiwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIl1dLCIuL2NvbnN0YW50cy5qcyI6W1siUGFyYW1UeXBlcyIsIlBhcmFtVHlwZXMiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACnAzdCnDwAApw8AACoAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvcXVlc3Rpb24uanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvem9lL3NyYy9tYWtlSGFuZGxlLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiQ2hvaWNlTWV0aG9kIiwiRWxlY3Rpb25UeXBlIiwiUXVvcnVtUnVsZSIsImJ1aWxkUXVlc3Rpb24iLCJjb2VyY2VRdWVzdGlvblNwZWMiLCJwb3NpdGlvbkluY2x1ZGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VFeG8sbXVzdE1hdGNoLGtleUVRLE0sbWFrZUhhbmRsZSxRdWVzdGlvbkksUXVlc3Rpb25TcGVjU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZUV4b1wiLCBbJGjigI1fYSA9PiAobWFrZUV4byA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qc1wiLCBbW1wibWFrZUhhbmRsZVwiLCBbJGjigI1fYSA9PiAobWFrZUhhbmRsZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlF1ZXN0aW9uSVwiLCBbJGjigI1fYSA9PiAoUXVlc3Rpb25JID0gJGjigI1fYSldXSxbXCJRdWVzdGlvblNwZWNTaGFwZVwiLCBbJGjigI1fYSA9PiAoUXVlc3Rpb25TcGVjU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyogVG9waWNzIGJlaW5nIHZvdGVkIG9uIGFyZSAnUXVlc3Rpb25zJy4gQmVmb3JlIGEgUXVlc3Rpb24gaXMga25vd24gdG8gYSovXG4vKiBlbGVjdG9yYXRlLCB0aGUgcGFyYW1ldGVycyBjYW4gYmUgZGVzY3JpYmVkIHdpdGggYSBRdWVzdGlvblNwZWMuIE9uY2UgdGhlKi9cbi8qIHF1ZXN0aW9uIGhhcyBiZWVuIHByZXNlbnRlZCB0byBhbiBFbGVjdG9yYXRlLCB0aGVyZSBpcyBhIFF1ZXN0aW9uRGV0YWlscyovXG4vKiByZWNvcmQgdGhhdCBhbHNvIGluY2x1ZGVzIHRoZSBWb3RlQ291bnRlciB3aGljaCB3aWxsIGRldGVybWluZSB0aGUgb3V0Y29tZSovXG4vKiBhbmQgdGhlIHF1ZXN0aW9uSGFuZGxlIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBpdC4qL1xuXG4vKipcbiAqIFwidW5yYW5rZWRcIiBpcyBtb3JlIGZvcm1hbGx5IGtub3duIGFzIFwiYXBwcm92YWxcIiB2b3RpbmcsIGJ1dCB0aGlzIGlzIGhhcmQgZm9yXG4gKiBwZW9wbGUgdG8gaW50dWl0IHdoZW4gdGhlcmUgYXJlIG9ubHkgdHdvIGFsdGVybmF0aXZlcy5cbiAqL1xuY29uc3QgQ2hvaWNlTWV0aG9kPS8qKiBAdHlwZSB7Y29uc3R9ICove1xuVU5SQU5LRUQ6J3VucmFua2VkJyxcbk9SREVSOidvcmRlcicsXG5QTFVSQUxJVFk6J3BsdXJhbGl0eSd9OyRo4oCNX29uY2UuQ2hvaWNlTWV0aG9kKENob2ljZU1ldGhvZCk7XG5cblxuY29uc3QgRWxlY3Rpb25UeXBlPS8qKiBAdHlwZSB7Y29uc3R9ICove1xuLyogQSBwYXJhbWV0ZXIgaXMgbmFtZWQsIGFuZCBhIG5ldyB2YWx1ZSBwcm9wb3NlZCovXG5QQVJBTV9DSEFOR0U6J3BhcmFtX2NoYW5nZScsXG4vKiBjaG9vc2Ugb25lIG9yIG11bHRpcGxlIHdpbm5lcnMsIGRlcGVuZGluZyBvbiBDaG9pY2VNZXRob2QqL1xuRUxFQ1RJT046J2VsZWN0aW9uJyxcblNVUlZFWTonc3VydmV5Jyxcbi8qIHdoZXRoZXIgb3Igbm90IHRvIGludm9rZSBhbiBBUEkgbWV0aG9kKi9cbkFQSV9JTlZPQ0FUSU9OOidhcGlfaW52b2NhdGlvbicsXG5PRkZFUl9GSUxURVI6J29mZmVyX2ZpbHRlcid9OyRo4oCNX29uY2UuRWxlY3Rpb25UeXBlKEVsZWN0aW9uVHlwZSk7XG5cblxuY29uc3QgUXVvcnVtUnVsZT0vKiogQHR5cGUge2NvbnN0fSAqL3tcbk1BSk9SSVRZOidtYWpvcml0eScsXG5OT19RVU9SVU06J25vX3F1b3J1bScsXG4vKiBUaGUgZWxlY3Rpb24gaXNuJ3QgdmFsaWQgdW5sZXNzIGFsbCB2b3RlcnMgdm90ZSovXG5BTEw6J2FsbCd9O1xuXG5cbi8qKiBAdHlwZSB7UG9zaXRpb25JbmNsdWRlZH0gKi8kaOKAjV9vbmNlLlF1b3J1bVJ1bGUoUXVvcnVtUnVsZSk7XG5jb25zdCBwb3NpdGlvbkluY2x1ZGVkPShwb3NpdGlvbnMscCk9PnBvc2l0aW9ucy5zb21lKChlKT0+a2V5RVEoZSxwKSk7XG5cbi8qKlxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IGFsbGVnZWRRdWVzdGlvblNwZWNcbiAqIEByZXR1cm5zIHtRdWVzdGlvblNwZWN9XG4gKi8kaOKAjV9vbmNlLnBvc2l0aW9uSW5jbHVkZWQocG9zaXRpb25JbmNsdWRlZCk7XG5jb25zdCBjb2VyY2VRdWVzdGlvblNwZWM9KHtcbm1ldGhvZCxcbmlzc3VlLFxucG9zaXRpb25zLFxuZWxlY3Rpb25UeXBlLFxubWF4Q2hvaWNlcyxcbm1heFdpbm5lcnMsXG5jbG9zaW5nUnVsZSxcbnF1b3J1bVJ1bGUsXG50aWVPdXRjb21lfSk9Plxue1xuY29uc3QgcXVlc3Rpb249aGFyZGVuKHtcbm1ldGhvZCxcbmlzc3VlLFxucG9zaXRpb25zLFxubWF4Q2hvaWNlczpOdW1iZXIobWF4Q2hvaWNlcyksXG5tYXhXaW5uZXJzOk51bWJlcihtYXhXaW5uZXJzKSxcbmVsZWN0aW9uVHlwZSxcbmNsb3NpbmdSdWxlLFxucXVvcnVtUnVsZSxcbnRpZU91dGNvbWV9KTtcblxuXG5tdXN0TWF0Y2gocXVlc3Rpb24sUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4vKiBYWFggSXQgd291bGQgYmUgbmljZSB0byBlbmZvcmNlIHRoaXMgdXNpbmcgcGFyYW1ldGVyaXplZCB0eXBlcywgYnV0IHRoYXQqL1xuLyogc2VlbXMgdG8gb25seSBlbmZvcmNlIHR5cGUgY29uc3RyYWludHMsIChpLmUuIHRoZSB0aWVPdXRjb21lIHdpbGwgYmUgdGhlKi9cbi8qIHNhbWUgdHlwZSBhcyBhbnkgb2YgdGhlIHBvc2l0aW9ucykgdW5sZXNzIHlvdSBjYW4gcHJvdmlkZSB0aGUgY29uY3JldGUqL1xuLyogdmFsdWUgYXQgcGF0dGVybiBjcmVhdGlvbiB0aW1lLiovXG5tdXN0TWF0Y2gocXVlc3Rpb24udGllT3V0Y29tZSxNLm9yKC4uLnF1ZXN0aW9uLnBvc2l0aW9ucykpO1xuXG5yZXR1cm4gcXVlc3Rpb247XG4gfTtcblxuLyoqIEB0eXBlIHtCdWlsZFF1ZXN0aW9ufSAqLyRo4oCNX29uY2UuY29lcmNlUXVlc3Rpb25TcGVjKGNvZXJjZVF1ZXN0aW9uU3BlYyk7XG5jb25zdCBidWlsZFF1ZXN0aW9uPShxdWVzdGlvblNwZWMsY291bnRlckluc3RhbmNlKT0+e1xuY29uc3QgcXVlc3Rpb25IYW5kbGU9bWFrZUhhbmRsZSgnUXVlc3Rpb24nKTtcblxuLyoqIEB0eXBlIHtRdWVzdGlvbn0gKi9cbnJldHVybiBtYWtlRXhvKCdxdWVzdGlvbiBkZXRhaWxzJyxRdWVzdGlvbkkse1xuZ2V0Vm90ZUNvdW50ZXIoKXtcbnJldHVybiBjb3VudGVySW5zdGFuY2U7XG4gfSxcbmdldERldGFpbHMoKXtcbnJldHVybiBoYXJkZW4oe1xuLi4ucXVlc3Rpb25TcGVjLFxucXVlc3Rpb25IYW5kbGUsXG5jb3VudGVySW5zdGFuY2V9KTtcblxuIH19KTtcblxuIH07JGjigI1fb25jZS5idWlsZFF1ZXN0aW9uKGJ1aWxkUXVlc3Rpb24pO1xuXG5oYXJkZW4oYnVpbGRRdWVzdGlvbik7XG5oYXJkZW4oQ2hvaWNlTWV0aG9kKTtcbmhhcmRlbihFbGVjdGlvblR5cGUpO1xuaGFyZGVuKGNvZXJjZVF1ZXN0aW9uU3BlYyk7XG5oYXJkZW4ocG9zaXRpb25JbmNsdWRlZCk7XG5oYXJkZW4oUXVvcnVtUnVsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ2hvaWNlTWV0aG9kIjpbIkNob2ljZU1ldGhvZCJdLCJFbGVjdGlvblR5cGUiOlsiRWxlY3Rpb25UeXBlIl0sIlF1b3J1bVJ1bGUiOlsiUXVvcnVtUnVsZSJdLCJwb3NpdGlvbkluY2x1ZGVkIjpbInBvc2l0aW9uSW5jbHVkZWQiXSwiY29lcmNlUXVlc3Rpb25TcGVjIjpbImNvZXJjZVF1ZXN0aW9uU3BlYyJdLCJidWlsZFF1ZXN0aW9uIjpbImJ1aWxkUXVlc3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5Ur/OCg7AAAoOwAALAAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3RpbWUiLCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvbm90aWZpZXIiXSwiZXhwb3J0cyI6WyJBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUiLCJBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUiLCJCaW5hcnlWb3RlQ291bnRlckFkbWluSSIsIkJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJIiwiQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJIiwiQ2hvaWNlTWV0aG9kU2hhcGUiLCJDbG9zaW5nUnVsZVNoYXBlIiwiRWxlY3Rpb25UeXBlU2hhcGUiLCJFbGVjdG9yYXRlQ3JlYXRvckkiLCJFbGVjdG9yYXRlUHVibGljSSIsIkdvdmVybm9yRmFjZXRTaGFwZSIsIkludml0YXRpb25TaGFwZSIsIk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiLCJOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSIsIk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSIsIk5vU2ltcGxlUG9zaXRpb25TaGFwZSIsIk9mZmVyRmlsdGVySXNzdWVTaGFwZSIsIk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUiLCJPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSIsIlBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUiLCJQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSIsIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUiLCJQYXJhbUNoYW5nZXNTcGVjU2hhcGUiLCJQYXJhbVBhdGhTaGFwZSIsIlBvc2l0aW9uU2hhcGUiLCJRdWVzdGlvbkRldGFpbHNTaGFwZSIsIlF1ZXN0aW9uSGFuZGxlU2hhcGUiLCJRdWVzdGlvbkkiLCJRdWVzdGlvblNwZWNTaGFwZSIsIlF1ZXN0aW9uU3RhdHNTaGFwZSIsIlF1b3J1bVJ1bGVTaGFwZSIsIlNpbXBsZUlzc3VlU2hhcGUiLCJTaW1wbGVQb3NpdGlvbnNTaGFwZSIsIlNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUiLCJWb3RlQ291bnRlckFkbWluSSIsIlZvdGVDb3VudGVyQ2xvc2VJIiwiVm90ZUNvdW50ZXJQdWJsaWNJIiwiVm90ZXJIYW5kbGUiLCJZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSIsIlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSIsIlllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiLCJZZXNTaW1wbGVQb3NpdGlvblNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0sVGltZXN0YW1wU2hhcGUsSW5zdGFuY2VIYW5kbGVTaGFwZSxUaW1lclNoYXBlLG1ha2VIYW5kbGVTaGFwZSxTdWJzY3JpYmVyU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiSW5zdGFuY2VIYW5kbGVTaGFwZVwiLCBbJGjigI1fYSA9PiAoSW5zdGFuY2VIYW5kbGVTaGFwZSA9ICRo4oCNX2EpXV0sW1wiVGltZXJTaGFwZVwiLCBbJGjigI1fYSA9PiAoVGltZXJTaGFwZSA9ICRo4oCNX2EpXV0sW1wibWFrZUhhbmRsZVNoYXBlXCIsIFskaOKAjV9hID0+IChtYWtlSGFuZGxlU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsIFskaOKAjV9hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdCAgICAgICAgQ2hvaWNlTWV0aG9kU2hhcGU9TS5vcigndW5yYW5rZWQnLCdvcmRlcicsJ3BsdXJhbGl0eScpOyRo4oCNX29uY2UuQ2hvaWNlTWV0aG9kU2hhcGUoQ2hvaWNlTWV0aG9kU2hhcGUpO1xuY29uc3QgICAgICAgIFF1b3J1bVJ1bGVTaGFwZT1NLm9yKCdtYWpvcml0eScsJ25vX3F1b3J1bScsJ2FsbCcpOyRo4oCNX29uY2UuUXVvcnVtUnVsZVNoYXBlKFF1b3J1bVJ1bGVTaGFwZSk7XG5jb25zdCAgICAgICAgRWxlY3Rpb25UeXBlU2hhcGU9TS5vcihcbidwYXJhbV9jaGFuZ2UnLFxuJ2VsZWN0aW9uJyxcbidzdXJ2ZXknLFxuJ2FwaV9pbnZvY2F0aW9uJyxcbidvZmZlcl9maWx0ZXInKTskaOKAjV9vbmNlLkVsZWN0aW9uVHlwZVNoYXBlKEVsZWN0aW9uVHlwZVNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgQ2xvc2luZ1J1bGVTaGFwZT1oYXJkZW4oe1xudGltZXI6TS5lcmVmKFRpbWVyU2hhcGUpLFxuZGVhZGxpbmU6VGltZXN0YW1wU2hhcGV9KTtcblxuXG4vKiBhbGwgdGhlIHN0cmluZ3MgdGhhdCB3aWxsIGJlIGluIHRoZSBmaWx0ZXIgYWZ0ZXIgcGFzc2luZyovJGjigI1fb25jZS5DbG9zaW5nUnVsZVNoYXBlKENsb3NpbmdSdWxlU2hhcGUpO1xuY29uc3QgICAgICAgIFllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZT1oYXJkZW4oe1xuc3RyaW5nczpNLmFycmF5T2YoTS5zdHJpbmcoKSl9KTskaOKAjV9vbmNlLlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZShZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUpO1xuXG5jb25zdCAgICAgICAgTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGU9aGFyZGVuKHtcbmRvbnRVcGRhdGU6TS5hcnJheU9mKE0uc3RyaW5nKCkpfSk7JGjigI1fb25jZS5Ob09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZShOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSk7XG5cbmNvbnN0ICAgICAgICBPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlPWhhcmRlbihbXG5ZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUsXG5Ob09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZV0pOyRo4oCNX29uY2UuT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZShPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlKTtcblxuY29uc3QgICAgICAgIE9mZmVyRmlsdGVySXNzdWVTaGFwZT1oYXJkZW4oe1xuc3RyaW5nczpNLmFycmF5T2YoTS5zdHJpbmcoKSl9KTskaOKAjV9vbmNlLk9mZmVyRmlsdGVySXNzdWVTaGFwZShPZmZlckZpbHRlcklzc3VlU2hhcGUpO1xuXG5jb25zdCAgICAgICAgT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZT1oYXJkZW4oe1xubWV0aG9kOkNob2ljZU1ldGhvZFNoYXBlLFxuaXNzdWU6T2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlLFxucG9zaXRpb25zOk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUsXG5lbGVjdGlvblR5cGU6J29mZmVyX2ZpbHRlcicsXG5tYXhDaG9pY2VzOjEsXG5tYXhXaW5uZXJzOjEsXG5jbG9zaW5nUnVsZTpDbG9zaW5nUnVsZVNoYXBlLFxucXVvcnVtUnVsZTpRdW9ydW1SdWxlU2hhcGUsXG50aWVPdXRjb21lOk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlfSk7JGjigI1fb25jZS5PZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlKE9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG5jb25zdCAgICAgICAgT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZT1oYXJkZW4oe1xuLi4uT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSxcbnF1ZXN0aW9uSGFuZGxlOm1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbmNvdW50ZXJJbnN0YW5jZTpJbnN0YW5jZUhhbmRsZVNoYXBlfSk7XG5cblxuLyoga2V5cyBhcmUgcGFyYW1ldGVyIG5hbWVzLCB2YWx1ZXMgYXJlIHByb3Bvc2VkIHZhbHVlcyovJGjigI1fb25jZS5PZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlKE9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuY29uc3QgICAgICAgIFBhcmFtQ2hhbmdlc1NwZWNTaGFwZT1NLnJlY29yZE9mKE0uc3RyaW5nKCksTS5hbnkoKSk7JGjigI1fb25jZS5QYXJhbUNoYW5nZXNTcGVjU2hhcGUoUGFyYW1DaGFuZ2VzU3BlY1NoYXBlKTtcbmNvbnN0ICAgICAgICBZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlPVBhcmFtQ2hhbmdlc1NwZWNTaGFwZTskaOKAjV9vbmNlLlllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUoWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSk7XG5jb25zdCAgICAgICAgTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlPWhhcmRlbih7XG5ub0NoYW5nZTpNLmFycmF5T2YoTS5zdHJpbmcoKSl9KTskaOKAjV9vbmNlLk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZShOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUpO1xuXG5jb25zdCAgICAgICAgUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGU9aGFyZGVuKFtcblllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUsXG5Ob1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGVdKTskaOKAjV9vbmNlLlBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlKFBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlKTtcblxuY29uc3QgICAgICAgIFBhcmFtUGF0aFNoYXBlPWhhcmRlbih7XG5rZXk6TS5hbnkoKX0pOyRo4oCNX29uY2UuUGFyYW1QYXRoU2hhcGUoUGFyYW1QYXRoU2hhcGUpO1xuXG5jb25zdCAgICAgICAgUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZT1oYXJkZW4oe1xuc3BlYzp7XG5wYXJhbVBhdGg6UGFyYW1QYXRoU2hhcGUsXG5jaGFuZ2VzOlBhcmFtQ2hhbmdlc1NwZWNTaGFwZX0sXG5cbmNvbnRyYWN0Okluc3RhbmNlSGFuZGxlU2hhcGV9KTskaOKAjV9vbmNlLlBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUoUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZT1oYXJkZW4oe1xubWV0aG9kOid1bnJhbmtlZCcsXG5pc3N1ZTpQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlLFxucG9zaXRpb25zOlBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlLFxuZWxlY3Rpb25UeXBlOidwYXJhbV9jaGFuZ2UnLFxubWF4Q2hvaWNlczoxLFxubWF4V2lubmVyczoxLFxuY2xvc2luZ1J1bGU6Q2xvc2luZ1J1bGVTaGFwZSxcbnF1b3J1bVJ1bGU6J21ham9yaXR5JyxcbnRpZU91dGNvbWU6Tm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlfSk7JGjigI1fb25jZS5QYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZShQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlPWhhcmRlbih7XG4uLi5QYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSxcbnF1ZXN0aW9uSGFuZGxlOm1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbmNvdW50ZXJJbnN0YW5jZTpJbnN0YW5jZUhhbmRsZVNoYXBlfSk7JGjigI1fb25jZS5QYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZShQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cblxuY29uc3QgQXBpSW52b2NhdGlvblNwZWNTaGFwZT1oYXJkZW4oe1xuYXBpTWV0aG9kTmFtZTpNLnN0cmluZygpLFxubWV0aG9kQXJnczpNLmFycmF5T2YoTS5hbnkoKSl9KTtcblxuY29uc3QgICAgICAgIFllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlPUFwaUludm9jYXRpb25TcGVjU2hhcGU7JGjigI1fb25jZS5ZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZShZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSk7XG5jb25zdCAgICAgICAgTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZT1oYXJkZW4oe1xuZG9udEludm9rZTpNLnN0cmluZygpfSk7JGjigI1fb25jZS5Ob0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUpO1xuXG5jb25zdCAgICAgICAgQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlPWhhcmRlbihbXG5ZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGVdKTskaOKAjV9vbmNlLkFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZShBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUpO1xuXG5jb25zdCAgICAgICAgQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlPWhhcmRlbih7XG5tZXRob2Q6J3VucmFua2VkJyxcbmlzc3VlOkFwaUludm9jYXRpb25TcGVjU2hhcGUsXG5wb3NpdGlvbnM6QXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlLFxuZWxlY3Rpb25UeXBlOidhcGlfaW52b2NhdGlvbicsXG5tYXhDaG9pY2VzOjEsXG5tYXhXaW5uZXJzOjEsXG5jbG9zaW5nUnVsZTpDbG9zaW5nUnVsZVNoYXBlLFxucXVvcnVtUnVsZTpRdW9ydW1SdWxlU2hhcGUsXG50aWVPdXRjb21lOk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGV9KTskaOKAjV9vbmNlLkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZShBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG5jb25zdCAgICAgICAgQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlPWhhcmRlbih7XG4uLi5BcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUsXG5xdWVzdGlvbkhhbmRsZTptYWtlSGFuZGxlU2hhcGUoJ1F1ZXN0aW9uJyksXG5jb3VudGVySW5zdGFuY2U6SW5zdGFuY2VIYW5kbGVTaGFwZX0pOyRo4oCNX29uY2UuQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlKEFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cblxuY29uc3QgU2ltcGxlU3BlY1NoYXBlPWhhcmRlbih7XG50ZXh0Ok0uc3RyaW5nKCl9KTtcblxuY29uc3QgICAgICAgIFllc1NpbXBsZVBvc2l0aW9uU2hhcGU9aGFyZGVuKHt0ZXh0Ok0uc3RyaW5nKCl9KTskaOKAjV9vbmNlLlllc1NpbXBsZVBvc2l0aW9uU2hhcGUoWWVzU2ltcGxlUG9zaXRpb25TaGFwZSk7XG5jb25zdCAgICAgICAgTm9TaW1wbGVQb3NpdGlvblNoYXBlPWhhcmRlbih7dGV4dDpNLnN0cmluZygpfSk7JGjigI1fb25jZS5Ob1NpbXBsZVBvc2l0aW9uU2hhcGUoTm9TaW1wbGVQb3NpdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBTaW1wbGVQb3NpdGlvbnNTaGFwZT1oYXJkZW4oW1xuWWVzU2ltcGxlUG9zaXRpb25TaGFwZSxcbk5vU2ltcGxlUG9zaXRpb25TaGFwZV0pOyRo4oCNX29uY2UuU2ltcGxlUG9zaXRpb25zU2hhcGUoU2ltcGxlUG9zaXRpb25zU2hhcGUpO1xuXG5jb25zdCAgICAgICAgU2ltcGxlSXNzdWVTaGFwZT1TaW1wbGVTcGVjU2hhcGU7JGjigI1fb25jZS5TaW1wbGVJc3N1ZVNoYXBlKFNpbXBsZUlzc3VlU2hhcGUpO1xuY29uc3QgICAgICAgIFNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlPWhhcmRlbih7XG5tZXRob2Q6Q2hvaWNlTWV0aG9kU2hhcGUsXG5pc3N1ZTpTaW1wbGVJc3N1ZVNoYXBlLFxucG9zaXRpb25zOk0uYXJyYXlPZihoYXJkZW4oe3RleHQ6TS5zdHJpbmcoKX0pKSxcbmVsZWN0aW9uVHlwZTpNLm9yKCdlbGVjdGlvbicsJ3N1cnZleScpLFxubWF4Q2hvaWNlczpNLmd0ZSgxKSxcbm1heFdpbm5lcnM6TS5ndGUoMSksXG5jbG9zaW5nUnVsZTpDbG9zaW5nUnVsZVNoYXBlLFxucXVvcnVtUnVsZTpRdW9ydW1SdWxlU2hhcGUsXG50aWVPdXRjb21lOk5vU2ltcGxlUG9zaXRpb25TaGFwZX0pOyRo4oCNX29uY2UuU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUoU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG5jb25zdCAgICAgICAgU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGU9aGFyZGVuKHtcbi4uLlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlLFxucXVlc3Rpb25IYW5kbGU6bWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuY291bnRlckluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGV9KTskaOKAjV9vbmNlLlNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlKFNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUXVlc3Rpb25TcGVjU2hhcGU9TS5vcihcbkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSxcbk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUsXG5QYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSxcblNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlKTskaOKAjV9vbmNlLlF1ZXN0aW9uU3BlY1NoYXBlKFF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUG9zaXRpb25TaGFwZT1NLm9yKFxuWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUsXG5Ob0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxuWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlLFxuTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUsXG5ZZXNTaW1wbGVQb3NpdGlvblNoYXBlLFxuTm9TaW1wbGVQb3NpdGlvblNoYXBlLFxuWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSk7JGjigI1fb25jZS5Qb3NpdGlvblNoYXBlKFBvc2l0aW9uU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBRdWVzdGlvbkhhbmRsZVNoYXBlPW1ha2VIYW5kbGVTaGFwZSgncXVlc3Rpb24nKTtcblxuLyogVE9ETyhoaWJiZXJ0KTogYWRkIGRldGFpbHM7IG1vdmUgdG8gYSBtb3JlIGFwcHJvcHJpYXRlIGxvY2F0aW9uKi8kaOKAjV9vbmNlLlF1ZXN0aW9uSGFuZGxlU2hhcGUoUXVlc3Rpb25IYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgSW52aXRhdGlvblNoYXBlPU0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uJyk7XG5cbi8qIFhYWCBJIHdhbnQgdG8gYWRkIHF1ZXN0aW9uSGFuZGxlIGFuZCBjb3VudGVySW5zdGFuY2UgdG8qL1xuLyogUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUuIEkgZG9uJ3Qgc2VlIGFueSBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgdGhlKi9cbi8qIG1ldGhvZHMgdG8gZWFjaCBtZW1iZXIgc2VwYXJhdGVseSovJGjigI1fb25jZS5JbnZpdGF0aW9uU2hhcGUoSW52aXRhdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBRdWVzdGlvbkRldGFpbHNTaGFwZT1NLm9yKFxuUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUsXG5BcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUsXG5PZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlLFxuU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUpOyRo4oCNX29uY2UuUXVlc3Rpb25EZXRhaWxzU2hhcGUoUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBFbGVjdG9yYXRlUHVibGljST1NLmludGVyZmFjZSgnQ29tbWl0dGVlIFB1YmxpY0ZhY2V0Jyx7XG5nZXRRdWVzdGlvblN1YnNjcmliZXI6TS5jYWxsKCkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuZ2V0T3BlblF1ZXN0aW9uczpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldEluc3RhbmNlOk0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG5nZXRRdWVzdGlvbjpNLmNhbGwoUXVlc3Rpb25IYW5kbGVTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSl9KTskaOKAjV9vbmNlLkVsZWN0b3JhdGVQdWJsaWNJKEVsZWN0b3JhdGVQdWJsaWNJKTtcblxuY29uc3QgRWxlY3RvcmF0ZVB1YmxpY1NoYXBlPU0ucmVtb3RhYmxlKCdFbGVjdG9yYXRlUHVibGljJyk7XG5cbmNvbnN0ICAgICAgICBFbGVjdG9yYXRlQ3JlYXRvckk9TS5pbnRlcmZhY2UoJ0NvbW1pdHRlZSBBZG1pbkZhY2V0Jyx7XG5nZXRQb3Nlckludml0YXRpb246TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5hZGRRdWVzdGlvbjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSxRdWVzdGlvblNwZWNTaGFwZSkucmV0dXJucyhcbk0ucHJvbWlzZSgpKSxcblxuZ2V0Vm90ZXJJbnZpdGF0aW9uczpNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihNLnByb21pc2UoKSkpLFxuZ2V0UXVlc3Rpb25TdWJzY3JpYmVyOk0uY2FsbCgpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbmdldFB1YmxpY0ZhY2V0Ok0uY2FsbCgpLnJldHVybnMoRWxlY3RvcmF0ZVB1YmxpY1NoYXBlKX0pOyRo4oCNX29uY2UuRWxlY3RvcmF0ZUNyZWF0b3JJKEVsZWN0b3JhdGVDcmVhdG9ySSk7XG5cblxuY29uc3QgICAgICAgIFF1ZXN0aW9uU3RhdHNTaGFwZT1oYXJkZW4oe1xuc3BvaWxlZDpNLm5hdCgpLFxudm90ZXM6TS5uYXQoKSxcbnJlc3VsdHM6TS5hcnJheU9mKHtwb3NpdGlvbjpQb3NpdGlvblNoYXBlLHRvdGFsOk0ubmF0KCl9KX0pOyRo4oCNX29uY2UuUXVlc3Rpb25TdGF0c1NoYXBlKFF1ZXN0aW9uU3RhdHNTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFF1ZXN0aW9uST1NLmludGVyZmFjZSgnUXVlc3Rpb24nLHtcbmdldFZvdGVDb3VudGVyOk0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG5nZXREZXRhaWxzOk0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25EZXRhaWxzU2hhcGUpfSk7JGjigI1fb25jZS5RdWVzdGlvbkkoUXVlc3Rpb25JKTtcblxuY29uc3QgUXVlc3Rpb25TaGFwZT1NLnJlbW90YWJsZSgnUXVlc3Rpb24nKTtcblxuY29uc3QgICAgICAgIEJpbmFyeVZvdGVDb3VudGVyUHVibGljST1NLmludGVyZmFjZShcbidCaW5hcnlWb3RlQ291bnRlciBQdWJsaWNGYWNldCcsXG57XG5nZXRRdWVzdGlvbjpNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uU2hhcGUpLFxuaXNPcGVuOk0uY2FsbCgpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0T3V0Y29tZTpNLmNhbGwoKS5yZXR1cm5zKE0uZXJlZihNLnByb21pc2UoKSkpLFxuZ2V0U3RhdHM6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXREZXRhaWxzOk0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25EZXRhaWxzU2hhcGUpLFxuZ2V0SW5zdGFuY2U6TS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKX0pOyRo4oCNX29uY2UuQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJKEJpbmFyeVZvdGVDb3VudGVyUHVibGljSSk7XG5cblxuXG5jb25zdCAgICAgICAgVm90ZXJIYW5kbGU9TS5yZW1vdGFibGUoKTskaOKAjV9vbmNlLlZvdGVySGFuZGxlKFZvdGVySGFuZGxlKTtcbmNvbnN0ICAgICAgICBCaW5hcnlWb3RlQ291bnRlckFkbWluST1NLmludGVyZmFjZShcbidCaW5hcnlWb3RlQ291bnRlciBBZG1pbkZhY2V0JyxcbntcbnN1Ym1pdFZvdGU6TS5jYWxsKFZvdGVySGFuZGxlLE0uYXJyYXlPZihQb3NpdGlvblNoYXBlKSkuXG5vcHRpb25hbChNLm5hdCgpKS5cbnJldHVybnMoe2Nob3NlbjpQb3NpdGlvblNoYXBlLHNoYXJlczpNLm5hdCgpfSl9KTskaOKAjV9vbmNlLkJpbmFyeVZvdGVDb3VudGVyQWRtaW5JKEJpbmFyeVZvdGVDb3VudGVyQWRtaW5JKTtcblxuXG5cbmNvbnN0ICAgICAgICBCaW5hcnlWb3RlQ291bnRlckNsb3NlST1NLmludGVyZmFjZShcbidCaW5hcnlWb3RlQ291bnRlciBDbG9zZUZhY2V0JyxcbntcbmNsb3NlVm90aW5nOk0uY2FsbCgpLnJldHVybnMoKX0pOyRo4oCNX29uY2UuQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkoQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkpO1xuXG5cblxuY29uc3QgICAgICAgIFZvdGVDb3VudGVyUHVibGljST1NLmludGVyZmFjZSgnVm90ZUNvdW50ZXIgUHVibGljRmFjZXQnLHtcbmdldFF1ZXN0aW9uOk0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25TaGFwZSksXG5pc09wZW46TS5jYWxsKCkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRPdXRjb21lOk0uY2FsbCgpLnJldHVybnMoTS5lcmVmKE0ucHJvbWlzZSgpKSksXG5nZXRTdGF0czpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldERldGFpbHM6TS5jYWxsKCkucmV0dXJucyhRdWVzdGlvbkRldGFpbHNTaGFwZSksXG5nZXRJbnN0YW5jZTpNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpfSk7JGjigI1fb25jZS5Wb3RlQ291bnRlclB1YmxpY0koVm90ZUNvdW50ZXJQdWJsaWNJKTtcblxuXG5jb25zdCAgICAgICAgVm90ZUNvdW50ZXJBZG1pbkk9TS5pbnRlcmZhY2UoJ1ZvdGVDb3VudGVyIEFkbWluRmFjZXQnLHtcbnN1Ym1pdFZvdGU6TS5jYWxsKFZvdGVySGFuZGxlLE0uYXJyYXlPZihQb3NpdGlvblNoYXBlKSkuXG5vcHRpb25hbChNLm5hdCgpKS5cbnJldHVybnMoe2Nob3NlbjpNLmFycmF5T2YoUG9zaXRpb25TaGFwZSksc2hhcmVzOk0ubmF0KCl9KX0pOyRo4oCNX29uY2UuVm90ZUNvdW50ZXJBZG1pbkkoVm90ZUNvdW50ZXJBZG1pbkkpO1xuXG5cbmNvbnN0ICAgICAgICBWb3RlQ291bnRlckNsb3NlST1NLmludGVyZmFjZSgnVm90ZUNvdW50ZXIgQ2xvc2VGYWNldCcse1xuY2xvc2VWb3Rpbmc6TS5jYWxsKCkucmV0dXJucygpfSk7JGjigI1fb25jZS5Wb3RlQ291bnRlckNsb3NlSShWb3RlQ291bnRlckNsb3NlSSk7XG5cblxuY29uc3QgICAgICAgIEdvdmVybm9yRmFjZXRTaGFwZT17XG5nZXRQYXJhbU1nclJldHJpZXZlcjpNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdwYXJhbVJldHJpZXZlcicpKSxcbmdldEludml0YXRpb246TS5jYWxsKCkucmV0dXJucyhJbnZpdGF0aW9uU2hhcGUpLFxuZ2V0TGltaXRlZENyZWF0b3JGYWNldDpNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCkpLFxuZ2V0R292ZXJuZWRBcGlzOk0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ2dvdmVybmVkQVBJcycpKSxcbmdldEdvdmVybmVkQXBpTmFtZXM6TS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuc2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKE0uYXJyYXlPZihNLnN0cmluZygpKSkucmV0dXJucyhNLnByb21pc2UoKSl9OyRo4oCNX29uY2UuR292ZXJub3JGYWNldFNoYXBlKEdvdmVybm9yRmFjZXRTaGFwZSk7XG5cbmhhcmRlbihHb3Zlcm5vckZhY2V0U2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNob2ljZU1ldGhvZFNoYXBlIjpbIkNob2ljZU1ldGhvZFNoYXBlIl0sIlF1b3J1bVJ1bGVTaGFwZSI6WyJRdW9ydW1SdWxlU2hhcGUiXSwiRWxlY3Rpb25UeXBlU2hhcGUiOlsiRWxlY3Rpb25UeXBlU2hhcGUiXSwiQ2xvc2luZ1J1bGVTaGFwZSI6WyJDbG9zaW5nUnVsZVNoYXBlIl0sIlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSI6WyJZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiXSwiTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiOlsiTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiXSwiT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSI6WyJPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlIl0sIk9mZmVyRmlsdGVySXNzdWVTaGFwZSI6WyJPZmZlckZpbHRlcklzc3VlU2hhcGUiXSwiT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSI6WyJPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlIl0sIk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJQYXJhbUNoYW5nZXNTcGVjU2hhcGUiOlsiUGFyYW1DaGFuZ2VzU3BlY1NoYXBlIl0sIlllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiOlsiWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSJdLCJOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiOlsiTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIl0sIlBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlIl0sIlBhcmFtUGF0aFNoYXBlIjpbIlBhcmFtUGF0aFNoYXBlIl0sIlBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUiOlsiUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSJdLCJQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSI6WyJQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSJdLCJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSI6WyJZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSJdLCJOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIjpbIk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiXSwiQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlIjpbIkFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSJdLCJBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUiOlsiQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlIl0sIkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiWWVzU2ltcGxlUG9zaXRpb25TaGFwZSI6WyJZZXNTaW1wbGVQb3NpdGlvblNoYXBlIl0sIk5vU2ltcGxlUG9zaXRpb25TaGFwZSI6WyJOb1NpbXBsZVBvc2l0aW9uU2hhcGUiXSwiU2ltcGxlUG9zaXRpb25zU2hhcGUiOlsiU2ltcGxlUG9zaXRpb25zU2hhcGUiXSwiU2ltcGxlSXNzdWVTaGFwZSI6WyJTaW1wbGVJc3N1ZVNoYXBlIl0sIlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlIjpbIlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlIl0sIlNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIlNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlF1ZXN0aW9uU3BlY1NoYXBlIjpbIlF1ZXN0aW9uU3BlY1NoYXBlIl0sIlBvc2l0aW9uU2hhcGUiOlsiUG9zaXRpb25TaGFwZSJdLCJRdWVzdGlvbkhhbmRsZVNoYXBlIjpbIlF1ZXN0aW9uSGFuZGxlU2hhcGUiXSwiSW52aXRhdGlvblNoYXBlIjpbIkludml0YXRpb25TaGFwZSJdLCJRdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJRdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJFbGVjdG9yYXRlUHVibGljSSI6WyJFbGVjdG9yYXRlUHVibGljSSJdLCJFbGVjdG9yYXRlQ3JlYXRvckkiOlsiRWxlY3RvcmF0ZUNyZWF0b3JJIl0sIlF1ZXN0aW9uU3RhdHNTaGFwZSI6WyJRdWVzdGlvblN0YXRzU2hhcGUiXSwiUXVlc3Rpb25JIjpbIlF1ZXN0aW9uSSJdLCJCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kiOlsiQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJIl0sIlZvdGVySGFuZGxlIjpbIlZvdGVySGFuZGxlIl0sIkJpbmFyeVZvdGVDb3VudGVyQWRtaW5JIjpbIkJpbmFyeVZvdGVDb3VudGVyQWRtaW5JIl0sIkJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJIjpbIkJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJIl0sIlZvdGVDb3VudGVyUHVibGljSSI6WyJWb3RlQ291bnRlclB1YmxpY0kiXSwiVm90ZUNvdW50ZXJBZG1pbkkiOlsiVm90ZUNvdW50ZXJBZG1pbkkiXSwiVm90ZUNvdW50ZXJDbG9zZUkiOlsiVm90ZUNvdW50ZXJDbG9zZUkiXSwiR292ZXJub3JGYWNldFNoYXBlIjpbIkdvdmVybm9yRmFjZXRTaGFwZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAByDYccXWEAAF1hAAAvAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3R5cGVzLWFtYmllbnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0eXBlZGVmIHsgJ3VucmFua2VkJyB8ICdvcmRlcicgfCAncGx1cmFsaXR5JyB9IENob2ljZU1ldGhvZFxuICogKiBVTlJBTktFRDogXCJ1bnJhbmtlZCB2b3RpbmdcIiBtZWFucyB0aGF0IHRoZSB2b3RlciBzcGVjaWZpZXMgc29tZSBudW1iZXIgb2ZcbiAqICAgIHBvc2l0aW9ucywgYW5kIGlzIGVuZG9yc2luZyB0aGVtIGVxdWFsbHkuXG4gKiAqIE9SREVSOiBUaGUgdm90ZXIgYXNzaWducyBvcmRpbmFsIG51bWJlcnMgdG8gc29tZSBvZiB0aGUgcG9zaXRpb25zLiBUaGVcbiAqICAgIHBvc2l0aW9ucyB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gb3JkZXJlZCBsaXN0IHdpdGggbm8gZ2Fwcy5cbiAqXG4gKiBXaGVuIHZvdGVycyBhcmUgbGltaXRlZCB0byBjaG9vc2luZyBhIHNpbmdsZSBjYW5kaWRhdGUsIGVpdGhlciBVTlJBTktFRCBvclxuICogT1JERVIgd291bGQgd29yay4gVU5SQU5LRUQgaGFzIGEgc2ltcGxlciByZXByZXNlbnRhdGlvbiBzbyB3ZSB1c2UgdGhhdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgJ3BhcmFtX2NoYW5nZScgfCAnZWxlY3Rpb24nIHwgJ3N1cnZleScgfCAnYXBpX2ludm9jYXRpb24nIHxcbiAqICAgJ29mZmVyX2ZpbHRlcicgfSBFbGVjdGlvblR5cGVcbiAqIHBhcmFtX2NoYW5nZSBpcyB2ZXJ5IHNwZWNpZmljLiBTdXJ2ZXkgbWVhbnMgbXVsdGlwbGUgYW5zd2VycyBhcmUgcG9zc2libGUsXG4gKiBFbGVjdGlvbiBtZWFucyBzb21lIGNhbmRpZGF0ZXMgYXJlIGdvaW5nIHRvIFwid2luXCIuIEl0J3Mgbm90IGNsZWFyIHRoZXNlIGFyZVxuICogb3J0aG9nb25hbC4gVGhlIGltcG9ydGFudCBkaXN0aW5jdGlvbiBpcyB0aGF0IHBhcmFtX2NoYW5nZSBoYXMgYSBzdHJ1Y3R1cmVkXG4gKiBpc3N1ZSwgd2hpbGUgdGhlIG90aGVycyBoYXZlIGEgaXNzdWUgcHJlc2VudGVkIGFzIGEgc3RyaW5nLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9jb25zdGFudHMuanMnKS5QYXJhbVR5cGV9IFBhcmFtVHlwZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgJ21ham9yaXR5JyB8ICdhbGwnIHwgJ25vX3F1b3J1bScgfSBRdW9ydW1SdWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaW1wbGVJc3N1ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRleHRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgQW1vdW50IHwgQnJhbmQgfCBJbnN0YWxsYXRpb24gfCBJbnN0YW5jZSB8IGJpZ2ludCB8XG4gKiAgIFJhdGlvIHwgc3RyaW5nIHwgWGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcFJlY29yZCB8XG4gKiAgIFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5SZWxhdGl2ZVRpbWVSZWNvcmQgfCB1bmtub3duIH0gUGFyYW1WYWx1ZVxuICovXG5cbi8qIFhYWCBiZXR0ZXIgdG8gdXNlIHRoZSBtYW5pZmVzdCBjb25zdGFudCBQYXJhbVR5cGVzKi9cbi8qIGJ1dCBpbXBvcnRpbmcgdGhhdCBoZXJlIHR1cm5zIHRoaXMgZmlsZSBpbnRvIGEgbW9kdWxlLCovXG4vKiBicmVha2luZyB0aGUgYW1iaWVudCB0eXBpbmcqL1xuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZX0gVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyAnYW1vdW50JyA/IEFtb3VudDxhbnk+IDpcbiAqIFQgZXh0ZW5kcyAnYnJhbmQnID8gQnJhbmQgOlxuICogVCBleHRlbmRzICdpbnN0YWxsYXRpb24nID8gSW5zdGFsbGF0aW9uOlxuICogVCBleHRlbmRzICdpbnN0YW5jZScgPyBJbnN0YW5jZSA6XG4gKiBUIGV4dGVuZHMgJ2ludml0YXRpb24nID8gQW1vdW50PCdzZXQnPiA6IC8vIFhYWCB0aGlzIGlzIHRoZSBnZXR0ZXIgdmFsdWUgYnV0IG5vdCB0aGUgc2V0dGVyXG4gKiBUIGV4dGVuZHMgJ25hdCcgPyBiaWdpbnQgOlxuICogVCBleHRlbmRzICdyYXRpbycgPyBSYXRpbyA6XG4gKiBUIGV4dGVuZHMgJ3N0cmluZycgPyBzdHJpbmcgOlxuICogVCBleHRlbmRzICd0aW1lc3RhbXAnID8gWGltcG9ydCgnQGFnb3JpYy90aW1lJykuVGltZXN0YW1wIDpcbiAqIFQgZXh0ZW5kcyAncmVsYXRpdmVUaW1lJyA/IFhpbXBvcnQoJ0BhZ29yaWMvdGltZScpLlJlbGF0aXZlVGltZSA6XG4gKiBUIGV4dGVuZHMgJ3Vua25vd24nID8gdW5rbm93biA6XG4gKiBuZXZlclxuICogfSBQYXJhbVZhbHVlRm9yVHlwZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGV9IFtUPVBhcmFtVHlwZV1cbiAqIEB0eXBlZGVmIHt7IHR5cGU6IFQsIHZhbHVlOiBQYXJhbVZhbHVlRm9yVHlwZTxUPiB9fSBQYXJhbVZhbHVlVHlwZWQ8VD5cbiAqL1xuXG4vKipcbiAqIFRlcm1zIGEgY29udHJhY3QgbXVzdCBwcm92aWRlIGluIG9yZGVyIHRvIGJlIGdvdmVybmVkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnKS5QYXJhbVR5cGVzTWFwfSBUIEdvdmVybmVkIHBhcmFtZXRlcnMgb2YgY29udHJhY3RcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGVsZWN0aW9uTWFuYWdlcjogWGltcG9ydCgnQGFnb3JpYy96b2Uvc3JjL3pvZVNlcnZpY2UvdXRpbHMuanMnKS5JbnN0YW5jZTxYaW1wb3J0KCcuL2NvbnRyYWN0R292ZXJub3IuanMnKVsnc3RhcnQnXT4sXG4gKiAgIGdvdmVybmVkUGFyYW1zOiBYaW1wb3J0KCcuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcycpLlBhcmFtUmVjb3Jkc0Zyb21UeXBlczxUICYge1xuICogICAgIEVsZWN0b3JhdGU6ICdpbnZpdGF0aW9uJ1xuICogICB9PlxuICogfX0gR292ZXJuYW5jZVRlcm1zPFQ+XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IFNpbXBsZUlzc3VlIHwgUGFyYW1DaGFuZ2VJc3N1ZTx1bmtub3duPiB8IEFwaUludm9jYXRpb25Jc3N1ZSB8XG4gKiAgIE9mZmVyRmlsdGVySXNzdWUgfSBJc3N1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUXVlc3Rpb25UZXJtcyAtIFF1ZXN0aW9uU3BlYyBwbHVzIHRoZSBFbGVjdG9yYXRlIEluc3RhbmNlIGFuZFxuICogICBhIG51bWVyaWNhbCB0aHJlc2hvbGQgZm9yIHRoZSBxdW9ydW0uIChUaGUgdm90ZUNvdW50ZXIgZG9lc24ndCBrbm93IHRoZVxuICogICBzaXplIG9mIHRoZSBlbGVjdG9yYXRlLCBzbyB0aGUgRWxlY3RvcmF0ZSBoYXMgdG8gc2F5IHdoYXQgbGltaXQgdG8gZW5mb3JjZS4pXG4gKiBAcHJvcGVydHkge1F1ZXN0aW9uU3BlY30gcXVlc3Rpb25TcGVjXG4gKiBAcHJvcGVydHkge251bWJlcn0gcXVvcnVtVGhyZXNob2xkXG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBlbGVjdG9yYXRlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUZXh0UG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0ZXh0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IFRleHRQb3NpdGlvbiB8IENoYW5nZVBhcmFtc1Bvc2l0aW9uIHwgTm9DaGFuZ2VQYXJhbXNQb3NpdGlvbiB8IEludm9rZUFwaVBvc2l0aW9uIHwgRG9udEludm9rZUFwaVBvc2l0aW9uIHxcbiAqICAgIE9mZmVyRmlsdGVyUG9zaXRpb24gfCBOb0NoYW5nZU9mZmVyRmlsdGVyUG9zaXRpb24gfCBJbnZva2VBcGlQb3NpdGlvbiB9IFBvc2l0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7eyBxdWVzdGlvbjogSGFuZGxlPCdRdWVzdGlvbic+IH0gJiAoXG4gKiAgIHsgb3V0Y29tZTogJ3dpbicsIHBvc2l0aW9uOiBQb3NpdGlvbiB9IHxcbiAqICAgeyBvdXRjb21lOiAnZmFpbCcsIHJlYXNvbjogJ05vIHF1b3J1bScgfVxuICogKX0gT3V0Y29tZVJlY29yZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgcXVlc3Rpb246IEhhbmRsZTwnUXVlc3Rpb24nPiB9ICYgKFxuICogIHsgb3V0Y29tZTogJ3dpbicsIHBvc2l0aW9uczogUG9zaXRpb25bXSB9IHxcbiAqICB7IG91dGNvbWU6ICdmYWlsJywgcmVhc29uOiAnTm8gcXVvcnVtJyB9XG4gKiApfSBNdWx0aU91dGNvbWVSZWNvcmRcbiAqL1xuXG4vKipcbiAqIFNwZWNpZmljYXRpb24gd2hlbiByZXF1ZXN0aW5nIGNyZWF0aW9uIG9mIGEgUXVlc3Rpb25cbiAqXG4gKiBAdGVtcGxhdGUge0lzc3VlfSBbST1Jc3N1ZV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1ZXN0aW9uU3BlY1xuICogQHByb3BlcnR5IHtDaG9pY2VNZXRob2R9IG1ldGhvZFxuICogQHByb3BlcnR5IHtJfSBpc3N1ZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbltdfSBwb3NpdGlvbnNcbiAqIEBwcm9wZXJ0eSB7RWxlY3Rpb25UeXBlfSBlbGVjdGlvblR5cGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhDaG9pY2VzXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4V2lubmVyc1xuICogQHByb3BlcnR5IHtDbG9zaW5nUnVsZX0gY2xvc2luZ1J1bGVcbiAqIEBwcm9wZXJ0eSB7UXVvcnVtUnVsZX0gcXVvcnVtUnVsZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gdGllT3V0Y29tZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUXVlc3Rpb25EZXRhaWxzRXh0cmFQcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBjb3VudGVySW5zdGFuY2UgLSBpbnN0YW5jZSBvZiB0aGUgVm90ZUNvdW50ZXJcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1F1ZXN0aW9uU3BlYyAmIFF1ZXN0aW9uRGV0YWlsc0V4dHJhUHJvcGVydGllc30gUXVlc3Rpb25EZXRhaWxzXG4gKiAgICBjb21wbGV0ZSBxdWVzdGlvbiBkZXRhaWxzOiBxdWVzdGlvblNwZWMgcGx1cyBjb3VudGVyIGFuZCBxdWVzdGlvbkhhbmRsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR292ZXJuYW5jZVBhaXJcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGdvdmVybm9yXG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBnb3Zlcm5lZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUXVlc3Rpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldFZvdGVDb3VudGVyXG4gKiBAcHJvcGVydHkgeygpID0+IFF1ZXN0aW9uRGV0YWlsc30gZ2V0RGV0YWlsc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tcGxldGVVbnJhbmtlZFF1ZXN0aW9uXG4gKiBAcHJvcGVydHkge0hhbmRsZTwnUXVlc3Rpb24nPn0gcXVlc3Rpb25IYW5kbGVcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb25bXX0gY2hvc2VuIC0gYSBsaXN0IG9mIGVxdWFsLXdlaWdodCBwcmVmZXJyZWQgcG9zaXRpb25zXG4gKi9cblxuLyogbm90IHlldCBpbiB1c2UqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21wbGV0ZVdlaWdodGVkQmFsbG90XG4gKiBAcHJvcGVydHkge0hhbmRsZTwnUXVlc3Rpb24nPn0gcXVlc3Rpb25IYW5kbGVcbiAqIEBwcm9wZXJ0eSB7W1Bvc2l0aW9uLGJpZ2ludF1bXX0gd2VpZ2h0ZWQgLSBsaXN0IG9mIHBvc2l0aW9ucyB3aXRoXG4gKiAgIHdlaWdodHMuIFZvdGVDb3VudGVyIG1heSBsaW1pdCB3ZWlnaHRzIHRvIGEgcmFuZ2Ugb3IgcmVxdWlyZSB1bmlxdWVuZXNzLlxuICovXG5cbi8qIG5vdCB5ZXQgaW4gdXNlKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tcGxldGVPcmRlcmVkQmFsbG90XG4gKiBAcHJvcGVydHkge0hhbmRsZTwnUXVlc3Rpb24nPn0gcXVlc3Rpb25IYW5kbGVcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb25bXX0gb3JkZXJlZCAtIG9yZGVyZWQgbGlzdCBvZiBwb3NpdGlvbiBmcm9tIG1vc3QgcHJlZmVycmVkXG4gKiAgIHRvIGxlYXN0IHByZWZlcnJlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUG9zaXRpb25Db3VudFxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gcG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSB0b3RhbFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZVN0YXRpc3RpY3NcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBzcG9pbGVkXG4gKiBAcHJvcGVydHkge251bWJlcn0gdm90ZXNcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb25Db3VudFtdfSByZXN1bHRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdW9ydW1Db3VudGVyXG4gKiBAcHJvcGVydHkgeyhzdGF0czogVm90ZVN0YXRpc3RpY3MpID0+IGJvb2xlYW59IGNoZWNrXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQnVpbGRRdWVzdGlvblxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IHF1ZXN0aW9uU3BlY1xuICogQHBhcmFtIHtJbnN0YW5jZX0gaW5zdGFuY2UgLSB2b3RlQ291bnRlciBpbnN0YW5jZVxuICogQHJldHVybnMge1F1ZXN0aW9ufVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZUNvdW50ZXJDcmVhdG9yRmFjZXQgLSBhIGZhY2V0IHRoYXQgdGhlIEVsZWN0b3JhdGUgc2hvdWxkXG4gKiAgIGhvbGQgdGlnaHRseS4gc3VibWl0Vm90ZSgpIGlzIHRoZSBjb3JlIGNhcGFiaWxpdHkgdGhhdCBhbGxvd3MgdGhlIGhvbGRlciB0b1xuICogICBzcGVjaWZ5IHRoZSBpZGVudGl0eSBhbmQgY2hvaWNlIG9mIGEgdm90ZXIuIFRoZSB2b3RlQ291bnRlciBpcyBtYWtpbmcgdGhhdFxuICogICBhdmFpbGFibGUgdG8gdGhlIEVsZWN0b3JhdGUsIHdoaWNoIHNob3VsZCB3cmFwIGFuZCBhdHRlbnVhdGUgaXQgc28gZWFjaFxuICogICB2b3RlciBnZXRzIG9ubHkgdGhlIGFiaWxpdHkgdG8gY2FzdCB0aGVpciBvd24gdm90ZSBhdCBhIHdlaWdodCBzcGVjaWZpZWQgYnlcbiAqICAgdGhlIGVsZWN0b3JhdGUuXG4gKiBAcHJvcGVydHkge1N1Ym1pdFZvdGV9IHN1Ym1pdFZvdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZvdGVDb3VudGVyUHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbn0gaXNPcGVuXG4gKiBAcHJvcGVydHkgeygpID0+IFF1ZXN0aW9ufSBnZXRRdWVzdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFBvc2l0aW9uPn0gZ2V0T3V0Y29tZVxuICogQHByb3BlcnR5IHsoKSA9PiBRdWVzdGlvbkRldGFpbHN9IGdldERldGFpbHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxWb3RlU3RhdGlzdGljcz59IGdldFN0YXRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNdWx0aVZvdGVDb3VudGVyUHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbn0gaXNPcGVuXG4gKiBAcHJvcGVydHkgeygpID0+IFF1ZXN0aW9ufSBnZXRRdWVzdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFBvc2l0aW9uW10+fSBnZXRPdXRjb21lXG4gKiBAcHJvcGVydHkgeygpID0+IFF1ZXN0aW9uRGV0YWlsc30gZ2V0RGV0YWlsc1xuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZvdGVTdGF0aXN0aWNzPn0gZ2V0U3RhdHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZvdGVDb3VudGVyQ2xvc2VGYWNldFxuICogICBURVNUIE9OTFk6IFNob3VsZCBub3QgYmUgYWxsb3dlZCB0byBlc2NhcGUgZnJvbSBjb250cmFjdHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gY2xvc2VWb3RpbmdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZvdGVDb3VudGVyRmFjZXRzXG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyUHVibGljRmFjZXR9IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyQ3JlYXRvckZhY2V0fSBjcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDbG9zZUZhY2V0fSBjbG9zZUZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNdWx0aVZvdGVDb3VudGVyRmFjZXRzXG4gKiBAcHJvcGVydHkge011bHRpVm90ZUNvdW50ZXJQdWJsaWNGYWNldH0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXR9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtWb3RlQ291bnRlckNsb3NlRmFjZXR9IGNsb3NlRmFjZXRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCdWlsZFZvdGVDb3VudGVyXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlY30gcXVlc3Rpb25TcGVjXG4gKiBAcGFyYW0ge2JpZ2ludH0gdGhyZXNob2xkIC0gcXVlc3Rpb25TcGVjIGluY2x1ZGVzIHF1b3J1bVJ1bGU7IHRoZSBlbGVjdG9yYXRlXG4gKiAgICBjb252ZXJ0cyB0aGF0IHRvIGEgbnVtYmVyIHRoYXQgdGhlIGNvdW50ZXIgY2FuIGVuZm9yY2UuXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHBhcmFtIHtFUmVmPFB1Ymxpc2hlcjxPdXRjb21lUmVjb3JkPj59IHB1Ymxpc2hlclxuICogQHJldHVybnMge1ZvdGVDb3VudGVyRmFjZXRzfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEJ1aWxkTXVsdGlWb3RlQ291bnRlclxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IHF1ZXN0aW9uU3BlY1xuICogQHBhcmFtIHtiaWdpbnR9IHRocmVzaG9sZCAtIHF1ZXN0aW9uU3BlYyBpbmNsdWRlcyBxdW9ydW1SdWxlOyB0aGUgZWxlY3RvcmF0ZVxuICogICAgY29udmVydHMgdGhhdCB0byBhIG51bWJlciB0aGF0IHRoZSBjb3VudGVyIGNhbiBlbmZvcmNlLlxuICogQHBhcmFtIHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaXNoZXI8TXVsdGlPdXRjb21lUmVjb3JkPj59IHB1Ymxpc2hlclxuICogQHJldHVybnMge011bHRpVm90ZUNvdW50ZXJGYWNldHN9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21wbGV0ZWRCYWxsZXRcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IGNob3NlblxuICogQHByb3BlcnR5IHtiaWdpbnR9IHNoYXJlc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFN1Ym1pdFZvdGVcbiAqIEBwYXJhbSB7SGFuZGxlPCdWb3Rlcic+fSB2b3RlckhhbmRsZVxuICogQHBhcmFtIHtQb3NpdGlvbltdfSBjaG9zZW5Qb3NpdGlvbnNcbiAqIEBwYXJhbSB7YmlnaW50fSBbd2VpZ2h0XVxuICogQHJldHVybnMge0NvbXBsZXRlZEJhbGxldH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRPcGVuUXVlc3Rpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxIYW5kbGU8J1F1ZXN0aW9uJz5bXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0UXVlc3Rpb25cbiAqIEBwYXJhbSB7SGFuZGxlPCdRdWVzdGlvbic+fSBoXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxRdWVzdGlvbj59XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbGVjdG9yYXRlUHVibGljXG4gKiBAcHJvcGVydHkgeygpID0+IFN1YnNjcmliZXI8UXVlc3Rpb25EZXRhaWxzPn0gZ2V0UXVlc3Rpb25TdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkge0dldE9wZW5RdWVzdGlvbnN9IGdldE9wZW5RdWVzdGlvbnMsXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHtHZXRRdWVzdGlvbn0gZ2V0UXVlc3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgRWxlY3RvcmF0ZVB1YmxpYyAmIHttYWtlVm90ZXJJbnZpdGF0aW9uOiAoKSA9PiBFUmVmPEludml0YXRpb24+fSB9IENsYWltc0VsZWN0b3JhdGVQdWJsaWNcbiAqIEB0eXBlZGVmIHsgRWxlY3RvcmF0ZVB1YmxpYyAmIHtnZXROYW1lOiAoKSA9PiBzdHJpbmd9IH0gQ29tbWl0dGVlRWxlY3RvcmF0ZVB1YmxpY1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUG9zZXJGYWNldFxuICogQHByb3BlcnR5IHtBZGRRdWVzdGlvbn0gYWRkUXVlc3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVsZWN0b3JhdGVDcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7QWRkUXVlc3Rpb259IGFkZFF1ZXN0aW9uIGNhbiBiZSB1c2VkIGRpcmVjdGx5IHdoZW4gdGhlIGNyZWF0b3IgZG9lc24ndCBuZWVkIGFueVxuICogIHJlYXNzdXJhbmNlLiBXaGVuIHNvbWVvbmUgbmVlZHMgdG8gY29ubmVjdCBhZGRRdWVzdGlvbiB0byB0aGUgRWxlY3RvcmF0ZVxuICogIGluc3RhbmNlLCBnZXRQb3Nlckludml0YXRpb24oKSBsZXRzIHRoZW0gZ2V0IGFkZFF1ZXN0aW9uIHdpdGggYXNzdXJhbmNlLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBnZXRQb3Nlckludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3Vic2NyaWJlcjxRdWVzdGlvbkRldGFpbHM+fSBnZXRRdWVzdGlvblN1YnNjcmliZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRWxlY3RvcmF0ZVB1YmxpY30gZ2V0UHVibGljRmFjZXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEdldFZvdGVySW52aXRhdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW52aXRhdGlvbltdfSBnZXRWb3Rlckludml0YXRpb25zXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlckZhY2V0IC0gYSBmYWNldCB0aGF0IHRoZSBFbGVjdG9yYXRlIHNob3VsZCBob2xkXG4gKiAgIHRpZ2h0bHkuIEl0IGFsbG93cyBzcGVjaWZpY2F0aW9uIG9mIHRoZSB2b3RlJ3Mgd2VpZ2h0LCBzbyB0aGUgRWxlY3RvcmF0ZVxuICogICBzaG91bGQgZGlzdHJpYnV0ZSBhbiBhdHRlbnVhdGVkIHdyYXBwZXIgdGhhdCBkb2Vzbid0IG1ha2UgdGhhdCBhdmFpbGFibGUhXG4gKiBAcHJvcGVydHkge1N1Ym1pdFZvdGV9IHN1Ym1pdFZvdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENsb3NpbmdSdWxlXG4gKiBAcHJvcGVydHkge0VSZWY8VGltZXI+fSB0aW1lclxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBkZWFkbGluZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENsb3NlVm90aW5nXG4gKiBAcGFyYW0ge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZVxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBjbG9zZVZvdGluZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkUXVlc3Rpb25SZXR1cm5cbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJQdWJsaWNGYWNldH0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXR9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3pvZS9zcmMvem9lU2VydmljZS91dGlscy5qcycpLkluc3RhbmNlPHR5cGVvZiBYaW1wb3J0KCcuL2JpbmFyeVZvdGVDb3VudGVyLmpzJykuc3RhcnQ+fSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBkZWFkbGluZVxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQWRkUXVlc3Rpb25cbiAqIEBwYXJhbSB7RVJlZjxJbnN0YWxsYXRpb24+fSB2b3RlQ291bnRlclxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IHF1ZXN0aW9uU3BlY1xuICogQHJldHVybnMge1Byb21pc2U8QWRkUXVlc3Rpb25SZXR1cm4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENyZWF0ZVF1ZXN0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGNoYW5nZVxuICogQHBhcmFtIHtQYXJhbVZhbHVlfSBwcm9wb3NlZFZhbHVlIC0gdGhlIHByb3Bvc2VkIHZhbHVlIGZvciB0aGUgbmFtZWRcbiAqICAgcGFyYW1ldGVyXG4gKiBAcGFyYW0ge0luc3RhbGxhdGlvbn0gdm90ZUNvdW50ZXJJbnN0YWxsYXRpb24gLSB0aGUgdm90ZUNvdW50ZXIgdG9cbiAqICAgaW5zdGFudGlhdGUgdG8gY291bnQgdm90ZXMuIEV4cGVjdGVkIHRvIGJlIGEgYmluYXJ5Vm90ZUNvdW50ZXIuIE90aGVyXG4gKiAgIHZvdGVDb3VudGVycyBtaWdodCBiZSBhZGRlZCBoZXJlLCBvciBtaWdodCByZXF1aXJlIHNlcGFyYXRlIGdvdmVybm9ycy5cbiAqICAgdW5kZXIgbWFuYWdlbWVudCBzbyB1c2VycyBjYW4gdHJhY2UgaXQgYmFjayBhbmQgc2VlIHRoYXQgaXQgd291bGQgdXNlXG4gKiAgIHRoaXMgZWxlY3Rpb25NYW5hZ2VyIHRvIG1hbmFnZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBjb250cmFjdEluc3RhbmNlIC0gaW5jbHVkZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnRyYWN0XG4gKiBAcGFyYW0ge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZSAtIGRlYWRsaW5lIGFuZCB0aW1lciBmb3IgY2xvc2luZyB2b3RpbmdcbiAqIEByZXR1cm5zIHtQcm9taXNlPFF1ZXN0aW9uRGV0YWlscz59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1A9U3RhbmRhcmRQYXJhbVBhdGhdIHBhdGggZm9yIGEgcGFyYW1NYW5hZ2VyUmV0cmlldmVyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUNoYW5nZUlzc3VlXG4gKiBAcHJvcGVydHkge1BhcmFtQ2hhbmdlc1NwZWM8UD59IHNwZWNcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy96b2Uvc3JjL3pvZVNlcnZpY2UvdXRpbHMuanMnKS5JbnN0YW5jZTwoemNmOiBaQ0Y8R292ZXJuYW5jZVRlcm1zPHt9Pj4pID0+IHt9Pn0gY29udHJhY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFwaUludm9jYXRpb25Jc3N1ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwaU1ldGhvZE5hbWVcbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBtZXRob2RBcmdzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPZmZlckZpbHRlcklzc3VlXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBzdHJpbmdzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUNoYW5nZVBvc2l0aW9uc1xuICogQHByb3BlcnR5IHtDaGFuZ2VQYXJhbXNQb3NpdGlvbn0gcG9zaXRpdmVcbiAqIEBwcm9wZXJ0eSB7Tm9DaGFuZ2VQYXJhbXNQb3NpdGlvbn0gbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtQ2hhbmdlSXNzdWVEZXRhaWxzXG4gKiAgICBkZXRhaWxzIGZvciBhIHF1ZXN0aW9uIHRoYXQgY2FuIGNoYW5nZSBhIGNvbnRyYWN0IHBhcmFtZXRlclxuICogQHByb3BlcnR5IHtDaG9pY2VNZXRob2R9IG1ldGhvZFxuICogQHByb3BlcnR5IHtQYXJhbUNoYW5nZUlzc3VlPHVua25vd24+fSBpc3N1ZVxuICogQHByb3BlcnR5IHtQYXJhbUNoYW5nZVBvc2l0aW9uc30gcG9zaXRpb25zXG4gKiBAcHJvcGVydHkge0VsZWN0aW9uVHlwZX0gZWxlY3Rpb25UeXBlXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4Q2hvaWNlc1xuICogQHByb3BlcnR5IHtDbG9zaW5nUnVsZX0gY2xvc2luZ1J1bGVcbiAqIEBwcm9wZXJ0eSB7UXVvcnVtUnVsZX0gcXVvcnVtUnVsZVxuICogQHByb3BlcnR5IHtOb0NoYW5nZVBhcmFtc1Bvc2l0aW9ufSB0aWVPdXRjb21lXG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBjb3VudGVySW5zdGFuY2UgLSBpbnN0YW5jZSBvZiB0aGUgVm90ZUNvdW50ZXJcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBQYXJhbVZhbHVlVHlwZWQ+fSBQYXJhbVN0YXRlUmVjb3JkIGEgUmVjb3JkIGNvbnRhaW5pbmdcbiAqICAga2V5d29yZCBwYWlycyB3aXRoIGRlc2NyaXB0aW9ucyBvZiBwYXJhbWV0ZXJzIHVuZGVyIGdvdmVybmFuY2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7Y3VycmVudDogUGFyYW1TdGF0ZVJlY29yZH19IEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtTWFuYWdlckJhc2UgVGhlIGJhc2UgcGFyYW1NYW5hZ2VyIHdpdGggdHlwZWQgZ2V0dGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPFBhcmFtU3RhdGVSZWNvcmQ+fSBnZXRQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQW1vdW50fSBnZXRBbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQnJhbmR9IGdldEJyYW5kXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBJbnN0YWxsYXRpb259IGdldEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBBbW91bnQ8J3NldCc+fSBnZXRJbnZpdGF0aW9uQW1vdW50XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IGJpZ2ludH0gZ2V0TmF0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IFJhdGlvfSBnZXRSYXRpb1xuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBzdHJpbmd9IGdldFN0cmluZ1xuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wUmVjb3JkfSBnZXRUaW1lc3RhbXBcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gWGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlJlbGF0aXZlVGltZVJlY29yZH0gZ2V0UmVsYXRpdmVUaW1lXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IGFueX0gZ2V0VW5rbm93blxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBwcm9wb3NlZFZhbHVlOiBQYXJhbVZhbHVlKSA9PiBQYXJhbVZhbHVlfSBnZXRWaXNpYmxlVmFsdWUgLSBmb3JcbiAqICAgbW9zdCB0eXBlcywgdGhlIHZpc2libGUgdmFsdWUgaXMgdGhlIHNhbWUgYXMgcHJvcG9zZWRWYWx1ZS4gRm9yIEludml0YXRpb25zXG4gKiAgIHRoZSB2aXNpYmxlIHZhbHVlIGlzIHRoZSBhbW91bnQgb2YgdGhlIGludml0YXRpb24uXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8SW52aXRhdGlvbj59IGdldEludGVybmFsUGFyYW1WYWx1ZVxuICogQHByb3BlcnR5IHsoKSA9PiBTdG9yZWRTdWJzY3JpcHRpb248R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gZ2V0U3Vic2NyaXB0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVXBkYXRlUGFyYW1zXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsUGFyYW1WYWx1ZT59IHBhcmFtQ2hhbmdlc1xuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cblxuLyoqXG4gKiBUaGVzZSBhcmUgdHlwZWQgYGFueWAgYmVjYXVzZSB0aGUgYnVpbGRlciBwYXR0ZXJuIG9mIHBhcmFtTWFuYWdlciBtYWtlcyBpdCB2ZXJ5XG4gKiBjb21wbGljYXRlZCBmb3IgdGhlIHR5cGUgc3lzdGVtIHRvIGtub3cgdGhlIHNldCBvZiBwYXJhbS1zcGVjaWZpYyBmdW5jdGlvbnNcbiAqIHJldHVybmVkIGJ5IGAuYnVpbGQoKWAuIEluc3RlYWQgd2UgbGV0IHBhcmFtTWFuYWdlciBjcmVhdGUgdGhlIGRlc2lyZWQgbWV0aG9kc1xuICogYW5kIHVzZSB0eXBlZFBhcmFtTWFuYWdlciB0byBjcmVhdGUgYSB2ZXJzaW9uIHRoYXQgaW5jbHVkZXMgdGhlIHN0YXRpYyB0eXBlcy5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgYW55Pn0gUGFyYW1NYW5hZ2VyR2V0dGVyc0FuZFVwZGF0ZXJzXG4gKiBAdHlwZWRlZiB7UGFyYW1NYW5hZ2VyQmFzZSAmIFBhcmFtTWFuYWdlckdldHRlcnNBbmRVcGRhdGVycyAmIHt1cGRhdGVQYXJhbXM6IFVwZGF0ZVBhcmFtc319IEFueVBhcmFtTWFuYWdlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gUGFyYW1ldGVyTmFtZUxpc3RcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRQYXJhbU1hbmFnZXJUeXBlXG4gKiBAcGFyYW0ge1BhcmFtVHlwZX0gdHlwZVxuICogQHBhcmFtIHtQYXJhbVZhbHVlfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCdWlsZFBhcmFtTWFuYWdlciAtIFBhcmFtTWFuYWdlciBpcyBhIGZhY2lsaXR5IHRoYXQgZ292ZXJuZWRcbiAqICAgY29udHJhY3RzIGNhbiB1c2UgdG8gbWFuYWdlIHRoZWlyIHZpc2libGUgc3RhdGUgaW4gYSB3YXkgdGhhdCBhbGxvd3MgdGhlXG4gKiAgIENvbnRyYWN0R292ZXJub3IgdG8gdXBkYXRlIHZhbHVlcyB1c2luZyBnb3Zlcm5hbmNlLiBXaGVuIHBhcmFtTWFuYWdlciBpc1xuICogICBpbnN0YW50aWF0ZWQgaW5zaWRlIHRoZSBjb250cmFjdCwgdGhlIGNvbnRyYWN0IGhhcyBzeW5jaHJvbm91cyBhY2Nlc3MgdG9cbiAqICAgdGhlIHZhbHVlcywgYW5kIGNsaWVudHMgb2YgdGhlIGNvbnRyYWN0IGNhbiB2ZXJpZnkgdGhhdCBhIENvbnRyYWN0R292ZXJub3JcbiAqICAgY2FuIGNoYW5nZSB0aGUgdmFsdWVzIGluIGEgbGVnaWJsZSB3YXkuXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFBhcmFtVmFsdWVUeXBlZD59IHBhcmFtRGVzY3JpcHRpb25zXG4gKiBAcmV0dXJucyB7QW55UGFyYW1NYW5hZ2VyfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ2hhbmdlUGFyYW1zUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxQYXJhbVZhbHVlPn0gY2hhbmdlcyBvbmUgb3IgbW9yZSBjaGFuZ2VzIHRvIHBhcmFtZXRlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE9mZmVyRmlsdGVyUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHN0cmluZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vQ2hhbmdlT2ZmZXJGaWx0ZXJQb3NpdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gZG9udFVwZGF0ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSW52b2tlQXBpUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcGlNZXRob2ROYW1lXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gbWV0aG9kQXJnc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRG9udEludm9rZUFwaVBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZG9udEludm9rZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTm9DaGFuZ2VQYXJhbXNQb3NpdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gbm9DaGFuZ2UgUGFyYW1ldGVycyBpbiB0aGUgcHJvcG9zYWwgdGhhdCB0aGlzIHBvc2l0aW9uXG4gKiAgIGlzIG9wcG9zZWQgdG9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEdvdmVybm9yXG4gKiBAcHJvcGVydHkge0NyZWF0ZVF1ZXN0aW9ufSBjcmVhdGVRdWVzdGlvblxuICovXG5cbi8qKiBAdHlwZWRlZiB7eyBbbWV0aG9kTmFtZTogc3RyaW5nXTogKC4uLmFyZ3M6IGFueSkgPT4gdW5rbm93biB9fSBHb3Zlcm5lZEFwaXMgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5vclB1YmxpY1xuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEluc3RhbmNlPn0gZ2V0RWxlY3RvcmF0ZVxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0R292ZXJuZWRDb250cmFjdFxuICogQHByb3BlcnR5IHsodm90ZUNvdW50ZXI6IEluc3RhbmNlKSA9PiBQcm9taXNlPHZvaWQ+fSB2YWxpZGF0ZVZvdGVDb3VudGVyXG4gKiBAcHJvcGVydHkgeyhyZWdQOiBFUmVmPEluc3RhbmNlPikgPT4gUHJvbWlzZTx2b2lkPn0gdmFsaWRhdGVFbGVjdG9yYXRlXG4gKiBAcHJvcGVydHkgeyhjbG9zaW5nUnVsZTogQ2xvc2luZ1J1bGUpID0+IHZvaWR9IHZhbGlkYXRlVGltZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtS2V5IGlkZW50aWZpZXIgZm9yIGEgcGFyYW1NYW5hZ2VyIHdpdGhpbiBhIGNvbnRyYWN0XG4gKiBAcHJvcGVydHkge3Vua25vd259IGtleVxuICovXG5cbi8qKlxuICogRGVzY3JpcHRpb24gb2YgYSBzZXQgb2YgY29vcmRpbmF0ZWQgY2hhbmdlcyBmb3IgYSBQYXJhbU1hbmFnZXJcbiAqXG4gKiBAdGVtcGxhdGUgUCBwYXRoIGZvciBhIHBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1DaGFuZ2VzU3BlYzxQPlxuICogQHByb3BlcnR5IHtQfSBwYXJhbVBhdGhcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUGFyYW1WYWx1ZT59IGNoYW5nZXMgb25lIG9yIG1vcmUgY2hhbmdlcyB0byBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb250cmFjdEdvdmVybmFuY2VWb3RlUmVzdWx0XG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBpbnN0YW5jZSAtIGluc3RhbmNlIG9mIHRoZSBWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHtFUmVmPFF1ZXN0aW9uRGV0YWlscz59IGRldGFpbHNcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxQYXJhbVZhbHVlPn0gb3V0Y29tZU9mVXBkYXRlIC0gQSBwcm9taXNlIGZvciB0aGUgcmVzdWx0XG4gKiAgICBvZiB1cGRhdGluZyB0aGUgcGFyYW1ldGVyIHZhbHVlLiBQcmltYXJpbHkgdXNlZnVsIGZvciBpdHMgYmVoYXZpb3Igb25cbiAqICAgIHJlamVjdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7R292ZXJuYWJsZVN0YXJ0Rm59IFNGIFN0YXJ0IGZ1bmN0aW9uIG9mIGdvdmVybmVkIGNvbnRyYWN0XG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5vckNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtWb3RlT25QYXJhbUNoYW5nZXN9IHZvdGVPblBhcmFtQ2hhbmdlc1xuICogQHByb3BlcnR5IHtWb3RlT25BcGlJbnZvY2F0aW9ufSB2b3RlT25BcGlJbnZvY2F0aW9uXG4gKiBAcHJvcGVydHkge1ZvdGVPbk9mZmVyRmlsdGVyfSB2b3RlT25PZmZlckZpbHRlclxuICogQHByb3BlcnR5IHsoKSA9PiBMaW1pdGVkQ0Y8U0Y+fSBnZXRDcmVhdG9yRmFjZXQgZmFjZXQgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0LFxuICogICB3aXRoIGNyZWF0b3ItbGlrZSBwb3dlcnMgYnV0IHdpdGhvdXQgdGhlIHRpZ2h0bHkgaGVsZCBhYmlsaXR5IHRvIGNoYW5nZVxuICogICBwYXJhbSB2YWx1ZXMuXG4gKiBAcHJvcGVydHkgeyhwb3Nlckludml0YXRpb246IEludml0YXRpb24pID0+IFByb21pc2U8dm9pZD59IHJlcGxhY2VFbGVjdG9yYXRlXG4gKiBAcHJvcGVydHkgeygpID0+IEFkbWluRmFjZXR9IGdldEFkbWluRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gR292ZXJuZWRQdWJsaWNGYWNldDxBd2FpdGVkPFJldHVyblR5cGU8U0Y+PlsncHVibGljRmFjZXQnXT59IGdldFB1YmxpY0ZhY2V0IC0gcHVibGljIGZhY2V0IG9mIHRoZSBnb3Zlcm5lZCBjb250cmFjdFxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2UgLSBpbnN0YW5jZSBvZiB0aGUgZ292ZXJuZWRcbiAqICAgY29udHJhY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdvdmVybmVkUHVibGljRmFjZXRNZXRob2RzXG4gKiBAcHJvcGVydHkgeyhrZXk/OiBhbnkpID0+IFN0b3JlZFN1YnNjcmlwdGlvbjxHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGU+fSBnZXRTdWJzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7KGtleT86IGFueSkgPT4gRVJlZjxQYXJhbVN0YXRlUmVjb3JkPn0gZ2V0R292ZXJuZWRQYXJhbXMgLSBnZXQgZGVzY3JpcHRpb25zIG9mXG4gKiAgIGFsbCB0aGUgZ292ZXJuZWQgcGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBBbW91bnR9IGdldEludml0YXRpb25BbW91bnRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IFBGIFB1YmxpYyBmYWNldFxuICogQHR5cGVkZWYge1BGICYgR292ZXJuZWRQdWJsaWNGYWNldE1ldGhvZHN9IEdvdmVybmVkUHVibGljRmFjZXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7R292ZXJuYWJsZVN0YXJ0Rm59IFNGXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxBd2FpdGVkPFJldHVyblR5cGU8U0Y+PlsnY3JlYXRvckZhY2V0J11bJ2dldExpbWl0ZWRDcmVhdG9yRmFjZXQnXT59IExpbWl0ZWRDRlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0YgY3JlYXRvciBmYWNldFxuICogQHR5cGVkZWYgR292ZXJuZWRDcmVhdG9yRmFjZXRcbiAqIFdoYXQgYSBnb3Zlcm5lZCBjb250cmFjdCBtdXN0IHJldHVybiBhcyBpdHMgY3JlYXRvckZhY2V0IGluIG9yZGVyIHRvIGJlIGdvdmVybmVkXG4gKiBAcHJvcGVydHkgeygpID0+IFBhcmFtTWFuYWdlclJldHJpZXZlcn0gZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIgLSBhbGxvd3MgYWNjZXNzaW5nXG4gKiAgIGFuZCB1cGRhdGluZyBnb3Zlcm5lZCBwYXJhbWV0ZXJzLiBTaG91bGQgb25seSBiZSBkaXJlY3RseSBhY2Nlc3NpYmxlIHRvIHRoZVxuICogICBjb250cmFjdEdvdmVybm9yXG4gKiBAcHJvcGVydHkgeygpID0+IEVSZWY8Q0Y+fSBnZXRMaW1pdGVkQ3JlYXRvckZhY2V0IC0gdGhlIGNyZWF0b3JcbiAqICAgZmFjZXQgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0LiBEb2Vzbid0IHByb3ZpZGUgYWNjZXNzIHRvIGFueSBnb3Zlcm5hbmNlXG4gKiAgIGZ1bmN0aW9uYWxpdHlcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gZ2V0SW52aXRhdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPEdvdmVybmVkQXBpcz59IGdldEdvdmVybmVkQXBpc1xuICogQHByb3BlcnR5IHsoKSA9PiAoc3RyaW5nIHwgc3ltYm9sKVtdfSBnZXRHb3Zlcm5lZEFwaU5hbWVzXG4gKiBAcHJvcGVydHkgeyhzdHJpbmdzOiBzdHJpbmdbXSkgPT4gdm9pZH0gc2V0T2ZmZXJGaWx0ZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7a2V5OiBzdHJpbmd9fSBTdGFuZGFyZFBhcmFtUGF0aFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1NYW5hZ2VyUmV0cmlldmVyXG4gKiBAcHJvcGVydHkgeyhwYXJhbUtleT86IFBhcmFtS2V5KSA9PiBBbnlQYXJhbU1hbmFnZXJ9IGdldFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtQPVN0YW5kYXJkUGFyYW1QYXRoXVxuICpcbiAqIEBjYWxsYmFjayBWb3RlT25QYXJhbUNoYW5nZXNcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9ufSB2b3RlQ291bnRlckluc3RhbGxhdGlvblxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBkZWFkbGluZVxuICogQHBhcmFtIHtQYXJhbUNoYW5nZXNTcGVjPFA+fSBwYXJhbVNwZWNcbiAqIEByZXR1cm5zIHtDb250cmFjdEdvdmVybmFuY2VWb3RlUmVzdWx0fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFZvdGVPbkFwaUludm9jYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGlNZXRob2ROYW1lXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gbWV0aG9kQXJnc1xuICogQHBhcmFtIHtJbnN0YWxsYXRpb259IHZvdGVDb3VudGVySW5zdGFsbGF0aW9uXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXB9IGRlYWRsaW5lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdEdvdmVybmFuY2VWb3RlUmVzdWx0Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBWb3RlT25PZmZlckZpbHRlclxuICogQHBhcmFtIHtJbnN0YWxsYXRpb259IHZvdGVDb3VudGVySW5zdGFsbGF0aW9uXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXB9IGRlYWRsaW5lXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBzdHJpbmdzXG4gKiBAcmV0dXJucyB7Q29udHJhY3RHb3Zlcm5hbmNlVm90ZVJlc3VsdH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtR292ZXJub3JcbiAqIEBwcm9wZXJ0eSB7Vm90ZU9uUGFyYW1DaGFuZ2VzfSB2b3RlT25QYXJhbUNoYW5nZXNcbiAqIEBwcm9wZXJ0eSB7Q3JlYXRlZFF1ZXN0aW9ufSBjcmVhdGVkUXVlc3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFwaUdvdmVybm9yXG4gKiBAcHJvcGVydHkge1ZvdGVPbkFwaUludm9jYXRpb259IHZvdGVPbkFwaUludm9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7Q3JlYXRlZFF1ZXN0aW9ufSBjcmVhdGVkUXVlc3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZpbHRlckdvdmVybm9yXG4gKiBAcHJvcGVydHkge1ZvdGVPbk9mZmVyRmlsdGVyfSB2b3RlT25GaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7Q3JlYXRlZFF1ZXN0aW9ufSBjcmVhdGVkUXVlc3Rpb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDcmVhdGVkUXVlc3Rpb25cbiAqICAgV2FzIHRoaXMgcXVlc3Rpb24gY3JlYXRlZCBieSB0aGlzIENvbnRyYWN0R292ZXJub3I/XG4gKiBAcGFyYW0ge0luc3RhbmNlfSBxdWVzdGlvbkluc3RhbmNlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBQb3NpdGlvbkluY2x1ZGVkXG4gKiBAcGFyYW0ge1Bvc2l0aW9uW119IHBvc2l0aW9uc1xuICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR292ZXJuZWRDb250cmFjdFRlcm1zXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lclNlcnZpY2V9IHRpbWVyXG4gKiBAcHJvcGVydHkge0lzc3VlcktleXdvcmRSZWNvcmR9IGlzc3VlcktleXdvcmRSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwcml2YXRlQXJnc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvbnRyYWN0R292ZXJuYW5jZVxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvem9lL3NyYy96b2VTZXJ2aWNlL3V0aWxzLmpzJykuSW5zdGFuY2U8KHpjZjogWkNGPEdvdmVybmFuY2VUZXJtczx7fT4+KSA9PiB7fT59IGFsbGVnZWRHb3Zlcm5lZFxuICogQHBhcmFtIHtJbnN0YW5jZX0gYWxsZWdlZEdvdmVybm9yXG4gKiBAcGFyYW0ge0luc3RhbGxhdGlvbjxYaW1wb3J0KCdAYWdvcmljL2dvdmVybmFuY2Uvc3JjL2NvbnRyYWN0R292ZXJub3IuanMnKS5zdGFydD59IGNvbnRyYWN0R292ZXJub3JJbnN0YWxsYXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPEdvdmVybmFuY2VQYWlyPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb250cmFjdEVsZWN0b3JhdGUgLSBhc3NlcnQgdGhhdCB0aGUgY29udHJhY3QgdXNlcyB0aGVcbiAqICAgZWxlY3RvcmF0ZVxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBhbGxlZ2VkR292ZXJub3JcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGFsbGVnZWRFbGVjdG9yYXRlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy96b2Uvc3JjL3pvZVNlcnZpY2UvdXRpbHMuanMnKS5Db250cmFjdFN0YXJ0RnVuY3Rpb25cbiAqICYgKCh6Y2Y/OiBhbnksIHBhPzogYW55LCBiYWdnYWdlPzogYW55KSA9PiBFUmVmPHtjcmVhdG9yRmFjZXQ6IEdvdmVybmVkQ3JlYXRvckZhY2V0PHt9PiwgcHVibGljRmFjZXQ6IEdvdmVybmVkUHVibGljRmFjZXQ8e30+fT4pfSBHb3Zlcm5hYmxlU3RhcnRGblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vY29udHJhY3RHb3Zlcm5vci5qcycpWydzdGFydCddfSBHb3Zlcm5vclNGXG4gKi9cblxuLyogVE9ETyBmaW5kIGEgd2F5IHRvIHBhcmFtZXRlcml6ZSB0aGUgc3RhcnRJbnN0YW5jZSBzbyB0aGUgZ292ZXJuZWQgY29udHJhY3QgdHlwZXMgZmxvdyovXG4vKipcbiAqIEBzZWUge1N0YXJ0ZWRJbnN0YW5jZUtpdH1cbiAqIEB0ZW1wbGF0ZSB7RVJlZjxJbnN0YWxsYXRpb248R292ZXJuYWJsZVN0YXJ0Rm4+Pn0gSVxuICogQHR5cGVkZWYgR292ZXJub3JTdGFydGVkSW5zdGFsbGF0aW9uS2l0XG4gKiBTYW1lIHJlc3VsdCBhcyBTdGFydGVkSW5zdGFuY2VLaXQgYnV0OlxuICogLSB0eXBlZCBmb3IgY29udHJhY3RHb3Zlcm5vciBpbnN0YWxsYXRpb24gYmVpbmcgc3RhcnRlZCBieSBab2UuIChJdCBpbiB0dXJuIHN0YXJ0cyB0aGUgZ292ZXJuZWQgY29udHJhY3QuKVxuICogLSBwYXJhbWV0ZXJpemVkIGJ5IEluc3RhbGxhdGlvbiBpbnN0ZWFkIG9mIFN0YXJ0RnVuY3Rpb25cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy96b2Uvc3JjL3pvZVNlcnZpY2UvdXRpbHMuanMnKS5JbnN0YW5jZTxHb3Zlcm5vclNGPn0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7QWRtaW5GYWNldH0gYWRtaW5GYWNldFxuICogQHByb3BlcnR5IHtHb3Zlcm5vckNyZWF0b3JGYWNldDxJbnN0YWxsYXRpb25TdGFydDxBd2FpdGVkPEk+Pj59IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtHb3Zlcm5vclB1YmxpY30gcHVibGljRmFjZXRcbiAqL1xuXG4vKipcbiAqIEBzZWUge1N0YXJ0ZWRJbnN0YW5jZUtpdH1cbiAqIEB0ZW1wbGF0ZSB7R292ZXJuYWJsZVN0YXJ0Rm59IFNGXG4gKiBAdHlwZWRlZiBHb3Zlcm5hbmNlRmFjZXRLaXRcbiAqIEFraW4gdG8gU3RhcnRlZEluc3RhbmNlS2l0IGJ1dCBkZXNpZ25lZCBmb3IgdGhlIHJlc3VsdHMgb2Ygc3RhcnRpbmcgZ292ZXJuZWQgY29udHJhY3RzLiBVc2VkIGluIGJvb3RzdHJhcCBzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7QWRtaW5GYWNldH0gYWRtaW5GYWNldCBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3RcbiAqIEBwcm9wZXJ0eSB7TGltaXRlZENGPFNGPn0gY3JlYXRvckZhY2V0IGNyZWF0b3ItbGlrZSBmYWNldCB3aXRoaW4gdGhlIGdvdmVybmVkIGNvbnRyYWN0ICh3aXRob3V0IHRoZSBwb3dlcnMgdGhlIGdvdmVybm9yIG5lZWRzKVxuICogQHByb3BlcnR5IHtHb3Zlcm5vckNyZWF0b3JGYWNldDxTRj59IGdvdmVybm9yQ3JlYXRvckZhY2V0IG9mIHRoZSBnb3Zlcm5pbmcgY29udHJhY3RcbiAqIEBwcm9wZXJ0eSB7QWRtaW5GYWNldH0gZ292ZXJub3JBZG1pbkZhY2V0IG9mIHRoZSBnb3Zlcm5pbmcgY29udHJhY3RcbiAqIEBwcm9wZXJ0eSB7QXdhaXRlZDxSZXR1cm5UeXBlPFNGPj5bJ3B1YmxpY0ZhY2V0J119IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gZ292ZXJub3JcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADoUSX9YwoAAGMKAAAsAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3ZhbGlkYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSIsImFzc2VydENvbnRyYWN0R292ZXJuYW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIGdvdmVybmVkIGNvbnRyYWN0IHdhcyBzdGFydGVkIGJ5IHRoZSBnb3Zlcm5vci4gVGhyb3dzIGlmXG4gKiBlaXRoZXIgZGlyZWN0aW9uIGNhbid0IGJlIGVzdGFibGlzaGVkLiBJZiB0aGUgY2FsbCBzdWNjZWVkcywgdGhlbiB0aGVcbiAqIGdvdmVybm9yIGdvdCBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBnb3Zlcm5lZCBjb250cmFjdCdzIGNyZWF0b3JGYWNldCwgYW5kXG4gKiBjYW4gYmUgdHJ1c3RlZCB0byBtYW5hZ2UgaXRzIHBhcmFtZXRlcnMuXG4gKlxuICogQHR5cGUge0Fzc2VydENvbnRyYWN0R292ZXJuYW5jZX1cbiAqL1xuY29uc3QgYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlPWFzeW5jKFxuem9lLFxuYWxsZWdlZEdvdmVybmVkLFxuYWxsZWdlZEdvdmVybm9yLFxuY29udHJhY3RHb3Zlcm5vckluc3RhbGxhdGlvbik9Plxue1xuY29uc3QgYWxsZWdlZEdvdmVybm9yUEY9RSh6b2UpLmdldFB1YmxpY0ZhY2V0KGFsbGVnZWRHb3Zlcm5vcik7XG5jb25zdCByZWFsR292ZXJuZWRQPUUoYWxsZWdlZEdvdmVybm9yUEYpLmdldEdvdmVybmVkQ29udHJhY3QoKTtcbmNvbnN0IGFsbGVnZWRHb3Zlcm5lZFRlcm1zUD1FKHpvZSkuZ2V0VGVybXMoYWxsZWdlZEdvdmVybmVkKTtcblxuY29uc3Rbe2VsZWN0aW9uTWFuYWdlcjpyZWFsR292ZXJub3JJbnN0YW5jZX0scmVhbEdvdmVybmVkSW5zdGFuY2VdPVxuYXdhaXQgUHJvbWlzZS5hbGwoW2FsbGVnZWRHb3Zlcm5lZFRlcm1zUCxyZWFsR292ZXJuZWRQXSk7XG5cbmFzc2VydChcbmFsbGVnZWRHb3Zlcm5vcj09PXJlYWxHb3Zlcm5vckluc3RhbmNlLFxuJ1RoZSBhbGxlZ2VkIGdvdmVybm9yIGRpZCBub3QgbWF0Y2ggdGhlIGdvdmVybm9yIHJldHJpZXZlZCBmcm9tIHRoZSBnb3Zlcm5lZCBjb250cmFjdCcpO1xuXG5cbmFzc2VydChcbmFsbGVnZWRHb3Zlcm5lZD09PXJlYWxHb3Zlcm5lZEluc3RhbmNlLFxuJ1RoZSBhbGxlZ2VkIGdvdmVybmVkIGRpZCBub3QgbWF0Y2ggdGhlIGdvdmVybmVkIGNvbnRyYWN0IHJldHJpZXZlZCBmcm9tIHRoZSBnb3Zlcm5vcicpO1xuXG5cbmNvbnN0IGdvdmVybm9ySW5zdGFsbGF0aW9uRnJvbUdvdmVybmVkPWF3YWl0IEUoXG56b2UpLlxuZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2UocmVhbEdvdmVybm9ySW5zdGFuY2UpO1xuXG5hc3NlcnQoXG5nb3Zlcm5vckluc3RhbGxhdGlvbkZyb21Hb3Zlcm5lZD09PWNvbnRyYWN0R292ZXJub3JJbnN0YWxsYXRpb24sXG4nVGhlIGdvdmVybmVkIGNvbnRyYWN0IGlzIG5vdCBnb3Zlcm5lZCBieSBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZWQgaW5zdGFsbGF0aW9uLicpO1xuXG5cbnJldHVybntnb3Zlcm5vcjpyZWFsR292ZXJub3JJbnN0YW5jZSxnb3Zlcm5lZDpyZWFsR292ZXJuZWRJbnN0YW5jZX07XG4gfTtcblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgZ292ZXJub3IgcmVmZXJzIHRvIHRoZSBpbmRpY2F0ZWQgZWxlY3RvcmF0ZS5cbiAqXG4gKiBAdHlwZSB7QXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlfVxuICovJGjigI1fb25jZS5hc3NlcnRDb250cmFjdEdvdmVybmFuY2UoYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlKTtcbmNvbnN0IGFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZT1hc3luYyhcbnpvZSxcbmFsbGVnZWRHb3Zlcm5vcixcbmFsbGVnZWRFbGVjdG9yYXRlKT0+XG57XG5jb25zdCBhbGxlZ2VkR292ZXJub3JQRj1FKHpvZSkuZ2V0UHVibGljRmFjZXQoYWxsZWdlZEdvdmVybm9yKTtcbmNvbnN0IGVsZWN0b3JhdGU9YXdhaXQgRShhbGxlZ2VkR292ZXJub3JQRikuZ2V0RWxlY3RvcmF0ZSgpO1xuZWxlY3RvcmF0ZT09PWFsbGVnZWRFbGVjdG9yYXRlfHxcbkZhaWwgYFRoZSBhbGxlZ2VkRWxlY3RvcmF0ZSBkaWRuJ3QgbWF0Y2ggdGhlIGFjdHVhbCAke3EoZWxlY3RvcmF0ZSl9YDtcblxucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZShhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUpO1xuXG5oYXJkZW4oYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlKTtcbmhhcmRlbihhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydENvbnRyYWN0R292ZXJuYW5jZSI6WyJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiXSwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIjpbImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC7u/9DxFoAAMRaAAA5AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9hdWN0aW9uL2F1Y3Rpb25Cb29rLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZ292ZXJuYW5jZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiLCJAZW5kby9jYXB0cCIsIkBhZ29yaWMvbm90aWZpZXIiLCIuLi9jb250cmFjdFN1cHBvcnQuanMiLCIuL29mZmVyQm9vay5qcyIsIi4vdXRpbC5qcyJdLCJleHBvcnRzIjpbIm1ha2VPZmZlclNwZWNTaGFwZSIsInByZXBhcmVBdWN0aW9uQm9vayJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRNYXRoLG11c3RNYXRjaCxNLHByZXBhcmVFeG9DbGFzc0tpdCxhc3NlcnRBbGxEZWZpbmVkLG1ha2VUcmFjZXIsYXRvbWljUmVhcnJhbmdlLGNlaWxNdWx0aXBseUJ5LGZsb29yRGl2aWRlQnksbWFrZVJhdGlvRnJvbUFtb3VudHMsbWFrZVJlY29yZGVyVG9waWMsbXVsdGlwbHlSYXRpb3MscmF0aW9HVEUsRSxvYnNlcnZlTm90aWZpZXIsbWFrZU5hdEFtb3VudFNoYXBlLHByZXBhcmVQcmljZUJvb2sscHJlcGFyZVNjYWxlZEJpZEJvb2ssaXNTY2FsZWRCaWRQcmljZUhpZ2hlcixtYWtlQnJhbmRlZFJhdGlvUGF0dGVybixwcmljZUZyb207JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9nb3Zlcm5hbmNlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL3pvZS9leHBvcnRlZC5qc1wiLCBbXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qc1wiLCBbXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaOKAjV9hKV1dLFtcIm1ha2VUcmFjZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VUcmFjZXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wiYXRvbWljUmVhcnJhbmdlXCIsIFskaOKAjV9hID0+IChhdG9taWNSZWFycmFuZ2UgPSAkaOKAjV9hKV1dLFtcImNlaWxNdWx0aXBseUJ5XCIsIFskaOKAjV9hID0+IChjZWlsTXVsdGlwbHlCeSA9ICRo4oCNX2EpXV0sW1wiZmxvb3JEaXZpZGVCeVwiLCBbJGjigI1fYSA9PiAoZmxvb3JEaXZpZGVCeSA9ICRo4oCNX2EpXV0sW1wibWFrZVJhdGlvRnJvbUFtb3VudHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VSYXRpb0Zyb21BbW91bnRzID0gJGjigI1fYSldXSxbXCJtYWtlUmVjb3JkZXJUb3BpY1wiLCBbJGjigI1fYSA9PiAobWFrZVJlY29yZGVyVG9waWMgPSAkaOKAjV9hKV1dLFtcIm11bHRpcGx5UmF0aW9zXCIsIFskaOKAjV9hID0+IChtdWx0aXBseVJhdGlvcyA9ICRo4oCNX2EpXV0sW1wicmF0aW9HVEVcIiwgWyRo4oCNX2EgPT4gKHJhdGlvR1RFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2NhcHRwXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjigI1fYSldXV1dLFtcIi4uL2NvbnRyYWN0U3VwcG9ydC5qc1wiLCBbW1wibWFrZU5hdEFtb3VudFNoYXBlXCIsIFskaOKAjV9hID0+IChtYWtlTmF0QW1vdW50U2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9vZmZlckJvb2suanNcIiwgW1tcInByZXBhcmVQcmljZUJvb2tcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVQcmljZUJvb2sgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVTY2FsZWRCaWRCb29rXCIsIFskaOKAjV9hID0+IChwcmVwYXJlU2NhbGVkQmlkQm9vayA9ICRo4oCNX2EpXV1dXSxbXCIuL3V0aWwuanNcIiwgW1tcImlzU2NhbGVkQmlkUHJpY2VIaWdoZXJcIiwgWyRo4oCNX2EgPT4gKGlzU2NhbGVkQmlkUHJpY2VIaWdoZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VCcmFuZGVkUmF0aW9QYXR0ZXJuXCIsIFskaOKAjV9hID0+IChtYWtlQnJhbmRlZFJhdGlvUGF0dGVybiA9ICRo4oCNX2EpXV0sW1wicHJpY2VGcm9tXCIsIFskaOKAjV9hID0+IChwcmljZUZyb20gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3R7bWFrZUVtcHR5fT1BbW91bnRNYXRoO1xuXG5jb25zdCBERUZBVUxUX0RFQ0lNQUxTPTk7XG5cbi8qKlxuICogQGZpbGUgVGhlIGJvb2sgcmVwcmVzZW50cyB0aGUgY29sbGF0ZXJhbC1zcGVjaWZpYyBzdGF0ZSBvZiBhbiBvbmdvaW5nXG4gKiAgIGF1Y3Rpb24uIEl0IGhvbGRzIHRoZSBib29rLCB0aGUgY2FwdHVyZWRQcmljZSwgYW5kIHRoZSBjb2xsYXRlcmFsU2VhdCB0aGF0XG4gKiAgIGhhcyB0aGUgYWxsb2NhdGlvbiBvZiBhc3NldHMgZm9yIHNhbGUuXG4gKlxuICogICBUaGUgYm9vayBjb250YWlucyBvcmRlcnMgZm9yIHRoZSBjb2xsYXRlcmFsLiBJdCBob2xkcyB0d28ga2luZHMgb2Ygb3JkZXJzOlxuICpcbiAqICAgLSBQcmljZXMgZXhwcmVzcyB0aGUgYmlkZGluZyBvZmZlciBpbiB0ZXJtcyBvZiBhIEJpZCBhbW91bnRcbiAqICAgLSBTY2FsZWRCaWRzIGV4cHJlc3MgdGhlIG9mZmVyIGluIHRlcm1zIG9mIGEgZGlzY291bnQgKG9yIG1hcmt1cCkgZnJvbSB0aGUgbW9zdFxuICogICAgICAgcmVjZW50IG9yYWNsZSBwcmljZS5cbiAqXG4gKiAgIE9mZmVycyBjYW4gYmUgYWRkZWQgaW4gdGhyZWUgd2F5cy4gMSkgV2hlbiB0aGUgYXVjdGlvbiBpcyBub3QgYWN0aXZlLCBwcmljZXNcbiAqICAgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGNvbGxlY3Rpb24uIFdoZW4gdGhlIGF1Y3Rpb24gaXNcbiAqICAgYWN0aXZlLCAyKSBpZiBhIG5ldyBvZmZlciBpcyBhdCBvciBhYm92ZSB0aGUgY3VycmVudCBwcmljZSwgaXQgd2lsbCBiZVxuICogICBzZXR0bGVkIGltbWVkaWF0ZWx5OyAyKSBJZiB0aGUgb2ZmZXIgaXMgYmVsb3cgdGhlIGN1cnJlbnQgcHJpY2UsIGl0IHdpbGwgYmVcbiAqICAgYWRkZWQgaW4gdGhlIGFwcHJvcHJpYXRlIHBsYWNlIGFuZCBzZXR0bGVkIHdoZW4gdGhlIHByaWNlIHJlYWNoZXMgdGhhdFxuICogICBsZXZlbC5cbiAqL1xuXG5jb25zdCB0cmFjZT1tYWtlVHJhY2VyKCdBdWNCb29rJyx0cnVlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBtYXhCdXk6IEFtb3VudDwnbmF0Jz47XG4gKiB9ICYge1xuICogICBleGl0QWZ0ZXJCdXk/OiBib29sZWFuO1xuICogfSAmIChcbiAqICAgICB8IHtcbiAqICAgICAgICAgb2ZmZXJQcmljZTogUmF0aW87XG4gKiAgICAgICB9XG4gKiAgICAgfCB7XG4gKiAgICAgICAgIG9mZmVyQmlkU2NhbGluZzogUmF0aW87XG4gKiAgICAgICB9XG4gKiAgICl9IE9mZmVyU3BlY1xuICovXG4vKipcbiAqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBiaWRCcmFuZFxuICogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IGNvbGxhdGVyYWxCcmFuZFxuICovXG5jb25zdCAgICAgICAgbWFrZU9mZmVyU3BlY1NoYXBlPShiaWRCcmFuZCxjb2xsYXRlcmFsQnJhbmQpPT57XG5jb25zdCBiaWRBbW91bnRTaGFwZT1tYWtlTmF0QW1vdW50U2hhcGUoYmlkQnJhbmQpO1xuY29uc3QgY29sbGF0ZXJhbEFtb3VudFNoYXBlPW1ha2VOYXRBbW91bnRTaGFwZShjb2xsYXRlcmFsQnJhbmQpO1xucmV0dXJuIE0uc3BsaXRSZWNvcmQoXG57bWF4QnV5OmNvbGxhdGVyYWxBbW91bnRTaGFwZX0sXG57XG5leGl0QWZ0ZXJCdXk6TS5ib29sZWFuKCksXG4vKiB4eHggc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgb2YgdGhlc2UgcHJvcGVydGllcyovXG5vZmZlclByaWNlOm1ha2VCcmFuZGVkUmF0aW9QYXR0ZXJuKFxuYmlkQW1vdW50U2hhcGUsXG5jb2xsYXRlcmFsQW1vdW50U2hhcGUpLFxuXG5vZmZlckJpZFNjYWxpbmc6bWFrZUJyYW5kZWRSYXRpb1BhdHRlcm4oYmlkQW1vdW50U2hhcGUsYmlkQW1vdW50U2hhcGUpfSk7XG5cblxuIH07XG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCb29rRGF0YU5vdGlmaWNhdGlvblxuICogQHByb3BlcnR5IHtSYXRpbyB8IG51bGx9IHN0YXJ0UHJpY2UgaWRlbnRpZmllcyB0aGUgcHJpY2VBdXRob3JpdHkgYW5kIHByaWNlXG4gKiBAcHJvcGVydHkge1JhdGlvIHwgbnVsbH0gY3VycmVudFByaWNlTGV2ZWwgdGhlIHByaWNlIGF0IHRoZSBjdXJyZW50IGF1Y3Rpb25cbiAqICAgdGllclxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+IHwgbnVsbH0gc3RhcnRQcm9jZWVkc0dvYWwgVGhlIHByb2NlZWRzIHRoZSBzZWxsZXJzXG4gKiAgIHdlcmUgdGFyZ2V0aW5nIHRvIHJhaXNlXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz4gfCBudWxsfSByZW1haW5pbmdQcm9jZWVkc0dvYWwgVGhlIHJlbWFpbmRlciBvZiB0aGVcbiAqICAgcHJvY2VlZHMgdGhlIHNlbGxlcnMgd2VyZSB0YXJnZXRpbmcgdG8gcmFpc2VcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPiB8IHVuZGVmaW5lZH0gcHJvY2VlZHNSYWlzZWQgVGhlIHByb2NlZWRzIHJhaXNlZCBzb1xuICogICBmYXIgaW4gdGhlIGF1Y3Rpb25cbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gc3RhcnRDb2xsYXRlcmFsIEhvdyBtdWNoIGNvbGxhdGVyYWwgd2FzIGF2YWlsYWJsZVxuICogICBmb3Igc2FsZSBhdCB0aGUgc3RhcnQuIChJZiBtb3JlIGlzIGRlcG9zaXRlZCBsYXRlciwgaXQnbGwgYmUgYWRkZWQgaW4uKVxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+IHwgbnVsbH0gY29sbGF0ZXJhbEF2YWlsYWJsZSBUaGUgYW1vdW50IG9mIGNvbGxhdGVyYWxcbiAqICAgcmVtYWluaW5nXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcycpLk1ha2VSZWNvcmRlcktpdH0gbWFrZVJlY29yZGVyS2l0XG4gKi8kaOKAjV9vbmNlLm1ha2VPZmZlclNwZWNTaGFwZShtYWtlT2ZmZXJTcGVjU2hhcGUpO1xuY29uc3QgICAgICAgIHByZXBhcmVBdWN0aW9uQm9vaz0oYmFnZ2FnZSx6Y2YsbWFrZVJlY29yZGVyS2l0KT0+e1xuY29uc3QgbWFrZVNjYWxlZEJpZEJvb2s9cHJlcGFyZVNjYWxlZEJpZEJvb2soYmFnZ2FnZSk7XG5jb25zdCBtYWtlUHJpY2VCb29rPXByZXBhcmVQcmljZUJvb2soYmFnZ2FnZSk7XG5cbmNvbnN0IEF1Y3Rpb25Cb29rU3RhdGVTaGFwZT1oYXJkZW4oe1xuY29sbGF0ZXJhbEJyYW5kOk0uYW55KCksXG5jb2xsYXRlcmFsU2VhdDpNLmFueSgpLFxuY29sbGF0ZXJhbEFtb3VudFNoYXBlOk0uYW55KCksXG5iaWRCcmFuZDpNLmFueSgpLFxuYmlkSG9sZGluZ1NlYXQ6TS5hbnkoKSxcbmJpZEFtb3VudFNoYXBlOk0uYW55KCksXG5wcmljZUF1dGhvcml0eTpNLmFueSgpLFxudXBkYXRpbmdPcmFjbGVRdW90ZTpNLmFueSgpLFxuYm9va0RhdGFLaXQ6TS5hbnkoKSxcbnByaWNlQm9vazpNLmFueSgpLFxuc2NhbGVkQmlkQm9vazpNLmFueSgpLFxuc3RhcnRDb2xsYXRlcmFsOk0uYW55KCksXG5zdGFydFByb2NlZWRzR29hbDpNLmFueSgpLFxuY2FwdHVyZWRQcmljZUZvclJvdW5kOk0uYW55KCksXG5jdXJBdWN0aW9uUHJpY2U6TS5hbnkoKSxcbnJlbWFpbmluZ1Byb2NlZWRzR29hbDpNLmFueSgpfSk7XG5cblxuY29uc3QgbWFrZUF1Y3Rpb25Cb29rS2l0PXByZXBhcmVFeG9DbGFzc0tpdChcbmJhZ2dhZ2UsXG4nQXVjdGlvbkJvb2snLFxudW5kZWZpbmVkLFxuLyoqXG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gYmlkQnJhbmRcbiAqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBjb2xsYXRlcmFsQnJhbmRcbiAqIEBwYXJhbSB7UHJpY2VBdXRob3JpdHl9IHBBdXRob3JpdHlcbiAqIEBwYXJhbSB7U3RvcmFnZU5vZGV9IG5vZGVcbiAqL1xuKGJpZEJyYW5kLGNvbGxhdGVyYWxCcmFuZCxwQXV0aG9yaXR5LG5vZGUpPT57XG5hc3NlcnRBbGxEZWZpbmVkKHtiaWRCcmFuZCxjb2xsYXRlcmFsQnJhbmQscEF1dGhvcml0eX0pO1xuY29uc3QgemVyb0JpZD1tYWtlRW1wdHkoYmlkQnJhbmQpO1xuY29uc3QgemVyb1JhdGlvPW1ha2VSYXRpb0Zyb21BbW91bnRzKFxuemVyb0JpZCxcbkFtb3VudE1hdGgubWFrZShjb2xsYXRlcmFsQnJhbmQsMW4pKTtcblxuXG4vKiB0aGVzZSBkb24ndCBoYXZlIHRvIGJlIGR1cmFibGUsIHNpbmNlIHdlJ3JlIGN1cnJlbnRseSBhc3N1bWluZyB0aGF0IHVwZ3JhZGUqL1xuLyogZnJvbSBhIHF1aWVzY2VudCBzdGF0ZSBpcyBzdWZmaWNpZW50LiBXaGVuIHRoZSBhdWN0aW9uIGlzIHF1aWVzY2VudCwgdGhlcmUqL1xuLyogbWF5IGJlIG9mZmVycyBpbiB0aGUgYm9vaywgYnV0IHRoZXNlIHNlYXRzIHdpbGwgYmUgZW1wdHksIHdpdGggYWxsIGFzc2V0cyovXG4vKiByZXR1cm5lZCB0byB0aGUgZnVuZGVycy4qL1xuY29uc3R7emNmU2VhdDpjb2xsYXRlcmFsU2VhdH09emNmLm1ha2VFbXB0eVNlYXRLaXQoKTtcbmNvbnN0e3pjZlNlYXQ6YmlkSG9sZGluZ1NlYXR9PXpjZi5tYWtlRW1wdHlTZWF0S2l0KCk7XG5cbmNvbnN0IGJpZEFtb3VudFNoYXBlPW1ha2VOYXRBbW91bnRTaGFwZShiaWRCcmFuZCk7XG5jb25zdCBjb2xsYXRlcmFsQW1vdW50U2hhcGU9bWFrZU5hdEFtb3VudFNoYXBlKGNvbGxhdGVyYWxCcmFuZCk7XG5jb25zdCBzY2FsZWRCaWRCb29rPW1ha2VTY2FsZWRCaWRCb29rKFxubWFrZUJyYW5kZWRSYXRpb1BhdHRlcm4oYmlkQW1vdW50U2hhcGUsYmlkQW1vdW50U2hhcGUpLFxuY29sbGF0ZXJhbEJyYW5kKTtcblxuXG5jb25zdCBwcmljZUJvb2s9bWFrZVByaWNlQm9vayhcbm1ha2VCcmFuZGVkUmF0aW9QYXR0ZXJuKGJpZEFtb3VudFNoYXBlLGNvbGxhdGVyYWxBbW91bnRTaGFwZSksXG5jb2xsYXRlcmFsQnJhbmQpO1xuXG5cbmNvbnN0IGJvb2tEYXRhS2l0PW1ha2VSZWNvcmRlcktpdChcbm5vZGUsXG4vKiogQHR5cGUge1hpbXBvcnQoJ0BhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMnKS5UeXBlZE1hdGNoZXI8Qm9va0RhdGFOb3RpZmljYXRpb24+fSAqL1xuTS5hbnkoKSk7XG5cblxuXG5yZXR1cm57XG5jb2xsYXRlcmFsQnJhbmQsXG5jb2xsYXRlcmFsU2VhdCxcbmNvbGxhdGVyYWxBbW91bnRTaGFwZSxcbmJpZEJyYW5kLFxuYmlkSG9sZGluZ1NlYXQsXG5iaWRBbW91bnRTaGFwZSxcblxucHJpY2VBdXRob3JpdHk6cEF1dGhvcml0eSxcbnVwZGF0aW5nT3JhY2xlUXVvdGU6emVyb1JhdGlvLFxuXG5ib29rRGF0YUtpdCxcblxucHJpY2VCb29rLFxuc2NhbGVkQmlkQm9vayxcbi8qKlxuICogU2V0IHRvIGVtcHR5IGF0IHRoZSBlbmQgb2YgYW4gYXVjdGlvbi4gSXQgaW5jcmVhc2VzIHdoZW5cbiAqIGBhZGRBc3NldHMoKWAgaXMgY2FsbGVkXG4gKi9cbnN0YXJ0Q29sbGF0ZXJhbDpBbW91bnRNYXRoLm1ha2VFbXB0eShjb2xsYXRlcmFsQnJhbmQpLFxuXG4vKipcbiAqIE51bGwgaW5kaWNhdGVzIG5vIGxpbWl0OyBlbXB0eSBpbmRpY2F0ZXMgbGltaXQgZXhoYXVzdGVkLiBJdCBpcyByZXNldFxuICogYXQgdGhlIGVuZCBvZiBlYWNoIGF1Y3Rpb24uIEl0IGluY3JlYXNlcyB3aGVuIGBhZGRBc3NldHMoKWAgaXMgY2FsbGVkXG4gKiB3aXRoIGEgZ29hbC5cbiAqXG4gKiBAdHlwZSB7QW1vdW50PCduYXQnPiB8IG51bGx9XG4gKi9cbnN0YXJ0UHJvY2VlZHNHb2FsOm51bGwsXG5cbi8qKlxuICogQXNzaWduZWQgYSB2YWx1ZSB0byBjYXB0dXJlIHRoZSBwcmljZSBhbmQgcmVzZXQgdG8gbnVsbCBhdCB0aGUgZW5kIG9mXG4gKiBlYWNoIGF1Y3Rpb24uXG4gKlxuICogQHR5cGUge1JhdGlvIHwgbnVsbH1cbiAqL1xuY2FwdHVyZWRQcmljZUZvclJvdW5kOm51bGwsXG5cbi8qKlxuICogbm9uLW51bGwgZHVyaW5nIGF1Y3Rpb25zLiBJdCBpcyBhc3NpZ25lZCBhIHZhbHVlIGF0IHRoZSBiZWdpbm5pbmcgb2ZcbiAqIGVhY2ggZGVzY2VuZGluZyBzdGVwLCBhbmQgcmVzZXQgYXQgdGhlIGVuZCBvZiB0aGUgYXVjdGlvbi5cbiAqXG4gKiBAdHlwZSB7UmF0aW8gfCBudWxsfVxuICovXG5jdXJBdWN0aW9uUHJpY2U6bnVsbCxcblxuLyoqXG4gKiBudWxsIG91dHNpZGUgb2YgYXVjdGlvbnMuIGR1cmluZyBhbiBhdWN0aW9uIG51bGwgaW5kaWNhdGVzIG5vIGxpbWl0O1xuICogZW1wdHkgaW5kaWNhdGVzIGxpbWl0IGV4aGF1c3RlZFxuICpcbiAqIEB0eXBlIHtBbW91bnQ8J25hdCc+IHwgbnVsbH1cbiAqL1xucmVtYWluaW5nUHJvY2VlZHNHb2FsOm51bGx9O1xuXG4gfSxcbntcbmhlbHBlcjp7XG4vKipcbiAqIHJlbW92ZSB0aGUga2V5IGZyb20gdGhlIGFwcHJvcHJpYXRlIGJvb2ssIGluZGljYXRlZCBieSB3aGV0aGVyIHRoZVxuICogcHJpY2UgaXMgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge1JhdGlvIHwgdW5kZWZpbmVkfSBwcmljZVxuICovXG5yZW1vdmVGcm9tSXRzQm9vayhrZXkscHJpY2Upe1xuY29uc3R7cHJpY2VCb29rLHNjYWxlZEJpZEJvb2t9PXRoaXMuc3RhdGU7XG5pZihwcmljZSl7XG5wcmljZUJvb2suZGVsZXRlKGtleSk7XG4gfWVsc2V7XG5zY2FsZWRCaWRCb29rLmRlbGV0ZShrZXkpO1xuIH1cbiB9LFxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgZW50cnkgaW4gdGhlIGFwcHJvcHJpYXRlIGJvb2ssIGluZGljYXRlZCBieSB3aGV0aGVyIHRoZVxuICogcHJpY2UgaXMgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge0Ftb3VudH0gY29sbGF0ZXJhbFNvbGRcbiAqIEBwYXJhbSB7UmF0aW8gfCB1bmRlZmluZWR9IHByaWNlXG4gKi9cbnVwZGF0ZUl0c0Jvb2soa2V5LGNvbGxhdGVyYWxTb2xkLHByaWNlKXtcbmNvbnN0e3ByaWNlQm9vayxzY2FsZWRCaWRCb29rfT10aGlzLnN0YXRlO1xuaWYocHJpY2Upe1xucHJpY2VCb29rLnVwZGF0ZVJlY2VpdmVkKGtleSxjb2xsYXRlcmFsU29sZCk7XG4gfWVsc2V7XG5zY2FsZWRCaWRCb29rLnVwZGF0ZVJlY2VpdmVkKGtleSxjb2xsYXRlcmFsU29sZCk7XG4gfVxuIH0sXG5cbi8qKlxuICogU2V0dGxlIHdpdGggc2VhdC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgdGhlIGJvb2ssIGlmXG4gKiBhbnkuXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGNvbGxhdGVyYWxXYW50ZWRcbiAqL1xuc2V0dGxlKHNlYXQsY29sbGF0ZXJhbFdhbnRlZCl7XG5jb25zdHtjb2xsYXRlcmFsU2VhdCxjb2xsYXRlcmFsQnJhbmR9PXRoaXMuc3RhdGU7XG5jb25zdHtCaWQ6YmlkQWxsb2N9PXNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKTtcbmNvbnN0e0NvbGxhdGVyYWw6Y29sbGF0ZXJhbEF2YWlsYWJsZX09XG5jb2xsYXRlcmFsU2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpO1xuaWYoIWNvbGxhdGVyYWxBdmFpbGFibGV8fEFtb3VudE1hdGguaXNFbXB0eShjb2xsYXRlcmFsQXZhaWxhYmxlKSl7XG5yZXR1cm4gbWFrZUVtcHR5KGNvbGxhdGVyYWxCcmFuZCk7XG4gfVxuXG4vKiogQHR5cGUge0Ftb3VudDwnbmF0Jz59ICovXG5jb25zdCBpbml0aWFsQ29sbGF0ZXJhbFRhcmdldD1BbW91bnRNYXRoLm1pbihcbmNvbGxhdGVyYWxXYW50ZWQsXG5jb2xsYXRlcmFsQXZhaWxhYmxlKTtcblxuXG5jb25zdHtjdXJBdWN0aW9uUHJpY2UsYmlkSG9sZGluZ1NlYXQscmVtYWluaW5nUHJvY2VlZHNHb2FsfT1cbnRoaXMuc3RhdGU7XG5jdXJBdWN0aW9uUHJpY2UhPT1udWxsfHxcbkZhaWwgYGF1Y3Rpb25QcmljZSBtdXN0IGJlIHNldCBiZWZvcmUgZWFjaCByb3VuZGA7XG5hc3NlcnQoY3VyQXVjdGlvblByaWNlKTtcblxuY29uc3QgcHJvY2VlZHNOZWVkZWQ9Y2VpbE11bHRpcGx5QnkoXG5pbml0aWFsQ29sbGF0ZXJhbFRhcmdldCxcbmN1ckF1Y3Rpb25QcmljZSk7XG5cbmlmKEFtb3VudE1hdGguaXNFbXB0eShwcm9jZWVkc05lZWRlZCkpe1xuc2VhdC5mYWlsKEVycm9yKCdwcmljZSBmZWxsIHRvIHplcm8nKSk7XG5yZXR1cm4gbWFrZUVtcHR5KGNvbGxhdGVyYWxCcmFuZCk7XG4gfVxuXG5jb25zdCBtaW5Qcm9jZWVkc1RhcmdldD1BbW91bnRNYXRoLm1pbihwcm9jZWVkc05lZWRlZCxiaWRBbGxvYyk7XG5jb25zdCBwcm9jZWVkc0xpbWl0PXJlbWFpbmluZ1Byb2NlZWRzR29hbD9cbkFtb3VudE1hdGgubWluKHJlbWFpbmluZ1Byb2NlZWRzR29hbCxtaW5Qcm9jZWVkc1RhcmdldCk6XG5taW5Qcm9jZWVkc1RhcmdldDtcbmNvbnN0IGlzUmFpc2VMaW1pdGVkPVxucmVtYWluaW5nUHJvY2VlZHNHb2FsfHxcbiFBbW91bnRNYXRoLmlzR1RFKHByb2NlZWRzTGltaXQscHJvY2VlZHNOZWVkZWQpO1xuXG5jb25zdFtwcm9jZWVkc1RhcmdldCxjb2xsYXRlcmFsVGFyZ2V0XT1pc1JhaXNlTGltaXRlZD9cbltwcm9jZWVkc0xpbWl0LGZsb29yRGl2aWRlQnkocHJvY2VlZHNMaW1pdCxjdXJBdWN0aW9uUHJpY2UpXTpcblttaW5Qcm9jZWVkc1RhcmdldCxpbml0aWFsQ29sbGF0ZXJhbFRhcmdldF07XG5cbmNvbnN0e0NvbGxhdGVyYWx9PXNlYXQuZ2V0UHJvcG9zYWwoKS53YW50O1xuaWYoQ29sbGF0ZXJhbCYmQW1vdW50TWF0aC5pc0dURShDb2xsYXRlcmFsLGNvbGxhdGVyYWxUYXJnZXQpKXtcbnNlYXQuZXhpdCgndW5hYmxlIHRvIHNhdGlzZnkgd2FudCcpO1xuIH1cblxuYXRvbWljUmVhcnJhbmdlKFxuemNmLFxuaGFyZGVuKFtcbltjb2xsYXRlcmFsU2VhdCxzZWF0LHtDb2xsYXRlcmFsOmNvbGxhdGVyYWxUYXJnZXR9XSxcbltzZWF0LGJpZEhvbGRpbmdTZWF0LHtCaWQ6cHJvY2VlZHNUYXJnZXR9XV0pKTtcblxuXG5cbmlmKHJlbWFpbmluZ1Byb2NlZWRzR29hbCl7XG50aGlzLnN0YXRlLnJlbWFpbmluZ1Byb2NlZWRzR29hbD1BbW91bnRNYXRoLnN1YnRyYWN0KFxucmVtYWluaW5nUHJvY2VlZHNHb2FsLFxucHJvY2VlZHNUYXJnZXQpO1xuXG4gfVxuXG50cmFjZSgnc2V0dGxlJyx7XG5jb2xsYXRlcmFsVGFyZ2V0LFxucHJvY2VlZHNUYXJnZXQsXG5yZW1haW5pbmdQcm9jZWVkc0dvYWw6dGhpcy5zdGF0ZS5yZW1haW5pbmdQcm9jZWVkc0dvYWx9KTtcblxuXG5yZXR1cm4gY29sbGF0ZXJhbFRhcmdldDtcbiB9LFxuXG4vKipcbiAqIEFjY2VwdCBhbiBvZmZlciBleHByZXNzZWQgYXMgYSBwcmljZS4gSWYgdGhlIGF1Y3Rpb24gaXMgYWN0aXZlLFxuICogYXR0ZW1wdCB0byBidXkgY29sbGF0ZXJhbC4gSWYgYW55IG9mIHRoZSBvZmZlciByZW1haW5zIGFkZCBpdCB0byB0aGVcbiAqIGJvb2suXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge1JhdGlvfSBwcmljZVxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBtYXhCdXlcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdHMudHJ5U2V0dGxlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmV4aXRBZnRlckJ1eV1cbiAqL1xuYWNjZXB0UHJpY2VPZmZlcihcbnNlYXQsXG5wcmljZSxcbm1heEJ1eSxcbnt0cnlTZXR0bGUsZXhpdEFmdGVyQnV5PWZhbHNlfSlcbntcbmNvbnN0e3ByaWNlQm9vayxjdXJBdWN0aW9uUHJpY2V9PXRoaXMuc3RhdGU7XG5jb25zdHtoZWxwZXJ9PXRoaXMuZmFjZXRzO1xudHJhY2UodGhpcy5zdGF0ZS5jb2xsYXRlcmFsQnJhbmQsJ2FjY2VwdFByaWNlJyk7XG5cbmNvbnN0IHNldHRsZUlmUHJpY2VFeGlzdHM9KCk9PntcbmlmKGN1ckF1Y3Rpb25QcmljZSE9PW51bGwpe1xucmV0dXJuIHRyeVNldHRsZSYmcmF0aW9HVEUocHJpY2UsY3VyQXVjdGlvblByaWNlKT9cbmhlbHBlci5zZXR0bGUoc2VhdCxtYXhCdXkpOlxuQW1vdW50TWF0aC5tYWtlRW1wdHlGcm9tQW1vdW50KG1heEJ1eSk7XG4gfWVsc2V7XG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHlGcm9tQW1vdW50KG1heEJ1eSk7XG4gfVxuIH07XG5jb25zdCBjb2xsYXRlcmFsU29sZD1zZXR0bGVJZlByaWNlRXhpc3RzKCk7XG5cbmNvbnN0IHN0aWxsV2FudD1BbW91bnRNYXRoLnN1YnRyYWN0KG1heEJ1eSxjb2xsYXRlcmFsU29sZCk7XG5pZihcbmV4aXRBZnRlckJ1eSYmIUFtb3VudE1hdGguaXNFbXB0eShjb2xsYXRlcmFsU29sZCl8fFxuQW1vdW50TWF0aC5pc0VtcHR5KHN0aWxsV2FudCl8fFxuQW1vdW50TWF0aC5pc0VtcHR5KHNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKS5CaWQpKVxue1xuc2VhdC5leGl0KCk7XG4gfWVsc2V7XG50cmFjZSgnYWRkZWQgT2ZmZXIgJyxwcmljZSxzdGlsbFdhbnQudmFsdWUpO1xucHJpY2VCb29rLmFkZChzZWF0LHByaWNlLHN0aWxsV2FudCxleGl0QWZ0ZXJCdXkpO1xuIH1cblxudm9pZCBoZWxwZXIucHVibGlzaEJvb2tEYXRhKCk7XG4gfSxcblxuLyoqXG4gKiBBY2NlcHQgYW4gb2ZmZXIgZXhwcmVzc2VkIGFzIGEgZGlzY291bnQgKG9yIG1hcmt1cCkuIElmIHRoZSBhdWN0aW9uXG4gKiBpcyBhY3RpdmUsIGF0dGVtcHQgdG8gYnV5IGNvbGxhdGVyYWwuIElmIGFueSBvZiB0aGUgb2ZmZXIgcmVtYWlucyBhZGRcbiAqIGl0IHRvIHRoZSBib29rLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtSYXRpb30gYmlkU2NhbGluZ1xuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBtYXhCdXlcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdHMudHJ5U2V0dGxlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmV4aXRBZnRlckJ1eV1cbiAqL1xuYWNjZXB0U2NhbGVkQmlkT2ZmZXIoXG5zZWF0LFxuYmlkU2NhbGluZyxcbm1heEJ1eSxcbnt0cnlTZXR0bGUsZXhpdEFmdGVyQnV5PWZhbHNlfSlcbntcbnRyYWNlKHRoaXMuc3RhdGUuY29sbGF0ZXJhbEJyYW5kLCdhY2NlcHQgc2NhbGVkQmlkIG9mZmVyJyk7XG5jb25zdHtjdXJBdWN0aW9uUHJpY2UsY2FwdHVyZWRQcmljZUZvclJvdW5kLHNjYWxlZEJpZEJvb2t9PVxudGhpcy5zdGF0ZTtcbmNvbnN0e2hlbHBlcn09dGhpcy5mYWNldHM7XG5cbmNvbnN0IHNldHRsZUlmUHJpY2VzRGVmaW5lZD0oKT0+e1xuaWYoXG5jdXJBdWN0aW9uUHJpY2UmJlxuY2FwdHVyZWRQcmljZUZvclJvdW5kJiZcbnRyeVNldHRsZSYmXG5pc1NjYWxlZEJpZFByaWNlSGlnaGVyKFxuYmlkU2NhbGluZyxcbmN1ckF1Y3Rpb25QcmljZSxcbmNhcHR1cmVkUHJpY2VGb3JSb3VuZCkpXG5cbntcbnJldHVybiBoZWxwZXIuc2V0dGxlKHNlYXQsbWF4QnV5KTtcbiB9XG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHlGcm9tQW1vdW50KG1heEJ1eSk7XG4gfTtcbmNvbnN0IGNvbGxhdGVyYWxTb2xkPXNldHRsZUlmUHJpY2VzRGVmaW5lZCgpO1xuXG5jb25zdCBzdGlsbFdhbnQ9QW1vdW50TWF0aC5zdWJ0cmFjdChtYXhCdXksY29sbGF0ZXJhbFNvbGQpO1xuaWYoXG5leGl0QWZ0ZXJCdXkmJiFBbW91bnRNYXRoLmlzRW1wdHkoY29sbGF0ZXJhbFNvbGQpfHxcbkFtb3VudE1hdGguaXNFbXB0eShzdGlsbFdhbnQpfHxcbkFtb3VudE1hdGguaXNFbXB0eShzZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCkuQmlkKSlcbntcbnNlYXQuZXhpdCgpO1xuIH1lbHNle1xuc2NhbGVkQmlkQm9vay5hZGQoc2VhdCxiaWRTY2FsaW5nLHN0aWxsV2FudCxleGl0QWZ0ZXJCdXkpO1xuIH1cblxudm9pZCBoZWxwZXIucHVibGlzaEJvb2tEYXRhKCk7XG4gfSxcbnB1Ymxpc2hCb29rRGF0YSgpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5cbmNvbnN0IGFsbG9jYXRpb249c3RhdGUuY29sbGF0ZXJhbFNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKTtcbmNvbnN0IGNvbGxhdGVyYWxBdmFpbGFibGU9XG4nQ29sbGF0ZXJhbCdpbiBhbGxvY2F0aW9uP1xuYWxsb2NhdGlvbi5Db2xsYXRlcmFsOlxubWFrZUVtcHR5KHN0YXRlLmNvbGxhdGVyYWxCcmFuZCk7XG5cbmNvbnN0IGJvb2tEYXRhPWhhcmRlbih7XG5zdGFydFByaWNlOnN0YXRlLmNhcHR1cmVkUHJpY2VGb3JSb3VuZCxcbnN0YXJ0UHJvY2VlZHNHb2FsOnN0YXRlLnN0YXJ0UHJvY2VlZHNHb2FsLFxucmVtYWluaW5nUHJvY2VlZHNHb2FsOnN0YXRlLnJlbWFpbmluZ1Byb2NlZWRzR29hbCxcbnByb2NlZWRzUmFpc2VkOmFsbG9jYXRpb24uQmlkLFxuc3RhcnRDb2xsYXRlcmFsOnN0YXRlLnN0YXJ0Q29sbGF0ZXJhbCxcbmNvbGxhdGVyYWxBdmFpbGFibGUsXG5jdXJyZW50UHJpY2VMZXZlbDpzdGF0ZS5jdXJBdWN0aW9uUHJpY2V9KTtcblxucmV0dXJuIHN0YXRlLmJvb2tEYXRhS2l0LnJlY29yZGVyLndyaXRlKGJvb2tEYXRhKTtcbiB9fSxcblxuc2VsZjp7XG4vKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYXNzZXRBbW91bnRcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc291cmNlU2VhdFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBbcHJvY2VlZHNHb2FsXSBhbiBhbW91bnQgdGhhdCB0aGUgZGVwb3NpdG9yXG4gKiAgIHdvdWxkIGxpa2UgdG8gcmFpc2UuIFRoZSBhdWN0aW9uIGlzIHJlcXVlc3RlZCB0byBub3Qgc2VsbCBtb3JlXG4gKiAgIGNvbGxhdGVyYWwgdGhhbiByZXF1aXJlZCB0byByYWlzZSB0aGF0IG11Y2guIFRoZSBhdWN0aW9uZWVyIG1pZ2h0XG4gKiAgIHNlbGwgbW9yZSBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHN1cHBsaWVyIG9mIGNvbGxhdGVyYWwsIGFuZFxuICogICB0aGV5IHJlcXVlc3QgaW5jb25zaXN0ZW50IGxpbWl0cy5cbiAqL1xuYWRkQXNzZXRzKGFzc2V0QW1vdW50LHNvdXJjZVNlYXQscHJvY2VlZHNHb2FsKXtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcbnRyYWNlKCdhZGQgYXNzZXRzJyx7YXNzZXRBbW91bnQscHJvY2VlZHNHb2FsfSk7XG5jb25zdHtjb2xsYXRlcmFsQnJhbmQsY29sbGF0ZXJhbFNlYXQsc3RhcnRQcm9jZWVkc0dvYWx9PXN0YXRlO1xuXG4vKiBXaGVuIGFkZGluZyBhc3NldHMsIHRoZSBuZXcgcmF0aW8gb2YgdG90YWxDb2xsZWN0aW9uR29hbCB0byBjb2xsYXRlcmFsKi9cbi8qIGFsbG9jYXRpb24gd2lsbCBiZSB0aGUgbGFyZ2VyIG9mIHRoZSBleGlzdGluZyByYXRpbyBhbmQgdGhlIHJhdGlvKi9cbi8qIGltcGxpZWQgYnkgdGhlIG5ldyBkZXBvc2l0LiBBZGQgdGhlIG5ldyBjb2xsYXRlcmFsIGFuZCByYWlzZSovXG4vKiBzdGFydFByb2NlZWRzR29hbCBzbyBpdCdzIHByb3BvcnRpb25hbCB0byB0aGUgbmV3IHJhdGlvLiBUaGlzIGNhbiovXG4vKiByZXN1bHQgaW4gcmFpc2luZyBtb3JlIEJpZCB0aGFuIG9uZSBkZXBvc2l0b3Igd2FudGVkLCBidXQqL1xuLyogdGhhdCdzIGJldHRlciB0aGFuIG5vdCBzZWxsaW5nIGFzIG11Y2ggYXMgdGhlIG90aGVyIGRlc2lyZWQuKi9cblxuY29uc3QgYWxsb2NhdGlvbj1jb2xsYXRlcmFsU2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpO1xuY29uc3QgY3VyQ29sbGF0ZXJhbD1cbidDb2xsYXRlcmFsJ2luIGFsbG9jYXRpb24/XG5hbGxvY2F0aW9uLkNvbGxhdGVyYWw6XG5tYWtlRW1wdHkoY29sbGF0ZXJhbEJyYW5kKTtcblxuLyogd2hlbiBuZWl0aGVyIHByb2NlZWRzR29hbCBub3Igc3RhcnRQcm9jZWVkc0dvYWwgaXMgZGVmaW5lZCwgd2UgZG9uJ3QgbmVlZCBhbiovXG4vKiB1cGRhdGUgYW5kIHRoZSBjYWxsIGltbWVkaWF0ZWx5IGJlbG93IHdvbid0IGludm9rZSB0aGlzIGZ1bmN0aW9uLiovXG5jb25zdCBjYWxjVGFyZ2V0UmF0aW89KCk9PntcbmlmKHN0YXJ0UHJvY2VlZHNHb2FsJiYhcHJvY2VlZHNHb2FsKXtcbnJldHVybiBtYWtlUmF0aW9Gcm9tQW1vdW50cyhzdGFydFByb2NlZWRzR29hbCxjdXJDb2xsYXRlcmFsKTtcbiB9ZWxzZSBpZighc3RhcnRQcm9jZWVkc0dvYWwmJnByb2NlZWRzR29hbCl7XG5yZXR1cm4gbWFrZVJhdGlvRnJvbUFtb3VudHMocHJvY2VlZHNHb2FsLGFzc2V0QW1vdW50KTtcbiB9ZWxzZSBpZihzdGFydFByb2NlZWRzR29hbCYmcHJvY2VlZHNHb2FsKXtcbmNvbnN0IGN1clJhdGlvPW1ha2VSYXRpb0Zyb21BbW91bnRzKFxuc3RhcnRQcm9jZWVkc0dvYWwsXG5BbW91bnRNYXRoLmFkZChjdXJDb2xsYXRlcmFsLGFzc2V0QW1vdW50KSk7XG5cbmNvbnN0IG5ld1JhdGlvPW1ha2VSYXRpb0Zyb21BbW91bnRzKHByb2NlZWRzR29hbCxhc3NldEFtb3VudCk7XG5yZXR1cm4gcmF0aW9HVEUobmV3UmF0aW8sY3VyUmF0aW8pP25ld1JhdGlvOmN1clJhdGlvO1xuIH1cblxudGhyb3cgRmFpbCBgY2FsY1RhcmdldFJhdGlvIGNhbGxlZCB3aXRoICFyZW1haW5pbmdQcm9jZWVkc0dvYWwgJiYgIXByb2NlZWRzR29hbGA7XG4gfTtcblxuaWYocHJvY2VlZHNHb2FsfHxzdGFydFByb2NlZWRzR29hbCl7XG5jb25zdCBuZXh0UHJvY2VlZHNHb2FsPWNlaWxNdWx0aXBseUJ5KFxuQW1vdW50TWF0aC5hZGQoY3VyQ29sbGF0ZXJhbCxhc3NldEFtb3VudCksXG5jYWxjVGFyZ2V0UmF0aW8oKSk7XG5cblxuaWYoXG5zdGF0ZS5yZW1haW5pbmdQcm9jZWVkc0dvYWwhPT1udWxsfHxcbi8qIFhYWCB1c2UgdGhpcyBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIGF1Y3Rpb24gaXMgYWN0aXZlKi9cbnN0YXRlLmN1ckF1Y3Rpb25QcmljZSE9PW51bGwpXG57XG5jb25zdCBpbmNyZW1lbnRUb0dvYWw9c3RhdGUuc3RhcnRQcm9jZWVkc0dvYWw/XG5BbW91bnRNYXRoLnN1YnRyYWN0KG5leHRQcm9jZWVkc0dvYWwsc3RhdGUuc3RhcnRQcm9jZWVkc0dvYWwpOlxubmV4dFByb2NlZWRzR29hbDtcblxuc3RhdGUucmVtYWluaW5nUHJvY2VlZHNHb2FsPXN0YXRlLnJlbWFpbmluZ1Byb2NlZWRzR29hbD9cbkFtb3VudE1hdGguYWRkKHN0YXRlLnJlbWFpbmluZ1Byb2NlZWRzR29hbCxpbmNyZW1lbnRUb0dvYWwpOlxuaW5jcmVtZW50VG9Hb2FsO1xuIH1cblxuc3RhdGUuc3RhcnRQcm9jZWVkc0dvYWw9bmV4dFByb2NlZWRzR29hbDtcbiB9XG5cbmF0b21pY1JlYXJyYW5nZShcbnpjZixcbmhhcmRlbihbW3NvdXJjZVNlYXQsY29sbGF0ZXJhbFNlYXQse0NvbGxhdGVyYWw6YXNzZXRBbW91bnR9XV0pKTtcblxuXG5zdGF0ZS5zdGFydENvbGxhdGVyYWw9c3RhdGUuc3RhcnRDb2xsYXRlcmFsP1xuQW1vdW50TWF0aC5hZGQoc3RhdGUuc3RhcnRDb2xsYXRlcmFsLGFzc2V0QW1vdW50KTpcbmFzc2V0QW1vdW50O1xudm9pZCBmYWNldHMuaGVscGVyLnB1Ymxpc2hCb29rRGF0YSgpO1xuIH0sXG4vKiogQHR5cGUgeyhyZWR1Y3Rpb246IFJhdGlvKSA9PiB2b2lkfSAqL1xuc2V0dGxlQXROZXdSYXRlKHJlZHVjdGlvbil7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5cbnRyYWNlKHRoaXMuc3RhdGUuY29sbGF0ZXJhbEJyYW5kLCdzZXR0bGVBdE5ld1JhdGUnLHJlZHVjdGlvbik7XG5jb25zdHtjYXB0dXJlZFByaWNlRm9yUm91bmQscHJpY2VCb29rLHNjYWxlZEJpZEJvb2t9PXN0YXRlO1xuY2FwdHVyZWRQcmljZUZvclJvdW5kIT09bnVsbHx8XG5GYWlsIGBwcmljZSBtdXN0IGJlIGNhcHR1cmVkIGJlZm9yZSBhdWN0aW9uIHN0YXJ0c2A7XG5hc3NlcnQoY2FwdHVyZWRQcmljZUZvclJvdW5kKTtcblxuc3RhdGUuY3VyQXVjdGlvblByaWNlPW11bHRpcGx5UmF0aW9zKFxucmVkdWN0aW9uLFxuY2FwdHVyZWRQcmljZUZvclJvdW5kKTtcblxuLyogZXh0cmFjdCBhZnRlciBpdCdzIHNldCBpbiBzdGF0ZSovXG5jb25zdHtjdXJBdWN0aW9uUHJpY2V9PXN0YXRlO1xuXG5jb25zdCBwcmljZWRPZmZlcnM9cHJpY2VCb29rLm9mZmVyc0Fib3ZlKGN1ckF1Y3Rpb25QcmljZSk7XG5jb25zdCBzY2FsZWRCaWRPZmZlcnM9c2NhbGVkQmlkQm9vay5vZmZlcnNBYm92ZShyZWR1Y3Rpb24pO1xuXG5jb25zdCBjb21wYXJlVmFsdWVzPSh2MSx2Mik9PntcbmlmKHYxPHYyKXtcbnJldHVybi0xO1xuIH1lbHNlIGlmKHYxPT09djIpe1xucmV0dXJuIDA7XG4gfWVsc2V7XG5yZXR1cm4gMTtcbiB9XG4gfTtcbnRyYWNlKCBgc2V0dGxpbmdgLHByaWNlZE9mZmVycy5sZW5ndGgsc2NhbGVkQmlkT2ZmZXJzLmxlbmd0aCk7XG4vKiByZXF1ZXN0ZWQgcHJpY2Ugb3IgQmlkU2NhbGluZyBnaXZlcyBubyBwcmlvcml0eSBiZXlvbmQgc3BlY2lmeWluZyB3aGljaCovXG4vKiByb3VuZCB0aGUgb3JkZXIgd2lsbCBiZSBzZXJ2aWNlZCBpbi4qL1xuY29uc3QgcHJpb3JpdGl6ZWRPZmZlcnM9Wy4uLnByaWNlZE9mZmVycywuLi5zY2FsZWRCaWRPZmZlcnNdLnNvcnQoXG4oYSxiKT0+Y29tcGFyZVZhbHVlcyhhWzFdLnNlcU51bSxiWzFdLnNlcU51bSkpO1xuXG5cbmNvbnN0e3JlbWFpbmluZ1Byb2NlZWRzR29hbH09c3RhdGU7XG5jb25zdHtoZWxwZXJ9PWZhY2V0cztcbmZvcihjb25zdFtrZXksc2VhdFJlY29yZF1vZiBwcmlvcml0aXplZE9mZmVycyl7XG5jb25zdHtzZWF0LHByaWNlOnAsd2FudGVkLGV4aXRBZnRlckJ1eX09c2VhdFJlY29yZDtcbmlmKFxucmVtYWluaW5nUHJvY2VlZHNHb2FsJiZcbkFtb3VudE1hdGguaXNFbXB0eShyZW1haW5pbmdQcm9jZWVkc0dvYWwpKVxue1xuYnJlYWs7XG4gfWVsc2UgaWYoc2VhdC5oYXNFeGl0ZWQoKSl7XG5oZWxwZXIucmVtb3ZlRnJvbUl0c0Jvb2soa2V5LHApO1xuIH1lbHNle1xuY29uc3QgY29sbGF0ZXJhbFNvbGQ9aGVscGVyLnNldHRsZShzZWF0LHdhbnRlZCk7XG5cbmNvbnN0IGFsbG9jPXNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKTtcbmlmKFxuZXhpdEFmdGVyQnV5JiYhQW1vdW50TWF0aC5pc0VtcHR5KGNvbGxhdGVyYWxTb2xkKXx8XG5BbW91bnRNYXRoLmlzRW1wdHkoYWxsb2MuQmlkKXx8XG4nQ29sbGF0ZXJhbCdpbiBhbGxvYyYmXG5BbW91bnRNYXRoLmlzR1RFKGFsbG9jLkNvbGxhdGVyYWwsd2FudGVkKSlcbntcbnNlYXQuZXhpdCgpO1xuaGVscGVyLnJlbW92ZUZyb21JdHNCb29rKGtleSxwKTtcbiB9ZWxzZSBpZighQW1vdW50TWF0aC5pc0dURShjb2xsYXRlcmFsU29sZCx3YW50ZWQpKXtcbmhlbHBlci51cGRhdGVJdHNCb29rKGtleSxjb2xsYXRlcmFsU29sZCxwKTtcbiB9XG4gfVxuIH1cblxudm9pZCBmYWNldHMuaGVscGVyLnB1Ymxpc2hCb29rRGF0YSgpO1xuIH0sXG5nZXRDdXJyZW50UHJpY2UoKXtcbnJldHVybiB0aGlzLnN0YXRlLmN1ckF1Y3Rpb25QcmljZTtcbiB9LFxuaGFzT3JkZXJzKCl7XG5jb25zdHtzY2FsZWRCaWRCb29rLHByaWNlQm9va309dGhpcy5zdGF0ZTtcbnJldHVybiBzY2FsZWRCaWRCb29rLmhhc09yZGVycygpfHxwcmljZUJvb2suaGFzT3JkZXJzKCk7XG4gfSxcbmNhcHR1cmVPcmFjbGVQcmljZUZvclJvdW5kKCl7XG5jb25zdHtmYWNldHMsc3RhdGV9PXRoaXM7XG5cbnRyYWNlKCBgY2FwdHVyaW5nIG9yYWNsZSBwcmljZSBgLHN0YXRlLnVwZGF0aW5nT3JhY2xlUXVvdGUpO1xuc3RhdGUuY2FwdHVyZWRQcmljZUZvclJvdW5kPXN0YXRlLnVwZGF0aW5nT3JhY2xlUXVvdGU7XG52b2lkIGZhY2V0cy5oZWxwZXIucHVibGlzaEJvb2tEYXRhKCk7XG4gfSxcblxuc2V0U3RhcnRpbmdSYXRlKHJhdGUpe1xuY29uc3R7Y2FwdHVyZWRQcmljZUZvclJvdW5kfT10aGlzLnN0YXRlO1xuY2FwdHVyZWRQcmljZUZvclJvdW5kIT09bnVsbHx8XG5GYWlsIGBjYXB0dXJlZFByaWNlRm9yUm91bmQgbXVzdCBiZSBzZXQgYmVmb3JlIGVhY2ggcm91bmRgO1xuYXNzZXJ0KGNhcHR1cmVkUHJpY2VGb3JSb3VuZCk7XG5cbnRyYWNlKFxuJ3NldCBzdGFydFByaWNlJyxcbmNhcHR1cmVkUHJpY2VGb3JSb3VuZCxcbnRoaXMuc3RhdGUuc3RhcnRQcm9jZWVkc0dvYWwpO1xuXG50aGlzLnN0YXRlLnJlbWFpbmluZ1Byb2NlZWRzR29hbD10aGlzLnN0YXRlLnN0YXJ0UHJvY2VlZHNHb2FsO1xudGhpcy5zdGF0ZS5jdXJBdWN0aW9uUHJpY2U9bXVsdGlwbHlSYXRpb3MoXG5jYXB0dXJlZFByaWNlRm9yUm91bmQsXG5yYXRlKTtcblxuIH0sXG4vKipcbiAqIEBwYXJhbSB7T2ZmZXJTcGVjfSBvZmZlclNwZWNcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtib29sZWFufSB0cnlTZXR0bGVcbiAqL1xuYWRkT2ZmZXIob2ZmZXJTcGVjLHNlYXQsdHJ5U2V0dGxlKXtcbmNvbnN0e2JpZEJyYW5kLGNvbGxhdGVyYWxCcmFuZH09dGhpcy5zdGF0ZTtcbmNvbnN0IG9mZmVyU3BlY1NoYXBlPW1ha2VPZmZlclNwZWNTaGFwZShiaWRCcmFuZCxjb2xsYXRlcmFsQnJhbmQpO1xuXG5tdXN0TWF0Y2gob2ZmZXJTcGVjLG9mZmVyU3BlY1NoYXBlKTtcbmNvbnN0e2dpdmV9PXNlYXQuZ2V0UHJvcG9zYWwoKTtcbmNvbnN0e2JpZEFtb3VudFNoYXBlfT10aGlzLnN0YXRlO1xubXVzdE1hdGNoKGdpdmUuQmlkLGJpZEFtb3VudFNoYXBlLCdnaXZlIG11c3QgaW5jbHVkZSBcIkJpZFwiJyk7XG5cbmNvbnN0e2hlbHBlcn09dGhpcy5mYWNldHM7XG5jb25zdHtleGl0QWZ0ZXJCdXl9PW9mZmVyU3BlYztcbmlmKCdvZmZlclByaWNlJ2luIG9mZmVyU3BlYyl7XG5yZXR1cm4gaGVscGVyLmFjY2VwdFByaWNlT2ZmZXIoXG5zZWF0LFxub2ZmZXJTcGVjLm9mZmVyUHJpY2UsXG5vZmZlclNwZWMubWF4QnV5LFxue1xudHJ5U2V0dGxlLFxuZXhpdEFmdGVyQnV5fSk7XG5cblxuIH1lbHNlIGlmKCdvZmZlckJpZFNjYWxpbmcnaW4gb2ZmZXJTcGVjKXtcbnJldHVybiBoZWxwZXIuYWNjZXB0U2NhbGVkQmlkT2ZmZXIoXG5zZWF0LFxub2ZmZXJTcGVjLm9mZmVyQmlkU2NhbGluZyxcbm9mZmVyU3BlYy5tYXhCdXksXG57XG50cnlTZXR0bGUsXG5leGl0QWZ0ZXJCdXl9KTtcblxuXG4gfWVsc2V7XG50aHJvdyBGYWlsIGBPZmZlciB3YXMgbmVpdGhlciBhIHByaWNlIG5vciBhIHNjYWxlZEJpZGA7XG4gfVxuIH0sXG5nZXRTZWF0cygpe1xuY29uc3R7Y29sbGF0ZXJhbFNlYXQsYmlkSG9sZGluZ1NlYXR9PXRoaXMuc3RhdGU7XG5yZXR1cm57Y29sbGF0ZXJhbFNlYXQsYmlkSG9sZGluZ1NlYXR9O1xuIH0sXG5leGl0QWxsU2VhdHMoKXtcbmNvbnN0e3ByaWNlQm9vayxzY2FsZWRCaWRCb29rfT10aGlzLnN0YXRlO1xucHJpY2VCb29rLmV4aXRBbGxTZWF0cygpO1xuc2NhbGVkQmlkQm9vay5leGl0QWxsU2VhdHMoKTtcbiB9LFxuZW5kQXVjdGlvbigpe1xudHJhY2UoJ2VuZEF1Y3Rpb24nKTtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcblxuc3RhdGUuc3RhcnRDb2xsYXRlcmFsPUFtb3VudE1hdGgubWFrZUVtcHR5KHN0YXRlLmNvbGxhdGVyYWxCcmFuZCk7XG5cbnN0YXRlLmNhcHR1cmVkUHJpY2VGb3JSb3VuZD1udWxsO1xuc3RhdGUuY3VyQXVjdGlvblByaWNlPW51bGw7XG5zdGF0ZS5yZW1haW5pbmdQcm9jZWVkc0dvYWw9bnVsbDtcbnN0YXRlLnN0YXJ0UHJvY2VlZHNHb2FsPW51bGw7XG52b2lkIGZhY2V0cy5oZWxwZXIucHVibGlzaEJvb2tEYXRhKCk7XG4gfSxcbmdldERhdGFVcGRhdGVzKCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5ib29rRGF0YUtpdC5zdWJzY3JpYmVyO1xuIH0sXG5nZXRQdWJsaWNUb3BpY3MoKXtcbnJldHVybntcbmJvb2tEYXRhOm1ha2VSZWNvcmRlclRvcGljKFxuJ0F1Y3Rpb24gc2NoZWR1bGUnLFxudGhpcy5zdGF0ZS5ib29rRGF0YUtpdCl9O1xuXG5cbiB9fX0sXG5cblxue1xuZmluaXNoOih7c3RhdGUsZmFjZXRzfSk9PntcbmNvbnN0e2NvbGxhdGVyYWxCcmFuZCxiaWRCcmFuZCxwcmljZUF1dGhvcml0eX09c3RhdGU7XG5hc3NlcnRBbGxEZWZpbmVkKHtjb2xsYXRlcmFsQnJhbmQsYmlkQnJhbmQscHJpY2VBdXRob3JpdHl9KTtcbnZvaWQgRS53aGVuKFxuRShjb2xsYXRlcmFsQnJhbmQpLmdldERpc3BsYXlJbmZvKCksXG4oe2RlY2ltYWxQbGFjZXM9REVGQVVMVF9ERUNJTUFMU30pPT57XG4vKiBUT0RPKCM2OTQ2KSB1c2UgdGhpcyB0byBrZWVwIGEgY3VycmVudCBwcmljZSB0aGF0IGNhbiBiZSBwdWJsaXNoZWQgaW4gc3RhdGUuKi9cbmNvbnN0IHF1b3RlTm90aWZpZXI9RShwcmljZUF1dGhvcml0eSkubWFrZVF1b3RlTm90aWZpZXIoXG5BbW91bnRNYXRoLm1ha2UoY29sbGF0ZXJhbEJyYW5kLDEwbioqQmlnSW50KGRlY2ltYWxQbGFjZXMpKSxcbmJpZEJyYW5kKTtcblxudm9pZCBvYnNlcnZlTm90aWZpZXIocXVvdGVOb3RpZmllcix7XG51cGRhdGVTdGF0ZToocXVvdGUpPT57XG50cmFjZShcbiBgQk9PSyBub3RpZmllciAke3ByaWNlRnJvbShxdW90ZSkubnVtZXJhdG9yLnZhbHVlfS8ke1xucHJpY2VGcm9tKHF1b3RlKS5kZW5vbWluYXRvci52YWx1ZVxuIH1gKTtcblxuc3RhdGUudXBkYXRpbmdPcmFjbGVRdW90ZT1wcmljZUZyb20ocXVvdGUpO1xuIH0sXG5mYWlsOihyZWFzb24pPT57XG50aHJvdyBFcnJvcihcbiBgYXVjdGlvbiBvYnNlcnZlciBvZiAke2NvbGxhdGVyYWxCcmFuZH0gZmFpbGVkOiAke3JlYXNvbn1gKTtcblxuIH0sXG5maW5pc2g6KGRvbmUpPT57XG50aHJvdyBFcnJvcihcbiBgYXVjdGlvbiBvYnNlcnZlciBmb3IgJHtjb2xsYXRlcmFsQnJhbmR9IGRpZWQ6ICR7ZG9uZX1gKTtcblxuIH19KTtcblxuIH0pO1xuXG52b2lkIGZhY2V0cy5oZWxwZXIucHVibGlzaEJvb2tEYXRhKCk7XG4gfSxcbnN0YXRlU2hhcGU6QXVjdGlvbkJvb2tTdGF0ZVNoYXBlfSk7XG5cblxuXG4vKipcbiAqIEB0eXBlIHsoXG4gKiAgIC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIG1ha2VBdWN0aW9uQm9va0tpdD5cbiAqICkgPT4gUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUF1Y3Rpb25Cb29rS2l0Plsnc2VsZiddfVxuICovXG5jb25zdCBtYWtlQXVjdGlvbkJvb2s9KC4uLmFyZ3MpPT5tYWtlQXVjdGlvbkJvb2tLaXQoLi4uYXJncykuc2VsZjtcbnJldHVybiBtYWtlQXVjdGlvbkJvb2s7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVBdWN0aW9uQm9vayhwcmVwYXJlQXVjdGlvbkJvb2spO1xuaGFyZGVuKHByZXBhcmVBdWN0aW9uQm9vayk7XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlQXVjdGlvbkJvb2s+Pn0gQXVjdGlvbkJvb2sgKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlT2ZmZXJTcGVjU2hhcGUiOlsibWFrZU9mZmVyU3BlY1NoYXBlIl0sInByZXBhcmVBdWN0aW9uQm9vayI6WyJwcmVwYXJlQXVjdGlvbkJvb2siXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOVC7z/9lAAD/ZQAAOAAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvYXVjdGlvbi9hdWN0aW9uZWVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZ292ZXJuYW5jZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvZ292ZXJuYW5jZSIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvc3RvcmUvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIi4uL2NvbnRyYWN0U3VwcG9ydC5qcyIsIi4vYXVjdGlvbkJvb2suanMiLCIuL3BhcmFtcy5qcyIsIi4vc2NoZWR1bGVyLmpzIiwiLi91dGlsLmpzIl0sImV4cG9ydHMiOlsiQXVjdGlvblBGU2hhcGUiLCJkaXN0cmlidXRlUHJvcG9ydGlvbmFsU2hhcmVzV2l0aExpbWl0cyIsInN0YXJ0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudE1hdGgsQW1vdW50U2hhcGUsQnJhbmRTaGFwZSxoYW5kbGVQYXJhbUdvdmVybmFuY2UsQkFTSVNfUE9JTlRTLG1ha2VUcmFjZXIscHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0LG11c3RNYXRjaCxhcHBlbmRUb1N0b3JlZEFycmF5LE0scHJvdmlkZUR1cmFibGVNYXBTdG9yZSxhdG9taWNSZWFycmFuZ2UsY2VpbERpdmlkZUJ5LGNlaWxNdWx0aXBseUJ5LGRlZmluZUVSZWNvcmRlcktpdCxkZWZpbmVSZWNvcmRlcktpdCxmbG9vckRpdmlkZUJ5LGZsb29yTXVsdGlwbHlCeSxtYWtlUmF0aW8sbWFrZVJhdGlvRnJvbUFtb3VudHMsbWFrZVJlY29yZGVyVG9waWMsbmF0U2FmZU1hdGgscHJlcGFyZVJlY29yZGVyLHByb3ZpZGVFbXB0eVNlYXQsb2ZmZXJUbyxGdWxsUHJvcG9zYWxTaGFwZSxFLEZhcixtYWtlTmF0QW1vdW50U2hhcGUsbWFrZU9mZmVyU3BlY1NoYXBlLHByZXBhcmVBdWN0aW9uQm9vayxhdWN0aW9uZWVyUGFyYW1UeXBlcyxtYWtlU2NoZWR1bGVyLEF1Y3Rpb25TdGF0ZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2dvdmVybmFuY2UvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RzL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dLFtcIkFtb3VudFNoYXBlXCIsIFskaOKAjV9hID0+IChBbW91bnRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiQnJhbmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQnJhbmRTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2dvdmVybmFuY2VcIiwgW1tcImhhbmRsZVBhcmFtR292ZXJuYW5jZVwiLCBbJGjigI1fYSA9PiAoaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIkJBU0lTX1BPSU5UU1wiLCBbJGjigI1fYSA9PiAoQkFTSVNfUE9JTlRTID0gJGjigI1fYSldXSxbXCJtYWtlVHJhY2VyXCIsIFskaOKAjV9hID0+IChtYWtlVHJhY2VyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmUvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc1wiLCBbW1wiYXBwZW5kVG9TdG9yZWRBcnJheVwiLCBbJGjigI1fYSA9PiAoYXBwZW5kVG9TdG9yZWRBcnJheSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcImF0b21pY1JlYXJyYW5nZVwiLCBbJGjigI1fYSA9PiAoYXRvbWljUmVhcnJhbmdlID0gJGjigI1fYSldXSxbXCJjZWlsRGl2aWRlQnlcIiwgWyRo4oCNX2EgPT4gKGNlaWxEaXZpZGVCeSA9ICRo4oCNX2EpXV0sW1wiY2VpbE11bHRpcGx5QnlcIiwgWyRo4oCNX2EgPT4gKGNlaWxNdWx0aXBseUJ5ID0gJGjigI1fYSldXSxbXCJkZWZpbmVFUmVjb3JkZXJLaXRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUVSZWNvcmRlcktpdCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lUmVjb3JkZXJLaXRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVJlY29yZGVyS2l0ID0gJGjigI1fYSldXSxbXCJmbG9vckRpdmlkZUJ5XCIsIFskaOKAjV9hID0+IChmbG9vckRpdmlkZUJ5ID0gJGjigI1fYSldXSxbXCJmbG9vck11bHRpcGx5QnlcIiwgWyRo4oCNX2EgPT4gKGZsb29yTXVsdGlwbHlCeSA9ICRo4oCNX2EpXV0sW1wibWFrZVJhdGlvXCIsIFskaOKAjV9hID0+IChtYWtlUmF0aW8gPSAkaOKAjV9hKV1dLFtcIm1ha2VSYXRpb0Zyb21BbW91bnRzXCIsIFskaOKAjV9hID0+IChtYWtlUmF0aW9Gcm9tQW1vdW50cyA9ICRo4oCNX2EpXV0sW1wibWFrZVJlY29yZGVyVG9waWNcIiwgWyRo4oCNX2EgPT4gKG1ha2VSZWNvcmRlclRvcGljID0gJGjigI1fYSldXSxbXCJuYXRTYWZlTWF0aFwiLCBbJGjigI1fYSA9PiAobmF0U2FmZU1hdGggPSAkaOKAjV9hKV1dLFtcInByZXBhcmVSZWNvcmRlclwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVJlY29yZGVyID0gJGjigI1fYSldXSxbXCJwcm92aWRlRW1wdHlTZWF0XCIsIFskaOKAjV9hID0+IChwcm92aWRlRW1wdHlTZWF0ID0gJGjigI1fYSldXSxbXCJvZmZlclRvXCIsIFskaOKAjV9hID0+IChvZmZlclRvID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJGdWxsUHJvcG9zYWxTaGFwZVwiLCBbJGjigI1fYSA9PiAoRnVsbFByb3Bvc2FsU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuLi9jb250cmFjdFN1cHBvcnQuanNcIiwgW1tcIm1ha2VOYXRBbW91bnRTaGFwZVwiLCBbJGjigI1fYSA9PiAobWFrZU5hdEFtb3VudFNoYXBlID0gJGjigI1fYSldXV1dLFtcIi4vYXVjdGlvbkJvb2suanNcIiwgW1tcIm1ha2VPZmZlclNwZWNTaGFwZVwiLCBbJGjigI1fYSA9PiAobWFrZU9mZmVyU3BlY1NoYXBlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlQXVjdGlvbkJvb2tcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVBdWN0aW9uQm9vayA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcmFtcy5qc1wiLCBbW1wiYXVjdGlvbmVlclBhcmFtVHlwZXNcIiwgWyRo4oCNX2EgPT4gKGF1Y3Rpb25lZXJQYXJhbVR5cGVzID0gJGjigI1fYSldXV1dLFtcIi4vc2NoZWR1bGVyLmpzXCIsIFtbXCJtYWtlU2NoZWR1bGVyXCIsIFskaOKAjV9hID0+IChtYWtlU2NoZWR1bGVyID0gJGjigI1fYSldXV1dLFtcIi4vdXRpbC5qc1wiLCBbW1wiQXVjdGlvblN0YXRlXCIsIFskaOKAjV9hID0+IChBdWN0aW9uU3RhdGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHthZGQsbXVsdGlwbHl9PW5hdFNhZmVNYXRoO1xuXG5jb25zdCB0cmFjZT1tYWtlVHJhY2VyKCdBdWN0aW9uJyx0cnVlKTtcblxuLyoqXG4gKiBAZmlsZSBJbiB0aGlzIGZpbGUsICdCaWQnIGlzIHRoZSBuYW1lIG9mIHRoZSBFUlRQIGlzc3VlciB1c2VkIHRvIHB1cmNoYXNlXG4gKiAgIGNvbGxhdGVyYWwgZnJvbSB2YXJpb3VzIGlzc3VlcnMuIEl0J3MgdG9vIGNvbmZ1c2luZyB0byBhbHNvIHVzZSBCaWQgYXMgYVxuICogICB2ZXJiIG9yIGEgZGVzY3JpcHRpb24gb2YgYW1vdW50cyBvZmZlcmVkLCBzbyB3ZSd2ZSB0cmllZCB0byBmaW5kXG4gKiAgIGFsdGVybmF0aXZlcyBpbiBhbGwgdGhvc2UgY2FzZXMuXG4gKi9cblxuY29uc3QgTUlOSU1VTV9CSURfR0lWRT0xbjtcblxuLyoqXG4gKiBAcGFyYW0ge05hdFZhbHVlfSByYXRlXG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gYmlkQnJhbmRcbiAqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBjb2xsYXRlcmFsQnJhbmRcbiAqL1xuY29uc3QgbWFrZUJQUmF0aW89KHJhdGUsYmlkQnJhbmQsY29sbGF0ZXJhbEJyYW5kPWJpZEJyYW5kKT0+XG5tYWtlUmF0aW9Gcm9tQW1vdW50cyhcbkFtb3VudE1hdGgubWFrZShiaWRCcmFuZCxyYXRlKSxcbkFtb3VudE1hdGgubWFrZShjb2xsYXRlcmFsQnJhbmQsQkFTSVNfUE9JTlRTKSk7XG5cblxuLyoqXG4gKiBUaGUgYXVjdGlvbiBzb2xkIHNvbWUgYW1vdW50IG9mIGNvbGxhdGVyYWwsIGFuZCByYWlzZWQgYSBjZXJ0YWluIGFtb3VudCBvZlxuICogQmlkLiBUaGUgZXhjZXNzIGNvbGxhdGVyYWwgd2FzIHJldHVybmVkIGFzIGB1bnNvbGRDb2xsYXRlcmFsYC4gVGhlIEJpZCBhbW91bnRcbiAqIGNvbGxlY3RlZCBmcm9tIHRoZSBhdWN0aW9uIHBhcnRpY2lwYW50cyBpcyBgcHJvY2VlZHNgLlxuICpcbiAqIFJldHVybiBhIHNldCBvZiB0cmFuc2ZlcnMgZm9yIGF0b21pY1JlYXJyYW5nZSgpIHRoYXQgZGlzdHJpYnV0ZVxuICogYHVuc29sZENvbGxhdGVyYWxgIGFuZCBgcHJvY2VlZHNgIHByb3BvcnRpb25hbGx5IHRvIGVhY2ggc2VhdCdzIGRlcG9zaXRlZFxuICogYW1vdW50LiBBbnkgdW5ldmVuIHNwbGl0IHNob3VsZCBiZSBhbGxvY2F0ZWQgdG8gdGhlIHJlc2VydmUuXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IHVuc29sZENvbGxhdGVyYWxcbiAqIEBwYXJhbSB7QW1vdW50fSBwcm9jZWVkc1xuICogQHBhcmFtIHt7IHNlYXQ6IFpDRlNlYXQ7IGFtb3VudDogQW1vdW50PCduYXQnPjsgZ29hbDogQW1vdW50PCduYXQnPiB9W119IGRlcG9zaXRzXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGNvbGxhdGVyYWxTZWF0XG4gKiBAcGFyYW0ge1pDRlNlYXR9IGJpZEhvbGRpbmdTZWF0IHNlYXQgd2l0aCB0aGUgQmlkIGFsbG9jYXRpb24gdG8gYmVcbiAqICAgZGlzdHJpYnV0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsYXRlcmFsS2V5d29yZCBUaGUgUmVzZXJ2ZSB3aWxsIGhvbGQgbXVsdGlwbGUgY29sbGF0ZXJhbHMsXG4gKiAgIHNvIHRoZXkgbmVlZCBkaXN0aW5jdCBrZXl3b3Jkc1xuICogQHBhcmFtIHtaQ0ZTZWF0fSByZXNlcnZlU2VhdFxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqL1xuY29uc3QgZGlzdHJpYnV0ZVByb3BvcnRpb25hbFNoYXJlcz0oXG51bnNvbGRDb2xsYXRlcmFsLFxucHJvY2VlZHMsXG5kZXBvc2l0cyxcbmNvbGxhdGVyYWxTZWF0LFxuYmlkSG9sZGluZ1NlYXQsXG5jb2xsYXRlcmFsS2V5d29yZCxcbnJlc2VydmVTZWF0LFxuYnJhbmQpPT5cbntcbmNvbnN0IHRvdGFsQ29sbERlcG9zaXRlZD1kZXBvc2l0cy5yZWR1Y2UoKHByZXYse2Ftb3VudH0pPT57XG5yZXR1cm4gQW1vdW50TWF0aC5hZGQocHJldixhbW91bnQpO1xuIH0sQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQpKTtcblxuY29uc3QgY29sbFNoYXJlPW1ha2VSYXRpb0Zyb21BbW91bnRzKHVuc29sZENvbGxhdGVyYWwsdG90YWxDb2xsRGVwb3NpdGVkKTtcbmNvbnN0IGN1cnJTaGFyZT1tYWtlUmF0aW9Gcm9tQW1vdW50cyhwcm9jZWVkcyx0b3RhbENvbGxEZXBvc2l0ZWQpO1xuLyoqIEB0eXBlIHtUcmFuc2ZlclBhcnRbXX0gKi9cbmNvbnN0IHRyYW5zZmVycz1bXTtcbmxldCBwcm9jZWVkc0xlZnQ9cHJvY2VlZHM7XG5sZXQgY29sbGF0ZXJhbExlZnQ9dW5zb2xkQ29sbGF0ZXJhbDtcblxuLyogZWFjaCBkZXBvc2l0b3IgZ2V0cyBhIHNoYXJlIHRoYXQgZXF1YWxzIHRoZWlyIGFtb3VudCBkZXBvc2l0ZWQqL1xuLyogZGl2aWRlZCBieSB0aGUgdG90YWwgZGVwb3NpdGVkIG11bHRpcGxpZWQgYnkgdGhlIEJpZCBhbmQqL1xuLyogY29sbGF0ZXJhbCBiZWluZyBkaXN0cmlidXRlZC4qL1xuZm9yKGNvbnN0e3NlYXQsYW1vdW50fW9mIGRlcG9zaXRzLnZhbHVlcygpKXtcbmNvbnN0IGN1cnJQb3J0aW9uPWZsb29yTXVsdGlwbHlCeShhbW91bnQsY3VyclNoYXJlKTtcbnByb2NlZWRzTGVmdD1BbW91bnRNYXRoLnN1YnRyYWN0KHByb2NlZWRzTGVmdCxjdXJyUG9ydGlvbik7XG5jb25zdCBjb2xsUG9ydGlvbj1mbG9vck11bHRpcGx5QnkoYW1vdW50LGNvbGxTaGFyZSk7XG5jb2xsYXRlcmFsTGVmdD1BbW91bnRNYXRoLnN1YnRyYWN0KGNvbGxhdGVyYWxMZWZ0LGNvbGxQb3J0aW9uKTtcbnRyYW5zZmVycy5wdXNoKFtiaWRIb2xkaW5nU2VhdCxzZWF0LHtCaWQ6Y3VyclBvcnRpb259XSk7XG50cmFuc2ZlcnMucHVzaChbY29sbGF0ZXJhbFNlYXQsc2VhdCx7Q29sbGF0ZXJhbDpjb2xsUG9ydGlvbn1dKTtcbiB9XG5cbnRyYW5zZmVycy5wdXNoKFtiaWRIb2xkaW5nU2VhdCxyZXNlcnZlU2VhdCx7QmlkOnByb2NlZWRzTGVmdH1dKTtcblxuaWYoIUFtb3VudE1hdGguaXNFbXB0eShjb2xsYXRlcmFsTGVmdCkpe1xudHJhbnNmZXJzLnB1c2goW1xuY29sbGF0ZXJhbFNlYXQsXG5yZXNlcnZlU2VhdCxcbntDb2xsYXRlcmFsOmNvbGxhdGVyYWxMZWZ0fSxcbntbY29sbGF0ZXJhbEtleXdvcmRdOmNvbGxhdGVyYWxMZWZ0fV0pO1xuXG4gfVxuXG5yZXR1cm4gdHJhbnNmZXJzO1xuIH07XG5cbi8qKlxuICogVGhlIGF1Y3Rpb24gc29sZCBzb21lIGFtb3VudCBvZiBjb2xsYXRlcmFsLCBhbmQgcmFpc2VkIGEgY2VydGFpbiBhbW91bnQgb2ZcbiAqIEJpZC4gVGhlIGV4Y2VzcyBjb2xsYXRlcmFsIHdhcyByZXR1cm5lZCBhcyBgdW5zb2xkQ29sbGF0ZXJhbGAuIFRoZSBCaWQgYW1vdW50XG4gKiBjb2xsZWN0ZWQgZnJvbSB0aGUgYXVjdGlvbiBwYXJ0aWNpcGFudHMgaXMgYHByb2NlZWRzYC5cbiAqXG4gKiBSZXR1cm4gYSBzZXQgb2YgdHJhbnNmZXJzIGZvciBhdG9taWNSZWFycmFuZ2UoKSB0aGF0IGRpc3RyaWJ1dGVcbiAqIGB1bnNvbGRDb2xsYXRlcmFsYCBhbmQgYHByb2NlZWRzYCBwcm9wb3J0aW9uYWxseSB0byBlYWNoIHNlYXQncyBkZXBvc2l0ZWRcbiAqIGFtb3VudC4gQW55IHVuZXZlbiBzcGxpdCBzaG91bGQgYmUgYWxsb2NhdGVkIHRvIHRoZSByZXNlcnZlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0ZWQgZm9yIHRlc3RhYmlsaXR5LCBhbmQgaXMgbm90IGV4cGVjdGVkIHRvIGJlIHVzZWRcbiAqIG91dHNpZGUgdGhlIGNvbnRyYWN0IGJlbG93LlxuICpcbiAqIFNvbWUgb3IgYWxsIG9mIHRoZSBkZXBvc2l0b3JzIG1heSBoYXZlIHNwZWNpZmllZCBhIGdvYWwgYW1vdW50LlxuICpcbiAqIC0gQSBpZiBub25lIGRpZCwgcmV0dXJuIGNvbGxhdGVyYWwgYW5kIEJpZCBwcm9yYXRlZCB0byBkZXBvc2l0cy5cbiAqIC0gQiBpZiBwcm9jZWVkcyA8IHByb2NlZWRzR29hbCBldmVyeW9uZSBnZXRzIHByb3JhdGVkIGFtb3VudHMgb2YgYm90aC5cbiAqIC0gQyBpZiBwcm9jZWVkcyBtYXRjaGVzIHByb2NlZWRzR29hbCwgZXZlcnlvbmUgZ2V0cyB0aGUgQmlkIHRoZXkgYXNrZWQgZm9yLFxuICogICBwbHVzIGVub3VnaCBjb2xsYXRlcmFsIHRvIHJlYWNoIHRoZSBzYW1lIHByb3BvcnRpb25hbCBwYXlvdXQuIElmIGFueVxuICogICBkZXBvc2l0b3IncyBnb2FsIGFtb3VudCBleGNlZWRlZCB0aGVpciBzaGFyZSBvZiB0aGUgdG90YWwsIHdlJ2xsIGZhbGwgYmFja1xuICogICB0byB0aGUgZmlyc3QgYXBwcm9hY2guXG4gKiAtIEQgaWYgcHJvY2VlZHMgPiBwcm9jZWVkc0dvYWwgJiYgYWxsIGRlcG9zaXRvcnMgc3BlY2lmaWVkIGEgbGltaXQsIGFsbFxuICogICBkZXBvc2l0b3JzIGdldCB0aGVpciBnb2FsIGZpcnN0LCB0aGVuIHdlIGRpc3RyaWJ1dGUgdGhlIHJlbWFpbmRlclxuICogICAoY29sbGF0ZXJhbCBhbmQgQmlkKSB0byBnZXQgdGhlIHNhbWUgcHJvcG9ydGlvbmFsIHBheW91dC5cbiAqIC0gRSBpZiBwcm9jZWVkcyA+IHByb2NlZWRzR29hbCAmJiBzb21lIGRlcG9zaXRvcnMgZGlkbid0IHNwZWNpZnkgYSBsaW1pdCxcbiAqICAgZGVwb3NpdG9ycyB3aG8gZGlkIHdpbGwgZ2V0IHRoZWlyIGdvYWwgZmlyc3QsIHRoZW4gd2UgZGlzdHJpYnV0ZSB0aGVcbiAqICAgcmVtYWluZGVyIChjb2xsYXRlcmFsIGFuZCBCaWQpIHRvIGdldCB0aGUgc2FtZSBwcm9wb3J0aW9uYWwgcGF5b3V0LiBJZiBhbnlcbiAqICAgZGVwb3NpdG9yJ3MgZ29hbCBhbW91bnQgZXhjZWVkZWQgdGhlaXIgc2hhcmUgb2YgdGhlIHRvdGFsLCB3ZSdsbCBmYWxsIGJhY2tcbiAqICAgYXMgYWJvdmUuIFRoaW5rIG9mIGl0IHRoaXMgd2F5OiB0aG9zZSB3aG8gc3BlY2lmaWVkIGEgbGltaXQgd2FudCBhcyBtdWNoXG4gKiAgIGNvbGxhdGVyYWwgYmFjayBhcyBwb3NzaWJsZSwgY29uc2lzdGVudCB3aXRoIHJhaXNpbmcgYSBjZXJ0YWluIGFtb3VudCBvZlxuICogICBCaWQuIFRob3NlIHdobyBkaWRuJ3Qgc3BlY2lmeSBhIGxpbWl0IGFyZSB0cnlpbmcgdG8gc2VsbCBjb2xsYXRlcmFsLCBhbmRcbiAqICAgd291bGQgcHJlZmVyIHRvIGhhdmUgYXMgbXVjaCBhcyBwb3NzaWJsZSBjb252ZXJ0ZWQgdG8gQmlkLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gdW5zb2xkQ29sbGF0ZXJhbFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBwcm9jZWVkc1xuICogQHBhcmFtIHt7IHNlYXQ6IFpDRlNlYXQ7IGFtb3VudDogQW1vdW50PCduYXQnPjsgZ29hbDogQW1vdW50PCduYXQnPiB9W119IGRlcG9zaXRzXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGNvbGxhdGVyYWxTZWF0XG4gKiBAcGFyYW0ge1pDRlNlYXR9IGJpZEhvbGRpbmdTZWF0IHNlYXQgd2l0aCB0aGUgQmlkIGFsbG9jYXRpb24gdG8gYmVcbiAqICAgZGlzdHJpYnV0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsYXRlcmFsS2V5d29yZCBUaGUgUmVzZXJ2ZSB3aWxsIGhvbGQgbXVsdGlwbGUgY29sbGF0ZXJhbHMsXG4gKiAgIHNvIHRoZXkgbmVlZCBkaXN0aW5jdCBrZXl3b3Jkc1xuICogQHBhcmFtIHtaQ0ZTZWF0fSByZXNlcnZlU2VhdFxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqL1xuY29uc3QgICAgICAgIGRpc3RyaWJ1dGVQcm9wb3J0aW9uYWxTaGFyZXNXaXRoTGltaXRzPShcbnVuc29sZENvbGxhdGVyYWwsXG5wcm9jZWVkcyxcbmRlcG9zaXRzLFxuY29sbGF0ZXJhbFNlYXQsXG5iaWRIb2xkaW5nU2VhdCxcbmNvbGxhdGVyYWxLZXl3b3JkLFxucmVzZXJ2ZVNlYXQsXG5icmFuZCk9Plxue1xudHJhY2UoJ2Rpc3RyaWJ1dGVQcm9wb3J0aW9uYWxseSB3aXRoIGxpbWl0cycpO1xuLyogdW5tYXRjaGVkIGlzIHRoZSBzdW0gb2YgdGhlIGRlcG9zaXRzIGJ5IHRob3NlIHdobyBkaWRuJ3Qgc3BlY2lmeSBhIGdvYWwqL1xuY29uc3RbY29sbERlcG9zaXRlZCxwcm9jZWVkc0dvYWwsdW5tYXRjaGVkRGVwb3NpdHNdPWRlcG9zaXRzLnJlZHVjZShcbihwcmV2LHthbW91bnQsZ29hbH0pPT57XG5jb25zdCBuZXh0RGVwb3NpdD1BbW91bnRNYXRoLmFkZChwcmV2WzBdLGFtb3VudCk7XG5jb25zdFtwcm9jZWVkc1N1bSx1bm1hdGNoZWRTdW1dPWdvYWw/XG5bQW1vdW50TWF0aC5hZGQoZ29hbCxwcmV2WzFdKSxwcmV2WzJdXTpcbltwcmV2WzFdLEFtb3VudE1hdGguYWRkKHByZXZbMl0sYW1vdW50KV07XG5yZXR1cm5bbmV4dERlcG9zaXQscHJvY2VlZHNTdW0sdW5tYXRjaGVkU3VtXTtcbiB9LFxuW1xuQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQpLFxuQW1vdW50TWF0aC5tYWtlRW1wdHlGcm9tQW1vdW50KHByb2NlZWRzKSxcbkFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kKV0pO1xuXG5cblxuY29uc3QgZGlzdHJpYnV0ZVByb3BvcnRpb25hbGx5PSgpPT5cbmRpc3RyaWJ1dGVQcm9wb3J0aW9uYWxTaGFyZXMoXG51bnNvbGRDb2xsYXRlcmFsLFxucHJvY2VlZHMsXG5kZXBvc2l0cyxcbmNvbGxhdGVyYWxTZWF0LFxuYmlkSG9sZGluZ1NlYXQsXG5jb2xsYXRlcmFsS2V5d29yZCxcbnJlc2VydmVTZWF0LFxuYnJhbmQpO1xuXG5cbi8qIGNhc2VzIEEgYW5kIEIqL1xuaWYoXG5BbW91bnRNYXRoLmlzRW1wdHkocHJvY2VlZHNHb2FsKXx8XG4hQW1vdW50TWF0aC5pc0dURShwcm9jZWVkcyxwcm9jZWVkc0dvYWwpKVxue1xucmV0dXJuIGRpc3RyaWJ1dGVQcm9wb3J0aW9uYWxseSgpO1xuIH1cblxuLyogQ2FsY3VsYXRlIG11bHRpcGxpZXIgZm9yIGNvbGxhdGVyYWwgdGhhdCBnaXZlcyB0b3RhbCB2YWx1ZSBlYWNoIGRlcG9zaXRvciovXG4vKiBzaG91bGQgZ2V0LiovXG4vKiovXG4vKiBUaGUgYXZlcmFnZSBwcmljZSBvZiBjb2xsYXRlcmFsIGlzIHByb2NlZWRzIC8gQ29sbGF0ZXJhbFNvbGQuKi9cbi8qIFRoZSB2YWx1ZSBvZiBDb2xsYXRlcmFsIGlzIFByaWNlICogdW5zb2xkQ29sbGF0ZXJhbC4qL1xuLyogVGhlIG92ZXJhbGwgdG90YWwgdmFsdWUgdG8gYmUgZGlzdHJpYnV0ZWQgaXMqL1xuLyogUHJvY2VlZHMgKyBjb2xsYXRlcmFsVmFsdWUuKi9cbi8qIEVhY2ggZGVwb3NpdG9yIHNob3VsZCBnZXQgYmlkIGFuZCBjb2xsYXRlcmFsIHRoYXQgc3VtIHRvIHRoZSBvdmVyYWxsKi9cbi8qIHRvdGFsIHZhbHVlIG11bHRpcGxpZWQgYnkgdGhlIHJhdGlvIG9mIHRoYXQgZGVwb3NpdG9yJ3MgY29sbGF0ZXJhbCovXG4vKiBkZXBvc2l0ZWQgdG8gYWxsIHRoZSBjb2xsYXRlcmFsIGRlcG9zaXRlZC4qL1xuLyoqL1xuLyogVG8gaW1wcm92ZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVzdWx0LCB3ZSBvbmx5IGRpdmlkZSBvbmNlLCBzbyB3ZSovXG4vKiBtdWx0aXBseSBlYWNoIGRlcG9zaXRvcidzIGNvbGxhdGVyYWwgcmVtYWluaW5nIGJ5IHRoaXMgZXhwcmVzc2lvbi4qL1xuLyoqL1xuLyogY29sbFNvbGQgKiBwcm9jZWVkcyAgKyAgcHJvY2VlZHMgKiB1bnNvbGRDb2xsYXRlcmFsKi9cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbi8qIGNvbGxTb2xkICogdG90YWxDb2xsRGVwb3NpdCovXG4vKiovXG4vKiBJZiB5b3UgZG8gdGhlIGRpbWVuc2lvbiBhbmFseXNpcywgd2UnbGwgbXVsdGlwbHkgY29sbGF0ZXJhbCBieSBhIHJhdGlvKi9cbi8qIHJlcHJlc2VudGluZyBCaWQvY29sbGF0ZXJhbC4qL1xuXG4vKiBhdmVyYWdlIHZhbHVlIG9mIGNvbGxhdGVyYWwgaXMgY29sbGF0ZXJhbFNvbGQgLyBwcm9jZWVkcyovXG5jb25zdCBjb2xsYXRlcmFsU29sZD1BbW91bnRNYXRoLnN1YnRyYWN0KGNvbGxEZXBvc2l0ZWQsdW5zb2xkQ29sbGF0ZXJhbCk7XG5jb25zdCBudW1lcmF0b3JWYWx1ZT1hZGQoXG5tdWx0aXBseShjb2xsYXRlcmFsU29sZC52YWx1ZSxwcm9jZWVkcy52YWx1ZSksXG5tdWx0aXBseSh1bnNvbGRDb2xsYXRlcmFsLnZhbHVlLHByb2NlZWRzLnZhbHVlKSk7XG5cbmNvbnN0IGRlbm9taW5hdG9yVmFsdWU9bXVsdGlwbHkoY29sbGF0ZXJhbFNvbGQudmFsdWUsY29sbERlcG9zaXRlZC52YWx1ZSk7XG5jb25zdCB0b3RhbFZhbHVlUmF0aW89bWFrZVJhdGlvRnJvbUFtb3VudHMoXG5BbW91bnRNYXRoLm1ha2UocHJvY2VlZHMuYnJhbmQsbnVtZXJhdG9yVmFsdWUpLFxuQW1vdW50TWF0aC5tYWtlKGJyYW5kLGRlbm9taW5hdG9yVmFsdWUpKTtcblxuXG5jb25zdCBhdmdQcmljZT1tYWtlUmF0aW9Gcm9tQW1vdW50cyhwcm9jZWVkcyxjb2xsYXRlcmFsU29sZCk7XG5cbi8qIEFsbG9jYXRlIHRoZSBwcm9jZWVkc0dvYWwgYW1vdW50IHRvIGRlcG9zaXRvcnMgd2hvIHNwZWNpZmllZCBpdC4gQWRkKi9cbi8qIGNvbGxhdGVyYWwgdG8gcmVhY2ggdGhlaXIgc2hhcmUuIFRoZW4gc2VlIHdoYXQncyBsZWZ0LCBhbmQgYWxsb2NhdGUgaXQqL1xuLyogYW1vbmcgdGhlIHJlbWFpbmluZyBkZXBvc2l0b3JzLiBFc2NhcGUgdG8gZGlzdHJpYnV0ZVByb3BvcnRpb25hbFNoYXJlcyBpZiovXG4vKiBhbnl0aGluZyBkb2Vzbid0IHdvcmsuKi9cbi8qKiBAdHlwZSB7VHJhbnNmZXJQYXJ0W119ICovXG5jb25zdCB0cmFuc2ZlcnM9W107XG5sZXQgcHJvY2VlZHNMZWZ0PXByb2NlZWRzO1xubGV0IGNvbGxhdGVyYWxMZWZ0PXVuc29sZENvbGxhdGVyYWw7XG5cbi8qIGNhc2UgQyovXG5pZihBbW91bnRNYXRoLmlzRXF1YWwocHJvY2VlZHNHb2FsLHByb2NlZWRzKSl7XG4vKiBlYWNoIGRlcG9zaXRvciBnZXRzIGEgc2hhcmUgdGhhdCBlcXVhbHMgdGhlaXIgYW1vdW50IGRlcG9zaXRlZCovXG4vKiBtdWx0aXBsaWVkIGJ5IHRvdGFsVmFsdWVSYXRpbyBjb21wdXRlZCBhYm92ZS4qL1xuXG5mb3IoY29uc3R7c2VhdCxhbW91bnQsZ29hbH1vZiBkZXBvc2l0cy52YWx1ZXMoKSl7XG5jb25zdCBkZXBvc2l0b3JWYWx1ZT1mbG9vck11bHRpcGx5QnkoYW1vdW50LHRvdGFsVmFsdWVSYXRpbyk7XG5pZihnb2FsPT09bnVsbHx8QW1vdW50TWF0aC5pc0dURShkZXBvc2l0b3JWYWx1ZSxnb2FsKSl7XG5sZXQgdmFsdWVOZWVkZWQ9ZGVwb3NpdG9yVmFsdWU7XG5pZihnb2FsIT09bnVsbCYmIUFtb3VudE1hdGguaXNFbXB0eShnb2FsKSl7XG5wcm9jZWVkc0xlZnQ9QW1vdW50TWF0aC5zdWJ0cmFjdChwcm9jZWVkc0xlZnQsZ29hbCk7XG50cmFuc2ZlcnMucHVzaChbYmlkSG9sZGluZ1NlYXQsc2VhdCx7QmlkOmdvYWx9XSk7XG52YWx1ZU5lZWRlZD1BbW91bnRNYXRoLnN1YnRyYWN0KGRlcG9zaXRvclZhbHVlLGdvYWwpO1xuIH1cblxuY29uc3QgY29sbGF0ZXJhbFRvQWRkPWZsb29yRGl2aWRlQnkodmFsdWVOZWVkZWQsYXZnUHJpY2UpO1xuY29sbGF0ZXJhbExlZnQ9QW1vdW50TWF0aC5zdWJ0cmFjdChjb2xsYXRlcmFsTGVmdCxjb2xsYXRlcmFsVG9BZGQpO1xudHJhbnNmZXJzLnB1c2goW2NvbGxhdGVyYWxTZWF0LHNlYXQse0NvbGxhdGVyYWw6Y29sbGF0ZXJhbFRvQWRkfV0pO1xuIH1lbHNle1xuLyogVGhpcyBkZXBvc2l0b3IgYXNrZWQgZm9yIG1vcmUgdGhhbiB0aGVpciBzaGFyZS4qL1xuLyogaWdub3JlIGB0cmFuc2ZlcnNgIGFuZCBkaXN0cmlidXRlIGV2ZXJ5dGhpbmcgcHJvcG9ydGlvbmFsbHkuKi9cbnJldHVybiBkaXN0cmlidXRlUHJvcG9ydGlvbmFsbHkoKTtcbiB9XG4gfVxuIH1lbHNle1xuLyogQ2FzZXMgRCAmIEUuIFByb2NlZWRzID4gcHJvY2VlZHNHb2FsLCBzbyB0aG9zZSB3aG8gc3BlY2lmaWVkIGEgbGltaXQqL1xuLyogcmVjZWl2ZSBhdCBsZWFzdCB0aGVpciB0YXJnZXQuKi9cblxuY29uc3QgY29sbGF0ZXJhbFZhbHVlPWZsb29yTXVsdGlwbHlCeSh1bnNvbGRDb2xsYXRlcmFsLGF2Z1ByaWNlKTtcbmNvbnN0IHRvdGFsRGlzdHJpYnV0YWJsZVZhbHVlPUFtb3VudE1hdGguYWRkKHByb2NlZWRzLGNvbGxhdGVyYWxWYWx1ZSk7XG4vKiBUaGUgc2hhcmUgZm9yIHRob3NlIHdobyBzcGVjaWZpZWQgYSBsaW1pdCBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlaXIqL1xuLyogY29sbGF0ZXJhbC4gY2VpbGluZyBiZWNhdXNlIGl0J3MgYSBsb3dlciBsaW1pdCBvbiB0aGUgcmVzdHJpY3RpdmUgYnJhbmNoKi9cbmNvbnN0IGxpbWl0ZWRTaGFyZT1jZWlsTXVsdGlwbHlCeShcbkFtb3VudE1hdGguc3VidHJhY3QoY29sbERlcG9zaXRlZCx1bm1hdGNoZWREZXBvc2l0cyksXG5tYWtlUmF0aW9Gcm9tQW1vdW50cyh0b3RhbERpc3RyaWJ1dGFibGVWYWx1ZSxjb2xsRGVwb3NpdGVkKSk7XG5cblxuLyogaWYgcHJvY2VlZHNHb2FsICsgdmFsdWUgb2YgdW5zb2xkQ29sbGF0ZXJhbCA+PSBsaW1pdGVkU2hhcmUgdGhlbiB0aG9zZSovXG4vKiB3aG8gc3BlY2lmaWVkIGEgbGltaXQgY2FuIGdldCBhbGwgdGhlIGV4Y2VzcyBvdmVyIHRoZWlyIGxpbWl0IGluKi9cbi8qIGNvbGxhdGVyYWwuIE90aGVycyBzaGFyZSB3aGF0ZXZlciBpcyBsZWZ0LiovXG4vKiBJZiBwcm9jZWVkc0dvYWwgKyB1bnNvbGRDb2xsYXRlcmFsIDwgbGltaXRlZFNoYXJlIHRoZW4gdGhvc2Ugd2hvKi9cbi8qIHNwZWNpZmllZCBzaGFyZSBhbGwgdGhlIGNvbGxhdGVyYWwsIGFuZCBldmVyeW9uZSBnZXRzIEJpZCB0byBjb3ZlciovXG4vKiB0aGUgcmVtYWluZGVyIG9mIHRoZWlyIHNoYXJlLiovXG5jb25zdCBsaW1pdGVkR2V0TWF4Q29sbGF0ZXJhbD1BbW91bnRNYXRoLmlzR1RFKFxuQW1vdW50TWF0aC5hZGQocHJvY2VlZHNHb2FsLGNvbGxhdGVyYWxWYWx1ZSksXG5saW1pdGVkU2hhcmUpO1xuXG5cbmNvbnN0IGNhbGNOb3RMaW1pdGVkQ29sbGF0ZXJhbFNoYXJlPSgpPT57XG5pZihsaW1pdGVkR2V0TWF4Q29sbGF0ZXJhbCl7XG4vKiB0aG9zZSB3aG8gbGltaXRlZCB3aWxsIGdldCBsaW1pdGVkU2hhcmUgLSBwcm9jZWVkc0dvYWwgaW4gY29sbGF0ZXJhbCovXG5jb25zdCBsdGRDb2xsYXRWYWx1ZT1BbW91bnRNYXRoLnN1YnRyYWN0KGxpbWl0ZWRTaGFyZSxwcm9jZWVkc0dvYWwpO1xuY29uc3QgbHRkQ29sbGF0U2hhcmU9Y2VpbERpdmlkZUJ5KGx0ZENvbGxhdFZhbHVlLGF2Z1ByaWNlKTtcbi8qIHRoZSB1bmxpbWl0ZWQgd2lsbCBnZXQgdGhlIHJlbWFpbmRlciBvZiB0aGUgY29sbGF0ZXJhbCovXG5yZXR1cm4gQW1vdW50TWF0aC5zdWJ0cmFjdCh1bnNvbGRDb2xsYXRlcmFsLGx0ZENvbGxhdFNoYXJlKTtcbiB9ZWxzZXtcbnJldHVybiBBbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCk7XG4gfVxuIH07XG5jb25zdCBub3RMaW1pdGVkQ29sbGF0ZXJhbFNoYXJlPWNhbGNOb3RMaW1pdGVkQ29sbGF0ZXJhbFNoYXJlKCk7XG5cbmZvcihjb25zdHtzZWF0LGFtb3VudCxnb2FsfW9mIGRlcG9zaXRzLnZhbHVlcygpKXtcbmNvbnN0IGRlcG9zaXRvclZhbHVlPWZsb29yTXVsdGlwbHlCeShhbW91bnQsdG90YWxWYWx1ZVJhdGlvKTtcblxuY29uc3QgYWRkUmVtYWluZGVySW5CaWQ9KGNvbGxhdGVyYWxBZGRlZCk9PntcbmNvbnN0IGNvbGxhdGVyYWxWYWw9Y2VpbE11bHRpcGx5QnkoY29sbGF0ZXJhbEFkZGVkLGF2Z1ByaWNlKTtcbi8qKiBAdHlwZSB7QW1vdW50PCduYXQnPn0gWFhYIGZvciBwYWNrYWdlIGRlcHRoIHR5cGUgcmVzb2x1dGlvbiAqL1xuY29uc3QgdmFsdWVOZWVkZWQ9QW1vdW50TWF0aC5zdWJ0cmFjdChkZXBvc2l0b3JWYWx1ZSxjb2xsYXRlcmFsVmFsKTtcblxucHJvY2VlZHNMZWZ0PUFtb3VudE1hdGguc3VidHJhY3QocHJvY2VlZHNMZWZ0LHZhbHVlTmVlZGVkKTtcbnRyYW5zZmVycy5wdXNoKFtiaWRIb2xkaW5nU2VhdCxzZWF0LHtCaWQ6dmFsdWVOZWVkZWR9XSk7XG4gfTtcblxuaWYoZ29hbD09PW51bGx8fEFtb3VudE1hdGguaXNFbXB0eShnb2FsKSl7XG5jb25zdCBjb2xsYXRlcmFsU2hhcmU9Zmxvb3JNdWx0aXBseUJ5KFxubm90TGltaXRlZENvbGxhdGVyYWxTaGFyZSxcbm1ha2VSYXRpb0Zyb21BbW91bnRzKGFtb3VudCx1bm1hdGNoZWREZXBvc2l0cykpO1xuXG5jb2xsYXRlcmFsTGVmdD1BbW91bnRNYXRoLnN1YnRyYWN0KGNvbGxhdGVyYWxMZWZ0LGNvbGxhdGVyYWxTaGFyZSk7XG5hZGRSZW1haW5kZXJJbkJpZChjb2xsYXRlcmFsU2hhcmUpO1xudHJhbnNmZXJzLnB1c2goW2NvbGxhdGVyYWxTZWF0LHNlYXQse0NvbGxhdGVyYWw6Y29sbGF0ZXJhbFNoYXJlfV0pO1xuIH1lbHNlIGlmKGxpbWl0ZWRHZXRNYXhDb2xsYXRlcmFsKXtcbnByb2NlZWRzTGVmdD1BbW91bnRNYXRoLnN1YnRyYWN0KHByb2NlZWRzTGVmdCxnb2FsKTtcbnRyYW5zZmVycy5wdXNoKFtiaWRIb2xkaW5nU2VhdCxzZWF0LHtCaWQ6Z29hbH1dKTtcblxuY29uc3QgdmFsdWVOZWVkZWQ9QW1vdW50TWF0aC5zdWJ0cmFjdChkZXBvc2l0b3JWYWx1ZSxnb2FsKTtcbmNvbnN0IGNvbGxhdGVyYWxUb0FkZD1mbG9vckRpdmlkZUJ5KHZhbHVlTmVlZGVkLGF2Z1ByaWNlKTtcbmNvbGxhdGVyYWxMZWZ0PUFtb3VudE1hdGguc3VidHJhY3QoY29sbGF0ZXJhbExlZnQsY29sbGF0ZXJhbFRvQWRkKTtcbnRyYW5zZmVycy5wdXNoKFtjb2xsYXRlcmFsU2VhdCxzZWF0LHtDb2xsYXRlcmFsOmNvbGxhdGVyYWxUb0FkZH1dKTtcbiB9ZWxzZXtcbi8qIFRoZXJlJ3Mgbm90IGVub3VnaCBjb2xsYXRlcmFsIHRvIGNvbXBsZXRlbHkgY292ZXIgdGhlIGdhcCBhYm92ZSovXG4vKiB0aGUgcHJvY2VlZHNHb2FsIGFtb3VudCwgc28gZWFjaCBkZXBvc2l0b3IgZ2V0cyBhIHByb3BvcnRpb25hbCBzaGFyZSovXG4vKiBvZiB1bnNvbGRDb2xsYXRlcmFsIHBsdXMgZW5vdWdoIEJpZCB0byByZWFjaCB0aGVpciBzaGFyZS4qL1xuY29uc3QgY29sbGF0ZXJhbFNoYXJlPWZsb29yTXVsdGlwbHlCeShcbnVuc29sZENvbGxhdGVyYWwsXG5tYWtlUmF0aW9Gcm9tQW1vdW50cyhhbW91bnQsY29sbERlcG9zaXRlZCkpO1xuXG5jb2xsYXRlcmFsTGVmdD1BbW91bnRNYXRoLnN1YnRyYWN0KGNvbGxhdGVyYWxMZWZ0LGNvbGxhdGVyYWxTaGFyZSk7XG5hZGRSZW1haW5kZXJJbkJpZChjb2xsYXRlcmFsU2hhcmUpO1xudHJhbnNmZXJzLnB1c2goW2NvbGxhdGVyYWxTZWF0LHNlYXQse0NvbGxhdGVyYWw6Y29sbGF0ZXJhbFNoYXJlfV0pO1xuIH1cbiB9XG4gfVxuXG50cmFuc2ZlcnMucHVzaChbYmlkSG9sZGluZ1NlYXQscmVzZXJ2ZVNlYXQse0JpZDpwcm9jZWVkc0xlZnR9XSk7XG5cbmlmKCFBbW91bnRNYXRoLmlzRW1wdHkoY29sbGF0ZXJhbExlZnQpKXtcbnRyYW5zZmVycy5wdXNoKFtcbmNvbGxhdGVyYWxTZWF0LFxucmVzZXJ2ZVNlYXQsXG57Q29sbGF0ZXJhbDpjb2xsYXRlcmFsTGVmdH0sXG57W2NvbGxhdGVyYWxLZXl3b3JkXTpjb2xsYXRlcmFsTGVmdH1dKTtcblxuIH1cbnJldHVybiB0cmFuc2ZlcnM7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1pDRjxcbiAqICAgR292ZXJuYW5jZVRlcm1zPHR5cGVvZiBhdWN0aW9uZWVyUGFyYW1UeXBlcz4gJiB7XG4gKiAgICAgdGltZXJTZXJ2aWNlOiBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlO1xuICogICAgIHJlc2VydmVQdWJsaWNGYWNldDogQXNzZXRSZXNlcnZlUHVibGljRmFjZXQ7XG4gKiAgICAgcHJpY2VBdXRob3JpdHk6IFByaWNlQXV0aG9yaXR5O1xuICogICB9XG4gKiA+fSB6Y2ZcbiAqIEBwYXJhbSB7e1xuICogICBpbml0aWFsUG9zZXJJbnZpdGF0aW9uOiBJbnZpdGF0aW9uO1xuICogICBzdG9yYWdlTm9kZTogU3RvcmFnZU5vZGU7XG4gKiAgIG1hcnNoYWxsZXI6IE1hcnNoYWxsZXI7XG4gKiB9fSBwcml2YXRlQXJnc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKi8kaOKAjV9vbmNlLmRpc3RyaWJ1dGVQcm9wb3J0aW9uYWxTaGFyZXNXaXRoTGltaXRzKGRpc3RyaWJ1dGVQcm9wb3J0aW9uYWxTaGFyZXNXaXRoTGltaXRzKTtcbmNvbnN0ICAgICAgICBzdGFydD1hc3luYyh6Y2YscHJpdmF0ZUFyZ3MsYmFnZ2FnZSk9PntcbmNvbnN0e2JyYW5kcyx0aW1lclNlcnZpY2U6dGltZXIscHJpY2VBdXRob3JpdHl9PXpjZi5nZXRUZXJtcygpO1xudGltZXJ8fEZhaWwgYFRpbWVyIG11c3QgYmUgaW4gQXVjdGlvbmVlciB0ZXJtc2A7XG5jb25zdCB0aW1lckJyYW5kPWF3YWl0IEUodGltZXIpLmdldFRpbWVyQnJhbmQoKTtcblxuY29uc3QgYmlkQW1vdW50U2hhcGU9e2JyYW5kOmJyYW5kcy5CaWQsdmFsdWU6TS5uYXQoKX07XG5cbi8qKiBAdHlwZSB7TWFwU3RvcmU8QnJhbmQsIFhpbXBvcnQoJy4vYXVjdGlvbkJvb2suanMnKS5BdWN0aW9uQm9vaz59ICovXG5jb25zdCBib29rcz1wcm92aWRlRHVyYWJsZU1hcFN0b3JlKGJhZ2dhZ2UsJ2F1Y3Rpb25Cb29rcycpO1xuLyoqXG4gKiBAdHlwZSB7TWFwU3RvcmU8XG4gKiAgIEJyYW5kLFxuICogICB7IHNlYXQ6IFpDRlNlYXQ7IGFtb3VudDogQW1vdW50PCduYXQnPjsgZ29hbDogQW1vdW50PCduYXQnPiB9W11cbiAqID59XG4gKi9cbmNvbnN0IGRlcG9zaXRzPXByb3ZpZGVEdXJhYmxlTWFwU3RvcmUoYmFnZ2FnZSwnZGVwb3NpdHMnKTtcbi8qKiBAdHlwZSB7TWFwU3RvcmU8QnJhbmQsIEtleXdvcmQ+fSAqL1xuY29uc3QgYnJhbmRUb0tleXdvcmQ9cHJvdmlkZUR1cmFibGVNYXBTdG9yZShiYWdnYWdlLCdicmFuZFRvS2V5d29yZCcpO1xuXG5jb25zdCByZXNlcnZlU2VhdD1wcm92aWRlRW1wdHlTZWF0KHpjZixiYWdnYWdlLCdjb2xsYXRlcmFsJyk7XG5cbmxldCBib29rQ291bnRlcj0wO1xuXG5jb25zdCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQ9cHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuYmFnZ2FnZSxcbidBdWN0aW9uIHB1Ymxpc2gga2l0Jyk7XG5cbmNvbnN0IG1ha2VSZWNvcmRlcj1wcmVwYXJlUmVjb3JkZXIoYmFnZ2FnZSxwcml2YXRlQXJncy5tYXJzaGFsbGVyKTtcblxuY29uc3QgbWFrZVJlY29yZGVyS2l0PWRlZmluZVJlY29yZGVyS2l0KHtcbm1ha2VSZWNvcmRlcixcbm1ha2VEdXJhYmxlUHVibGlzaEtpdH0pO1xuXG5cbmNvbnN0IG1ha2VBdWN0aW9uQm9vaz1wcmVwYXJlQXVjdGlvbkJvb2soYmFnZ2FnZSx6Y2YsbWFrZVJlY29yZGVyS2l0KTtcblxuY29uc3QgbWFrZUVSZWNvcmRlcktpdD1kZWZpbmVFUmVjb3JkZXJLaXQoe1xubWFrZVJlY29yZGVyLFxubWFrZUR1cmFibGVQdWJsaXNoS2l0fSk7XG5cbmNvbnN0IHNjaGVkdWxlS2l0PW1ha2VFUmVjb3JkZXJLaXQoXG5FKHByaXZhdGVBcmdzLnN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKCdzY2hlZHVsZScpLFxuLyoqXG4gKiBAdHlwZSB7WGltcG9ydCgnQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcycpLlR5cGVkTWF0Y2hlcjxcbiAqICAgICBYaW1wb3J0KCcuL3NjaGVkdWxlci5qcycpLlNjaGVkdWxlTm90aWZpY2F0aW9uXG4gKiAgID59XG4gKi9NLmFueSgpKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPiB8IG51bGx9IGdvYWxcbiAqL1xuY29uc3QgYWRkRGVwb3NpdD0oc2VhdCxhbW91bnQsZ29hbD1udWxsKT0+e1xuYXBwZW5kVG9TdG9yZWRBcnJheShkZXBvc2l0cyxhbW91bnQuYnJhbmQsaGFyZGVuKHtzZWF0LGFtb3VudCxnb2FsfSkpO1xuIH07XG5cbmNvbnN0IHNlbmRUb1Jlc2VydmU9KGtleXdvcmQpPT57XG5jb25zdHtyZXNlcnZlUHVibGljRmFjZXR9PXpjZi5nZXRUZXJtcygpO1xuXG5jb25zdCBhbW91bnQ9cmVzZXJ2ZVNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKVtrZXl3b3JkXTtcbmlmKCFhbW91bnR8fEFtb3VudE1hdGguaXNFbXB0eShhbW91bnQpKXtcbnJldHVybjtcbiB9XG5cbmNvbnN0IGludml0YXRpb249RShyZXNlcnZlUHVibGljRmFjZXQpLm1ha2VBZGRDb2xsYXRlcmFsSW52aXRhdGlvbigpO1xuLyogZG9uJ3Qgd2FpdCBmb3IgYSByZXNwb25zZSovXG52b2lkIEUud2hlbihpbnZpdGF0aW9uLChpbnZpdGUpPT57XG5jb25zdCBwcm9wb3NhbD17Z2l2ZTp7Q29sbGF0ZXJhbDphbW91bnR9fTtcbnZvaWQgb2ZmZXJUbyhcbnpjZixcbmludml0ZSxcbntba2V5d29yZF06J0NvbGxhdGVyYWwnfSxcbnByb3Bvc2FsLFxucmVzZXJ2ZVNlYXQpO1xuXG4gfSk7XG4gfTtcblxuLyogQ2FsbGVkIFwiZGlzY291bnRcIiByYXRlIGV2ZW4gdGhvdWdoIGl0IGNhbiBiZSBhYm92ZSBvciBiZWxvdyAxMDAlLiovXG4vKiogQHR5cGUge05hdFZhbHVlfSAqL1xubGV0IGN1cnJlbnREaXNjb3VudFJhdGVCUDtcblxuY29uc3QgZGlzdHJpYnV0ZVByb2NlZWRzPSgpPT57XG5mb3IoY29uc3QgYnJhbmQgb2YgZGVwb3NpdHMua2V5cygpKXtcbmNvbnN0IGJvb2s9Ym9va3MuZ2V0KGJyYW5kKTtcbmNvbnN0e2NvbGxhdGVyYWxTZWF0LGJpZEhvbGRpbmdTZWF0fT1ib29rLmdldFNlYXRzKCk7XG5cbmNvbnN0IGRlcG9zaXRzRm9yQnJhbmQ9ZGVwb3NpdHMuZ2V0KGJyYW5kKTtcbmlmKGRlcG9zaXRzRm9yQnJhbmQubGVuZ3RoPT09MSl7XG4vKiBzZW5kIGl0IGFsbCB0byB0aGUgb25lKi9cbmNvbnN0IGxpcVNlYXQ9ZGVwb3NpdHNGb3JCcmFuZFswXS5zZWF0O1xuXG5hdG9taWNSZWFycmFuZ2UoXG56Y2YsXG5oYXJkZW4oW1xuW2NvbGxhdGVyYWxTZWF0LGxpcVNlYXQsY29sbGF0ZXJhbFNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKV0sXG5bYmlkSG9sZGluZ1NlYXQsbGlxU2VhdCxiaWRIb2xkaW5nU2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpXV0pKTtcblxuXG5saXFTZWF0LmV4aXQoKTtcbmRlcG9zaXRzLnNldChicmFuZCxbXSk7XG4gfWVsc2UgaWYoZGVwb3NpdHNGb3JCcmFuZC5sZW5ndGg+MSl7XG5jb25zdCBjb2xsUHJvY2VlZHM9Y29sbGF0ZXJhbFNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKS5Db2xsYXRlcmFsO1xuY29uc3QgY3VyclByb2NlZWRzPVxuYmlkSG9sZGluZ1NlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKS5CaWR8fFxuQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmRzLkJpZCk7XG5jb25zdCB0cmFuc2ZlcnM9ZGlzdHJpYnV0ZVByb3BvcnRpb25hbFNoYXJlc1dpdGhMaW1pdHMoXG5jb2xsUHJvY2VlZHMsXG5jdXJyUHJvY2VlZHMsXG5kZXBvc2l0c0ZvckJyYW5kLFxuY29sbGF0ZXJhbFNlYXQsXG5iaWRIb2xkaW5nU2VhdCxcbmJyYW5kVG9LZXl3b3JkLmdldChicmFuZCksXG5yZXNlcnZlU2VhdCxcbmJyYW5kKTtcblxuYXRvbWljUmVhcnJhbmdlKHpjZixoYXJkZW4odHJhbnNmZXJzKSk7XG5cbmZvcihjb25zdHtzZWF0fW9mIGRlcG9zaXRzRm9yQnJhbmQpe1xuc2VhdC5leGl0KCk7XG4gfVxuXG5zZW5kVG9SZXNlcnZlKGJyYW5kVG9LZXl3b3JkLmdldChicmFuZCkpO1xuZGVwb3NpdHMuc2V0KGJyYW5kLFtdKTtcbiB9XG4gfVxuIH07XG5cbmNvbnN0e2F1Z21lbnRQdWJsaWNGYWNldCxtYWtlRmFyR292ZXJub3JGYWNldCxwYXJhbXN9PVxuYXdhaXQgaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlKFxuemNmLFxucHJpdmF0ZUFyZ3MuaW5pdGlhbFBvc2VySW52aXRhdGlvbixcbmF1Y3Rpb25lZXJQYXJhbVR5cGVzLFxucHJpdmF0ZUFyZ3Muc3RvcmFnZU5vZGUsXG5wcml2YXRlQXJncy5tYXJzaGFsbGVyKTtcblxuXG5jb25zdCB0cmFkZUV2ZXJ5Qm9vaz0oKT0+e1xuY29uc3Qgb2ZmZXJTY2FsaW5nUmF0aW89bWFrZVJhdGlvKFxuY3VycmVudERpc2NvdW50UmF0ZUJQLFxuYnJhbmRzLkJpZCxcbkJBU0lTX1BPSU5UUyk7XG5cblxuZm9yKGNvbnN0IGJvb2sgb2YgYm9va3MudmFsdWVzKCkpe1xuYm9vay5zZXR0bGVBdE5ld1JhdGUob2ZmZXJTY2FsaW5nUmF0aW8pO1xuIH1cbiB9O1xuXG5jb25zdCBkcml2ZXI9RmFyKCdBdWN0aW9uZWVyJyx7XG5yZWR1Y2VQcmljZUFuZFRyYWRlOigpPT57XG50cmFjZSgncmVkdWNlUHJpY2VBbmRUcmFkZScpO1xuXG5uYXRTYWZlTWF0aC5pc0dURShjdXJyZW50RGlzY291bnRSYXRlQlAscGFyYW1zLmdldERpc2NvdW50U3RlcCgpKXx8XG5GYWlsIGByYXRlcyBtdXN0IGZhbGwgJHtjdXJyZW50RGlzY291bnRSYXRlQlB9YDtcblxuY3VycmVudERpc2NvdW50UmF0ZUJQPW5hdFNhZmVNYXRoLnN1YnRyYWN0KFxuY3VycmVudERpc2NvdW50UmF0ZUJQLFxucGFyYW1zLmdldERpc2NvdW50U3RlcCgpKTtcblxuXG50cmFkZUV2ZXJ5Qm9vaygpO1xuIH0sXG5maW5hbGl6ZTooKT0+e1xudHJhY2UoJ2ZpbmFsaXplJyk7XG5cbmZvcihjb25zdCBib29rIG9mIGJvb2tzLnZhbHVlcygpKXtcbmJvb2suZW5kQXVjdGlvbigpO1xuIH1cbmRpc3RyaWJ1dGVQcm9jZWVkcygpO1xuIH0sXG5zdGFydFJvdW5kKCl7XG50cmFjZSgnc3RhcnRSb3VuZCcpO1xuXG5jdXJyZW50RGlzY291bnRSYXRlQlA9cGFyYW1zLmdldFN0YXJ0aW5nUmF0ZSgpO1xuZm9yKGNvbnN0IGJvb2sgb2YgYm9va3MudmFsdWVzKCkpe1xuYm9vay5zZXRTdGFydGluZ1JhdGUobWFrZUJQUmF0aW8oY3VycmVudERpc2NvdW50UmF0ZUJQLGJyYW5kcy5CaWQpKTtcbiB9XG5cbnRyYWRlRXZlcnlCb29rKCk7XG4gfSxcbmNhcHR1cmVQcmljZXMoKXtcbmZvcihjb25zdCBib29rIG9mIGJvb2tzLnZhbHVlcygpKXtcbmJvb2suY2FwdHVyZU9yYWNsZVByaWNlRm9yUm91bmQoKTtcbiB9XG4gfX0pO1xuXG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCBpc0FjdGl2ZT0oKT0+c2NoZWR1bGVyLmdldEF1Y3Rpb25TdGF0ZSgpPT09QXVjdGlvblN0YXRlLkFDVElWRTtcblxuLyoqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHpjZlNlYXRcbiAqIEBwYXJhbSB7eyBnb2FsOiBBbW91bnQ8J25hdCc+IH19IG9mZmVyQXJnc1xuICovXG5jb25zdCBkZXBvc2l0T2ZmZXJIYW5kbGVyPSh6Y2ZTZWF0LG9mZmVyQXJncyk9PntcbmNvbnN0IGdvYWxNYXRjaGVyPU0ub3IodW5kZWZpbmVkLHtnb2FsOmJpZEFtb3VudFNoYXBlfSk7XG5tdXN0TWF0Y2gob2ZmZXJBcmdzLGhhcmRlbihnb2FsTWF0Y2hlcikpO1xuY29uc3R7Q29sbGF0ZXJhbDpjb2xsYXRlcmFsQW1vdW50fT16Y2ZTZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCk7XG5jb25zdCBib29rPWJvb2tzLmdldChjb2xsYXRlcmFsQW1vdW50LmJyYW5kKTtcbnRyYWNlKCBgZGVwb3NpdGVkICR7cShjb2xsYXRlcmFsQW1vdW50KX0gZ29hbDogJHtxKG9mZmVyQXJncz8uZ29hbCl9YCk7XG5cbmJvb2suYWRkQXNzZXRzKGNvbGxhdGVyYWxBbW91bnQsemNmU2VhdCxvZmZlckFyZ3M/LmdvYWwpO1xuYWRkRGVwb3NpdCh6Y2ZTZWF0LGNvbGxhdGVyYWxBbW91bnQsb2ZmZXJBcmdzPy5nb2FsKTtcbnJldHVybidkZXBvc2l0ZWQnO1xuIH07XG5cbmNvbnN0IG1ha2VEZXBvc2l0SW52aXRhdGlvbj0oKT0+XG56Y2YubWFrZUludml0YXRpb24oXG5kZXBvc2l0T2ZmZXJIYW5kbGVyLFxuJ2RlcG9zaXQgQ29sbGF0ZXJhbCcsXG51bmRlZmluZWQsXG5NLnNwbGl0UmVjb3JkKHtnaXZlOntDb2xsYXRlcmFsOkFtb3VudFNoYXBlfX0pKTtcblxuXG5jb25zdCBiaWRkaW5nUHJvcG9zYWxTaGFwZT1NLnNwbGl0UmVjb3JkKFxue1xuZ2l2ZTp7XG5CaWQ6bWFrZU5hdEFtb3VudFNoYXBlKGJyYW5kcy5CaWQsTUlOSU1VTV9CSURfR0lWRSl9fSxcblxuXG57XG5tYXhCdXk6TS5vcih7Q29sbGF0ZXJhbDpBbW91bnRTaGFwZX0se30pLFxuZXhpdDpGdWxsUHJvcG9zYWxTaGFwZS5leGl0fSk7XG5cblxuXG5jb25zdCBwdWJsaWNGYWNldD1hdWdtZW50UHVibGljRmFjZXQoXG5oYXJkZW4oe1xuLyoqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBjb2xsYXRlcmFsQnJhbmQgKi9cbm1ha2VCaWRJbnZpdGF0aW9uKGNvbGxhdGVyYWxCcmFuZCl7XG5tdXN0TWF0Y2goY29sbGF0ZXJhbEJyYW5kLEJyYW5kU2hhcGUpO1xuYm9va3MuaGFzKGNvbGxhdGVyYWxCcmFuZCl8fFxuRmFpbCBgTm8gYm9vayBmb3IgYnJhbmQgJHtjb2xsYXRlcmFsQnJhbmR9YDtcbmNvbnN0IG9mZmVyU3BlY1NoYXBlPW1ha2VPZmZlclNwZWNTaGFwZShicmFuZHMuQmlkLGNvbGxhdGVyYWxCcmFuZCk7XG4vKipcbiAqIEBwYXJhbSB7WkNGU2VhdH0gemNmU2VhdFxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2F1Y3Rpb25Cb29rLmpzJykuT2ZmZXJTcGVjfSBvZmZlclNwZWNcbiAqL1xuY29uc3QgbmV3QmlkSGFuZGxlcj0oemNmU2VhdCxvZmZlclNwZWMpPT57XG4vKiB4eHggY29uc2lkZXIgaGF2aW5nIFpvZSBndWFyZCB0aGUgb2ZmZXJBcmdzIHdpdGggYSBwcm92aWRlZCBzaGFwZSovXG5tdXN0TWF0Y2gob2ZmZXJTcGVjLG9mZmVyU3BlY1NoYXBlKTtcbmNvbnN0IGF1Y3Rpb25Cb29rPWJvb2tzLmdldChjb2xsYXRlcmFsQnJhbmQpO1xuYXVjdGlvbkJvb2suYWRkT2ZmZXIob2ZmZXJTcGVjLHpjZlNlYXQsaXNBY3RpdmUoKSk7XG5yZXR1cm4nWW91ciBiaWQgaGFzIGJlZW4gYWNjZXB0ZWQnO1xuIH07XG5cbnJldHVybiB6Y2YubWFrZUludml0YXRpb24oXG5uZXdCaWRIYW5kbGVyLFxuJ25ldyBiaWRkaW5nIG9mZmVyJyxcbnt9LFxuYmlkZGluZ1Byb3Bvc2FsU2hhcGUpO1xuXG4gfSxcbmdldFNjaGVkdWxlcygpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiBzY2hlZHVsZXIuZ2V0U2NoZWR1bGUoKTtcbiB9LFxuZ2V0U2NoZWR1bGVVcGRhdGVzKCl7XG5yZXR1cm4gc2NoZWR1bGVLaXQuc3Vic2NyaWJlcjtcbiB9LFxuZ2V0Qm9va0RhdGFVcGRhdGVzKGJyYW5kKXtcbnJldHVybiBib29rcy5nZXQoYnJhbmQpLmdldERhdGFVcGRhdGVzKCk7XG4gfSxcbmdldFB1YmxpY1RvcGljcyhicmFuZCl7XG5pZihicmFuZCl7XG5yZXR1cm4gYm9va3MuZ2V0KGJyYW5kKS5nZXRQdWJsaWNUb3BpY3MoKTtcbiB9XG5cbnJldHVybntcbnNjaGVkdWxlOm1ha2VSZWNvcmRlclRvcGljKCdBdWN0aW9uIHNjaGVkdWxlJyxzY2hlZHVsZUtpdCl9O1xuXG4gfSxcbm1ha2VEZXBvc2l0SW52aXRhdGlvbixcbi4uLnBhcmFtc30pKTtcblxuXG5cbmNvbnN0IHNjaGVkdWxlcj1hd2FpdCBFLndoZW4oc2NoZWR1bGVLaXQucmVjb3JkZXJQLChzY2hlZHVsZVJlY29yZGVyKT0+XG5tYWtlU2NoZWR1bGVyKFxuZHJpdmVyLFxudGltZXIsXG4vKiBAdHMtZXhwZWN0LWVycm9yIHR5cGVzIGFyZSBjb3JyZWN0LiBIb3cgdG8gY29udmluY2UgVFM/Ki9cbnBhcmFtcyxcbnRpbWVyQnJhbmQsXG5zY2hlZHVsZVJlY29yZGVyLFxucHVibGljRmFjZXQuZ2V0U3Vic2NyaXB0aW9uKCkpKTtcblxuXG5cbmNvbnN0IGNyZWF0b3JGYWNldD1tYWtlRmFyR292ZXJub3JGYWNldChcbkZhcignQXVjdGlvbmVlciBjcmVhdG9yRmFjZXQnLHtcbi8qKlxuICogQHBhcmFtIHtJc3N1ZXJ9IGlzc3VlclxuICogQHBhcmFtIHtLZXl3b3JkfSBrd2RcbiAqL1xuICAgICAgYXN5bmMgYWRkQnJhbmQoaXNzdWVyLGt3ZCl7XG56Y2YuYXNzZXJ0VW5pcXVlS2V5d29yZChrd2QpO1xuIWJhZ2dhZ2UuaGFzKGt3ZCl8fFxuRmFpbCBgY2Fubm90IGFkZCBicmFuZCB3aXRoIGtleXdvcmQgJHtrd2R9LiBpdCdzIGluIHVzZWA7XG5jb25zdHticmFuZH09YXdhaXQgemNmLnNhdmVJc3N1ZXIoaXNzdWVyLGt3ZCk7XG5cbmNvbnN0IGJvb2tJZD0gYGJvb2ske2Jvb2tDb3VudGVyfWA7XG5ib29rQ291bnRlcis9MTtcbmNvbnN0IGJOb2RlPWF3YWl0IEUocHJpdmF0ZUFyZ3Muc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoYm9va0lkKTtcblxuY29uc3QgbmV3Qm9vaz1hd2FpdCBtYWtlQXVjdGlvbkJvb2soXG5icmFuZHMuQmlkLFxuYnJhbmQsXG5wcmljZUF1dGhvcml0eSxcbmJOb2RlKTtcblxuXG4vKiBUaGVzZSB0aHJlZSBzdG9yZS5pbml0KCkgY2FsbHMgc3VjY2VlZCBvciBmYWlsIGF0b21pY2FsbHkqL1xuZGVwb3NpdHMuaW5pdChicmFuZCxoYXJkZW4oW10pKTtcbmJvb2tzLmluaXQoYnJhbmQsbmV3Qm9vayk7XG5icmFuZFRvS2V5d29yZC5pbml0KGJyYW5kLGt3ZCk7XG4gfSxcbi8qKiBAcmV0dXJucyB7UHJvbWlzZTxYaW1wb3J0KCcuL3NjaGVkdWxlci5qcycpLkZ1bGxTY2hlZHVsZT59ICovXG5nZXRTY2hlZHVsZSgpe1xucmV0dXJuIEUoc2NoZWR1bGVyKS5nZXRTY2hlZHVsZSgpO1xuIH19KSk7XG5cblxuXG5yZXR1cm57cHVibGljRmFjZXQsY3JlYXRvckZhY2V0fTtcbiB9O1xuXG4vKiogQHR5cGVkZWYge0NvbnRyYWN0T2Y8dHlwZW9mIHN0YXJ0Pn0gQXVjdGlvbmVlckNvbnRyYWN0ICovXG4vKiogQHR5cGVkZWYge0F1Y3Rpb25lZXJDb250cmFjdFsncHVibGljRmFjZXQnXX0gQXVjdGlvbmVlclB1YmxpY0ZhY2V0ICovXG4vKiogQHR5cGVkZWYge0F1Y3Rpb25lZXJDb250cmFjdFsnY3JlYXRvckZhY2V0J119IEF1Y3Rpb25lZXJDcmVhdG9yRmFjZXQgKi8kaOKAjV9vbmNlLnN0YXJ0KHN0YXJ0KTtcblxuY29uc3QgICAgICAgIEF1Y3Rpb25QRlNoYXBlPU0ucmVtb3RhYmxlKCdBdWN0aW9uIFB1YmxpYyBGYWNldCcpOyRo4oCNX29uY2UuQXVjdGlvblBGU2hhcGUoQXVjdGlvblBGU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRpc3RyaWJ1dGVQcm9wb3J0aW9uYWxTaGFyZXNXaXRoTGltaXRzIjpbImRpc3RyaWJ1dGVQcm9wb3J0aW9uYWxTaGFyZXNXaXRoTGltaXRzIl0sInN0YXJ0IjpbInN0YXJ0Il0sIkF1Y3Rpb25QRlNoYXBlIjpbIkF1Y3Rpb25QRlNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAELbGWyjFwAAoxcAADcAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL2F1Y3Rpb24vb2ZmZXJCb29rLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiLi9zb3J0ZWRPZmZlcnMuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUHJpY2VCb29rIiwicHJlcGFyZVNjYWxlZEJpZEJvb2siXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50TWF0aCxNLG11c3RNYXRjaCxtYWtlU2NhbGFyQmlnTWFwU3RvcmUscHJlcGFyZUV4b0NsYXNzLHRvQmlkU2NhbGluZ0NvbXBhcmF0b3IsdG9QYXJ0aWFsT2ZmZXJLZXksdG9QcmljZU9mZmVyS2V5LHRvU2NhbGVkUmF0ZU9mZmVyS2V5OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaOKAjV9hKV1dXV0sW1wiLi9zb3J0ZWRPZmZlcnMuanNcIiwgW1tcInRvQmlkU2NhbGluZ0NvbXBhcmF0b3JcIiwgWyRo4oCNX2EgPT4gKHRvQmlkU2NhbGluZ0NvbXBhcmF0b3IgPSAkaOKAjV9hKV1dLFtcInRvUGFydGlhbE9mZmVyS2V5XCIsIFskaOKAjV9hID0+ICh0b1BhcnRpYWxPZmZlcktleSA9ICRo4oCNX2EpXV0sW1widG9QcmljZU9mZmVyS2V5XCIsIFskaOKAjV9hID0+ICh0b1ByaWNlT2ZmZXJLZXkgPSAkaOKAjV9hKV1dLFtcInRvU2NhbGVkUmF0ZU9mZmVyS2V5XCIsIFskaOKAjV9hID0+ICh0b1NjYWxlZFJhdGVPZmZlcktleSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qIG11bHRpcGxlIG9mZmVycyBtaWdodCBiZSBwcm92aWRlZCBhdCB0aGUgc2FtZSB0aW1lIChzaW5jZSB0aGUgdGltZSovXG4vKiBncmFudWxhcml0eSBpcyBsaW1pdGVkIHRvIGJsb2NrcyksIHNvIHdlIGluY3JlbWVudCBhIHNlcXVlbmNlTnVtYmVyIHdpdGggZWFjaCovXG4vKiBvZmZlciBmb3IgdW5pcXVlbmVzcy4qL1xubGV0IGxhdGVzdFNlcXVlbmNlTnVtYmVyPTBuO1xuY29uc3QgbmV4dFNlcXVlbmNlTnVtYmVyPSgpPT57XG5sYXRlc3RTZXF1ZW5jZU51bWJlcis9MW47XG5yZXR1cm4gbGF0ZXN0U2VxdWVuY2VOdW1iZXI7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBzZWF0OiBaQ0ZTZWF0O1xuICogICB3YW50ZWQ6IEFtb3VudDwnbmF0Jz47XG4gKiAgIHNlcU51bTogTmF0VmFsdWU7XG4gKiAgIHJlY2VpdmVkOiBBbW91bnQ8J25hdCc+O1xuICogfSAmIHsgZXhpdEFmdGVyQnV5OiBib29sZWFuIH0gJiAoXG4gKiAgICAgfCB7IGJpZFNjYWxpbmc6IFBhdHRlcm47IHByaWNlOiB1bmRlZmluZWQgfVxuICogICAgIHwgeyBiaWRTY2FsaW5nOiB1bmRlZmluZWQ7IHByaWNlOiBSYXRpbyB9XG4gKiAgICl9IEJpZGRlclJlY29yZFxuICovXG5cbmNvbnN0IFNjYWxlZEJpZEJvb2tTdGF0ZVNoYXBlPWhhcmRlbih7XG5iaWRTY2FsaW5nUGF0dGVybjpNLmFueSgpLFxuY29sbGF0ZXJhbEJyYW5kOk0uYW55KCksXG5yZWNvcmRzOk0uYW55KCl9KTtcblxuXG4vKipcbiAqIFByaWNlcyBpbiB0aGlzIGJvb2sgYXJlIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlIG9mIHRoZSBmdWxsIG9yYWNsZSBwcmljZVxuICogc25hcHNob3QgdGFrZW4gd2hlbiB0aGUgYXVjdGlvbiBzdGFydGVkLiAuNCBpcyA2MCUgb2ZmLiAxLjEgaXMgMTAlIGFib3ZlXG4gKiBwYXIuXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlU2NhbGVkQmlkQm9vaz0oYmFnZ2FnZSk9PlxucHJlcGFyZUV4b0NsYXNzKFxuYmFnZ2FnZSxcbidzY2FsZWRCaWRCb29rJyxcbnVuZGVmaW5lZCxcbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBiaWRTY2FsaW5nUGF0dGVyblxuICogQHBhcmFtIHtCcmFuZH0gY29sbGF0ZXJhbEJyYW5kXG4gKi9cbihiaWRTY2FsaW5nUGF0dGVybixjb2xsYXRlcmFsQnJhbmQpPT4oe1xuYmlkU2NhbGluZ1BhdHRlcm4sXG5jb2xsYXRlcmFsQnJhbmQsXG4vKiogQHR5cGUge01hcFN0b3JlPHN0cmluZywgQmlkZGVyUmVjb3JkPn0gKi9cbnJlY29yZHM6bWFrZVNjYWxhckJpZ01hcFN0b3JlKCdzY2FsZWRCaWRSZWNvcmRzJyx7ZHVyYWJsZTp0cnVlfSl9KSxcblxue1xuLyoqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7UmF0aW99IGJpZFNjYWxpbmdcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gd2FudGVkXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGV4aXRBZnRlckJ1eVxuICovXG5hZGQoc2VhdCxiaWRTY2FsaW5nLHdhbnRlZCxleGl0QWZ0ZXJCdXkpe1xuY29uc3R7YmlkU2NhbGluZ1BhdHRlcm4sY29sbGF0ZXJhbEJyYW5kLHJlY29yZHN9PXRoaXMuc3RhdGU7XG5tdXN0TWF0Y2goYmlkU2NhbGluZyxiaWRTY2FsaW5nUGF0dGVybik7XG5cbmNvbnN0IHNlcU51bT1uZXh0U2VxdWVuY2VOdW1iZXIoKTtcbmNvbnN0IGtleT10b1NjYWxlZFJhdGVPZmZlcktleShiaWRTY2FsaW5nLHNlcU51bSk7XG5jb25zdCBlbXB0eT1BbW91bnRNYXRoLm1ha2VFbXB0eShjb2xsYXRlcmFsQnJhbmQpO1xuLyoqIEB0eXBlIHtCaWRkZXJSZWNvcmR9ICovXG5jb25zdCBiaWRkZXJSZWNvcmQ9e1xuYmlkU2NhbGluZyxcbnByaWNlOnVuZGVmaW5lZCxcbnJlY2VpdmVkOmVtcHR5LFxuc2VhdCxcbnNlcU51bSxcbndhbnRlZCxcbmV4aXRBZnRlckJ1eX07XG5cbnJlY29yZHMuaW5pdChrZXksaGFyZGVuKGJpZGRlclJlY29yZCkpO1xucmV0dXJuIGtleTtcbiB9LFxuLyoqIEBwYXJhbSB7UmF0aW99IGJpZFNjYWxpbmcgKi9cbm9mZmVyc0Fib3ZlKGJpZFNjYWxpbmcpe1xuY29uc3R7cmVjb3Jkc309dGhpcy5zdGF0ZTtcbnJldHVyblsuLi5yZWNvcmRzLmVudHJpZXMoTS5ndGUodG9CaWRTY2FsaW5nQ29tcGFyYXRvcihiaWRTY2FsaW5nKSkpXTtcbiB9LFxuaGFzT3JkZXJzKCl7XG5jb25zdHtyZWNvcmRzfT10aGlzLnN0YXRlO1xucmV0dXJuIHJlY29yZHMuZ2V0U2l6ZSgpPjA7XG4gfSxcbmRlbGV0ZShrZXkpe1xuY29uc3R7cmVjb3Jkc309dGhpcy5zdGF0ZTtcbnJlY29yZHMuZGVsZXRlKGtleSk7XG4gfSxcbnVwZGF0ZVJlY2VpdmVkKGtleSxzb2xkKXtcbmNvbnN0e3JlY29yZHN9PXRoaXMuc3RhdGU7XG5jb25zdCBvbGRSZWM9cmVjb3Jkcy5nZXQoa2V5KTtcbnJlY29yZHMuc2V0KFxua2V5LFxuaGFyZGVuKHtcbi4uLm9sZFJlYyxcbnJlY2VpdmVkOkFtb3VudE1hdGguYWRkKG9sZFJlYy5yZWNlaXZlZCxzb2xkKX0pKTtcblxuXG4gfSxcbmV4aXRBbGxTZWF0cygpe1xuY29uc3R7cmVjb3Jkc309dGhpcy5zdGF0ZTtcbmZvcihjb25zdFtrZXkse3NlYXR9XW9mIHJlY29yZHMuZW50cmllcygpKXtcbmlmKCFzZWF0Lmhhc0V4aXRlZCgpKXtcbnNlYXQuZXhpdCgpO1xucmVjb3Jkcy5kZWxldGUoa2V5KTtcbiB9XG4gfVxuIH19LFxuXG57XG5zdGF0ZVNoYXBlOlNjYWxlZEJpZEJvb2tTdGF0ZVNoYXBlfSk7JGjigI1fb25jZS5wcmVwYXJlU2NhbGVkQmlkQm9vayhwcmVwYXJlU2NhbGVkQmlkQm9vayk7XG5cblxuXG5jb25zdCBQcmljZUJvb2tTdGF0ZVNoYXBlPWhhcmRlbih7XG5wcmljZVJhdGlvUGF0dGVybjpNLmFueSgpLFxuY29sbGF0ZXJhbEJyYW5kOk0uYW55KCksXG5yZWNvcmRzOk0uYW55KCl9KTtcblxuXG4vKipcbiAqIFByaWNlcyBpbiB0aGlzIGJvb2sgYXJlIGFjdHVhbCBwcmljZXMgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGJpZCBhbW91bnQgYW5kXG4gKiBjb2xsYXRlcmFsIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVQcmljZUJvb2s9KGJhZ2dhZ2UpPT5cbnByZXBhcmVFeG9DbGFzcyhcbmJhZ2dhZ2UsXG4ncHJpY2VCb29rJyxcbnVuZGVmaW5lZCxcbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBwcmljZVJhdGlvUGF0dGVyblxuICogQHBhcmFtIHtCcmFuZH0gY29sbGF0ZXJhbEJyYW5kXG4gKi9cbihwcmljZVJhdGlvUGF0dGVybixjb2xsYXRlcmFsQnJhbmQpPT4oe1xucHJpY2VSYXRpb1BhdHRlcm4sXG5jb2xsYXRlcmFsQnJhbmQsXG4vKiogQHR5cGUge01hcFN0b3JlPHN0cmluZywgQmlkZGVyUmVjb3JkPn0gKi9cbnJlY29yZHM6bWFrZVNjYWxhckJpZ01hcFN0b3JlKCdzY2FsZWRCaWRSZWNvcmRzJyx7ZHVyYWJsZTp0cnVlfSl9KSxcblxue1xuLyoqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7UmF0aW99IHByaWNlXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHdhbnRlZFxuICogQHBhcmFtIHtib29sZWFufSBleGl0QWZ0ZXJCdXlcbiAqL1xuYWRkKHNlYXQscHJpY2Usd2FudGVkLGV4aXRBZnRlckJ1eSl7XG5jb25zdHtwcmljZVJhdGlvUGF0dGVybixjb2xsYXRlcmFsQnJhbmQscmVjb3Jkc309dGhpcy5zdGF0ZTtcbm11c3RNYXRjaChwcmljZSxwcmljZVJhdGlvUGF0dGVybik7XG5cbmNvbnN0IHNlcU51bT1uZXh0U2VxdWVuY2VOdW1iZXIoKTtcbmNvbnN0IGtleT10b1ByaWNlT2ZmZXJLZXkocHJpY2Usc2VxTnVtKTtcbmNvbnN0IGVtcHR5PUFtb3VudE1hdGgubWFrZUVtcHR5KGNvbGxhdGVyYWxCcmFuZCk7XG4vKiogQHR5cGUge0JpZGRlclJlY29yZH0gKi9cbmNvbnN0IGJpZGRlclJlY29yZD17XG5iaWRTY2FsaW5nOnVuZGVmaW5lZCxcbnByaWNlLFxucmVjZWl2ZWQ6ZW1wdHksXG5zZWF0LFxuc2VxTnVtLFxud2FudGVkLFxuZXhpdEFmdGVyQnV5fTtcblxucmVjb3Jkcy5pbml0KGtleSxoYXJkZW4oYmlkZGVyUmVjb3JkKSk7XG5yZXR1cm4ga2V5O1xuIH0sXG5vZmZlcnNBYm92ZShwcmljZSl7XG5jb25zdHtyZWNvcmRzfT10aGlzLnN0YXRlO1xucmV0dXJuWy4uLnJlY29yZHMuZW50cmllcyhNLmd0ZSh0b1BhcnRpYWxPZmZlcktleShwcmljZSkpKV07XG4gfSxcbmhhc09yZGVycygpe1xuY29uc3R7cmVjb3Jkc309dGhpcy5zdGF0ZTtcbnJldHVybiByZWNvcmRzLmdldFNpemUoKT4wO1xuIH0sXG5kZWxldGUoa2V5KXtcbmNvbnN0e3JlY29yZHN9PXRoaXMuc3RhdGU7XG5yZWNvcmRzLmRlbGV0ZShrZXkpO1xuIH0sXG51cGRhdGVSZWNlaXZlZChrZXksc29sZCl7XG5jb25zdHtyZWNvcmRzfT10aGlzLnN0YXRlO1xuY29uc3Qgb2xkUmVjPXJlY29yZHMuZ2V0KGtleSk7XG5yZWNvcmRzLnNldChcbmtleSxcbmhhcmRlbih7XG4uLi5vbGRSZWMsXG5yZWNlaXZlZDpBbW91bnRNYXRoLmFkZChvbGRSZWMucmVjZWl2ZWQsc29sZCl9KSk7XG5cblxuIH0sXG5leGl0QWxsU2VhdHMoKXtcbmNvbnN0e3JlY29yZHN9PXRoaXMuc3RhdGU7XG5mb3IoY29uc3Rba2V5LHtzZWF0fV1vZiByZWNvcmRzLmVudHJpZXMoKSl7XG5pZighc2VhdC5oYXNFeGl0ZWQoKSl7XG5zZWF0LmV4aXQoKTtcbnJlY29yZHMuZGVsZXRlKGtleSk7XG4gfVxuIH1cbiB9fSxcblxue1xuc3RhdGVTaGFwZTpQcmljZUJvb2tTdGF0ZVNoYXBlfSk7JGjigI1fb25jZS5wcmVwYXJlUHJpY2VCb29rKHByZXBhcmVQcmljZUJvb2spO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVTY2FsZWRCaWRCb29rIjpbInByZXBhcmVTY2FsZWRCaWRCb29rIl0sInByZXBhcmVQcmljZUJvb2siOlsicHJlcGFyZVByaWNlQm9vayJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD4MRzglh4AAJYeAAA0AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9hdWN0aW9uL3BhcmFtcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2dvdmVybmFuY2UiLCJAYWdvcmljL3RpbWUiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiQVVDVElPTl9TVEFSVF9ERUxBWSIsIkNMT0NLX1NURVAiLCJESVNDT1VOVF9TVEVQX0JQIiwiSW52aXRhdGlvblNoYXBlIiwiTE9XRVNUX1JBVEVfQlAiLCJQUklDRV9MT0NLX1BFUklPRCIsIlNUQVJUSU5HX1JBVEVfQlAiLCJTVEFSVF9GUkVRVUVOQ1kiLCJhdWN0aW9uZWVyUGFyYW1QYXR0ZXJuIiwiYXVjdGlvbmVlclBhcmFtVHlwZXMiLCJtYWtlQXVjdGlvbmVlclBhcmFtTWFuYWdlciIsIm1ha2VBdWN0aW9uZWVyUGFyYW1zIiwibWFrZUdvdmVybmVkVGVybXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQ09OVFJBQ1RfRUxFQ1RPUkFURSxtYWtlUGFyYW1NYW5hZ2VyLFBhcmFtVHlwZXMsVGltZU1hdGgsUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsTTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2dvdmVybmFuY2VcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIiwgWyRo4oCNX2EgPT4gKENPTlRSQUNUX0VMRUNUT1JBVEUgPSAkaOKAjV9hKV1dLFtcIm1ha2VQYXJhbU1hbmFnZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VQYXJhbU1hbmFnZXIgPSAkaOKAjV9hKV1dLFtcIlBhcmFtVHlwZXNcIiwgWyRo4oCNX2EgPT4gKFBhcmFtVHlwZXMgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lTWF0aFwiLCBbJGjigI1fYSA9PiAoVGltZU1hdGggPSAkaOKAjV9hKV1dLFtcIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnKS5Bc3luY1NwZWNUdXBsZX0gQXN5bmNTcGVjVHVwbGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnKS5TeW5jU3BlY1R1cGxlfSBTeW5jU3BlY1R1cGxlICovXG5cbi8qIFRPRE8gZHVwbGljYXRlZCB3aXRoIHpvZS9zcmMvVHlwZUd1YXJkcy5qcyovXG5jb25zdCAgICAgICAgSW52aXRhdGlvblNoYXBlPU0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uJyk7XG5cbi8qKlxuICogSW4gc2Vjb25kcywgaG93IG9mdGVuIHRvIHN0YXJ0IGFuIGF1Y3Rpb24uIFRoZSBhdWN0aW9uIHdpbGwgc3RhcnQgYXRcbiAqIEFVQ1RJT05fU1RBUlRfREVMQVkgc2Vjb25kcyBhZnRlciBhIG11bHRpcGxlIG9mIFNUQVJUX0ZSRVFVRU5DWSwgd2l0aCB0aGVcbiAqIHByaWNlIGF0IFNUQVJUSU5HX1JBVEVfQlAuIEV2ZXJ5IENMT0NLX1NURVAsIHRoZSBwcmljZSB3aWxsIGJlIHJlZHVjZWQgYnlcbiAqIERJU0NPVU5UX1NURVBfQlAsIGFzIGxvbmcgYXMgdGhlIHJhdGUgaXMgYXQgb3IgYWJvdmUgTE9XRVNUX1JBVEVfQlAsIG9yIHVudGlsXG4gKiBTVEFSVF9GUkVRVUVOQ1kgaGFzIGVsYXBzZWQuXG4gKi8kaOKAjV9vbmNlLkludml0YXRpb25TaGFwZShJbnZpdGF0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIFNUQVJUX0ZSRVFVRU5DWT0nU3RhcnRGcmVxdWVuY3knO1xuLyoqIGluIHNlY29uZHMsIGhvdyBvZnRlbiB0byByZWR1Y2UgdGhlIHByaWNlICovJGjigI1fb25jZS5TVEFSVF9GUkVRVUVOQ1koU1RBUlRfRlJFUVVFTkNZKTtcbmNvbnN0ICAgICAgICBDTE9DS19TVEVQPSdDbG9ja1N0ZXAnO1xuLyoqIGRpc2NvdW50IG9yIG1hcmt1cCBmb3Igc3RhcnRpbmcgcHJpY2UgaW4gYmFzaXMgcG9pbnRzLiA5OTk5ID0gMWJwIGRpc2NvdW50ICovJGjigI1fb25jZS5DTE9DS19TVEVQKENMT0NLX1NURVApO1xuY29uc3QgICAgICAgIFNUQVJUSU5HX1JBVEVfQlA9J1N0YXJ0aW5nUmF0ZSc7XG4vKiogQSBsaW1pdCBiZWxvdyB3aGljaCB0aGUgcHJpY2Ugd2lsbCBub3QgYmUgZGlzY291bnRlZC4gKi8kaOKAjV9vbmNlLlNUQVJUSU5HX1JBVEVfQlAoU1RBUlRJTkdfUkFURV9CUCk7XG5jb25zdCAgICAgICAgTE9XRVNUX1JBVEVfQlA9J0xvd2VzdFJhdGUnO1xuLyoqIGFtb3VudCB0byByZWR1Y2UgcHJpY2VzIGVhY2ggdGltZSBzdGVwIGluIGJwLCBhcyAlIG9mIHRoZSBzdGFydCBwcmljZSAqLyRo4oCNX29uY2UuTE9XRVNUX1JBVEVfQlAoTE9XRVNUX1JBVEVfQlApO1xuY29uc3QgICAgICAgIERJU0NPVU5UX1NURVBfQlA9J0Rpc2NvdW50U3RlcCc7XG4vKipcbiAqIFZhdWx0TWFuYWdlcnMgbGlxdWlkYXRlIHZhdWx0cyBhdCBhIGZyZXF1ZW5jeSBjb25maWd1cmVkIGJ5IFNUQVJUX0ZSRVFVRU5DWS5cbiAqIEF1Y3Rpb25zIHN0YXJ0IHRoaXMgbG9uZyBhZnRlciB0aGUgaG91ciB0byBnaXZlIHZhdWx0cyB0aW1lIHRvIGZpbmlzaC5cbiAqLyRo4oCNX29uY2UuRElTQ09VTlRfU1RFUF9CUChESVNDT1VOVF9TVEVQX0JQKTtcbmNvbnN0ICAgICAgICBBVUNUSU9OX1NUQVJUX0RFTEFZPSdBdWN0aW9uU3RhcnREZWxheSc7XG5cbi8qIC8vLy8vLy8gdXNlZCBieSBWYXVsdERpcmVjdG9yIC8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG4vKiB0aW1lIGJlZm9yZSBlYWNoIGF1Y3Rpb24gdGhhdCB0aGUgcHJpY2VzIGFyZSBsb2NrZWQuKi8kaOKAjV9vbmNlLkFVQ1RJT05fU1RBUlRfREVMQVkoQVVDVElPTl9TVEFSVF9ERUxBWSk7XG5jb25zdCAgICAgICAgUFJJQ0VfTE9DS19QRVJJT0Q9J1ByaWNlTG9ja1BlcmlvZCc7JGjigI1fb25jZS5QUklDRV9MT0NLX1BFUklPRChQUklDRV9MT0NLX1BFUklPRCk7XG5cbmNvbnN0ICAgICAgICBhdWN0aW9uZWVyUGFyYW1QYXR0ZXJuPU0uc3BsaXRSZWNvcmQoe1xuW0NPTlRSQUNUX0VMRUNUT1JBVEVdOkludml0YXRpb25TaGFwZSxcbltTVEFSVF9GUkVRVUVOQ1ldOlJlbGF0aXZlVGltZVJlY29yZFNoYXBlLFxuW0NMT0NLX1NURVBdOlJlbGF0aXZlVGltZVJlY29yZFNoYXBlLFxuW1NUQVJUSU5HX1JBVEVfQlBdOk0ubmF0KCksXG5bTE9XRVNUX1JBVEVfQlBdOk0ubmF0KCksXG5bRElTQ09VTlRfU1RFUF9CUF06TS5uYXQoKSxcbltBVUNUSU9OX1NUQVJUX0RFTEFZXTpSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxcbltQUklDRV9MT0NLX1BFUklPRF06UmVsYXRpdmVUaW1lUmVjb3JkU2hhcGV9KTskaOKAjV9vbmNlLmF1Y3Rpb25lZXJQYXJhbVBhdHRlcm4oYXVjdGlvbmVlclBhcmFtUGF0dGVybik7XG5cblxuY29uc3QgICAgICAgIGF1Y3Rpb25lZXJQYXJhbVR5cGVzPWhhcmRlbih7XG5bQ09OVFJBQ1RfRUxFQ1RPUkFURV06UGFyYW1UeXBlcy5JTlZJVEFUSU9OLFxuW1NUQVJUX0ZSRVFVRU5DWV06UGFyYW1UeXBlcy5SRUxBVElWRV9USU1FLFxuW0NMT0NLX1NURVBdOlBhcmFtVHlwZXMuUkVMQVRJVkVfVElNRSxcbltTVEFSVElOR19SQVRFX0JQXTpQYXJhbVR5cGVzLk5BVCxcbltMT1dFU1RfUkFURV9CUF06UGFyYW1UeXBlcy5OQVQsXG5bRElTQ09VTlRfU1RFUF9CUF06UGFyYW1UeXBlcy5OQVQsXG5bQVVDVElPTl9TVEFSVF9ERUxBWV06UGFyYW1UeXBlcy5SRUxBVElWRV9USU1FLFxuW1BSSUNFX0xPQ0tfUEVSSU9EXTpQYXJhbVR5cGVzLlJFTEFUSVZFX1RJTUV9KTtcblxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF1Y3Rpb25QYXJhbXNcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCdzZXQnPn0gRWxlY3RvcmF0ZUludml0YXRpb25BbW91bnRcbiAqIEBwcm9wZXJ0eSB7UmVsYXRpdmVUaW1lfSBTdGFydEZyZXF1ZW5jeVxuICogQHByb3BlcnR5IHtSZWxhdGl2ZVRpbWV9IENsb2NrU3RlcFxuICogQHByb3BlcnR5IHtiaWdpbnR9IFN0YXJ0aW5nUmF0ZVxuICogQHByb3BlcnR5IHtiaWdpbnR9IExvd2VzdFJhdGVcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBEaXNjb3VudFN0ZXBcbiAqIEBwcm9wZXJ0eSB7UmVsYXRpdmVUaW1lfSBBdWN0aW9uU3RhcnREZWxheVxuICogQHByb3BlcnR5IHtSZWxhdGl2ZVRpbWV9IFByaWNlTG9ja1BlcmlvZFxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJCcmFuZH0gVGltZXJCcmFuZFxuICovXG5cbi8qKiBAcGFyYW0ge0F1Y3Rpb25QYXJhbXN9IGluaXRpYWwgKi8kaOKAjV9vbmNlLmF1Y3Rpb25lZXJQYXJhbVR5cGVzKGF1Y3Rpb25lZXJQYXJhbVR5cGVzKTtcbmNvbnN0ICAgICAgICBtYWtlQXVjdGlvbmVlclBhcmFtcz0oe1xuRWxlY3RvcmF0ZUludml0YXRpb25BbW91bnQsXG5TdGFydEZyZXF1ZW5jeSxcbkNsb2NrU3RlcCxcbkxvd2VzdFJhdGUsXG5TdGFydGluZ1JhdGUsXG5EaXNjb3VudFN0ZXAsXG5BdWN0aW9uU3RhcnREZWxheSxcblByaWNlTG9ja1BlcmlvZCxcblRpbWVyQnJhbmR9KT0+XG57XG5yZXR1cm4gaGFyZGVuKHtcbltDT05UUkFDVF9FTEVDVE9SQVRFXTp7XG50eXBlOlBhcmFtVHlwZXMuSU5WSVRBVElPTixcbnZhbHVlOkVsZWN0b3JhdGVJbnZpdGF0aW9uQW1vdW50fSxcblxuW1NUQVJUX0ZSRVFVRU5DWV06e1xudHlwZTpQYXJhbVR5cGVzLlJFTEFUSVZFX1RJTUUsXG52YWx1ZTpUaW1lTWF0aC5jb2VyY2VSZWxhdGl2ZVRpbWVSZWNvcmQoU3RhcnRGcmVxdWVuY3ksVGltZXJCcmFuZCl9LFxuXG5bQ0xPQ0tfU1RFUF06e1xudHlwZTpQYXJhbVR5cGVzLlJFTEFUSVZFX1RJTUUsXG52YWx1ZTpUaW1lTWF0aC5jb2VyY2VSZWxhdGl2ZVRpbWVSZWNvcmQoQ2xvY2tTdGVwLFRpbWVyQnJhbmQpfSxcblxuW0FVQ1RJT05fU1RBUlRfREVMQVldOntcbnR5cGU6UGFyYW1UeXBlcy5SRUxBVElWRV9USU1FLFxudmFsdWU6VGltZU1hdGguY29lcmNlUmVsYXRpdmVUaW1lUmVjb3JkKEF1Y3Rpb25TdGFydERlbGF5LFRpbWVyQnJhbmQpfSxcblxuW1BSSUNFX0xPQ0tfUEVSSU9EXTp7XG50eXBlOlBhcmFtVHlwZXMuUkVMQVRJVkVfVElNRSxcbnZhbHVlOlRpbWVNYXRoLmNvZXJjZVJlbGF0aXZlVGltZVJlY29yZChQcmljZUxvY2tQZXJpb2QsVGltZXJCcmFuZCl9LFxuXG5bU1RBUlRJTkdfUkFURV9CUF06e3R5cGU6UGFyYW1UeXBlcy5OQVQsdmFsdWU6U3RhcnRpbmdSYXRlfSxcbltMT1dFU1RfUkFURV9CUF06e3R5cGU6UGFyYW1UeXBlcy5OQVQsdmFsdWU6TG93ZXN0UmF0ZX0sXG5bRElTQ09VTlRfU1RFUF9CUF06e3R5cGU6UGFyYW1UeXBlcy5OQVQsdmFsdWU6RGlzY291bnRTdGVwfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VBdWN0aW9uZWVyUGFyYW1zKG1ha2VBdWN0aW9uZWVyUGFyYW1zKTtcbmhhcmRlbihtYWtlQXVjdGlvbmVlclBhcmFtcyk7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL25vdGlmaWVyJykuU3RvcmVkUHVibGlzaGVyS2l0PEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZT59IHB1Ymxpc2hlcktpdFxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtBdWN0aW9uUGFyYW1zfSBpbml0aWFsXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQXVjdGlvbmVlclBhcmFtTWFuYWdlcj0ocHVibGlzaGVyS2l0LHpjZixpbml0aWFsKT0+e1xucmV0dXJuIG1ha2VQYXJhbU1hbmFnZXIoXG5wdWJsaXNoZXJLaXQsXG57XG5bQ09OVFJBQ1RfRUxFQ1RPUkFURV06W1xuUGFyYW1UeXBlcy5JTlZJVEFUSU9OLFxuaW5pdGlhbFtDT05UUkFDVF9FTEVDVE9SQVRFXV0sXG5cbltTVEFSVF9GUkVRVUVOQ1ldOltQYXJhbVR5cGVzLlJFTEFUSVZFX1RJTUUsaW5pdGlhbFtTVEFSVF9GUkVRVUVOQ1ldXSxcbltDTE9DS19TVEVQXTpbUGFyYW1UeXBlcy5SRUxBVElWRV9USU1FLGluaXRpYWxbQ0xPQ0tfU1RFUF1dLFxuW1NUQVJUSU5HX1JBVEVfQlBdOltQYXJhbVR5cGVzLk5BVCxpbml0aWFsW1NUQVJUSU5HX1JBVEVfQlBdXSxcbltMT1dFU1RfUkFURV9CUF06W1BhcmFtVHlwZXMuTkFULGluaXRpYWxbTE9XRVNUX1JBVEVfQlBdXSxcbltESVNDT1VOVF9TVEVQX0JQXTpbUGFyYW1UeXBlcy5OQVQsaW5pdGlhbFtESVNDT1VOVF9TVEVQX0JQXV0sXG5bQVVDVElPTl9TVEFSVF9ERUxBWV06W1xuUGFyYW1UeXBlcy5SRUxBVElWRV9USU1FLFxuaW5pdGlhbFtBVUNUSU9OX1NUQVJUX0RFTEFZXV0sXG5cbltQUklDRV9MT0NLX1BFUklPRF06W1xuUGFyYW1UeXBlcy5SRUxBVElWRV9USU1FLFxuaW5pdGlhbFtQUklDRV9MT0NLX1BFUklPRF1dfSxcblxuXG56Y2YpO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VBdWN0aW9uZWVyUGFyYW1NYW5hZ2VyKG1ha2VBdWN0aW9uZWVyUGFyYW1NYW5hZ2VyKTtcbmhhcmRlbihtYWtlQXVjdGlvbmVlclBhcmFtTWFuYWdlcik7XG5cbi8qKlxuICogQHBhcmFtIHt7IHN0b3JhZ2VOb2RlOiBFUmVmPFN0b3JhZ2VOb2RlPjsgbWFyc2hhbGxlcjogRVJlZjxNYXJzaGFsbGVyPiB9fSBjYXBzXG4gKiBAcGFyYW0ge0VSZWY8VGltZXI+fSB0aW1lclxuICogQHBhcmFtIHtFUmVmPFByaWNlQXV0aG9yaXR5Pn0gcHJpY2VBdXRob3JpdHlcbiAqIEBwYXJhbSB7RVJlZjxBc3NldFJlc2VydmVQdWJsaWNGYWNldD59IHJlc2VydmVQdWJsaWNGYWNldFxuICogQHBhcmFtIHtBdWN0aW9uUGFyYW1zfSBwYXJhbXNcbiAqL1xuY29uc3QgICAgICAgIG1ha2VHb3Zlcm5lZFRlcm1zPShcbntzdG9yYWdlTm9kZTpfc3RvcmFnZU5vZGUsbWFyc2hhbGxlcjpfbWFyc2hhbGxlcn0sXG50aW1lcixcbnByaWNlQXV0aG9yaXR5LFxucmVzZXJ2ZVB1YmxpY0ZhY2V0LFxucGFyYW1zKT0+XG57XG4vKiBYWFggIHVzZSBzdG9yYWdlTm9kZSBhbmQgTWFyc2hhbGxlciovXG5yZXR1cm4gaGFyZGVuKHtcbnByaWNlQXV0aG9yaXR5LFxucmVzZXJ2ZVB1YmxpY0ZhY2V0LFxudGltZXJTZXJ2aWNlOnRpbWVyLFxuZ292ZXJuZWRQYXJhbXM6bWFrZUF1Y3Rpb25lZXJQYXJhbXMocGFyYW1zKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VHb3Zlcm5lZFRlcm1zKG1ha2VHb3Zlcm5lZFRlcm1zKTtcbmhhcmRlbihtYWtlR292ZXJuZWRUZXJtcyk7XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgbWFrZUF1Y3Rpb25lZXJQYXJhbU1hbmFnZXI+fSBBdWN0aW9uUGFyYW1NYW5hZ2VyICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiSW52aXRhdGlvblNoYXBlIjpbIkludml0YXRpb25TaGFwZSJdLCJTVEFSVF9GUkVRVUVOQ1kiOlsiU1RBUlRfRlJFUVVFTkNZIl0sIkNMT0NLX1NURVAiOlsiQ0xPQ0tfU1RFUCJdLCJTVEFSVElOR19SQVRFX0JQIjpbIlNUQVJUSU5HX1JBVEVfQlAiXSwiTE9XRVNUX1JBVEVfQlAiOlsiTE9XRVNUX1JBVEVfQlAiXSwiRElTQ09VTlRfU1RFUF9CUCI6WyJESVNDT1VOVF9TVEVQX0JQIl0sIkFVQ1RJT05fU1RBUlRfREVMQVkiOlsiQVVDVElPTl9TVEFSVF9ERUxBWSJdLCJQUklDRV9MT0NLX1BFUklPRCI6WyJQUklDRV9MT0NLX1BFUklPRCJdLCJhdWN0aW9uZWVyUGFyYW1QYXR0ZXJuIjpbImF1Y3Rpb25lZXJQYXJhbVBhdHRlcm4iXSwiYXVjdGlvbmVlclBhcmFtVHlwZXMiOlsiYXVjdGlvbmVlclBhcmFtVHlwZXMiXSwibWFrZUF1Y3Rpb25lZXJQYXJhbXMiOlsibWFrZUF1Y3Rpb25lZXJQYXJhbXMiXSwibWFrZUF1Y3Rpb25lZXJQYXJhbU1hbmFnZXIiOlsibWFrZUF1Y3Rpb25lZXJQYXJhbU1hbmFnZXIiXSwibWFrZUdvdmVybmVkVGVybXMiOlsibWFrZUdvdmVybmVkVGVybXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP6LnjpsaAACbGgAAOgAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvYXVjdGlvbi9zY2hlZHVsZU1hdGguanN7ImltcG9ydHMiOlsiQGFnb3JpYy90aW1lIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiXSwiZXhwb3J0cyI6WyJjb21wdXRlUm91bmRUaW1pbmciLCJuZXh0RGVzY2VuZGluZ1N0ZXBUaW1lIiwidGltZVZzU2NoZWR1bGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgVGltZU1hdGgsbmF0U2FmZU1hdGgsYXNzZXJ0QWxsRGVmaW5lZCxtYWtlVHJhY2VyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZU1hdGhcIiwgWyRo4oCNX2EgPT4gKFRpbWVNYXRoID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcIm5hdFNhZmVNYXRoXCIsIFskaOKAjV9hID0+IChuYXRTYWZlTWF0aCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjigI1fYSldXSxbXCJtYWtlVHJhY2VyXCIsIFskaOKAjV9hID0+IChtYWtlVHJhY2VyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7c3VidHJhY3QsbXVsdGlwbHksZmxvb3JEaXZpZGV9PW5hdFNhZmVNYXRoO1xuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCB0cmFjZT1tYWtlVHJhY2VyKCdTTWF0aCcsdHJ1ZSk7XG5cbmNvbnN0IHN1YnRyYWN0MT0ocmVsVGltZSk9PlxuVGltZU1hdGguc3VidHJhY3RSZWxSZWwoXG5yZWxUaW1lLFxuVGltZU1hdGguY29lcmNlUmVsYXRpdmVUaW1lUmVjb3JkKDFuLHJlbFRpbWUudGltZXJCcmFuZCkpO1xuXG5cbi8qKlxuICogVGhlIGxlbmd0aCBvZiB0aGUgYXVjdGlvbiBoYXMgdG8gYmUgaW5mZXJyZWQgZnJvbSB0aGUgZ292ZXJuZWQgcGFyYW1zLlxuICpcbiAqIDEuIFRoZSBhdWN0aW9uIHN0YXJ0cyBieSBvZmZlcmluZyBjb2xsYXRlcmFsIGF0IGEgYFN0YXJ0aW5nUmF0ZWAgKGUuZy4sIDEwNSUpIG9mXG4gKiAgICB0aGUgbWFya2V0IHByaWNlIGF0IGF1Y3Rpb24gc3RhcnQsIGFuZCBjb250aW51ZXMgdW50aWwgaXQgcmVhY2hlcyAob3JcbiAqICAgIHdvdWxkIGV4Y2VlZCBvbiBpdHMgbmV4dCBzdGVwKSBMb3dlc3RSYXRlIChlLmcuLCA2NSUpXG4gKiAyLiBUaGUgb2ZmZXIgcHJpY2UgY2hhbmdlcyBldmVyeSBgQ2xvY2tTdGVwYCBzZWNvbmRzXG4gKiAzLiBUaGUgb2ZmZXIgcHJpY2UgY2hhbmdlcyBieSBgRGlzY291bnRTdGVwYCBhbW91bnQgKGUuZy4sIDUlKSBlYWNoIHN0ZXAgU28gaXRcbiAqICAgIG11c3QgcnVuIGhvd2V2ZXIgbWFueSBgQ2xvY2tTdGVwc2AgYXJlIHJlcXVpcmVkIHRvIGdldCBmcm9tIGBTdGFydGluZ1JhdGVgXG4gKiAgICB0byBgTG93ZXN0UmF0ZWAgY2hhbmdpbmcgYnkgYERpc2NvdW50U3RlcGAgZWFjaCB0aW1lLlxuICpcbiAqIFRoZXJlZm9yZSwgdGhlIGR1cmF0aW9uIGlzIGAoU3RhcnRpbmdSYXRlIC0gTG93ZXN0UmF0ZSkgLyBEaXNjb3VudFN0ZXAgKlxuICogQ2xvY2tTdGVwYC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBpcyB3aGF0J3MgX3NjaGVkdWxlZF8uIE1vcmUgdGhhbiBvbmUgYXVjdGlvbiBjYW4gYmUgcnVubmluZ1xuICogc2ltdWx0YW5lb3VzbHksIGFuZCBzb21lIGNvbmRpdGlvbnMgY2FuIGNhdXNlIHNvbWUgb2YgdGhlIGF1Y3Rpb25zIHRvIHN0b3BcbiAqIHNlbGxpbmcgZWFybHkgKGUuZy4gcmVhY2hpbmcgdGhlaXIgdGFyZ2V0IGRlYnQgdG8gcmFpc2Ugb3Igc2VsbGluZyBhbGwgb2ZcbiAqIHRoZWlyIGNvbGxhdGVyYWwpLlxuICpcbiAqIEBwYXJhbSB7QXdhaXRlZDxYaW1wb3J0KCcuL3BhcmFtcy5qcycpLkF1Y3Rpb25QYXJhbU1hbmFnZXI+fSBwYXJhbXNcbiAqIEBwYXJhbSB7VGltZXN0YW1wfSBiYXNlVGltZVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vc2NoZWR1bGVyLmpzJykuU2NoZWR1bGV9XG4gKi9cbmNvbnN0ICAgICAgICBjb21wdXRlUm91bmRUaW1pbmc9KHBhcmFtcyxiYXNlVGltZSk9PntcbmNvbnN0IGZyZXE9cGFyYW1zLmdldFN0YXJ0RnJlcXVlbmN5KCk7XG5jb25zdCBjbG9ja1N0ZXA9cGFyYW1zLmdldENsb2NrU3RlcCgpO1xuY29uc3Qgc3RhcnRpbmdSYXRlPXBhcmFtcy5nZXRTdGFydGluZ1JhdGUoKTtcbmNvbnN0IGRpc2NvdW50U3RlcD1wYXJhbXMuZ2V0RGlzY291bnRTdGVwKCk7XG5jb25zdCBsb2NrUGVyaW9kPXBhcmFtcy5nZXRQcmljZUxvY2tQZXJpb2QoKTtcbmNvbnN0IGxvd2VzdFJhdGU9cGFyYW1zLmdldExvd2VzdFJhdGUoKTtcbmNvbnN0IHN0YXJ0RGVsYXk9cGFyYW1zLmdldEF1Y3Rpb25TdGFydERlbGF5KCk7XG5cblRpbWVNYXRoLmNvbXBhcmVSZWwoZnJlcSxzdGFydERlbGF5KT4wfHxcbkZhaWwgYHN0YXJ0RnJlcXVlbmN5IG11c3QgZXhjZWVkIHN0YXJ0RGVsYXksICR7ZnJlcX0sICR7c3RhcnREZWxheX1gO1xuVGltZU1hdGguY29tcGFyZVJlbChmcmVxLGxvY2tQZXJpb2QpPjB8fFxuRmFpbCBgc3RhcnRGcmVxdWVuY3kgbXVzdCBleGNlZWQgbG9jayBwZXJpb2QsICR7ZnJlcX0sICR7bG9ja1BlcmlvZH1gO1xuVGltZU1hdGguY29tcGFyZVJlbChmcmVxLGNsb2NrU3RlcCk+PTB8fFxuRmFpbCBgY2xvY2tTdGVwICR7VGltZU1hdGgucmVsVmFsdWUoXG5jbG9ja1N0ZXApXG4gfSBtdXN0IGJlIHNob3J0ZXIgdGhhbiBzdGFydEZyZXF1ZW5jeSAke1RpbWVNYXRoLnJlbFZhbHVlKFxuZnJlcSlcbiB9IHRvIGFsbG93IGF0IGxlYXN0IG9uZSBzdGVwIGRvd25gO1xuXG5zdGFydGluZ1JhdGU+bG93ZXN0UmF0ZXx8XG5GYWlsIGBzdGFydGluZ1JhdGUgJHtzdGFydGluZ1JhdGV9IG11c3QgYmUgbW9yZSB0aGFuIGxvd2VzdDogJHtsb3dlc3RSYXRlfWA7XG5cbmNvbnN0IHJhdGVDaGFuZ2U9c3VidHJhY3Qoc3RhcnRpbmdSYXRlLGxvd2VzdFJhdGUpO1xuY29uc3QgcmVxdWVzdGVkU3RlcHM9Zmxvb3JEaXZpZGUocmF0ZUNoYW5nZSxkaXNjb3VudFN0ZXApO1xucmVxdWVzdGVkU3RlcHM+MG58fFxuRmFpbCBgZGlzY291bnRTdGVwICR7ZGlzY291bnRTdGVwfSB0b28gbGFyZ2UgZm9yIHJlcXVlc3RlZCByYXRlc2A7XG5cbi8qIEhvdyBtYW55IHN0ZXBzIGZpdCBpbiBhIGZ1bGwgYXVjdGlvbj8gV2Ugd2FudCB0aGUgYmlnZ2VzdCBpbnRlZ2VyIGZvciB3aGljaCovXG4vKiBzdGVwcyAqIGRpc2NvdW50U3RlcCA8PSBzdGFydGluZ1JhdGUgLSBsb3dlc3RSYXRlLCBhbmQqL1xuLyogc3RlcHMgKiBjbG9ja1N0ZXAgPCBmcmVxKi9cbmNvbnN0IG1heFJhdGVTdGVwcz1mbG9vckRpdmlkZShzdGFydGluZ1JhdGUtbG93ZXN0UmF0ZSxkaXNjb3VudFN0ZXApO1xuY29uc3QgbWF4VGltZVN0ZXBzPVRpbWVNYXRoLmRpdmlkZVJlbFJlbChzdWJ0cmFjdDEoZnJlcSksY2xvY2tTdGVwKTtcbmNvbnN0IHN0ZXBzPW1heFJhdGVTdGVwczxtYXhUaW1lU3RlcHM/bWF4UmF0ZVN0ZXBzOm1heFRpbWVTdGVwcztcblxuY29uc3QgZHVyYXRpb249VGltZU1hdGgubXVsdGlwbHlSZWxOYXQoY2xvY2tTdGVwLHN0ZXBzKTtcbnN0ZXBzPjBufHxcbkZhaWwgYGNsb2NrU3RlcCAke2Nsb2NrU3RlcH0gdG9vIGxvbmcgZm9yIGF1Y3Rpb24gZHVyYXRpb24gJHtkdXJhdGlvbn1gO1xuY29uc3QgZW5kUmF0ZT1zdWJ0cmFjdChzdGFydGluZ1JhdGUsbXVsdGlwbHkoc3RlcHMsZGlzY291bnRTdGVwKSk7XG5cbi8qIFVzZSBhIGR1cmF0aW9uIHRoYXQgZXhhY3RseSBtYXRjaGVzIHRoZSBsYXN0IHN0ZXAgY29tcGxldGluZyAobm8gcmVtYWluZGVyKSovXG5jb25zdCBhY3R1YWxEdXJhdGlvbj1UaW1lTWF0aC5tdWx0aXBseVJlbE5hdChjbG9ja1N0ZXAsc3RlcHMpO1xuLyogY29tcHV0ZWQgc3RhcnQgaXMgYHN0YXJ0RGVsYXkgKyBiYXNlVGltZSArIGZyZXEgLSAoYmFzZVRpbWUgbW9kIGZyZXEpYC4qL1xuLyogVGhhdCBpcywgaWYgdGhlcmUgYXJlIGhvdXJseSBzdGFydHMsIHdlIGFkZCBhbiBob3VyIHRvIHRoZSB0aW1lLCBhbmQqL1xuLyogc3VidHJhY3QgYmFzZVRpbWUgbW9kIGZyZXEuIFRoZW4gd2UgYWRkIHRoZSBkZWxheS4qL1xuLyoqIEB0eXBlIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wUmVjb3JkfSAqL1xuY29uc3Qgc3RhcnRUaW1lPVRpbWVNYXRoLmFkZEFic1JlbChcblRpbWVNYXRoLmFkZEFic1JlbChcbmJhc2VUaW1lLFxuVGltZU1hdGguc3VidHJhY3RSZWxSZWwoZnJlcSxUaW1lTWF0aC5tb2RBYnNSZWwoYmFzZVRpbWUsZnJlcSkpKSxcblxuc3RhcnREZWxheSk7XG5cbmNvbnN0IGVuZFRpbWU9VGltZU1hdGguYWRkQWJzUmVsKHN0YXJ0VGltZSxhY3R1YWxEdXJhdGlvbik7XG5jb25zdCBsb2NrVGltZT1UaW1lTWF0aC5zdWJ0cmFjdEFic1JlbChzdGFydFRpbWUsbG9ja1BlcmlvZCk7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi9zY2hlZHVsZXIuanMnKS5TY2hlZHVsZX0gKi9cbmNvbnN0IG5leHQ9e1xuc3RhcnRUaW1lLFxuZW5kVGltZSxcbnN0ZXBzLFxuZW5kUmF0ZSxcbnN0YXJ0RGVsYXksXG5jbG9ja1N0ZXAsXG5sb2NrVGltZX07XG5cbnJldHVybiBoYXJkZW4obmV4dCk7XG4gfTskaOKAjV9vbmNlLmNvbXB1dGVSb3VuZFRpbWluZyhjb21wdXRlUm91bmRUaW1pbmcpO1xuaGFyZGVuKGNvbXB1dGVSb3VuZFRpbWluZyk7XG5cbi8qKlxuICogQ2FsY3VsYXRlIHdoZW4gdGhlIG5leHQgZGVzY2VuZGluZyBzdGVwIHdpbGwgc3RhcnQuIElmIHdlJ3JlIGJldHdlZW4gYXVjdGlvbnNcbiAqIChpLmUuIGxpdmVTY2hlZHVsZSBpcyB1bmRlZmluZWQpLCBvciB0aGUgbGFzdCBzdGVwIG9mIHRoZSBjdXJyZW50IGF1Y3Rpb24gaGFzXG4gKiBzdGFydGVkLCB0aGVuIGl0J2xsIGJlIG5leHRTY2hlZHVsZS5zdGFydFRpbWUuIE90aGVyd2lzZSwgaXQncyB0aGUgc3RhcnQgb2ZcbiAqIHRoZSBzdGVwIGZvbGxvd2luZyB0aGUgY3VycmVudCBzdGVwLlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9zY2hlZHVsZXIuanMnKS5TY2hlZHVsZSB8IG51bGx9IGxpdmVTY2hlZHVsZVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3NjaGVkdWxlci5qcycpLlNjaGVkdWxlIHwgbnVsbH0gbmV4dFNjaGVkdWxlXG4gKiBAcGFyYW0ge1RpbWVzdGFtcH0gbm93XG4gKiBAcmV0dXJucyB7VGltZXN0YW1wIHwgbnVsbH1cbiAqL1xuY29uc3QgICAgICAgIG5leHREZXNjZW5kaW5nU3RlcFRpbWU9KGxpdmVTY2hlZHVsZSxuZXh0U2NoZWR1bGUsbm93KT0+e1xuaWYoIWxpdmVTY2hlZHVsZSl7XG5yZXR1cm4gbmV4dFNjaGVkdWxlPy5zdGFydFRpbWV8fG51bGw7XG4gfVxuXG5jb25zdHtzdGFydFRpbWUsZW5kVGltZSxjbG9ja1N0ZXB9PWxpdmVTY2hlZHVsZTtcbnRyYWNlKCdjYWxjJyxzdGFydFRpbWUsbm93KTtcbmlmKFRpbWVNYXRoLmNvbXBhcmVBYnMoc3RhcnRUaW1lLG5vdyk+MCl7XG5yZXR1cm4gc3RhcnRUaW1lO1xuIH1cblxuY29uc3QgZWxhcHNlZD1UaW1lTWF0aC5zdWJ0cmFjdEFic0Ficyhub3csc3RhcnRUaW1lKTtcbmNvbnN0IHNpbmNlTGFzdFN0ZXA9VGltZU1hdGgubW9kUmVsUmVsKGVsYXBzZWQsY2xvY2tTdGVwKTtcbmNvbnN0IGxhc3RTdGVwU3RhcnQ9VGltZU1hdGguc3VidHJhY3RBYnNSZWwobm93LHNpbmNlTGFzdFN0ZXApO1xuY29uc3QgZXhwZWN0ZWROZXh0PVRpbWVNYXRoLmFkZEFic1JlbChsYXN0U3RlcFN0YXJ0LGNsb2NrU3RlcCk7XG5cbmlmKFRpbWVNYXRoLmNvbXBhcmVBYnMoZXhwZWN0ZWROZXh0LGVuZFRpbWUpPjApe1xucmV0dXJuIG5leHRTY2hlZHVsZT8uc3RhcnRUaW1lfHxudWxsO1xuIH1cblxucmV0dXJuIGV4cGVjdGVkTmV4dDtcbiB9OyRo4oCNX29uY2UubmV4dERlc2NlbmRpbmdTdGVwVGltZShuZXh0RGVzY2VuZGluZ1N0ZXBUaW1lKTtcbmhhcmRlbihuZXh0RGVzY2VuZGluZ1N0ZXBUaW1lKTtcblxuLyoqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcH0gdGltZVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3NjaGVkdWxlci5qcycpLlNjaGVkdWxlfSBzY2hlZHVsZVxuICogQHJldHVybnMgeydiZWZvcmUnIHwgJ2R1cmluZycgfCAnZW5kRXhhY3RseScgfCAnYWZ0ZXInfVxuICovXG5jb25zdCAgICAgICAgdGltZVZzU2NoZWR1bGU9KHRpbWUsc2NoZWR1bGUpPT57XG5jb25zdHtzdGFydFRpbWUsZW5kVGltZX09c2NoZWR1bGU7XG5hc3NlcnRBbGxEZWZpbmVkKHtzdGFydFRpbWUsZW5kVGltZX0pO1xuXG5pZihUaW1lTWF0aC5jb21wYXJlQWJzKHRpbWUsc2NoZWR1bGUuc3RhcnRUaW1lKTwwKXtcbnJldHVybidiZWZvcmUnO1xuIH1cbmlmKFRpbWVNYXRoLmNvbXBhcmVBYnModGltZSxzY2hlZHVsZS5lbmRUaW1lKTwwKXtcbnJldHVybidkdXJpbmcnO1xuIH1cbmlmKFRpbWVNYXRoLmNvbXBhcmVBYnModGltZSxzY2hlZHVsZS5lbmRUaW1lKT09PTApe1xucmV0dXJuJ2VuZEV4YWN0bHknO1xuIH1cblxucmV0dXJuJ2FmdGVyJztcbiB9OyRo4oCNX29uY2UudGltZVZzU2NoZWR1bGUodGltZVZzU2NoZWR1bGUpO1xuaGFyZGVuKHRpbWVWc1NjaGVkdWxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb21wdXRlUm91bmRUaW1pbmciOlsiY29tcHV0ZVJvdW5kVGltaW5nIl0sIm5leHREZXNjZW5kaW5nU3RlcFRpbWUiOlsibmV4dERlc2NlbmRpbmdTdGVwVGltZSJdLCJ0aW1lVnNTY2hlZHVsZSI6WyJ0aW1lVnNTY2hlZHVsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD2x4z2fCsAAHwrAAA3AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9hdWN0aW9uL3NjaGVkdWxlci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGFnb3JpYy90aW1lIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiLi91dGlsLmpzIiwiLi9zY2hlZHVsZU1hdGguanMiXSwiZXhwb3J0cyI6WyJtYWtlU2NoZWR1bGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsVGltZU1hdGgsRmFyLG1ha2VUcmFjZXIsb2JzZXJ2ZUl0ZXJhdGlvbixzdWJzY3JpYmVFYWNoLEF1Y3Rpb25TdGF0ZSxtYWtlQ2FuY2VsVG9rZW5NYWtlcixjb21wdXRlUm91bmRUaW1pbmcsbmV4dERlc2NlbmRpbmdTdGVwVGltZSx0aW1lVnNTY2hlZHVsZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZU1hdGhcIiwgWyRo4oCNX2EgPT4gKFRpbWVNYXRoID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm1ha2VUcmFjZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VUcmFjZXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZUl0ZXJhdGlvbiA9ICRo4oCNX2EpXV0sW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3V0aWwuanNcIiwgW1tcIkF1Y3Rpb25TdGF0ZVwiLCBbJGjigI1fYSA9PiAoQXVjdGlvblN0YXRlID0gJGjigI1fYSldXSxbXCJtYWtlQ2FuY2VsVG9rZW5NYWtlclwiLCBbJGjigI1fYSA9PiAobWFrZUNhbmNlbFRva2VuTWFrZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zY2hlZHVsZU1hdGguanNcIiwgW1tcImNvbXB1dGVSb3VuZFRpbWluZ1wiLCBbJGjigI1fYSA9PiAoY29tcHV0ZVJvdW5kVGltaW5nID0gJGjigI1fYSldXSxbXCJuZXh0RGVzY2VuZGluZ1N0ZXBUaW1lXCIsIFskaOKAjV9hID0+IChuZXh0RGVzY2VuZGluZ1N0ZXBUaW1lID0gJGjigI1fYSldXSxbXCJ0aW1lVnNTY2hlZHVsZVwiLCBbJGjigI1fYSA9PiAodGltZVZzU2NoZWR1bGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgdHJhY2U9bWFrZVRyYWNlcignU0NIRUQnLHRydWUpO1xuXG4vKiBJZiB0aGUgc3RhcnRBdWN0aW9uIHdha2V1cCBpcyBubyBtb3JlIHRoYW4gNSBtaW51dGVzIGxhdGUsIGdvIGFoZWFkIHdpdGggaXQuKi9cbmNvbnN0IE1BWF9MQVRFX1RJQ0s9MzAwbjtcblxuLyoqXG4gKiBAZmlsZSBUaGUgc2NoZWR1bGVyIGlzIHByZXN1bWVkIHRvIGJlIHF1aWVzY2VudCBiZXR3ZWVuIGF1Y3Rpb24gcm91bmRzLiBFYWNoXG4gKiAgIEF1Y3Rpb24gcm91bmQgY29uc2lzdHMgb2YgYSBzZXF1ZW5jZSBvZiBzdGVwcyB3aXRoIGRlY3JlYXNpbmcgcHJpY2VzLiBUaGVyZVxuICogICBzaG91bGQgYWx3YXlzIGJlIGEgbmV4dCBzY2hlZHVsZSwgYnV0IGJldHdlZW4gcm91bmRzLCBsaXZlU2NoZWR1bGUgaXNcbiAqICAgbnVsbC5cbiAqXG4gKiAgIFRoZSBsb2NrIHBlcmlvZCB0aGF0IHRoZSBsaXF1aWRhdG9ycyB1c2UgbWlnaHQgc3RhcnQgYmVmb3JlIHRoZSBwcmV2aW91c1xuICogICByb3VuZCBoYXMgZmluaXNoZWQsIHNvIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhlIG5leHQgcm91bmQgZWFjaCB0aW1lIGFuXG4gKiAgIGF1Y3Rpb24gc3RhcnRzLiBUaGlzIG1lYW5zIGlmIHRoZSBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgY2hhbmdlLCBpdCdsbCBiZSBhXG4gKiAgIGZ1bGwgY3ljbGUgYmVmb3JlIHdlIHN3aXRjaC4gT3RoZXJ3aXNlLCB0aGUgdmF1bHRzIHdvdWxkbid0IGtub3cgd2hlbiB0b1xuICogICBzdGFydCB0aGVpciBsb2NrIHBlcmlvZC4gSWYgdGhlIGxvY2sgcGVyaW9kIGZvciB0aGUgbmV4dCBhdWN0aW9uIGhhc24ndFxuICogICBzdGFydGVkIHdoZW4gZWFjaCBhdWNpb24gZW5kcywgd2UgcmVjYWxjdWxhdGUgaXQsIGluIGNhc2UgdGhlIHBhcmFtZXRlcnNcbiAqICAgaGF2ZSBjaGFuZ2VkLlxuICpcbiAqICAgSWYgdGhlIGNsb2NrIHNraXBzIGZvcndhcmQgKGJlY2F1c2Ugb2YgYSBjaGFpbiBoYWx0LCBmb3IgaW5zdGFuY2UpLCB0aGVcbiAqICAgc2NoZWR1bGVyIHdpbGwgdHJ5IHRvIGNsZWFubHkgYW5kIHF1aWNrbHkgZmluaXNoIGFueSByb3VuZCBhbHJlYWR5IGluXG4gKiAgIHByb2dyZXNzLiBJdCB3b3VsZCB0YWtlIGFkZGl0aW9uYWwgd29yayBvbiB0aGUgbWFudWFsIHRpbWVyIHRvIHRlc3QgdGhpc1xuICogICB0aG9yb3VnaGx5LlxuICovXG5cbmNvbnN0IG1ha2VDYW5jZWxUb2tlbj1tYWtlQ2FuY2VsVG9rZW5NYWtlcignc2NoZWR1bGVyJyk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXVjdGlvbkRyaXZlclxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSByZWR1Y2VQcmljZUFuZFRyYWRlXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGZpbmFsaXplXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IHN0YXJ0Um91bmRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gY2FwdHVyZVByaWNlc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2NoZWR1bGVOb3RpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7VGltZXN0YW1wIHwgbnVsbH0gYWN0aXZlU3RhcnRUaW1lIHN0YXJ0IHRpbWUgb2YgY3VycmVudCBhdWN0aW9uIGlmXG4gKiAgIGF1Y3Rpb24gaXMgYWN0aXZlXG4gKiBAcHJvcGVydHkge1RpbWVzdGFtcCB8IG51bGx9IG5leHRTdGFydFRpbWUgc3RhcnQgdGltZSBvZiBuZXh0IGF1Y3Rpb25cbiAqIEBwcm9wZXJ0eSB7VGltZXN0YW1wIHwgbnVsbH0gbmV4dERlc2NlbmRpbmdTdGVwVGltZSB3aGVuIHRoZSBuZXh0IGRlc2NlbmRpbmdcbiAqICAgc3RlcCB3aWxsIHRha2UgcGxhY2VcbiAqL1xuXG5jb25zdCBzYWZlbHlDb21wdXRlUm91bmRUaW1pbmc9KHBhcmFtcyxiYXNlVGltZSk9PntcbnRyeXtcbnJldHVybiBjb21wdXRlUm91bmRUaW1pbmcocGFyYW1zLGJhc2VUaW1lKTtcbiB9Y2F0Y2goZSl7XG5jb25zb2xlLmVycm9yKCfwn5qoIE5vIE5leHQgQXVjdGlvbicsZSk7XG5yZXR1cm4gbnVsbDtcbiB9XG4gfTtcblxuY29uc3Qgbm9taW5hbFN0YXJ0VGltZT0obmV4dFNjaGVkdWxlKT0+XG5UaW1lTWF0aC5zdWJ0cmFjdEFic1JlbChuZXh0U2NoZWR1bGUuc3RhcnRUaW1lLG5leHRTY2hlZHVsZS5zdGFydERlbGF5KTtcblxuLyoqXG4gKiBAcGFyYW0ge0F1Y3Rpb25Ecml2ZXJ9IGF1Y3Rpb25Ecml2ZXJcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVyU2VydmljZX0gdGltZXJcbiAqIEBwYXJhbSB7QXdhaXRlZDxYaW1wb3J0KCcuL3BhcmFtcy5qcycpLkF1Y3Rpb25QYXJhbU1hbmFnZXI+fSBwYXJhbXNcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVyQnJhbmR9IHRpbWVyQnJhbmRcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcycpLlJlY29yZGVyPFNjaGVkdWxlTm90aWZpY2F0aW9uPn0gc2NoZWR1bGVSZWNvcmRlclxuICogQHBhcmFtIHtTdG9yZWRTdWJzY3JpcHRpb248R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gcGFyYW1VcGRhdGVTdWJzY3JpcHRpb25cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTY2hlZHVsZXI9YXN5bmMoXG5hdWN0aW9uRHJpdmVyLFxudGltZXIsXG5wYXJhbXMsXG50aW1lckJyYW5kLFxuc2NoZWR1bGVSZWNvcmRlcixcbnBhcmFtVXBkYXRlU3Vic2NyaXB0aW9uKT0+XG57XG4vKipcbiAqIGxpdmUgdmVyc2lvbiBpcyBkZWZpbmVkIHdoZW4gYW4gYXVjdGlvbiBpcyBhY3RpdmUuXG4gKlxuICogQHR5cGUge1NjaGVkdWxlIHwgbnVsbH1cbiAqL1xubGV0IGxpdmVTY2hlZHVsZT1udWxsO1xuXG4vKiogQHJldHVybnMge1Byb21pc2U8eyBub3c6IFRpbWVzdGFtcDsgbmV4dFNjaGVkdWxlOiBTY2hlZHVsZSB8IG51bGwgfT59ICovXG5jb25zdCBpbml0aWFsaXplTmV4dFNjaGVkdWxlPWFzeW5jKCk9PntcbnJldHVybiBFLndoZW4oXG4vKiBYWFggbWFudWFsVGltZXIgcmV0dXJucyBhIGJpZ2ludCwgbm90IGEgdGltZVJlY29yZC4qL1xuRSh0aW1lcikuZ2V0Q3VycmVudFRpbWVzdGFtcCgpLFxuKG5vdyk9PntcbmNvbnN0IG5leHRTY2hlZHVsZT1zYWZlbHlDb21wdXRlUm91bmRUaW1pbmcoXG5wYXJhbXMsXG5UaW1lTWF0aC5jb2VyY2VUaW1lc3RhbXBSZWNvcmQobm93LHRpbWVyQnJhbmQpKTtcblxucmV0dXJue25vdyxuZXh0U2NoZWR1bGV9O1xuIH0pO1xuXG4gfTtcbmxldHtub3csbmV4dFNjaGVkdWxlfT1hd2FpdCBpbml0aWFsaXplTmV4dFNjaGVkdWxlKCk7XG5jb25zdCBzZXRUaW1lTW9ub3RvbmljYWxseT0odGltZSk9PntcblRpbWVNYXRoLmNvbXBhcmVBYnModGltZSxub3cpPj0wfHxGYWlsIGBUaW1lIG9ubHkgbW92ZXMgZm9yd2FyZGA7XG5ub3c9dGltZTtcbiB9O1xuXG5jb25zdCBzdGVwQ2FuY2VsVG9rZW49bWFrZUNhbmNlbFRva2VuKCk7XG5cbi8qKiBAdHlwZSB7KHR5cGVvZiBBdWN0aW9uU3RhdGUpW2tleW9mIHR5cGVvZiBBdWN0aW9uU3RhdGVdfSAqL1xubGV0IGF1Y3Rpb25TdGF0ZT1BdWN0aW9uU3RhdGUuV0FJVElORztcblxuLyoqXG4gKiBQdWJsaXNoIHRoZSBzY2hlZHVsZS4gVG8gYmUgY2FsbGVkIGFmdGVyIGNsb2NrVGljaygpICh3aGljaCBwcm9jZXNzZXMgYVxuICogZGVzY2VuZGluZyBzdGVwKSBvciB3aGVuIHRoZSBuZXh0IHJvdW5kIGlzIHNjaGVkdWxlZC5cbiAqL1xuY29uc3QgcHVibGlzaFNjaGVkdWxlPSgpPT57XG5jb25zdCBzY2hlZD1oYXJkZW4oe1xuYWN0aXZlU3RhcnRUaW1lOmxpdmVTY2hlZHVsZT8uc3RhcnRUaW1lfHxudWxsLFxubmV4dFN0YXJ0VGltZTpuZXh0U2NoZWR1bGU/LnN0YXJ0VGltZXx8bnVsbCxcbm5leHREZXNjZW5kaW5nU3RlcFRpbWU6bmV4dERlc2NlbmRpbmdTdGVwVGltZShcbmxpdmVTY2hlZHVsZSxcbm5leHRTY2hlZHVsZSxcbm5vdyl9KTtcblxuXG5yZXR1cm4gc2NoZWR1bGVSZWNvcmRlci53cml0ZShzY2hlZCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1NjaGVkdWxlIHwgbnVsbH0gc2NoZWR1bGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBjbG9ja1RpY2s9KHNjaGVkdWxlKT0+e1xudHJhY2UoJ2Nsb2NrVGljaycsc2NoZWR1bGU/LnN0YXJ0VGltZSxub3cpO1xuaWYoIXNjaGVkdWxlKXtcbnJldHVybjtcbiB9XG5cbi8qKiBAdHlwZSB7KCkgPT4gdm9pZH0gKi9cbmNvbnN0IGZpbmlzaEF1Y3Rpb25Sb3VuZD0oKT0+e1xuYXVjdGlvblN0YXRlPUF1Y3Rpb25TdGF0ZS5XQUlUSU5HO1xuYXVjdGlvbkRyaXZlci5maW5hbGl6ZSgpO1xuXG5pZighbmV4dFNjaGVkdWxlKXtcbmNvbnNvbGUuZXJyb3IoXG4n8J+boO+4jyBmaW5pc2hBdWN0aW9uUm91bmQgd2l0aG91dCBzY2hlZHVsaW5nIHRoZSBuZXh0OyByZXBhaXIgd2l0aCBuZXcgYXVjdGlvbmVlciBwYXJhbXMnKTtcblxuIH1cblxubGl2ZVNjaGVkdWxlPW51bGw7XG5cbi8qIEFzeW5jIGJlY2F1c2UgYSByZW1vdGUgY2FsbC4gSW4gcmFyZSBldmVudCBvZiBmYWlsdXJlLCB3YWtldXAgaXMgcm9idXN0LiovXG52b2lkIEUodGltZXIpLmNhbmNlbChzdGVwQ2FuY2VsVG9rZW4pO1xuIH07XG5cbmNvbnN0IGFkdmFuY2VSb3VuZD0oKT0+e1xuaWYoYXVjdGlvblN0YXRlPT09QXVjdGlvblN0YXRlLkFDVElWRSl7XG5hdWN0aW9uRHJpdmVyLnJlZHVjZVByaWNlQW5kVHJhZGUoKTtcbiB9ZWxzZXtcbmF1Y3Rpb25TdGF0ZT1BdWN0aW9uU3RhdGUuQUNUSVZFO1xudHJ5e1xuYXVjdGlvbkRyaXZlci5zdGFydFJvdW5kKCk7XG4vKiBUaGlzIGhhcyBiZWVuIG9ic2VydmVkIHRvIGZhaWwgYmVjYXVzZSBwcmljZXMgaGFkbid0IGJlZW4gbG9ja2VkLiovXG4vKiBUaGlzIG1heSBiZSBhbiBpc3N1ZSBhYm91dCB0aW1pbmcgZHVyaW5nIGNoYWluIHN0YXJ0LXVwLiovXG4gfWNhdGNoKGVycil7XG5jb25zb2xlLmVycm9yKFxuJ1VuYWJsZSB0byBzdGFydCBhdWN0aW9uIGNsZWFubHkuIHNraXBwaW5nIHRoaXMgYXVjdGlvbiByb3VuZC4nLFxuZXJyKTtcblxuIH1cbiB9XG4gfTtcblxuc3dpdGNoKHRpbWVWc1NjaGVkdWxlKG5vdyxzY2hlZHVsZSkpe1xuY2FzZSdiZWZvcmUnOlxuYnJlYWs7XG5jYXNlJ2R1cmluZyc6XG5hZHZhbmNlUm91bmQoKTtcbmJyZWFrO1xuY2FzZSdlbmRFeGFjdGx5Jzpcbi8qIGRvIGJvdGggdGhlIFwiZHVyaW5nXCIgYW5kIFwiYWZ0ZXJcIiBiZWhhdmlvcnMqL1xuYWR2YW5jZVJvdW5kKCk7XG5maW5pc2hBdWN0aW9uUm91bmQoKTtcbmJyZWFrO1xuY2FzZSdhZnRlcic6XG5maW5pc2hBdWN0aW9uUm91bmQoKTtcbmJyZWFrO1xuZGVmYXVsdDpcbkZhaWwgYGludmFsaWQgY2FzZWA7fVxuXG5cbnZvaWQgcHVibGlzaFNjaGVkdWxlKCk7XG4gfTtcblxuLyogc2V0IHdha2V1cHMgZm9yIHRoZSBzdGVwcyBvZiB0aGlzIHJvdW5kKi9cbmNvbnN0IHNjaGVkdWxlRGVzY2VuZGluZ1N0ZXBzPSgpPT57XG5pZighbGl2ZVNjaGVkdWxlKXtcbmNvbnNvbGUuZXJyb3IoJ/Cfmqggc2NoZWR1bGVEZXNjZW5kaW5nU3RlcHMgY2FsbGVkIHdpdGggbm8gbGl2ZVNjaGVkdWxlJyk7XG5yZXR1cm47XG4gfVxuXG5jb25zdHtzdGFydFRpbWV9PWxpdmVTY2hlZHVsZTtcbnRyYWNlKCdTVEFSVCAnLHN0YXJ0VGltZSk7XG5cbmNvbnN0IGRlbGF5RnJvbU5vdz1cblRpbWVNYXRoLmNvbXBhcmVBYnMoc3RhcnRUaW1lLG5vdyk+MD9cblRpbWVNYXRoLnN1YnRyYWN0QWJzQWJzKHN0YXJ0VGltZSxub3cpOlxuVGltZU1hdGguc3VidHJhY3RBYnNBYnMoc3RhcnRUaW1lLHN0YXJ0VGltZSk7XG5cbnRyYWNlKCdzY2hlZHVsZURlc2NlbmRpbmdTdGVwcyByZXBlYXRpbmcnLG5vdyxkZWxheUZyb21Ob3csc3RhcnRUaW1lKTtcblxudm9pZCBFKHRpbWVyKS5yZXBlYXRBZnRlcihcbmRlbGF5RnJvbU5vdyxcbmxpdmVTY2hlZHVsZS5jbG9ja1N0ZXAsXG5GYXIoJ1ByaWNlU3RlcFdha2VyJyx7XG53YWtlKHRpbWUpe1xuc2V0VGltZU1vbm90b25pY2FsbHkodGltZSk7XG50cmFjZSgnd2FrZSBzdGVwJyxub3cpO1xudm9pZCBjbG9ja1RpY2sobGl2ZVNjaGVkdWxlKTtcbiB9fSksXG5cbnN0ZXBDYW5jZWxUb2tlbik7XG5cbiB9O1xuXG4vKiBzY2hlZHVsZSBhIHdha2V1cCBmb3IgdGhlIG5leHQgcm91bmQqL1xuY29uc3Qgc2NoZWR1bGVOZXh0Um91bmQ9KHN0YXJ0KT0+e1xudHJhY2UoIGBuZXh0Um91bmRgLHN0YXJ0KTtcbnZvaWQgRSh0aW1lcikuc2V0V2FrZXVwKFxuc3RhcnQsXG5GYXIoJ1NjaGVkdWxlcldha2VyJyx7XG53YWtlKHRpbWUpe1xuc2V0VGltZU1vbm90b25pY2FsbHkodGltZSk7XG5hdWN0aW9uRHJpdmVyLmNhcHR1cmVQcmljZXMoKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gc3RhcnRBdWN0aW9uKCk7XG4gfX0pKTtcblxuXG52b2lkIHB1Ymxpc2hTY2hlZHVsZSgpO1xuIH07XG5cbmNvbnN0IHJlbGF0aXZlVGltZT0odCk9PlRpbWVNYXRoLmNvZXJjZVJlbGF0aXZlVGltZVJlY29yZCh0LHRpbWVyQnJhbmQpO1xuXG5jb25zdCBzdGFydEF1Y3Rpb249YXN5bmMoKT0+e1xuIWxpdmVTY2hlZHVsZXx8RmFpbCBgY2FuJ3Qgc3RhcnQgYW4gYXVjdGlvbiByb3VuZCB3aGlsZSBvbmUgaXMgYWN0aXZlYDtcblxuaWYoIW5leHRTY2hlZHVsZSl7XG5jb25zb2xlLmVycm9yKFxuYXNzZXJ0LmVycm9yKFggYHRyaWVkIHRvIHN0YXJ0IGF1Y3Rpb24gd2hlbiBub25lIGlzIHNjaGVkdWxlZGApKTtcblxucmV0dXJuO1xuIH1cblxuLyogVGhlIGNsb2NrIHRpY2sgbWF5IGhhdmUgYXJyaXZlZCB0b28gbGF0ZSB0byB0cmlnZ2VyIHRoZSBuZXh0IHNjaGVkdWxlZCovXG4vKiByb3VuZCwgZm9yIGV4YW1wbGUgYmVjYXVzZSBvZiBhIGNoYWluIGhhbHQuICBXaGVuIHRoaXMgaGFwcGVucyB0aGUgb3JhY2xlKi9cbi8qIHF1b3RlIG1heSBvdXQgb2YgZGF0ZSBhbmQgc28gbXVzdCBiZSBpZ25vcmVkLiBSZWNvdmVyIGJ5IHJldHVybmluZyovXG4vKiBkZXBvc2l0cyBhbmQgc2NoZWR1bGluZyB0aGUgbmV4dCByb3VuZC4gSWYgaXQncyBvbmx5IGEgbGl0dGxlIGxhdGUsKi9cbi8qIGNvbnRpbnVlIHdpdGggYXVjdGlvbiwganVzdCBzdGFydGluZyBsYXRlLiovXG5jb25zdCBub21pbmFsU3RhcnQ9bm9taW5hbFN0YXJ0VGltZShuZXh0U2NoZWR1bGUpO1xuaWYoVGltZU1hdGguY29tcGFyZUFicyhub3csbm9taW5hbFN0YXJ0KT4wKXtcbmNvbnN0IGxhdGU9VGltZU1hdGguc3VidHJhY3RBYnNBYnMobm93LG5vbWluYWxTdGFydCk7XG5jb25zdCBtYXhMYXRlPXJlbGF0aXZlVGltZShNQVhfTEFURV9USUNLKTtcblxuaWYoVGltZU1hdGguY29tcGFyZVJlbChsYXRlLG1heExhdGUpPjApe1xuY29uc29sZS53YXJuKFxuIGBBdWN0aW9uIHRpbWUganVtcGVkIHRvICR7cShub3cpfSBiZWZvcmUgbmV4dCBzY2hlZHVsZWQgc3RhcnQgJHtxKFxubmV4dFNjaGVkdWxlLnN0YXJ0VGltZSlcbiB9LiBTa2lwcGluZyB0aGF0IHJvdW5kLmApO1xuXG5uZXh0U2NoZWR1bGU9c2FmZWx5Q29tcHV0ZVJvdW5kVGltaW5nKHBhcmFtcyxub3cpO1xuIH1lbHNle1xuY29uc29sZS53YXJuKCBgQXVjdGlvbiBzdGFydGVkIGxhdGUgYnkgJHtxKGxhdGUpfS4gU3RhcnRpbmcgJHtxKG5vdyl9YCk7XG4gfVxuIH1cblxuaWYoIW5leHRTY2hlZHVsZSl7XG4vKiBub3RoaW5nIG5ldyB0byBzY2hlZHVsZSovXG5yZXR1cm47XG4gfVxuLyogYWN0aXZhdGUgdGhlIG5leHRTY2hlZHVsZSBhcyB0aGUgbGl2ZSBvbmUqL1xuLyogKHJlYWQgaGVyZSBhbmQgaW4gZnVuY3Rpb24gY2FsbHMgYmVsb3cpKi9cbmxpdmVTY2hlZHVsZT1uZXh0U2NoZWR1bGU7XG5zY2hlZHVsZURlc2NlbmRpbmdTdGVwcygpO1xubmV4dFNjaGVkdWxlPXNhZmVseUNvbXB1dGVSb3VuZFRpbWluZyhcbnBhcmFtcyxcblRpbWVNYXRoLmFkZEFic1JlbChsaXZlU2NoZWR1bGUuZW5kVGltZSxyZWxhdGl2ZVRpbWUoMW4pKSk7XG5cblxuaWYobmV4dFNjaGVkdWxlKXtcbnNjaGVkdWxlTmV4dFJvdW5kKG5vbWluYWxTdGFydFRpbWUobmV4dFNjaGVkdWxlKSk7XG4gfWVsc2V7XG5jb25zb2xlLndhcm4oXG4nbm8gbmV4dFNjaGVkdWxlIHNvIGNhbm5vdCBzY2hlZHVsZSBuZXh0IHJvdW5kIG9yIHByaWNlIGNhcHR1cmUnKTtcblxuIH1cbiB9O1xuXG4vKiBpbml0aWFsIHNldHRpbmc6ICBmaXJzdFN0YXJ0IGlzIHN0YXJ0RGVsYXkgYmVmb3JlIG5leHQncyBzdGFydFRpbWUqL1xuY29uc3Qgc3RhcnRTY2hlZHVsaW5nRnJvbVNjcmF0Y2g9KCk9PntcbnRyYWNlKCdzdGFydFNjaGVkdWxpbmdGcm9tU2NyYXRjaCcpO1xuaWYobmV4dFNjaGVkdWxlKXtcbnNjaGVkdWxlTmV4dFJvdW5kKG5vbWluYWxTdGFydFRpbWUobmV4dFNjaGVkdWxlKSk7XG4gfVxuIH07XG5zdGFydFNjaGVkdWxpbmdGcm9tU2NyYXRjaCgpO1xuXG4vKiB3aGVuIGF1Y3Rpb24gcGFyYW1ldGVycyBjaGFuZ2UsIHNjaGVkdWxlIGEgbmV4dCBhdWN0aW9uIGlmIG9uZSBpc24ndCovXG4vKiBhbHJlYWR5IHNjaGVkdWxlZC4qL1xuLyogTkI6IHdoYXQgaXMgYWxyZWFkeSBzY2hlZHVsZWQgKGxpdmUgb3IgbmV4dCkgaXMgdW5hZmZlY3RlZCBieSBwYXJhbSBjaGFuZ2VzKi9cbnZvaWQgb2JzZXJ2ZUl0ZXJhdGlvbihcbnN1YnNjcmliZUVhY2gocGFyYW1VcGRhdGVTdWJzY3JpcHRpb24pLFxuaGFyZGVuKHtcbi8qIE5COiBtYXkgYmUgZmlyZWQgd2l0aCB0aGUgaW5pdGlhbCBwYXJhbXMgYXMgd2VsbCovXG4gICAgICBhc3luYyB1cGRhdGVTdGF0ZShfbmV3U3RhdGUpe1xudHJhY2UoJ3JlY2VpdmVkIHBhcmFtIHVwZGF0ZScsX25ld1N0YXRlKTtcbmF3YWl0IG51bGw7XG5pZighbmV4dFNjaGVkdWxlKXtcbnRyYWNlKCdyZXBhaXJpbmcgbmV4dFNjaGVkdWxlIGFuZCByZXN0YXJ0aW5nJyk7XG4oe25leHRTY2hlZHVsZX09YXdhaXQgaW5pdGlhbGl6ZU5leHRTY2hlZHVsZSgpKTtcbnN0YXJ0U2NoZWR1bGluZ0Zyb21TY3JhdGNoKCk7XG4gfVxuIH19KSk7XG5cblxuXG5yZXR1cm4gRmFyKCdzY2hlZHVsZXInLHtcbmdldFNjaGVkdWxlOigpPT5cbmhhcmRlbih7XG5saXZlQXVjdGlvblNjaGVkdWxlOmxpdmVTY2hlZHVsZSxcbm5leHRBdWN0aW9uU2NoZWR1bGU6bmV4dFNjaGVkdWxlfSksXG5cbmdldEF1Y3Rpb25TdGF0ZTooKT0+YXVjdGlvblN0YXRlfSk7XG5cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNjaGVkdWxlXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXBSZWNvcmR9IHN0YXJ0VGltZVxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wUmVjb3JkfSBlbmRUaW1lXG4gKiBAcHJvcGVydHkge05hdFZhbHVlfSBzdGVwc1xuICogQHByb3BlcnR5IHtOYXRWYWx1ZX0gZW5kUmF0ZVxuICogQHByb3BlcnR5IHtSZWxhdGl2ZVRpbWV9IHN0YXJ0RGVsYXlcbiAqIEBwcm9wZXJ0eSB7UmVsYXRpdmVUaW1lfSBjbG9ja1N0ZXBcbiAqIEBwcm9wZXJ0eSB7VGltZXN0YW1wfSBbbG9ja1RpbWVdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGdWxsU2NoZWR1bGVcbiAqIEBwcm9wZXJ0eSB7U2NoZWR1bGUgfCBudWxsfSBuZXh0QXVjdGlvblNjaGVkdWxlXG4gKiBAcHJvcGVydHkge1NjaGVkdWxlIHwgbnVsbH0gbGl2ZUF1Y3Rpb25TY2hlZHVsZVxuICovJGjigI1fb25jZS5tYWtlU2NoZWR1bGVyKG1ha2VTY2hlZHVsZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTY2hlZHVsZXIiOlsibWFrZVNjaGVkdWxlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADZELsKnBYAAJwWAAA6AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9hdWN0aW9uL3NvcnRlZE9mZmVycy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvZXJ0cCIsIi4uL3ZhdWx0RmFjdG9yeS9zdG9yZVV0aWxzLmpzIl0sImV4cG9ydHMiOlsiZnJvbVByaWNlT2ZmZXJLZXkiLCJmcm9tU2NhbGVkUmF0ZU9mZmVyS2V5IiwidG9CaWRTY2FsaW5nQ29tcGFyYXRvciIsInRvUGFydGlhbE9mZmVyS2V5IiwidG9QcmljZU9mZmVyS2V5IiwidG9TY2FsZWRSYXRlT2ZmZXJLZXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVJhdGlvLHJhdGlvVG9OdW1iZXIsTSxtdXN0TWF0Y2gsUmF0aW9TaGFwZSxkZWNvZGVEYXRhLGVuY29kZURhdGE7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wibWFrZVJhdGlvXCIsIFskaOKAjV9hID0+IChtYWtlUmF0aW8gPSAkaOKAjV9hKV1dLFtcInJhdGlvVG9OdW1iZXJcIiwgWyRo4oCNX2EgPT4gKHJhdGlvVG9OdW1iZXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJSYXRpb1NoYXBlXCIsIFskaOKAjV9hID0+IChSYXRpb1NoYXBlID0gJGjigI1fYSldXV1dLFtcIi4uL3ZhdWx0RmFjdG9yeS9zdG9yZVV0aWxzLmpzXCIsIFtbXCJkZWNvZGVEYXRhXCIsIFskaOKAjV9hID0+IChkZWNvZGVEYXRhID0gJGjigI1fYSldXSxbXCJlbmNvZGVEYXRhXCIsIFskaOKAjV9hID0+IChlbmNvZGVEYXRhID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAZmlsZSB3ZSB1c2UgYSBmbG9hdGluZyBwb2ludCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJpY2Ugb3IgcmF0ZSBhcyB0aGVcbiAqICAgZmlyc3QgcGFydCBvZiB0aGUga2V5IGluIHRoZSBzdG9yZS4gVGhlIHNlY29uZCBwYXJ0IGlzIHRoZSBzZXF1ZW5jZSBudW1iZXJcbiAqICAgb2YgdGhlIGJpZCwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGZvciBzb3J0aW5nLiBXaGVuIHdlIHJldHJpZXZlIG11bHRpcGxlXG4gKiAgIGJpZHMsIGl0J3Mgb25seSBieSBiaWQgdmFsdWUsIHNvIHdlIGRvbid0IGNhcmUgaG93IHRoZSBzZXF1ZW5jZSBudW1iZXJzXG4gKiAgIHNvcnQuXG4gKlxuICogICBXZSB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IGVuY29kZURhdGEgdGFrZXMgYSBwYXNzYWJsZSBhbmQgdHVybnMgaXRcbiAqICAgaW50byBhIHNvcnQga2V5LiBBcnJheXMgb2YgcGFzc2FibGUgZGF0YSBzb3J0IGxpa2UgY29tcG9zaXRlIGtleXMuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gYSBzb3J0IGtleSB0aGF0IHdpbGwgY29tcGFyZSBiYXNlZCBvbmx5IG9uIHByaWNlLiBQcmljZSBpcyB0aGUgcHJlZml4XG4gKiBvZiB0aGUgY29tcGxldGUgc29ydCBrZXksIHdoaWNoIGlzIHN1ZmZpY2llbnQgdG8gZmluZCBvZmZlcnMgYmVsb3cgYSBjdXRvZmYuXG4gKlxuICogQHBhcmFtIHtSYXRpb30gb2ZmZXJQcmljZVxuICovXG5jb25zdCAgICAgICAgdG9QYXJ0aWFsT2ZmZXJLZXk9KG9mZmVyUHJpY2UpPT57XG5hc3NlcnQob2ZmZXJQcmljZSk7XG5jb25zdCBtb3N0U2lnbmlmaWNhbnRQYXJ0PXJhdGlvVG9OdW1iZXIob2ZmZXJQcmljZSk7XG5yZXR1cm4gZW5jb2RlRGF0YShoYXJkZW4oW21vc3RTaWduaWZpY2FudFBhcnQsMG5dKSk7XG4gfTtcblxuLyoqXG4gKiBSZXR1cm4gYSBzb3J0IGtleSB0aGF0IGRpc3Rpbmd1aXNoZXMgYnkgUHJpY2UgYW5kIHNlcXVlbmNlIG51bWJlclxuICpcbiAqIEBwYXJhbSB7UmF0aW99IG9mZmVyUHJpY2UgSVNUL2NvbGxhdGVyYWxcbiAqIEBwYXJhbSB7YmlnaW50fSBzZXF1ZW5jZU51bWJlclxuICogQHJldHVybnMge3N0cmluZ30gbGV4aWNhbGx5IHNvcnRhYmxlIHN0cmluZyBpbiB3aGljaCBoaWdoZXN0IHByaWNlIGlzIGZpcnN0LFxuICogICB0aWVzIHdpbGwgYmUgYnJva2VuIGJ5IHNlcXVlbmNlTnVtYmVyIG9mIG9mZmVyXG4gKi8kaOKAjV9vbmNlLnRvUGFydGlhbE9mZmVyS2V5KHRvUGFydGlhbE9mZmVyS2V5KTtcbmNvbnN0ICAgICAgICB0b1ByaWNlT2ZmZXJLZXk9KG9mZmVyUHJpY2Usc2VxdWVuY2VOdW1iZXIpPT57XG5tdXN0TWF0Y2gob2ZmZXJQcmljZSxSYXRpb1NoYXBlKTtcbm9mZmVyUHJpY2UubnVtZXJhdG9yLmJyYW5kIT09b2ZmZXJQcmljZS5kZW5vbWluYXRvci5icmFuZHx8XG5GYWlsIGBvZmZlciBwcmljZXMgbXVzdCBoYXZlIGRpZmZlcmVudCBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yYDtcbm11c3RNYXRjaChzZXF1ZW5jZU51bWJlcixNLm5hdCgpKTtcblxuY29uc3QgbW9zdFNpZ25pZmljYW50UGFydD1yYXRpb1RvTnVtYmVyKG9mZmVyUHJpY2UpO1xucmV0dXJuIGVuY29kZURhdGEoaGFyZGVuKFttb3N0U2lnbmlmaWNhbnRQYXJ0LHNlcXVlbmNlTnVtYmVyXSkpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGZsb2F0UHJpY2VcbiAqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBudW1CcmFuZFxuICogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IGRlbm9tQnJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSB1c2VEZWNpbWFsc1xuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS50b1ByaWNlT2ZmZXJLZXkodG9QcmljZU9mZmVyS2V5KTtcbmNvbnN0IHByaWNlUmF0aW9Gcm9tRmxvYXQ9KGZsb2F0UHJpY2UsbnVtQnJhbmQsZGVub21CcmFuZCx1c2VEZWNpbWFscyk9PntcbmNvbnN0IGRlbm9taW5hdG9yVmFsdWU9MTAqKnVzZURlY2ltYWxzO1xucmV0dXJuIG1ha2VSYXRpbyhcbkJpZ0ludChNYXRoLnJvdW5kKGZsb2F0UHJpY2UqZGVub21pbmF0b3JWYWx1ZSkpLFxubnVtQnJhbmQsXG5CaWdJbnQoZGVub21pbmF0b3JWYWx1ZSksXG5kZW5vbUJyYW5kKTtcblxuIH07XG5cbmNvbnN0IGJpZFNjYWxpbmdSYXRpb0Zyb21LZXk9KGJpZFNjYWxlRmxvYXQsbnVtQnJhbmQsdXNlRGVjaW1hbHMpPT57XG5jb25zdCBkZW5vbWluYXRvclZhbHVlPTEwKip1c2VEZWNpbWFscztcbnJldHVybiBtYWtlUmF0aW8oXG5CaWdJbnQoTWF0aC5yb3VuZChiaWRTY2FsZUZsb2F0KmRlbm9taW5hdG9yVmFsdWUpKSxcbm51bUJyYW5kLFxuQmlnSW50KGRlbm9taW5hdG9yVmFsdWUpKTtcblxuIH07XG5cbi8qKlxuICogZnJvbVByaWNlT2ZmZXJLZXkgaXMgb25seSB1c2VkIGZvciBkaWFnbm9zdGljcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gbnVtQnJhbmRcbiAqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBkZW5vbUJyYW5kXG4gKiBAcGFyYW0ge251bWJlcn0gdXNlRGVjaW1hbHNcbiAqIEByZXR1cm5zIHtbbm9ybWFsaXplZFByaWNlOiBSYXRpbywgc2VxdWVuY2VOdW1iZXI6IGJpZ2ludF19XG4gKi9cbmNvbnN0ICAgICAgICBmcm9tUHJpY2VPZmZlcktleT0oa2V5LG51bUJyYW5kLGRlbm9tQnJhbmQsdXNlRGVjaW1hbHMpPT57XG5jb25zdFtwcmljZVBhcnQsc2VxdWVuY2VOdW1iZXJQYXJ0XT1kZWNvZGVEYXRhKGtleSk7XG5yZXR1cm5bXG5wcmljZVJhdGlvRnJvbUZsb2F0KHByaWNlUGFydCxudW1CcmFuZCxkZW5vbUJyYW5kLHVzZURlY2ltYWxzKSxcbnNlcXVlbmNlTnVtYmVyUGFydF07XG5cbiB9O1xuXG4vKiogQHR5cGUgeyhyYXRlOiBSYXRpbykgPT4gc3RyaW5nfSAqLyRo4oCNX29uY2UuZnJvbVByaWNlT2ZmZXJLZXkoZnJvbVByaWNlT2ZmZXJLZXkpO1xuY29uc3QgICAgICAgIHRvQmlkU2NhbGluZ0NvbXBhcmF0b3I9KHJhdGUpPT57XG5hc3NlcnQocmF0ZSk7XG5jb25zdCBtb3N0U2lnbmlmaWNhbnRQYXJ0PXJhdGlvVG9OdW1iZXIocmF0ZSk7XG5yZXR1cm4gZW5jb2RlRGF0YShoYXJkZW4oW21vc3RTaWduaWZpY2FudFBhcnQsMG5dKSk7XG4gfTtcblxuLyoqXG4gKiBTb3J0cyBvZmZlcnMgZXhwcmVzc2VkIGFzIHBlcmNlbnRhZ2Ugb2YgdGhlIGN1cnJlbnQgb3JhY2xlIHByaWNlLlxuICpcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGUgZGlzY291bnQvbWFya3VwIHJhdGUgZXhwcmVzc2VkIGFzIGEgcmF0aW8gSVNUL0lTVFxuICogQHBhcmFtIHtiaWdpbnR9IHNlcXVlbmNlTnVtYmVyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBsZXhpY2FsbHkgc29ydGFibGUgc3RyaW5nIGluIHdoaWNoIGhpZ2hlc3QgcHJpY2UgaXMgZmlyc3QsXG4gKiAgIHRpZXMgd2lsbCBiZSBicm9rZW4gYnkgc2VxdWVuY2VOdW1iZXIgb2Ygb2ZmZXJcbiAqLyRo4oCNX29uY2UudG9CaWRTY2FsaW5nQ29tcGFyYXRvcih0b0JpZFNjYWxpbmdDb21wYXJhdG9yKTtcbmNvbnN0ICAgICAgICB0b1NjYWxlZFJhdGVPZmZlcktleT0ocmF0ZSxzZXF1ZW5jZU51bWJlcik9Pntcbm11c3RNYXRjaChyYXRlLFJhdGlvU2hhcGUpO1xucmF0ZS5udW1lcmF0b3IuYnJhbmQ9PT1yYXRlLmRlbm9taW5hdG9yLmJyYW5kfHxcbkZhaWwgYGJpZCBzY2FsaW5nIHJhdGUgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3JgO1xubXVzdE1hdGNoKHNlcXVlbmNlTnVtYmVyLE0ubmF0KCkpO1xuXG5jb25zdCBtb3N0U2lnbmlmaWNhbnRQYXJ0PXJhdGlvVG9OdW1iZXIocmF0ZSk7XG5yZXR1cm4gZW5jb2RlRGF0YShoYXJkZW4oW21vc3RTaWduaWZpY2FudFBhcnQsc2VxdWVuY2VOdW1iZXJdKSk7XG4gfTtcblxuLyoqXG4gKiBmcm9tU2NhbGVkUmF0ZU9mZmVyS2V5IGlzIG9ubHkgdXNlZCBmb3IgZGlhZ25vc3RpY3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSB1c2VEZWNpbWFsc1xuICogQHJldHVybnMge1tub3JtYWxpemVkUHJpY2U6IFJhdGlvLCBzZXF1ZW5jZU51bWJlcjogYmlnaW50XX1cbiAqLyRo4oCNX29uY2UudG9TY2FsZWRSYXRlT2ZmZXJLZXkodG9TY2FsZWRSYXRlT2ZmZXJLZXkpO1xuY29uc3QgICAgICAgIGZyb21TY2FsZWRSYXRlT2ZmZXJLZXk9KGtleSxicmFuZCx1c2VEZWNpbWFscyk9PntcbmNvbnN0W2JpZFNjYWxpbmdQYXJ0LHNlcXVlbmNlTnVtYmVyUGFydF09ZGVjb2RlRGF0YShrZXkpO1xucmV0dXJuW1xuYmlkU2NhbGluZ1JhdGlvRnJvbUtleShiaWRTY2FsaW5nUGFydCxicmFuZCx1c2VEZWNpbWFscyksXG5zZXF1ZW5jZU51bWJlclBhcnRdO1xuXG4gfTskaOKAjV9vbmNlLmZyb21TY2FsZWRSYXRlT2ZmZXJLZXkoZnJvbVNjYWxlZFJhdGVPZmZlcktleSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidG9QYXJ0aWFsT2ZmZXJLZXkiOlsidG9QYXJ0aWFsT2ZmZXJLZXkiXSwidG9QcmljZU9mZmVyS2V5IjpbInRvUHJpY2VPZmZlcktleSJdLCJmcm9tUHJpY2VPZmZlcktleSI6WyJmcm9tUHJpY2VPZmZlcktleSJdLCJ0b0JpZFNjYWxpbmdDb21wYXJhdG9yIjpbInRvQmlkU2NhbGluZ0NvbXBhcmF0b3IiXSwidG9TY2FsZWRSYXRlT2ZmZXJLZXkiOlsidG9TY2FsZWRSYXRlT2ZmZXJLZXkiXSwiZnJvbVNjYWxlZFJhdGVPZmZlcktleSI6WyJmcm9tU2NhbGVkUmF0ZU9mZmVyS2V5Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEAbbJOfCQAAnwkAADIAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL2F1Y3Rpb24vdXRpbC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIkF1Y3Rpb25TdGF0ZSIsImlzU2NhbGVkQmlkUHJpY2VIaWdoZXIiLCJtYWtlQnJhbmRlZFJhdGlvUGF0dGVybiIsIm1ha2VDYW5jZWxUb2tlbk1ha2VyIiwicHJpY2VGcm9tIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VSYXRpb0Zyb21BbW91bnRzLG11bHRpcGx5UmF0aW9zLHJhdGlvR1RFLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzXCIsIFtbXCJtYWtlUmF0aW9Gcm9tQW1vdW50c1wiLCBbJGjigI1fYSA9PiAobWFrZVJhdGlvRnJvbUFtb3VudHMgPSAkaOKAjV9hKV1dLFtcIm11bHRpcGx5UmF0aW9zXCIsIFskaOKAjV9hID0+IChtdWx0aXBseVJhdGlvcyA9ICRo4oCNX2EpXV0sW1wicmF0aW9HVEVcIiwgWyRo4oCNX2EgPT4gKHJhdGlvR1RFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBDb25zdGFudHMgZm9yIEF1Y3Rpb24gU3RhdGUuXG4gKlxuICogQHR5cGUge3sgQUNUSVZFOiAnYWN0aXZlJzsgV0FJVElORzogJ3dhaXRpbmcnIH19XG4gKi9cbmNvbnN0ICAgICAgICBBdWN0aW9uU3RhdGU9e1xuQUNUSVZFOidhY3RpdmUnLFxuV0FJVElORzond2FpdGluZyd9O1xuXG5cbi8qKlxuICogQHBhcmFtIHt7IGJyYW5kOiBCcmFuZDsgdmFsdWU6IFBhdHRlcm4gfX0gbnVtZXJhdG9yQW1vdW50U2hhcGVcbiAqIEBwYXJhbSB7eyBicmFuZDogQnJhbmQ7IHZhbHVlOiBQYXR0ZXJuIH19IGRlbm9taW5hdG9yQW1vdW50U2hhcGVcbiAqLyRo4oCNX29uY2UuQXVjdGlvblN0YXRlKEF1Y3Rpb25TdGF0ZSk7XG5jb25zdCAgICAgICAgbWFrZUJyYW5kZWRSYXRpb1BhdHRlcm49KFxubnVtZXJhdG9yQW1vdW50U2hhcGUsXG5kZW5vbWluYXRvckFtb3VudFNoYXBlKT0+XG57XG5yZXR1cm4gaGFyZGVuKHtcbm51bWVyYXRvcjpudW1lcmF0b3JBbW91bnRTaGFwZSxcbmRlbm9taW5hdG9yOmRlbm9taW5hdG9yQW1vdW50U2hhcGV9KTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gYmlkU2NhbGluZ1xuICogQHBhcmFtIHtSYXRpb30gY3VycmVudFByaWNlXG4gKiBAcGFyYW0ge1JhdGlvfSBvcmFjbGVQcmljZVxuICogQHJldHVybnMge2Jvb2xlYW59IFRSVUUgaWZmIHRoZSBkaXNjb3VudCgvbWFya3VwKSBhcHBsaWVkIHRvIHRoZSBwcmljZSBpc1xuICogICBoaWdoZXIgdGhhbiB0aGUgcXVvdGUuXG4gKi8kaOKAjV9vbmNlLm1ha2VCcmFuZGVkUmF0aW9QYXR0ZXJuKG1ha2VCcmFuZGVkUmF0aW9QYXR0ZXJuKTtcbmNvbnN0ICAgICAgICBpc1NjYWxlZEJpZFByaWNlSGlnaGVyPShiaWRTY2FsaW5nLGN1cnJlbnRQcmljZSxvcmFjbGVQcmljZSk9PlxucmF0aW9HVEUobXVsdGlwbHlSYXRpb3Mob3JhY2xlUHJpY2UsYmlkU2NhbGluZyksY3VycmVudFByaWNlKTtcblxuLyoqIEB0eXBlIHsocXVvdGU6IFByaWNlUXVvdGUpID0+IFJhdGlvfSAqLyRo4oCNX29uY2UuaXNTY2FsZWRCaWRQcmljZUhpZ2hlcihpc1NjYWxlZEJpZFByaWNlSGlnaGVyKTtcbmNvbnN0ICAgICAgICBwcmljZUZyb209KHF1b3RlKT0+XG5tYWtlUmF0aW9Gcm9tQW1vdW50cyhcbnF1b3RlLnF1b3RlQW1vdW50LnZhbHVlWzBdLmFtb3VudE91dCxcbnF1b3RlLnF1b3RlQW1vdW50LnZhbHVlWzBdLmFtb3VudEluKTskaOKAjV9vbmNlLnByaWNlRnJvbShwcmljZUZyb20pO1xuXG5cbmNvbnN0ICAgICAgICBtYWtlQ2FuY2VsVG9rZW5NYWtlcj0obmFtZSk9PntcbmxldCB0b2tlbkNvdW50PTE7XG5cbnJldHVybigpPT5GYXIoIGBjYW5jZWxUb2tlbi0ke25hbWV9LSR7dG9rZW5Db3VudCs9MX1gLHt9KTtcbiB9OyRo4oCNX29uY2UubWFrZUNhbmNlbFRva2VuTWFrZXIobWFrZUNhbmNlbFRva2VuTWFrZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkF1Y3Rpb25TdGF0ZSI6WyJBdWN0aW9uU3RhdGUiXSwibWFrZUJyYW5kZWRSYXRpb1BhdHRlcm4iOlsibWFrZUJyYW5kZWRSYXRpb1BhdHRlcm4iXSwiaXNTY2FsZWRCaWRQcmljZUhpZ2hlciI6WyJpc1NjYWxlZEJpZFByaWNlSGlnaGVyIl0sInByaWNlRnJvbSI6WyJwcmljZUZyb20iXSwibWFrZUNhbmNlbFRva2VuTWFrZXIiOlsibWFrZUNhbmNlbFRva2VuTWFrZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADNR+XjERAAAxEQAANQAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvY29udHJhY3RTdXBwb3J0LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIl0sImV4cG9ydHMiOlsiYWRkU3VidHJhY3QiLCJhbGxFbXB0eSIsImFtb3VudFBhdHRlcm4iLCJhc3NlcnRPbmx5S2V5cyIsImNoZWNrRGVidExpbWl0IiwibWFrZU5hdEFtb3VudFNoYXBlIiwicXVvdGVBc1JhdGlvIiwicmF0aW9QYXR0ZXJuIiwic3VidHJhY3RUb0VtcHR5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudE1hdGgsTSxtYWtlUmF0aW9Gcm9tQW1vdW50czskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzXCIsIFtbXCJtYWtlUmF0aW9Gcm9tQW1vdW50c1wiLCBbJGjigI1fYSA9PiAobWFrZVJhdGlvRnJvbUFtb3VudHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgICAgICAgIGFtb3VudFBhdHRlcm49aGFyZGVuKHticmFuZDpNLnJlbW90YWJsZSgpLHZhbHVlOk0uYW55KCl9KTskaOKAjV9vbmNlLmFtb3VudFBhdHRlcm4oYW1vdW50UGF0dGVybik7XG5jb25zdCAgICAgICAgcmF0aW9QYXR0ZXJuPWhhcmRlbih7XG5udW1lcmF0b3I6YW1vdW50UGF0dGVybixcbmRlbm9taW5hdG9yOmFtb3VudFBhdHRlcm59KTtcblxuXG4vKipcbiAqIEFwcGx5IGEgZGVsdGEgdG8gdGhlIGBiYXNlYCBBbW91bnQsIHdoZXJlIHRoZSBkZWx0YSBpcyByZXByZXNlbnRlZCBhcyBhblxuICogYW1vdW50IHRvIGdhaW4gYW5kIGFuIGFtb3VudCB0byBsb3NlLiBUeXBpY2FsbHkgb25lIG9mIHRob3NlIHdpbGwgYmUgZW1wdHlcbiAqIGJlY2F1c2UgZ2Fpbi9sb3NzIGNvbWVzIGZyb20gdGhlIGdpdmUvd2FudCBmb3IgYSBzcGVjaWZpYyBhc3NldCBvbiBhXG4gKiBwcm9wb3NhbC4gV2UgdXNlIHR3byBBbW91bnRzIGJlY2F1c2UgYW4gQW1vdW50IGNhbm5vdCByZXByZXNlbnQgYSBuZWdhdGl2ZVxuICogbnVtYmVyIChzbyB3ZSB1c2UgYSBcImxvc3NcIiB0aGF0IHdpbGwgYmUgc3VidHJhY3RlZCkuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBiYXNlXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gZ2FpblxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxvc3NcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi8kaOKAjV9vbmNlLnJhdGlvUGF0dGVybihyYXRpb1BhdHRlcm4pO1xuY29uc3QgICAgICAgIGFkZFN1YnRyYWN0PShiYXNlLGdhaW4sbG9zcyk9PlxuQW1vdW50TWF0aC5zdWJ0cmFjdChBbW91bnRNYXRoLmFkZChiYXNlLGdhaW4pLGxvc3MpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBUXG4gKiBAcGFyYW0ge1R9IGxlZnRcbiAqIEBwYXJhbSB7VH0gcmlnaHRcbiAqIEByZXR1cm5zIHtUfVxuICovJGjigI1fb25jZS5hZGRTdWJ0cmFjdChhZGRTdWJ0cmFjdCk7XG5jb25zdCAgICAgICAgc3VidHJhY3RUb0VtcHR5PShsZWZ0LHJpZ2h0KT0+XG5BbW91bnRNYXRoLmlzR1RFKHJpZ2h0LGxlZnQpP1xuLyoqIEB0eXBlIHtUfSAqL0Ftb3VudE1hdGgubWFrZUVtcHR5RnJvbUFtb3VudChsZWZ0KTpcbi8qKiBAdHlwZSB7VH0gKi9BbW91bnRNYXRoLnN1YnRyYWN0KGxlZnQscmlnaHQpO1xuXG4vKipcbiAqIFZlcmlmaWVzIHRoYXQgZXZlcnkga2V5IGluIHRoZSBwcm9wb3NhbCBpcyBpbiB0aGUgcHJvdmlkZWQgbGlzdFxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBrZXlzXG4gKi8kaOKAjV9vbmNlLnN1YnRyYWN0VG9FbXB0eShzdWJ0cmFjdFRvRW1wdHkpO1xuY29uc3QgICAgICAgIGFzc2VydE9ubHlLZXlzPShwcm9wb3NhbCxrZXlzKT0+e1xuLyoqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gY2xhdXNlICovXG5jb25zdCBvbmx5S2V5cz0oY2xhdXNlKT0+XG5PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjbGF1c2UpLmV2ZXJ5KChjKT0+a2V5cy5pbmNsdWRlcyhjKSk7XG5vbmx5S2V5cyhwcm9wb3NhbC5naXZlKXx8RmFpbCBgZXh0cmFuZW91cyB0ZXJtcyBpbiBnaXZlOiAke3Byb3Bvc2FsLmdpdmV9YDtcbm9ubHlLZXlzKHByb3Bvc2FsLndhbnQpfHxGYWlsIGBleHRyYW5lb3VzIHRlcm1zIGluIHdhbnQ6ICR7cHJvcG9zYWwud2FudH1gO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtBbW91bnRbXX0gYW1vdW50c1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmFzc2VydE9ubHlLZXlzKGFzc2VydE9ubHlLZXlzKTtcbmNvbnN0ICAgICAgICBhbGxFbXB0eT0oYW1vdW50cyk9PntcbnJldHVybiBhbW91bnRzLmV2ZXJ5KChhKT0+QW1vdW50TWF0aC5pc0VtcHR5KGEpKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gZGVidExpbWl0XG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHRvdGFsRGVidFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSB0b01pbnRcbiAqIEB0aHJvd3MgaWYgbWludGluZyB3b3VsZCBleGNlZWQgdG90YWwgZGVidFxuICovJGjigI1fb25jZS5hbGxFbXB0eShhbGxFbXB0eSk7XG5jb25zdCAgICAgICAgY2hlY2tEZWJ0TGltaXQ9KGRlYnRMaW1pdCx0b3RhbERlYnQsdG9NaW50KT0+e1xuY29uc3QgZGVidFBvc3Q9QW1vdW50TWF0aC5hZGQodG90YWxEZWJ0LHRvTWludCk7XG5BbW91bnRNYXRoLmlzR1RFKGRlYnRMaW1pdCxkZWJ0UG9zdCl8fFxuRmFpbCBgTWludGluZyAke3EodG9NaW50KX0gcGFzdCAke3EoXG50b3RhbERlYnQpXG4gfSB3b3VsZCBoaXQgdG90YWwgZGVidCBsaW1pdCAke3EoZGVidExpbWl0KX1gO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1ldHJpY3NQdWJsaXNoZXJLaXQ8VD5cbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IG1ldHJpY3NQdWJsaWNhdGlvblxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpcHRpb248VD59IG1ldHJpY3NTdWJzY3JpcHRpb25cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNZXRyaWNzUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IG1ldHJpY3NQdWJsaXNoZXJcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaWJlcjxUPn0gbWV0cmljc1N1YnNjcmliZXJcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kIG11c3QgYmUgYSAnbmF0JyBicmFuZCwgbm90IGNoZWNrZWRcbiAqIEBwYXJhbSB7TmF0VmFsdWV9IFttaW5dXG4gKi8kaOKAjV9vbmNlLmNoZWNrRGVidExpbWl0KGNoZWNrRGVidExpbWl0KTtcbmNvbnN0ICAgICAgICBtYWtlTmF0QW1vdW50U2hhcGU9KGJyYW5kLG1pbik9PlxuaGFyZGVuKHticmFuZCx2YWx1ZTptaW4/TS5ndGUobWluKTpNLm5hdCgpfSk7XG5cbi8qKiBAcGFyYW0ge1BpY2s8UHJpY2VEZXNjcmlwdGlvbiwgJ2Ftb3VudEluJyB8ICdhbW91bnRPdXQnPn0gcXVvdGVBbW91bnQgKi8kaOKAjV9vbmNlLm1ha2VOYXRBbW91bnRTaGFwZShtYWtlTmF0QW1vdW50U2hhcGUpO1xuY29uc3QgICAgICAgIHF1b3RlQXNSYXRpbz0ocXVvdGVBbW91bnQpPT5cbm1ha2VSYXRpb0Zyb21BbW91bnRzKHF1b3RlQW1vdW50LmFtb3VudEluLHF1b3RlQW1vdW50LmFtb3VudE91dCk7JGjigI1fb25jZS5xdW90ZUFzUmF0aW8ocXVvdGVBc1JhdGlvKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhbW91bnRQYXR0ZXJuIjpbImFtb3VudFBhdHRlcm4iXSwicmF0aW9QYXR0ZXJuIjpbInJhdGlvUGF0dGVybiJdLCJhZGRTdWJ0cmFjdCI6WyJhZGRTdWJ0cmFjdCJdLCJzdWJ0cmFjdFRvRW1wdHkiOlsic3VidHJhY3RUb0VtcHR5Il0sImFzc2VydE9ubHlLZXlzIjpbImFzc2VydE9ubHlLZXlzIl0sImFsbEVtcHR5IjpbImFsbEVtcHR5Il0sImNoZWNrRGVidExpbWl0IjpbImNoZWNrRGVidExpbWl0Il0sIm1ha2VOYXRBbW91bnRTaGFwZSI6WyJtYWtlTmF0QW1vdW50U2hhcGUiXSwicXVvdGVBc1JhdGlvIjpbInF1b3RlQXNSYXRpbyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAr1LTjehgAAHoYAAA9AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy92YXVsdEZhY3Rvcnkvc3RvcmVVdGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiXSwiZXhwb3J0cyI6WyJkZWNvZGVEYXRhIiwiZW5jb2RlRGF0YSIsImZyb21WYXVsdEtleSIsIm5vcm1hbGl6ZWRDb2xsUmF0aW8iLCJub3JtYWxpemVkQ29sbFJhdGlvS2V5IiwidG9WYXVsdEtleSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlRGVjb2RlUGFzc2FibGUsbWFrZUVuY29kZVBhc3NhYmxlLGdldEFtb3VudEluLGdldEFtb3VudE91dCxuYXRTYWZlTWF0aCxtYWtlVHJhY2VyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VEZWNvZGVQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZVBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlUGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzXCIsIFtbXCJnZXRBbW91bnRJblwiLCBbJGjigI1fYSA9PiAoZ2V0QW1vdW50SW4gPSAkaOKAjV9hKV1dLFtcImdldEFtb3VudE91dFwiLCBbJGjigI1fYSA9PiAoZ2V0QW1vdW50T3V0ID0gJGjigI1fYSldXSxbXCJuYXRTYWZlTWF0aFwiLCBbJGjigI1fYSA9PiAobmF0U2FmZU1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLCBbJGjigI1fYSA9PiAobWFrZVRyYWNlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHttdWx0aXBseX09bmF0U2FmZU1hdGg7XG5cbmNvbnN0IHRyYWNlPW1ha2VUcmFjZXIoJ1N0b3JlJyx0cnVlKTtcblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUHVyZURhdGF9IFB1cmVEYXRhICovXG5cbi8qKiBAdHlwZWRlZiB7W25vcm1hbGl6ZWRDb2xsYXRlcmFsaXphdGlvbjogbnVtYmVyLCB2YXVsdElkOiBWYXVsdElkXX0gQ29tcG9zaXRlS2V5ICovXG5cbi8qIGBtYWtlRW5jb2RlUGFzc2FibGVgIGhhcyB0aHJlZSBuYW1lZCBvcHRpb25zOiovXG4vKiBgZW5jb2RlUmVtb3RhYmxlYCwgYGVuY29kZUVycm9yYCwgYW5kIGBlbmNvZGVQcm9taXNlYC4qL1xuLyogVGhvc2Ugd2hpY2ggYXJlIG9taXR0ZWQgZGVmYXVsdCB0byBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHRocm93cy4qL1xuLyogU28gYnkgb21pdHRpbmcgYWxsIHRocmVlLCB3ZSBrbm93IHRoYXQqL1xuLyogdGhlIHJlc3VsdGluZyBmdW5jdGlvbiB3aWxsIGVuY29kZSBvbmx5IGBQdXJlRGF0YWAgYXJndW1lbnRzLiovXG4vKipcbiAqIEBwYXJhbSB7UHVyZURhdGF9IGtleVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIGVuY29kZURhdGE9bWFrZUVuY29kZVBhc3NhYmxlKCk7XG5cbi8qIGBtYWtlRGVjb2RlUGFzc2FibGVgIGhhcyB0aHJlZSBuYW1lZCBvcHRpb25zOiovXG4vKiBgZGVjb2RlUmVtb3RhYmxlYCwgYGRlY29kZUVycm9yYCwgYW5kIGBkZWNvZGVQcm9taXNlYC4qL1xuLyogVGhvc2Ugd2hpY2ggYXJlIG9taXR0ZWQgZGVmYXVsdCB0byBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHRocm93cy4qL1xuLyogU28gYnkgb21pdHRpbmcgYWxsIHRocmVlLCB3ZSBrbm93IHRoYXQqL1xuLyogdGhlIHJlc3VsdGluZyBmdW5jdGlvbiB3aWxsIGRlY29kZSBvbmx5IHRvIGBQdXJlRGF0YWAgcmVzdWx0cy4qL1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge1B1cmVEYXRhfVxuICovJGjigI1fb25jZS5lbmNvZGVEYXRhKGVuY29kZURhdGEpO1xuY29uc3QgICAgICAgIGRlY29kZURhdGE9bWFrZURlY29kZVBhc3NhYmxlKCk7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi8kaOKAjV9vbmNlLmRlY29kZURhdGEoZGVjb2RlRGF0YSk7XG5jb25zdCBlbmNvZGVOdW1iZXI9KG4pPT57XG5hc3NlcnQudHlwZW9mKG4sJ251bWJlcicpO1xucmV0dXJuIGVuY29kZURhdGEobik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlTnVtYmVyPShlbmNvZGVkKT0+e1xuY29uc3QgcmVzdWx0PWRlY29kZURhdGEoZW5jb2RlZCk7XG5hc3NlcnQudHlwZW9mKHJlc3VsdCwnbnVtYmVyJyk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qIFR5cGUgYW5ub3RhdGlvbnMgdG8gc3VwcG9ydCBzdGF0aWMgdGVzdGluZyBvZiBhbW91bnQgdmFsdWVzKi9cbi8qKiBAdHlwZWRlZiB7QW1vdW50PCduYXQnPiAmIHsgbm9ybWFsaXplZDogdHJ1ZSB9fSBOb3JtYWxpemVkRGVidCAqL1xuLyoqIEB0eXBlZGVmIHtBbW91bnQ8J25hdCc+ICYgeyBub3JtYWxpemVkOiBmYWxzZSB9fSBBY3R1YWxEZWJ0ICovXG5cbi8qKlxuICogT3ZlcmNvbGxhdGVyYWxpemVkIGFyZSBncmVhdGVyIHRoYW4gb25lLiBUaGUgbW9yZSB1bmRlcmNvbGxhdGVyaXplZCB0aGVcbiAqIHNtYWxsZXIgaW4gWzAtMV0uXG4gKlxuICogQHBhcmFtIHtOb3JtYWxpemVkRGVidH0gbm9ybWFsaXplZERlYnQgbm9ybWFsaXplZCAobm90IGFjdHVhbCkgdG90YWwgZGVidFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBjb2xsYXRlcmFsXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCBjb2xsYXRlcmFsaXphdGlvblJhdGlvPShub3JtYWxpemVkRGVidCxjb2xsYXRlcmFsKT0+e1xuY29uc3QgYz1OdW1iZXIoY29sbGF0ZXJhbC52YWx1ZSk7XG5jb25zdCBkPW5vcm1hbGl6ZWREZWJ0LnZhbHVlP1xuTnVtYmVyKG5vcm1hbGl6ZWREZWJ0LnZhbHVlKTpcbk51bWJlci5FUFNJTE9OO1xucmV0dXJuIGMvZDtcbiB9O1xuXG4vKipcbiAqIFNvcnRzIGJ5IHJhdGlvIGluIGRlc2NlbmRpbmcgZGVidC4gT3JkZXJpbmcgb2YgdmF1bHQgaWQgaXMgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7Tm9ybWFsaXplZERlYnR9IG5vcm1hbGl6ZWREZWJ0IG5vcm1hbGl6ZWQgKG5vdCBhY3R1YWwpIHRvdGFsIGRlYnRcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gY29sbGF0ZXJhbFxuICogQHBhcmFtIHtWYXVsdElkfSB2YXVsdElkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBsZXhpY2FsbHkgc29ydGFibGUgc3RyaW5nIGluIHdoaWNoIGhpZ2hlc3RcbiAqICAgZGVidC10by1jb2xsYXRlcmFsIGlzIGVhcmxpZXN0XG4gKi9cbmNvbnN0ICAgICAgICB0b1ZhdWx0S2V5PShub3JtYWxpemVkRGVidCxjb2xsYXRlcmFsLHZhdWx0SWQpPT57XG5hc3NlcnQobm9ybWFsaXplZERlYnQpO1xuYXNzZXJ0KGNvbGxhdGVyYWwpO1xuYXNzZXJ0KHZhdWx0SWQpO1xuLyogdW50aWwgREIgc3VwcG9ydHMgY29tcG9zaXRlIGtleXMsIGNvcHkgaXRzIG1ldGhvZCBmb3IgdHVybmluZyBudW1iZXJzIHRvIERCKi9cbi8qIGVudHJ5IGtleXMqL1xuY29uc3QgbnVtYmVyUGFydD1lbmNvZGVOdW1iZXIoXG5jb2xsYXRlcmFsaXphdGlvblJhdGlvKG5vcm1hbGl6ZWREZWJ0LGNvbGxhdGVyYWwpKTtcblxuXG50cmFjZSggYFRvIFZhdWx0IEtleSBgLGNvbGxhdGVyYWxpemF0aW9uUmF0aW8obm9ybWFsaXplZERlYnQsY29sbGF0ZXJhbCkpO1xucmV0dXJuIGAke251bWJlclBhcnR9OiR7dmF1bHRJZH1gO1xuIH07JGjigI1fb25jZS50b1ZhdWx0S2V5KHRvVmF1bHRLZXkpO1xuaGFyZGVuKHRvVmF1bHRLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtbbm9ybWFsaXplZENvbGxhdGVyYWxpemF0aW9uOiBudW1iZXIsIHZhdWx0SWQ6IFZhdWx0SWRdfVxuICovXG5jb25zdCAgICAgICAgZnJvbVZhdWx0S2V5PShrZXkpPT57XG5jb25zdFtudW1iZXJQYXJ0LHZhdWx0SWRQYXJ0XT1rZXkuc3BsaXQoJzonKTtcbnJldHVybltkZWNvZGVOdW1iZXIobnVtYmVyUGFydCksdmF1bHRJZFBhcnRdO1xuIH07JGjigI1fb25jZS5mcm9tVmF1bHRLZXkoZnJvbVZhdWx0S2V5KTtcbmhhcmRlbihmcm9tVmF1bHRLZXkpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGZsb2F0IHJlcHJlc2VudGluZyBhIE5vcm1hbGl6ZWQgQ29sbGF0ZXJhbGl6YXRpb24gUmF0aW8gdGhhdCBjYW4gYmVcbiAqIGNvbXBhcmVkIHRvIHRoZSBOQ1JzIG9mIHZhdWx0cy4gV2Ugd2FudCBhIGZsb2F0IHdpdGggYXMgbXVjaCByZXNvbHV0aW9uIGFzIHdlXG4gKiBjYW4gZ2V0LCBzbyB3ZSBtdWx0aXBseSBvdXQgdGhlIG51bWVyYXRvciBhbmQgdGhlIGRlbm9taW5hdG9yLCBhbmQgb25seVxuICogZGl2aWRlIHRoZSByZXN1bHRzIG9uY2UuXG4gKlxuICogRm9yIHVzZSBieSBgbm9ybWFsaXplZENvbGxSYXRpb0tleWAgYW5kIHRlc3RzLlxuICpcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGVcbiAqIEBwYXJhbSB7UmF0aW99IGNvbXBvdW5kZWRJbnRlcmVzdFxuICogQHBhcmFtIHtSYXRpb30gbWFyZ2luXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCAgICAgICAgbm9ybWFsaXplZENvbGxSYXRpbz0ocXVvdGUsY29tcG91bmRlZEludGVyZXN0LG1hcmdpbik9PntcbmNvbnN0IGFtb3VudEluPWdldEFtb3VudEluKHF1b3RlKS52YWx1ZTtcbmNvbnN0IGFtb3VudE91dD1nZXRBbW91bnRPdXQocXVvdGUpLnZhbHVlO1xuY29uc3QgaW50ZXJlc3ROdW1lcmF0b3I9Y29tcG91bmRlZEludGVyZXN0Lm51bWVyYXRvci52YWx1ZTtcbmNvbnN0IGludGVyZXN0QmFzZT1jb21wb3VuZGVkSW50ZXJlc3QuZGVub21pbmF0b3IudmFsdWU7XG5jb25zdCBudW1lcmF0b3I9bXVsdGlwbHkoXG5tYXJnaW4ubnVtZXJhdG9yLnZhbHVlLFxubXVsdGlwbHkoYW1vdW50SW4saW50ZXJlc3ROdW1lcmF0b3IpKTtcblxuY29uc3QgZGVub21pbmF0b3I9bXVsdGlwbHkoXG5hbW91bnRPdXQsXG5tdWx0aXBseShpbnRlcmVzdEJhc2UsbWFyZ2luLmRlbm9taW5hdG9yLnZhbHVlKSk7XG5cblxucmV0dXJuIE51bWJlcihudW1lcmF0b3IpL051bWJlcihkZW5vbWluYXRvcik7XG4gfTskaOKAjV9vbmNlLm5vcm1hbGl6ZWRDb2xsUmF0aW8obm9ybWFsaXplZENvbGxSYXRpbyk7XG5oYXJkZW4obm9ybWFsaXplZENvbGxSYXRpbyk7XG5cbi8qKlxuICogQ3JlYXRlIGEgc29ydCBrZXkgZm9yIGEgbm9ybWFsaXplZCBjb2xsYXRlcmFsaXphdGlvbiByYXRpby4gV2Ugd2FudCB0aGUga2V5XG4gKiB0byBiZSBiYXNlZCBvbiBhIGZsb2F0IHdpdGggYXMgbXVjaCByZXNvbHV0aW9uIGFzIHdlIGNhbiBnZXQsIHNvIHdlIG11bHRpcGx5XG4gKiBvdXQgdGhlIG51bWVyYXRvciBhbmQgdGhlIGRlbm9taW5hdG9yLCBhbmQgZGl2aWRlIG9ubHkgb25jZS5cbiAqXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGV9IHF1b3RlXG4gKiBAcGFyYW0ge1JhdGlvfSBjb21wb3VuZGVkSW50ZXJlc3RcbiAqIEBwYXJhbSB7UmF0aW99IG1hcmdpblxuICogQHJldHVybnMge3N0cmluZ30gbGV4aWNhbGx5IHNvcnRhYmxlIHN0cmluZyBpbiB3aGljaCBoaWdoZXN0XG4gKiAgIGRlYnQtdG8tY29sbGF0ZXJhbCBpcyBlYXJsaWVzdFxuICovXG5jb25zdCAgICAgICAgbm9ybWFsaXplZENvbGxSYXRpb0tleT0ocXVvdGUsY29tcG91bmRlZEludGVyZXN0LG1hcmdpbik9PntcbmNvbnN0IGNvbGxSYXRpbz1ub3JtYWxpemVkQ29sbFJhdGlvKHF1b3RlLGNvbXBvdW5kZWRJbnRlcmVzdCxtYXJnaW4pO1xucmV0dXJuIGAke2VuY29kZU51bWJlcihjb2xsUmF0aW8pfTpgO1xuIH07JGjigI1fb25jZS5ub3JtYWxpemVkQ29sbFJhdGlvS2V5KG5vcm1hbGl6ZWRDb2xsUmF0aW9LZXkpO1xuaGFyZGVuKG5vcm1hbGl6ZWRDb2xsUmF0aW9LZXkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVuY29kZURhdGEiOlsiZW5jb2RlRGF0YSJdLCJkZWNvZGVEYXRhIjpbImRlY29kZURhdGEiXSwidG9WYXVsdEtleSI6WyJ0b1ZhdWx0S2V5Il0sImZyb21WYXVsdEtleSI6WyJmcm9tVmF1bHRLZXkiXSwibm9ybWFsaXplZENvbGxSYXRpbyI6WyJub3JtYWxpemVkQ29sbFJhdGlvIl0sIm5vcm1hbGl6ZWRDb2xsUmF0aW9LZXkiOlsibm9ybWFsaXplZENvbGxSYXRpb0tleSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFZxsEligAAJYoAAAnAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NhbGxiYWNrLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJjYWxsRSIsImNhbGxTeW5jIiwiaXNDYWxsYmFjayIsIm1ha2VGdW5jdGlvbkNhbGxiYWNrIiwibWFrZU1ldGhvZENhbGxiYWNrIiwibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIiwibWFrZVN5bmNNZXRob2RDYWxsYmFjayIsInByZXBhcmVBdHRlbnVhdG9yIiwicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsaXNPYmplY3QsaXNQYXNzYWJsZVN5bWJvbDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJpc1Bhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChpc1Bhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3R7ZnJvbUVudHJpZXN9PU9iamVjdDtcblxuY29uc3R7b3duS2V5czpyYXdPd25LZXlzfT1SZWZsZWN0O1xuY29uc3Qgb3duS2V5cz1cbi8qKiBAdHlwZSB7PFQgZXh0ZW5kcyBQcm9wZXJ0eUtleT4ob2JqOiB7W0sgaW4gVF0/OiB1bmtub3dufSkgPT4gVFtdfSAqL1xucmF3T3duS2V5cztcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8UmV0dXJuVHlwZTxwcmVwYXJlQXR0ZW51YXRvcj4+KSA9PiBGYXJhYmxlPFQ+fSBNYWtlQXR0ZW51YXRvclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IElcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGJhY2s8ST59IENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5TeW5jQ2FsbGJhY2s8ST59IFN5bmNDYWxsYmFja1xuICovXG5cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPiAmIFR9IEZhcmFibGUgKi9cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGtleVxuICogQHJldHVybnMge2tleSBpcyBQcm9wZXJ0eUtleX0gRklYTUU6IHNob3VsZCBiZSBqdXN0IGBQcm9wZXJ0eUtleWAgYnV0IFRTXG4gKiBjb21wbGFpbnMgaXQgY2FuJ3QgYmUgdXNlZCBhcyBhbiBpbmRleCB0eXBlLlxuICovXG5jb25zdCBpc1Byb3BlcnR5S2V5PShrZXkpPT57XG5zd2l0Y2godHlwZW9mIGtleSl7XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ251bWJlcic6XG5jYXNlJ3N5bWJvbCc6XG5yZXR1cm4gdHJ1ZTtcbmRlZmF1bHQ6XG5yZXR1cm4gZmFsc2U7fVxuXG4gfTtcblxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IGNhbGwgYSBjYWxsYmFjay5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHBhcmFtIHtTeW5jQ2FsbGJhY2s8ST59IGNhbGxiYWNrXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPEk+fVxuICovXG5jb25zdCAgICAgICAgY2FsbFN5bmM9KGNhbGxiYWNrLC4uLmFyZ3MpPT57XG5jb25zdHt0YXJnZXQsbWV0aG9kTmFtZSxib3VuZH09Y2FsbGJhY2s7XG5pZihtZXRob2ROYW1lPT09dW5kZWZpbmVkKXtcbnJldHVybiB0YXJnZXQoLi4uYm91bmQsLi4uYXJncyk7XG4gfVxucmV0dXJuIHRhcmdldFttZXRob2ROYW1lXSguLi5ib3VuZCwuLi5hcmdzKTtcbiB9OyRo4oCNX29uY2UuY2FsbFN5bmMoY2FsbFN5bmMpO1xuaGFyZGVuKGNhbGxTeW5jKTtcblxuLyoqXG4gKiBFdmVudHVhbCBzZW5kIHRvIGEgY2FsbGJhY2suXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IElcbiAqIEBwYXJhbSB7Q2FsbGJhY2s8ST59IGNhbGxiYWNrXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8UmV0dXJuVHlwZTxJPj4+fVxuICovXG5jb25zdCAgICAgICAgY2FsbEU9KGNhbGxiYWNrLC4uLmFyZ3MpPT57XG5jb25zdHt0YXJnZXQsbWV0aG9kTmFtZSxib3VuZH09Y2FsbGJhY2s7XG5pZihtZXRob2ROYW1lPT09dW5kZWZpbmVkKXtcbnJldHVybiBFKHRhcmdldCkoLi4uYm91bmQsLi4uYXJncyk7XG4gfVxucmV0dXJuIEUodGFyZ2V0KVttZXRob2ROYW1lXSguLi5ib3VuZCwuLi5hcmdzKTtcbiB9OyRo4oCNX29uY2UuY2FsbEUoY2FsbEUpO1xuaGFyZGVuKGNhbGxFKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgbmVhciBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+fSBbVD1JXVxuICogQHRlbXBsYXRlIHt1bmtub3duW119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2s9KHRhcmdldCwuLi5ib3VuZCk9PntcbnR5cGVvZiB0YXJnZXQ9PT0nZnVuY3Rpb24nfHxcbkZhaWwgYHN5bmMgZnVuY3Rpb24gY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYSBmdW5jdGlvbjogJHt0YXJnZXR9YDtcbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LGJvdW5kLGlzU3luYzp0cnVlfSk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7U3luY0NhbGxiYWNrPEk+fSAqL2NiKTtcbiB9OyRo4oCNX29uY2UubWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgcG90ZW50aWFsbHkgZmFyIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8XG4gKiAgICguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST5cbiAqID59IFtUPVhpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8ST5dXG4gKiBAdGVtcGxhdGUge3Vua25vd25bXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge0NhbGxiYWNrPEk+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUZ1bmN0aW9uQ2FsbGJhY2s9KHRhcmdldCwuLi5ib3VuZCk9PntcbmlzT2JqZWN0KHRhcmdldCl8fFxuRmFpbCBgZnVuY3Rpb24gY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYSBmdW5jdGlvbiBwcmVzZW5jZTogJHt0YXJnZXR9YDtcbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LGJvdW5kfSk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7Q2FsbGJhY2s8ST59ICovY2IpO1xuIH07JGjigI1fb25jZS5tYWtlRnVuY3Rpb25DYWxsYmFjayhtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZUZ1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIG1ldGhvZC5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gUFxuICogQHRlbXBsYXRlIHt7XG4gKiAgIFt4IGluIFBdOiAoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+XG4gKiB9fSBbVD17IFt4IGluIFBdOiBJIH1dXG4gKiBAdGVtcGxhdGUge3Vua25vd25bXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQfSBtZXRob2ROYW1lXG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7U3luY0NhbGxiYWNrPEk+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN5bmNNZXRob2RDYWxsYmFjaz0odGFyZ2V0LG1ldGhvZE5hbWUsLi4uYm91bmQpPT57XG5pc09iamVjdCh0YXJnZXQpfHxcbkZhaWwgYHN5bmMgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbnR5cGVvZiBtZXRob2ROYW1lPT09J3N0cmluZyd8fFxuaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKXx8XG5GYWlsIGBtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIHBhc3NhYmxlIHN5bWJvbDogJHttZXRob2ROYW1lfWA7XG4vKiogQHR5cGUge3Vua25vd259ICovXG5jb25zdCBjYj1oYXJkZW4oe3RhcmdldCxtZXRob2ROYW1lLGJvdW5kLGlzU3luYzp0cnVlfSk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7U3luY0NhbGxiYWNrPEk+fSAqL2NiKTtcbiB9OyRo4oCNX29uY2UubWFrZVN5bmNNZXRob2RDYWxsYmFjayhtYWtlU3luY01ldGhvZENhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY01ldGhvZENhbGxiYWNrKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgcG90ZW50aWFsbHkgZmFyIG1ldGhvZC5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gUFxuICogQHRlbXBsYXRlIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPHtcbiAqICAgW3ggaW4gUF06ICguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST5cbiAqIH0+fSBbVD1YaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPHsgW3ggaW4gUF06IEkgfT5dXG4gKiBAdGVtcGxhdGUge3Vua25vd25bXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQfSBtZXRob2ROYW1lXG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7Q2FsbGJhY2s8ST59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWV0aG9kQ2FsbGJhY2s9KHRhcmdldCxtZXRob2ROYW1lLC4uLmJvdW5kKT0+e1xuaXNPYmplY3QodGFyZ2V0KXx8RmFpbCBgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbnR5cGVvZiBtZXRob2ROYW1lPT09J3N0cmluZyd8fFxuaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKXx8XG5GYWlsIGBtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIHBhc3NhYmxlIHN5bWJvbDogJHttZXRob2ROYW1lfWA7XG4vKiogQHR5cGUge3Vua25vd259ICovXG5jb25zdCBjYj1oYXJkZW4oe3RhcmdldCxtZXRob2ROYW1lLGJvdW5kfSk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7Q2FsbGJhY2s8ST59ICovY2IpO1xuIH07JGjigI1fb25jZS5tYWtlTWV0aG9kQ2FsbGJhY2sobWFrZU1ldGhvZENhbGxiYWNrKTtcbmhhcmRlbihtYWtlTWV0aG9kQ2FsbGJhY2spO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBjYWxsYmFja1xuICogQHJldHVybnMge2NhbGxiYWNrIGlzIENhbGxiYWNrPGFueT59XG4gKi9cbmNvbnN0ICAgICAgICBpc0NhbGxiYWNrPShjYWxsYmFjayk9PntcbmlmKCFpc09iamVjdChjYWxsYmFjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e3RhcmdldCxtZXRob2ROYW1lLGJvdW5kfT1jYWxsYmFjaztcbnJldHVybihcbmlzT2JqZWN0KHRhcmdldCkmJihcbm1ldGhvZE5hbWU9PT11bmRlZmluZWR8fFxudHlwZW9mIG1ldGhvZE5hbWU9PT0nc3RyaW5nJ3x8XG5pc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpKSYmXG5BcnJheS5pc0FycmF5KGJvdW5kKSk7XG5cbiB9OyRo4oCNX29uY2UuaXNDYWxsYmFjayhpc0NhbGxiYWNrKTtcbmhhcmRlbihpc0NhbGxiYWNrKTtcblxuLyoqXG4gKiBQcmVwYXJlIGFuIGF0dGVudWF0b3IgY2xhc3Mgd2hvc2UgbWV0aG9kcyBjYW4gYmUgcmVkaXJlY3RlZCB2aWEgY2FsbGJhY2tzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IE1cbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy9iYXNlLXpvbmUnKS5ab25lfSB6b25lIFRoZSB6b25lIGluIHdoaWNoIHRvIGFsbG9jYXRlIGF0dGVudWF0b3JzLlxuICogQHBhcmFtIHtNW119IG1ldGhvZE5hbWVzIE1ldGhvZHMgdG8gZm9yd2FyZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuSW50ZXJmYWNlR3VhcmR9IFtvcHRzLmludGVyZmFjZUd1YXJkXSBBbiBpbnRlcmZhY2UgZ3VhcmQgZm9yIHRoZVxuICogbmV3IGF0dGVudWF0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMudGFnXSBBIHRhZyBmb3IgdGhlIG5ldyBhdHRlbnVhdG9yIGV4b0NsYXNzLlxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUF0dGVudWF0b3I9KFxuem9uZSxcbm1ldGhvZE5hbWVzLFxue2ludGVyZmFjZUd1YXJkLHRhZz0nQXR0ZW51YXRvcid9PXt9KT0+XG57XG4vKipcbiAqIEB0eXBlZGVmIHsodGhpczogYW55LCAuLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gTWV0aG9kXG4gKiBAdHlwZWRlZiB7eyBbSyBpbiBNXT86IENhbGxiYWNrPGFueT4gfCBudWxsfX0gT3ZlcnJpZGVzXG4gKiBAdHlwZWRlZiB7eyBbSyBpbiBNXTogKHRoaXM6IGFueSwgLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnkgfX0gTWV0aG9kc1xuICovXG5jb25zdCBtZXRob2RzPS8qKiBAdHlwZSB7TWV0aG9kc30gKi9cbmZyb21FbnRyaWVzKFxubWV0aG9kTmFtZXMubWFwKChrZXkpPT57XG4vKiBPbmx5IGFsbG93IHRoZSBgUHJvcGVydHlLZXlgIHR5cGUgZm9yIHRoZSB0YXJnZXQgbWV0aG9kIGtleS4qL1xuaWYoIWlzUHJvcGVydHlLZXkoa2V5KSl7XG50aHJvdyBGYWlsIGBrZXkgJHtxKGtleSl9IGlzIG5vdCBhIFByb3BlcnR5S2V5YDtcbiB9XG5cbmNvbnN0IG09LyoqIEB0eXBlIHtNZXRob2RzfSAqL3tcbi8qIEV4cGxpY2l0bHkgdXNlIGNvbmNpc2UgbWV0aG9kIHN5bnRheCB0byBwcmVzZXJ2ZSBgdGhpc2AgYnV0IHByZXZlbnQqL1xuLyogY29uc3RydWN0b3IgYmVoYXZpb3IuKi9cbi8qKiBAdHlwZSB7TWV0aG9kfSAqL1xuW2tleV0oLi4uYXJncyl7XG4vKiBTdXBwb3J0IGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jIGNhbGxiYWNrcy4qL1xuY29uc3QgY2I9dGhpcy5zdGF0ZS5jYnNba2V5XTtcbmlmKCFjYil7XG5jb25zdCBlcnI9YXNzZXJ0LmVycm9yKFxuIGB1bmltcGxlbWVudGVkICR7cSh0YWcpfSBtZXRob2QgJHtxKGtleSl9YCk7XG5cbmlmKHRoaXMuc3RhdGUuaXNTeW5jKXtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiB9XG5pZihjYi5pc1N5bmMpe1xucmV0dXJuIGNhbGxTeW5jKGNiLC4uLmFyZ3MpO1xuIH1cbnJldHVybiBjYWxsRShjYiwuLi5hcmdzKTtcbiB9fVtcbmtleV07XG5yZXR1cm4gKC8qKiBAdHlwZSB7Y29uc3R9ICovW2tleSxtXSk7XG4gfSkpO1xuXG5cblxuLyoqXG4gKiBDcmVhdGUgYW4gZXhvIG9iamVjdCB3aG9zZSBiZWhhdmlvciBpcyBjb21wb3NlZCBmcm9tIGEgZGVmYXVsdCB0YXJnZXRcbiAqIGFuZC9vciBpbmRpdmlkdWFsIG1ldGhvZCBvdmVycmlkZSBjYWxsYmFja3MuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7dW5rbm93bn0gW29wdHMudGFyZ2V0XSBUaGUgdGFyZ2V0IGZvciBhbnkgbWV0aG9kcyB0aGF0XG4gKiB3ZXJlbid0IHNwZWNpZmllZCBpbiBgb3B0cy5vdmVycmlkZXNgLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pc1N5bmM9ZmFsc2VdIFdoZXRoZXIgdGhlIHRhcmdldCBzaG91bGQgYmUgdHJlYXRlZFxuICogYXMgc3luY2hyb25vdXNseSBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge092ZXJyaWRlc30gW29wdHMub3ZlcnJpZGVzXSBTZXQgaW5kaXZpZHVhbFxuICogY2FsbGJhY2tzIGZvciBtZXRob2RzICh3aG9zZSBuYW1lcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlXG4gKiBgcHJlcGFyZUF0dGVudWF0b3JgIG9yIGBwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3JgIGNhbGwpLiAgTnVsbGlzaCBvdmVycmlkZXNcbiAqIG1lYW4gdG8gdGhyb3cuXG4gKi9cbmNvbnN0IG1ha2VBdHRlbnVhdG9yPXpvbmUuZXhvQ2xhc3MoXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7YW55fSBbb3B0cy50YXJnZXRdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmlzU3luY11cbiAqIEBwYXJhbSB7T3ZlcnJpZGVzfSBbb3B0cy5vdmVycmlkZXNdXG4gKi9cbih7XG50YXJnZXQ9bnVsbCxcbmlzU3luYz1mYWxzZSxcbm92ZXJyaWRlcz0vKiogQHR5cGUge092ZXJyaWRlc30gKi97fX0pPT5cbntcbmNvbnN0IGNicz0vKiogQHR5cGUge092ZXJyaWRlc30gKi97fTtcblxuY29uc3QgcmVtYWluaW5nPW5ldyBTZXQobWV0aG9kTmFtZXMpO1xuZm9yKGNvbnN0IGtleSBvZiBvd25LZXlzKG92ZXJyaWRlcykpe1xucmVtYWluaW5nLmhhcyhrZXkpfHxcbkZhaWwgYCR7cSh0YWcpfSBvdmVycmlkZXNbJHtxKGtleSl9XSBub3QgYWxsb3dlZCBieSBtZXRob2ROYW1lc2A7XG5cbnJlbWFpbmluZy5kZWxldGUoa2V5KTtcbmNvbnN0IGNiPW92ZXJyaWRlc1trZXldO1xuY2I9PW51bGx8fFxuaXNDYWxsYmFjayhjYil8fFxuRmFpbCBgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIGlzIG5vdCBhIGNhbGxiYWNrOyBnb3QgJHtjYn1gO1xuY2JzW2tleV09Y2I7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiByZW1haW5pbmcpe1xuaWYoaXNTeW5jKXtcbmNic1trZXldPW1ha2VTeW5jTWV0aG9kQ2FsbGJhY2sodGFyZ2V0LGtleSk7XG4gfWVsc2V7XG5jYnNba2V5XT1tYWtlTWV0aG9kQ2FsbGJhY2sodGFyZ2V0LGtleSk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2Nicyxpc1N5bmN9KTtcbiB9LFxuLyoqIEB0eXBlIHtNZXRob2RzfSAqL21ldGhvZHMpO1xuXG5yZXR1cm4gbWFrZUF0dGVudWF0b3I7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVBdHRlbnVhdG9yKHByZXBhcmVBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlQXR0ZW51YXRvcik7XG5cbi8qKlxuICogUHJlcGFyZSBhbiBhdHRlbnVhdG9yIHdob3NlIG1ldGhvZE5hbWVzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGludGVyZmFjZUd1YXJkLlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy9iYXNlLXpvbmUnKS5ab25lfSB6b25lXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuSW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdHNdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMudGFnXVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yPSh6b25lLGludGVyZmFjZUd1YXJkLG9wdHM9e30pPT57XG5jb25zdHttZXRob2RHdWFyZHN9PWludGVyZmFjZUd1YXJkO1xuY29uc3QgbWV0aG9kTmFtZXM9b3duS2V5cyhtZXRob2RHdWFyZHMpO1xuY29uc3QgbWFrZUF0dGVudWF0b3I9cHJlcGFyZUF0dGVudWF0b3Ioem9uZSxtZXRob2ROYW1lcyx7XG4uLi5vcHRzLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxucmV0dXJuICgvKiogQHR5cGUge01ha2VBdHRlbnVhdG9yPGFueT59ICovbWFrZUF0dGVudWF0b3IpO1xuIH07JGjigI1fb25jZS5wcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IocHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGxTeW5jIjpbImNhbGxTeW5jIl0sImNhbGxFIjpbImNhbGxFIl0sIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayI6WyJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siXSwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siOlsibWFrZUZ1bmN0aW9uQ2FsbGJhY2siXSwibWFrZVN5bmNNZXRob2RDYWxsYmFjayI6WyJtYWtlU3luY01ldGhvZENhbGxiYWNrIl0sIm1ha2VNZXRob2RDYWxsYmFjayI6WyJtYWtlTWV0aG9kQ2FsbGJhY2siXSwiaXNDYWxsYmFjayI6WyJpc0NhbGxiYWNrIl0sInByZXBhcmVBdHRlbnVhdG9yIjpbInByZXBhcmVBdHRlbnVhdG9yIl0sInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciI6WyJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqo/dRiIGAAAiBgAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiVkJhbmtBY2NvdW50IiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBAamVzc2llLWNoZWNrKi9cblxuLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwIGFuZCBvdXIgbGF4IHBhY2thZ2VcbiAqIGRlcGVuZGVuY3kgZ3JhcGgsIHNvbWV0aW1lcyByYXRpb25hbCBwbGFjZW1lbnRzIGNhdXNlIHR5cGUgcmVzb2x1dGlvbiBlcnJvcnMuXG4gKlxuICogU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZSBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZHMgdXNlZCBieSB0aGUgYnJpZGdlIGRldmljZS5cbiAqL1xuY29uc3QgICAgICAgIEJyaWRnZUlkPXtcbkJBTks6J2JhbmsnLFxuQ09SRTonY29yZScsXG5ESUJDOidkaWJjJyxcblNUT1JBR0U6J3N0b3JhZ2UnLFxuUFJPVklTSU9OOidwcm92aXNpb24nLFxuUFJPVklTSU9OX1NNQVJUX1dBTExFVDoncHJvdmlzaW9uV2FsbGV0JyxcbldBTExFVDond2FsbGV0J307JGjigI1fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5cbmhhcmRlbihCcmlkZ2VJZCk7XG5cbmNvbnN0ICAgICAgICBXYWxsZXROYW1lPXtcbmRlcG9zaXRGYWNldDonZGVwb3NpdEZhY2V0J307JGjigI1fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuXG5oYXJkZW4oV2FsbGV0TmFtZSk7XG5cbi8qIGRlZmluZWQgaW4gZ29sYW5nL2Nvc21vcy94L3ZiYW5rKi9cbmNvbnN0ICAgICAgICBWQmFua0FjY291bnQ9e1xucmVzZXJ2ZTp7XG5tb2R1bGU6J3ZiYW5rL3Jlc2VydmUnLFxuYWRkcmVzczonYWdvcmljMWFlMGxtdHpsZ3JjbmxhOXhqa3BhYXJxNWQ1ZGZlejYzaDNudWNsJ30sXG5cbnByb3Zpc2lvbjp7XG5tb2R1bGU6J3ZiYW5rL3Byb3Zpc2lvbicsXG5hZGRyZXNzOidhZ29yaWMxbWVnenl0ZzY1Y3lyZ3pzNmZ2enhncmNxdnd3bDd1Z3B0NjIzNDYnfX07JGjigI1fb25jZS5WQmFua0FjY291bnQoVkJhbmtBY2NvdW50KTtcblxuXG5oYXJkZW4oVkJhbmtBY2NvdW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmlkZ2VJZCI6WyJCcmlkZ2VJZCJdLCJXYWxsZXROYW1lIjpbIldhbGxldE5hbWUiXSwiVkJhbmtBY2NvdW50IjpbIlZCYW5rQWNjb3VudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAXyTOAyAQAAMgEAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVHJhY2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbmxldCBkZWJ1Z0luc3RhbmNlPTE7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8ICd2ZXJib3NlJ30gZW5hYmxlXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlVHJhY2VyPShuYW1lLGVuYWJsZT10cnVlKT0+e1xuZGVidWdJbnN0YW5jZSs9MTtcbmxldCBkZWJ1Z0NvdW50PTE7XG5jb25zdCBrZXk9IGAtLS0tLSAke25hbWV9LiR7ZGVidWdJbnN0YW5jZX0gYDtcbi8qIHRoZSBjYXNlcyBiZWxvdyBkZWZpbmUgYSBuYW1lZCB2YXJpYWJsZSB0byBwcm92aWRlIGJldHRlciBkZWJ1ZyBpbmZvKi9cbnN3aXRjaChlbmFibGUpe1xuY2FzZSBmYWxzZTp7XG5jb25zdCBsb2dEaXNhYmxlZD0oLi4uX2FyZ3MpPT57IH07XG5yZXR1cm4gbG9nRGlzYWJsZWQ7XG4gfVxuY2FzZSd2ZXJib3NlJzp7XG5jb25zdCBpbmZvVGljaz0ob3B0TG9nLC4uLmFyZ3MpPT57XG5pZihvcHRMb2cubG9nKXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gaW5mb1RpY2s7XG4gfVxuZGVmYXVsdDp7XG5jb25zdCBkZWJ1Z1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5vcHRMb2cubG9nKGtleSxkZWJ1Z0NvdW50Kz0xLC4uLmFyZ3MpO1xuIH1lbHNle1xuY29uc29sZS5pbmZvKGtleSxkZWJ1Z0NvdW50Kz0xLG9wdExvZywuLi5hcmdzKTtcbiB9XG4gfTtcbnJldHVybiBkZWJ1Z1RpY2s7XG4gfX1cblxuIH07JGjigI1fb25jZS5tYWtlVHJhY2VyKG1ha2VUcmFjZXIpO1xuaGFyZGVuKG1ha2VUcmFjZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFjZXIiOlsibWFrZVRyYWNlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC4c/LWQwIAAEMCAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vdXRpbHMuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi91dGlscy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vY29uZmlnLmpzXCIsIFtdXSxbXCIuL2RlYnVnLmpzXCIsIFtdXSxbXCIuL3V0aWxzLmpzXCIsIFtdXSxbXCIuL21ldGhvZC10b29scy5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADMLyXp2ikAANopAAAvAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vcGF0dGVybnMiLCJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzIiwiLi9jYWxsYmFjay5qcyJdLCJleHBvcnRzIjpbImFzc2VydENhcERhdGEiLCJhc3NlcnRQYXRoU2VnbWVudCIsImlzU3RyZWFtQ2VsbCIsIm1ha2VDaGFpblN0b3JhZ2VSb290IiwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSIsIm1ha2VTdG9yYWdlTm9kZUNoaWxkIiwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxNLG1ha2VIZWFwWm9uZSxjYjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qc1wiLCBbW1wibWFrZUhlYXBab25lXCIsIFskaOKAjV9hID0+IChtYWtlSGVhcFpvbmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jYWxsYmFjay5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoY2IgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZUNoYWluU3RvcmFnZVJvb3QsICduYW1lJywge3ZhbHVlOiBcIm1ha2VDaGFpblN0b3JhZ2VSb290XCJ9KTskaOKAjV9vbmNlLm1ha2VDaGFpblN0b3JhZ2VSb290KG1ha2VDaGFpblN0b3JhZ2VSb290KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVN0b3JhZ2VOb2RlQ2hpbGQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VTdG9yYWdlTm9kZUNoaWxkXCJ9KTskaOKAjV9vbmNlLm1ha2VTdG9yYWdlTm9kZUNoaWxkKG1ha2VTdG9yYWdlTm9kZUNoaWxkKTsgICBcblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykubWFrZU1hcnNoYWw+fSBNYXJzaGFsbGVyICovXG4vKiogQHR5cGVkZWYge1BpY2s8TWFyc2hhbGxlciwgJ2Zyb21DYXBEYXRhJz59IFVuc2VyaWFsaXplciAqL1xuXG4vKipcbiAqIERlZmluZWQgYnkgdnN0b3JhZ2VTdG9yZUtleSBpbiB2c3RvcmFnZS5nb1xuICpcbiAqIEB0eXBlZGVmIFZTdG9yYWdlS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVTdWJrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhUHJlZml4Qnl0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9EYXRhVmFsdWVdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIFN0cmVhbUNlbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBibG9ja0hlaWdodCBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbmF0dXJhbCBudW1iZXJcbiAqIEBwcm9wZXJ0eSB7VFtdfSB2YWx1ZXNcbiAqL1xuXG4vKipcbiAqIFRoaXMgcmVwcmVzZW50cyBhIG5vZGUgaW4gYW4gSUFWTCB0cmVlLlxuICpcbiAqIFRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgeC92c3RvcmFnZSwgYW4gQWdvcmljIGV4dGVuc2lvbiBvZiB0aGUgQ29zbW9zIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuY29uc3QgQ2hhaW5TdG9yYWdlTm9kZUk9TS5pbnRlcmZhY2UoJ1N0b3JhZ2VOb2RlJyx7XG5zZXRWYWx1ZTpNLmNhbGxXaGVuKE0uc3RyaW5nKCkpLnJldHVybnMoKSxcbmdldFBhdGg6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldFN0b3JlS2V5Ok0uY2FsbFdoZW4oKS5yZXR1cm5zKE0ucmVjb3JkKCkpLFxubWFrZUNoaWxkTm9kZTpNLmNhbGwoTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnNwbGl0UmVjb3JkKHt9LHtzZXF1ZW5jZTpNLmJvb2xlYW4oKX0se30pKS5cbnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJykpfSk7XG5cblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGVyZmVjdCBoZXVyaXN0aWMgdG8gbmF2aWdhdGUgdGhlIG1pZ3JhdGlvbiBmcm9tIHZhbHVlIGNlbGxzIHRvXG4gKiBzdHJlYW0gY2VsbHMuXG4gKiBBdCB0aW1lIG9mIHdyaXRpbmcsIG5vIGxlZ2FjeSBjZWxscyBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIGEgc3RyZWFtIGNlbGwsXG4gKiBhbmQgd2UgZG8gbm90IGludGVuZCB0byBjcmVhdGUgYW55IG1vcmUgbGVnYWN5IHZhbHVlIGNlbGxzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBjZWxsXG4gKiBAcmV0dXJucyB7Y2VsbCBpcyBTdHJlYW1DZWxsfVxuICovXG5jb25zdCAgICAgICAgaXNTdHJlYW1DZWxsPShjZWxsKT0+XG5jZWxsJiZcbnR5cGVvZiBjZWxsPT09J29iamVjdCcmJlxuQXJyYXkuaXNBcnJheShjZWxsLnZhbHVlcykmJlxudHlwZW9mIGNlbGwuYmxvY2tIZWlnaHQ9PT0nc3RyaW5nJyYmXG4vXjAkfF5bMS05XVswLTldKiQvLnRlc3QoY2VsbC5ibG9ja0hlaWdodCk7JGjigI1fb25jZS5pc1N0cmVhbUNlbGwoaXNTdHJlYW1DZWxsKTtcbmhhcmRlbihpc1N0cmVhbUNlbGwpO1xuXG4vKiBUT0RPOiBDb25zb2xpZGF0ZSB3aXRoIGBpbnNpc3RDYXBEYXRhYCBmdW5jdGlvbnMgZnJvbSBzd2luZ3NldC1saXZlc2xvdHMsKi9cbi8qIHN3aW5nc2V0LXhzbmFwLXN1cGVydmlzb3IsIGV0Yy4qL1xuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGRhdGFcbiAqIEByZXR1cm5zIHthc3NlcnRzIGRhdGEgaXMgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNhcERhdGE8c3RyaW5nPn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENhcERhdGE9KGRhdGEpPT57XG5hc3NlcnQudHlwZW9mKGRhdGEsJ29iamVjdCcpO1xuYXNzZXJ0KGRhdGEpO1xuYXNzZXJ0LnR5cGVvZihkYXRhLmJvZHksJ3N0cmluZycpO1xuYXNzZXJ0KEFycmF5LmlzQXJyYXkoZGF0YS5zbG90cykpO1xuLyogWFhYIGNoZWNrIHRoYXQgdGhlIC5zbG90cyBhcnJheSBlbGVtZW50cyBhcmUgYWN0dWFsbHkgc3RyaW5ncyovXG4gfTskaOKAjV9vbmNlLmFzc2VydENhcERhdGEoYXNzZXJ0Q2FwRGF0YSk7XG5oYXJkZW4oYXNzZXJ0Q2FwRGF0YSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGUgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKiBUT0RPOiBGb3JtYWxpemUgc2VnbWVudCBjb25zdHJhaW50cy4qL1xuLyogTXVzdCBiZSBub25lbXB0eSBhbmQgZGlzYWxsb3cgKHVuZXNjYXBlZCkgYC5gLCBhbmQgZm9yIHNpbXBsaWNpdHkqL1xuLyogKGFuZCBmdXR1cmUgcG9zc2liaWxpdHkgb2YgZS5nLiBlc2NhcGluZykgd2UgY3VycmVudGx5IGxpbWl0IHRvKi9cbi8qIEFTQ0lJIGFscGhhbnVtZXJpYyBwbHVzIHVuZGVyc2NvcmUgYW5kIGRhc2guKi9cbmNvbnN0IHBhdGhTZWdtZW50UGF0dGVybj0vXlthLXpBLVowLTlfLV17MSwxMDB9JC87XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZykgPT4gdm9pZH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQYXRoU2VnbWVudD0obmFtZSk9PntcbnBhdGhTZWdtZW50UGF0dGVybi50ZXN0KG5hbWUpfHxcbkZhaWwgYFBhdGggc2VnbWVudCBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgMSB0byAxMDAgY2hhcmFjdGVycyBsaW1pdGVkIHRvIEFTQ0lJIGFscGhhbnVtZXJpY3MsIHVuZGVyc2NvcmVzLCBhbmQvb3IgZGFzaGVzOiAke25hbWV9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGF0aFNlZ21lbnQoYXNzZXJ0UGF0aFNlZ21lbnQpO1xuaGFyZGVuKGFzc2VydFBhdGhTZWdtZW50KTtcblxuLyoqXG4gKiBNdXN0IG1hdGNoIHRoZSBzd2l0Y2ggaW4gdnN0b3JhZ2UuZ28gdXNpbmcgYHZzdG9yYWdlTWVzc2FnZWAgdHlwZVxuICpcbiAqIEB0eXBlZGVmIHsgJ2dldCcgfCAnZ2V0U3RvcmVLZXknIHwgJ2hhcycgfCAnY2hpbGRyZW4nIHwgJ2VudHJpZXMnIHwgJ3ZhbHVlcycgfCdzaXplJyB9IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kXG4gKiBAdHlwZWRlZiB7ICdzZXQnIHwgJ3NldFdpdGhvdXROb3RpZnknIHwgJ2FwcGVuZCcgfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2RcbiAqIEB0eXBlZGVmIHtTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZCB8IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZCB9IFN0b3JhZ2VNZXNzYWdlTWV0aG9kXG4gKiBAdHlwZWRlZiB7IFtwYXRoOiBzdHJpbmddIH0gU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VBcmdzXG4gKiBAdHlwZWRlZiB7IFtwYXRoOiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nIHwgbnVsbF0gfSBTdG9yYWdlRW50cnlcbiAqIEB0eXBlZGVmIHsgU3RvcmFnZUVudHJ5W10gfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VBcmdzXG4gKiBAdHlwZWRlZiB7e1xuICogICBtZXRob2Q6IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kO1xuICogICBhcmdzOiBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZUFyZ3M7XG4gKiAgfSB8IHtcbiAqICAgbWV0aG9kOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2Q7XG4gKiAgIGFyZ3M6IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZUFyZ3M7XG4gKiB9fSBTdG9yYWdlTWVzc2FnZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL2Jhc2Utem9uZScpLlpvbmV9IHpvbmVcbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlPSh6b25lKT0+e1xuLyoqXG4gKiBDcmVhdGUgYSBzdG9yYWdlIG5vZGUgZm9yIGEgZ2l2ZW4gYmFja2luZyBzdG9yYWdlIGludGVyZmFjZSBhbmQgcGF0aC5cbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vY2FsbGJhY2snKS5DYWxsYmFjazwobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueT59IG1lc3NlbmdlciBhIGNhbGxiYWNrXG4gKiBmb3Igc2VuZGluZyBhIHN0b3JhZ2VNZXNzYWdlIG9iamVjdCB0byB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvblxuICogKGNmLiBnb2xhbmcvY29zbW9zL3gvdnN0b3JhZ2UvdnN0b3JhZ2UuZ28pXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW5jZV0gc2V0IHZhbHVlcyB3aXRoIGBhcHBlbmRgIG1lc3NhZ2VzIHJhdGhlciB0aGFuIGBzZXRgIG1lc3NhZ2VzXG4gKiBzbyB0aGUgYmFja2luZyBpbXBsZW1lbnRhdGlvbiBlbXBsb3lzIGEgd3JhcHBpbmcgc3RydWN0dXJlIHRoYXRcbiAqIHByZXNlcnZlcyBlYWNoIHZhbHVlIHNldCB3aXRoaW4gYSBzaW5nbGUgYmxvY2suXG4gKiBDaGlsZCBub2RlcyBkZWZhdWx0IHRvIGluaGVyaXRpbmcgdGhpcyBvcHRpb24gZnJvbSB0aGVpciBwYXJlbnQuXG4gKiBAcmV0dXJucyB7U3RvcmFnZU5vZGV9XG4gKi9cbmNvbnN0IG1ha2VDaGFpblN0b3JhZ2VOb2RlPXpvbmUuZXhvQ2xhc3MoXG4nQ2hhaW5TdG9yYWdlTm9kZScsXG5DaGFpblN0b3JhZ2VOb2RlSSxcbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2NhbGxiYWNrJykuQ2FsbGJhY2s8KG1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlKSA9PiBhbnk+fSBtZXNzZW5nZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNlcXVlbmNlXVxuICovXG4obWVzc2VuZ2VyLHBhdGgse3NlcXVlbmNlPWZhbHNlfT17fSk9PntcbmFzc2VydC50eXBlb2YocGF0aCwnc3RyaW5nJyk7XG5hc3NlcnQudHlwZW9mKHNlcXVlbmNlLCdib29sZWFuJyk7XG5yZXR1cm4gaGFyZGVuKHtwYXRoLG1lc3NlbmdlcixzZXF1ZW5jZX0pO1xuIH0sXG57XG5nZXRQYXRoKCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5wYXRoO1xuIH0sXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBnZXRQYXRoXG4gKiBAdHlwZSB7KCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleT59XG4gKi9cbiAgICAgIGFzeW5jIGdldFN0b3JlS2V5KCl7XG5jb25zdHtwYXRoLG1lc3Nlbmdlcn09dGhpcy5zdGF0ZTtcbnJldHVybiBjYi5jYWxsRShtZXNzZW5nZXIse1xubWV0aG9kOidnZXRTdG9yZUtleScsXG5hcmdzOltwYXRoXX0pO1xuXG4gfSxcbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgY2hpbGROb2RlT3B0aW9ucz86IHtzZXF1ZW5jZT86IGJvb2xlYW59KSA9PiBTdG9yYWdlTm9kZX0gKi9cbm1ha2VDaGlsZE5vZGUobmFtZSxjaGlsZE5vZGVPcHRpb25zPXt9KXtcbmNvbnN0e3NlcXVlbmNlLHBhdGgsbWVzc2VuZ2VyfT10aGlzLnN0YXRlO1xuYXNzZXJ0UGF0aFNlZ21lbnQobmFtZSk7XG5jb25zdCBtZXJnZWRPcHRpb25zPXtzZXF1ZW5jZSwuLi5jaGlsZE5vZGVPcHRpb25zfTtcbnJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZShcbm1lc3NlbmdlcixcbiBgJHtwYXRofS4ke25hbWV9YCxcbm1lcmdlZE9wdGlvbnMpO1xuXG4gfSxcbi8qKiBAdHlwZSB7KHZhbHVlOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD59ICovXG4gICAgICBhc3luYyBzZXRWYWx1ZSh2YWx1ZSl7XG5jb25zdHtzZXF1ZW5jZSxwYXRoLG1lc3Nlbmdlcn09dGhpcy5zdGF0ZTtcbmFzc2VydC50eXBlb2YodmFsdWUsJ3N0cmluZycpO1xuLyoqIEB0eXBlIHtTdG9yYWdlRW50cnl9ICovXG5sZXQgZW50cnk7XG5pZighc2VxdWVuY2UmJiF2YWx1ZSl7XG5lbnRyeT1bcGF0aF07XG4gfWVsc2V7XG5lbnRyeT1bcGF0aCx2YWx1ZV07XG4gfVxuYXdhaXQgY2IuY2FsbEUobWVzc2VuZ2VyLHtcbm1ldGhvZDpzZXF1ZW5jZT8nYXBwZW5kJzonc2V0JyxcbmFyZ3M6W2VudHJ5XX0pO1xuXG4gfVxuLyogUG9zc2libGUgZXh0ZW5zaW9uczoqL1xuLyogKiBnZXRWYWx1ZSgpKi9cbi8qICogZ2V0Q2hpbGROYW1lcygpIGFuZC9vciBtYWtlQ2hpbGROb2RlcygpKi9cbi8qICogZ2V0TmFtZSgpKi9cbi8qICogcmVjdXJzaXZlIGRlbGV0ZSovXG4vKiAqIGJhdGNoIG9wZXJhdGlvbnMqL1xuLyogKiBsb2NhbCBidWZmZXJpbmcgKHdpdGggZW5kLW9mLWJsb2NrIGNvbW1pdCkqL30pO1xuXG5cbnJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZTtcbiB9OyRo4oCNX29uY2UucHJlcGFyZUNoYWluU3RvcmFnZU5vZGUocHJlcGFyZUNoYWluU3RvcmFnZU5vZGUpO1xuXG5jb25zdCBtYWtlSGVhcENoYWluU3RvcmFnZU5vZGU9cHJlcGFyZUNoYWluU3RvcmFnZU5vZGUobWFrZUhlYXBab25lKCkpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGhlYXAtYmFzZWQgcm9vdCBzdG9yYWdlIG5vZGUgZm9yIGEgZ2l2ZW4gYmFja2luZyBmdW5jdGlvbiBhbmQgcm9vdCBwYXRoLlxuICpcbiAqIEBwYXJhbSB7KG1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlKSA9PiBhbnl9IGhhbmRsZVN0b3JhZ2VNZXNzYWdlIGEgZnVuY3Rpb24gZm9yXG4gKiBzZW5kaW5nIGEgc3RvcmFnZU1lc3NhZ2Ugb2JqZWN0IHRvIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9uXG4gKiAoY2YuIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS92c3RvcmFnZS5nbylcbiAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtyb290T3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jvb3RPcHRpb25zLnNlcXVlbmNlXSBlbXBsb3kgYSB3cmFwcGluZyBzdHJ1Y3R1cmUgdGhhdFxuICogcHJlc2VydmVzIGVhY2ggdmFsdWUgc2V0IHdpdGhpbiBhIHNpbmdsZSBibG9jaywgYW5kIGRlZmF1bHQgY2hpbGQgbm9kZXNcbiAqIHRvIGRvIHRoZSBzYW1lXG4gKi9cbmZ1bmN0aW9uICAgICAgICBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbmhhbmRsZVN0b3JhZ2VNZXNzYWdlLFxucm9vdFBhdGgsXG5yb290T3B0aW9ucz17fSlcbntcbmNvbnN0IG1lc3Nlbmdlcj1jYi5tYWtlRnVuY3Rpb25DYWxsYmFjayhoYW5kbGVTdG9yYWdlTWVzc2FnZSk7XG5cbi8qIFVzZSB0aGUgaGVhcFpvbmUgZGlyZWN0bHkuKi9cbmNvbnN0IHJvb3ROb2RlPW1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZShtZXNzZW5nZXIscm9vdFBhdGgscm9vdE9wdGlvbnMpO1xucmV0dXJuIHJvb3ROb2RlO1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7U3RvcmFnZU5vZGV9IGFuIG9iamVjdCB0aGF0IGNvbmZpcm1zIHRvIFN0b3JhZ2VOb2RlIEFQSSBidXQgZG9lcyBub3Qgc3RvcmUgYW55d2hlcmUuXG4gKi9cbmNvbnN0IG1ha2VOdWxsU3RvcmFnZU5vZGU9KCk9Pntcbi8qIFhYWCByZS11c2UgXCJDaGFpblN0b3JhZ2VcIiBtZXRob2RzIGFib3ZlIHdoaWNoIGRvbid0IGFjdHVhbGx5IGRlcGVuZCBvbiBjaGFpbnMqL1xucmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VSb290KCgpPT5udWxsLCdudWxsJyk7XG4gfTtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcmV0dXJuaW5nIGEgc3RvcmFnZSBub2RlIGF0IG9yIHVuZGVyIGl0cyBpbnB1dCxcbiAqIGZhbGxpbmcgYmFjayB0byBhbiBpbmVydCBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnRlcmZhY2UgKGJ1dCBpbmNvbXBsZXRlXG4gKiBiZWhhdmlvcikgd2hlbiB0aGF0IGlzIHVuYXZhaWxhYmxlLlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxTdG9yYWdlTm9kZT8+fSBzdG9yYWdlTm9kZVJlZlxuICogQHBhcmFtIHtzdHJpbmd9IGNoaWxkTmFtZVxuICogQHJldHVybnMge1Byb21pc2U8U3RvcmFnZU5vZGU+fVxuICovXG5hc3luYyBmdW5jdGlvbiAgICAgICAgbWFrZVN0b3JhZ2VOb2RlQ2hpbGQoc3RvcmFnZU5vZGVSZWYsY2hpbGROYW1lKXtcbmNvbnN0IGV4aXN0aW5nU3RvcmFnZU5vZGU9YXdhaXQgc3RvcmFnZU5vZGVSZWY7XG5jb25zdCBzdG9yYWdlTm9kZT1leGlzdGluZ1N0b3JhZ2VOb2RlfHxtYWtlTnVsbFN0b3JhZ2VOb2RlKCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZE5hbWUpO1xuIH1cbmhhcmRlbihtYWtlU3RvcmFnZU5vZGVDaGlsZCk7XG5cbi8qIFRPRE8gZmluZCBhIGJldHRlciBtb2R1bGUgZm9yIHRoaXMqL1xuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7KHZhbHVlOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZT0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbnJldHVybiBhc3luYyh2YWx1ZSk9PntcbmNvbnN0IG1hcnNoYWxsZWQ9YXdhaXQgRShtYXJzaGFsbGVyKS50b0NhcERhdGEodmFsdWUpO1xuY29uc3Qgc2VyaWFsaXplZD1KU09OLnN0cmluZ2lmeShtYXJzaGFsbGVkKTtcbnJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkKTtcbiB9O1xuIH07JGjigI1fb25jZS5tYWtlU2VyaWFsaXplVG9TdG9yYWdlKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU3RyZWFtQ2VsbCI6WyJpc1N0cmVhbUNlbGwiXSwiYXNzZXJ0Q2FwRGF0YSI6WyJhc3NlcnRDYXBEYXRhIl0sImFzc2VydFBhdGhTZWdtZW50IjpbImFzc2VydFBhdGhTZWdtZW50Il0sInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIjpbInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sIm1ha2VDaGFpblN0b3JhZ2VSb290IjpbIm1ha2VDaGFpblN0b3JhZ2VSb290Il0sIm1ha2VTdG9yYWdlTm9kZUNoaWxkIjpbIm1ha2VTdG9yYWdlTm9kZUNoaWxkIl0sIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiOlsibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACi7siA3hAAAN4QAAArAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldGhvZC10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYmluZEFsbE1ldGhvZHMiLCJnZXRNZXRob2ROYW1lcyIsImdldFN0cmluZ01ldGhvZE5hbWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzT2JqZWN0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbi8qKlxuICogQGZpbGUgbWV0aG9kLXRvb2xzIHVzZSBkeW5hbWljIHByb3BlcnR5IGxvb2t1cCwgd2hpY2ggaXMgbm90IEplc3NpZS1jb21wYXRpYmxlXG4gKi9cblxuY29uc3R7Z2V0UHJvdG90eXBlT2YsY3JlYXRlLGZyb21FbnRyaWVzLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PVxuT2JqZWN0O1xuY29uc3R7b3duS2V5cyxhcHBseX09UmVmbGVjdDtcblxuLyoqXG4gKiBQcmlvcml0aXplIHN5bWJvbHMgYXMgZWFybGllciB0aGFuIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBhXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQ9KGEsYik9PntcbmlmKHR5cGVvZiBhPT09dHlwZW9mIGIpe1xuY29uc3QgbGVmdD1TdHJpbmcoYSk7XG5jb25zdCByaWdodD1TdHJpbmcoYik7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xucmV0dXJuIGxlZnQ8cmlnaHQ/LTE6bGVmdD5yaWdodD8xOjA7XG4gfVxuaWYodHlwZW9mIGE9PT0nc3ltYm9sJyl7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3RyaW5nJyk7XG5yZXR1cm4tMTtcbiB9XG5hc3NlcnQodHlwZW9mIGE9PT0nc3RyaW5nJyk7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3ltYm9sJyk7XG5yZXR1cm4gMTtcbiB9O1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCB0aGUgYGdldE1ldGhvZE5hbWVzYCBpbiBgQGVuZG8vZXZlbnR1YWwtc2VuZGBcbiAqXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBLXG4gKiBAcGFyYW0ge1JlY29yZDxLLCBhbnk+fSB2YWxcbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRNZXRob2ROYW1lcz0odmFsKT0+e1xubGV0IGxheWVyPXZhbDtcbmNvbnN0IG5hbWVzPW5ldyBTZXQoKTsvKiBTZXQgdG8gZGVkdXBsaWNhdGUqL1xud2hpbGUobGF5ZXIhPT1udWxsJiZsYXllciE9PU9iamVjdC5wcm90b3R5cGUpe1xuLyogYmUgdG9sZXJhbnQgb2Ygbm9uLW9iamVjdHMqL1xuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG5jb25zdCBvd25OYW1lcz0vKiogQHR5cGUge0tbXX0gKi9vd25LZXlzKGRlc2NzKTtcbmZvcihjb25zdCBuYW1lIG9mIG93bk5hbWVzKXtcbi8qIEluIGNhc2UgYSBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBhIG5vbi1tZXRob2QsKi9cbi8qIHRlc3QgYHZhbFtuYW1lXWAgcmF0aGVyIHRoYW4gYGxheWVyW25hbWVdYCovXG5pZih0eXBlb2YgdmFsW25hbWVdPT09J2Z1bmN0aW9uJyl7XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxuIH1cbmlmKCFpc09iamVjdCh2YWwpKXtcbmJyZWFrO1xuIH1cbmxheWVyPWdldFByb3RvdHlwZU9mKGxheWVyKTtcbiB9XG5yZXR1cm4gaGFyZGVuKFsuLi5uYW1lc10uc29ydChjb21wYXJlU3RyaW5naWZpZWQpKTtcbiB9OyRo4oCNX29uY2UuZ2V0TWV0aG9kTmFtZXMoZ2V0TWV0aG9kTmFtZXMpO1xuaGFyZGVuKGdldE1ldGhvZE5hbWVzKTtcblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGBnZXRNZXRob2ROYW1lc2AgY29udGFpbmluZyBvbmx5IHN0cmluZyBuYW1lcywgd2l0aG91dCBzeW1ib2xzXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gS1xuICogQHBhcmFtIHtSZWNvcmQ8SywgYW55Pn0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRTdHJpbmdNZXRob2ROYW1lcz0odmFsKT0+XG4vKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuZ2V0TWV0aG9kTmFtZXModmFsKS5maWx0ZXIoKG5hbWUpPT50eXBlb2YgbmFtZT09PSdzdHJpbmcnKTtcblxuXG4vKipcbiAqIFRPRE8gVGhpcyBmdW5jdGlvbiBleGlzdHMgb25seSB0byBlYXNlIHRoZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTk3MCB0cmFuc2l0aW9uLCBmcm9tIGFsbCBtZXRob2RzXG4gKiBiZWluZyBvd24gcHJvcGVydGllcyB0byBtZXRob2RzIGJlaW5nIGluaGVyaXRlZCBmcm9tIGEgY29tbW9uIHByb3RvdHlwZS5cbiAqIFRoaXMgdHJhbnNpdGlvbiBicmVha3MgdHdvIHBhdHRlcm5zIHVzZWQgaW4gcHJpb3IgY29kZTogYXV0b2JpbmRpbmcsXG4gKiBhbmQgZW51bWVyYXRpbmcgbWV0aG9kcyBieSBlbnVtZXJhdGluZyBvd24gcHJvcGVydGllcy4gRm9yIGJvdGgsIHRoZVxuICogcHJlZmVycmVkIHJlcGFpcnMgYXJlXG4gKiAgICAqIGF1dG9iaW5kaW5nOiBSZXBsYWNlLCBmb3IgZXhhbXBsZSxcbiAqICAgICAgYGZvbyhvYmoubWV0aG9kKWAgd2l0aCBgZm9vKGFyZyA9PiBgb2JqLm1ldGhvZChhcmcpKWAuIElPVywgc3RvcCByZWx5aW5nXG4gKiAgICAgIG9uIGV4cHJlc3Npb25zIGxpa2UgYG9iai5tZXRob2RgIHRvIGV4dHJhY3QgYSBtZXRob2Qgc3RpbGwgYm91bmQgdG8gdGhlXG4gKiAgICAgIHN0YXRlIG9mIGBvYmpgIGJlY2F1c2UsIGZvciB2aXJ0dWFsIGFuZCBkdXJhYmxlIG9iamVjdHMsXG4gKiAgICAgIHRoZXkgbm8gbG9uZ2VyIHdpbGwgYWZ0ZXIgIzU5NzAuXG4gKiAgICAqIG1ldGhvZCBlbnVtZXJhdGlvbjogUmVwbGFjZSwgZm9yIGV4YW1wbGVcbiAqICAgICAgYFJlZmxlY3Qub3duS2V5cyhvYmopYCB3aXRoIGBnZXRNZXRob2ROYW1lcyhvYmopYC5cbiAqXG4gKiBPbmNlIGFsbCBwcm9ibGVtYXRpYyBjYXNlcyBoYXZlIGJlZW4gY29udmVydGVkIGluIHRoaXMgbWFubmVyLCB0aGlzXG4gKiBgYmluZEFsbE1ldGhvZHNgIGhhY2sgY2FuIGFuZCBUT0RPIHNob3VsZCBiZSBkZWxldGVkLiBIb3dldmVyLCB3ZSBjdXJyZW50bHlcbiAqIGhhdmUgbm8gcmVsaWFibGUgc3RhdGljIHdheSB0byB0cmFjayBkb3duIGFuZCBmaXggYWxsIGF1dG9iaW5kaW5nIHNpdGVzLlxuICogRm9yIHRob3NlIG9iamVjdHMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBmdWxseSByZXBhaXJlZCBieSB0aGUgYWJvdmUgdHdvXG4gKiB0ZWNobmlxdWVzLCBgYmluZEFsbE1ldGhvZHNgIGNyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgYWN0cyBtdWNoIGxpa2UgdGhlXG4gKiBwcmUtIzU5NzAgb2JqZWN0cywgd2l0aCBhbGwgdGhlaXIgbWV0aG9kcyBhcyBpbnN0YW5jZS1ib3VuZCBvd24gcHJvcGVydGllcy5cbiAqIEl0IGRvZXMgdGhpcyBieSBtYWtpbmcgYSBuZXcgb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgb2JqYCB3aGVyZSB0aGUgbmV3XG4gKiBvYmplY3QgaGFzIGJvdW5kIG93biBtZXRob2RzIG92ZXJyaWRkaW5nIGFsbCB0aGUgbWV0aG9kcyBpdCB3b3VsZCBoYXZlXG4gKiBpbmhlcml0ZWQgZnJvbSBgb2JqYC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgYW55Pn0gVFxuICogQHBhcmFtIHtUfSBvYmpcbiAqIEByZXR1cm5zIHtUfVxuICovJGjigI1fb25jZS5nZXRTdHJpbmdNZXRob2ROYW1lcyhnZXRTdHJpbmdNZXRob2ROYW1lcyk7XG5jb25zdCAgICAgICAgYmluZEFsbE1ldGhvZHM9KG9iaik9PlxuaGFyZGVuKFxuY3JlYXRlKFxub2JqLFxuZnJvbUVudHJpZXMoXG5nZXRNZXRob2ROYW1lcyhvYmopLm1hcCgobmFtZSk9Pltcbm5hbWUsXG57XG52YWx1ZTooLyoqIEB0eXBlIHt1bmtub3duW119ICovLi4uYXJncyk9PlxuYXBwbHkob2JqW25hbWVdLG9iaixhcmdzKSxcbmVudW1lcmFibGU6dHJ1ZX1dKSkpKTskaOKAjV9vbmNlLmJpbmRBbGxNZXRob2RzKGJpbmRBbGxNZXRob2RzKTtcblxuXG5cblxuXG5oYXJkZW4oYmluZEFsbE1ldGhvZHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImdldFN0cmluZ01ldGhvZE5hbWVzIjpbImdldFN0cmluZ01ldGhvZE5hbWVzIl0sImJpbmRBbGxNZXRob2RzIjpbImJpbmRBbGxNZXRob2RzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOpD4SXeAwAA3gMAACwAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdGVzdGluZy11dGlscy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZXZlbnRMb29wSXRlcmF0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqIEBmaWxlIG5vdGUgdGhpcyBjYW5ub3QgYmUgY2FsbGVkIHRlc3QtdXRpbHMuanMgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNzUwMyAqL1xuLyogZ2xvYmFsIHNldEltbWVkaWF0ZSAqL1xuXG4vKipcbiAqIEEgd29ya2Fyb3VuZCBmb3Igc29tZSBpc3N1ZXMgd2l0aCBmYWtlIHRpbWUgaW4gdGVzdHMuXG4gKlxuICogTGluZXMgb2YgdGVzdCBjb2RlIGNhbiBkZXBlbmQgb24gYXN5bmMgcHJvbWlzZXMgb3V0c2lkZSB0aGUgdGVzdFxuICogcmVzb2x2aW5nIGJlZm9yZSB0aGV5IHJ1bi4gQXdhaXRpbmcgdGhpcyBmdW5jdGlvbiByZXN1bHQgZW5zdXJlc1xuICogdGhhdCBhbGwgcHJvbWlzZXMgdGhhdCBjYW4gZG8gcmVzb2x2ZS5cbiAqIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgbWVhbiBhbGwgb3V0c3RhbmRpbmcgcHJvbWlzZXMuXG4gKi9cbmNvbnN0ICAgICAgICBldmVudExvb3BJdGVyYXRpb249YXN5bmMoKT0+XG5uZXcgUHJvbWlzZSgocmVzb2x2ZSk9PnNldEltbWVkaWF0ZShyZXNvbHZlKSk7JGjigI1fb25jZS5ldmVudExvb3BJdGVyYXRpb24oZXZlbnRMb29wSXRlcmF0aW9uKTtcbmhhcmRlbihldmVudExvb3BJdGVyYXRpb24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImV2ZW50TG9vcEl0ZXJhdGlvbiI6WyJldmVudExvb3BJdGVyYXRpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVDn6ES0CAAAtAgAAKQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiU3RvcmFnZU5vZGVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCAgICAgICAgU3RvcmFnZU5vZGVTaGFwZT1NLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKTskaOKAjV9vbmNlLlN0b3JhZ2VOb2RlU2hhcGUoU3RvcmFnZU5vZGVTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiU3RvcmFnZU5vZGVTaGFwZSI6WyJTdG9yYWdlTm9kZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN7GoowrBwAAKwcAACoAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXBncmFkZS1hcGkuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNPYmplY3Q7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIEB0eXBlZGVmIHt7IG5hbWU6IHN0cmluZywgdXBncmFkZU1lc3NhZ2U6IHN0cmluZywgaW5jYXJuYXRpb25OdW1iZXI6IG51bWJlciB9fSBEaXNjb25uZWN0aW9uT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBNYWtlcyBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgdXNlIGFzIHRoZSByZWplY3Rpb24gdmFsdWUgb2YgcHJvbWlzZXNcbiAqIGFiYW5kb25lZCBieSB1cGdyYWRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cGdyYWRlTWVzc2FnZVxuICogQHBhcmFtIHtudW1iZXJ9IHRvSW5jYXJuYXRpb25OdW1iZXJcbiAqIEByZXR1cm5zIHtEaXNjb25uZWN0aW9uT2JqZWN0fVxuICovXG5jb25zdCAgICAgICAgbWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uPSh1cGdyYWRlTWVzc2FnZSx0b0luY2FybmF0aW9uTnVtYmVyKT0+XG5oYXJkZW4oe1xubmFtZTondmF0VXBncmFkZWQnLFxudXBncmFkZU1lc3NhZ2UsXG5pbmNhcm5hdGlvbk51bWJlcjp0b0luY2FybmF0aW9uTnVtYmVyfSk7JGjigI1fb25jZS5tYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuaGFyZGVuKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qIFRPRE86IFNpbXBsaWZ5IG9uY2Ugd2UgaGF2ZSBAZW5kby9wYXR0ZXJucyAob3IganVzdCBleHBvcnQgdGhlIHNoYXBlKS4qL1xuLyogY29uc3QgdXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSA9IGhhcmRlbih7Ki9cbi8qIG5hbWU6ICd2YXRVcGdyYWRlZCcsKi9cbi8qIHVwZ3JhZGVNZXNzYWdlOiBNLnN0cmluZygpLCovXG4vKiBpbmNhcm5hdGlvbk51bWJlcjogTS5udW1iZXIoKSwqL1xuLyogfSk7Ki9cbi8qIGNvbnN0IGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSBlcnIgPT4gbWF0Y2hlcyhlcnIsIHVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpOyovXG4vKipcbiAqIEBwYXJhbSB7YW55fSBlcnJcbiAqIEByZXR1cm5zIHtlcnIgaXMgRGlzY29ubmVjdGlvbk9iamVjdH1cbiAqL1xuY29uc3QgICAgICAgIGlzVXBncmFkZURpc2Nvbm5lY3Rpb249KGVycik9PlxuaXNPYmplY3QoZXJyKSYmXG5lcnIubmFtZT09PSd2YXRVcGdyYWRlZCcmJlxudHlwZW9mIGVyci51cGdyYWRlTWVzc2FnZT09PSdzdHJpbmcnJiZcbnR5cGVvZiBlcnIuaW5jYXJuYXRpb25OdW1iZXI9PT0nbnVtYmVyJzskaOKAjV9vbmNlLmlzVXBncmFkZURpc2Nvbm5lY3Rpb24oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIjpbIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoumxkuM8AADjPAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9zdHJlYW0iLCJqZXNzaWUuanMiXSwiZXhwb3J0cyI6WyJCQVNJU19QT0lOVFMiLCJQcm9taXNlQWxsT3JFcnJvcnMiLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IiwiYWxsVmFsdWVzIiwiYXBwbHlMYWJlbGluZ0Vycm9yIiwiYXNzZXJ0QWxsRGVmaW5lZCIsImRlZXBseUZ1bGZpbGxlZE9iamVjdCIsImZvcmV2ZXIiLCJmcm9tVW5pcXVlRW50cmllcyIsImxpc3REaWZmZXJlbmNlIiwibWFrZUFnZ3JlZ2F0ZUVycm9yIiwibWFrZU1lYXN1cmVTZWNvbmRzIiwib2JqZWN0TWFwIiwic3luY2hyb25pemVkVGVlIiwidGhyb3dMYWJlbGVkIiwidW50aWxUcnVlIiwid2hpbGVUcnVlIiwiemlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsZGVlcGx5RnVsZmlsbGVkLGlzT2JqZWN0LGlzUHJvbWlzZSxtYWtlUHJvbWlzZUtpdCxtYWtlUXVldWUsYXN5bmNHZW5lcmF0ZSxtYWtlU2V0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIiwgWyRo4oCNX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV0sW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3N0cmVhbVwiLCBbW1wibWFrZVF1ZXVlXCIsIFskaOKAjV9hID0+IChtYWtlUXVldWUgPSAkaOKAjV9hKV1dXV0sW1wiamVzc2llLmpzXCIsIFtbXCJhc3luY0dlbmVyYXRlXCIsIFskaOKAjV9hID0+IChhc3luY0dlbmVyYXRlID0gJGjigI1fYSldXSxbXCJtYWtlU2V0XCIsIFskaOKAjV9hID0+IChtYWtlU2V0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxrZXlzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgQkFTSVNfUE9JTlRTPTEwXzAwMG47XG5cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWY8VD4gKi9cblxuLyoqXG4gKiBUaHJvd3MgaWYgbXVsdGlwbGUgZW50cmllcyB1c2UgdGhlIHNhbWUgcHJvcGVydHkgbmFtZS4gT3RoZXJ3aXNlIGFjdHNcbiAqIGxpa2UgYE9iamVjdC5mcm9tRW50cmllc2AgYnV0IGhhcmRlbnMgdGhlIHJlc3VsdC5cbiAqIFVzZSBpdCB0byBwcm90ZWN0IGZyb20gcHJvcGVydHkgbmFtZXMgY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxWXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7W2s6IEtdOiBWfX1cbiAqLyRo4oCNX29uY2UuQkFTSVNfUE9JTlRTKEJBU0lTX1BPSU5UUyk7XG5jb25zdCAgICAgICAgZnJvbVVuaXF1ZUVudHJpZXM9KGFsbEVudHJpZXMpPT57XG5jb25zdCBlbnRyaWVzQXJyYXk9Wy4uLmFsbEVudHJpZXNdO1xuY29uc3QgcmVzdWx0PWhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpKTtcbmlmKG93bktleXMocmVzdWx0KS5sZW5ndGg9PT1lbnRyaWVzQXJyYXkubGVuZ3RoKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuY29uc3QgbmFtZXM9bWFrZVNldCgpO1xuZm9yKGNvbnN0W25hbWUsX11vZiBlbnRyaWVzQXJyYXkpe1xuaWYobmFtZXMuaGFzKG5hbWUpKXtcbkZhaWwgYGNvbGxpc2lvbiBvbiBwcm9wZXJ0eSBuYW1lICR7cShuYW1lKX06ICR7ZW50cmllc0FycmF5fWA7XG4gfVxubmFtZXMuYWRkKG5hbWUpO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYDtcbiB9OyRo4oCNX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2ZcbiAqIGFuIGFycmF5IHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLFxuICogYG9iamVjdE1hcGAgd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIHN0cmluZy1uYW1lZCBvd24gZW51bWVyYWJsZVxuICogcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVHlwaWNhbCB1c2FnZSBhcHBsaWVzIGBvYmplY3RNYXBgIHRvIGEgQ29weVJlY29yZCwgaS5lLixcbiAqIGFuIG9iamVjdCBmb3Igd2hpY2ggYHBhc3NTdHlsZU9mKG9yaWdpbmFsKSA9PT0gJ2NvcHlSZWNvcmQnYC4gRm9yIHRoZXNlLFxuICogbm9uZSBvZiB0aGUgZm9sbG93aW5nIGVkZ2UgY2FzZXMgYXJpc2UuIFRoZSByZXN1bHQgd2lsbCBiZSBhIENvcHlSZWNvcmRcbiAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lcywgd2hvc2UgdmFsdWVzIGFyZSB0aGUgbWFwcGVkIGZvcm0gb2ZcbiAqIHRoZSBvcmlnaW5hbCdzIHZhbHVlcy5cbiAqXG4gKiBXaGVuIHRoZSBvcmlnaW5hbCBpcyBub3QgYSBDb3B5UmVjb3JkLCBzb21lIGVkZ2UgY2FzZXMgdG8gYmUgYXdhcmUgb2ZcbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIE9ubHkgdGhlIHN0cmluZy1uYW1lZCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbFxuICogICAgICBhcmUgbWFwcGVkLiBBbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgaWdub3JlZC5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCBgT2JqZWN0LmVudHJpZXNgXG4gKiAgICAgIHdpbGwgY2F1c2UgaXRzIGBnZXR0ZXJgIHRvIGJlIGNhbGxlZCBhbmQgd2lsbCB1c2UgdGhlIHJlc3VsdGluZ1xuICogICAgICB2YWx1ZS5cbiAqICAgICogTm8gbWF0dGVyIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHByb3BlcnR5IHdhcyBhbiBhY2Nlc3Nvciwgd3JpdGFibGUsXG4gKiAgICAgIG9yIGNvbmZpZ3VyYWJsZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogICAgICBub24td3JpdGFibGUsIG5vbi1jb25maWd1cmFibGUsIGRhdGEgcHJvcGVydGllcy5cbiAqICAgICogTm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBtYXkgaGF2ZSBpbmhlcml0ZWQgZnJvbSwgYW5kXG4gKiAgICAgIG5vIG1hdHRlciB3aGV0aGVyIGl0IHdhcyBhIHNwZWNpYWwga2luZCBvZiBvYmplY3Qgc3VjaCBhcyBhbiBhcnJheSxcbiAqICAgICAgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCBpbmhlcml0aW5nIGRpcmVjdGx5XG4gKiAgICAgIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFuZCB3aG9zZSBzdGF0ZSBpcyBvbmx5IHRoZXNlIG5ldyBtYXBwZWRcbiAqICAgICAgb3duIHByb3BlcnRpZXMuXG4gKlxuICogV2l0aCB0aGVzZSBkaWZmZXJlbmNlcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyBub3QgYSBDb3B5UmVjb3JkLFxuICogaWYgYWxsIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqIGEgQ29weVJlY29yZC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IE9cbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEB0ZW1wbGF0ZSBSIG1hcCByZXN1bHRcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW2tleW9mIE9dLCBrZXk6IGtleW9mIE8pID0+IFJ9IG1hcEZuXG4gKiBAcmV0dXJucyB7eyBbUCBpbiBrZXlvZiBPXTogUn19XG4gKi9cbmNvbnN0ICAgICAgICBvYmplY3RNYXA9KG9yaWdpbmFsLG1hcEZuKT0+e1xuY29uc3QgZW50cz1lbnRyaWVzKG9yaWdpbmFsKTtcbmNvbnN0IG1hcEVudHM9ZW50cy5tYXAoKFtrLHZdKT0+W2ssbWFwRm4odixrKV0pO1xucmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSk7XG4gfTskaOKAjV9vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSBsZWZ0TmFtZXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gcmlnaHROYW1lc1xuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bWFrZVNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB0aHJvd0xhYmVsZWQ9KGlubmVyRXJyLGxhYmVsLEVycm9yQ29uc3RydWN0b3I9dW5kZWZpbmVkKT0+e1xuaWYodHlwZW9mIGxhYmVsPT09J251bWJlcicpe1xubGFiZWw9IGBbJHtsYWJlbH1dYDtcbiB9XG5jb25zdCBvdXRlckVycj1hc3NlcnQuZXJyb3IoXG4gYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YCxcbkVycm9yQ29uc3RydWN0b3IpO1xuXG5hc3NlcnQubm90ZShvdXRlckVycixYIGBDYXVzZWQgYnkgJHtpbm5lckVycn1gKTtcbnRocm93IG91dGVyRXJyO1xuIH07JGjigI1fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBLFJcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gUn0gZnVuY1xuICogQHBhcmFtIHtBW119IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge1J9XG4gKi9cbmNvbnN0ICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3I9KGZ1bmMsYXJncyxsYWJlbD11bmRlZmluZWQpPT57XG5pZihsYWJlbD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYyguLi5hcmdzKTtcbiB9XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG50aHJvd0xhYmVsZWQoZXJyLGxhYmVsKTtcbiB9XG5pZihpc1Byb21pc2UocmVzdWx0KSl7XG4vKiBJZiByZXN1bHQgaXMgYSByZWplY3RlZCBwcm9taXNlLCB0aGlzIHdpbGwgcmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEqL1xuLyogZGlmZmVyZW50IHJlamVjdGlvbiByZWFzb24uIEJ1dCB0aGlzIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyovXG4vKiB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCB3aGljaCBpcyBjb29sIGZvciBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyKi9cbi8qIGZ1bGZpbGwuICBCdXQgVHlwZVNjcmlwdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGlzIHdpbGwgb25seSBoYXBwZW4qL1xuLyogd2hlbiBgcmVzdWx0YCB3YXMgYSByZWplY3RlZCBwcm9taXNlLiBJbiBvbmx5IHRoaXMgY2FzZSBgUmAgc2hvdWxkKi9cbi8qIGFscmVhZHkgYWxsb3cgYFByb21pc2U8bmV2ZXI+YCBhcyBhIHN1YnR5cGUuKi9cbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IHJlbGFiZWxlZD1FLndoZW4ocmVzdWx0LHVuZGVmaW5lZCwocmVhc29uKT0+XG50aHJvd0xhYmVsZWQocmVhc29uLGxhYmVsKSk7XG5cbnJldHVybiAoLyoqIEB0eXBlIHtSfSAqL3JlbGFiZWxlZCk7XG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tbS2V5VHlwZSBpbiBrZXlvZiBUXTogVFtLZXlUeXBlXX0gJiB7fX0gU2ltcGxpZnlcbiAqIGZsYXR0ZW4gdGhlIHR5cGUgb3V0cHV0IHRvIGltcHJvdmUgdHlwZSBoaW50cyBzaG93biBpbiBlZGl0b3JzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3NpbXBsaWZ5LmQudHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0eXBlZGVmIHt7IFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ2FsbGFibGUgPyBUW0tdIDogRGVlcGx5QXdhaXRlZDxUW0tdPiB9fSBEZWVwbHlBd2FpdGVkT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyBQcm9taXNlTGlrZTxhbnk+ID8gQXdhaXRlZDxUPiA6IFQgZXh0ZW5kcyB7fSA/IFNpbXBsaWZ5PERlZXBseUF3YWl0ZWRPYmplY3Q8VD4+IDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogQSBtb3JlIGNvbnN0cmFpbmVkIHZlcnNpb24gb2Yge2RlZXBseUZ1bGZpbGxlZH0gZm9yIHR5cGUgc2FmZXR5IHVudGlsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzEyNTdcbiAqIFVzZWZ1bCBpbiBzdGFydGluZyBjb250cmFjdHMgdGhhdCBuZWVkIGFsbCB0ZXJtcyB0byBiZSBmdWxmaWxsZWRcbiAqIGluIG9yZGVyIHRvIGJlIGR1cmFibGUuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMge30+KHVuZnVsZmlsbGVkVGVybXM6IFQpID0+IFByb21pc2U8RGVlcGx5QXdhaXRlZDxUPj59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWRPYmplY3Q9YXN5bmMob2JqKT0+e1xuaXNPYmplY3Qob2JqKXx8RmFpbCBgcGFyYW0gbXVzdCBiZSBhbiBvYmplY3RgO1xucmV0dXJuIGRlZXBseUZ1bGZpbGxlZChvYmopO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdXNlcyBhIG1pbGxpc2Vjb25kLWJhc2VkIHRpbWUtc2luY2UtZXBvY2ggY2FwYWJpbGl0eVxuICogKHN1Y2ggYXMgYHBlcmZvcm1hbmNlLm5vd2ApIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWUgb2YgYW4gYXN5bmMgZnVuY3Rpb25cbiAqIGFuZCByZXBvcnQgdGhlIHJlc3VsdCBpbiBzZWNvbmRzIHRvIG1hdGNoIG91ciB0ZWxlbWV0cnkgc3RhbmRhcmQuXG4gKlxuICogQHBhcmFtIHt0eXBlb2YgWGltcG9ydCgncGVyZl9ob29rcycpLnBlcmZvcm1hbmNlLm5vd30gY3VycmVudFRpbWVNaWxsaXNlY1xuICogQHJldHVybnMgezxUPihmbjogKCkgPT4gUHJvbWlzZTxUPikgPT4gUHJvbWlzZTx7IHJlc3VsdDogVCwgZHVyYXRpb246IG51bWJlciB9Pn1cbiAqLyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCAgICAgICAgbWFrZU1lYXN1cmVTZWNvbmRzPShjdXJyZW50VGltZU1pbGxpc2VjKT0+e1xuLyoqIEBwYXJhbSB7KCkgPT4gYW55fSBmbiAqL1xuY29uc3QgbWVhc3VyZVNlY29uZHM9YXN5bmMoZm4pPT57XG5jb25zdCB0MD1jdXJyZW50VGltZU1pbGxpc2VjKCk7XG5jb25zdCByZXN1bHQ9YXdhaXQgZm4oKTtcbmNvbnN0IGR1cmF0aW9uTWlsbGlzZWM9Y3VycmVudFRpbWVNaWxsaXNlYygpLXQwO1xucmV0dXJue3Jlc3VsdCxkdXJhdGlvbjpkdXJhdGlvbk1pbGxpc2VjLzEwMDB9O1xuIH07XG5yZXR1cm4gbWVhc3VyZVNlY29uZHM7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yW119IGVycm9yc1xuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXVxuICovJGjigI1fb25jZS5tYWtlTWVhc3VyZVNlY29uZHMobWFrZU1lYXN1cmVTZWNvbmRzKTtcbmNvbnN0ICAgICAgICBtYWtlQWdncmVnYXRlRXJyb3I9KGVycm9ycyxtZXNzYWdlKT0+e1xuY29uc3QgZXJyPUVycm9yKG1lc3NhZ2UpO1xuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZXJyLHtcbm5hbWU6e1xudmFsdWU6J0FnZ3JlZ2F0ZUVycm9yJ30sXG5cbmVycm9yczp7XG52YWx1ZTplcnJvcnN9fSk7XG5cblxucmV0dXJuIGVycjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3JlYWRvbmx5IChUIHwgUHJvbWlzZUxpa2U8VD4pW119IGl0ZW1zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUW10+fVxuICovJGjigI1fb25jZS5tYWtlQWdncmVnYXRlRXJyb3IobWFrZUFnZ3JlZ2F0ZUVycm9yKTtcbmNvbnN0ICAgICAgICBQcm9taXNlQWxsT3JFcnJvcnM9YXN5bmMoaXRlbXMpPT57XG5yZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGl0ZW1zKS50aGVuKChyZXN1bHRzKT0+e1xuY29uc3QgZXJyb3JzPS8qKiBAdHlwZSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0W119ICovXG5yZXN1bHRzLmZpbHRlcigoe3N0YXR1c30pPT5zdGF0dXM9PT0ncmVqZWN0ZWQnKS5cbm1hcCgocmVzdWx0KT0+cmVzdWx0LnJlYXNvbik7XG5pZighZXJyb3JzLmxlbmd0aCl7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxUPltdfSAqL3Jlc3VsdHMubWFwKFxuKHJlc3VsdCk9PnJlc3VsdC52YWx1ZSkpO1xuXG4gfWVsc2UgaWYoZXJyb3JzLmxlbmd0aD09PTEpe1xudGhyb3cgZXJyb3JzWzBdO1xuIH1lbHNle1xudGhyb3cgbWFrZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gfVxuIH0pO1xuIH07XG5cbi8qKlxuICogQHR5cGUgezxUPihcbiAqICAgdHJpZXI6ICgpID0+IFByb21pc2U8VD4sXG4gKiAgZmluYWxpemVyOiAoZXJyb3I/OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+LFxuICogKSA9PiBQcm9taXNlPFQ+fVxuICovJGjigI1fb25jZS5Qcm9taXNlQWxsT3JFcnJvcnMoUHJvbWlzZUFsbE9yRXJyb3JzKTtjb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5PWFzeW5jKHRyaWVyLGZpbmFsaXplcik9PlxudHJpZXIoKS50aGVuKFxuYXN5bmMocmVzdWx0KT0+ZmluYWxpemVyKCkudGhlbigoKT0+cmVzdWx0KSxcbmFzeW5jKHRyeUVycm9yKT0+XG5maW5hbGl6ZXIodHJ5RXJyb3IpLlxudGhlbihcbigpPT50cnlFcnJvcixcbihmaW5hbGl6ZUVycm9yKT0+bWFrZUFnZ3JlZ2F0ZUVycm9yKFt0cnlFcnJvcixmaW5hbGl6ZUVycm9yXSkpLlxuXG50aGVuKChlcnJvcik9PlByb21pc2UucmVqZWN0KGVycm9yKSkpO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVFxuICogQHR5cGVkZWYge3tbUCBpbiBrZXlvZiBUXTogRXhjbHVkZTxUW1BdLCB1bmRlZmluZWQ+O319IEFsbERlZmluZWRcbiAqL1xuXG4vKipcbiAqIENvbmNpc2Ugd2F5IHRvIGNoZWNrIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGZyb20gb2JqZWN0IGxpdGVyYWwgc2hvcnRoYW5kLlxuICogVGhyb3dzIGVycm9yIG1lc3NhZ2UgdG8gc3BlY2lmeSB0aGUgbWlzc2luZyB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVFxuICogQHBhcmFtIHtUfSBvYmpcbiAqIEB0aHJvd3MgaWYgYW55IHZhbHVlIGluIHRoZSBvYmplY3QgZW50cmllcyBpcyBub3QgZGVmaW5lZFxuICogQHJldHVybnMge2Fzc2VydHMgb2JqIGlzIEFsbERlZmluZWQ8VD59XG4gKi8kaOKAjV9vbmNlLmFnZ3JlZ2F0ZVRyeUZpbmFsbHkoYWdncmVnYXRlVHJ5RmluYWxseSk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRBbGxEZWZpbmVkPShvYmopPT57XG5jb25zdCBtaXNzaW5nPVtdO1xuZm9yKGNvbnN0W2tleSx2YWxdb2YgT2JqZWN0LmVudHJpZXMob2JqKSl7XG5pZih2YWw9PT11bmRlZmluZWQpe1xubWlzc2luZy5wdXNoKGtleSk7XG4gfVxuIH1cbmlmKG1pc3NpbmcubGVuZ3RoPjApe1xuRmFpbCBgbWlzc2luZyAke3EobWlzc2luZyl9YDtcbiB9XG4gfTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDx1bmRlZmluZWQsIG5ldmVyPn0gKi8kaOKAjV9vbmNlLmFzc2VydEFsbERlZmluZWQoYXNzZXJ0QWxsRGVmaW5lZCk7XG5jb25zdCBub3REb25lPWhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTp1bmRlZmluZWR9KTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxuZXZlciwgdm9pZD59ICovXG5jb25zdCBhbHdheXNEb25lPWhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuXG5jb25zdCAgICAgICAgZm9yZXZlcj1hc3luY0dlbmVyYXRlKCgpPT5ub3REb25lKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUfSBwcm9kdWNlXG4gKiBUaGUgdmFsdWUgb2YgYGF3YWl0IHByb2R1Y2UoKWAgaXMgdXNlZCBmb3IgaXRzIHRydXRoaW5lc3MgdnMgZmFsc2luZXNzLlxuICogSU9XLCBpdCBpcyBjb2VyY2VkIHRvIGEgYm9vbGVhbiBzbyB0aGUgY2FsbGVyIG5lZWQgbm90IGJvdGhlciBkb2luZyB0aGlzXG4gKiB0aGVtc2VsdmVzLlxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8QXdhaXRlZDxUPj59XG4gKi8kaOKAjV9vbmNlLmZvcmV2ZXIoZm9yZXZlcik7XG5jb25zdCAgICAgICAgd2hpbGVUcnVlPShwcm9kdWNlKT0+XG5hc3luY0dlbmVyYXRlKGFzeW5jKCk9PntcbmNvbnN0IHZhbHVlPWF3YWl0IHByb2R1Y2UoKTtcbmlmKCF2YWx1ZSl7XG5yZXR1cm4gYWx3YXlzRG9uZTtcbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmRvbmU6ZmFsc2UsXG52YWx1ZX0pO1xuXG4gfSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVH0gcHJvZHVjZVxuICogVGhlIHZhbHVlIG9mIGBhd2FpdCBwcm9kdWNlKClgIGlzIHVzZWQgZm9yIGl0cyB0cnV0aGluZXNzIHZzIGZhbHNpbmVzcy5cbiAqIElPVywgaXQgaXMgY29lcmNlZCB0byBhIGJvb2xlYW4gc28gdGhlIGNhbGxlciBuZWVkIG5vdCBib3RoZXIgZG9pbmcgdGhpc1xuICogdGhlbXNlbHZlcy5cbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPEF3YWl0ZWQ8VD4+fVxuICovJGjigI1fb25jZS53aGlsZVRydWUod2hpbGVUcnVlKTtcbmNvbnN0ICAgICAgICB1bnRpbFRydWU9KHByb2R1Y2UpPT5cbmFzeW5jR2VuZXJhdGUoYXN5bmMoKT0+e1xuY29uc3QgdmFsdWU9YXdhaXQgcHJvZHVjZSgpO1xuaWYodmFsdWUpe1xucmV0dXJuIGhhcmRlbih7XG5kb25lOnRydWUsXG52YWx1ZX0pO1xuXG4gfVxucmV0dXJuIGhhcmRlbih7XG5kb25lOmZhbHNlLFxudmFsdWV9KTtcblxuIH0pO1xuXG4vKiogQHR5cGUgeyA8WCwgWT4oeHM6IFhbXSwgeXM6IFlbXSkgPT4gW1gsIFldW119ICovJGjigI1fb25jZS51bnRpbFRydWUodW50aWxUcnVlKTtcbmNvbnN0ICAgICAgICB6aXA9KHhzLHlzKT0+aGFyZGVuKHhzLm1hcCgoeCxpKT0+W3gseXNbK2ldXSkpO1xuXG4vKiogQHR5cGUgeyA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEVSZWY8YW55Pj4+KG9iajogVCkgPT4gUHJvbWlzZTx7IFtLIGluIGtleW9mIFRdOiBBd2FpdGVkPFRbS10+fT4gfSAqLyRo4oCNX29uY2UuemlwKHppcCk7XG5jb25zdCAgICAgICAgYWxsVmFsdWVzPWFzeW5jKG9iaik9PntcbmNvbnN0IHJlc29sdmVkPWF3YWl0IFByb21pc2UuYWxsKHZhbHVlcyhvYmopKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKHppcChrZXlzKG9iaikscmVzb2x2ZWQpKSk7XG4gfTtcblxuLyoqXG4gKiBBIHRlZSBpbXBsZW1lbnRhdGlvbiB3aGVyZSBhbGwgcmVhZGVycyBhcmUgc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlci5cbiAqIFRoZXkgYWxsIGNvbnN1bWUgdGhlIHNvdXJjZSBzdHJlYW0gaW4gbG9ja3N0ZXAsIGFuZCBhbnkgb25lIHJldHVybmluZyBvclxuICogdGhyb3dpbmcgZWFybHkgd2lsbCBhZmZlY3QgdGhlIG90aGVycy5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7QXN5bmNJdGVyYXRvcjxULCB2b2lkLCB2b2lkPn0gc291cmNlU3RyZWFtXG4gKiBAcGFyYW0ge251bWJlcn0gcmVhZGVyQ291bnRcbiAqLyRo4oCNX29uY2UuYWxsVmFsdWVzKGFsbFZhbHVlcyk7XG5jb25zdCAgICAgICAgc3luY2hyb25pemVkVGVlPShzb3VyY2VTdHJlYW0scmVhZGVyQ291bnQpPT57XG4vKiogQHR5cGUge0l0ZXJhdG9yUmV0dXJuUmVzdWx0PHZvaWQ+IHwgdW5kZWZpbmVkfSAqL1xubGV0IGRvbmVSZXN1bHQ7XG5cbi8qKiBAdHlwZWRlZiB7SXRlcmF0b3JSZXN1bHQ8KHZhbHVlOiBQcm9taXNlTGlrZTxJdGVyYXRvclJlc3VsdDxUPj4pID0+IHZvaWQ+fSBRdWV1ZVBheWxvYWQgKi9cbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vc3RyZWFtJykuQXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+W119ICovXG5jb25zdCBxdWV1ZXM9W107XG5cbi8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbmNvbnN0IHB1bGxOZXh0PWFzeW5jKCk9PntcbmNvbnN0IHJlcXVlc3RzPWF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChxdWV1ZXMubWFwKChxdWV1ZSk9PnF1ZXVlLmdldCgpKSk7XG5jb25zdCByZWplY3Rpb25zPVtdO1xuLyoqIEB0eXBlIHtBcnJheTwodmFsdWU6IFByb21pc2VMaWtlPEl0ZXJhdG9yUmVzdWx0PFQ+PikgPT4gdm9pZD59ICovXG5jb25zdCByZXNvbHZlcnM9W107XG5sZXQgZG9uZT1mYWxzZTtcbmZvcihjb25zdCBzZXR0bGVkUmVzdWx0IG9mIHJlcXVlc3RzKXtcbmlmKHNldHRsZWRSZXN1bHQuc3RhdHVzPT09J3JlamVjdGVkJyl7XG5yZWplY3Rpb25zLnB1c2goc2V0dGxlZFJlc3VsdC5yZWFzb24pO1xuIH1lbHNle1xuZG9uZXx8PSEhc2V0dGxlZFJlc3VsdC52YWx1ZS5kb25lO1xucmVzb2x2ZXJzLnB1c2goc2V0dGxlZFJlc3VsdC52YWx1ZS52YWx1ZSk7XG4gfVxuIH1cbi8qKiBAdHlwZSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj59ICovXG5sZXQgcmVzdWx0O1xuaWYoZG9uZVJlc3VsdCl7XG5yZXN1bHQ9UHJvbWlzZS5yZXNvbHZlKGRvbmVSZXN1bHQpO1xuIH1lbHNlIGlmKHJlamVjdGlvbnMubGVuZ3RoKXtcbmNvbnN0IGVycm9yPWFzc2VydC5lcnJvcihhc3NlcnQuZGV0YWlscyBgVGVlZCBzdHJlYW0gdGhyZXdgKTtcbmFzc2VydC5ub3RlKGVycm9yLGFzc2VydC5kZXRhaWxzIGBUZWVkIHJlamVjdGlvbnM6ICR7cmVqZWN0aW9uc31gKTtcbnJlc3VsdD1cbnNvdXJjZVN0cmVhbS50aHJvdz8uKGVycm9yKXx8XG5Qcm9taXNlLnJlc29sdmUoc291cmNlU3RyZWFtLnJldHVybj8uKCkpLnRoZW4oKCk9PlxuUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcblxuIH1lbHNlIGlmKGRvbmUpe1xucmVzdWx0PVxuc291cmNlU3RyZWFtLnJldHVybj8uKCl8fFxuUHJvbWlzZS5yZXNvbHZlKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfWVsc2V7XG5yZXN1bHQ9c291cmNlU3RyZWFtLm5leHQoKTtcbiB9XG5yZXN1bHQudGhlbihcbihyKT0+e1xuaWYoci5kb25lKXtcbmRvbmVSZXN1bHQ9cjtcbiB9XG4gfSxcbigpPT57XG5kb25lUmVzdWx0PXtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfTtcbiB9KTtcblxucmVzb2x2ZXJzLmZvckVhY2goKHJlc29sdmUpPT5yZXNvbHZlKHJlc3VsdCkpO1xucmV0dXJuIHB1bGxOZXh0KCk7XG4gfTtcblxuY29uc3QgcmVhZGVycz1BcnJheS5mcm9tKHtsZW5ndGg6cmVhZGVyQ291bnR9KS5tYXAoKCk9Pntcbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vc3RyZWFtJykuQXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+fSAqL1xuY29uc3QgcXVldWU9bWFrZVF1ZXVlKCk7XG5xdWV1ZXMucHVzaChxdWV1ZSk7XG5cbi8qKiBAdHlwZSB7QXN5bmNHZW5lcmF0b3I8VCwgdm9pZCwgdm9pZD59ICovXG5jb25zdCByZWFkZXI9aGFyZGVuKHtcbiAgICAgIGFzeW5jIG5leHQoKXtcbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlS2l0PEl0ZXJhdG9yUmVzdWx0PFQ+Pn0gKi9cbmNvbnN0e3Byb21pc2UscmVzb2x2ZX09bWFrZVByb21pc2VLaXQoKTtcbnF1ZXVlLnB1dCh7dmFsdWU6cmVzb2x2ZSxkb25lOmZhbHNlfSk7XG5yZXR1cm4gcHJvbWlzZTtcbiB9LFxuICAgICAgYXN5bmMgcmV0dXJuKCl7XG4vKiogQHR5cGUge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZUtpdDxJdGVyYXRvclJlc3VsdDxUPj59ICovXG5jb25zdHtwcm9taXNlLHJlc29sdmV9PW1ha2VQcm9taXNlS2l0KCk7XG5xdWV1ZS5wdXQoe3ZhbHVlOnJlc29sdmUsZG9uZTp0cnVlfSk7XG5yZXR1cm4gcHJvbWlzZTtcbiB9LFxuICAgICAgYXN5bmMgdGhyb3cocmVhc29uKXtcbmNvbnN0IHJlamVjdGlvbj1Qcm9taXNlLnJlamVjdChyZWFzb24pO1xucXVldWUucHV0KHJlamVjdGlvbik7XG5yZXR1cm4gcmVqZWN0aW9uO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiByZWFkZXI7XG4gfX0pO1xuXG5yZXR1cm4gcmVhZGVyO1xuIH0pO1xuXG52b2lkIHB1bGxOZXh0KCk7XG5yZXR1cm4gcmVhZGVycztcbiB9OyRo4oCNX29uY2Uuc3luY2hyb25pemVkVGVlKHN5bmNocm9uaXplZFRlZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQkFTSVNfUE9JTlRTIjpbIkJBU0lTX1BPSU5UUyJdLCJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl0sImxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl0sInRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXSwiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXSwibWFrZUFnZ3JlZ2F0ZUVycm9yIjpbIm1ha2VBZ2dyZWdhdGVFcnJvciJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJhc3NlcnRBbGxEZWZpbmVkIjpbImFzc2VydEFsbERlZmluZWQiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXSwic3luY2hyb25pemVkVGVlIjpbInN5bmNocm9uaXplZFRlZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+Ylw2XAEAAFwBAAAiAAAAQGFnb3JpYy9uZXR3b3JrLXYwLjEuMC9leHBvcnRlZC5qc3siaW1wb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAB35TaDoYAAA6GAAAIwAAAEBhZ29yaWMvbmV0d29yay12MC4xLjAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgQnVmZmVyIHwgQXJyYXlCdWZmZXJ9IERhdGFcbiAqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBCeXRlc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gRW5kcG9pbnQgQSBsb2NhbCBvciByZW1vdGUgYWRkcmVzcyBTZWUgbXVsdGlhZGRyLmpzIGZvciBhblxuICogICBvcGluaW9uYXRlZCByb3V0ZXIgaW1wbGVtZW50YXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENsb3NhYmxlIEEgY2xvc2FibGUgb2JqZWN0XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8dm9pZD59IGNsb3NlIFRlcm1pbmF0ZSB0aGUgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcm90b2NvbCBUaGUgbmV0d29yayBQcm90b2NvbFxuICogQHByb3BlcnR5IHsocHJlZml4OiBFbmRwb2ludCkgPT4gUHJvbWlzZTxQb3J0Pn0gYmluZCBDbGFpbSBhIHBvcnQsIG9yIGlmXG4gKiAgIGVuZGluZyBpbiBFTkRQT0lOVF9TRVBBUkFUT1IsIGEgZnJlc2ggbmFtZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUG9ydCBBIHBvcnQgdGhhdCBoYXMgYmVlbiBib3VuZCB0byBhIHByb3RvY29sXG4gKiBAcHJvcGVydHkgeygpID0+IEVuZHBvaW50fSBnZXRMb2NhbEFkZHJlc3MgR2V0IHRoZSBsb2NhbGx5IGJvdW5kIG5hbWUgb2YgdGhpc1xuICogICBwb3J0XG4gKiBAcHJvcGVydHkgeyhhY2NlcHRIYW5kbGVyOiBMaXN0ZW5IYW5kbGVyKSA9PiBQcm9taXNlPHZvaWQ+fSBhZGRMaXN0ZW5lclxuICogICBCZWdpbiBhY2NlcHRpbmcgaW5jb21pbmcgY29ubmVjdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGU6IEVuZHBvaW50LFxuICogICBjb25uZWN0aW9uSGFuZGxlcj86IENvbm5lY3Rpb25IYW5kbGVyLFxuICogKSA9PiBQcm9taXNlPENvbm5lY3Rpb24+fSBjb25uZWN0XG4gKiAgIE1ha2UgYW4gb3V0Ym91bmQgY29ubmVjdGlvblxuICogQHByb3BlcnR5IHsoYWNjZXB0SGFuZGxlcjogTGlzdGVuSGFuZGxlcikgPT4gUHJvbWlzZTx2b2lkPn0gcmVtb3ZlTGlzdGVuZXJcbiAqICAgUmVtb3ZlIHRoZSBjdXJyZW50bHktYm91bmQgbGlzdGVuZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gcmV2b2tlIERlYWxsb2NhdGUgdGhlIHBvcnQgZW50aXJlbHksIHJlbW92aW5nIGFsbFxuICogICBsaXN0ZW5lcnMgYW5kIGNsb3NpbmcgYWxsIGFjdGl2ZSBjb25uZWN0aW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTGlzdGVuSGFuZGxlciBBIGhhbmRsZXIgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zXG4gKiBAcHJvcGVydHkgeyhwb3J0OiBQb3J0LCBsOiBMaXN0ZW5IYW5kbGVyKSA9PiBQcm9taXNlPHZvaWQ+fSBbb25MaXN0ZW5dIFRoZVxuICogICBsaXN0ZW5lciBoYXMgYmVlbiByZWdpc3RlcmVkXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcG9ydDogUG9ydCxcbiAqICAgbG9jYWxBZGRyOiBFbmRwb2ludCxcbiAqICAgcmVtb3RlQWRkcjogRW5kcG9pbnQsXG4gKiAgIGw6IExpc3RlbkhhbmRsZXIsXG4gKiApID0+IFByb21pc2U8Q29ubmVjdGlvbkhhbmRsZXI+fSBvbkFjY2VwdFxuICogICBBIG5ldyBjb25uZWN0aW9uIGlzIGluY29taW5nXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcG9ydDogUG9ydCxcbiAqICAgbG9jYWxBZGRyOiBFbmRwb2ludCxcbiAqICAgcmVtb3RlQWRkcjogRW5kcG9pbnQsXG4gKiAgIGw6IExpc3RlbkhhbmRsZXIsXG4gKiApID0+IFByb21pc2U8dm9pZD59IFtvblJlamVjdF1cbiAqICAgVGhlIGNvbm5lY3Rpb24gd2FzIHJlamVjdGVkXG4gKiBAcHJvcGVydHkgeyhwb3J0OiBQb3J0LCByZWo6IGFueSwgbDogTGlzdGVuSGFuZGxlcikgPT4gUHJvbWlzZTx2b2lkPn0gW29uRXJyb3JdXG4gKiAgIFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBsaXN0ZW5pbmdcbiAqIEBwcm9wZXJ0eSB7KHBvcnQ6IFBvcnQsIGw6IExpc3RlbkhhbmRsZXIpID0+IFByb21pc2U8dm9pZD59IFtvblJlbW92ZV0gVGhlXG4gKiAgIGxpc3RlbmVyIGhhcyBiZWVuIHJlbW92ZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbm5lY3Rpb25cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwYWNrZXRCeXRlczogRGF0YSxcbiAqICAgb3B0cz86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gKiApID0+IFByb21pc2U8Qnl0ZXM+fSBzZW5kXG4gKiAgIFNlbmQgYSBwYWNrZXQgb24gdGhlIGNvbm5lY3Rpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gY2xvc2UgQ2xvc2UgYm90aCBlbmRzIG9mIHRoZSBjb25uZWN0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEVuZHBvaW50fSBnZXRMb2NhbEFkZHJlc3MgR2V0IHRoZSBsb2NhbGx5IGJvdW5kIG5hbWUgb2YgdGhpc1xuICogICBjb25uZWN0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEVuZHBvaW50fSBnZXRSZW1vdGVBZGRyZXNzIEdldCB0aGUgbmFtZSBvZiB0aGUgY291bnRlcnBhcnR5XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb25uZWN0aW9uSGFuZGxlciBBIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gQ29ubmVjdGlvblxuICogQHByb3BlcnR5IHsoXG4gKiAgIGNvbm5lY3Rpb246IENvbm5lY3Rpb24sXG4gKiAgIGxvY2FsQWRkcjogRW5kcG9pbnQsXG4gKiAgIHJlbW90ZUFkZHI6IEVuZHBvaW50LFxuICogICBjOiBDb25uZWN0aW9uSGFuZGxlcixcbiAqICkgPT4gdm9pZH0gW29uT3Blbl1cbiAqICAgVGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gb3BlbmVkXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgY29ubmVjdGlvbjogQ29ubmVjdGlvbixcbiAqICAgcGFja2V0Qnl0ZXM6IEJ5dGVzLFxuICogICBjOiBDb25uZWN0aW9uSGFuZGxlcixcbiAqICAgb3B0cz86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gKiApID0+IFByb21pc2U8RGF0YT59IFtvblJlY2VpdmVdXG4gKiAgIFRoZSBjb25uZWN0aW9uIHJlY2VpdmVkIGEgcGFja2V0XG4gKiBAcHJvcGVydHkgeyhcbiAqICAgY29ubmVjdGlvbjogQ29ubmVjdGlvbixcbiAqICAgcmVhc29uPzogQ2xvc2VSZWFzb24sXG4gKiAgIGM/OiBDb25uZWN0aW9uSGFuZGxlcixcbiAqICkgPT4gUHJvbWlzZTx2b2lkPn0gW29uQ2xvc2VdXG4gKiAgIFRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZFxuICpcbiAqIEB0eXBlZGVmIHthbnkgfCBudWxsfSBDbG9zZVJlYXNvbiBUaGUgcmVhc29uIGEgY29ubmVjdGlvbiB3YXMgY2xvc2VkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdHRlbXB0RGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7Q29ubmVjdGlvbkhhbmRsZXJ9IGhhbmRsZXJcbiAqIEBwcm9wZXJ0eSB7RW5kcG9pbnR9IFtyZW1vdGVBZGRyZXNzXVxuICogQHByb3BlcnR5IHtFbmRwb2ludH0gW2xvY2FsQWRkcmVzc11cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByb3RvY29sSGFuZGxlciBBIGhhbmRsZXIgZm9yIHRoaW5ncyB0aGUgcHJvdG9jb2xcbiAqICAgaW1wbGVtZW50YXRpb24gd2lsbCBpbnZva2VcbiAqIEBwcm9wZXJ0eSB7KHByb3RvY29sOiBQcm90b2NvbEltcGwsIHA6IFByb3RvY29sSGFuZGxlcikgPT4gUHJvbWlzZTx2b2lkPn0gb25DcmVhdGVcbiAqICAgVGhpcyBwcm90b2NvbCBpcyBjcmVhdGVkXG4gKiBAcHJvcGVydHkgeyhsb2NhbEFkZHI6IEVuZHBvaW50LCBwOiBQcm90b2NvbEhhbmRsZXIpID0+IFByb21pc2U8c3RyaW5nPn0gZ2VuZXJhdGVQb3J0SURcbiAqICAgQ3JlYXRlIGEgZnJlc2ggcG9ydCBpZGVudGlmaWVyIGZvciB0aGlzIHByb3RvY29sXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcG9ydDogUG9ydCxcbiAqICAgbG9jYWxBZGRyOiBFbmRwb2ludCxcbiAqICAgcDogUHJvdG9jb2xIYW5kbGVyLFxuICogKSA9PiBQcm9taXNlPHZvaWQ+fSBvbkJpbmRcbiAqICAgQSBwb3J0IHdpbGwgYmUgYm91bmRcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwb3J0OiBQb3J0LFxuICogICBsb2NhbEFkZHI6IEVuZHBvaW50LFxuICogICBsaXN0ZW5IYW5kbGVyOiBMaXN0ZW5IYW5kbGVyLFxuICogICBwOiBQcm90b2NvbEhhbmRsZXIsXG4gKiApID0+IFByb21pc2U8dm9pZD59IG9uTGlzdGVuXG4gKiAgIEEgcG9ydCB3YXMgbGlzdGVuaW5nXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcG9ydDogUG9ydCxcbiAqICAgbG9jYWxBZGRyOiBFbmRwb2ludCxcbiAqICAgbGlzdGVuSGFuZGxlcjogTGlzdGVuSGFuZGxlcixcbiAqICAgcDogUHJvdG9jb2xIYW5kbGVyLFxuICogKSA9PiBQcm9taXNlPHZvaWQ+fSBvbkxpc3RlblJlbW92ZVxuICogICBBIHBvcnQgbGlzdGVuZXIgaGFzIGJlZW4gcmVzZXRcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwb3J0OiBQb3J0LFxuICogICBsb2NhbEFkZHI6IEVuZHBvaW50LFxuICogICByZW1vdGU6IEVuZHBvaW50LFxuICogICBwOiBQcm90b2NvbEhhbmRsZXIsXG4gKiApID0+IFByb21pc2U8RW5kcG9pbnQ+fSBbb25JbnN0YW50aWF0ZV1cbiAqICAgUmV0dXJuIHVuaXF1ZSBzdWZmaXggZm9yIGxvY2FsIGFkZHJlc3NcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwb3J0OiBQb3J0LFxuICogICBsb2NhbEFkZHI6IEVuZHBvaW50LFxuICogICByZW1vdGU6IEVuZHBvaW50LFxuICogICBjOiBDb25uZWN0aW9uSGFuZGxlcixcbiAqICAgcDogUHJvdG9jb2xIYW5kbGVyLFxuICogKSA9PiBQcm9taXNlPEF0dGVtcHREZXNjcmlwdGlvbj59IG9uQ29ubmVjdFxuICogICBBIHBvcnQgaW5pdGlhdGVzIGFuIG91dGJvdW5kIGNvbm5lY3Rpb25cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwb3J0OiBQb3J0LFxuICogICBsb2NhbEFkZHI6IEVuZHBvaW50LFxuICogICBwOiBQcm90b2NvbEhhbmRsZXIsXG4gKiApID0+IFByb21pc2U8dm9pZD59IG9uUmV2b2tlXG4gKiAgIFRoZSBwb3J0IGlzIGJlaW5nIGNvbXBsZXRlbHkgZGVzdHJveWVkXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5ib3VuZEF0dGVtcHQgQW4gaW5ib3VuZCBjb25uZWN0aW9uIGF0dGVtcHRcbiAqIEBwcm9wZXJ0eSB7KGRlc2M6IEF0dGVtcHREZXNjcmlwdGlvbikgPT4gUHJvbWlzZTxDb25uZWN0aW9uPn0gYWNjZXB0XG4gKiAgIEVzdGFibGlzaCB0aGUgY29ubmVjdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBFbmRwb2ludH0gZ2V0TG9jYWxBZGRyZXNzIFJldHVybiB0aGUgbG9jYWwgYWRkcmVzcyBmb3IgdGhpc1xuICogICBhdHRlbXB0XG4gKiBAcHJvcGVydHkgeygpID0+IEVuZHBvaW50fSBnZXRSZW1vdGVBZGRyZXNzIFJldHVybiB0aGUgcmVtb3RlIGFkZHJlc3MgZm9yXG4gKiAgIHRoaXMgYXR0ZW1wdFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjbG9zZSBBYm9ydCB0aGUgYXR0ZW1wdFxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByb3RvY29sSW1wbCBUaGluZ3MgdGhlIHByb3RvY29sIGNhbiBkbyBmb3IgdXNcbiAqIEBwcm9wZXJ0eSB7KHByZWZpeDogRW5kcG9pbnQpID0+IFByb21pc2U8UG9ydD59IGJpbmQgQ2xhaW0gYSBwb3J0LCBvciBpZlxuICogICBlbmRpbmcgaW4gRU5EUE9JTlRfU0VQQVJBVE9SLCBhIGZyZXNoIG5hbWVcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBsaXN0ZW5BZGRyOiBFbmRwb2ludCxcbiAqICAgcmVtb3RlQWRkcjogRW5kcG9pbnQsXG4gKiApID0+IFByb21pc2U8SW5ib3VuZEF0dGVtcHQ+fSBpbmJvdW5kXG4gKiAgIE1ha2UgYW4gYXR0ZW1wdCB0byBjb25uZWN0IGludG8gdGhpcyBwcm90b2NvbFxuICogQHByb3BlcnR5IHsoXG4gKiAgIHBvcnQ6IFBvcnQsXG4gKiAgIHJlbW90ZUFkZHI6IEVuZHBvaW50LFxuICogICBjb25uZWN0aW9uSGFuZGxlcjogQ29ubmVjdGlvbkhhbmRsZXIsXG4gKiApID0+IFByb21pc2U8Q29ubmVjdGlvbj59IG91dGJvdW5kXG4gKiAgIENyZWF0ZSBhbiBvdXRib3VuZCBjb25uZWN0aW9uXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAq4ojpmwBAABsAQAAIwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAzbURkdUSAADVEgAAMwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N1YnNjcmliZS5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLHN1YnNjcmliZUxhdGVzdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBzdWJzY3JpYmVMYXRlc3RgIGZyb20gYEBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzYCBpbnN0ZWFkLlxuICpcbiAqIEFkYXB0b3IgZnJvbSBhIG5vdGlmaWVyUCB0byBhbiBhc3luYyBpdGVyYWJsZS5cbiAqIFRoZSBub3RpZmllclAgY2FuIGJlIGFueSBvYmplY3QgdGhhdCBoYXMgYW4gZXZlbnR1YWxseSBpbnZvY2FibGVcbiAqIGBnZXRVcGRhdGVTaW5jZWAgbWV0aG9kIHRoYXQgYmVoYXZlcyBhY2NvcmRpbmcgdG8gdGhlIG5vdGlmaWVyXG4gKiBzcGVjLiBUaGlzIGNhbiBiZSBhIG5vdGlmaWVyLCBhIHByb21pc2UgZm9yIGEgbG9jYWwgb3IgcmVtb3RlXG4gKiBub3RpZmllciwgb3IgYSBwcmVzZW5jZSBvZiBhIHJlbW90ZSBub3RpZmllci5cbiAqXG4gKiBJdCBpcyBhbHNvIHVzZWQgaW50ZXJuYWxseSBieSBub3RpZmllci5qcyBzbyB0aGF0IGEgbm90aWZpZXIgaXRzZWxmIGlzIGFuXG4gKiBhc3luYyBpdGVyYWJsZS5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYWJsZSBpcyBhbiBvYmplY3Qgd2l0aCBhIGBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClgIG1ldGhvZFxuICogdGhhdCByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhdG9yLiBUaGUgYXN5bmMgaXRlcmF0b3Igd2UgcmV0dXJuIGhlcmUgaGFzIG9ubHlcbiAqIGEgYG5leHQoKWAgbWV0aG9kLCB3aXRob3V0IHRoZSBvcHRpb25hbCBgcmV0dXJuYCBhbmQgYHRocm93YCBtZXRob2RzLiBUaGVcbiAqIG9taXR0ZWQgbWV0aG9kcywgaWYgcHJlc2VudCwgd291bGQgYmUgdXNlZCBieSB0aGUgZm9yL2F3YWl0L29mIGxvb3AgdG9cbiAqIGluZm9ybSB0aGUgaXRlcmF0b3Igb2YgZWFybHkgdGVybWluYXRpb24uIEJ1dCB0aGlzIGFkYXB0b3Igd291bGQgbm90IGRvXG4gKiBhbnl0aGluZyB1c2VmdWwgaW4gcmVhY3Rpb24gdG8gdGhpcyBub3RpZmljYXRpb24uXG4gKlxuICogQW4gYXN5bmMgaXRlcmF0b3IncyBgbmV4dCgpYCBtZXRob2QgcmV0dXJucyBhIHByb21pc2UgZm9yIGFuIGl0ZXJhdGlvblxuICogcmVzdWx0LiBBbiBpdGVyYXRpb24gcmVzdWx0IGlzIGEgcmVjb3JkIHdpdGggYHZhbHVlYCBhbmQgYGRvbmVgIHByb3BlcnRpZXMuXG4gKlxuICogVGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgb24gdGhlIG5vdGlmaWVyIHByb3RvY29sIGlzIHRvIGhhdmUgYSBsb3NzeVxuICogYWRhcHRvciwgd2hlcmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgY2FuIGJlIG1pc3NlZCBpbiBmYXZvciBvZiBtb3JlIHJlY2VudFxuICogcmVzdWx0cyB3aGljaCBhcmUgdGhlcmVmb3JlIGxlc3Mgc3RhbGUuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9kb2N1bWVudGF0aW9uL2Jsb2IvSEVBRC9tYWluL2d1aWRlcy9qcy1wcm9ncmFtbWluZy9ub3RpZmllcnMubWRcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEJhc2VOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyPXN1YnNjcmliZUxhdGVzdDtcblxuLyoqXG4gKiBUaGlzIGFkdmFuY2VzIGBhc3luY0l0ZXJhdG9yUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdG9yYCBmZWF0dXJlIHRlc3RzIGZvciB0aG9zZSBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhdG9yPFQ+Pn0gYXN5bmNJdGVyYXRvclBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjigI1fb25jZS5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZUl0ZXJhdG9yPShhc3luY0l0ZXJhdG9yUCxpdGVyYXRpb25PYnNlcnZlcik9PntcbnJldHVybiBuZXcgUHJvbWlzZSgoYWNrLG9ic2VydmVyRXJyb3IpPT57XG5jb25zdCByZWN1cj0oKT0+e1xuRS53aGVuKFxuRShhc3luY0l0ZXJhdG9yUCkubmV4dCgpLFxuKHt2YWx1ZSxkb25lfSk9PntcbmlmKGRvbmUpe1xuaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoJiZpdGVyYXRpb25PYnNlcnZlci5maW5pc2godmFsdWUpO1xuYWNrKHVuZGVmaW5lZCk7XG4gfWVsc2V7XG5pdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSYmXG5pdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSh2YWx1ZSk7XG5yZWN1cigpO1xuIH1cbiB9LFxuKHJlYXNvbik9Pntcbml0ZXJhdGlvbk9ic2VydmVyLmZhaWwmJml0ZXJhdGlvbk9ic2VydmVyLmZhaWwocmVhc29uKTtcbmFjayh1bmRlZmluZWQpO1xuIH0pLlxuY2F0Y2gob2JzZXJ2ZXJFcnJvcik7XG4gfTtcbnJlY3VyKCk7XG4gfSk7XG4gfTtcblxuLyoqXG4gKiBUaGlzIHJlYWRzIGZyb20gYGFzeW5jSXRlcmFibGVQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0aW9uYCBmZWF0dXJlIHRlc3RzIGZvciB0aG9zZSBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjigI1fb25jZS5vYnNlcnZlSXRlcmF0b3Iob2JzZXJ2ZUl0ZXJhdG9yKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlSXRlcmF0aW9uPShhc3luY0l0ZXJhYmxlUCxpdGVyYXRpb25PYnNlcnZlcik9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbnJldHVybiBvYnNlcnZlSXRlcmF0b3IoaXRlcmF0b3JQLGl0ZXJhdGlvbk9ic2VydmVyKTtcbiB9O1xuXG4vKipcbiAqIEFzIHVwZGF0ZXMgY29tZSBpbiBmcm9tIHRoZSBwb3NzaWJseSByZW1vdGUgYG5vdGlmaWVyUGAsIHVwZGF0ZVxuICogdGhlIGxvY2FsIGB1cGRhdGVyYC4gU2luY2UgdGhlIHVwZGF0ZXMgY29tZSBmcm9tIGEgbm90aWZpZXIsIHRoZXlcbiAqIGFyZSBsb3NzeSwgaS5lLiwgb25jZSBhIG1vcmUgcmVjZW50IHN0YXRlIGNhbiBiZSByZXBvcnRlZCwgbGVzcyByZWNlbnRcbiAqIHN0YXRlcyBhcmUgYXNzdW1lZCBpcnJlbGV2YW50IGFuZCBkcm9wcGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSBub3RpZmllclBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjigI1fb25jZS5vYnNlcnZlSXRlcmF0aW9uKG9ic2VydmVJdGVyYXRpb24pO1xuY29uc3QgICAgICAgIG9ic2VydmVOb3RpZmllcj0obm90aWZpZXJQLGl0ZXJhdGlvbk9ic2VydmVyKT0+XG5vYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmliZUxhdGVzdChub3RpZmllclApLGl0ZXJhdGlvbk9ic2VydmVyKTskaOKAjV9vbmNlLm9ic2VydmVOb3RpZmllcihvYnNlcnZlTm90aWZpZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl0sIm9ic2VydmVJdGVyYXRvciI6WyJvYnNlcnZlSXRlcmF0b3IiXSwib2JzZXJ2ZUl0ZXJhdGlvbiI6WyJvYnNlcnZlSXRlcmF0aW9uIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATeLvGhwHAAAcBwAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9zdWJzY3JpYmVyLmpzIiwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3N0b3JlZC1ub3RpZmllci5qcyJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllcktpdCIsIm1ha2VOb3RpZmllcktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Iiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZUl0ZXJhdG9yIiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Iiwic3Vic2NyaWJlTGF0ZXN0Iiwic3Vic2NyaWJlTGF0ZXN0Il0sInJlZXhwb3J0cyI6WyIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vc3RvcmVzdWIuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbXV0sW1wiLi9ub3RpZmllci5qc1wiLCBbXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtdXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtdXSxbXCIuL3N0b3Jlc3ViLmpzXCIsIFtdXSxbXCIuL3N0b3JlZC1ub3RpZmllci5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3B1Ymxpc2gta2l0LmpzIjpbWyJtYWtlUHVibGlzaEtpdCIsIm1ha2VQdWJsaXNoS2l0Il0sWyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSxbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIl0sWyJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUVhY2hUb3BpY0kiXSxbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIiwiSXRlcmFibGVMYXRlc3RUb3BpY0kiXSxbIlN1YnNjcmliZXJTaGFwZSIsIlN1YnNjcmliZXJTaGFwZSJdXSwiLi9zdWJzY3JpYmUuanMiOltbInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVFYWNoIl0sWyJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiXV0sIi4vbm90aWZpZXIuanMiOltbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllciJdLFsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0Il0sWyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl0sWyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl1dLCIuL3N1YnNjcmliZXIuanMiOltbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uIl0sWyJtYWtlU3Vic2NyaXB0aW9uS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCJdXSwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyI6W1sib2JzZXJ2ZU5vdGlmaWVyIiwib2JzZXJ2ZU5vdGlmaWVyIl0sWyJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiXSxbIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0aW9uIl0sWyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADLr+BaWhgAAFoYAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL25vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGVuZG8vZmFyIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsRSxGYXIsbWFrZVB1Ymxpc2hLaXQsc3Vic2NyaWJlTGF0ZXN0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVMYXRlc3RcIiwgWyRo4oCNX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHNoYXJhYmxlSW50ZXJuYWxzUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyPShzaGFyYWJsZUludGVybmFsc1ApPT57XG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4uc3Vic2NyaWJlTGF0ZXN0KHNoYXJhYmxlSW50ZXJuYWxzUCksXG5nZXRVcGRhdGVTaW5jZTphc3luYyh1cGRhdGVDb3VudCk9PlxuRShzaGFyYWJsZUludGVybmFsc1ApLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgTm90aWZpZXIgZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIE5vdGlmaWVyIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VOb3RpZmllcmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBOb3RpZmllciBhdCB0aGF0IHNpdGUuXG4gKi9cbmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHM6YXN5bmMoKT0+c2hhcmFibGVJbnRlcm5hbHNQLFxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogVXNlZCBvbmx5IGJ5IGBtYWtlQ2FzdGluZ1NwZWNGcm9tUmVmYC4gIEluc3RlYWQgdGhhdCBmdW5jdGlvbiBzaG91bGQgdXNlXG4gKiB0aGUgYFN0b3JlZEZhY2V0YCBBUEkuXG4gKi9cbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe25vdGlmaWVyfSl9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdWJzY3JpYmVyPFQ+Pn0gc3Vic2NyaWJlclxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovJGjigI1fb25jZS5tYWtlTm90aWZpZXIobWFrZU5vdGlmaWVyKTtcbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcj0oc3Vic2NyaWJlcik9Pntcbi8qKlxuICogQHR5cGUge0xhdGVzdFRvcGljPFQ+fVxuICovXG5jb25zdCBiYXNlTm90aWZpZXI9aGFyZGVuKHtcbmdldFVwZGF0ZVNpbmNlOih1cGRhdGVDb3VudD11bmRlZmluZWQpPT5cbkUoc3Vic2NyaWJlcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpfSk7XG5cblxuLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuLi4uYmFzZU5vdGlmaWVyfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9OyRo4oCNX29uY2UubWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIobWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcblxuLyoqXG4gKiBQcm9kdWNlcyBhIHBhaXIgb2Ygb2JqZWN0cywgd2hpY2ggYWxsb3cgYSBzZXJ2aWNlIHRvIHByb2R1Y2UgYSBzdHJlYW0gb2ZcbiAqIHVwZGF0ZSBwcm9taXNlcy5cbiAqXG4gKiBUaGUgaW5pdGlhbCBzdGF0ZSBhcmd1bWVudCBoYXMgdG8gYmUgdHJ1bHkgb3B0aW9uYWwgZXZlbiB0aG91Z2ggaXQgY2FuXG4gKiBiZSBhbnkgZmlyc3QgY2xhc3MgdmFsdWUgaW5jbHVkaW5nIGB1bmRlZmluZWRgLiBXZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZVxuICogcHJlc2VuY2UgdnMgdGhlIGFic2VuY2Ugb2YgaXQsIHdoaWNoIHdlIGNhbm5vdCBkbyB3aXRoIHRoZSBvcHRpb25hbCBhcmd1bWVudFxuICogc3ludGF4LiBSYXRoZXIgd2UgdXNlIHRoZSBhcml0eSBvZiB0aGUgYGluaXRpYWxTdGF0ZUFycmAgYXJyYXkuXG4gKlxuICogSWYgbm8gaW5pdGlhbCBzdGF0ZSBpcyBwcm92aWRlZCB0byBgbWFrZU5vdGlmaWVyS2l0YCwgdGhlbiBpdCBzdGFydHMgd2l0aG91dFxuICogYW4gaW5pdGlhbCBzdGF0ZS4gSXRzIGluaXRpYWwgc3RhdGUgd2lsbCBpbnN0ZWFkIGJlIHRoZSBzdGF0ZSBvZiB0aGUgZmlyc3RcbiAqIHVwZGF0ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbXSB8IFtUXX0gaW5pdGlhbFN0YXRlQXJyIHRoZSBmaXJzdCBzdGF0ZSB0byBiZSByZXR1cm5lZCAodHlwZWQgYXMgcmVzdCBhcnJheSB0byBwZXJtaXQgYHVuZGVmaW5lZGApXG4gKiBAcmV0dXJucyB7Tm90aWZpZXJSZWNvcmQ8VD59IHRoZSBub3RpZmllciBhbmQgdXBkYXRlclxuICovXG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyS2l0PSguLi5pbml0aWFsU3RhdGVBcnIpPT57XG4vKiogQHR5cGUge1B1Ymxpc2hLaXQ8VD59ICovXG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxuY29uc3Qgbm90aWZpZXI9bWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIoc3Vic2NyaWJlcik7XG5cbmNvbnN0IHVwZGF0ZXI9RmFyKCd1cGRhdGVyJyx7XG51cGRhdGVTdGF0ZTooc3RhdGUpPT5wdWJsaXNoZXIucHVibGlzaChzdGF0ZSksXG5maW5pc2g6KGNvbXBsZXRpb24pPT5wdWJsaXNoZXIuZmluaXNoKGNvbXBsZXRpb24pLFxuZmFpbDoocmVhc29uKT0+cHVibGlzaGVyLmZhaWwocmVhc29uKX0pO1xuXG5cbmFzc2VydChpbml0aWFsU3RhdGVBcnIubGVuZ3RoPD0xLCd0b28gbWFueSBhcmd1bWVudHMnKTtcbmlmKGluaXRpYWxTdGF0ZUFyci5sZW5ndGg9PT0xKXtcbnVwZGF0ZXIudXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlQXJyWzBdKTtcbiB9XG5cbi8qIG5vdGlmaWVyIGZhY2V0IGlzIHNlcGFyYXRlIHNvIGl0IGNhbiBiZSBoYW5kZWQgb3V0IHdoaWxlIHVwZGF0ZXIqL1xuLyogaXMgdGlnaHRseSBoZWxkKi9cbnJldHVybiBoYXJkZW4oe25vdGlmaWVyLHVwZGF0ZXJ9KTtcbiB9O1xuXG4vKipcbiAqIEFkYXB0b3IgZnJvbSBhc3luYyBpdGVyYWJsZSB0byBub3RpZmllci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBUaGUgcmVzdWx0aW5nIG5vdGlmaWVyIGlzIGxvc3NsZXNzLCB3aGljaCBpcyBub3QgZGVzaXJhYmxlLlxuICogUHJlZmVyIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyLCBhbmQgcmVmZXIgdG9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNTQxMyBhbmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU2OTUgZm9yIGNvbnRleHQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqLyRo4oCNX29uY2UubWFrZU5vdGlmaWVyS2l0KG1ha2VOb3RpZmllcktpdCk7XG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGU9KGFzeW5jSXRlcmFibGVQKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG4vKiogQHR5cGUge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG5sZXQgb3B0TmV4dFByb21pc2U7XG5sZXQgY3VycmVudFVwZGF0ZUNvdW50PTBuO1xuLyoqIEB0eXBlIHtFUmVmPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IGN1cnJlbnRSZXNwb25zZTtcbmxldCBmaW5hbD1mYWxzZTtcblxuLyoqXG4gKiBAdHlwZSB7TGF0ZXN0VG9waWM8VD59XG4gKi9cbmNvbnN0IGJhc2VOb3RpZmllcj1GYXIoJ2Jhc2VOb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQ9LTFuKXtcbmlmKHVwZGF0ZUNvdW50PGN1cnJlbnRVcGRhdGVDb3VudCl7XG5pZihjdXJyZW50UmVzcG9uc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuIH1cbiB9ZWxzZSBpZih1cGRhdGVDb3VudCE9PWN1cnJlbnRVcGRhdGVDb3VudCl7XG50aHJvdyBFcnJvcihcbidnZXRVcGRhdGVTaW5jZSBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgdXBkYXRlQ291bnQuJyk7XG5cbiB9XG5cbi8qIFJldHVybiBhIGZpbmFsIHJlc3BvbnNlIGlmIHdlIGhhdmUgb25lLCBvdGhlcndpc2UgYSBwcm9taXNlIGZvciB0aGUgbmV4dCBzdGF0ZS4qL1xuaWYoZmluYWwpe1xuYXNzZXJ0KGN1cnJlbnRSZXNwb25zZSE9PXVuZGVmaW5lZCk7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuaWYoIW9wdE5leHRQcm9taXNlKXtcbmNvbnN0IG5leHRJdGVyUmVzdWx0UD1FKGl0ZXJhdG9yUCkubmV4dCgpO1xub3B0TmV4dFByb21pc2U9RS53aGVuKFxubmV4dEl0ZXJSZXN1bHRQLFxuKHtkb25lLHZhbHVlfSk9PntcbmFzc2VydCghZmluYWwpO1xuaWYoZG9uZSl7XG5maW5hbD10cnVlO1xuIH1cbmN1cnJlbnRVcGRhdGVDb3VudCs9MW47XG5jdXJyZW50UmVzcG9uc2U9aGFyZGVuKHtcbnZhbHVlLFxudXBkYXRlQ291bnQ6ZG9uZT91bmRlZmluZWQ6Y3VycmVudFVwZGF0ZUNvdW50fSk7XG5cbm9wdE5leHRQcm9taXNlPXVuZGVmaW5lZDtcbnJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gfSxcbihfcmVhc29uKT0+e1xuZmluYWw9dHJ1ZTtcbmN1cnJlbnRSZXNwb25zZT1cbi8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSAqL1xubmV4dEl0ZXJSZXN1bHRQO1xub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9KTtcblxuIH1cbnJldHVybiBvcHROZXh0UHJvbWlzZTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi8qIERvbid0IGxlYWsgdGhlIG9yaWdpbmFsIGFzeW5jSXRlcmFibGVQIHNpbmNlIGl0IG1heSBiZSByZW1vdGUgYW5kIHdlIGFsc28qL1xuLyogd2FudCB0aGUgc2FtZSBzZW1hbnRpY3MgZm9yIHRoaXMgZXhwb3NlZCBpdGVyYWJsZSBhbmQgdGhlIGJhc2VOb3RpZmllci4qL1xuLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXJ9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZShtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiXSwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiOlsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCJdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA8exoZczgAAHM4AAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3B1Ymxpc2gta2l0LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9mYXIiLCJAZW5kby9wYXR0ZXJucyIsIkBlbmRvL3Byb21pc2Uta2l0IiwiLi90eXBlcy1hbWJpZW50LmpzIl0sImV4cG9ydHMiOlsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIiwiUHVibGlzaGVySSIsIlN1YnNjcmliZXJJIiwiU3Vic2NyaWJlclNoYXBlIiwiVXBkYXRlQ291bnRTaGFwZSIsIm1ha2VQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHVibGlzaEtpdElLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgY2FuQmVEdXJhYmxlLHByZXBhcmVFeG9DbGFzc0tpdCxFLEZhcixNLG1ha2VQcm9taXNlS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLCBbJGjigI1fYSA9PiAoY2FuQmVEdXJhYmxlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBzaW5rPSgpPT57IH07XG5jb25zdCBtYWtlUXVpZXRSZWplY3Rpb249KHJlYXNvbik9PntcbmNvbnN0IHJlamVjdGlvbj1oYXJkZW4oUHJvbWlzZS5yZWplY3QocmVhc29uKSk7XG52b2lkIEUud2hlbihyZWplY3Rpb24sc2luayxzaW5rKTtcbnJldHVybiByZWplY3Rpb247XG4gfTtcbmNvbnN0IHRvb0ZhclJlamVjdGlvbj1tYWtlUXVpZXRSZWplY3Rpb24oXG5oYXJkZW4obmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwYXN0IGVuZCBvZiBpdGVyYXRpb24uJykpKTtcblxuXG5jb25zdCAgICAgICAgUHVibGlzaGVyST1NLmludGVyZmFjZSgnUHVibGlzaGVyJyx7XG5wdWJsaXNoOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5maW5pc2g6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWw6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKX0pO1xuXG5cbi8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIE5vdGlmaWVyIGBnZXRVcGRhdGVTaW5jZWAuKi8kaOKAjV9vbmNlLlB1Ymxpc2hlckkoUHVibGlzaGVySSk7XG5jb25zdCAgICAgICAgVXBkYXRlQ291bnRTaGFwZT1NLm9yKE0uYmlnaW50KCksTS5udW1iZXIoKSk7JGjigI1fb25jZS5VcGRhdGVDb3VudFNoYXBlKFVwZGF0ZUNvdW50U2hhcGUpO1xuY29uc3QgICAgICAgIFN1YnNjcmliZXJJPU0uaW50ZXJmYWNlKCdTdWJzY3JpYmVyJyx7XG5zdWJzY3JpYmVBZnRlcjpNLmNhbGwoKS5vcHRpb25hbChNLmJpZ2ludCgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldFVwZGF0ZVNpbmNlOk0uY2FsbCgpLm9wdGlvbmFsKFVwZGF0ZUNvdW50U2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7JGjigI1fb25jZS5TdWJzY3JpYmVySShTdWJzY3JpYmVySSk7XG5cbmNvbnN0ICAgICAgICBwdWJsaXNoS2l0SUtpdD1oYXJkZW4oe1xucHVibGlzaGVyOlB1Ymxpc2hlckksXG5zdWJzY3JpYmVyOlN1YnNjcmliZXJJfSk7JGjigI1fb25jZS5wdWJsaXNoS2l0SUtpdChwdWJsaXNoS2l0SUtpdCk7XG5cblxuY29uc3QgICAgICAgIEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGU9TS5pbnRlcmZhY2UoXG4nRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InLFxue1xuZm9yazpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLC8qIG9vcHM6IHJlY3Vyc2l2ZSB0eXBlKi9cbm5leHQ6TS5jYWxsV2hlbigpLnJldHVybnMoTS5hbnkoKSl9KTskaOKAjV9vbmNlLkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUoRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSk7XG5cblxuXG5jb25zdCAgICAgICAgSXRlcmFibGVFYWNoVG9waWNJPU0uaW50ZXJmYWNlKCdJdGVyYWJsZUVhY2hUb3BpYycse1xuc3Vic2NyaWJlQWZ0ZXI6U3Vic2NyaWJlckkubWV0aG9kR3VhcmRzLnN1YnNjcmliZUFmdGVyLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJykpfSk7JGjigI1fb25jZS5JdGVyYWJsZUVhY2hUb3BpY0koSXRlcmFibGVFYWNoVG9waWNJKTtcblxuXG5cbmNvbnN0ICAgICAgICBJdGVyYWJsZUxhdGVzdFRvcGljST1NLmludGVyZmFjZSgnSXRlcmFibGVMYXRlc3RUb3BpYycse1xuZ2V0VXBkYXRlU2luY2U6U3Vic2NyaWJlckkubWV0aG9kR3VhcmRzLmdldFVwZGF0ZVNpbmNlLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJykpfSk7XG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBBcmdcbiAqIEB0ZW1wbGF0ZSBSZXRcbiAqIEBwYXJhbSB7KGFyZzogQXJnKSA9PiBSZXR9IGZuXG4gKiBAcmV0dXJucyB7KGFyZzogQXJnKSA9PiBSZXR9XG4gKi8kaOKAjV9vbmNlLkl0ZXJhYmxlTGF0ZXN0VG9waWNJKEl0ZXJhYmxlTGF0ZXN0VG9waWNJKTtcbmNvbnN0IHdlYWtNZW1vaXplVW5hcnk9KGZuKT0+e1xuY29uc3QgY2FjaGU9bmV3IFdlYWtNYXAoKTtcbnJldHVybihhcmcpPT57XG4vKiogQHR5cGUge29iamVjdH0gKi9cbmNvbnN0IG9hcmc9YXJnO1xuaWYoY2FjaGUuaGFzKG9hcmcpKXtcbnJldHVybiBjYWNoZS5nZXQob2FyZyk7XG4gfVxuY29uc3QgcmVzdWx0PWZuKGFyZyk7XG5jYWNoZS5zZXQob2FyZyxyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UHVibGljYXRpb25SZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge1VwZGF0ZVJlY29yZDxUPn1cbiAqL1xuY29uc3QgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZD0ocmVjb3JkKT0+e1xuY29uc3R7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudH09XG5yZWNvcmQ7XG5pZihkb25lKXtcbi8qIEZpbmFsIHJlc3VsdHMgaGF2ZSB1bmRlZmluZWQgdXBkYXRlQ291bnQuKi9cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OnVuZGVmaW5lZH0pO1xuIH1cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OnB1Ymxpc2hDb3VudH0pO1xuIH07XG5cbi8qKlxuICogTWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQdWJsaXNoS2l0PFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVB1Ymxpc2hLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7UHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59ICovXG5sZXQgdGFpbFA7XG4vKiogQHR5cGUge3VuZGVmaW5lZCB8ICgodmFsdWU6IEVSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+KSA9PiB2b2lkKX0gKi9cbmxldCB0YWlsUjtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcblxubGV0IGN1cnJlbnRQdWJsaXNoQ291bnQ9MG47XG5sZXQgY3VycmVudFA9dGFpbFA7XG5jb25zdCBhZHZhbmNlQ3VycmVudD0oZG9uZSx2YWx1ZSxyZWplY3Rpb24pPT57XG5pZih0YWlsUj09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbmN1cnJlbnRQdWJsaXNoQ291bnQrPTFuO1xuY3VycmVudFA9dGFpbFA7XG5jb25zdCByZXNvbHZlQ3VycmVudD10YWlsUjtcblxuaWYoZG9uZSl7XG50YWlsUD10b29GYXJSZWplY3Rpb247XG50YWlsUj11bmRlZmluZWQ7XG4gfWVsc2V7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG4gfVxuXG5pZihyZWplY3Rpb24pe1xucmVzb2x2ZUN1cnJlbnQocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbnJlc29sdmVDdXJyZW50KFxuaGFyZGVuKHtcbmhlYWQ6e3ZhbHVlLGRvbmV9LFxucHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG4gfTtcblxuY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkPXdlYWtNZW1vaXplVW5hcnkoXG5tYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkKTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7U3Vic2NyaWJlcjxUPn1cbiAqL1xuY29uc3Qgc3Vic2NyaWJlcj1GYXIoJ1N1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQ9LTFuKT0+e1xuYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsJ2JpZ2ludCcpO1xuaWYocHVibGlzaENvdW50PT09Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gdGFpbFA7XG4gfWVsc2UgaWYocHVibGlzaENvdW50PGN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1lbHNle1xudGhyb3cgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9LFxuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+e1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gfVxudXBkYXRlQ291bnQ9QmlnSW50KHVwZGF0ZUNvdW50KTtcbnJldHVybihcbnN1YnNjcmliZXJcbi8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4vKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuLyogc2FtZSBjcmFuay4uLiovLlxuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4vKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbi8qIGZ1cnRoZXIgb25lcy4qLy5cbnRoZW4oKCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSkpO1xuXG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7UHVibGlzaGVyPFQ+fSAqL1xuY29uc3QgcHVibGlzaGVyPUZhcignUHVibGlzaGVyJyx7XG5wdWJsaXNoOih2YWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KGZhbHNlLHZhbHVlKTtcbiB9LFxuZmluaXNoOihmaW5hbFZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSxmaW5hbFZhbHVlKTtcbiB9LFxuZmFpbDoocmVhc29uKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSx1bmRlZmluZWQsbWFrZVF1aWV0UmVqZWN0aW9uKHJlYXNvbikpO1xuIH19KTtcblxucmV0dXJuIGhhcmRlbih7cHVibGlzaGVyLHN1YnNjcmliZXJ9KTtcbiB9OyRo4oCNX29uY2UubWFrZVB1Ymxpc2hLaXQobWFrZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VQdWJsaXNoS2l0KTtcblxuY29uc3QgRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlPWhhcmRlbih7XG52YWx1ZUR1cmFiaWxpdHk6TS5hbnkoKSxcbnB1Ymxpc2hDb3VudDpNLmFueSgpLFxuc3RhdHVzOk0uYW55KCksXG5oYXNWYWx1ZTpNLmFueSgpLFxudmFsdWU6TS5hbnkoKX0pO1xuXG5cbi8qIFRPRE86IE1vdmUgZHVyYWJsZSBwdWJsaXNoIGtpdCB0byBhIG5ldyBmaWxlPyovXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eSAmICdtYW5kYXRvcnknfSBbb3B0aW9ucy52YWx1ZUR1cmFiaWxpdHldXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX1cbiAqL1xuY29uc3QgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGU9KG9wdGlvbnM9e30pPT57XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHk9J21hbmRhdG9yeSd9PW9wdGlvbnM7XG5hc3NlcnQuZXF1YWwodmFsdWVEdXJhYmlsaXR5LCdtYW5kYXRvcnknKTtcbnJldHVybntcbi8qIGNvbmZpZ3VyYXRpb24qL1xudmFsdWVEdXJhYmlsaXR5LFxuXG4vKiBsaWZlY3ljbGUgcHJvZ3Jlc3MqL1xucHVibGlzaENvdW50OjBuLFxuc3RhdHVzOidsaXZlJywvKiB8ICdmaW5pc2hlZCcgfCAnZmFpbGVkJyovXG5cbi8qIHBlcnNpc3RlZCByZXN1bHQgZGF0YSovXG4vKiBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gbm9uLXRlcm1pbmFsIHZhbHVlcyBmcm9tIGBwdWJsaXNoYCwqL1xuLyogdmFsdWUgYWxzbyBob2xkcyB0aGUgdGVybWluYWwgdmFsdWUgZnJvbSBgZmluaXNoYCBvciBgZmFpbGAuKi9cbmhhc1ZhbHVlOmZhbHNlLFxudmFsdWU6dW5kZWZpbmVkfTtcblxuIH07XG5cbi8qIFdlIG5lZWQgdGhlIFdlYWtNYXAga2V5IGZvciBhIGtpdCB0byBiZSBhIHZyZWYtYmVhcmluZyBvYmplY3QqL1xuLyogaW4gaXRzIGNvaG9ydCwgYW5kIGhhdmUgYXJiaXRyYXJpbHkgY2hvc2VuIHRoZSBwdWJsaXNoZXIgZmFjZXQuKi9cbi8qKiBAdHlwZWRlZiB7UHVibGlzaGVyPCo+fSBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleSAqL1xuLyoqXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5fVxuICovXG5jb25zdCBnZXRFcGhlbWVyYWxLZXk9KGZhY2V0cyk9PmZhY2V0cy5wdWJsaXNoZXI7XG5cbi8qKlxuICogQHR5cGVkZWYgRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhXG4gKiBAcHJvcGVydHkge1Byb21pc2U8Kj4gfCB1bmRlZmluZWR9IGN1cnJlbnRQIFRoZSBjdXJyZW50LXJlc3VsdCBwcm9taXNlXG4gKiAgICh1bmRlZmluZWQgdW5sZXNzIHJlc29sdmVkIHdpdGggdW5yZWNvdmVyYWJsZSBlcGhlbWVyYWwgZGF0YSlcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTwqPn0gdGFpbFAgVGhlIG5leHQtcmVzdWx0IHByb21pc2VcbiAqIEBwcm9wZXJ0eSB7KCh2YWx1ZTogYW55KSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gdGFpbFIgVGhlIG5leHQtcmVzdWx0IHJlc29sdmVyXG4gKiAgICh1bmRlZmluZWQgd2hlbiB0aGUgcHVibGlzaCBraXQgaGFzIHRlcm1pbmF0ZWQpXG4gKi9cblxuLyoqIEB0eXBlIHtXZWFrTWFwPER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5LCBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE+fSAqL1xuY29uc3QgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudC1yZXN1bHQgcHJvbWlzZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBkdXJhYmxlXG4gKiBwdWJsaXNoIGtpdCwgcmVjcmVhdGVkIHVubGVzcyB3ZSBhbHJlYWR5IGhhdmUgb25lIHdpdGggcmV0YWluZWRcbiAqIGVwaGVtZXJhbCBkYXRhLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcGFyYW0ge1Byb21pc2U8Kj59IHRhaWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICovXG5jb25zdCBwcm92aWRlQ3VycmVudFA9KHN0YXRlLGZhY2V0cyx0YWlsKT0+e1xuY29uc3QgZXBoZW1lcmFsS2V5PWdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuY29uc3QgZm91bmREYXRhPWR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbmNvbnN0IGN1cnJlbnRQPWZvdW5kRGF0YSYmZm91bmREYXRhLmN1cnJlbnRQO1xuaWYoY3VycmVudFApe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1cblxuY29uc3R7cHVibGlzaENvdW50LHN0YXR1cyxoYXNWYWx1ZSx2YWx1ZX09c3RhdGU7XG5pZighaGFzVmFsdWUpe1xuYXNzZXJ0KHN0YXR1cz09PSdsaXZlJyk7XG5yZXR1cm4gdGFpbDtcbiB9XG5pZihzdGF0dXM9PT0nbGl2ZSd8fHN0YXR1cz09PSdmaW5pc2hlZCcpe1xuY29uc3QgY2VsbD1oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZTpzdGF0dXMhPT0nbGl2ZSd9LFxucHVibGlzaENvdW50LFxudGFpbH0pO1xuXG5yZXR1cm4gRS5yZXNvbHZlKGNlbGwpO1xuIH1lbHNlIGlmKHN0YXR1cz09PSdmYWlsZWQnKXtcbnJldHVybiBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuIH1lbHNle1xudGhyb3cgRmFpbCBgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZXh0LXJlc3VsdCBwcm9taXNlIGFuZCByZXNvbHZlciBhc3NvY2lhdGVkIHdpdGggYSBnaXZlblxuICogZHVyYWJsZSBwdWJsaXNoIGtpdC5cbiAqIFRoZXNlIGFyZSBsb3N0IG9uIHVwZ3JhZGUgYnV0IHJlY3JlYXRlZCBvbi1kZW1hbmQsIHByZXNlcnZpbmcgdGhlXG4gKiB2YWx1ZSBpbiAoYnV0IG5vdCB0aGUgaWRlbnRpdHkgb2YpIHRoZSBjdXJyZW50IHsgdmFsdWUsIGRvbmUgfSByZXN1bHRcbiAqIHdoZW4gcG9zc2libGUsIHdoaWNoIGlzIGFsd2F5cyB0aGUgY2FzZSB3aGVuIHRoYXQgdmFsdWUgaXMgdGVybWluYWxcbiAqIChpLmUuLCBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCkgb3Igd2hlbiB0aGUgZHVyYWJsZSBwdWJsaXNoIGtpdCBpc1xuICogY29uZmlndXJlZCB3aXRoIGB2YWx1ZUR1cmFiaWxpdHk6ICdtYW5kYXRvcnknYC5cbiAqXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9IHN0YXRlXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YX1cbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YT0oc3RhdGUsZmFjZXRzKT0+e1xuY29uc3QgZXBoZW1lcmFsS2V5PWdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuY29uc3QgZm91bmREYXRhPWR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbmlmKGZvdW5kRGF0YSl7XG5yZXR1cm4gZm91bmREYXRhO1xuIH1cblxuY29uc3R7c3RhdHVzfT1zdGF0ZTtcbmxldCB0YWlsUDtcbmxldCB0YWlsUjtcbmlmKHN0YXR1cz09PSdsaXZlJyl7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG52b2lkIEUud2hlbih0YWlsUCxzaW5rLHNpbmspO1xuIH1lbHNlIGlmKHN0YXR1cz09PSdmaW5pc2hlZCd8fHN0YXR1cz09PSdmYWlsZWQnKXtcbnRhaWxQPXRvb0ZhclJlamVjdGlvbjtcbiB9ZWxzZXtcbnRocm93IEZhaWwgYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gfVxuLyogY3VycmVudFAgaXMgbm90IGVwaGVtZXJhbCB3aGVuIHJlc3RvcmluZyBmcm9tIHBlcnNpc3RlZCBzdGF0ZS4qL1xuY29uc3Qgb2JqPWhhcmRlbih7Y3VycmVudFA6dW5kZWZpbmVkLHRhaWxQLHRhaWxSfSk7XG5kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KGVwaGVtZXJhbEtleSxvYmopO1xucmV0dXJuIG9iajtcbiB9O1xuXG4vKipcbiAqIEV4dGVuZHMgdGhlIHNlcXVlbmNlIG9mIHJlc3VsdHMuXG4gKlxuICogQHBhcmFtIHt7c3RhdGU6IER1cmFibGVQdWJsaXNoS2l0U3RhdGUsIGZhY2V0czogUHVibGlzaEtpdDwqPn19IGNvbnRleHRcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlWydzdGF0dXMnXX0gW3RhcmdldFN0YXR1c11cbiAqL1xuY29uc3QgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0PShjb250ZXh0LHZhbHVlLHRhcmdldFN0YXR1cz0nbGl2ZScpPT57XG5jb25zdHtzdGF0ZSxmYWNldHN9PWNvbnRleHQ7XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHksc3RhdHVzfT1zdGF0ZTtcbmlmKHN0YXR1cyE9PSdsaXZlJyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5jb25zdCBkb25lPXRhcmdldFN0YXR1cyE9PSdsaXZlJztcbmlmKGRvbmV8fHZhbHVlRHVyYWJpbGl0eT09PSdtYW5kYXRvcnknKXtcbmNhbkJlRHVyYWJsZSh2YWx1ZSl8fEZhaWwgYENhbm5vdCBhY2NlcHQgbm9uLWR1cmFibGUgdmFsdWU6ICR7dmFsdWV9YDtcbiB9XG5jb25zdHt0YWlsUDpvbGRUYWlsUCx0YWlsUjpyZXNvbHZlT2xkVGFpbH09XG5wcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKHN0YXRlLGZhY2V0cyk7XG5hc3NlcnQudHlwZW9mKHJlc29sdmVPbGRUYWlsLCdmdW5jdGlvbicpO1xuXG5jb25zdCBwdWJsaXNoQ291bnQ9c3RhdGUucHVibGlzaENvdW50KzFuO1xuc3RhdGUucHVibGlzaENvdW50PXB1Ymxpc2hDb3VudDtcblxubGV0IHRhaWxQO1xubGV0IHRhaWxSO1xuaWYoZG9uZSl7XG5zdGF0ZS5zdGF0dXM9dGFyZ2V0U3RhdHVzO1xudGFpbFA9dG9vRmFyUmVqZWN0aW9uO1xudGFpbFI9dW5kZWZpbmVkO1xuIH1lbHNle1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xudm9pZCBFLndoZW4odGFpbFAsc2luayxzaW5rKTtcbiB9XG5cbmxldCBjdXJyZW50UDtcbmlmKHRhcmdldFN0YXR1cz09PSdmYWlsZWQnKXtcbnN0YXRlLmhhc1ZhbHVlPXRydWU7XG5zdGF0ZS52YWx1ZT12YWx1ZTtcbmNvbnN0IHJlamVjdGlvbj1tYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xucmVzb2x2ZU9sZFRhaWwocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbi8qIFBlcnNpc3QgYSB0ZXJtaW5hbCB2YWx1ZSwgb3IgYSBub24tdGVybWluYWwgdmFsdWUqL1xuLyogaWYgY29uZmlndXJlZCBhcyAnbWFuZGF0b3J5JyBvciAnb3Bwb3J0dW5pc3RpYycuKi9cbmlmKGRvbmV8fHZhbHVlRHVyYWJpbGl0eSE9PSdpZ25vcmVkJyYmY2FuQmVEdXJhYmxlKHZhbHVlKSl7XG5zdGF0ZS5oYXNWYWx1ZT10cnVlO1xuc3RhdGUudmFsdWU9dmFsdWU7XG4gfWVsc2V7XG5zdGF0ZS5oYXNWYWx1ZT1mYWxzZTtcbnN0YXRlLnZhbHVlPXVuZGVmaW5lZDtcbi8qIFJldGFpbiBhbnkgcHJvbWlzZSB3aXRoIG5vbi1kdXJhYmxlIHJlc29sdXRpb24uKi9cbmN1cnJlbnRQPW9sZFRhaWxQO1xuIH1cblxucmVzb2x2ZU9sZFRhaWwoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG5cbmR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoXG5nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKSxcbmhhcmRlbih7Y3VycmVudFAsdGFpbFAsdGFpbFJ9KSk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdD0oYmFnZ2FnZSxraW5kTmFtZSk9Pntcbi8qIFRPRE86IE9uY2Ugd2UgdW5pZnkgd2l0aCBtYWtlUHVibGlzaEtpdCwgd2Ugd2lsbCB1c2UgYSBab25lLWNvbXBhdGlibGUgd2VhayovXG4vKiBtYXAgZm9yIG1lbW9pemF0aW9uLiovXG5jb25zdCBtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQ9bWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZDtcblxuLyoqXG4gKiBAcmV0dXJucyB7KCkgPT4gUHVibGlzaEtpdDwqPn1cbiAqL1xucmV0dXJuIHByZXBhcmVFeG9DbGFzc0tpdChcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbnB1Ymxpc2hLaXRJS2l0LFxuaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGUsXG57XG4vKiBUaGUgcHVibGlzaGVyIGZhY2V0IG9mIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCovXG4vKiBhY2NlcHRzIG5ldyB2YWx1ZXMuKi9cbnB1Ymxpc2hlcjp7XG5wdWJsaXNoKHZhbHVlKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLHZhbHVlKTtcbiB9LFxuZmluaXNoKGZpbmFsVmFsdWUpe1xuYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsZmluYWxWYWx1ZSwnZmluaXNoZWQnKTtcbiB9LFxuZmFpbChyZWFzb24pe1xuYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMscmVhc29uLCdmYWlsZWQnKTtcbiB9fSxcblxuXG4vKiBUaGUgc3Vic2NyaWJlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuLyogcHJvcGFnYXRlcyB2YWx1ZXMuKi9cbnN1YnNjcmliZXI6e1xuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50PS0xbil7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5jb25zdHtwdWJsaXNoQ291bnQ6Y3VycmVudFB1Ymxpc2hDb3VudH09c3RhdGU7XG5jb25zdHtjdXJyZW50UCx0YWlsUH09cHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShcbnN0YXRlLFxuZmFjZXRzKTtcblxuaWYocHVibGlzaENvdW50PT09Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gdGFpbFA7XG4gfWVsc2UgaWYocHVibGlzaENvdW50PGN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIGN1cnJlbnRQfHxwcm92aWRlQ3VycmVudFAoc3RhdGUsZmFjZXRzLHRhaWxQKTtcbiB9ZWxzZXtcbnRocm93IEVycm9yKFxuJ3N1YnNjcmliZUFmdGVyIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCBwdWJsaXNoQ291bnQuJyk7XG5cbiB9XG4gfSxcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KXtcbmNvbnN0e1xuZmFjZXRzOntzdWJzY3JpYmVyfX09XG50aGlzO1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gfVxudXBkYXRlQ291bnQ9QmlnSW50KHVwZGF0ZUNvdW50KTtcbnJldHVybihcbnN1YnNjcmliZXJcbi8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4vKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuLyogc2FtZSBjcmFuay4uLiovLlxuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4vKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbi8qIGZ1cnRoZXIgb25lcy4qLy5cbnRoZW4oKCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSkpO1xuXG4gfX19LFxuXG5cbntcbnN0YXRlU2hhcGU6RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlfSk7XG5cblxuIH07JGjigI1fb25jZS5wcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcbmhhcmRlbihwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuXG5jb25zdCAgICAgICAgU3Vic2NyaWJlclNoYXBlPU0ucmVtb3RhYmxlKCdTdWJzY3JpYmVyJyk7JGjigI1fb25jZS5TdWJzY3JpYmVyU2hhcGUoU3Vic2NyaWJlclNoYXBlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQdWJsaXNoZXJJIjpbIlB1Ymxpc2hlckkiXSwiVXBkYXRlQ291bnRTaGFwZSI6WyJVcGRhdGVDb3VudFNoYXBlIl0sIlN1YnNjcmliZXJJIjpbIlN1YnNjcmliZXJJIl0sInB1Ymxpc2hLaXRJS2l0IjpbInB1Ymxpc2hLaXRJS2l0Il0sIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiOlsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSJdLCJJdGVyYWJsZUVhY2hUb3BpY0kiOlsiSXRlcmFibGVFYWNoVG9waWNJIl0sIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIjpbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIl0sIm1ha2VQdWJsaXNoS2l0IjpbIm1ha2VQdWJsaXNoS2l0Il0sInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCI6WyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSwiU3Vic2NyaWJlclNoYXBlIjpbIlN1YnNjcmliZXJTaGFwZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABZapKMgwoAAIMKAAAuAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBlbmRvL2ZhciIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiXSwiZXhwb3J0cyI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLEUsRmFyLG9ic2VydmVOb3RpZmllcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlTm90aWZpZXJcIiwgWyRo4oCNX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0Jhc2VOb3RpZmllcjxUPiAmIE9taXQ8U3RvcmVkRmFjZXQsICdnZXRTdG9yZUtleSc+fSBTdG9yZWROb3RpZmllclxuICovXG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWROb3RpZmllciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkTm90aWZpZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkTm90aWZpZXI9KG5vdGlmaWVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5hc3NlcnRBbGxEZWZpbmVkKHtub3RpZmllcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyfSk7XG5cbmNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlPW1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik7XG5cbm9ic2VydmVOb3RpZmllcihub3RpZmllcix7XG51cGRhdGVTdGF0ZSh2YWx1ZSl7XG5tYXJzaGFsbFRvU3RvcmFnZSh2YWx1ZSkuY2F0Y2goKHJlYXNvbik9PlxuY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIHVwZGF0ZVN0YXRlJyxyZWFzb24pKTtcblxuIH0sXG5mYWlsKHJlYXNvbil7XG5jb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBmYWlsZWQgdG8gaXRlcmF0ZScscmVhc29uKTtcbiB9fSkuXG5jYXRjaCgocmVhc29uKT0+e1xuY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgaGFsdGVkIGl0ZXJhdGlvbicscmVhc29uKTtcbiB9KTtcblxuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbmZyb21DYXBEYXRhOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKX0pO1xuXG5cbi8qKiBAdHlwZSB7U3RvcmVkTm90aWZpZXI8VD59ICovXG5jb25zdCBzdG9yZWROb3RpZmllcj1GYXIoJ1N0b3JlZE5vdGlmaWVyJyx7XG5nZXRVcGRhdGVTaW5jZToodXBkYXRlQ291bnQpPT5FKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG5nZXRQYXRoOigpPT5FKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcn0pO1xuXG5yZXR1cm4gc3RvcmVkTm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWROb3RpZmllcihtYWtlU3RvcmVkTm90aWZpZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdG9yZWROb3RpZmllciI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP99Lb9UhAADVIQAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIiwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IiwibWFrZVN0b3JlZFN1YnNjcmliZXIiLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLG1ha2VNYXJzaGFsLGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxvYnNlcnZlSXRlcmF0aW9uLG1ha2VQdWJsaXNoS2l0LG1ha2VTdWJzY3JpcHRpb25LaXQsc3Vic2NyaWJlRWFjaDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZUl0ZXJhdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsIFskaOKAjV9hID0+IChtYWtlU3Vic2NyaXB0aW9uS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVFYWNoID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBOQjogZG9lcyBub3QgeWV0IHN1cnZpdmUgdXBncmFkZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzY4OTNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0geyh2OiBUKSA9PiB2b2lkfSBjb25zdW1lVmFsdWVcbiAqL1xuY29uc3QgICAgICAgIGZvckVhY2hQdWJsaWNhdGlvblJlY29yZD1hc3luYyhzdWJzY3JpYmVyLGNvbnN1bWVWYWx1ZSk9Pntcbi8qIFdlIG9wZW4tY29kZSB0aGUgZm9yLWF3YWl0LW9mIGltcGxlbWVudGF0aW9uIHJhdGhlciB0aGFuIHVzaW5nIHRoYXQgc3ludGF4Ki9cbi8qIGRpcmVjdGx5IGJlY2F1c2Ugd2Ugd2FudCB0byBydW4gdGhlIGNvbnN1bWVyIG9uIHRoZSBkb25lIHZhbHVlIGFzIHdlbGwuKi9cbmNvbnN0IGl0ZXJhdG9yPXN1YnNjcmliZUVhY2goc3Vic2NyaWJlcilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbmxldCBmaW5pc2hlZD1mYWxzZTtcbmF3YWl0IG51bGw7XG53aGlsZSghZmluaXNoZWQpe1xuY29uc3R7dmFsdWUsZG9uZX09YXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuYXdhaXQgY29uc3VtZVZhbHVlKHZhbHVlKTtcbmZpbmlzaGVkPSEhZG9uZTtcbiB9XG4gfTtcblxuLyoqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgbm8gZnVydGhlciB3cml0ZXMgdG8gaXQgd2lsbFxuICogYmUgYXR0ZW1wdGVkIChidXQgcmVzdWx0cyB3aWxsIHJlbWFpbiBhdmFpbGFibGUgZnJvbSB0aGUgc3Vic2NyaWJlcikuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmliZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8UmV0dXJuVHlwZTx0eXBlb2YgbWFrZU1hcnNoYWw+Pn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmliZXI8VD59XG4gKi8kaOKAjV9vbmNlLmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChmb3JFYWNoUHVibGljYXRpb25SZWNvcmQpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRTdWJzY3JpYmVyPShzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5hc3NlcnRBbGxEZWZpbmVkKHtzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXJ9KTtcblxuY29uc3QgbWFyc2hhbGxUb1N0b3JhZ2U9bWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKTtcblxuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoc3Vic2NyaWJlcixtYXJzaGFsbFRvU3RvcmFnZSkuY2F0Y2goKGVycik9Pntcbi8qIFRPRE86IEhvdyBzaG91bGQgd2UgaGFuZGxlIGFuZC9vciBzdXJmYWNlIHRoaXMgZmFpbHVyZT8qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTc2NiNkaXNjdXNzaW9uX3I5MjI0OTgwODgqL1xuY29uc29sZS5lcnJvcignU3RvcmVkU3Vic2NyaWJlciBmYWlsZWQgdG8gaXRlcmF0ZScsZXJyKTtcbiB9KTtcblxuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbmZyb21DYXBEYXRhOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKX0pO1xuXG5cbi8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaWJlcjxUPn0gKi9cbmNvbnN0IHN0b3Jlc3ViPUZhcignU3RvcmVkU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6KHB1Ymxpc2hDb3VudCk9PnN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcbmdldFVwZGF0ZVNpbmNlOih1cGRhdGVDb3VudCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuZ2V0UGF0aDooKT0+RShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuZ2V0U3RvcmVLZXk6KCk9PkUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCksXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcn0pO1xuXG5yZXR1cm4gc3RvcmVzdWI7XG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgbWFrZVN0b3JlZFN1YnNjcmliZXJcbiAqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgdGhlIGl0ZXJhdGlvbiB3aWxsIGJlIHRlcm1pbmF0ZWQuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpcHRpb25cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBtYWtlTWFyc2hhbD4+fSBbbWFyc2hhbGxlcl1cbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpcHRpb248VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VTdG9yZWRTdWJzY3JpYmVyKG1ha2VTdG9yZWRTdWJzY3JpYmVyKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkU3Vic2NyaXB0aW9uPShcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcj1tYWtlTWFyc2hhbCh1bmRlZmluZWQsdW5kZWZpbmVkLHtcbm1hcnNoYWxTYXZlRXJyb3I6KCk9PnsgfSxcbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J3NtYWxsY2Fwcyd9KSk9PlxuXG57XG4vKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xuZnJvbUNhcERhdGE6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpfSk7XG5cblxuLyogQWJvcnQgdGhlIGl0ZXJhdGlvbiBvbiB0aGUgbmV4dCBvYnNlcnZhdGlvbiBpZiB0aGUgcHVibGlzaGVyIGV2ZXIgZmFpbHMuKi9cbmxldCBwdWJsaXNoRmFpbGVkPWZhbHNlO1xubGV0IHB1Ymxpc2hFeGNlcHRpb247XG5cbmNvbnN0IGZhaWw9KGVycik9PntcbnB1Ymxpc2hGYWlsZWQ9dHJ1ZTtcbnB1Ymxpc2hFeGNlcHRpb249ZXJyO1xuIH07XG5cbi8qIE11c3QgKm5vdCogYmUgYW4gYXN5bmMgZnVuY3Rpb24sIGJlY2F1c2UgaXQgc29tZXRpbWVzIG11c3QgdGhyb3cgdG8gYWJvcnQqL1xuLyogdGhlIGl0ZXJhdGlvbi4qL1xuY29uc3QgcHVibGlzaFZhbHVlPShvYmopPT57XG5hc3NlcnQoc3RvcmFnZU5vZGUpO1xuaWYocHVibGlzaEZhaWxlZCl7XG4vKiBUbyBwcm9wZXJseSBhYm9ydCB0aGUgaXRlcmF0aW9uLCB0aGlzIG11c3QgYmUgYSBzeW5jaHJvbm91cyBleGNlcHRpb24uKi9cbnRocm93IHB1Ymxpc2hFeGNlcHRpb247XG4gfVxuXG4vKiBQdWJsaXNoIHRoZSB2YWx1ZSwgY2FwdHVyaW5nIGFueSBlcnJvci4qL1xuRShtYXJzaGFsbGVyKS5cbnRvQ2FwRGF0YShvYmopLlxudGhlbigoc2VyaWFsaXplZCk9PntcbmNvbnN0IGVuY29kZWQ9SlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoZW5jb2RlZCk7XG4gfSkuXG5jYXRjaChmYWlsKTtcbiB9O1xuXG5pZihzdG9yYWdlTm9kZSl7XG4vKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbm9ic2VydmVJdGVyYXRpb24oc3Vic2NyaXB0aW9uLHtcbnVwZGF0ZVN0YXRlOnB1Ymxpc2hWYWx1ZSxcbmZpbmlzaDpwdWJsaXNoVmFsdWV9KS5cbmNhdGNoKGZhaWwpO1xuIH1cblxuLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpcHRpb248VD59ICovXG5jb25zdCBzdG9yZXN1Yj1GYXIoJ1N0b3JlZFN1YnNjcmlwdGlvbicse1xuLyogQHRzLWV4cGVjdC1lcnJvciBnZXRTdG9yZUtleSB0eXBlIGRvZXMgbm90IGhhdmUgYHN1YnNjcmlwdGlvbmAqL1xuZ2V0U3RvcmVLZXk6YXN5bmMoKT0+e1xuaWYoIXN0b3JhZ2VOb2RlKXtcbnJldHVybiBoYXJkZW4oe3N1YnNjcmlwdGlvbn0pO1xuIH1cbmNvbnN0IHN0b3JlS2V5PWF3YWl0IEUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCk7XG5yZXR1cm4gaGFyZGVuKHsuLi5zdG9yZUtleSxzdWJzY3JpcHRpb259KTtcbiB9LFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXIsXG5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczooKT0+XG5zdWJzY3JpcHRpb24uZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnN1YnNjcmlwdGlvbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSxcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQpPT5zdWJzY3JpcHRpb24uc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KX0pO1xuXG5yZXR1cm4gc3RvcmVzdWI7XG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRTdWJzY3JpcHRpb24obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0b3JlZFB1Ymxpc2hLaXRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRQdWJsaXNoZXJLaXRcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBwdWJsaXNoZXJcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGluY29tcGF0aWJsZSB3aXRoIGR1cmFiaWxpdHk7IGluc3RlYWQgaGFuZGxlIHZzdG9yYWdlIGVwaGVtZXJhbGx5IG9uIGEgZHVyYWJsZSBQdWJsaXNoS2l0XG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IFttYXJzaGFsbGVyXVxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGlsZFBhdGhdXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaGVyS2l0PFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFB1Ymxpc2hlcktpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcixjaGlsZFBhdGgpPT57XG5jb25zdHtwdWJsaWNhdGlvbixzdWJzY3JpcHRpb259PW1ha2VTdWJzY3JpcHRpb25LaXQoKTtcblxuaWYoc3RvcmFnZU5vZGUmJmNoaWxkUGF0aCl7XG5zdG9yYWdlTm9kZT1FKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkUGF0aCk7XG4gfVxuXG4vKiB3cmFwIHRoZSBzdWJzY3JpcHRpb24gdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlLCByZXBlYXRpbmcgdG8gdGhpcyBgc3Vic2NyaWJlcmAqL1xuY29uc3Qgc3Vic2NyaWJlcj1tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyKTtcblxuXG5yZXR1cm57XG5wdWJsaXNoZXI6cHVibGljYXRpb24sXG5zdWJzY3JpYmVyfTtcblxuIH07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgaW5jb21wYXRpYmxlIHdpdGggZHVyYWJpbGl0eTsgaW5zdGVhZCBoYW5kbGUgdnN0b3JhZ2UgZXBoZW1lcmFsbHkgb24gYSBkdXJhYmxlIFB1Ymxpc2hLaXRcbiAqXG4gKiBMaWtlIG1ha2VQdWJsaXNoS2l0IHRoaXMgbWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogV2hhdCdzIGRpZmZlcmVudCBpcyBgc3Vic2NyaWJlcmAgdGVlcyByZWNvcmRzLCB3cml0aW5nIG91dCB0byBzdG9yYWdlTm9kZS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRQdWJsaXNoS2l0PFQ+fVxuICovJGjigI1fb25jZS5tYWtlU3RvcmVkUHVibGlzaGVyS2l0KG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoS2l0PShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PW1ha2VQdWJsaXNoS2l0KCk7XG5cbnJldHVybntcbnB1Ymxpc2hlcixcbi8qIHdyYXAgdGhlIHN1YnNjcmliZXIgdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlKi9cbnN1YnNjcmliZXI6bWFrZVN0b3JlZFN1YnNjcmliZXIoc3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKX07XG5cbiB9OyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hLaXQobWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIl0sIm1ha2VTdG9yZWRTdWJzY3JpYmVyIjpbIm1ha2VTdG9yZWRTdWJzY3JpYmVyIl0sIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iOlsibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiXSwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOfuoGiIkAAAiJAAAKAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIl0sImV4cG9ydHMiOlsic3Vic2NyaWJlIiwic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUxhdGVzdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixpc09iamVjdCxpc1VwZ3JhZGVEaXNjb25uZWN0aW9uOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzXCIsIFtbXCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uXCIsIFskaOKAjV9hID0+IChpc1VwZ3JhZGVEaXNjb25uZWN0aW9uID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuY29uc3Qgc2luaz0oKT0+eyB9O1xuXG4vKipcbiAqIENoZWNrIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IGEgZnVuY3Rpb24gZm9yIHJlamVjdGlvbiBieSB2YXQgdXBncmFkZSxcbiAqIGFuZCByZWZldGNoIHVwb24gZW5jb3VudGVyaW5nIHRoYXQgY29uZGl0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IEVSZWY8VD59IGdldHRlclxuICogQHBhcmFtIHtFUmVmPFQ+W119IFtzZWVkXVxuICogQHJldHVybnMge1Byb21pc2U8VD59XG4gKi9cbmNvbnN0IHJlY29ubmVjdEFzTmVlZGVkPWFzeW5jKGdldHRlcixzZWVkPVtdKT0+e1xubGV0IGRpc2Nvbm5lY3Rpb247XG5sZXQgbGFzdFZlcnNpb249LUluZmluaXR5O1xuLyogRW5kIHN5bmNocm9ub3VzIHByZWx1ZGUuKi9cbmF3YWl0IG51bGw7XG5mb3IobGV0IGk9MDs7aSs9MSl7XG50cnl7XG5jb25zdCByZXN1bHRQPWk8c2VlZC5sZW5ndGg/c2VlZFtpXTpnZXR0ZXIoKTtcbmNvbnN0IHJlc3VsdD1hd2FpdCByZXN1bHRQO1xucmV0dXJuIHJlc3VsdDtcbiB9Y2F0Y2goZXJyKXtcbmlmKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24oZXJyKSl7XG5pZighZGlzY29ubmVjdGlvbil7XG5kaXNjb25uZWN0aW9uPWVycjtcbiB9XG5jb25zdHtpbmNhcm5hdGlvbk51bWJlcjp2ZXJzaW9ufT1lcnI7XG5pZih2ZXJzaW9uPmxhc3RWZXJzaW9uKXtcbi8qIFdlIGRvbid0IGV4cGVjdCBhbm90aGVyIHVwZ3JhZGUgaW4gYmV0d2VlbiByZWNlaXZpbmcqL1xuLyogYSBkaXNjb25uZWN0aW9uIGFuZCByZS1yZXF1ZXN0aW5nIGFuIHVwZGF0ZSwgYnV0IG11c3QqL1xuLyogbmV2ZXJ0aGVsZXNzIGJlIHByZXBhcmVkIGZvciB0aGF0LiovXG5sYXN0VmVyc2lvbj12ZXJzaW9uO1xuY29udGludWU7XG4gfVxuIH1cbi8qIGlmIGBlcnJgIGlzIGFuIChFcnJvcikgb2JqZWN0LCB3ZSBjYW4gdHJ5IHRvIGFzc29jaWF0ZSBpdCB3aXRoKi9cbi8qIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaXNjb25uZWN0aW9uIHRoYXQgcHJvbXB0ZWQgdGhlIHJlcXVlc3QqL1xuLyogZm9yIHdoaWNoIGl0IGlzIGEgcmVzdWx0LiovXG5pZihpc09iamVjdChlcnIpJiZkaXNjb25uZWN0aW9uJiZkaXNjb25uZWN0aW9uIT09ZXJyKXtcbnRyeXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgQXR0ZW1wdGluZyB0byByZWNvdmVyIGZyb20gZGlzY29ubmVjdGlvbjogJHtkaXNjb25uZWN0aW9ufWApO1xuXG4gfWNhdGNoKF9lcnIpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5Ki9cbiB9XG4gfVxudGhyb3cgZXJyO1xuIH1cbiB9XG4gfTtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZWFyIGl0ZXJhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwb3RlbnRpYWxseSBmYXIgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+Pn0gaXRQXG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmU9KGl0UCk9PlxuRmFyKCdBc3luY0l0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5jb25zdCBpdD1FKGl0UClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5jb25zdCBzZWxmPUZhcignQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zZWxmLFxubmV4dDphc3luYygpPT5FKGl0KS5uZXh0KCl9KTtcblxucmV0dXJuIHNlbGY7XG4gfX0pO1xuXG5cbi8qKlxuICogQXN5bmNyb25vdXNseSBpdGVyYXRlcyBvdmVyIHRoZSBjb250ZW50cyBvZiBhIFB1YmxpY2F0aW9uUmVjb3JkIGNoYWluIGFzIHRoZXlcbiAqIGFwcGVhci4gIFRoaXMgaXRlcmF0aW9uIG11c3QgZHJvcCBwYXJ0cyBvZiBwdWJsaWNhdGlvbiByZWNvcmRzIHRoYXQgYXJlIG5vXG4gKiBsb25nZXIgbmVlZGVkIHNvIHRoZXkgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IG5leHRDZWxsUFxuICogICBQdWJsaWNhdGlvblJlY29yZCBjb3JyZXNwb25kaW5nIHdpdGggdGhlIGZpcnN0IGl0ZXJhdGlvbiByZXN1bHRcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUPn1cbiAqLyRo4oCNX29uY2Uuc3Vic2NyaWJlKHN1YnNjcmliZSk7XG5jb25zdCBtYWtlRWFjaEl0ZXJhdG9yPSh0b3BpYyxuZXh0Q2VsbFApPT57XG4vKiBUbyB1bmRlcnN0YW5kIHRoZSBpbXBsZW1lbnRhdGlvbiwgc3RhcnQgd2l0aCovXG4vKiBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNjA0MDQxMjIyNTAvaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9c3RyYXdtYW46Y29uY3VycmVuY3kjaW5maW5pdGVfcXVldWUqL1xuY29uc3Qgc2VsZj1GYXIoJ0VhY2hJdGVyYXRvcicse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+c2VsZixcbm5leHQ6KCk9PntcbmNvbnN0e1xuaGVhZDpyZXN1bHRQLFxucHVibGlzaENvdW50OnB1Ymxpc2hDb3VudFAsXG50YWlsOnRhaWxQfT1cbkUuZ2V0KG5leHRDZWxsUCk7XG5cbi8qIElmIHRhaWxQIGlzIGJyb2tlbiBieSB1cGdyYWRlLCB3ZSB3aWxsIG5lZWQgdG8gcmUtcmVxdWVzdCBpdCovXG4vKiBkaXJlY3RseSBmcm9tIGB0b3BpY2AuKi9cbmNvbnN0IGdldFN1Y2Nlc3Nvcj1hc3luYygpPT57XG5jb25zdCBwdWJsaXNoQ291bnQ9YXdhaXQgcHVibGlzaENvdW50UDtcbmFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCdiaWdpbnQnKTtcbmNvbnN0IHN1Y2Nlc3Nvcj1hd2FpdCBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuY29uc3QgbmV3UHVibGlzaENvdW50PXN1Y2Nlc3Nvci5wdWJsaXNoQ291bnQ7XG5pZihuZXdQdWJsaXNoQ291bnQhPT1wdWJsaXNoQ291bnQrMW4pe1xuRmFpbCBgZWFjaEl0ZXJhdG9yIGJyb2tlbiBieSBnYXAgZnJvbSBwdWJsaXNoQ291bnQgJHtwdWJsaXNoQ291bnR9IHRvICR7bmV3UHVibGlzaENvdW50fWA7XG4gfVxucmV0dXJuIHN1Y2Nlc3NvcjtcbiB9O1xuXG4vKiBSZXBsYWNlIG5leHRDZWxsUCBvbiBldmVyeSBjYWxsIHRvIG5leHQoKSBzbyB0aGluZ3Mgd29yayBldmVuKi9cbi8qIHdpdGggYW4gZWFnZXIgY29uc3VtZXIgdGhhdCBkb2Vzbid0IHdhaXQgZm9yIHJlc3VsdHMgdG8gc2V0dGxlLiovXG5uZXh0Q2VsbFA9cmVjb25uZWN0QXNOZWVkZWQoZ2V0U3VjY2Vzc29yLFt0YWlsUF0pO1xuXG4vKiBBdm9pZCB1bmhhbmRsZWQgcmVqZWN0aW9uIHdhcm5pbmdzIGhlcmUgaWYgdGhlIHByZXZpb3VzIGNlbGwgd2FzIHJlamVjdGVkIG9yKi9cbi8qIHRoZXJlIGlzIG5vIGZ1cnRoZXIgcmVxdWVzdCBvZiB0aGlzIGl0ZXJhdG9yLiovXG4vKiBgdGFpbFBgIGlzIGhhbmRsZWQgaW5zaWRlIGByZWNvbm5lY3RBc05lZWRlZGAgYW5kIGByZXN1bHRQYCBpcyB0aGUgY2FsbGVyJ3MqL1xuLyogY29uY2VybiwgbGVhdmluZyBvbmx5IGBwdWJsaXNoQ291bnRQYCBhbmQgdGhlIG5ldyBgbmV4dENlbGxQYC4qL1xudm9pZCBFLndoZW4ocHVibGlzaENvdW50UCxzaW5rLHNpbmspO1xudm9pZCBFLndoZW4obmV4dENlbGxQLHNpbmssc2luayk7XG5yZXR1cm4gcmVzdWx0UDtcbiB9LFxuZm9yazooKT0+bWFrZUVhY2hJdGVyYXRvcih0b3BpYyxuZXh0Q2VsbFApfSk7XG5cbnJldHVybiBzZWxmO1xuIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwicHJlZml4IGxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcInByZWZpeCBsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGV2ZXJ5dGhpbmcgcHVibGlzaGVkIGJlZm9yZVxuICogeW91IGFzayB0aGUgcmV0dXJuZWQgaXRlcmFibGUgZm9yIGFuIGl0ZXJhdG9yLiBCdXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yXG4gKiB3aWxsIGVudW1lcmF0ZSBlYWNoIHRoaW5nIHB1Ymxpc2hlZCBmcm9tIHRoYXQgaXRlcmF0b3IncyBzdGFydGluZyBwb2ludFxuICogdXAgdG8gYSBkaXNjb25uZWN0aW9uIHJlc3VsdCBpbmRpY2F0aW5nIHVwZ3JhZGUgb2YgdGhlIHByb2R1Y2VyXG4gKiAod2hpY2ggYnJlYWtzIHRoZSBnYXAtZnJlZSBndWFyYW50ZWUgYW5kIHRoZXJlZm9yZSB0ZXJtaW5hdGVzIGFueSBhY3RpdmVcbiAqIGl0ZXJhdG9yIHdoaWxlIHN0aWxsIHN1cHBvcnRpbmcgY3JlYXRpb24gb2YgbmV3IGl0ZXJhdG9ycykuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQsIHRoYXQgdGVybWluYWwgdmFsdWUgd2lsbCBiZVxuICogcmVwb3J0ZWQgbG9zc2xlc3NseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEVhY2hUb3BpYzxUPj59IHRvcGljXG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmVFYWNoPSh0b3BpYyk9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignRWFjaEl0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5jb25zdCBmaXJzdENlbGxQPXJlY29ubmVjdEFzTmVlZGVkKCgpPT5FKHRvcGljKS5zdWJzY3JpYmVBZnRlcigpKTtcbnJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHRvcGljLGZpcnN0Q2VsbFApO1xuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5zdWJzY3JpYmVFYWNoKHN1YnNjcmliZUVhY2gpO1xuaGFyZGVuKHN1YnNjcmliZUVhY2gpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICogQHBhcmFtIHtiaWdpbnR9IFtsb2NhbFVwZGF0ZUNvdW50XVxuICogQHBhcmFtIHtJdGVyYXRvclJldHVyblJlc3VsdDxUPn0gW3Rlcm1pbmFsUmVzdWx0XVxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovXG5jb25zdCBjbG9uZUxhdGVzdEl0ZXJhdG9yPSh0b3BpYyxsb2NhbFVwZGF0ZUNvdW50LHRlcm1pbmFsUmVzdWx0KT0+e1xubGV0IG11dGV4PVByb21pc2UucmVzb2x2ZSgpO1xuXG4vKipcbiAqIFJlcXVlc3QgdGhlIG5leHQgdXBkYXRlIHJlY29yZCBmcm9tIHRoZSB0b3BpYywgdXBkYXRpbmcgb3VyIGxvY2FsIHN0YXRlLFxuICogYW5kIGNvbnZlcnQgaXQgdG8gYW4gaXRlcmF0b3IgcmVzdWx0LlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFQ+Pn1cbiAqL1xuY29uc3QgbWF5YmVSZXF1ZXN0TmV4dFJlc3VsdD1hc3luYygpPT57XG5pZih0ZXJtaW5hbFJlc3VsdCl7XG4vKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRvcGljLCBqdXN0IGtlZXAgcmV0dXJuaW5nIHRoZSBsYXN0IHJlc3VsdCovXG4vKiB3aXRob3V0IGZ1cnRoZXIgcmVxdWVzdHMuKi9cbnJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiB9XG5cbi8qIFNlbmQgdGhlIG5leHQgcmVxdWVzdCBub3csIHNraXBwaW5nIHBhc3QgaW50ZXJtZWRpYXRlIHVwZGF0ZXMqL1xuLyogYW5kIHVwZ3JhZGUgZGlzY29ubmVjdGlvbnMuKi9cbmNvbnN0e3ZhbHVlLHVwZGF0ZUNvdW50fT1hd2FpdCByZWNvbm5lY3RBc05lZWRlZCgoKT0+XG5FKHRvcGljKS5nZXRVcGRhdGVTaW5jZShsb2NhbFVwZGF0ZUNvdW50KSk7XG5cbi8qIE1ha2Ugc3VyZSB0aGUgbmV4dCByZXF1ZXN0IGlzIGZvciBhIGZyZXNoZXIgdmFsdWUuKi9cbmxvY2FsVXBkYXRlQ291bnQ9dXBkYXRlQ291bnQ7XG5cbi8qIE1ha2UgYW4gSXRlcmF0b3JSZXN1bHQuKi9cbmlmKHVwZGF0ZUNvdW50PT09dW5kZWZpbmVkKXtcbnRlcm1pbmFsUmVzdWx0PWhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlfSk7XG5yZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH07XG5cbmNvbnN0IHNlbGY9RmFyKCdMYXRlc3RJdGVyYXRvcicse1xuZm9yazooKT0+Y2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyxsb2NhbFVwZGF0ZUNvdW50LHRlcm1pbmFsUmVzdWx0KSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnNlbGYsXG5uZXh0OmFzeW5jKCk9Pntcbi8qIEluIHRoaXMgYWRhcHRvciwgb25jZSBgbmV4dCgpYCBpcyBjYWxsZWQgYW5kIHJldHVybnMgYW4gdW5yZXNvbHZlZCovXG4vKiBwcm9taXNlLCBmdXJ0aGVyIGBuZXh0KClgIGNhbGxzIHdpbGwgYWxzbyByZXR1cm4gdW5yZXNvbHZlZCBwcm9taXNlcyovXG4vKiBidXQgZWFjaCBjYWxsIHdpbGwgbm90IHRyaWdnZXIgYW5vdGhlciBgdG9waWNgIHJlcXVlc3QgdW50aWwgdGhlIHByaW9yKi9cbi8qIG9uZSBoYXMgc2V0dGxlZC4qL1xuLyoqL1xuLyogVGhpcyBsaW5lYXIgcXVldWVpbmcgYmVoYXZpb3IgaXMgb25seSBuZWVkZWQgZm9yIGNvZGUgdGhhdCB1c2VzIHRoZSovXG4vKiBhc3luYyBpdGVyYXRvciBwcm90b2NvbCBleHBsaWNpdGx5LiBXaGVuIHRoaXMgYXN5bmMgaXRlcmF0b3IgaXMqL1xuLyogY29uc3VtZWQgYnkgYSBmb3IvYXdhaXQvb2YgbG9vcCwgYG5leHQoKWAgd2lsbCBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUqL1xuLyogcHJvbWlzZSBmb3IgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiByZXN1bHQgaGFzIGZ1bGZpbGxlZC4gSWYgaXQgZnVsZmlsbHMqL1xuLyogd2l0aCBgZG9uZTogdHJ1ZWAsIHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB3aWxsIG5ldmVyIGNhbGwgYG5leHQoKWAqL1xuLyogYWdhaW4uKi9cbi8qKi9cbi8qIFNlZSovXG4vKiBodHRwczovLzJhbGl0eS5jb20vMjAxNi8xMC9hc3luY2hyb25vdXMtaXRlcmF0aW9uLmh0bWwjcXVldWluZy1uZXh0KCktaW52b2NhdGlvbnMqL1xuLyogZm9yIGFuIGV4cGxpY2l0IHVzZSB0aGF0IHNlbmRzIGBuZXh0KClgIHdpdGhvdXQgd2FpdGluZy4qL1xuXG5pZih0ZXJtaW5hbFJlc3VsdCl7XG4vKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRvcGljLCBqdXN0IGtlZXAgcmV0dXJuaW5nIHRoZSBsYXN0Ki9cbi8qIHJlc3VsdC4qL1xucmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuIH1cblxuLyogQkVHSU4gQ1JJVElDQUwgU0VDVElPTiAtIHN5bmNocm9ub3VzbHkgZW5xdWV1ZSBhbmQgcmVhc3NpZ24gYG11dGV4YCovXG4vKiovXG4vKiBVc2UgYG11dGV4YCB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlIG5vIG1vcmUgdGhhbiBhIHNpbmdsZSByZXF1ZXN0IGluKi9cbi8qIGZsaWdodC4qL1xuY29uc3QgbmV4dFJlc3VsdD1tdXRleC50aGVuKG1heWJlUmVxdWVzdE5leHRSZXN1bHQpO1xubXV0ZXg9bmV4dFJlc3VsdC50aGVuKHNpbmssc2luayk7XG4vKiBFTkQgQ1JJVElDQUwgU0VDVElPTiovXG5cbnJldHVybiBuZXh0UmVzdWx0O1xuIH19KTtcblxucmV0dXJuIHNlbGY7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gdG9waWNcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUPn1cbiAqL1xuY29uc3QgbWFrZUxhdGVzdEl0ZXJhdG9yPSh0b3BpYyk9PmNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMpO1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcImxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcImxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgYW55IHB1Ymxpc2hlZCBzdGF0ZSBpZiBhIG1vcmVcbiAqIHJlY2VudCBwdWJsaXNoZWQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQgYnkgdXBncmFkZSBvZiB0aGUgcHJvZHVjZXIsXG4gKiBpdCB3aWxsIGJlIHJlLXJlcXVlc3RlZC4gQWxsIG90aGVyIHRlcm1pbmFsIHZhbHVlcyB3aWxsIGJlIGxvc3NsZXNzbHlcbiAqIHByb3BhZ2F0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmVMYXRlc3Q9KHRvcGljKT0+e1xuY29uc3QgaXRlcmFibGU9RmFyKCdMYXRlc3RJdGVyYWJsZScse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+bWFrZUxhdGVzdEl0ZXJhdG9yKHRvcGljKX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLnN1YnNjcmliZUxhdGVzdChzdWJzY3JpYmVMYXRlc3QpO1xuaGFyZGVuKHN1YnNjcmliZUxhdGVzdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3Vic2NyaWJlIjpbInN1YnNjcmliZSJdLCJzdWJzY3JpYmVFYWNoIjpbInN1YnNjcmliZUVhY2giXSwic3Vic2NyaWJlTGF0ZXN0IjpbInN1YnNjcmliZUxhdGVzdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADMSOGnxQsAAMULAAApAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiLi9zdWJzY3JpYmUuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi90b3BpYy5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLHN1YnNjcmliZUVhY2gsbWFrZVB1Ymxpc2hLaXQsbWFrZVBpbm5lZEhpc3RvcnlUb3BpYzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVFYWNoID0gJGjigI1fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3RvcGljLmpzXCIsIFtbXCJtYWtlUGlubmVkSGlzdG9yeVRvcGljXCIsIFskaOKAjV9hID0+IChtYWtlUGlubmVkSGlzdG9yeVRvcGljID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb248VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb249KHRvcGljKT0+e1xuY29uc3Qgc3Vic2NyaXB0aW9uPUZhcignU3Vic2NyaXB0aW9uJyx7XG4uLi5zdWJzY3JpYmVFYWNoKHRvcGljKSxcbnN1YnNjcmliZUFmdGVyOmFzeW5jKHB1Ymxpc2hDb3VudCk9PkUodG9waWMpLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIFN1YnNjcmlwdGlvbiBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgU3Vic2NyaXB0aW9uIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VTdWJzY3JpcHRpb25gIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogU3Vic2NyaXB0aW9uIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6YXN5bmMoKT0+dG9waWMsXG5cbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe3N1YnNjcmlwdGlvbn0pfSk7XG5cbnJldHVybiBzdWJzY3JpcHRpb247XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb24obWFrZVN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbik7XG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBQcm9kdWNlcnMgc2hvdWxkIHVzZVxuICogYGBganNcbiAqIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuICogY29uc3QgdG9waWMgPSBtYWtlUGlubmVkSGlzdG9yeVRvcGljKHN1YnNjcmliZXIpO1xuICogYGBgXG4gKiBpbnN0ZWFkLCB3aGljaCBtYWtlcyBpdCBjbGVhcmVyIHRoYXQgYWxsIHRoZSBzdWJzY3JpYmVyJ3MgaGlzdG9yeSBpc1xuICogcmV0YWluZWQsIHByZXZlbnRpbmcgR0MuICBQb3RlbnRpYWxseSByZW1vdGUgY29uc3VtZXJzIHVzZVxuICogYGBganNcbiAqIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2Ygc3Vic2NyaWJlRWFjaCh0b3BpYykpIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIE1ha2VzIGEgYHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9YCBmb3IgZG9pbmcgbG9zc2xlc3MgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0PSgpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxuLyogVGhlIHB1Ymxpc2gga2l0IHN1YnNjcmliZXIgaXMgcHJlZml4LWxvc3N5LCBzbyBtYWtpbmcgKnRoaXMqIHN1YnNjcmliZXIgY29tcGxldGVseSovXG4vKiBsb3NzbGVzcyBmcm9tIGluaXRpYWxpc2F0aW9uIHJlcXVpcmVzIHBpbm5pbmcgdGhlIGZvcm1lcidzIGhpc3RvcnkuKi9cblxuY29uc3QgcGlubmVkSGlzdG9yeVRvcGljPW1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG5jb25zdCBzdWJzY3JpcHRpb249bWFrZVN1YnNjcmlwdGlvbihwaW5uZWRIaXN0b3J5VG9waWMpO1xuXG4vKiogQHR5cGUge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSAqL1xuY29uc3QgcHVibGljYXRpb249RmFyKCdwdWJsaWNhdGlvbicse1xudXBkYXRlU3RhdGU6KG5vbkZpbmFsVmFsdWUpPT5wdWJsaXNoZXIucHVibGlzaChub25GaW5hbFZhbHVlKSxcbmZpbmlzaDooY29tcGxldGlvbik9PnB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG5mYWlsOihyZWFzb24pPT5wdWJsaXNoZXIuZmFpbChyZWFzb24pfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufSk7XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb25LaXQobWFrZVN1YnNjcmlwdGlvbktpdCk7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACQjrNDDAYAAAwGAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3RvcGljLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIi4vdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIEEgcGlubmVkLWhpc3RvcnkgdG9waWMgcHJlc2VydmVzIGFsbCBvZiBpdHMgcHVibGlzaGVkIHZhbHVlcyBpblxuICogbWVtb3J5LiAgVXNlIGEgcHJlZml4LWxvc3N5IG1ha2VQdWJsaXNoS2l0IGluc3RlYWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RWFjaFRvcGljPFQ+ICYgTGF0ZXN0VG9waWM8VD59IHRvcGljIG5lZWRzIHRvIGJlIG5lYXIgaW4gb3JkZXIgdG9cbiAqIHByZXNlcnZlIHN1YnNjcmlwdGlvbiB0aW1pbmdzLiAgVE9ETzogZHJvcCBMYXRlc3RUb3BpYzxUPiByZXF1aXJlbWVudFxuICogQHJldHVybnMge0VhY2hUb3BpYzxUPiAmIExhdGVzdFRvcGljPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVBpbm5lZEhpc3RvcnlUb3BpYz0odG9waWMpPT57XG4vKiBTdWNoIGxvc3NsZXNzbmVzcyBpbmhpYml0cyBHQywgd2hpY2ggaXMgd2h5IHdlJ3JlIG1vdmluZyBhd2F5IGZyb20gaXQuKi9cblxuLyogV2UgbmVlZCB0byB0YWtlIGFuIGltbWVkaWF0ZSBzbmFwc2hvdCBvZiB0aGUgdG9waWMncyBjdXJyZW50IHN0YXRlLiovXG5jb25zdCBwaW5uZWRQdWJMaXN0PXRvcGljLnN1YnNjcmliZUFmdGVyKCk7XG5cbnJldHVybiBGYXIoJ1Bpbm5lZEhpc3RvcnlUb3BpYycse1xuc3Vic2NyaWJlQWZ0ZXI6YXN5bmMocHVibGlzaENvdW50PS0xbik9PntcbmlmKHB1Ymxpc2hDb3VudD09PS0xbil7XG5yZXR1cm4gcGlubmVkUHViTGlzdDtcbiB9XG5yZXR1cm4gdG9waWMuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbiB9LFxuZ2V0VXBkYXRlU2luY2U6YXN5bmModXBkYXRlQ291bnQ9dW5kZWZpbmVkKT0+e1xuLyogVE9ETzogQnVpbGQgdGhpcyBvdXQgb2YgRWFjaFRvcGljPFQ+LiovXG5yZXR1cm4gdG9waWMuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpO1xuIH19KTtcblxuIH07JGjigI1fb25jZS5tYWtlUGlubmVkSGlzdG9yeVRvcGljKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xuaGFyZGVuKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQaW5uZWRIaXN0b3J5VG9waWMiOlsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD4UQ8TPzAAAD8wAAAsAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3R5cGVzLWFtYmllbnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAamVzc2llLWNoZWNrKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8VD59IEVSZWZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlS2l0PFQ+fSBQcm9taXNlS2l0XG4gKi9cblxuLyoqXG4gKiBEZXByZWNhdGVkLiBVc2UgUHJvbWlzZUtpdCBpbnN0ZWFkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlUmVjb3JkPFQ+fSBQcm9taXNlUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtUUmV0dXJuPWFueV1cbiAqIEB0ZW1wbGF0ZSBbVE5leHQ9dW5kZWZpbmVkXVxuICogQHR5cGVkZWYge0FzeW5jSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+ICYge1xuICogICBmb3JrKCk6IEZvcmthYmxlQXN5bmNJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD5cbiAqIH19IEZvcmthYmxlQXN5bmNJdGVyYXRvciBBbiBBc3luY0l0ZXJhdG9yIHRoYXQgY2FuIGJlIGZvcmtlZCBhdCBhIGdpdmVuIHBvc2l0aW9uXG4gKiBpbnRvIG11bHRpcGxlIGluZGVwZW5kZW50IEZvcmthYmxlQXN5bmNJdGVyYXRvcnMgc3RhcnRpbmcgZnJvbSB0aGF0IHBvc2l0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVFJldHVybj1hbnldXG4gKiBAdGVtcGxhdGUgW1ROZXh0PXVuZGVmaW5lZF1cbiAqIEB0eXBlZGVmIHt7IFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PiB9fSBBc3luY0l0ZXJhYmxlT25seVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVFJldHVybj1hbnldXG4gKiBAdGVtcGxhdGUgW1ROZXh0PXVuZGVmaW5lZF1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+LFxuICogICBmb3JrKCk6IEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PiB9ICZcbiAqICAgRm9ya2FibGVBc3luY0l0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PlxuICogfSBGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVFJldHVybj1hbnldXG4gKiBAdGVtcGxhdGUgW1ROZXh0PXVuZGVmaW5lZF1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IEZvcmthYmxlQXN5bmNJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD5cbiAqIH19IEZvcmthYmxlQXN5bmNJdGVyYWJsZVxuICogQW4gQXN5bmNJdGVyYWJsZSB0aGF0IHByb2R1Y2VzIEZvcmthYmxlQXN5bmNJdGVyYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gSXRlcmF0aW9uT2JzZXJ2ZXI8VD5cbiAqIEEgdmFsaWQgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gdGhlIG1ldGhvZHMgb2YgYW4gYEl0ZXJhdGlvbk9ic2VydmVyYFxuICogcmVwcmVzZW50cyBhbiBpdGVyYXRpb24uIEEgdmFsaWQgc2VxdWVuY2UgY29uc2lzdHMgb2YgYW55IG51bWJlciBvZiBjYWxsc1xuICogdG8gYHVwZGF0ZVN0YXRlYCB3aXRoIHRoZSBzdWNjZXNzaXZlIG5vbi1maW5hbCB2YWx1ZXMsIGZvbGxvd2VkIGJ5IGFcbiAqIGZpbmFsIGNhbGwgdG8gZWl0aGVyIGBmaW5pc2hgIHdpdGggYSBzdWNjZXNzZnVsIGBjb21wbGV0aW9uYCB2YWx1ZVxuICogb3IgYGZhaWxgIHdpdGggdGhlIGFsbGVnZWQgYHJlYXNvbmAgZm9yIGZhaWx1cmUuIEFmdGVyIGF0IG1vc3Qgb25lXG4gKiB0ZXJtaW5hdGluZyBjYWxscywgbm8gZnVydGhlciBjYWxscyB0byB0aGVzZSBtZXRob2RzIGFyZSB2YWxpZCBhbmQgbXVzdCBiZVxuICogcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkgeyhub25GaW5hbFZhbHVlOiBUKSA9PiB2b2lkfSB1cGRhdGVTdGF0ZVxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogVCkgPT4gdm9pZH0gZmluaXNoXG4gKiBAcHJvcGVydHkgeyhyZWFzb246IHVua25vd24pID0+IHZvaWR9IGZhaWxcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1YmxpY2F0aW9uUmVjb3JkXG4gKiBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLCBzbyBpdCBtdXN0IGJlIHNhZmUgdG8gZXhwb3NlLiBCdXQgc29mdHdhcmVcbiAqIG91dHNpZGUgdGhlIGN1cnJlbnQgcGFja2FnZSBzaG91bGQgY29uc2lkZXIgaXQgb3BhcXVlLCBub3QgZGVwZW5kaW5nIG9uIGl0c1xuICogaW50ZXJuYWwgc3RydWN0dXJlLlxuICogQHByb3BlcnR5IHtJdGVyYXRvclJlc3VsdDxUPn0gaGVhZFxuICogQHByb3BlcnR5IHtiaWdpbnR9IHB1Ymxpc2hDb3VudCBzdGFydHMgYXQgMSBmb3IgdGhlIGZpcnN0IHJlc3VsdFxuICogICBhbmQgYWR2YW5jZXMgYnkgMSBmb3IgZWFjaCBzdWJzZXF1ZW50IHJlc3VsdFxuICogQHByb3BlcnR5IHtQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gdGFpbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVhY2hUb3BpY1xuICogQHByb3BlcnR5IHsocHVibGlzaENvdW50PzogYmlnaW50KSA9PiBQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gc3Vic2NyaWJlQWZ0ZXJcbiAqIFJldHVybnMgYSBwcm9taXNlIGZvciBhIFwiY3VycmVudFwiIFB1YmxpY2F0aW9uUmVjb3JkIChyZWZlcmVuY2luZyBpdHNcbiAqIGltbWVkaWF0ZSBzdWNjZXNzb3IgdmlhIGEgYHRhaWxgIHByb21pc2UpIHRoYXQgaXMgbGF0ZXIgdGhhbiB0aGVcbiAqIHByb3ZpZGVkIHB1Ymxpc2hDb3VudC5cbiAqIFVzZWQgdG8gbWFrZSBmb3J3YXJkLWxvc3NsZXNzIChcImVhY2hcIikgaXRlcmF0b3JzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtGb3JrYWJsZUFzeW5jSXRlcmFibGU8VCwgVD4gJiBFYWNoVG9waWM8VD59IEl0ZXJhYmxlRWFjaFRvcGljXG4gKiBBbiBFYWNoVG9waWMgd2l0aCBkZWZhdWx0IGFzeW5jSXRlcmFibGUgYmVoYXZpb3VyLlxuICpcbiAqIE5PVEU6IHRoZSBwdWJsaWNhdGlvbiByZWNvcmRzIGFuZCBpdGVyYXRvcnMgcmV0dXJuZWQgYnkgdGhpcyBvYmplY3QgYXJlXG4gKiBlcGhlbWVyYWwgYW5kIHdpbGwgYmUgc2V2ZXJlZCBkdXJpbmcgdXBncmFkZS4gIEEgY2FsbGVyIHNob3VsZCB1c2VcbiAqIGBzdWJzY3JpYmVFYWNoYCB0byB3cmFwIHRoaXMgdG9waWMgaW4gYSBsb2NhbCBpdGVyYWJsZSB3aGljaCBhdXRvbWF0aWNhbGx5XG4gKiBhdHRlbXB0cyB0byByZWNvbm5lY3QgdXBvbiBiZWluZyBzZXZlcmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtBc3luY0l0ZXJhYmxlT25seTxULCBUPiAmIExhdGVzdFRvcGljPFQ+fSBJdGVyYWJsZUxhdGVzdFRvcGljXG4gKiBBIExhdGVzdFRvcGljIHdpdGggZGVmYXVsdCBhc3luY0l0ZXJhYmxlIGJlaGF2aW91ci5cbiAqXG4gKiBOT1RFOiB0aGUgaXRlcmF0b3JzIHJldHVybmVkIGJ5IHRoaXMgb2JqZWN0IGFyZSBlcGhlbWVyYWwgYW5kIHdpbGwgYmUgc2V2ZXJlZFxuICogZHVyaW5nIHVwZ3JhZGUuICBBIGNhbGxlciBzaG91bGQgdXNlIGBzdWJzY3JpYmVMYXRlc3RgIHRvIHdyYXAgdGhpcyB0b3BpYyBpblxuICogYSBsb2NhbCBpdGVyYWJsZSB3aGljaCBhdXRvbWF0aWNhbGx5IGF0dGVtcHRzIHRvIHJlY29ubmVjdCB1cG9uIGJlaW5nXG4gKiBzZXZlcmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExhdGVzdFRvcGljXG4gKiBAcHJvcGVydHkgeyh1cGRhdGVDb3VudD86IGJpZ2ludCB8IG51bWJlcikgPT4gUHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSBnZXRVcGRhdGVTaW5jZVxuICogUmV0dXJucyBhIHByb21pc2UgZm9yIGFuIHVwZGF0ZSByZWNvcmQgYXMgb2YgYW4gdXBkYXRlIGNvdW50LlxuICogSWYgdGhlIGB1cGRhdGVDb3VudGAgYXJndW1lbnQgaXMgb21pdHRlZCBvciBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnQgdXBkYXRlIGNvdW50LFxuICogdGhlIHByb21pc2UgcHJvbXB0bHkgcmVzb2x2ZXMgdG8gdGhlIGN1cnJlbnQgcmVjb3JkLlxuICogT3RoZXJ3aXNlLCBhZnRlciB0aGUgbmV4dCBzdGF0ZSBjaGFuZ2UsIHRoZSBwcm9taXNlIHJlc29sdmVzIHRvIHRoZSByZXN1bHRpbmcgcmVjb3JkLlxuICogVGhpcyBpcyBhbiBhdHRlbnVhdGVkIGZvcm0gb2YgYHN1YnNjcmliZUFmdGVyYCB3aG9zZSByZXR1cm4gdmFsdWUgc3RhbmRzIGFsb25lIGFuZFxuICogZG9lcyBub3QgYWxsb3cgY29uc3VtZXJzIHRvIHBpbiBhIGNoYWluIG9mIGhpc3RvcmljYWwgUHVibGljYXRpb25SZWNvcmRzLlxuICogVXNlZCB0byBtYWtlIGxvc3N5IChcImxhdGVzdFwiKSBpdGVyYXRvcnMuXG4gKiBOT1RFOiBVc2Ugb2YgYG51bWJlcmAgYXMgYW4gYHVwZGF0ZUNvdW50YCBpcyBkZXByZWNhdGVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtMYXRlc3RUb3BpYzxUPn0gQmFzZU5vdGlmaWVyIFRoaXMgdHlwZSBpcyBkZXByZWNhdGVkIGJ1dCBpcyBzdGlsbFxuICogdXNlZCBleHRlcm5hbGx5LlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtMYXRlc3RUb3BpYzxUPiAmIEVhY2hUb3BpYzxUPn0gU3Vic2NyaWJlclxuICogQSBzdHJlYW0gb2YgcmVzdWx0cyB0aGF0IGFsbG93cyBjb25zdW1lcnMgdG8gY29uZmlndXJlXG4gKiBmb3J3YXJkLWxvc3NsZXNzIFwiZWFjaFwiIGl0ZXJhdGlvbiB3aXRoIGBzdWJzY3JpYmVFYWNoYCBhbmRcbiAqIGxvc3N5IFwibGF0ZXN0XCIgaXRlcmF0aW9uIHdpdGggYHN1YnNjcmliZUxhdGVzdGAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaGVyXG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGBwdWJsaXNoYCB3aXRoIHRoZSBzdWNjZXNzaXZlIG5vbi1maW5hbCB2YWx1ZXMsIGZvbGxvd2VkIGJ5IGFcbiAqIGZpbmFsIGNhbGwgdG8gZWl0aGVyIGBmaW5pc2hgIHdpdGggYSBzdWNjZXNzZnVsIGBjb21wbGV0aW9uYCB2YWx1ZVxuICogb3IgYGZhaWxgIHdpdGggdGhlIGFsbGVnZWQgYHJlYXNvbmAgZm9yIGZhaWx1cmUuIEFmdGVyIGF0IG1vc3Qgb25lXG4gKiB0ZXJtaW5hdGluZyBjYWxscywgbm8gZnVydGhlciBjYWxscyB0byB0aGVzZSBtZXRob2RzIGFyZSB2YWxpZCBhbmQgbXVzdCBiZVxuICogcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkgeyhub25GaW5hbFZhbHVlOiBUKSA9PiB2b2lkfSBwdWJsaXNoXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBUKSA9PiB2b2lkfSBmaW5pc2hcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSBmYWlsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1BhcnRpYWw8UHVibGlzaGVyPFQ+Pn0gUHVibGlzaE9ic2VydmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnbWFuZGF0b3J5JyB8ICdvcHBvcnR1bmlzdGljJyB8ICdpZ25vcmVkJ30gRHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHlcbiAqXG4gKiBEdXJhYmlsaXR5IGNvbmZpZ3VyZXMgY29uc3RyYWludHMgb24gbm9uLXRlcm1pbmFsIHZhbHVlcyB0aGF0IGNhbiBiZVxuICogcHVibGlzaGVkIHRvIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCAodGVybWluYWwgdmFsdWVzIHNlbnQgdG8gZmluaXNoIG9yIGZhaWxcbiAqIG11c3QgYWx3YXlzIGJlIGR1cmFibGUpLlxuICogLSAnbWFuZGF0b3J5JyBtZWFucyB0aGF0IGVhY2ggdmFsdWUgbXVzdCBiZSBkdXJhYmxlLCBzbyBpdCBjYW4gYmUgcmVzdG9yZWRcbiAqICAgb24gdXBncmFkZS5cbiAqIC0gJ29wcG9ydHVuaXN0aWMnIG1lYW5zIHRoYXQgYSBkdXJhYmxlIHZhbHVlIGlzIHBlcnNpc3RlZCBmb3IgcG9zdC11cGdyYWRlXG4gKiAgIHJlc3RvcmF0aW9uLCBidXQgYSBub24tZHVyYWJsZSB2YWx1ZSBpcyBzdGlsbCBhY2NlcHRlZCAoYW5kIHdpbGwgcmVzdWx0IGluXG4gKiAgIHZhbHVlbGVzcyByZXN0b3JhdGlvbikuXG4gKiAtICdpZ25vcmVkJyBtZWFucyB0aGF0IGEgdmFsdWUgaXMgbm90IHBlcnNpc3RlZCBmb3IgcmVzdG9yYXRpb24gZXZlbiBpZiBpdFxuICogICBpcyBkdXJhYmxlLlxuICpcbiAqICdtYW5kYXRvcnknIGlzIHRoZSBvbmx5IGN1cnJlbnRseS1zdXBwb3J0ZWQgdmFsdWUsIGFuZCBvdGhlcnMgbXVzdCBub3QgYmVcbiAqIGVuYWJsZWQgd2l0aG91dCB0ZXN0IGNvdmVyYWdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVxuICpcbiAqIEBwcm9wZXJ0eSB7RHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHl9IHZhbHVlRHVyYWJpbGl0eVxuICpcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBwdWJsaXNoQ291bnRcbiAqXG4gKiBAcHJvcGVydHkgeydsaXZlJyB8ICdmaW5pc2hlZCcgfCAnZmFpbGVkJ30gc3RhdHVzXG4gKlxuICogQHByb3BlcnR5IHtib29sZWFufSBoYXNWYWx1ZVxuICogaGFzVmFsdWUgaW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBvZiB2YWx1ZS4gSXQgc3RhcnRzIG9mZiBmYWxzZSxcbiAqIGFuZCBjYW4gYmUgcmVzZXQgdG8gZmFsc2Ugd2hlbiBhIGR1cmFibGUgcHVibGlzaCBraXQgaXMgcmVzdG9yZWQgYW5kXG4gKiB0aGUgcHJldmlvdXMgdmFsdWUgd2FzIG5vdCBkdXJhYmxlLCBvciBub24tdGVybWluYWwgYW5kIHZhbHVlRHVyYWJsaXR5IGlzICdpZ25vcmVkJy5cbiAqXG4gKiBAcHJvcGVydHkge2FueX0gdmFsdWVcbiAqIHZhbHVlIGhvbGRzIGVpdGhlciBhIG5vbi10ZXJtaW5hbCB2YWx1ZSBmcm9tIGBwdWJsaXNoYCBvciBhIHRlcm1pbmFsIHZhbHVlXG4gKiBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCwgZGVwZW5kaW5nIHVwb24gdGhlIHZhbHVlIGluIHN0YXR1cy5cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFVwZGF0ZVJlY29yZDxUPlxuICogQHByb3BlcnR5IHtUfSB2YWx1ZSBpcyB3aGF0ZXZlciBzdGF0ZSB0aGUgc2VydmljZSB3YW50cyB0byBwdWJsaXNoXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gW3VwZGF0ZUNvdW50XSBpcyBhIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgdXBkYXRlLiAgRm9yXG4gKiB0aGUgbGFzdCB1cGRhdGUsIGl0IGlzIGB1bmRlZmluZWRgLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD59IE5vdGlmaWVySW50ZXJuYWxzIFdpbGwgYmUgc2hhcmVkIGJldHdlZW4gbWFjaGluZXMsXG4gKiBzbyBpdCBtdXN0IGJlIHNhZmUgdG8gZXhwb3NlLiBCdXQgb3RoZXIgc29mdHdhcmUgc2hvdWxkIGF2b2lkIGRlcGVuZGluZyBvblxuICogaXRzIGludGVybmFsIHN0cnVjdHVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7Tm90aWZpZXJJbnRlcm5hbHM8VD4gJlxuICogICBGb3JrYWJsZUFzeW5jSXRlcmFibGU8VCwgVD4gJlxuICogICBTaGFyYWJsZU5vdGlmaWVyPFQ+XG4gKiB9IE5vdGlmaWVyPFQ+IGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBzdGF0ZSBvciB1cGRhdGVzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU2hhcmFibGVOb3RpZmllclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPE5vdGlmaWVySW50ZXJuYWxzPFQ+Pn0gZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsc1xuICogVXNlZCB0byByZXBsaWNhdGUgdGhlIG11bHRpY2FzdCB2YWx1ZXMgYXQgb3RoZXIgc2l0ZXMuIFRvIG1hbnVhbGx5IGNyZWF0ZSBhXG4gKiBsb2NhbCByZXByZXNlbnRhdGl2ZSBvZiBhIE5vdGlmaWNhdGlvbiwgZG9cbiAqIGBgYGpzXG4gKiBsb2NhbEl0ZXJhYmxlID1cbiAqICAgbWFrZU5vdGlmaWVyKEUocmVtb3RlSXRlcmFibGUpLmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3RpZmllclJlY29yZDxUPiB0aGUgcHJvZHVjZWQgbm90aWZpZXIvdXBkYXRlciBwYWlyXG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSB1cGRhdGVyIHRoZSAoY2xvc2VseS1oZWxkKSBub3RpZmllciBwcm9kdWNlclxuICogQHByb3BlcnR5IHtOb3RpZmllcjxUPn0gbm90aWZpZXIgdGhlICh3aWRlbHktaGVsZCkgbm90aWZpZXIgY29uc3VtZXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtJdGVyYWJsZUVhY2hUb3BpYzxUPiAmIEVhY2hUb3BpYzxUPiAmXG4gKiAgIFNoYXJhYmxlU3Vic2NyaXB0aW9uPFQ+fSBTdWJzY3JpcHRpb248VD5cbiAqIEEgZm9ybSBvZiBBc3luY0l0ZXJhYmxlIHN1cHBvcnRpbmcgZGlzdHJpYnV0ZWQgYW5kIG11bHRpY2FzdCB1c2FnZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaGFyYWJsZVN1YnNjcmlwdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEVhY2hUb3BpYzxUPj59IGdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzXG4gKiBVc2VkIHRvIHJlcGxpY2F0ZSB0aGUgbXVsdGljYXN0IHZhbHVlcyBhdCBvdGhlciBzaXRlcy4gVG8gbWFudWFsbHkgY3JlYXRlIGFcbiAqIGxvY2FsIHJlcHJlc2VudGF0aXZlIG9mIGEgU3Vic2NyaXB0aW9uLCBkb1xuICogYGBganNcbiAqIGxvY2FsSXRlcmFibGUgPVxuICogICBtYWtlU3Vic2NyaXB0aW9uKEUocmVtb3RlSXRlcmFibGUpLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3Vic2NyaXB0aW9uUmVjb3JkPFQ+XG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBwdWJsaWNhdGlvblxuICogQHByb3BlcnR5IHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0ZW1wbGF0ZSBbU2xvdD11bmtub3duXSBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLk1hcnNoYWw8U2xvdD59IE1hcnNoYWxsZXIgKi9cbi8qKiBAdHlwZWRlZiB7UGljazxNYXJzaGFsbGVyLCAnZnJvbUNhcERhdGEnPn0gVW5zZXJpYWxpemVyICovXG5cbi8qKlxuICogRGVmaW5lZCBieSB2c3RvcmFnZVN0b3JlS2V5IGluIHZzdG9yYWdlLmdvXG4gKlxuICogQHR5cGVkZWYgVlN0b3JhZ2VLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZVN1YmtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGFQcmVmaXhCeXRlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub0RhdGFWYWx1ZV1cbiAqL1xuXG4vKipcbiAqIFRoaXMgcmVwcmVzZW50cyBhIG5vZGUgaW4gYW4gSUFWTCB0cmVlLlxuICpcbiAqIFRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgeC92c3RvcmFnZSwgYW4gQWdvcmljIGV4dGVuc2lvbiBvZiB0aGUgQ29zbW9zIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhIChhcHBlbmQgdG8gdGhlIG5vZGUpXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHN0cmluZz59IGdldFBhdGggdGhlIGNoYWluIHN0b3JhZ2UgcGF0aCBhdCB3aGljaCB0aGUgbm9kZSB3YXMgY29uc3RydWN0ZWRcbiAqIEBwcm9wZXJ0eSB7U3RvcmFnZU5vZGVbJ2dldFN0b3JlS2V5J119IGdldFN0b3JlS2V5IERFUFJFQ0FURUQgdXNlIGdldFBhdGhcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVW5zZXJpYWxpemVyfSBnZXRVbnNlcmlhbGl6ZXIgZ2V0IHRoZSB1bnNlcmlhbGl6ZXIgZm9yIHRoZSBzdG9yZWQgZGF0YVxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0b3JlZFN1YnNjcmliZXJcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaXB0aW9uPFQ+ICYge1xuICogICBnZXRTdG9yZUtleTogKCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleSAmIHsgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb248VD4gfT4sXG4gKiAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gVW5zZXJpYWxpemVyLFxuICogfX0gU3RvcmVkU3Vic2NyaXB0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1N1YnNjcmliZXI8VD4gJiBTdG9yZWRGYWNldH0gU3RvcmVkU3Vic2NyaWJlclxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGF+tZn2BgAA9gYAAC0AAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi90b29scy90ZXN0U3VwcG9ydHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIi4uL3NyYy90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VGYWtlTWFyc2hhbGxlciIsIm1ha2VGYWtlU3RvcmFnZSIsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixtYWtlTWFyc2hhbDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjigI1fYSldXV1dLFtcIi4uL3NyYy90eXBlcy1hbWJpZW50LmpzXCIsIFtdXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtJdGVyYXRpb25PYnNlcnZlcjx1bmtub3duPn0gW3B1YmxpY2F0aW9uXVxuICovXG5jb25zdCAgICAgICAgbWFrZUZha2VTdG9yYWdlPShwYXRoLHB1YmxpY2F0aW9uKT0+e1xubGV0IHNldFZhbHVlQ2FsbHM9MDtcbmNvbnN0IGZ1bGxQYXRoPSBgcHVibGlzaC4ke3BhdGh9YDtcbmNvbnN0IHN0b3JlS2V5PWhhcmRlbih7XG5zdG9yZU5hbWU6J3N3aW5nc2V0JyxcbnN0b3JlU3Via2V5OiBgc3dpbmdzZXQvZGF0YToke2Z1bGxQYXRofWAsXG5kYXRhUHJlZml4Qnl0ZXM6Jyd9KTtcblxuLyoqIEB0eXBlIHtTdG9yYWdlTm9kZSAmIHsgY291bnRTZXRWYWx1ZUNhbGxzOiAoKSA9PiBudW1iZXJ9fSAqL1xuY29uc3Qgc3RvcmFnZT1GYXIoJ1N0b3JhZ2VOb2RlJyx7XG5nZXRQYXRoOigpPT5wYXRoLFxuZ2V0U3RvcmVLZXk6YXN5bmMoKT0+c3RvcmVLZXksXG5zZXRWYWx1ZTphc3luYyh2YWx1ZSk9PntcbnNldFZhbHVlQ2FsbHMrPTE7XG5hc3NlcnQudHlwZW9mKHZhbHVlLCdzdHJpbmcnKTtcbmlmKHB1YmxpY2F0aW9uKXtcbnB1YmxpY2F0aW9uLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbiB9XG4gfSxcbm1ha2VDaGlsZE5vZGU6KCk9PnN0b3JhZ2UsXG5jb3VudFNldFZhbHVlQ2FsbHM6KCk9PnNldFZhbHVlQ2FsbHN9KTtcblxucmV0dXJuIHN0b3JhZ2U7XG4gfTskaOKAjV9vbmNlLm1ha2VGYWtlU3RvcmFnZShtYWtlRmFrZVN0b3JhZ2UpO1xuaGFyZGVuKG1ha2VGYWtlU3RvcmFnZSk7XG5cbmNvbnN0ICAgICAgICBtYWtlRmFrZU1hcnNoYWxsZXI9KCk9PlxubWFrZU1hcnNoYWwodW5kZWZpbmVkLHVuZGVmaW5lZCx7XG5tYXJzaGFsU2F2ZUVycm9yOigpPT57IH19KTskaOKAjV9vbmNlLm1ha2VGYWtlTWFyc2hhbGxlcihtYWtlRmFrZU1hcnNoYWxsZXIpO1xuXG5oYXJkZW4obWFrZUZha2VNYXJzaGFsbGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjpbWyJldmVudExvb3BJdGVyYXRpb24iLCJldmVudExvb3BJdGVyYXRpb24iXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUZha2VTdG9yYWdlIjpbIm1ha2VGYWtlU3RvcmFnZSJdLCJtYWtlRmFrZU1hcnNoYWxsZXIiOlsibWFrZUZha2VNYXJzaGFsbGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD5iXDZcAQAAXAEAACAAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9leHBvcnRlZC5qc3siaW1wb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANtv5KiMMAAAjDAAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyIsIkBlbmRvL2V4byIsIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiLCJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIiwiaXNDb3B5TWFwIiwiaXNDb3B5TWFwIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW11dLFtcIkBlbmRvL2V4b1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanNcIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbXV0sW1wiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAZW5kby9wYXR0ZXJucyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXSxbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl0sWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXSxbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl0sWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il0sWyJiYWdJc1N1cGVyYmFnIiwiYmFnSXNTdXBlcmJhZyJdLFsiYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXSxbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJtdXN0TWF0Y2giLCJtdXN0TWF0Y2giXV0sIkBlbmRvL2V4byI6W1siaW5pdEVtcHR5IiwiaW5pdEVtcHR5Il0sWyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIl0sWyJkZWZpbmVFeG9DbGFzc0tpdCIsImRlZmluZUV4b0NsYXNzS2l0Il0sWyJtYWtlRXhvIiwibWFrZUV4byJdXSwiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOltbInByb3ZpZGVMYXp5IiwicHJvdmlkZUxhenkiXSxbImlzQ29weU1hcCIsImlzQ29weU1hcCJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il1dLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiOltbIm1ha2VMZWdhY3lNYXAiLCJtYWtlTGVnYWN5TWFwIl1dLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjpbWyJtYWtlTGVnYWN5V2Vha01hcCIsIm1ha2VMZWdhY3lXZWFrTWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAASB6ShQAsAAEALAAAsAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCIuLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcSxGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBhbmQgaXRzIGZyYXRlcm5hbCBzaWJsaW5nIGxlZ2FjeVdlYWtNYXAgZXhpc3Qgb25seSB0b1xuICogZWFzZSBhIHRyYW5zaXRpb24gdG8gdGhlIG1vZGVybiBgc3RvcmVgIHN5c3RlbSwgYXJlIGRlcHJlY2F0ZWQsXG4gKiBhbmQgd2lsbCBldmVudHVhbGx5IGRpc2FwcGVhci4gVGhleSBhcmUgbmVlZGVkIGZvciBub3cgdG8gc3VwcG9ydFxuICogc29tZSBvZiB0aGUgdXNlcyBvZiB0aGUgb2xkIGJlaGF2aW9yIHRoYXQgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGhcbiAqIHRoZSBuZXcuIFRoZSBjb25zdHJhaW50IGltcG9zZWQgYnkgdGhlIG5ldyBpcyB0aGF0IG9ubHkgcGFzc2FibGVzIGNhblxuICogYmUgdXNlZCBhcyB2YWx1ZXMsIGFuZCBvbmx5IGtleXMgKHJvdWdobHksIHN0cnVjdHVyZXMsIGFrYSBjb21wYXJhYmxlcylcbiAqIGNhbiBiZSB1c2VkIGFzIHZhbHVlcy5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMzU2N1xuICogVE9ETyBPbmNlIHRoYXQgUFIgaXMgbWVyZ2VkLCBsaW5rIHRvIHRoZSBkb2N1bWVudHMgcmF0aGVyIHRoYW4gdGhlIFBScy5cbiAqXG4gKiBFYWNoIG9mIHRoZXNlIG5vbi1jb25mb3JtaW5nIHVzZXMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoIGFcbiAqIGBgYGpzXG4gKiAvLyBMZWdhY3kgYmVjYXVzZS4uLlxuICogYGBgXG4gKiBjb21tZW50IGV4cGxhaW5pbmcgdGhlIHByb2JsZW0gaW5oaWJpdGluZyBjb252ZXJzaW9uIHRvIHRoZSBuZXdcbiAqIHN5c3RlbS4gU29tZSBvZiB0aGVzZSBwcm9ibGVtcyBhcyBvZiB0aGlzIHdyaXRpbmc6XG4gKiAgICAqIEEgcHJvbWlzZUtpdCB1c2VkIGFzIGEgdmFsdWUsIGV2ZW4gdGhvdWdoIGEgcHJvbWlzZUtpdCBpcyBub3RcbiAqICAgICAgYSBwYXNzYWJsZS4gU29sdXRpb25zIGFyZSB0byBtYWtlIGl0IGEgcGFzc2FibGUsIG9yIHRvIGNvbnZlcnRcbiAqICAgICAgdGhlIGNvbnRhaW5lciBiYWNrIHRvIGEgY29udmVudGlvbmFsIEphdmFTY3JpcHQgTWFwLlxuICogICAgKiBBIG11dGFibGUgYXJyYXkgdXNlZCBhcyBhIHZhbHVlLCB0aGF0IGlzIHN1YnNlcXVlbnRseSBtdXRhdGVkLlxuICogICAgICBGcmVlemluZyB0aGUgYXJyYXkgd291bGRuJ3Qgd29yayBvZiBjb3Vyc2UgYmVjYXVzZSBpdCB3b3VsZCBicmVha1xuICogICAgICB0aGUgc3Vic2VxdWVudCBtdXRhdGlvbi4gVXNpbmcgYSBmYXIgb2JqZWN0IHdyYXBwaW5nIGFuIGFycmF5IHdvdWxkXG4gKiAgICAgIGxpa2VseSB3b3JrIGZpbmUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhck1hcCBpZiBwb3NzaWJsZSwgTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VMZWdhY3lNYXA9KHRhZz0na2V5Jyk9PntcbmNvbnN0IG09bmV3IE1hcCgpO1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiFtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbm0uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiBtLmhhcyhrZXkpO1xuIH0sXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5yZXR1cm4gbS5nZXQoa2V5KTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLmRlbGV0ZShrZXkpO1xuIH0sXG5rZXlzOigpPT5tLmtleXMoKSxcbnZhbHVlczooKT0+bS52YWx1ZXMoKSxcbmVudHJpZXM6KCk9Pm0uZW50cmllcygpLFxuZ2V0U2l6ZTooKT0+bS5zaXplLFxuY2xlYXI6KCk9Pm0uY2xlYXIoKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lNYXAobWFrZUxlZ2FjeU1hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeU1hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH8nSp+8BgAAvAYAADAAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCIuLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHEsRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG4vKipcbiAqIFNlZSBkb2Njb21tZW50IGluIHRoZSBjbG9zZWx5IHJlbGF0ZWQgYGxlZ2FjeU1hcC5qc2AgbW9kdWxlLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJXZWFrTWFwIGlmIHBvc3NpYmxlLCBXZWFrTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lXZWFrTWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTGVnYWN5V2Vha01hcD0odGFnPSdrZXknKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSAqL1xuY29uc3Qgd209bmV3IFdlYWtNYXAoKTtcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hd20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9Plxud20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiB3bS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtWfSAqL3dtLmdldChrZXkpKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xud20uZGVsZXRlKGtleSk7XG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeVdlYWtNYXAiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACJJsYhAWAAAQFgAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyIsIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLGZpbHRlckl0ZXJhYmxlLG1hcEl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weU1hcCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjigI1fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaOKAjV9hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChtYXBJdGVyYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weU1hcFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlNYXAgPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kc1wiLCBbJGjigI1fYSA9PiAobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsIFskaOKAjV9hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge01hcDxLLFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKX0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ11cbiAqIEByZXR1cm5zIHtNYXBTdG9yZTxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZU1hcFN0b3JlTWV0aG9kcz0oXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxudGFnPSdrZXknKT0+XG57XG5jb25zdHthc3NlcnRVcGRhdGVPbkFkZCxhc3NlcnRVcGRhdGVPbkRlbGV0ZSxpdGVyYWJsZUtleXN9PVxubWFrZUN1cnJlbnRLZXlzS2l0KFxuKCk9PmpzbWFwLmtleXMoKSxcbihrKT0+anNtYXAuaGFzKGspLFxuY29tcGFyZVJhbmssXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlLFxudGFnKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbmNvbnN0IGtleXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGl0ZXJhYmxlS2V5cztcbiB9XG5jb25zdCBmaWx0ZXI9KGspPT57XG5pZihrZXlQYXR0IT09dW5kZWZpbmVkJiYhbWF0Y2hlcyhrLGtleVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBVc2VzIHRoZSBjdXJyZW50IGpzbWFwIHZhbHVlLCBzaW5jZSB0aGUgaXRlcmF0YXRvciBzdXJ2aXZlcyBgLnNldGAqL1xuaWYodmFsdWVQYXR0IT09dW5kZWZpbmVkJiYhbWF0Y2hlcyhqc21hcC5nZXQoayksdmFsdWVQYXR0KSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcbnJldHVybiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsZmlsdGVyKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Vj59XG4gKi9cbmNvbnN0IHZhbHVlcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT4vKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGspKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHBhcmFtIHtQYXR0ZXJufSBbdmFsdWVQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuY29uc3QgZW50cmllcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT5bXG5rLFxuLyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrKV0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbi8qKiBAdHlwZSB7KGs6IEssIHY6IFYpID0+IHZvaWR9ICovYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbnRhZyksXG5cbmtleXMsXG52YWx1ZXMsXG5lbnRyaWVzLFxuXG5zbmFwc2hvdDooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LHZhbHVlUGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQ/XG5qc21hcC5zaXplOlxuWy4uLmtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+e1xuaWYoa2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkKXtcbmpzbWFwLmNsZWFyKCk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSl7XG5qc21hcC5kZWxldGUoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gYWRkaW5nIGEgbmV3IGtleSAoaW5pdCkgYW5kIHVwZGF0aW5nIG9yXG4gKiByZWZlcmVuY2luZyBhIGtleSAoZ2V0LCBzZXQsIGRlbGV0ZSkuXG4gKlxuICogYGluaXRgIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuIGBHZXRgLFxuICogYHNldGAgYW5kIGBkZWxldGVgIGFyZSBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIGFscmVhZHkgZXhpc3QuXG4gKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIG1hcCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlTWFwcyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gLSB0aGUgY29sdW1uIG5hbWUgZm9yIHRoZSBrZXlcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNYXBTdG9yZTxLLFY+fVxuICovJGjigI1fb25jZS5tYWtlTWFwU3RvcmVNZXRob2RzKG1ha2VNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJNYXBTdG9yZT0oXG50YWc9J2tleScsXG57a2V5U2hhcGU9dW5kZWZpbmVkLHZhbHVlU2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNtYXA9bmV3IE1hcCgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S1ZPa1RvU2V0PShfa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4odmFsdWUpO1xuXG5hc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaCh2YWx1ZSx2YWx1ZVNoYXBlLCdtYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5cbmFzc2VydFNjYWxhcktleShrZXkpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnbWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBNYXBTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJNYXBTdG9yZShtYWtlU2NhbGFyTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcFN0b3JlTWV0aG9kcyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoTr2EzsPAAA7DwAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyIsIi4vc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwiLi9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5U2V0XCIsIFskaOKAjV9hID0+IChtYWtlQ29weVNldCA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsIFskaOKAjV9hID0+IChtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtTZXQ8Sz59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdHthc3NlcnRVcGRhdGVPbkFkZCxhc3NlcnRVcGRhdGVPbkRlbGV0ZSxpdGVyYWJsZUtleXN9PVxubWFrZUN1cnJlbnRLZXlzS2l0KFxuKCk9Pmpzc2V0LmtleXMoKSxcbihrKT0+anNzZXQuaGFzKGspLFxuY29tcGFyZVJhbmssXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbmtleU5hbWUpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/XG5pdGVyYWJsZUtleXM6XG5maWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsKGspPT5tYXRjaGVzKGssa2V5UGF0dCkpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKFxuanNzZXQsXG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxua2V5TmFtZSksXG5cblxua2V5cyxcblxudmFsdWVzOmtleXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCk9Pm1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZD9qc3NldC5zaXplOlsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQpe1xuanNzZXQuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpe1xuanNzZXQuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVNldFN0b3JlTWV0aG9kcyhtYWtlU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2tleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyBTZXQoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S2V5T2tUb0FkZD0oa2V5KT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCdzZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VTZXRTdG9yZU1ldGhvZHMoanNzZXQsYXNzZXJ0S2V5T2tUb0FkZCx1bmRlZmluZWQsdGFnKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVNldFN0b3JlTWV0aG9kcyI6WyJtYWtlU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAR93yvXETAABxEwAANQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyIsIi4vc3RvcmUtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLHBhc3NTdHlsZU9mLGdldENvcHlNYXBFbnRyaWVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weU1hcDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldENvcHlNYXBFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wiaXNDb3B5TWFwXCIsIFskaOKAjV9hID0+IChpc0NvcHlNYXAgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0ganNtYXBcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb0FkZFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvU2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzPShcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIWpzbWFwLmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcblxuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbmpzbWFwLmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4ganNtYXAuaGFzKGtleSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4vKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoa2V5KSk7XG4gfSxcblxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5hc3NlcnRLVk9rVG9BZGQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmlmKGFzc2VydEtleU9rVG9EZWxldGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuIH1cbmpzbWFwLmRlbGV0ZShrZXkpO1xuIH0sXG5cbmFkZEFsbDooZW50cmllcyk9PntcbmlmKHR5cGVvZiBlbnRyaWVzW1N5bWJvbC5pdGVyYXRvcl0hPT0nZnVuY3Rpb24nKXtcbmlmKE9iamVjdC5pc0Zyb3plbihlbnRyaWVzKSYmaXNDb3B5TWFwKGVudHJpZXMpKXtcbmVudHJpZXM9Z2V0Q29weU1hcEVudHJpZXMoZW50cmllcyk7XG4gfWVsc2V7XG5GYWlsIGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7ZW50cmllc31gO1xuIH1cbiB9XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mLyoqIEB0eXBlIHtJdGVyYWJsZTxbSywgVl0+fSAqL2VudHJpZXMpe1xuLyogRG9uJ3QgYXNzZXJ0IHRoYXQgdGhlIGtleSBlaXRoZXIgZG9lcyBvciBkb2VzIG5vdCBleGlzdC4qL1xuYXNzZXJ0S1ZPa1RvQWRkKGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogbWFwU3RvcmUgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzOlxuICogcHJpbWl0aXZlcyBvciByZW1vdGFibGVzLlxuICogT3RoZXIgbWFwU3RvcmVzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha01hcCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha01hcCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogbWFwLiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIHJlYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7V2Vha01hcFN0b3JlPEssVj59XG4gKi8kaOKAjV9vbmNlLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyV2Vha01hcFN0b3JlPShcbnRhZz0na2V5Jyxcbntsb25nTGl2ZWQ9dHJ1ZSxrZXlTaGFwZT11bmRlZmluZWQsdmFsdWVTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc21hcD1uZXcobG9uZ0xpdmVkP1dlYWtNYXA6TWFwKSgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S1ZPa1RvU2V0PShfa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4odmFsdWUpO1xuXG5hc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaCh2YWx1ZSx2YWx1ZVNoYXBlLCd3ZWFrTWFwU3RvcmUgdmFsdWUnKTtcbiB9XG4gfTtcblxuY29uc3QgYXNzZXJ0S1ZPa1RvQWRkPShrZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xucGFzc1N0eWxlT2Yoa2V5KT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha01hcFN0b3JlczogJHtrZXl9YDtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaChrZXksa2V5U2hhcGUsJ3dlYWtNYXBTdG9yZSBrZXknKTtcbiB9XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFdlYWtNYXBTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG51bmRlZmluZWQsXG50YWcpfSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABzHuAYCQ8AAAkPAAA1AAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIscGFzc1N0eWxlT2YsZ2V0Q29weVNldEtleXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4saXNDb3B5U2V0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldENvcHlTZXRLZXlzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wiaXNDb3B5U2V0XCIsIFskaOKAjV9hID0+IChpc0NvcHlTZXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge1dlYWtTZXQ8SyAmIG9iamVjdD59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha1NldFN0b3JlTWV0aG9kcz0oXG5qc3NldCxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5qc3NldC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIHNldC4qL1xucmV0dXJuIGpzc2V0LmhhcyhrZXkpO1xuIH0sXG5cbmFkZDooa2V5KT0+e1xuYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuanNzZXQuYWRkKGtleSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5pZihhc3NlcnRLZXlPa1RvRGVsZXRlIT09dW5kZWZpbmVkKXtcbmFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiB9XG5qc3NldC5kZWxldGUoa2V5KTtcbiB9LFxuXG5hZGRBbGw6KGtleXMpPT57XG5pZih0eXBlb2Yga2V5c1tTeW1ib2wuaXRlcmF0b3JdIT09J2Z1bmN0aW9uJyl7XG5pZihPYmplY3QuaXNGcm96ZW4oa2V5cykmJmlzQ29weVNldChrZXlzKSl7XG5rZXlzPWdldENvcHlTZXRLZXlzKGtleXMpO1xuIH1lbHNle1xuRmFpbCBgcHJvdmlkZWQgZGF0YSBzb3VyY2UgaXMgbm90IGl0ZXJhYmxlOiAke2tleXN9YDtcbiB9XG4gfVxuZm9yKGNvbnN0IGtleSBvZi8qKiBAdHlwZSB7SXRlcmFibGU8Sz59ICova2V5cyl7XG5hc3NlcnRLZXlPa1RvQWRkKGtleSk7XG5qc3NldC5hZGQoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogc2V0IGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVTZXRzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogVE9ETyBGb3Igbm93LCB0aGlzIHNjYWxhcldlYWtTZXQgYWNjZXB0cyBvbmx5IHJlbW90YWJsZXMsIHJlZmxlY3RpbmcgdGhlXG4gKiBjb25zdHJhaW50cyBvZiB0aGUgdW5kZXJseWluZyBKYXZhU2NyaXB0IFdlYWtTZXQgaXQgdXNlcyBpbnRlcm5hbGx5LiBCdXRcbiAqIGl0IHNob3VsZCBhY2NlcHQgdGhlIHByaW1pdGl2ZXMgYXMgd2VsbCwgc3RvcmluZyB0aGVtIGluIGEgc2VwYXJhdGUgaW50ZXJuYWxcbiAqIHNldC4gV2hhdCBtYWtlcyBpdCBcIndlYWtcIiBpcyB0aGF0IGl0IHByb3ZpZGVzIG5vIEFQSSBmb3IgZW51bWVyYXRpbmcgd2hhdCdzXG4gKiB0aGVyZS4gVGhvdWdoIG5vdGUgdGhhdCB0aGlzIHdvdWxkIG9ubHkgZW5hYmxlcyBjb2xsZWN0aW9uIG9mIHRoZVxuICogcmVtb3RhYmxlcywgc2luY2UgdGhlIG90aGVyIHByaW1pdGl2ZXMgbWF5IGFsd2F5cyBhcHBlYXIuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlPEs+fVxuICovJGjigI1fb25jZS5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhcldlYWtTZXRTdG9yZT0oXG50YWc9J2tleScsXG57bG9uZ0xpdmVkPXRydWUsa2V5U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNzZXQ9bmV3KGxvbmdMaXZlZD9XZWFrU2V0OlNldCkoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S2V5T2tUb0FkZD0oa2V5KT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcbnBhc3NTdHlsZU9mKGtleSk9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtTdG9yZXM6ICR7a2V5fWA7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCd3ZWFrU2V0U3RvcmUga2V5Jyk7XG4gfVxuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgV2Vha1NldFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMoanNzZXQsYXNzZXJ0S2V5T2tUb0FkZCx1bmRlZmluZWQsdGFnKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUobWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALLXYwidGQAAnRkAAC4AAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJtYWtlQXRvbWljUHJvdmlkZXIiLCJtYWtlQ3VycmVudEtleXNLaXQiLCJwcm92aWRlTGF6eSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsTSxtYXRjaGVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogU2hvdWxkIGJlaGF2ZSBpZGVudGljYWxseSB0byB0aGUgb25lIGluIGBAZW5kby9wYXR0ZXJuc2AsIGJ1dFxuICogcmVpbXBsZW1lbnRlZCBmb3Igbm93IGJlY2F1c2UgYEBlbmRvL3BhdHRlcm5zYCBmb3Jnb3QgdG8gZXhwb3J0IHRoaXMgb25lLlxuICogVGhpcyBvbmUgaXMgc2ltcGxlIGVub3VnaCB0aGF0IEkgcHJlZmVyIGEgcmVpbXBsZW1lbnRhdGlvbiB0byBhIGRlZXAgaW1wb3J0LlxuICogVE9ETzogVW5kYXRlIGBAZW5kby9wYXR0ZXJuc2AgdG8gZXhwb3J0IHRoZSBvcmlnaW5hbCwgYW5kIGRlbGV0ZSB0aGVcbiAqIHJlaW1wbGVtZW50YXRpb24gaGVyZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7cyBpcyBDb3B5U2V0fVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0PShzKT0+bWF0Y2hlcyhzLE0uc2V0KCkpO1xuXG4vKipcbiAqIFNob3VsZCBiZWhhdmUgaWRlbnRpY2FsbHkgdG8gdGhlIG9uZSBpbiBgQGVuZG8vcGF0dGVybnNgLCBidXRcbiAqIHJlaW1wbGVtZW50ZWQgZm9yIG5vdyBiZWNhdXNlIGBAZW5kby9wYXR0ZXJuc2AgZm9yZ290IHRvIGV4cG9ydCB0aGlzIG9uZS5cbiAqIFRoaXMgb25lIGlzIHNpbXBsZSBlbm91Z2ggdGhhdCBJIHByZWZlciBhIHJlaW1wbGVtZW50YXRpb24gdG8gYSBkZWVwIGltcG9ydC5cbiAqIFRPRE86IFVuZGF0ZSBgQGVuZG8vcGF0dGVybnNgIHRvIGV4cG9ydCB0aGUgb3JpZ2luYWwsIGFuZCBkZWxldGUgdGhlXG4gKiByZWltcGxlbWVudGF0aW9uIGhlcmUuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHJldHVybnMge20gaXMgQ29weU1hcH1cbiAqLyRo4oCNX29uY2UuaXNDb3B5U2V0KGlzQ29weVNldCk7XG5jb25zdCAgICAgICAgaXNDb3B5TWFwPShtKT0+bWF0Y2hlcyhtLE0ubWFwKCkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEN1cnJlbnRLZXlzS2l0XG4gKiBAcHJvcGVydHkgeyhrOiBLLCB2PzogVikgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25BZGRcbiAqIEBwcm9wZXJ0eSB7KGs6IEspID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uRGVsZXRlXG4gKiBAcHJvcGVydHkge0l0ZXJhYmxlPEs+fSBpdGVyYWJsZUtleXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmFibGU8Sz59IGdldFJhd0tleXNcbiAqIEBwYXJhbSB7KGs6IEspID0+IGJvb2xlYW59IGNoZWNrSGFzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0geyhrOiBLLCB2PzogVikgPT4gdm9pZH0gYXNzZXJ0T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydE9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7Q3VycmVudEtleXNLaXQ8SyxWPn1cbiAqLyRo4oCNX29uY2UuaXNDb3B5TWFwKGlzQ29weU1hcCk7XG5jb25zdCAgICAgICAgbWFrZUN1cnJlbnRLZXlzS2l0PShcbmdldFJhd0tleXMsXG5jaGVja0hhcyxcbmNvbXBhcmUsXG5hc3NlcnRPa1RvQWRkLFxuYXNzZXJ0T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5sZXQgdXBkYXRlQ291bnQ9MDtcbmxldCBzb3J0ZWRLZXlzTWVtbztcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25BZGQ9KGssdj11bmRlZmluZWQpPT57XG5hc3NlcnRPa1RvQWRkKGssdik7XG51cGRhdGVDb3VudCs9MTtcbnNvcnRlZEtleXNNZW1vPXVuZGVmaW5lZDtcbiB9O1xuXG5jb25zdCBhc3NlcnRVcGRhdGVPbkRlbGV0ZT0oayk9PmFzc2VydE9rVG9EZWxldGUmJmFzc2VydE9rVG9EZWxldGUoayk7XG5cbmNvbnN0IGdldFNvcnRlZEtleXM9KCk9PntcbmlmKHNvcnRlZEtleXNNZW1vPT09dW5kZWZpbmVkKXtcbnNvcnRlZEtleXNNZW1vPWhhcmRlbihbLi4uZ2V0UmF3S2V5cygpXS5zb3J0KGNvbXBhcmUpKTtcbiB9XG5yZXR1cm4gc29ydGVkS2V5c01lbW87XG4gfTtcblxuY29uc3QgaXRlcmFibGVLZXlzPUZhcignSXRlcmFibGUgb2Yga2V5cycse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGdlbmVyYXRpb249dXBkYXRlQ291bnQ7XG5nZXRTb3J0ZWRLZXlzKCk7XG5jb25zdCBsZW49c29ydGVkS2V5c01lbW8ubGVuZ3RoO1xubGV0IGk9MDtcbnJldHVybiBGYXIoJ0l0ZXJhdG9yIG9mIGtleXMnLHtcbm5leHQ6KCk9PntcbmdlbmVyYXRpb249PT11cGRhdGVDb3VudHx8RmFpbCBgU3RvcmUgJHtxKGtleU5hbWUpfSBjdXJzb3Igc3RhbGVgO1xuLyogSWYgdGhleSdyZSBlcXVhbCwgdGhlbiB0aGUgc29ydGVkS2V5TWVtbyBpcyB0aGUgc2FtZSBvbmUqL1xuLyogd2Ugc3RhcnRlZCB3aXRoLiovXG5mb3IoOzspe1xuaWYoaTxsZW4pe1xuY29uc3QgdmFsdWU9c29ydGVkS2V5c01lbW9baV07XG5pKz0xO1xuaWYoY2hlY2tIYXModmFsdWUpKXtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuaXRlcmFibGVLZXlzfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUN1cnJlbnRLZXlzS2l0KG1ha2VDdXJyZW50S2V5c0tpdCk7XG5oYXJkZW4obWFrZUN1cnJlbnRLZXlzS2l0KTtcblxuLyoqXG4gKiBDYWxsIGBwcm92aWRlTGF6eWAgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICogSWYgdGhlcmUgYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsXG4gKiBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzIHRoZSB2YWx1ZSBmb3JcbiAqIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssVj59IG1hcFN0b3JlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBWfSBtYWtlVmFsdWVcbiAqIEByZXR1cm5zIHtWfVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUxhenk9KG1hcFN0b3JlLGtleSxtYWtlVmFsdWUpPT57XG5pZighbWFwU3RvcmUuaGFzKGtleSkpe1xubWFwU3RvcmUuaW5pdChrZXksbWFrZVZhbHVlKGtleSkpO1xuIH1cbnJldHVybiBtYXBTdG9yZS5nZXQoa2V5KTtcbiB9OyRo4oCNX29uY2UucHJvdmlkZUxhenkocHJvdmlkZUxhenkpO1xuaGFyZGVuKHByb3ZpZGVMYXp5KTtcblxuLyoqXG4gKiBIZWxwZXIgZm9yIHVzZSBjYXNlcyBpbiB3aGljaCB0aGUgbWFrZXIgZnVuY3Rpb24gaXMgYXN5bmMuXG4gKiBGb3IgdHdvIHByb3ZpZGVMYXp5IGNhbGxzIHdpdGggdGhlIHNhbWUga2V5LCBvbmUgbWF5IGJlIG1ha2luZyB3aGVuIHRoZVxuICogb3RoZXIgY2FsbCBzdGFydHMgYW5kIGl0IHdvdWxkIG1ha2UgYWdhaW4uXG4gKiAoVGhlbiB0aGVyZSdkIGJlIGEgY29sbGlzaW9uIHdoZW4gdGhlIHNlY29uZCB0cmllcyB0byBzdG9yZVxuICogdGhlIGtleS4pIFRoaXMgcHJldmVudHMgdGhhdCByYWNlIGNvbmRpdGlvbiBieSBpbW1lZGlhdGVseSBzdG9yaW5nIGEgUHJvbWlzZVxuICogZm9yIHRoZSBtYWtlciBpbiBhbiBlcGhlbWVyYWwgc3RvcmUuXG4gKlxuICogV2hlbiB0aGUgYHN0b3JlYCBhcmd1bWVudCBpcyBkdXJhYmxlIHN0b3JhZ2UsIG5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvclxuICogdGVybWluYXRpb24gdG8gaGFwcGVuIGFmdGVyIHRoZSBtYWtlIGNvbXBsZXRlcyBhbmQgYmVmb3JlIGl0IHJlYWNoZXMgZHVyYWJsZVxuICogc3RvcmFnZS5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssIFY+fSBzdG9yZVxuICovXG5jb25zdCAgICAgICAgbWFrZUF0b21pY1Byb3ZpZGVyPShzdG9yZSk9Pntcbi8qKiBAdHlwZSB7TWFwPEssIFByb21pc2U8Vj4+fSAqL1xuY29uc3QgcGVuZGluZz1uZXcgTWFwKCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUFzeW5jYCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksXG4gKiB3aGVuIHRoZSBtYWtlciBpcyBhc3luY2hyb25vdXMuXG4gKiBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSxcbiAqIGNhbGwgYG1ha2VWYWx1ZShrZXkpYCwgcmVtZW1iZXIgaXQgYXMgdGhlIHZhbHVlIGZvclxuICogdGhhdCBrZXksIGFuZCByZXR1cm4gaXQuXG4gKlxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gUHJvbWlzZTxWPn0gbWFrZVZhbHVlIG1ha2UgdGhlIHZhbHVlIGZvciB0aGUgc3RvcmVcbiAqIGlmIGl0IGhhc24ndCBiZWVuIG1hZGUgeWV0IG9yIHRoZSBsYXN0IG1ha2UgZmFpbGVkXG4gKiBAcGFyYW0geyhrZXk6IEssIHZhbHVlOiBWKSA9PiBQcm9taXNlPHZvaWQ+fSBbZmluaXNoVmFsdWVdIHJ1bnMgZXhhY3RseVxuICogb25jZSBhZnRlciBhIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgc3RvcmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFY+fVxuICovXG5jb25zdCBwcm92aWRlQXN5bmM9KGtleSxtYWtlVmFsdWUsZmluaXNoVmFsdWUpPT57XG5pZihzdG9yZS5oYXMoa2V5KSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0b3JlLmdldChrZXkpKTtcbiB9XG5pZighcGVuZGluZy5oYXMoa2V5KSl7XG5jb25zdCB2YWxQPW1ha2VWYWx1ZShrZXkpLlxudGhlbigodik9PntcbnN0b3JlLmluaXQoa2V5LHYpO1xucmV0dXJuIHY7XG4gfSkuXG50aGVuKCh2KT0+e1xuaWYoZmluaXNoVmFsdWUpe1xucmV0dXJuIGZpbmlzaFZhbHVlKGtleSx2KS50aGVuKCgpPT52KTtcbiB9XG5yZXR1cm4gdjtcbiB9KS5cbmZpbmFsbHkoKCk9PntcbnBlbmRpbmcuZGVsZXRlKGtleSk7XG4gfSk7XG5wZW5kaW5nLnNldChrZXksdmFsUCk7XG4gfVxuY29uc3QgdmFsUD1wZW5kaW5nLmdldChrZXkpO1xuYXNzZXJ0KHZhbFApO1xucmV0dXJuIHZhbFA7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cHJvdmlkZUFzeW5jfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VBdG9taWNQcm92aWRlcihtYWtlQXRvbWljUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VBdG9taWNQcm92aWRlcik7XG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VBdG9taWNQcm92aWRlcjxLLCBWPj59IEF0b21pY1Byb3ZpZGVyPEssIFY+XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSywgVlxuICogQHBhcmFtIHtNYXBTdG9yZTxLLCBWW10+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7Vn0gaXRlbVxuICovXG5jb25zdCAgICAgICAgYXBwZW5kVG9TdG9yZWRBcnJheT0obWFwU3RvcmUsa2V5LGl0ZW0pPT57XG5pZihtYXBTdG9yZS5oYXMoa2V5KSl7XG5jb25zdCBleHRhbnQ9bWFwU3RvcmUuZ2V0KGtleSk7XG5tYXBTdG9yZS5zZXQoa2V5LGhhcmRlbihbLi4uZXh0YW50LGl0ZW1dKSk7XG4gfWVsc2V7XG5tYXBTdG9yZS5pbml0KGtleSxoYXJkZW4oW2l0ZW1dKSk7XG4gfVxuIH07JGjigI1fb25jZS5hcHBlbmRUb1N0b3JlZEFycmF5KGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xuaGFyZGVuKGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weVNldCI6WyJpc0NvcHlTZXQiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJtYWtlQ3VycmVudEtleXNLaXQiOlsibWFrZUN1cnJlbnRLZXlzS2l0Il0sInByb3ZpZGVMYXp5IjpbInByb3ZpZGVMYXp5Il0sIm1ha2VBdG9taWNQcm92aWRlciI6WyJtYWtlQXRvbWljUHJvdmlkZXIiXSwiYXBwZW5kVG9TdG9yZWRBcnJheSI6WyJhcHBlbmRUb1N0b3JlZEFycmF5Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMUArIJYKgAAWCoAACEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5VGFnZ2VkfSBDb3B5VGFnZ2VkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXInKS5SYW5rQ29tcGFyZX0gUmFua0NvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyJykuUmFua0NvbXBhcmlzb259IFJhbmtDb21wYXJpc29uICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cbi8qIFBsYWNlaG9sZGVyIHJlZHVuZGFudCB0eXBlcywgdG8gYmUgaW1wb3J0ZWQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWQuKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFzc2FibGV9IEtleVxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFzc2FibGV9IFBhdHRlcm5cbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV1cbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkICYge1xuICogICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogJ2NvcHlTZXQnLFxuICogICBwYXlsb2FkOiBBcnJheTxLPixcbiAqIH19IENvcHlTZXRcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV1cbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkICYge1xuICogICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogJ2NvcHlCYWcnLFxuICogICBwYXlsb2FkOiBBcnJheTxbSywgYmlnaW50XT4sXG4gKiB9fSBDb3B5QmFnXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVj1QYXNzYWJsZV1cbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkICYge1xuICogICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogJ2NvcHlNYXAnLFxuICogICBwYXlsb2FkOiB7IGtleXM6IEFycmF5PEs+LCB2YWx1ZXM6IEFycmF5PFY+IH0sXG4gKiB9fSBDb3B5TWFwXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEd1YXJkTWFrZXJzXG4gKiBAcHJvcGVydHkgezxNIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4oaW50ZXJmYWNlTmFtZTogc3RyaW5nLFxuICogICAgICAgICAgICAgbWV0aG9kR3VhcmRzOiBNLFxuICogICAgICAgICAgICAgb3B0aW9ucz86IHtzbG9wcHk/OiBib29sZWFufVxuICogKSA9PiBJbnRlcmZhY2VHdWFyZH0gaW50ZXJmYWNlXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqXG4gKiBAcHJvcGVydHkgeyguLi5hcmdHdWFyZHM6IEFyZ0d1YXJkW10pID0+IE1ldGhvZEd1YXJkTWFrZXJ9IGNhbGwgR3VhcmQgYSBzeW5jaHJvbm91cyBjYWxsXG4gKlxuICogQHByb3BlcnR5IHsoLi4uYXJnR3VhcmRzOiBBcmdHdWFyZFtdKSA9PiBNZXRob2RHdWFyZE1ha2VyfSBjYWxsV2hlbiBHdWFyZCBhbiBhc3luYyBjYWxsXG4gKlxuICogQHByb3BlcnR5IHsoYXJnR3VhcmQ6IEFyZ0d1YXJkKSA9PiBBcmdHdWFyZH0gYXdhaXQgR3VhcmQgYW4gYXdhaXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gTWV0aG9kXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiBrbGFzczogJ0ludGVyZmFjZScsXG4gKiBpbnRlcmZhY2VOYW1lOiBzdHJpbmcsXG4gKiBtZXRob2RHdWFyZHM6IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIE1ldGhvZEd1YXJkPlxuICogc2xvcHB5PzogYm9vbGVhblxuICogfX0gSW50ZXJmYWNlR3VhcmRcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2FueX0gTWV0aG9kR3VhcmRNYWtlclxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7eyBrbGFzczogJ21ldGhvZEd1YXJkJywgY2FsbEtpbmQ6ICdzeW5jJyB8ICdhc3luYycsIHJldHVybkd1YXJkOiB1bmtub3duIH19IE1ldGhvZEd1YXJkXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHthbnl9IEFyZ0d1YXJkXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVPcHRpb25zXG4gKiBPZiB0aGUgZGltZW5zaW9ucyBvbiB3aGljaCBLZXllZFN0b3JlcyBjYW4gZGlmZmVyLCB3ZSBvbmx5IHJlcHJlc2VudCBhIGZld1xuICogb2YgdGhlbSBhcyBzdGFuZGFyZCBvcHRpb25zLiBBIGdpdmVuIHN0b3JlIG1ha2VyIHNob3VsZCBkb2N1bWVudCB3aGljaFxuICogb3B0aW9ucyBpdCBzdXBwb3J0cywgYXMgd2VsbCBhcyBpdHMgcG9zaXRpb25zIG9uIGRpbWVuc2lvbnMgZm9yIHdoaWNoIGl0XG4gKiBkb2VzIG5vdCBzdXBwb3J0IG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb25nTGl2ZWQ9dHJ1ZV0gV2hpY2ggd2F5IHRvIG9wdGltaXplIGEgd2VhayBzdG9yZS4gVHJ1ZSBtZWFuc1xuICogdGhhdCB3ZSBleHBlY3QgdGhpcyB3ZWFrIHN0b3JlIHRvIG91dGxpdmUgbW9zdCBvZiBpdHMga2V5cywgaW4gd2hpY2hcbiAqIGNhc2Ugd2UgaW50ZXJuYWxseSBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgV2Vha01hcGAuIE90aGVyd2lzZSB3ZSBpbnRlcm5hbGx5XG4gKiBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgTWFwYC5cbiAqIERlZmF1bHRzIHRvIHRydWUsIHNvIHBsZWFzZSBtYXJrIHNob3J0IGxpdmVkIHN0b3JlcyBleHBsaWNpdGx5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZHVyYWJsZT1mYWxzZV0gIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JlIHN1cnZpdmUgdGVybWluYXRpb25cbiAqICAgb2YgaXRzIGNvbnRhaW5pbmcgcHJvY2VzcywgYWxsb3dpbmcgZm9yIHJlc3RhcnQgb3IgdXBncmFkZSBidXQgYXQgdGhlIGNvc3RcbiAqICAgb2YgZm9yYmlkZGluZyBzdG9yYWdlIG9mIHJlZmVyZW5jZXMgdG8gZXBoZW1lcmFsIGRhdGEuICBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Zha2VEdXJhYmxlPWZhbHNlXSAgVGhpcyBzdG9yZSBwcmV0ZW5kcyB0byBiZSBhIGR1cmFibGUgc3RvcmVcbiAqICAgYnV0IGRvZXMgbm90IGVuZm9yY2UgdGhhdCB0aGUgdGhpbmdzIHN0b3JlZCBpbiBpdCBhY3R1YWxseSBiZSB0aGVtc2VsdmVzXG4gKiAgIGR1cmFibGUgKHdoZXJlYXMgYW4gYWN0dWFsIGR1cmFibGUgc3RvcmUgd291bGQgZm9yYmlkIHN0b3JhZ2Ugb2Ygc3VjaFxuICogICBpdGVtcykuICBUaGlzIGlzIGluIHNlcnZpY2Ugb2YgYWxsb3dpbmcgaW5jcmVtZW50YWwgdHJhbnNpdGlvbiB0byB1c2Ugb2ZcbiAqICAgZHVyYWJsZSBzdG9yZXMsIHRvIGVuYWJsZSBub3JtYWwgb3BlcmF0aW9uIGFuZCB0ZXN0aW5nIHdoZW4gc29tZSBzdHVmZlxuICogICBpbnRlbmRlZCB0byBldmVudHVhbGx5IGJlIGR1cmFibGUgaGFzIG5vdCB5ZXQgYmVlbiBtYWRlIGR1cmFibGUuICBBIHN0b3JlXG4gKiAgIG1hcmtlZCBhcyBmYWtlRHVyYWJsZSB3aWxsIGFwcGVhciB0byBvcGVyYXRlIG5vcm1hbGx5IGJ1dCBhbnkgYXR0ZW1wdCB0b1xuICogICB1cGdyYWRlIGl0cyBjb250YWluaW5nIHZhdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gW2tleVNoYXBlXVxuICogQHByb3BlcnR5IHtQYXR0ZXJufSBbdmFsdWVTaGFwZV1cbiAqL1xuXG4vKipcbiAqIE1vc3Qgc3RvcmUgbWV0aG9kcyBhcmUgaW4gb25lIG9mIHRocmVlIGNhdGVnb3JpZXNcbiAqICAgKiBsb29rdXAgbWV0aG9kcyAoYGhhc2AsYGdldGApXG4gKiAgICogdXBkYXRlIG1ldGhvZHMgKGBhZGRgLGBpbml0YCxgc2V0YCxgZGVsZXRlYCxgYWRkQWxsYClcbiAqICAgKiBxdWVyeSBtZXRob2RzIChgc25hcHNob3RgLGBrZXlzYCxgdmFsdWVzYCxgZW50cmllc2AsYGdldFNpemVgKVxuICogICAqIHF1ZXJ5LXVwZGF0ZSBtZXRob2RzIChgY2xlYXJgKVxuICpcbiAqIFdlYWtTdG9yZXMgaGF2ZSB0aGUgbG9va3VwIGFuZCB1cGRhdGUgbWV0aG9kcyBidXQgbm90IHRoZSBxdWVyeVxuICogb3IgcXVlcnktdXBkYXRlIG1ldGhvZHMuXG4gKiBOb24td2VhayBTdG9yZXMgYXJlIGxpa2UgdGhlaXIgY29ycmVzcG9uZGluZyBXZWFrU3RvcmVzLCBidXQgd2l0aCB0aGVcbiAqIGFkZGl0aW9uYWwgcXVlcnkgYW5kIHF1ZXJ5LXVwZGF0ZSBtZXRob2RzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXkgJiBvYmplY3R9IFtLPUtleV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYWtTZXRTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBhZGRcbiAqIEFkZCB0aGUga2V5IHRvIHRoZSBzZXQgaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUuIERvIG5vdGhpbmcgc2lsZW50bHkgaWZcbiAqIGFscmVhZHkgdGhlcmUuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXlzOiBDb3B5U2V0PEs+IHwgSXRlcmFibGU8Sz4pID0+IHZvaWR9IGFkZEFsbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNldFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGFkZFxuICogQWRkIHRoZSBrZXkgdG8gdGhlIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4gRG8gbm90aGluZyBzaWxlbnRseSBpZlxuICogYWxyZWFkeSB0aGVyZS5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXM6IENvcHlTZXQ8Sz4gfCBJdGVyYWJsZTxLPikgPT4gdm9pZH0gYWRkQWxsXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gQ29weVNldDxLPn0gc25hcHNob3RcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBudW1iZXJ9IGdldFNpemVcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiB2b2lkfSBjbGVhclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXkgJiBvYmplY3R9IFtLPUtleV1cbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtWPVBhc3NhYmxlXVxuICogQHR5cGVkZWYge29iamVjdH0gV2Vha01hcFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoZW50cmllczogQ29weU1hcDxLLFY+IHwgSXRlcmFibGU8W0ssVl0+KSA9PiB2b2lkfSBhZGRBbGxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVj1QYXNzYWJsZV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hcFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgbWFwXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoZW50cmllczogQ29weU1hcDxLLFY+IHwgSXRlcmFibGU8W0ssVl0+KSA9PiB2b2lkfSBhZGRBbGxcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPFY+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBrZXlQYXR0PzogUGF0dGVybixcbiAqICAgdmFsdWVQYXR0PzogUGF0dGVyblxuICogKSA9PiBJdGVyYWJsZTxbSyxWXT59IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBDb3B5TWFwPEssVj59IHNuYXBzaG90XG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gdm9pZH0gY2xlYXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIERlcHJlY2F0ZWQgTGVnYWN5IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5V2Vha01hcFxuICogTGVnYWN5V2Vha01hcCBpcyBkZXByZWNhdGVkLiBVc2UgV2Vha01hcFN0b3JlIGluc3RlYWQgaWYgcG9zc2libGUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdFxuICogZG9lc24ndCBhbHJlYWR5IGV4aXN0XG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5TWFwXG4gKiBMZWdhY3lNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIE1hcFN0b3JlIGluc3RlYWQgaWYgcG9zc2libGUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdFxuICogZG9lc24ndCBhbHJlYWR5IGV4aXN0XG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxWPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeygpID0+IEl0ZXJhYmxlPFtLLFZdPn0gZW50cmllc1xuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGdldFNpemVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gY2xlYXJcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACYGTuzNAEAADQBAAAoAAAAQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzIuMi9leHBvcnRlZC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAhmCHYvwEAAL8BAAAcAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90aW1lTWF0aC5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy90aW1lTWF0aC5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90aW1lTWF0aC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANgqRWKoiAACqIgAAIwAAAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3RpbWVNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL3BhdHRlcm5zIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiVGltZU1hdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LG11c3RNYXRjaCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxUaW1lc3RhbXBSZWNvcmRTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiVGltZXN0YW1wUmVjb3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFJlY29yZFNoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcbi8qKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5UaW1lckJyYW5kfSBUaW1lckJyYW5kXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVzdGFtcH0gVGltZXN0YW1wXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlJlbGF0aXZlVGltZX0gUmVsYXRpdmVUaW1lXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlJlbGF0aXZlVGltZVZhbHVlfSBSZWxhdGl2ZVRpbWVWYWx1ZVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5UaW1lc3RhbXBWYWx1ZX0gVGltZXN0YW1wVmFsdWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuVGltZU1hdGhUeXBlfSBUaW1lTWF0aFR5cGVcbiAqXG4gKi9cblxuLyoqXG4gKiBgYWdyZWVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUuXG4gKlxuICogQHBhcmFtIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfSBsZWZ0QnJhbmRcbiAqIEBwYXJhbSB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH0gcmlnaHRCcmFuZFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGFncmVlZFRpbWVyQnJhbmQ9KGxlZnRCcmFuZCxyaWdodEJyYW5kKT0+e1xuaWYobGVmdEJyYW5kPT09dW5kZWZpbmVkKXtcbmlmKHJpZ2h0QnJhbmQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9ZWxzZXtcbnJldHVybiByaWdodEJyYW5kO1xuIH1cbiB9ZWxzZSBpZihyaWdodEJyYW5kPT09dW5kZWZpbmVkKXtcbnJldHVybiBsZWZ0QnJhbmQ7XG4gfWVsc2V7XG5sZWZ0QnJhbmQ9PT1yaWdodEJyYW5kfHxcbkZhaWwgYFRpbWVyQnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0QnJhbmQpfSB2cyAke3EocmlnaHRCcmFuZCl9YDtcbnJldHVybiBsZWZ0QnJhbmQ7XG4gfVxuIH07XG5cbi8qKlxuICogYHNoYXJlZFRpbWVyQnJhbmRgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgaW1wbGVtZW50cyB0aGVcbiAqIHRyYW5zaXRpb25hbCBicmFuZCBjaGVja2luZyBhbmQgY29udGFpZ2lvbiBsb2dpYyBleHBsYWluZWQgaW4gdGhlIGBUaW1lTWF0aGBcbiAqIGNvbW1lbnQuIEl0IGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBiaW5hcnkgb3BlcmF0b3JzIHRoYXQgc2hvdWxkIGZvbGxvd1xuICogdGhpcyBsb2dpYy4gSXQgZG9lcyB0aGUgZXJyb3IgY2hlY2tpbmcgYmV0d2VlbiB0aGUgb3BlcmFuZHMsIGFuZCByZXR1cm5zXG4gKiB0aGUgYnJhbmQsIGlmIGFueSwgdGhhdCBzaG91bGQgbGFiZWwgdGhlIHJlc3VsdGluZyB0aW1lIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSBsZWZ0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gcmlnaHRcbiAqIEByZXR1cm5zIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBzaGFyZWRUaW1lckJyYW5kPShsZWZ0LHJpZ2h0KT0+e1xuY29uc3QgbGVmdEJyYW5kPXR5cGVvZiBsZWZ0PT09J2JpZ2ludCc/dW5kZWZpbmVkOmxlZnQudGltZXJCcmFuZDtcbmNvbnN0IHJpZ2h0QnJhbmQ9dHlwZW9mIHJpZ2h0PT09J2JpZ2ludCc/dW5kZWZpbmVkOnJpZ2h0LnRpbWVyQnJhbmQ7XG5yZXR1cm4gYWdyZWVkVGltZXJCcmFuZChsZWZ0QnJhbmQscmlnaHRCcmFuZCk7XG4gfTtcblxuLyoqXG4gKiBgYWJzTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFRpbWVzdGFtcGBcbiAqIHJhdGhlciB0aGFuIGEgYFJlbGF0aXZlVGltZWAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtUaW1lc3RhbXBWYWx1ZX0gYWJzVmFsdWVcbiAqIEByZXR1cm5zIHtUaW1lc3RhbXB9XG4gKi9cbmNvbnN0IGFic0xpa2U9KGxlZnQscmlnaHQsYWJzVmFsdWUpPT57XG5OYXQoYWJzVmFsdWUpO1xuY29uc3QgdGltZXJCcmFuZD1zaGFyZWRUaW1lckJyYW5kKGxlZnQscmlnaHQpO1xuaWYodGltZXJCcmFuZCl7XG5yZXR1cm4gaGFyZGVuKHtcbnRpbWVyQnJhbmQsXG5hYnNWYWx1ZX0pO1xuXG4gfWVsc2V7XG5yZXR1cm4gYWJzVmFsdWU7XG4gfVxuIH07XG5cbi8qKlxuICogYHJlbExpa2VgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeVxuICogb3BlcmF0b3JzIGluIHRoZSBjYXNlIHdoZXJlIHRoZSByZXR1cm5lZCB0aW1lIHNob3VsZCBiZSBhIGBSZWxhdGl2ZVRpbWVgXG4gKiByYXRoZXIgdGhhbiBhIGBUaW1lc3RhbXBgLlxuICpcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSBsZWZ0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gcmlnaHRcbiAqIEBwYXJhbSB7UmVsYXRpdmVUaW1lVmFsdWV9IHJlbFZhbHVlXG4gKiBAcmV0dXJucyB7UmVsYXRpdmVUaW1lfVxuICovXG5jb25zdCByZWxMaWtlPShsZWZ0LHJpZ2h0LHJlbFZhbHVlKT0+e1xuTmF0KHJlbFZhbHVlKTtcbmNvbnN0IHRpbWVyQnJhbmQ9c2hhcmVkVGltZXJCcmFuZChsZWZ0LHJpZ2h0KTtcbmlmKHRpbWVyQnJhbmQpe1xucmV0dXJuIGhhcmRlbih7XG50aW1lckJyYW5kLFxucmVsVmFsdWV9KTtcblxuIH1lbHNle1xucmV0dXJuIHJlbFZhbHVlO1xuIH1cbiB9O1xuXG4vKiBGb3IgYWxsIHRoZSBmb2xsb3dpbmcgdGltZSBvcGVyYXRvcnMsIHRoZWlyIGRvY3VtZW50YXRpb24gaXMgaW4qL1xuLyogdGhlIGBUaW1lTWF0aFR5cGVgLCBzaW5jZSB0aGF0IGlzIHRoZSBkb2N1bWVudGF0aW9uIHRoYXQgc2hvd3MgdXAqL1xuLyogaW4gdGhlIElERS4gV2VsbCwgYXQgbGVhc3QgdGhlIHZzY29kZSBJREUuKi9cblxuY29uc3QgYWJzVmFsdWU9KGFicyk9PntcbmlmKHR5cGVvZiBhYnM9PT0nYmlnaW50Jyl7XG5yZXR1cm4gTmF0KGFicyk7XG4gfVxubXVzdE1hdGNoKGFicyxUaW1lc3RhbXBSZWNvcmRTaGFwZSwndGltZXN0YW1wJyk7XG5yZXR1cm4gTmF0KGFicy5hYnNWYWx1ZSk7XG4gfTtcblxuY29uc3QgcmVsVmFsdWU9KHJlbCk9PntcbmlmKHR5cGVvZiByZWw9PT0nYmlnaW50Jyl7XG5yZXR1cm4gTmF0KHJlbCk7XG4gfVxubXVzdE1hdGNoKHJlbCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSwncmVsYXRpdmUnKTtcbnJldHVybiBOYXQocmVsLnJlbFZhbHVlKTtcbiB9O1xuXG5jb25zdCBtYWtlVGltZXN0YW1wUmVjb3JkPShhYnMsdGltZXJCcmFuZCk9PlxuaGFyZGVuKHthYnNWYWx1ZTphYnMsdGltZXJCcmFuZH0pO1xuY29uc3QgbWFrZVJlbGF0aXZlVGltZVJlY29yZD0ocmVsLHRpbWVyQnJhbmQpPT5cbmhhcmRlbih7cmVsVmFsdWU6cmVsLHRpbWVyQnJhbmR9KTtcblxuY29uc3QgY29lcmNlVGltZXN0YW1wUmVjb3JkPSh0cyxicmFuZCk9PntcbmJyYW5kfHxGYWlsIGBtdXN0IGhhdmUgYSBicmFuZGA7XG5pZih0eXBlb2YgdHM9PT0nbnVtYmVyJyl7XG50cz1OYXQodHMpO1xuIH1cbmlmKHR5cGVvZiB0cz09PSdiaWdpbnQnKXtcbnJldHVybiBtYWtlVGltZXN0YW1wUmVjb3JkKHRzLGJyYW5kKTtcbiB9ZWxzZXtcbmNvbnN0e3RpbWVyQnJhbmR9PXRzO1xubXVzdE1hdGNoKHRzLFRpbWVzdGFtcFJlY29yZFNoYXBlLCd0aW1lc3RhbXAnKTtcbmFncmVlZFRpbWVyQnJhbmQodGltZXJCcmFuZCxicmFuZCk7XG5yZXR1cm4gdHM7XG4gfVxuIH07XG5cbmNvbnN0IGNvZXJjZVJlbGF0aXZlVGltZVJlY29yZD0ocnQsYnJhbmQpPT57XG5icmFuZHx8RmFpbCBgbXVzdCBoYXZlIGEgYnJhbmRgO1xuaWYodHlwZW9mIHJ0PT09J251bWJlcicpe1xucnQ9TmF0KHJ0KTtcbiB9XG5pZih0eXBlb2YgcnQ9PT0nYmlnaW50Jyl7XG5yZXR1cm4gbWFrZVJlbGF0aXZlVGltZVJlY29yZChydCxicmFuZCk7XG4gfWVsc2V7XG5jb25zdHt0aW1lckJyYW5kfT1ydDtcbm11c3RNYXRjaChydCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSwncmVsYXRpdmVUaW1lJyk7XG5hZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsYnJhbmQpO1xucmV0dXJuIHJ0O1xuIH1cbiB9O1xuXG5jb25zdCBhZGRBYnNSZWw9KGFicyxyZWwpPT5cbmFic0xpa2UoYWJzLHJlbCxhYnNWYWx1ZShhYnMpK3JlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBhZGRSZWxSZWw9KHJlbDEscmVsMik9PlxucmVsTGlrZShyZWwxLHJlbDIscmVsVmFsdWUocmVsMSkrcmVsVmFsdWUocmVsMikpO1xuXG5jb25zdCBzdWJ0cmFjdEFic0Ficz0oYWJzMSxhYnMyKT0+XG5yZWxMaWtlKGFiczEsYWJzMixhYnNWYWx1ZShhYnMxKS1hYnNWYWx1ZShhYnMyKSk7XG5cbmNvbnN0IGNsYW1wZWRTdWJ0cmFjdEFic0Ficz0oYWJzMSxhYnMyKT0+e1xuY29uc3QgdmFsMT1hYnNWYWx1ZShhYnMxKTtcbmNvbnN0IHZhbDI9YWJzVmFsdWUoYWJzMik7XG5yZXR1cm4gcmVsTGlrZShhYnMxLGFiczIsdmFsMT52YWwyP3ZhbDEtdmFsMjowbik7XG4gfTtcblxuY29uc3Qgc3VidHJhY3RBYnNSZWw9KGFicyxyZWwpPT5cbmFic0xpa2UoYWJzLHJlbCxhYnNWYWx1ZShhYnMpLXJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBzdWJ0cmFjdFJlbFJlbD0ocmVsMSxyZWwyKT0+XG5yZWxMaWtlKHJlbDEscmVsMixyZWxWYWx1ZShyZWwxKS1yZWxWYWx1ZShyZWwyKSk7XG5cbmNvbnN0IGlzUmVsWmVybz0ocmVsKT0+cmVsVmFsdWUocmVsKT09PTBuO1xuXG5jb25zdCBtdWx0aXBseVJlbE5hdD0ocmVsLG5hdCk9PnJlbExpa2UocmVsLG5hdCxyZWxWYWx1ZShyZWwpKm5hdCk7XG5cbmNvbnN0IGRpdmlkZVJlbE5hdD0ocmVsLG5hdCk9PnJlbExpa2UocmVsLG5hdCxyZWxWYWx1ZShyZWwpL25hdCk7XG5cbmNvbnN0IGRpdmlkZVJlbFJlbD0ocmVsMSxyZWwyKT0+e1xuc2hhcmVkVGltZXJCcmFuZChyZWwxLHJlbDIpOy8qIGp1c3QgZXJyb3IgY2hlY2sqL1xucmV0dXJuIHJlbFZhbHVlKHJlbDEpL3JlbFZhbHVlKHJlbDIpO1xuIH07XG5cbmNvbnN0IG1vZEFic1JlbD0oYWJzLHN0ZXApPT5cbnJlbExpa2UoYWJzLHN0ZXAsYWJzVmFsdWUoYWJzKSVyZWxWYWx1ZShzdGVwKSk7XG5cbmNvbnN0IG1vZFJlbFJlbD0ocmVsLHN0ZXApPT5cbnJlbExpa2UocmVsLHN0ZXAscmVsVmFsdWUocmVsKSVyZWxWYWx1ZShzdGVwKSk7XG5cbi8qKlxuICogYGNvbXBhcmVWYWx1ZXNgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgdXNlZCB0byBpbXBsZW1lbnRcbiAqIHRoZSB0aW1lIGNvbXBhcmlzb24gb3BlcmF0b3JzLlxuICpcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSBsZWZ0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gcmlnaHRcbiAqIEBwYXJhbSB7YmlnaW50fSB2MVxuICogQHBhcmFtIHtiaWdpbnR9IHYyXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cbmNvbnN0IGNvbXBhcmVWYWx1ZXM9KGxlZnQscmlnaHQsdjEsdjIpPT57XG5zaGFyZWRUaW1lckJyYW5kKGxlZnQscmlnaHQpO1xuaWYodjE8djIpe1xucmV0dXJuLTE7XG4gfWVsc2UgaWYodjE9PT12Mil7XG5yZXR1cm4gMDtcbiB9ZWxzZXtcbmFzc2VydCh2MT52Mik7XG5yZXR1cm4gMTtcbiB9XG4gfTtcblxuLyoqXG4gKiBUaGUgYFRpbWVNYXRoYCBvYmplY3QgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdG8gZG8gYXJpdGhtZXRpYyBvbiBsYWJlbGVkXG4gKiB0aW1lIHZhbHVlcywgbXVjaCBsaWtlIGBBbW91bnRNYXRoYCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBkbyBhcml0aG1ldGljXG4gKiBvbiBsYWJlbGVkIGFzc2V0L21vbmV5IHZhbHVlcy4gQm90aCBjaGVjayBmb3IgY29uc2lzdGVuY3kgb2YgbGFiZWxzOiBhXG4gKiBiaW5hcnkgb3BlcmF0aW9uIG9uIHR3byBsYWJlbGVkIG9iamVjdHMgZW5zdXJlcyB0aGF0IHRoZSBib3RoIGNhcnJ5XG4gKiB0aGUgc2FtZSBsYWJlbC4gSWYgdGhleSBwcm9kdWNlIGFub3RoZXIgb2JqZWN0IGZyb20gdGhlIHNhbWUgZG9tYWluLCBpdFxuICogd2lsbCBjYXJyeSB0aGUgc2FtZSBsYWJlbC4gSWYgdGhlIG9wZXJhbmRzIGhhdmUgaW5jb21wYXRpYmxlIGxhYmVscyxcbiAqIGFuIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBVbmxpa2UgYW1vdW50IGFyaXRobWV0aWMsIHRpbWUgYXJpdGhtZXRpYyBkZWFscyBpbiB0d28ga2luZHMgb2YgdGltZSBvYmplY3RzOlxuICogVGltZXN0YW1wcywgd2hpY2ggcmVwcmVzZW50IGFic29sdXRlIHRpbWUsIGFuZCBSZWxhdGl2ZVRpbWUsIHdoaWNoIHJlcHJlc2VudHNcbiAqIHRoZSBkdXJhdGlvbiBiZXR3ZWVuIHR3byBhYnNvbHV0ZSB0aW1lcy4gQm90aCBraW5kcyBvZiB0aW1lIG9iamVjdFxuICogYXJlIGxhYmVsZWQgYnkgYSBgVGltZXJCcmFuZGAuIEZvciBhIFRpbWVzdGFtcCBvYmplY3QsIHRoZSB2YWx1ZSBpc1xuICogYSBiaWdpbnQgaW4gYW4gYGFic1ZhbHVlYCBwcm9wZXJ0eS4gRm9yIGEgUmVsYXRpdmVUaW1lIG9iamVjdCwgdGhlIHZhbHVlXG4gKiBpcyBhIGJpZ2ludCBpbiBhIGByZWxWYWx1ZWAgcHJvcGVydHkuIFRodXMgd2UgaGF2ZSBhIHJ1bnRpbWUgc2FmZXR5IGNoZWNrXG4gKiB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBjb25mdXNlZCB0aGUgdHdvLCBldmVuIGlmIHdlIGhhdmUgbWFuYWdlZCB0byBmb29sXG4gKiB0aGUgKHVuc291bmQpIHN0YXRpYyB0eXBlIHN5c3RlbS5cbiAqXG4gKiBBcyBhIHRyYW5zaXRpb25hbCBtZWFzdXJlLCBjdXJyZW50bHkgbWFueSBUaW1lc3RhbXBzIGFuZCBSZWxhdGl2ZVRpbWVzIGFyZVxuICogc3RpbGwgcmVwcmVzZW50ZWQgYnkgdW5sYWJlbGVkIGJpZ2ludHMuIER1cmluZyB0aGlzIHRyYW5zaXRpb25hbCBwZXJpb2QsXG4gKiB3ZSBhbGxvdyB0aGlzLCBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5LiBGb3IgYSBub3JtYWwgYmluYXJ5XG4gKiBvcGVyYXRpb24sIGlmIGJvdGggaW5wdXRzIGFyZSBsYWJlbGVkLCB0aGVuIHdlIGRvIHRoZSBmdWxsIGNoZWNraW5nIGFzXG4gKiBleHBsYWluZWQgYWJvdmUgYW5kIHJldHVybiBhIGxhYmVsZWQgcmVzdWx0LiBJZiBib3RoIGlucHV0cyBhcmUgdW5sYWJlbGVkXG4gKiBiaWdpbnRzLCB3ZSAqYXNzdW1lKiB0aGF0IHRoZXkgaW5kaWNhdGUgYSB0aW1lIG9mIHRoZSByaWdodCBraW5kXG4gKiAoVGltZXN0YW1wIHZzIFJlbGF0aXZlVGltZSkgYW5kIHRpbWVyIGJyYW5kLiBTaW5jZSB3ZSBkb24ndCBrbm93IHdoYXRcbiAqIGJyYW5kIHdhcyBpbnRlbmRlZCwgd2UgY2FuIG9ubHkgcmV0dXJuIHlldCBhbm90aGVyIHVubGFiZWxlZCBiaWdpbnQuXG4gKlxuICogSWYgb25lIG9wZXJhbmQgaXMgbGFiZWxlZCBhbmQgdGhlIG90aGVyIGlzIG5vdCwgd2UgY2hlY2sgdGhlIGxhYmVsZWQgb3BlcmFuZCxcbiAqICphc3N1bWUqIHRoZSB1bmxhYmVsZWQgYmlnaW50IHJlcHJlc2VudHMgdGhlIHZhbHVlIG5lZWRlZCBmb3IgdGhlIG90aGVyXG4gKiBvcGVyYW5kLCBhbmQgcmV0dXJuIGEgbGFiZWxlZCB0aW1lIG9iamVjdCB3aXRoIHRoZSBicmFuZCBvZiB0aGUgbGFiZWxlZFxuICogb3BlcmFuZC5cbiAqXG4gKiBAdHlwZSB7VGltZU1hdGhUeXBlfVxuICovXG5jb25zdCAgICAgICAgVGltZU1hdGg9aGFyZGVuKHtcbmFic1ZhbHVlLFxucmVsVmFsdWUsXG5jb2VyY2VUaW1lc3RhbXBSZWNvcmQsXG5jb2VyY2VSZWxhdGl2ZVRpbWVSZWNvcmQsXG5hZGRBYnNSZWwsXG5hZGRSZWxSZWwsXG5zdWJ0cmFjdEFic0FicyxcbmNsYW1wZWRTdWJ0cmFjdEFic0FicyxcbnN1YnRyYWN0QWJzUmVsLFxuc3VidHJhY3RSZWxSZWwsXG5pc1JlbFplcm8sXG5tdWx0aXBseVJlbE5hdCxcbmRpdmlkZVJlbE5hdCxcbmRpdmlkZVJlbFJlbCxcbm1vZEFic1JlbCxcbm1vZFJlbFJlbCxcbmNvbXBhcmVBYnM6KGFiczEsYWJzMik9PlxuY29tcGFyZVZhbHVlcyhhYnMxLGFiczIsYWJzVmFsdWUoYWJzMSksYWJzVmFsdWUoYWJzMikpLFxuY29tcGFyZVJlbDoocmVsMSxyZWwyKT0+XG5jb21wYXJlVmFsdWVzKHJlbDEscmVsMixyZWxWYWx1ZShyZWwxKSxyZWxWYWx1ZShyZWwyKSl9KTskaOKAjV9vbmNlLlRpbWVNYXRoKFRpbWVNYXRoKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUaW1lTWF0aCI6WyJUaW1lTWF0aCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACe2AmhqQcAAKkHAAAlAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIiwiUmVsYXRpdmVUaW1lU2hhcGUiLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIiwiVGltZXJCcmFuZFNoYXBlIiwiVGltZXJTZXJ2aWNlU2hhcGUiLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSIsIlRpbWVzdGFtcFNoYXBlIiwiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0ICAgICAgICBUaW1lckJyYW5kU2hhcGU9TS5yZW1vdGFibGUoJ1RpbWVyQnJhbmQnKTskaOKAjV9vbmNlLlRpbWVyQnJhbmRTaGFwZShUaW1lckJyYW5kU2hhcGUpO1xuY29uc3QgICAgICAgIFRpbWVzdGFtcFZhbHVlU2hhcGU9TS5uYXQoKTskaOKAjV9vbmNlLlRpbWVzdGFtcFZhbHVlU2hhcGUoVGltZXN0YW1wVmFsdWVTaGFwZSk7XG5jb25zdCAgICAgICAgUmVsYXRpdmVUaW1lVmFsdWVTaGFwZT1NLm5hdCgpOy8qIFNob3VsZCB3ZSBhbGxvdyBuZWdhdGl2ZXM/Ki8kaOKAjV9vbmNlLlJlbGF0aXZlVGltZVZhbHVlU2hhcGUoUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBUaW1lc3RhbXBSZWNvcmRTaGFwZT1oYXJkZW4oe1xudGltZXJCcmFuZDpUaW1lckJyYW5kU2hhcGUsXG5hYnNWYWx1ZTpUaW1lc3RhbXBWYWx1ZVNoYXBlfSk7JGjigI1fb25jZS5UaW1lc3RhbXBSZWNvcmRTaGFwZShUaW1lc3RhbXBSZWNvcmRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFJlbGF0aXZlVGltZVJlY29yZFNoYXBlPWhhcmRlbih7XG50aW1lckJyYW5kOlRpbWVyQnJhbmRTaGFwZSxcbnJlbFZhbHVlOlJlbGF0aXZlVGltZVZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLlJlbGF0aXZlVGltZVJlY29yZFNoYXBlKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVGltZXN0YW1wU2hhcGU9TS5vcihUaW1lc3RhbXBSZWNvcmRTaGFwZSxUaW1lc3RhbXBWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLlRpbWVzdGFtcFNoYXBlKFRpbWVzdGFtcFNoYXBlKTtcbmNvbnN0ICAgICAgICBSZWxhdGl2ZVRpbWVTaGFwZT1NLm9yKFxuUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsXG5SZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLlJlbGF0aXZlVGltZVNoYXBlKFJlbGF0aXZlVGltZVNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVGltZXJTZXJ2aWNlU2hhcGU9TS5yZW1vdGFibGUoJ1RpbWVyU2VydmljZScpOyRo4oCNX29uY2UuVGltZXJTZXJ2aWNlU2hhcGUoVGltZXJTZXJ2aWNlU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRpbWVyQnJhbmRTaGFwZSI6WyJUaW1lckJyYW5kU2hhcGUiXSwiVGltZXN0YW1wVmFsdWVTaGFwZSI6WyJUaW1lc3RhbXBWYWx1ZVNoYXBlIl0sIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiOlsiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSJdLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSI6WyJUaW1lc3RhbXBSZWNvcmRTaGFwZSJdLCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSJdLCJUaW1lc3RhbXBTaGFwZSI6WyJUaW1lc3RhbXBTaGFwZSJdLCJSZWxhdGl2ZVRpbWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVTaGFwZSJdLCJUaW1lclNlcnZpY2VTaGFwZSI6WyJUaW1lclNlcnZpY2VTaGFwZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAKLNUppSkAAKUpAAAoAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2V4by11dGlscy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImlnbm9yZUNvbnRleHQiLCJtYWtlRXhvVXRpbHMiLCJwcmVwYXJlRXhvIiwicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUtpbmQiLCJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZVNpbmdsZXRvbiIsInByb3ZpZGVLaW5kSGFuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGluaXRFbXB0eSxwcm92aWRlLGdsb2JhbFZhdERhdGE7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wicHJvdmlkZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZSA9ICRo4oCNX2EpXV0sW1wiVmF0RGF0YVwiLCBbJGjigI1fYSA9PiAoZ2xvYmFsVmF0RGF0YSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8VD59IEVSZWYgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5CYWdnYWdlfSBCYWdnYWdlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuRGVmaW5lS2luZE9wdGlvbnM8VD59IERlZmluZUtpbmRPcHRpb25zICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuS2luZEZhY2V0PFQ+fSBLaW5kRmFjZXQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5LaW5kRmFjZXRzPFQ+fSBLaW5kRmFjZXRzICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuRHVyYWJsZUtpbmRIYW5kbGV9IER1cmFibGVLaW5kSGFuZGxlICovXG5cbi8qKlxuICogTWFrZSBhIHZlcnNpb24gb2YgdGhlIGFyZ3VtZW50IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBraW5kIGNvbnRleHQgYnV0XG4gKiBpZ25vcmVzIGl0LlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIEZ1bmN0aW9uPihmbjogVCkgPT4gWGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5QbHVzQ29udGV4dDxuZXZlciwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBpZ25vcmVDb250ZXh0PVxuKGZuKT0+XG4oX2NvbnRleHQsLi4uYXJncyk9PlxuZm4oLi4uYXJncyk7JGjigI1fb25jZS5pZ25vcmVDb250ZXh0KGlnbm9yZUNvbnRleHQpO1xuaGFyZGVuKGlnbm9yZUNvbnRleHQpO1xuXG4vKiBUT0RPOiBGaW5kIGEgZ29vZCBob21lIGZvciB0aGlzIGZ1bmN0aW9uIHVzZWQgYnkgQGFnb3JpYy92YXQtZGF0YSBhbmQgdGVzdGluZyBjb2RlKi9cbmNvbnN0ICAgICAgICBtYWtlRXhvVXRpbHM9KFZhdERhdGEpPT57XG5jb25zdHtcbmRlZmluZUtpbmQsXG5kZWZpbmVLaW5kTXVsdGksXG5kZWZpbmVEdXJhYmxlS2luZCxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGksXG5tYWtlS2luZEhhbmRsZX09XG5WYXREYXRhO1xuXG4vKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcmV0dXJucyB7RHVyYWJsZUtpbmRIYW5kbGV9XG4gKi9cbmNvbnN0IHByb3ZpZGVLaW5kSGFuZGxlPShiYWdnYWdlLGtpbmROYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwoKT0+bWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTtcbmhhcmRlbihwcm92aWRlS2luZEhhbmRsZSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG9DbGFzcyBpbnN0ZWFkXG4gKiBAdHlwZSB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5QcmVwYXJlS2luZH1cbiAqL1xuY29uc3QgcHJlcGFyZUtpbmQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpO1xuXG5oYXJkZW4ocHJlcGFyZUtpbmQpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvQ2xhc3NLaXQgaW5zdGVhZFxuICogQHR5cGUge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuUHJlcGFyZUtpbmRNdWx0aX1cbiAqL1xuY29uc3QgcHJlcGFyZUtpbmRNdWx0aT0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zKTtcblxuaGFyZGVuKHByZXBhcmVLaW5kTXVsdGkpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIFQgYmVoYXZpb3JcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7XG4gKiAgIHNlbGY6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIHNlbGY6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzPSh0YWcsaW50ZXJmYWNlR3VhcmQsaW5pdCxtZXRob2RzLG9wdGlvbnMpPT5cbmRlZmluZUtpbmQodGFnLGluaXQsbWV0aG9kcyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkfSk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8e1xuICogICBmYWNldHM6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIGZhY2V0czogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQ9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk9PlxuXG5kZWZpbmVLaW5kTXVsdGkodGFnLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmQ6aW50ZXJmYWNlR3VhcmRLaXR9KTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7XG4gKiAgIHNlbGY6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIHNlbGY6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgZGVmaW5lRHVyYWJsZUV4b0NsYXNzPShcbmtpbmRIYW5kbGUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZChraW5kSGFuZGxlLGluaXQsbWV0aG9kcyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkfSk7XG5cbmhhcmRlbihkZWZpbmVEdXJhYmxlRXhvQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8e1xuICogICBmYWNldHM6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIGZhY2V0czogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQ9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShraW5kSGFuZGxlLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmQ6aW50ZXJmYWNlR3VhcmRLaXR9KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8e1xuICogICBzZWxmOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0IHByZXBhcmVFeG9DbGFzcz0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlRXhvQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHtcbiAqICAgZmFjZXRzOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgcHJlcGFyZUV4b0NsYXNzS2l0PShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlRXhvQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge019IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNICYgUmVtb3RhYmxlQnJhbmQ8e30sIE0+fVxuICovXG5jb25zdCBwcmVwYXJlRXhvPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlU2luZ2xldG9uPXByZXBhcmVFeG9DbGFzcyhcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdEVtcHR5LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5cbnJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9zaW5nbGV0b25gLCgpPT5tYWtlU2luZ2xldG9uKCkpO1xuIH07XG5oYXJkZW4ocHJlcGFyZUV4byk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4byBpbnN0ZWFkLlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7TX0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IE0gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMge00gJiBSZW1vdGFibGVCcmFuZDx7fSwgTT59XG4gKi9cbmNvbnN0IHByZXBhcmVTaW5nbGV0b249KGJhZ2dhZ2Usa2luZE5hbWUsbWV0aG9kcyxvcHRpb25zPXVuZGVmaW5lZCk9PlxucHJlcGFyZUV4byhiYWdnYWdlLGtpbmROYW1lLHVuZGVmaW5lZCxtZXRob2RzLG9wdGlvbnMpO1xuaGFyZGVuKHByZXBhcmVTaW5nbGV0b24pO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmRlZmluZVZpcnR1YWxFeG9DbGFzcyxcbmRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbmRlZmluZUR1cmFibGVFeG9DbGFzcyxcbmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG9DbGFzcyxcbnByZXBhcmVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG8sXG5wcmVwYXJlU2luZ2xldG9uLFxuXG5wcm92aWRlS2luZEhhbmRsZSxcbnByZXBhcmVLaW5kLFxucHJlcGFyZUtpbmRNdWx0aX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VFeG9VdGlscyhtYWtlRXhvVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxFeG9VdGlscz1tYWtlRXhvVXRpbHMoZ2xvYmFsVmF0RGF0YSk7XG5cbmNvbnN0ICAgICAgIHtcbmRlZmluZVZpcnR1YWxFeG9DbGFzcyxcbmRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbmRlZmluZUR1cmFibGVFeG9DbGFzcyxcbmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG9DbGFzcyxcbnByZXBhcmVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG8sXG5wcmVwYXJlU2luZ2xldG9ufT1cbmdsb2JhbEV4b1V0aWxzO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovJGjigI1fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MoZGVmaW5lVmlydHVhbEV4b0NsYXNzKTskaOKAjV9vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdChkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQoZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KTskaOKAjV9vbmNlLnByZXBhcmVFeG9DbGFzcyhwcmVwYXJlRXhvQ2xhc3MpOyRo4oCNX29uY2UucHJlcGFyZUV4b0NsYXNzS2l0KHByZXBhcmVFeG9DbGFzc0tpdCk7JGjigI1fb25jZS5wcmVwYXJlRXhvKHByZXBhcmVFeG8pOyRo4oCNX29uY2UucHJlcGFyZVNpbmdsZXRvbihwcmVwYXJlU2luZ2xldG9uKTtcbmNvbnN0ICAgICAgIHtwcm92aWRlS2luZEhhbmRsZSxwcmVwYXJlS2luZCxwcmVwYXJlS2luZE11bHRpfT1cbmdsb2JhbEV4b1V0aWxzOyRo4oCNX29uY2UucHJvdmlkZUtpbmRIYW5kbGUocHJvdmlkZUtpbmRIYW5kbGUpOyRo4oCNX29uY2UucHJlcGFyZUtpbmQocHJlcGFyZUtpbmQpOyRo4oCNX29uY2UucHJlcGFyZUtpbmRNdWx0aShwcmVwYXJlS2luZE11bHRpKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZ25vcmVDb250ZXh0IjpbImlnbm9yZUNvbnRleHQiXSwibWFrZUV4b1V0aWxzIjpbIm1ha2VFeG9VdGlscyJdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG9DbGFzcyI6WyJwcmVwYXJlRXhvQ2xhc3MiXSwicHJlcGFyZUV4b0NsYXNzS2l0IjpbInByZXBhcmVFeG9DbGFzc0tpdCJdLCJwcmVwYXJlRXhvIjpbInByZXBhcmVFeG8iXSwicHJlcGFyZVNpbmdsZXRvbiI6WyJwcmVwYXJlU2luZ2xldG9uIl0sInByb3ZpZGVLaW5kSGFuZGxlIjpbInByb3ZpZGVLaW5kSGFuZGxlIl0sInByZXBhcmVLaW5kIjpbInByZXBhcmVLaW5kIl0sInByZXBhcmVLaW5kTXVsdGkiOlsicHJlcGFyZUtpbmRNdWx0aSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAnjLSZkggAAJIIAAAkAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiLi9leG8tdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtdXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtdXSxbXCIuL2V4by11dGlscy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAYWdvcmljL3N0b3JlIjpbWyJNIiwiTSJdLFsibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyI6W1sibWFrZUtpbmRIYW5kbGUiLCJtYWtlS2luZEhhbmRsZSJdLFsicHJvdmlkZVByb21pc2VXYXRjaGVyIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sWyJ3YXRjaFByb21pc2UiLCJ3YXRjaFByb21pc2UiXSxbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSxbImNhbkJlRHVyYWJsZSIsImNhbkJlRHVyYWJsZSJdLFsicGlja0ZhY2V0IiwicGlja0ZhY2V0Il0sWyJwYXJ0aWFsQXNzaWduIiwicGFydGlhbEFzc2lnbiJdLFsicHJvdmlkZSIsInByb3ZpZGUiXSxbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdLFsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSJdLFsiZGVmaW5lS2luZCIsImRlZmluZUtpbmQiXSxbImRlZmluZUtpbmRNdWx0aSIsImRlZmluZUtpbmRNdWx0aSJdLFsiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZCJdLFsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXV0sIi4vZXhvLXV0aWxzLmpzIjpbWyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSxbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLFsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG9DbGFzcyIsInByZXBhcmVFeG9DbGFzcyJdLFsicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUV4b0NsYXNzS2l0Il0sWyJwcmVwYXJlRXhvIiwicHJlcGFyZUV4byJdLFsicHJlcGFyZVNpbmdsZXRvbiIsInByZXBhcmVTaW5nbGV0b24iXSxbImlnbm9yZUNvbnRleHQiLCJpZ25vcmVDb250ZXh0Il0sWyJwcm92aWRlS2luZEhhbmRsZSIsInByb3ZpZGVLaW5kSGFuZGxlIl0sWyJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kIl0sWyJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZUtpbmRNdWx0aSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkoZAivsoAAD7KAAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJWYXREYXRhIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmVVdGlscyIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhaWwscHJvdmlkZUxhenk7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5WYXREYXRhfSAqL1xubGV0IFZhdERhdGFHbG9iYWw7XG5pZignVmF0RGF0YSdpbiBnbG9iYWxUaGlzKXtcbmdsb2JhbFRoaXMuVmF0RGF0YXx8RmFpbCBgVmF0RGF0YSBkZWZpbmVkIGluIGdsb2JhbCBhcyBudWxsIG9yIHVuZGVmaW5lZGA7XG5WYXREYXRhR2xvYmFsPWdsb2JhbFRoaXMuVmF0RGF0YTtcbiB9ZWxzZXtcbi8qIFhYWCB0aGlzIG1vZHVsZSBoYXMgYmVlbiBrbm93biB0byBnZXQgaW1wb3J0ZWQgKHRyYW5zaXRpdmVseSkgaW4gY2FzZXMgdGhhdCovXG4vKiBuZXZlciB1c2UgaXQgc28gd2UgbWFrZSBhIHZlcnNpb24gdGhhdCB3aWxsIHNhdGlzZnkgbW9kdWxlIHJlc29sdXRpb24gYnV0Ki9cbi8qIGZhaWwgYXQgcnVudGltZS4qL1xuY29uc3QgdW52YWlsYWJsZT0oKT0+RmFpbCBgVmF0RGF0YSB1bmF2YWlsYWJsZWA7XG5WYXREYXRhR2xvYmFsPXtcbmRlZmluZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUtpbmRNdWx0aTp1bnZhaWxhYmxlLFxuZGVmaW5lRHVyYWJsZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbm1ha2VLaW5kSGFuZGxlOnVudmFpbGFibGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXI6dW52YWlsYWJsZSxcbndhdGNoUHJvbWlzZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6dW52YWlsYWJsZSxcbmNhbkJlRHVyYWJsZTp1bnZhaWxhYmxlfTtcblxuIH1cblxuY29uc3QgVmF0RGF0YUV4cG9ydD1WYXREYXRhR2xvYmFsOyRo4oCNX29uY2UuVmF0RGF0YUV4cG9ydChWYXREYXRhRXhwb3J0KTtcblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovXG5jb25zdCAgICAgICB7XG5kZWZpbmVLaW5kLFxuZGVmaW5lS2luZE11bHRpLFxuZGVmaW5lRHVyYWJsZUtpbmQsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpfT1cblZhdERhdGFHbG9iYWw7JGjigI1fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZChkZWZpbmVEdXJhYmxlS2luZCk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG5jb25zdCAgICAgICB7XG5tYWtlS2luZEhhbmRsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbndhdGNoUHJvbWlzZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuY2FuQmVEdXJhYmxlfT1cblZhdERhdGFHbG9iYWw7XG5cbi8qKlxuICogV2hlbiBtYWtpbmcgYSBtdWx0aS1mYWNldCBraW5kLCBpdCdzIGNvbW1vbiB0byBwaWNrIG9uZSBmYWNldCB0byBleHBvc2UuIEUuZy4sXG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSAoYSwgYiwgYywgZCkgPT4gbWFrZUZvb0Jhc2UoYSwgYiwgYywgZCkuc2VsZjtcbiAqXG4gKiBUaGlzIGhlbHBlciByZWR1Y2VzIHRoZSBkdXBsaWNhdGlvbjpcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IHBpY2tGYWNldChtYWtlRm9vQmFzZSwgJ3NlbGYnKTtcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5QaWNrRmFjZXR9XG4gKi8kaOKAjV9vbmNlLm1ha2VLaW5kSGFuZGxlKG1ha2VLaW5kSGFuZGxlKTskaOKAjV9vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRo4oCNX29uY2Uud2F0Y2hQcm9taXNlKHdhdGNoUHJvbWlzZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobWFrZVNjYWxhckJpZ01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnU2V0U3RvcmUobWFrZVNjYWxhckJpZ1NldFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUobWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSk7JGjigI1fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbmNvbnN0ICAgICAgICBwaWNrRmFjZXQ9XG4obWFrZXIsZmFjZXROYW1lKT0+XG4oLi4uYXJncyk9PlxubWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaOKAjV9vbmNlLnBpY2tGYWNldChwaWNrRmFjZXQpO1xuaGFyZGVuKHBpY2tGYWNldCk7XG5cbi8qKlxuICogQXNzaWduIHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZVxuICogb2JqZWN0IHRvIHRoZWlyIGtleXMgaW4gdGhlIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UGFydGlhbDxUPn0gc291cmNlXG4gKi9cbmNvbnN0ICAgICAgICBwYXJ0aWFsQXNzaWduPSh0YXJnZXQsc291cmNlKT0+e1xuT2JqZWN0LmFzc2lnbih0YXJnZXQsc291cmNlKTtcbiB9OyRo4oCNX29uY2UucGFydGlhbEFzc2lnbihwYXJ0aWFsQXNzaWduKTtcbmhhcmRlbihwYXJ0aWFsQXNzaWduKTtcblxuLyogWFhYIGNvcGllZCBmcm9tIEBhZ29yaWMvc3RvcmUgdHlwZXMqL1xuLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NTYwKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVPcHRpb25zXG4gKiBPZiB0aGUgZGltZW5zaW9ucyBvbiB3aGljaCBLZXllZFN0b3JlcyBjYW4gZGlmZmVyLCB3ZSBvbmx5IHJlcHJlc2VudCBhIGZld1xuICogb2YgdGhlbSBhcyBzdGFuZGFyZCBvcHRpb25zLiBBIGdpdmVuIHN0b3JlIG1ha2VyIHNob3VsZCBkb2N1bWVudCB3aGljaFxuICogb3B0aW9ucyBpdCBzdXBwb3J0cywgYXMgd2VsbCBhcyBpdHMgcG9zaXRpb25zIG9uIGRpbWVuc2lvbnMgZm9yIHdoaWNoIGl0XG4gKiBkb2VzIG5vdCBzdXBwb3J0IG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb25nTGl2ZWQ9dHJ1ZV0gV2hpY2ggd2F5IHRvIG9wdGltaXplIGEgd2VhayBzdG9yZS4gVHJ1ZSBtZWFuc1xuICogdGhhdCB3ZSBleHBlY3QgdGhpcyB3ZWFrIHN0b3JlIHRvIG91dGxpdmUgbW9zdCBvZiBpdHMga2V5cywgaW4gd2hpY2hcbiAqIGNhc2Ugd2UgaW50ZXJuYWxseSBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgV2Vha01hcGAuIE90aGVyd2lzZSB3ZSBpbnRlcm5hbGx5XG4gKiBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgTWFwYC5cbiAqIERlZmF1bHRzIHRvIHRydWUsIHNvIHBsZWFzZSBtYXJrIHNob3J0IGxpdmVkIHN0b3JlcyBleHBsaWNpdGx5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZHVyYWJsZT1mYWxzZV0gIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JlIHN1cnZpdmUgdGVybWluYXRpb25cbiAqICAgb2YgaXRzIGNvbnRhaW5pbmcgcHJvY2VzcywgYWxsb3dpbmcgZm9yIHJlc3RhcnQgb3IgdXBncmFkZSBidXQgYXQgdGhlIGNvc3RcbiAqICAgb2YgZm9yYmlkZGluZyBzdG9yYWdlIG9mIHJlZmVyZW5jZXMgdG8gZXBoZW1lcmFsIGRhdGEuICBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Zha2VEdXJhYmxlPWZhbHNlXSAgVGhpcyBzdG9yZSBwcmV0ZW5kcyB0byBiZSBhIGR1cmFibGUgc3RvcmVcbiAqICAgYnV0IGRvZXMgbm90IGVuZm9yY2UgdGhhdCB0aGUgdGhpbmdzIHN0b3JlZCBpbiBpdCBhY3R1YWxseSBiZSB0aGVtc2VsdmVzXG4gKiAgIGR1cmFibGUgKHdoZXJlYXMgYW4gYWN0dWFsIGR1cmFibGUgc3RvcmUgd291bGQgZm9yYmlkIHN0b3JhZ2Ugb2Ygc3VjaFxuICogICBpdGVtcykuICBUaGlzIGlzIGluIHNlcnZpY2Ugb2YgYWxsb3dpbmcgaW5jcmVtZW50YWwgdHJhbnNpdGlvbiB0byB1c2Ugb2ZcbiAqICAgZHVyYWJsZSBzdG9yZXMsIHRvIGVuYWJsZSBub3JtYWwgb3BlcmF0aW9uIGFuZCB0ZXN0aW5nIHdoZW4gc29tZSBzdHVmZlxuICogICBpbnRlbmRlZCB0byBldmVudHVhbGx5IGJlIGR1cmFibGUgaGFzIG5vdCB5ZXQgYmVlbiBtYWRlIGR1cmFibGUuICBBIHN0b3JlXG4gKiAgIG1hcmtlZCBhcyBmYWtlRHVyYWJsZSB3aWxsIGFwcGVhciB0byBvcGVyYXRlIG5vcm1hbGx5IGJ1dCBhbnkgYXR0ZW1wdCB0b1xuICogICB1cGdyYWRlIGl0cyBjb250YWluaW5nIHZhdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5QYXR0ZXJufSBba2V5U2hhcGVdXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuUGF0dGVybn0gW3ZhbHVlU2hhcGVdXG4gKi9cbi8qKlxuICogVW5saWtlIGBwcm92aWRlTGF6eWAsIGBwcm92aWRlYCBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZVxuICogd2l0aGluIGFueSB2YXQgaW5jYXJuYXRpb24gd2l0aCBhIGdpdmVuIGBiYWdnYWdlYCxga2V5YCBwYWlyLlxuICpcbiAqIGBwcm92aWRlYCBzaG91bGQgb25seSB0byBiZSB1c2VkIHRvIHBvcHVsYXRlIGJhZ2dhZ2UsXG4gKiB3aGVyZSB0aGUgdG90YWwgbnVtYmVyIG9mIGNhbGxzIHRvIGBwcm92aWRlYCBtdXN0IGJlXG4gKiBsb3cgY2FyZGluYWxpdHksIHNpbmNlIHdlIGtlZXAgdGhlIGJvb2trZWVwaW5nIHRvIGRldGVjdCBjb2xsaXNpb25zXG4gKiBpbiBub3JtYWwgbGFuZ3VhZ2UtaGVhcCBtZW1vcnkuIEFsbCB0aGUgb3RoZXIgYmFnZ2FnZS1vcmllbnRlZFxuICogYHByb3ZpZGUqYCBhbmQgYHByZXBhcmUqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsXG4gKiBhbmQgc28gaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aFxuICogb3VyIGV4cGVjdGVkIGR1cmFiaWxpdHkgcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqICAgICoga2luZEhhbmRsZXMsIHdoaWNoIGFyZSBwZXIga2luZCwgd2hpY2ggbXVzdCBiZSBsb3cgY2FyZGluYWxpdHlcbiAqICAgICogZGF0YSBcInZhcmlhYmxlc1wiIGZvciByZWVzdGFibGlzaGluZyB0aGUgbGV4aWNhbCBzY29wZSwgZXNwZWNpYWxseVxuICogICAgICBvZiBzaW5nbGV0b25zXG4gKiAgICAqIG5hbWVkIG5vbi1iYWdnYWdlIGNvbGxlY3Rpb25zIGF0IHRoZSBsZWF2ZXMgb2YgdGhlIGJhZ2dhZ2UgdHJlZS5cbiAqXG4gKiBXaGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhpZ2ggY2FyZGluYWxpdHkgYXJlIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGtpbmRzLFxuICogYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBub24tYmFnZ2dhZ2UgY29sbGVjdGlvbnMuXG4gKlxuICogVE9ETyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81ODc1IDpcbiAqIEltcGxlbWVudCBkZXZlbG9wbWVudC10aW1lIGluc3RydW1lbnRhdGlvbiB0byBkZXRlY3Qgd2hlblxuICogYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZSBwcmVzY3JpcHRpb24sIGFuZCBpcyBjYWxsZWQgbW9yZVxuICogdGhhbiBvbmNlIGluIHRoZSBzYW1lIHZhdCBpbmNhcm5hdGlvbiB3aXRoIHRoZSBzYW1lXG4gKiBiYWdnYWdlLGtleSBwYWlyLlxuICovXG5cbmNvbnN0ICAgICAgICBwcm92aWRlPVxuLyogWFhYIGNhc3QgYmVjYXVzZSBwcm92aWRlTGF6eSBpcyBgYW55YCBkdWUgdG8gYnJva2VuIHR5cGUgaW1wb3J0Ki9cbi8qKiBAdHlwZSB7PEssIFY+KGJhZ2dhZ2U6IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuQmFnZ2FnZSwga2V5OiBLLCBtYWtlVmFsdWU6IChrZXk6IEspID0+IFYpID0+IFZ9ICovXG5wcm92aWRlTGF6eTtcblxuXG4vKiBUT0RPOiBGaW5kIGEgZ29vZCBob21lIGZvciB0aGlzIGZ1bmN0aW9uIHVzZWQgYnkgQGFnb3JpYy92YXQtZGF0YSBhbmQgdGVzdGluZyBjb2RlKi9cbi8qKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuVmF0RGF0YX0gVmF0RGF0YSAqLyRo4oCNX29uY2UucHJvdmlkZShwcm92aWRlKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVVdGlscz0oVmF0RGF0YSk9PntcbmNvbnN0e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbm1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlfT1cblZhdERhdGE7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpO1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPbWl0PFN0b3JlT3B0aW9ucywgJ2R1cmFibGUnPn0gb3B0aW9uc1xuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZVNldFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1NldFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcblxucmV0dXJuIGhhcmRlbih7XG5wcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVNldFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmV9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU3RvcmVVdGlscyhtYWtlU3RvcmVVdGlscyk7XG5cbmNvbnN0IGdsb2JhbFN0b3JlVXRpbHM9bWFrZVN0b3JlVXRpbHMoVmF0RGF0YUdsb2JhbCk7XG5jb25zdCAgICAgICB7XG5wcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVNldFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmV9PVxuZ2xvYmFsU3RvcmVVdGlsczskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlZhdERhdGEiOlsiVmF0RGF0YUV4cG9ydCJdLCJkZWZpbmVLaW5kIjpbImRlZmluZUtpbmQiXSwiZGVmaW5lS2luZE11bHRpIjpbImRlZmluZUtpbmRNdWx0aSJdLCJkZWZpbmVEdXJhYmxlS2luZCI6WyJkZWZpbmVEdXJhYmxlS2luZCJdLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIjpbImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXSwibWFrZUtpbmRIYW5kbGUiOlsibWFrZUtpbmRIYW5kbGUiXSwicHJvdmlkZVByb21pc2VXYXRjaGVyIjpbInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJ3YXRjaFByb21pc2UiOlsid2F0Y2hQcm9taXNlIl0sIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIl0sImNhbkJlRHVyYWJsZSI6WyJjYW5CZUR1cmFibGUiXSwicGlja0ZhY2V0IjpbInBpY2tGYWNldCJdLCJwYXJ0aWFsQXNzaWduIjpbInBhcnRpYWxBc3NpZ24iXSwicHJvdmlkZSI6WyJwcm92aWRlIl0sIm1ha2VTdG9yZVV0aWxzIjpbIm1ha2VTdG9yZVV0aWxzIl0sInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbKkMVcADAADAAwAAHwAAAEBhZ29yaWMvem9lLXYwLjI2LjIvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qcyIsIi4vc3JjL3pvZVNlcnZpY2UvdHlwZXMuanMiLCIuL3NyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanMiLCIuL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiLCIuL3NyYy90eXBlcy5qcyIsIi4vdG9vbHMvdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanMiLCJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy9zd2luZ3NldC12YXQvZXhwb3J0ZWQuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvem9lU2VydmljZS90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3Rvb2xzL3R5cGVzLWFtYmllbnQuanNcIiwgW11dLFtcIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvZXJ0cC9leHBvcnRlZC5qc1wiLCBbXV0sW1wiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qc1wiLCBbXV0sW1wiQGFnb3JpYy9zd2luZ3NldC12YXQvZXhwb3J0ZWQuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOUkMtlAHAAAQBwAACgAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jbGVhblByb3Bvc2FsLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9lcnRwIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCIuL3R5cGVHdWFyZHMuanMiLCIuL29iakFycmF5Q29udmVyc2lvbi5qcyIsIi4vaW50ZXJuYWwtdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJNQVhfS0VZV09SRF9MRU5HVEgiLCJhc3NlcnRLZXl3b3JkTmFtZSIsImNsZWFuS2V5d29yZHMiLCJjbGVhblByb3Bvc2FsIiwiY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCIsImNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxxLEZhaWwsQW1vdW50TWF0aCxnZXRBc3NldEtpbmQsYXNzZXJ0UmVjb3JkLGFzc2VydEtleSxhc3NlcnRQYXR0ZXJuLG11c3RNYXRjaCxpc0tleSxGdWxsUHJvcG9zYWxTaGFwZSxhcnJheVRvT2JqOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dLFtcImdldEFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoZ2V0QXNzZXRLaW5kID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiaXNLZXlcIiwgWyRo4oCNX2EgPT4gKGlzS2V5ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRnVsbFByb3Bvc2FsU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEZ1bGxQcm9wb3NhbFNoYXBlID0gJGjigI1fYSldXV1dLFtcIi4vb2JqQXJyYXlDb252ZXJzaW9uLmpzXCIsIFtbXCJhcnJheVRvT2JqXCIsIFskaOKAjV9hID0+IChhcnJheVRvT2JqID0gJGjigI1fYSldXV1dLFtcIi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuY29uc3QgICAgICAgIE1BWF9LRVlXT1JEX0xFTkdUSD0xMDA7JGjigI1fb25jZS5NQVhfS0VZV09SRF9MRU5HVEgoTUFYX0tFWVdPUkRfTEVOR1RIKTtcblxuY29uc3QgZmlyc3RDYXBBU0NJST0vXltBLVpdW2EtekEtWjAtOV8kXSokLztcblxuLyogV2UgYWRvcHQgc2ltcGxlIHJlcXVpcmVtZW50cyBvbiBrZXl3b3JkcyBzbyB0aGF0IHRoZXkgZG8gbm90IGFjY2lkZW50YWxseSovXG4vKiBjb25mbGljdCB3aXRoIGV4aXN0aW5nIHByb3BlcnR5IG5hbWVzLiovXG4vKiBXZSByZXF1aXJlIGtleXdvcmRzIHRvIGJlIHN0cmluZ3MsIGFzY2lpIGlkZW50aWZpZXJzIGJlZ2lubmluZyB3aXRoIGFuKi9cbi8qIHVwcGVyIGNhc2UgbGV0dGVyLCBhbmQgZGlzdGluY3QgZnJvbSB0aGUgc3RyaW5naWZpZWQgZm9ybSBvZiBhbnkgbnVtYmVyLiovXG4vKiovXG4vKiBPZiBudW1iZXJzLCBvbmx5IE5hTiBhbmQgSW5maW5pdHksIHdoZW4gc3RyaW5naWZpZWQgdG8gYSBwcm9wZXJ0eSBuYW1lLCovXG4vKiBwcm9kdWNlIGFuIGFzY2lpIGlkZW50aWZpZXIgYmVnaW5uaW5nIHdpdGggYW4gdXBwZXIgY2FzZSBsZXR0ZXIuKi9cbi8qIFdpdGggdGhpcyBydWxlLCBhIGNvbXB1dGVkIGluZGV4aW5nIGV4cHJlc3Npb24gbGlrZSBgYVsraV1gIGNhbm5vdCovXG4vKiBsb29rdXAgYSBrZXl3b3JkLW5hbWVkIHByb3BlcnR5IG5vIG1hdHRlciB3aGF0IGBpYCBpcy4qL1xuY29uc3QgICAgICAgIGFzc2VydEtleXdvcmROYW1lPShrZXl3b3JkKT0+e1xuYXNzZXJ0LnR5cGVvZihrZXl3b3JkLCdzdHJpbmcnKTtcbmtleXdvcmQubGVuZ3RoPD1NQVhfS0VZV09SRF9MRU5HVEh8fFxuRmFpbCBga2V5d29yZCAke3Eoa2V5d29yZCl9IGV4Y2VlZGVkIG1heGltdW0gbGVuZ3RoICR7cShcbk1BWF9LRVlXT1JEX0xFTkdUSClcbiB9IGNoYXJhY3RlcnM7IGdvdCAke2tleXdvcmQubGVuZ3RofWA7XG5maXJzdENhcEFTQ0lJLnRlc3Qoa2V5d29yZCl8fFxuRmFpbCBga2V5d29yZCAke3EoXG5rZXl3b3JkKVxuIH0gbXVzdCBiZSBhbiBhc2NpaSBpZGVudGlmaWVyIHN0YXJ0aW5nIHdpdGggdXBwZXIgY2FzZS5gO1xua2V5d29yZCE9PSdOYU4nJiZrZXl3b3JkIT09J0luZmluaXR5J3x8XG5GYWlsIGBrZXl3b3JkICR7cShrZXl3b3JkKX0gbXVzdCBub3QgYmUgYSBudW1iZXIncyBuYW1lYDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7e1tuYW1lOiBzdHJpbmddOiBhbnl9fSB1bmNsZWFuS2V5d29yZFJlY29yZFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovJGjigI1fb25jZS5hc3NlcnRLZXl3b3JkTmFtZShhc3NlcnRLZXl3b3JkTmFtZSk7XG5jb25zdCAgICAgICAgY2xlYW5LZXl3b3Jkcz0odW5jbGVhbktleXdvcmRSZWNvcmQpPT57XG5oYXJkZW4odW5jbGVhbktleXdvcmRSZWNvcmQpO1xuYXNzZXJ0UmVjb3JkKHVuY2xlYW5LZXl3b3JkUmVjb3JkLCdrZXl3b3JkUmVjb3JkJyk7XG5jb25zdCBrZXl3b3Jkcz1vd25LZXlzKHVuY2xlYW5LZXl3b3JkUmVjb3JkKTtcblxuLyogQXNzZXJ0IGFsbCBuYW1lcyBhcmUgYXNjaWkgaWRlbnRpZmllcnMgc3RhcnRpbmcgd2l0aCovXG4vKiBhbiB1cHBlciBjYXNlIGxldHRlci4qL1xua2V5d29yZHMuZm9yRWFjaChhc3NlcnRLZXl3b3JkTmFtZSk7XG5cbnJldHVybiAoLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9rZXl3b3Jkcyk7XG4gfTskaOKAjV9vbmNlLmNsZWFuS2V5d29yZHMoY2xlYW5LZXl3b3Jkcyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZD0oXG5hbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCxcbmdldEFzc2V0S2luZEJ5QnJhbmQpPT5cbntcbmNvbnN0IGtleXdvcmRzPWNsZWFuS2V5d29yZHMoYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQpO1xuXG5jb25zdCBhbW91bnRzPU9iamVjdC52YWx1ZXMoYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQpO1xuLyogQ2hlY2sgdGhhdCBlYWNoIHZhbHVlIGNhbiBiZSBjb2VyY2VkIHVzaW5nIHRoZSBBbW91bnRNYXRoKi9cbi8qIGluZGljYXRlZCBieSBicmFuZC4gYEFtb3VudE1hdGguY29lcmNlYCB0aHJvd3MgaWYgY29lcmNpb24gZmFpbHMuKi9cbmNvbnN0IGNvZXJjZWRBbW91bnRzPWFtb3VudHMubWFwKChhbW91bnQpPT57XG5pZihpc0tleShhbW91bnQpKXtcbmNvbnN0IGJyYW5kQXNzZXRLaW5kPWdldEFzc2V0S2luZEJ5QnJhbmQoYW1vdW50LmJyYW5kKTtcbmNvbnN0IGFzc2V0S2luZD1nZXRBc3NldEtpbmQoYW1vdW50KTtcbi8qIFRPRE86IHJlcGxhY2UgdGhpcyBhc3NlcnRpb24gd2l0aCBhIGNoZWNrIG9mIHRoZSBhc3NldEtpbmQqL1xuLyogcHJvcGVydHkgb24gdGhlIGJyYW5kLCB3aGVuIHRoYXQgZXhpc3RzLiovXG5hc3NldEtpbmQ9PT1icmFuZEFzc2V0S2luZHx8XG5GYWlsIGBUaGUgYW1vdW50ICR7YW1vdW50fSBkaWQgbm90IGhhdmUgdGhlIGFzc2V0S2luZCBvZiB0aGUgYnJhbmQgJHticmFuZEFzc2V0S2luZH1gO1xucmV0dXJuIEFtb3VudE1hdGguY29lcmNlKGFtb3VudC5icmFuZCxhbW91bnQpO1xuIH1lbHNle1xuYXNzZXJ0UGF0dGVybihhbW91bnQpO1xucmV0dXJuIGFtb3VudDtcbiB9XG4gfSk7XG5cbi8qIFJlY3JlYXRlIHRoZSBhbW91bnRLZXl3b3JkUmVjb3JkIHdpdGggY29lcmNlZEFtb3VudHMuKi9cbnJldHVybiBoYXJkZW4oYXJyYXlUb09iaihjb2VyY2VkQW1vdW50cyxrZXl3b3JkcykpO1xuIH07JGjigI1fb25jZS5jb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZChjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkPShcbmFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkLFxuZ2V0QXNzZXRLaW5kQnlCcmFuZCk9Plxue1xuY29uc3QgcmVzdWx0PWNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkKFxuYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG5nZXRBc3NldEtpbmRCeUJyYW5kKTtcblxuYXNzZXJ0S2V5KHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogSnVzdCBjaGVja3MgcmVzaWR1YWwgaXNzdWVzIGFmdGVyIG1hdGNoaW5nIFByb3Bvc2FsU2hhcGUuXG4gKiBPbmx5IGtub3duIHJlc2lkdWFsIGlzc3VlIGlzIHZlcmlmeWluZyB0aGF0IGl0IG9ubHkgaGFzIG9uZSBvZiB0aGVcbiAqIG9wdGlvbmFsIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICovJGjigI1fb25jZS5jb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKGNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQpO1xuY29uc3QgYXNzZXJ0RXhpdD0oZXhpdCk9Plxub3duS2V5cyhleGl0KS5sZW5ndGg9PT0xfHxGYWlsIGBleGl0ICR7ZXhpdH0gc2hvdWxkIG9ubHkgaGF2ZSBvbmUga2V5YDtcblxuLyoqXG4gKiBjaGVjayB0aGF0IGtleXdvcmQgaXMgbm90IGluIGJvdGggJ3dhbnQnIGFuZCAnZ2l2ZScuXG4gKlxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZFtcIndhbnRcIl19IHdhbnRcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmRbXCJnaXZlXCJdfSBnaXZlXG4gKi9cbmNvbnN0IGFzc2VydEtleXdvcmROb3RJbkJvdGg9KHdhbnQsZ2l2ZSk9PntcbmNvbnN0IHdhbnRLZXl3b3JkU2V0PW5ldyBTZXQob3duS2V5cyh3YW50KSk7XG5jb25zdCBnaXZlS2V5d29yZHM9b3duS2V5cyhnaXZlKTtcblxuZm9yKGNvbnN0IGtleXdvcmQgb2YgZ2l2ZUtleXdvcmRzKXtcbiF3YW50S2V5d29yZFNldC5oYXMoa2V5d29yZCl8fFxuRmFpbCBgYSBrZXl3b3JkIGNhbm5vdCBiZSBpbiBib3RoICd3YW50JyBhbmQgJ2dpdmUnYDtcbiB9XG4gfTtcblxuLyoqXG4gKiBjbGVhblByb3Bvc2FsIGNoZWNrcyB0aGUga2V5cyBhbmQgdmFsdWVzIG9mIHRoZSBwcm9wb3NhbCwgaW5jbHVkaW5nXG4gKiB0aGUga2V5cyBhbmQgdmFsdWVzIG9mIHRoZSBpbnRlcm5hbCBvYmplY3RzLiBUaGUgcHJvcG9zYWwgbWF5IGhhdmVcbiAqIHRoZSBmb2xsb3dpbmcga2V5czogYGdpdmVgLCBgd2FudGAsIGFuZCBgZXhpdGAuIFRoZXNlIGtleXMgbWF5IGJlXG4gKiBvbWl0dGVkIGluIHRoZSBgcHJvcG9zYWxgIGFyZ3VtZW50IHBhc3NlZCB0byBjbGVhblByb3Bvc2FsLCBidXRcbiAqIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlc2Uga2V5cyBpcyBub3QgYWxsb3dlZC4gVGhlIHZhbHVlcyBvZiBgZ2l2ZWBcbiAqIGFuZCBgd2FudGAgbXVzdCBiZSBcImFtb3VudEtleXdvcmRSZWNvcmRzXCIsIG1lYW5pbmcgdGhhdCB0aGUga2V5c1xuICogbXVzdCBiZSBrZXl3b3JkcyBhbmQgdGhlIHZhbHVlcyBtdXN0IGJlIGFtb3VudHMuIFRoZSB2YWx1ZSBvZlxuICogYGV4aXRgLCBpZiBwcmVzZW50LCBtdXN0IGJlIGEgcmVjb3JkIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOlxuICogYHsgd2FpdmVkOiBudWxsIH1gIGB7IG9uRGVtYW5kOiBudWxsIH1gIGB7IGFmdGVyRGVhZGxpbmU6IHsgdGltZXJcbiAqIDpUaW1lciwgZGVhZGxpbmUgOmJpZ2ludCB9IH1cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsfSBwcm9wb3NhbFxuICogQHBhcmFtIHtHZXRBc3NldEtpbmRCeUJyYW5kfSBnZXRBc3NldEtpbmRCeUJyYW5kXG4gKiBAcmV0dXJucyB7UHJvcG9zYWxSZWNvcmR9XG4gKi9cbmNvbnN0ICAgICAgICBjbGVhblByb3Bvc2FsPShwcm9wb3NhbCxnZXRBc3NldEtpbmRCeUJyYW5kKT0+e1xuYXNzZXJ0UmVjb3JkKHByb3Bvc2FsLCdwcm9wb3NhbCcpO1xuLyogV2UgZmlsbCBpbiB0aGUgZGVmYXVsdCB2YWx1ZXMgaWYgdGhlIGtleXMgYXJlIGFic2VudCBvciB1bmRlZmluZWQuKi9cbmNvbnN0e1xud2FudD1oYXJkZW4oe30pLFxuZ2l2ZT1oYXJkZW4oe30pLFxuZXhpdD1oYXJkZW4oe29uRGVtYW5kOm51bGx9KSxcbi4uLnJlc3R9PVxucHJvcG9zYWw7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgJHtwcm9wb3NhbH0gLSBNdXN0IG9ubHkgaGF2ZSB3YW50OiwgZ2l2ZTosIGV4aXQ6IHByb3BlcnRpZXM6ICR7cmVzdH1gO1xuXG5jb25zdCBjbGVhbmVkV2FudD1jb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZChcbndhbnQsXG5nZXRBc3NldEtpbmRCeUJyYW5kKTtcblxuY29uc3QgY2xlYW5lZEdpdmU9Y29lcmNlQW1vdW50S2V5d29yZFJlY29yZChnaXZlLGdldEFzc2V0S2luZEJ5QnJhbmQpO1xuXG5jb25zdCBjbGVhbmVkUHJvcG9zYWw9aGFyZGVuKHtcbndhbnQ6Y2xlYW5lZFdhbnQsXG5naXZlOmNsZWFuZWRHaXZlLFxuZXhpdH0pO1xuXG5tdXN0TWF0Y2goY2xlYW5lZFByb3Bvc2FsLEZ1bGxQcm9wb3NhbFNoYXBlLCdwcm9wb3NhbCcpO1xuYXNzZXJ0RXhpdChleGl0KTtcbmFzc2VydEtleXdvcmROb3RJbkJvdGgoY2xlYW5lZFdhbnQsY2xlYW5lZEdpdmUpO1xucmV0dXJuIGNsZWFuZWRQcm9wb3NhbDtcbiB9OyRo4oCNX29uY2UuY2xlYW5Qcm9wb3NhbChjbGVhblByb3Bvc2FsKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJNQVhfS0VZV09SRF9MRU5HVEgiOlsiTUFYX0tFWVdPUkRfTEVOR1RIIl0sImFzc2VydEtleXdvcmROYW1lIjpbImFzc2VydEtleXdvcmROYW1lIl0sImNsZWFuS2V5d29yZHMiOlsiY2xlYW5LZXl3b3JkcyJdLCJjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCI6WyJjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCJdLCJjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkIjpbImNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQiXSwiY2xlYW5Qcm9wb3NhbCI6WyJjbGVhblByb3Bvc2FsIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJqoOUK8EAAAvBAAADQAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCJdLCJleHBvcnRzIjpbImlzT2ZmZXJTYWZlIiwic2F0aXNmaWVzV2FudCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRNYXRoOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc09mZmVyU2FmZSwgJ25hbWUnLCB7dmFsdWU6IFwiaXNPZmZlclNhZmVcIn0pOyRo4oCNX29uY2UuaXNPZmZlclNhZmUoaXNPZmZlclNhZmUpOyAgIFxuXG4vKipcbiAqIEhlbHBlciB0byBwZXJmb3JtIHNhdGlzZmllc1dhbnQgYW5kIHNhdGlzZmllc0dpdmUuIElzXG4gKiBhbGxvY2F0aW9uQW1vdW50IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byByZXF1aXJlZEFtb3VudCBmb3IgZXZlcnlcbiAqIGtleXdvcmQgb2YgZ2l2ZU9yV2FudD9cbiAqXG4gKiBUbyBwcmVwYXJlIGZvciBtdWx0aXBsZXMsIHNhdGlzZmllc1dhbnQgYW5kIHNhdGlzZmllc0dpdmUgcmV0dXJuIDAgb3IgMS5cbiAqIGlzT2ZmZXJTYWZlIHdpbGwgc3RpbGwgYmUgYm9vbGVhbi4gV2hlbiB3ZSBoYXZlIE11bHRpcGxlcywgc2F0aXNmaWVzV2FudCBhbmRcbiAqIHNhdGlzZmllc0dpdmUgd2lsbCB0ZWxsIGhvdyBtYW55IHRpbWVzIHRoZSBvZmZlciB3YXMgbWF0Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGdpdmVPcldhbnRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvblxuICogQHJldHVybnMgezB8MX1cbiAqL1xuY29uc3Qgc2F0aXNmaWVzSW50ZXJuYWw9KGdpdmVPcldhbnQ9e30sYWxsb2NhdGlvbik9PntcbmNvbnN0IGlzR1RFQnlLZXl3b3JkPShba2V5d29yZCxyZXF1aXJlZEFtb3VudF0pPT57XG4vKiBJZiB0aGVyZSBpcyBubyBhbGxvY2F0aW9uIGZvciBhIGtleXdvcmQsIHdlIGtub3cgdGhlIGdpdmVPcldhbnQqL1xuLyogaXMgbm90IHNhdGlzZmllZCB3aXRob3V0IGNoZWNraW5nIGZ1cnRoZXIuKi9cbmlmKGFsbG9jYXRpb25ba2V5d29yZF09PT11bmRlZmluZWQpe1xucmV0dXJuIDA7XG4gfVxuY29uc3QgYWxsb2NhdGlvbkFtb3VudD1hbGxvY2F0aW9uW2tleXdvcmRdO1xucmV0dXJuIEFtb3VudE1hdGguaXNHVEUoYWxsb2NhdGlvbkFtb3VudCxyZXF1aXJlZEFtb3VudCk/MTowO1xuIH07XG5yZXR1cm4gT2JqZWN0LmVudHJpZXMoZ2l2ZU9yV2FudCkuZXZlcnkoaXNHVEVCeUtleXdvcmQpPzE6MDtcbiB9O1xuXG4vKipcbiAqIEZvciB0aGlzIGFsbG9jYXRpb24gdG8gc2F0aXNmeSB3aGF0IHRoZSB1c2VyIHdhbnRlZCwgdGhlaXJcbiAqIGFsbG9jYXRlZCBhbW91bnRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHByb3Bvc2FsLndhbnQuXG4gKlxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWwgLSB0aGUgcnVsZXMgdGhhdCBhY2NvbXBhbmllZCB0aGVcbiAqIGVzY3JvdyBvZiBwYXltZW50cyB0aGF0IGRpY3RhdGUgd2hhdCB0aGUgdXNlciBleHBlY3RlZCB0byBnZXQgYmFja1xuICogZnJvbSBab2UuIEEgcHJvcG9zYWwgaXMgYSByZWNvcmQgd2l0aCBrZXlzIGBnaXZlYCwgYHdhbnRgLCBhbmRcbiAqIGBleGl0YC4gYGdpdmVgIGFuZCBgd2FudGAgYXJlIHJlY29yZHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZFxuICogYW1vdW50cyBhcyB2YWx1ZXMuIFRoZSBwcm9wb3NhbCBpcyBhIHVzZXIncyB1bmRlcnN0YW5kaW5nIG9mIHRoZVxuICogY29udHJhY3QgdGhhdCB0aGV5IGFyZSBlbnRlcmluZyB3aGVuIHRoZXkgbWFrZSBhbiBvZmZlci5cbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvbiAtIGEgcmVjb3JkIHdpdGgga2V5d29yZHNcbiAqIGFzIGtleXMgYW5kIGFtb3VudHMgYXMgdmFsdWVzLiBUaGVzZSBhbW91bnRzIGFyZSB0aGUgcmVhbGxvY2F0aW9uXG4gKiB0byBiZSBnaXZlbiB0byBhIHVzZXIuXG4gKi9cbmNvbnN0IHNhdGlzZmllc1dhbnQ9KHByb3Bvc2FsLGFsbG9jYXRpb24pPT5cbnNhdGlzZmllc0ludGVybmFsKHByb3Bvc2FsLndhbnQsYWxsb2NhdGlvbik7XG5cbi8qKlxuICogRm9yIHRoaXMgYWxsb2NhdGlvbiB0byBjb3VudCBhcyBhIGZ1bGwgcmVmdW5kLCB0aGUgYWxsb2NhdGVkXG4gKiBhbW91bnRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHdoYXQgd2FzIG9yaWdpbmFsbHlcbiAqIG9mZmVyZWQgKHByb3Bvc2FsLmdpdmUpLlxuICpcbiAqIEBwYXJhbSAge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbCAtIHRoZSBydWxlcyB0aGF0IGFjY29tcGFuaWVkIHRoZVxuICogZXNjcm93IG9mIHBheW1lbnRzIHRoYXQgZGljdGF0ZSB3aGF0IHRoZSB1c2VyIGV4cGVjdGVkIHRvIGdldCBiYWNrXG4gKiBmcm9tIFpvZS4gQSBwcm9wb3NhbCBpcyBhIHJlY29yZCB3aXRoIGtleXMgYGdpdmVgLCBgd2FudGAsIGFuZFxuICogYGV4aXRgLiBgZ2l2ZWAgYW5kIGB3YW50YCBhcmUgcmVjb3JkcyB3aXRoIGtleXdvcmRzIGFzIGtleXMgYW5kXG4gKiBhbW91bnRzIGFzIHZhbHVlcy4gVGhlIHByb3Bvc2FsIGlzIGEgdXNlcidzIHVuZGVyc3RhbmRpbmcgb2YgdGhlXG4gKiBjb250cmFjdCB0aGF0IHRoZXkgYXJlIGVudGVyaW5nIHdoZW4gdGhleSBtYWtlIGFuIG9mZmVyLlxuICogQHBhcmFtICB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvbiAtIGEgcmVjb3JkIHdpdGgga2V5d29yZHNcbiAqIGFzIGtleXMgYW5kIGFtb3VudHMgYXMgdmFsdWVzLiBUaGVzZSBhbW91bnRzIGFyZSB0aGUgcmVhbGxvY2F0aW9uXG4gKiB0byBiZSBnaXZlbiB0byBhIHVzZXIuXG4gKi8kaOKAjV9vbmNlLnNhdGlzZmllc1dhbnQoc2F0aXNmaWVzV2FudCk7XG5jb25zdCBzYXRpc2ZpZXNHaXZlPShwcm9wb3NhbCxhbGxvY2F0aW9uKT0+XG5zYXRpc2ZpZXNJbnRlcm5hbChwcm9wb3NhbC5naXZlLGFsbG9jYXRpb24pO1xuXG4vKipcbiAqIGBpc09mZmVyU2FmZWAgY2hlY2tzIG9mZmVyIHNhZmV0eSBmb3IgYSBzaW5nbGUgb2ZmZXIuXG4gKlxuICogTm90ZTogVGhpcyBpbXBsZW1lbnRhdGlvbiBjaGVja3Mgd2hldGhlciB3ZSBmdWxseSBzYXRpc2Z5XG4gKiBgcHJvcG9zYWwuZ2l2ZWAgKGdpdmluZyBhIHJlZnVuZCkgb3Igd2hldGhlciB3ZSBmdWxseSBzYXRpc2Z5XG4gKiBgcHJvcG9zYWwud2FudGAuIEJvdGggY2FuIGJlIGZ1bGx5IHNhdGlzZmllZC5cbiAqXG4gKiBAcGFyYW0gIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWwgLSB0aGUgcnVsZXMgdGhhdCBhY2NvbXBhbmllZCB0aGVcbiAqIGVzY3JvdyBvZiBwYXltZW50cyB0aGF0IGRpY3RhdGUgd2hhdCB0aGUgdXNlciBleHBlY3RlZCB0byBnZXQgYmFja1xuICogZnJvbSBab2UuIEEgcHJvcG9zYWwgaXMgYSByZWNvcmQgd2l0aCBrZXlzIGBnaXZlYCwgYHdhbnRgLCBhbmRcbiAqIGBleGl0YC4gYGdpdmVgIGFuZCBgd2FudGAgYXJlIHJlY29yZHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZFxuICogYW1vdW50cyBhcyB2YWx1ZXMuIFRoZSBwcm9wb3NhbCBpcyBhIHVzZXIncyB1bmRlcnN0YW5kaW5nIG9mIHRoZVxuICogY29udHJhY3QgdGhhdCB0aGV5IGFyZSBlbnRlcmluZyB3aGVuIHRoZXkgbWFrZSBhbiBvZmZlci5cbiAqIEBwYXJhbSAge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovXG5mdW5jdGlvbiBpc09mZmVyU2FmZShwcm9wb3NhbCxhbGxvY2F0aW9uKXtcbnJldHVybihcbnNhdGlzZmllc0dpdmUocHJvcG9zYWwsYWxsb2NhdGlvbik+MHx8XG5zYXRpc2ZpZXNXYW50KHByb3Bvc2FsLGFsbG9jYXRpb24pPjApO1xuXG4gfVxuXG5oYXJkZW4oaXNPZmZlclNhZmUpO1xuaGFyZGVuKHNhdGlzZmllc1dhbnQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNhdGlzZmllc1dhbnQiOlsic2F0aXNmaWVzV2FudCJdLCJpc09mZmVyU2FmZSI6WyJpc09mZmVyU2FmZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAVAs2U+ycAAPsnAAAuAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvZXJ0cCcpLklzc3Vlck9wdGlvbnNSZWNvcmR9IElzc3Vlck9wdGlvbnNSZWNvcmQgKi9cblxuLyogWFhYIGNhbiBiZSB0aWdodGVyIHRoYW4gJ2FueScqL1xuLyoqXG4gKiBAdHlwZWRlZiB7YW55fSBDb21wbGV0aW9uXG4gKiBBbnkgcGFzc2FibGUgbm9uLXRoZW5hYmxlLiBPZnRlbiBhbiBleHBsYW5hdG9yeSBzdHJpbmcuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGTWFrZUVtcHR5U2VhdEtpdFxuICogQHBhcmFtIHtFeGl0UnVsZX0gW2V4aXRdXG4gKiBAcmV0dXJucyB7WmNmU2VhdEtpdH1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbQ1Q9UmVjb3JkPHN0cmluZywgdW5rbm93bj5dIENvbnRyYWN0J3MgY3VzdG9tIHRlcm1zXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaQ0YgWm9lIENvbnRyYWN0IEZhY2V0XG4gKlxuICogVGhlIFpvZSBpbnRlcmZhY2Ugc3BlY2lmaWMgdG8gYSBjb250cmFjdCBpbnN0YW5jZS4gVGhlIFpvZSBDb250cmFjdFxuICogRmFjZXQgaXMgYW4gQVBJIG9iamVjdCB1c2VkIGJ5IHJ1bm5pbmcgY29udHJhY3QgaW5zdGFuY2VzIHRvIGFjY2Vzc1xuICogdGhlIFpvZSBzdGF0ZSBmb3IgdGhhdCBpbnN0YW5jZS4gVGhlIFpvZSBDb250cmFjdCBGYWNldCBpcyBhY2Nlc3NlZFxuICogc3luY2hyb25vdXNseSBmcm9tIHdpdGhpbiB0aGUgY29udHJhY3QsIGFuZCB1c3VhbGx5IGlzIHJlZmVycmVkIHRvXG4gKiBpbiBjb2RlIGFzIHpjZi5cbiAqXG4gKiBAcHJvcGVydHkgeyh0cmFuc2ZlcnM6IFRyYW5zZmVyUGFydFtdKSA9PiB2b2lkfSBhdG9taWNSZWFycmFuZ2UgLSBhdG9taWNhbGx5IHJlYWxsb2NhdGUgYW1vdW50cyBhbW9uZyBzZWF0cy5cbiAqIEBwcm9wZXJ0eSB7UmVhbGxvY2F0ZX0gcmVhbGxvY2F0ZSAtIHJlYWxsb2NhdGUgYW1vdW50cyBhbW9uZyBzZWF0cy5cbiAqIERlcHJlY2F0ZWQ6IFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXdvcmQ6IEtleXdvcmQpID0+IHZvaWR9IGFzc2VydFVuaXF1ZUtleXdvcmQgLSBjaGVja1xuICogd2hldGhlciBhIGtleXdvcmQgaXMgdmFsaWQgYW5kIHVuaXF1ZSBhbmQgY291bGQgYmUgYWRkZWQgaW5cbiAqIGBzYXZlSXNzdWVyYFxuICogQHByb3BlcnR5IHtTYXZlSXNzdWVyfSBzYXZlSXNzdWVyIC0gc2F2ZSBhbiBpc3N1ZXIgdG8gWkNGIGFuZCBab2VcbiAqIGFuZCBnZXQgdGhlIEFtb3VudE1hdGggYW5kIGJyYW5kIHN5bmNocm9ub3VzbHkgYWNjZXNzaWJsZSBhZnRlclxuICogc2F2aW5nXG4gKiBAcHJvcGVydHkge01ha2VJbnZpdGF0aW9ufSBtYWtlSW52aXRhdGlvblxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogQ29tcGxldGlvbikgPT4gdm9pZH0gc2h1dGRvd25cbiAqIEBwcm9wZXJ0eSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gc2h1dGRvd25XaXRoRmFpbHVyZVxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPFpvZVNlcnZpY2U+fSBnZXRab2VTZXJ2aWNlXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcjwnc2V0Jz59IGdldEludml0YXRpb25Jc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3RhbmRhcmRUZXJtcyAmIENUfSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHs8SyBleHRlbmRzIEFzc2V0S2luZD4oaXNzdWVyOiBJc3N1ZXI8Sz4pID0+IEJyYW5kPEs+fSBnZXRCcmFuZEZvcklzc3VlclxuICogQHByb3BlcnR5IHs8SyBleHRlbmRzIEFzc2V0S2luZD4oYnJhbmQ6IEJyYW5kPEs+KSA9PiBJc3N1ZXI8Sz59IGdldElzc3VlckZvckJyYW5kXG4gKiBAcHJvcGVydHkge0dldEFzc2V0S2luZEJ5QnJhbmR9IGdldEFzc2V0S2luZFxuICogQHByb3BlcnR5IHs8SyBleHRlbmRzIEFzc2V0S2luZCA9ICduYXQnPihcbiAqICAga2V5d29yZDogS2V5d29yZCxcbiAqICAgYXNzZXRLaW5kPzogSyxcbiAqICAgZGlzcGxheUluZm8/OiBBZGRpdGlvbmFsRGlzcGxheUluZm8sXG4gKiAgIG9wdGlvbnM/OiBJc3N1ZXJPcHRpb25zUmVjb3JkXG4gKiApID0+IFByb21pc2U8WkNGTWludDxLPj59IG1ha2VaQ0ZNaW50XG4gKiBAcHJvcGVydHkge1pDRlJlZ2lzdGVyRmVlTWludH0gcmVnaXN0ZXJGZWVNaW50XG4gKiBAcHJvcGVydHkge1pDRk1ha2VFbXB0eVNlYXRLaXR9IG1ha2VFbXB0eVNlYXRLaXRcbiAqIEBwcm9wZXJ0eSB7U2V0VGVzdEppZ30gc2V0VGVzdEppZ1xuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBzdG9wQWNjZXB0aW5nT2ZmZXJzXG4gKiBAcHJvcGVydHkgeyhzdHJpbmdzOiBBcnJheTxzdHJpbmc+KSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRPZmZlckZpbHRlclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFycmF5PHN0cmluZz4+fSBnZXRPZmZlckZpbHRlclxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHJlYWxsb2NhdGUoKS4gVXNlIHpjZi5hdG9taWNSZWFycmFuZ2UoKSBpbnN0ZWFkXG4gKlxuICogQHR5cGVkZWYgeyhzZWF0MTogWkNGU2VhdCwgc2VhdDI6IFpDRlNlYXQsIC4uLnNlYXRSZXN0OlxuICogQXJyYXk8WkNGU2VhdD4pID0+IHZvaWR9IFJlYWxsb2NhdGVcbiAqXG4gKiBUaGUgY29udHJhY3QgY2FuIHJlYWxsb2NhdGUgb3ZlciBzZWF0cywgd2hpY2ggY29tbWl0cyB0aGUgc3RhZ2VkXG4gKiBhbGxvY2F0aW9uIGZvciBlYWNoIHNlYXQuIE9uIGNvbW1pdCwgdGhlIHN0YWdlZCBhbGxvY2F0aW9uIGJlY29tZXNcbiAqIHRoZSBjdXJyZW50IGFsbG9jYXRpb24gYW5kIHRoZSBzdGFnZWQgYWxsb2NhdGlvbiBpcyBkZWxldGVkLlxuICpcbiAqIFRoZSByZWFsbG9jYXRpb24gd2lsbCBvbmx5IHN1Y2NlZWQgaWYgdGhlIHJlYWxsb2NhdGlvbiAxKSBjb25zZXJ2ZXNcbiAqIHJpZ2h0cyAodGhlIGFtb3VudHMgc3BlY2lmaWVkIGhhdmUgdGhlIHNhbWUgdG90YWwgdmFsdWUgYXMgdGhlXG4gKiBjdXJyZW50IHRvdGFsIGFtb3VudCksIGFuZCAyKSBpcyAnb2ZmZXItc2FmZScgZm9yIGFsbCBwYXJ0aWVzXG4gKiBpbnZvbHZlZC4gQWxsIHNlYXRzIHRoYXQgaGF2ZSBzdGFnZWQgYWxsb2NhdGlvbnMgbXVzdCBiZSBpbmNsdWRlZFxuICogYXMgYXJndW1lbnRzIHRvIGByZWFsbG9jYXRlYCwgb3IgYW4gZXJyb3IgaXMgdGhyb3duLiBBZGRpdGlvbmFsbHksXG4gKiBhbiBlcnJvciBpcyB0aHJvd24gaWYgYW55IHNlYXRzIGluY2x1ZGVkIGluIGByZWFsbG9jYXRlYCBkbyBub3RcbiAqIGhhdmUgYSBzdGFnZWQgYWxsb2NhdGlvbi5cbiAqXG4gKiBUaGUgcmVhbGxvY2F0aW9uIGlzIHBhcnRpYWwsIG1lYW5pbmcgdGhhdCBpdCBhcHBsaWVzIG9ubHkgdG8gdGhlXG4gKiBzZWF0cyBwYXNzZWQgaW4gYXMgYXJndW1lbnRzLiBCeSBpbmR1Y3Rpb24sIGlmIHJpZ2h0cyBjb25zZXJ2YXRpb25cbiAqIGFuZCBvZmZlciBzYWZldHkgaG9sZCBiZWZvcmUsIHRoZXkgd2lsbCBob2xkIGFmdGVyIGEgc2FmZVxuICogcmVhbGxvY2F0aW9uLCBldmVuIHRob3VnaCB3ZSBvbmx5IHJlLXZhbGlkYXRlIGZvciB0aGUgc2VhdHMgd2hvc2VcbiAqIGFsbG9jYXRpb25zIHdpbGwgY2hhbmdlLiBTaW5jZSByaWdodHMgYXJlIGNvbnNlcnZlZCBmb3IgdGhlIGNoYW5nZSxcbiAqIG92ZXJhbGwgcmlnaHRzIHdpbGwgYmUgdW5jaGFuZ2VkLCBhbmQgYSByZWFsbG9jYXRpb24gY2FuIG9ubHlcbiAqIGVmZmVjdCBvZmZlciBzYWZldHkgZm9yIHNlYXRzIHdob3NlIGFsbG9jYXRpb25zIGNoYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbXG4gKiAgIGZyb21TZWF0PzogWkNGU2VhdCxcbiAqICAgdG9TZWF0PzogWkNGU2VhdCxcbiAqICAgZnJvbUFtb3VudHM/OiBBbW91bnRLZXl3b3JkUmVjb3JkLFxuICogICB0b0Ftb3VudHM/OiBBbW91bnRLZXl3b3JkUmVjb3JkXG4gKiBdfSBUcmFuc2ZlclBhcnRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTYXZlSXNzdWVyXG4gKlxuICogSW5mb3JtcyBab2UgYWJvdXQgYW4gaXNzdWVyIGFuZCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYWNrbm93bGVkZ2luZ1xuICogd2hlbiB0aGUgaXNzdWVyIGlzIGFkZGVkIGFuZCByZWFkeS5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8SXNzdWVyPn0gaXNzdWVyUCBQcm9taXNlIGZvciBpc3N1ZXJcbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZCBLZXl3b3JkIGZvciBhZGRlZCBpc3N1ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPElzc3VlclJlY29yZDwqPj59IElzc3VlciBpcyBhZGRlZCBhbmQgcmVhZHlcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8UmVzdWx0PihcbiAqICAgb2ZmZXJIYW5kbGVyOiBPZmZlckhhbmRsZXI8UmVzdWx0PixcbiAqICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAqICAgY3VzdG9tRGV0YWlscz86IG9iamVjdCxcbiAqICAgcHJvcG9zYWxTaGFwZT86IFBhdHRlcm4sXG4gKiApID0+IFByb21pc2U8SW52aXRhdGlvbjxBd2FpdGVkPFJlc3VsdD4+PlxuICogfSBNYWtlSW52aXRhdGlvblxuICpcbiAqIE1ha2UgYSBjcmVkaWJsZSBab2UgaW52aXRhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIHNtYXJ0IGNvbnRyYWN0XG4gKiBpbmRpY2F0ZWQgYnkgdGhlIGBpbnN0YW5jZWAgaW4gdGhlIGRldGFpbHMgb2YgdGhlIGludml0YXRpb24uIFpvZVxuICogYWxzbyBwdXRzIHRoZSBgaW5zdGFsbGF0aW9uYCBhbmQgYSB1bmlxdWUgYGhhbmRsZWAgaW4gdGhlIGRldGFpbHNcbiAqIG9mIHRoZSBpbnZpdGF0aW9uLiBUaGUgY29udHJhY3QgbXVzdCBwcm92aWRlIGEgYGRlc2NyaXB0aW9uYCBmb3JcbiAqIHRoZSBpbnZpdGF0aW9uIGFuZCBzaG91bGQgaW5jbHVkZSB3aGF0ZXZlciBpbmZvcm1hdGlvbiBpcyBuZWNlc3NhcnlcbiAqIGZvciBhIHBvdGVudGlhbCBidXllciBvZiB0aGUgaW52aXRhdGlvbiB0byBrbm93IHdoYXQgdGhleSBhcmVcbiAqIGdldHRpbmcgaW4gdGhlIGBjdXN0b21EZXRhaWxzYC4gYGN1c3RvbURldGFpbHNgIHdpbGwgYmVcbiAqIHBsYWNlZCBpbiB0aGUgZGV0YWlscyBvZiB0aGUgaW52aXRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBaQ0ZSZWdpc3RlckZlZU1pbnRcbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZFxuICogQHBhcmFtIHtGZWVNaW50QWNjZXNzfSBhbGxlZ2VkRmVlTWludEFjY2VzcyAtIGFuIG9iamVjdCB0aGF0XG4gKiBwdXJwb3J0cyB0byBiZSB0aGUgb2JqZWN0IHRoYXQgZ3JhbnRzIGFjY2VzcyB0byB0aGUgZmVlIG1pbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPFpDRk1pbnQ8J25hdCc+Pn1cbiAqL1xuXG4vKipcbiAqIFByb3ZpZGUgYSBqaWcgb2JqZWN0IGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG4gKlxuICogVGhlIGNvbnRyYWN0IGNvZGUgcHJvdmlkZXMgYSBjYWxsYmFjayB3aG9zZSByZXR1cm4gcmVzdWx0IHdpbGxcbiAqIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB0ZXN0IHRoYXQgc3RhcnRlZCB0aGlzIGNvbnRyYWN0LiBUaGVcbiAqIHN1cHBsaWVkIGNhbGxiYWNrIHdpbGwgb25seSBiZSBjYWxsZWQgaW4gYSB0ZXN0aW5nIGNvbnRleHQsXG4gKiBuZXZlciBpbiBwcm9kdWN0aW9uOyBpLmUuLCBpdCBpcyBvbmx5IGNhbGxlZCBpZiBgdGVzdEppZ1NldHRlcmBcbiAqIHdhcyBzdXBwbGllZC5cbiAqXG4gKiBJZiBubywgYHRlc3RGbmAgaXMgc3VwcGxpZWQsIHRoZW4gYW4gZW1wdHkgamlnIHdpbGwgYmUgdXNlZC5cbiAqIEFuIGFkZGl0aW9uYWwgYHpjZmAgcHJvcGVydHkgc2V0IHRvIHRoZSBjdXJyZW50IENvbnRyYWN0RmFjZXRcbiAqIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHJldHVybmVkIGppZyBvYmplY3QgKG92ZXJyaWRpbmcgYW55XG4gKiBwcm92aWRlZCBieSB0aGUgYHRlc3RGbmApLlxuICpcbiAqIEBjYWxsYmFjayBTZXRUZXN0SmlnXG4gKiBAcGFyYW0geygpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSB0ZXN0Rm5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpDRk1pbnRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXNzdWVyUmVjb3JkPEs+fSBnZXRJc3N1ZXJSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7KGdhaW5zOiBBbW91bnRLZXl3b3JkUmVjb3JkLCB6Y2ZTZWF0PzogWkNGU2VhdCkgPT4gWkNGU2VhdH0gbWludEdhaW5zXG4gKiBBbGwgdGhlIGFtb3VudHMgaW4gZ2FpbnMgbXVzdCBiZSBvZiB0aGlzIFpDRk1pbnQncyBicmFuZC5cbiAqIFRoZSBnYWlucycga2V5d29yZHMgYXJlIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhhdCBzZWF0LlxuICogQWRkIHRoZSBnYWlucyB0byB0aGF0IHNlYXQncyBhbGxvY2F0aW9uLlxuICogVGhlIHJlc3VsdGluZyBzdGF0ZSBtdXN0IGJlIG9mZmVyIHNhZmUuIChDdXJyZW50bHksIGluY3JlYXNpbmcgYXNzZXRzIGNhblxuICogbmV2ZXIgdmlvbGF0ZSBvZmZlciBzYWZldHkgYW55d2F5LilcbiAqXG4gKiBNaW50IHRoYXQgYW1vdW50IG9mIGFzc2V0cyBpbnRvIHRoZSBwb29sZWQgcHVyc2UuXG4gKiBJZiBhIHNlYXQgaXMgcHJvdmlkZWQsIGl0IGlzIHJldHVybmVkLiBPdGhlcndpc2UgYSBuZXcgc2VhdCBpc1xuICogcmV0dXJuZWQuXG4gKlxuICogQHByb3BlcnR5IHsobG9zc2VzOiBBbW91bnRLZXl3b3JkUmVjb3JkLFxuICogICAgICAgICAgICAgemNmU2VhdDogWkNGU2VhdCxcbiAqICAgICAgICAgICAgKSA9PiB2b2lkfSBidXJuTG9zc2VzXG4gKiBBbGwgdGhlIGFtb3VudHMgaW4gbG9zc2VzIG11c3QgYmUgb2YgdGhpcyBaQ0ZNaW50J3MgYnJhbmQuXG4gKiBUaGUgbG9zc2VzJyBrZXl3b3JkcyBhcmUgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGF0IHNlYXQuXG4gKiBTdWJ0cmFjdCBsb3NzZXMgZnJvbSB0aGF0IHNlYXQncyBhbGxvY2F0aW9uLlxuICogVGhlIHJlc3VsdGluZyBzdGF0ZSBtdXN0IGJlIG9mZmVyIHNhZmUuXG4gKlxuICogQnVybiB0aGF0IGFtb3VudCBvZiBhc3NldHMgZnJvbSB0aGUgcG9vbGVkIHB1cnNlLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpDRlNlYXRGYWlsXG4gKlxuICogZmFpbCBjYWxsZWQgd2l0aCB0aGUgcmVhc29uIGZvciB0aGlzIGZhaWx1cmUsIHdoZXJlIHJlYXNvbiBpc1xuICogbm9ybWFsbHkgYW4gaW5zdGFuY2VvZiBFcnJvci5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcmVhc29uXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGR2V0QW1vdW50QWxsb2NhdGVkXG4gKiBUaGUgYnJhbmQgaXMgdXNlZCBmb3IgZmlsbGluZyBpbiBhbiBlbXB0eSBhbW91bnQgaWYgdGhlIGBrZXl3b3JkYFxuICogaXMgbm90IHByZXNlbnQgaW4gdGhlIGFsbG9jYXRpb25cbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxhbnk+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWkNGU2VhdFxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbj86IENvbXBsZXRpb24pID0+IHZvaWR9IGV4aXRcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdEZhaWx9IGZhaWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxTdWJzY3JpYmVyPEFsbG9jYXRpb24+Pn0gZ2V0U3Vic2NyaWJlclxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSBoYXNFeGl0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvcG9zYWxSZWNvcmR9IGdldFByb3Bvc2FsXG4gKiBAcHJvcGVydHkge1pDRkdldEFtb3VudEFsbG9jYXRlZH0gZ2V0QW1vdW50QWxsb2NhdGVkXG4gKiBAcHJvcGVydHkgeygpID0+IEFsbG9jYXRpb259IGdldEN1cnJlbnRBbGxvY2F0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEFsbG9jYXRpb259IGdldFN0YWdlZEFsbG9jYXRpb25cbiAqIERlcHJlY2F0ZWQ6IFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZFxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSBoYXNTdGFnZWRBbGxvY2F0aW9uXG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWRcbiAqIEBwcm9wZXJ0eSB7KG5ld0FsbG9jYXRpb246IEFsbG9jYXRpb24pID0+IGJvb2xlYW59IGlzT2ZmZXJTYWZlXG4gKiBAcHJvcGVydHkgeyhhbW91bnRLZXl3b3JkUmVjb3JkOiBBbW91bnRLZXl3b3JkUmVjb3JkKSA9PiBBbW91bnRLZXl3b3JkUmVjb3JkfSBpbmNyZW1lbnRCeVxuICogRGVwcmVjYXRlZDogVXNlIGF0b21pY1JlYXJyYW5nZSBpbnN0ZWFkXG4gKiBAcHJvcGVydHkgeyhhbW91bnRLZXl3b3JkUmVjb3JkOiBBbW91bnRLZXl3b3JkUmVjb3JkKSA9PiBBbW91bnRLZXl3b3JkUmVjb3JkfSBkZWNyZW1lbnRCeVxuICogRGVwcmVjYXRlZDogVXNlIGF0b21pY1JlYXJyYW5nZSBpbnN0ZWFkXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsZWFyXG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7IHpjZlNlYXQ6IFpDRlNlYXQsIHVzZXJTZWF0OiBFUmVmPFVzZXJTZWF0Pn19IFpjZlNlYXRLaXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBPUiBPZmZlciByZXN1bHRzXG4gKiBAdHlwZWRlZiB7KHNlYXQ6IFpDRlNlYXQsIG9mZmVyQXJncz86IG9iamVjdCkgPT4gT1J9IEhhbmRsZU9mZmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW09SPXVua25vd25dIE9mZmVyIHJlc3VsdHNcbiAqIEB0eXBlZGVmIHtIYW5kbGVPZmZlcjxPUj4gfCB7IGhhbmRsZTogSGFuZGxlT2ZmZXI8T1I+IH19IE9mZmVySGFuZGxlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29udHJhY3RNZXRhXG4gKiBAcHJvcGVydHkge0NvcHlSZWNvcmQ8UGF0dGVybj59IFtjdXN0b21UZXJtc1NoYXBlXVxuICogQHByb3BlcnR5IHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBbcHJpdmF0ZUFyZ3NTaGFwZV1cbiAqIEBwcm9wZXJ0eSB7J25vbmUnIHwgJ2NhbkJlVXBncmFkZWQnIHwgJ2NhblVwZ3JhZGUnfSBbdXBncmFkYWJpbGl0eT0nbm9uZSddXG4gKi9cblxuLyoqXG4gKiBBUEkgZm9yIGEgY29udHJhY3Qgc3RhcnQgZnVuY3Rpb24uXG4gKlxuICogQ0FWRUFUOiBhc3N1bWVzIHN5bmNocm9ub3VzXG4gKlxuICogQGRlcHJlY2F0ZWQgZGVmaW5lIGZ1bmN0aW9uIHNpZ25hdHVyZSBkaXJlY3RseVxuICpcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbUEY9YW55XSBQdWJsaWMgZmFjZXRcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbQ0Y9YW55XSBDcmVhdG9yIGZhY2V0XG4gKiBAdGVtcGxhdGUge29iamVjdH0gW0NUPWFueV0gQ3VzdG9tIHRlcm1zXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW1BBPWFueV0gUHJpdmF0ZSBhcmdzXG4gKiBAY2FsbGJhY2sgQ29udHJhY3RTdGFydEZuXG4gKiBAcGFyYW0ge1pDRjxDVD59IHpjZlxuICogQHBhcmFtIHtQQX0gcHJpdmF0ZUFyZ3NcbiAqIEBwYXJhbSB7TWFwU3RvcmV9IFtiYWdnYWdlXVxuICogQHJldHVybnMge0NvbnRyYWN0U3RhcnRGblJlc3VsdDxQRiwgQ0Y+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFBGIFB1YmxpYyBmYWNldFxuICogQHRlbXBsYXRlIENGIENyZWF0b3IgZmFjZXRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbnRyYWN0U3RhcnRGblJlc3VsdFxuICogQHByb3BlcnR5IHtQRn0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Q0Z9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtQcm9taXNlPEludml0YXRpb24+fSBbY3JlYXRvckludml0YXRpb25dXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgU1xuICogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3pvZVNlcnZpY2UvdXRpbHMnKS5Db250cmFjdE9mPFM+fSBDb250cmFjdE9mXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vem9lU2VydmljZS91dGlscycpLkFkbWluRmFjZXR9IEFkbWluRmFjZXRcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdOoKXuRIAALkSAAA5AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiVHJhbnNmZXJQYXJ0U2hhcGUiLCJhdG9taWNSZWFycmFuZ2UiLCJhdG9taWNUcmFuc2ZlciIsImZyb21Pbmx5IiwidG9Pbmx5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0sQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFNlYXRTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJTZWF0U2hhcGVcIiwgWyRo4oCNX2EgPT4gKFNlYXRTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0ICAgICAgICBUcmFuc2ZlclBhcnRTaGFwZT1NLnNwbGl0QXJyYXkoXG5oYXJkZW4oW00ub3B0KFNlYXRTaGFwZSksTS5vcHQoU2VhdFNoYXBlKSxNLm9wdChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpXSksXG5oYXJkZW4oW00ub3B0KEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSldKSk7XG5cblxuLyoqXG4gKiBBc2tzIFpvZSAodmlhIHpjZikgdG8gcmVhcnJhbmdlIHRoZSBhbGxvY2F0aW9ucyBhbW9uZyB0aGUgc2VhdHNcbiAqIG1lbnRpb25lZC4gVGhpcyBpcyBhIHNldCBvZiBjaGFuZ2VzIHRvIGFsbG9jYXRpb25zIHRoYXQgbXVzdCBzYXRpc2Z5XG4gKiBzZXZlcmFsIGNvbnN0cmFpbnRzLiBJZiB0aGVzZSBjb25zdHJhaW50cyBhcmUgYWxsIG1ldCwgdGhlbiB0aGVcbiAqIHJlYWxsb2NhdGlvbiBoYXBwZW5zIGF0b21pY2FsbHkuIE90aGVyd2lzZSBpdCBkb2VzIG5vdCBoYXBwZW5cbiAqIGF0IGFsbC5cbiAqXG4gKiBUaGUgY29uZGl0aW9uc1xuICogICAgKiBBbGwgdGhlIG1lbnRpb25lZCBzZWF0cyBhcmUgc3RpbGwgbGl2ZSAtLSBlbmZvcmNlZCBieSBaQ0YuXG4gKiAgICAqIE5vIG91dHN0YW5kaW5nIHN0YWdpbmdzIGZvciBhbnkgb2YgdGhlIG1lbnRpb25lZCBzZWF0cy5cbiAqICAgICAgU3RhZ2luZ3Mgbm93IGRlcHJlY2F0ZWQgaW4gZmF2b3Igb3IgYXRvbWljUmVhcnJhbmdlLiBUb1xuICogICAgICBwcmV2ZW50IGNvbmZ1c2lvbiwgZm9yIGVhY2ggcmVhbGxvY2F0aW9uLCBpdCBjYW4gb25seSBiZVxuICogICAgICBleHByZXNzZWQgaW4gdGhlIG9sZCB3YXkgb3IgdGhlIG5ldyB3YXksIGJ1dCBub3QgYSBtaXh0dXJlLlxuICogICAgKiBPZmZlciBzYWZldHkgLS0gZW5mb3JjZWQgYnkgWkNGLlxuICogICAgKiBPdmVyYWxsIGNvbnNlcnZhdGlvbiAtLSBlbmZvcmNlZCBieSBaQ0YuXG4gKiAgICAqIFRoZSBvdmVyYWxsIHRyYW5zZmVyIGlzIGV4cHJlc3NlZCBhcyBhbiBhcnJheSBvZiBgVHJhbnNmZXJQYXJ0YC5cbiAqICAgICAgRWFjaCBpbmRpdmlkdWFsIGBUcmFuc2ZlclBhcnRgIGlzIG9uZSBvZlxuICogICAgICAgLSBBIHRyYW5zZmVyIGZyb20gYSBgZnJvbVNlYXRgIHRvIGEgYHRvU2VhdGAuXG4gKiAgICAgICAgIFRoaXMgaXMgbm90IG5lZWRlZCBmb3IgWm9lJ3Mgc2FmZXR5LCBhcyBab2UgZG9lc1xuIGl0cyBvd24gb3ZlcmFsbCBjb25zZXJ2YXRpb24gY2hlY2suIFJhdGhlciwgaXQgaGVscHMgY2F0Y2hcbiBhbmQgZGlhZ25vc2UgY29udHJhY3QgYnVncyBlYXJsaWVyLlxuICogICAgICAgLSBBIHRha2luZyBmcm9tIGEgYGZyb21TZWF0YCdzIGFsbG9jYXRpb24uIFNlZSB0aGUgYGZyb21Pbmx5YFxuIGhlbHBlci5cbiAtIEEgZ2l2aW5nIGludG8gYSBgdG9TZWF0YCdzIGFsbG9jYXRpb24uIFNlZSB0aGUgYHRvT25seWBcbiBoZWxwZXIuXG4gKlxuICogVE9ETyg2Njc5KSBSZWZhY3RvciBgYXRvbWljUmVhcnJhbmdlYGZyb20gYmVpbmcgYSBoZWxwZXIgaW50byBiZWluZ1xuICogemNmJ3MgcmVwbGFjZW1lbnQgZm9yIHJlYWxsb2NhdGUuIEl0IHdhcyBtYWRlIGEgaGVscGVyIGR1cmluZ1xuICogdGhlIHRyYW5zaXRpb24sIHRvIGF2b2lkIGludGVyZmVyZW5jZSB3aXRoIHByb2dyZXNzIG9uIFpvZSBkdXJhYmlsaXR5LlxuICpcbiAqIFNlZSB0aGUgaGVscGVycyBiZWxvdywgYGZyb21Pbmx5YCwgYHRvT25seWAsIGFuZCBgYXRvbWljVHJhbnNmZXJgLFxuICogd2hpY2ggd2lsbCByZW1haW4gaGVscGVycy4gVGhlc2UgaGVscGVyIGFyZSBmb3IgY29udmVuaWVuY2VcbiAqIGluIGV4cHJlc3NpbmcgYXRvbWljIHJlYXJyYW5nZW1lbnRzIGNsZWFybHkuXG4gKlxuICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB6Y2YgYnVpbHRpbiBpbnN0ZWFkXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtUcmFuc2ZlclBhcnRbXX0gdHJhbnNmZXJzXG4gKi8kaOKAjV9vbmNlLlRyYW5zZmVyUGFydFNoYXBlKFRyYW5zZmVyUGFydFNoYXBlKTtcbmNvbnN0ICAgICAgICBhdG9taWNSZWFycmFuZ2U9KHpjZix0cmFuc2ZlcnMpPT57XG56Y2YuYXRvbWljUmVhcnJhbmdlKHRyYW5zZmVycyk7XG4gfTtcblxuLyoqXG4gKiBTb21ldGltZXMgYSBUcmFuc2ZlclBhcnQgaW4gYW4gYXRvbWljUmVhcnJhbmdlIG9ubHkgZXhwcmVzc2VzIHdoYXQgYW1vdW50c1xuICogc2hvdWxkIGJlIHRha2VuIGZyb20gYSBzZWF0LCBsZWF2aW5nIGl0IHRvIG90aGVyIFRyYW5zZmVyUGFydCBvZiB0aGVcbiAqIHNhbWUgYXRvbWljUmVhcnJhbmdlIHRvIGJhbGFuY2UgaXQgb3V0LiBGb3IgdGhpcyBjYXNlLCB0aGVcbiAqIGBbZnJvbVNlYXQsIHVuZGVmaW5lZCwgZnJvbUFtb3VudHNdYCBmb3JtIGlzIG1vcmUgY2xlYXJseSBleHByZXNzZWQgYXNcbiAqIGBmcm9tT25seShmcm9tU2VhdCwgZnJvbUFtb3VudHMpYC4gVW5saWtlIFRyYW5zZmVyUGFydCwgYm90aCBhcmd1bWVudHMgdG9cbiAqIGBmcm9tT25seWAgYXJlIG5vbi1vcHRpb25hbCwgYXMgb3RoZXJ3aXNlIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gZnJvbVNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gZnJvbUFtb3VudHNcbiAqIEByZXR1cm5zIHtUcmFuc2ZlclBhcnR9XG4gKi8kaOKAjV9vbmNlLmF0b21pY1JlYXJyYW5nZShhdG9taWNSZWFycmFuZ2UpO1xuY29uc3QgICAgICAgIGZyb21Pbmx5PShmcm9tU2VhdCxmcm9tQW1vdW50cyk9PlxuaGFyZGVuKFtmcm9tU2VhdCx1bmRlZmluZWQsZnJvbUFtb3VudHNdKTtcblxuLyoqXG4gKiBTb21ldGltZXMgYSBUcmFuc2ZlclBhcnQgaW4gYW4gYXRvbWljUmVhcnJhbmdlIG9ubHkgZXhwcmVzc2VzIHdoYXQgYW1vdW50c1xuICogc2hvdWxkIGJlIGdpdmVuIHRvIGEgc2VhdCwgbGVhdmluZyBpdCB0byBvdGhlciBUcmFuc2ZlclBhcnQgb2YgdGhlXG4gKiBzYW1lIGF0b21pY1JlYXJyYW5nZSB0byBiYWxhbmNlIGl0IG91dC4gRm9yIHRoaXMgY2FzZSwgdGhlXG4gKiBgW3VuZGVmaW5lZCwgdG9TZWF0LCB1bmRlZmluZWQsIHRvQW1vdW50c11gIGZvcm0gaXMgbW9yZSBjbGVhcmx5IGV4cHJlc3NlZCBhc1xuICogYHRvT25seSh0b1NlYXQsIHRvQW1vdW50cylgLiBVbmxpa2UgVHJhbnNmZXJQYXJ0LCBib3RoIGFyZ3VtZW50cyB0b1xuICogYHRvT25seWAgYXJlIG5vbi1vcHRpb25hbCwgYXMgb3RoZXJ3aXNlIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gdG9TZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IHRvQW1vdW50c1xuICogQHJldHVybnMge1RyYW5zZmVyUGFydH1cbiAqLyRo4oCNX29uY2UuZnJvbU9ubHkoZnJvbU9ubHkpO1xuY29uc3QgICAgICAgIHRvT25seT0odG9TZWF0LHRvQW1vdW50cyk9PlxuaGFyZGVuKFt1bmRlZmluZWQsdG9TZWF0LHVuZGVmaW5lZCx0b0Ftb3VudHNdKTtcblxuLyoqXG4gKiBTcGVjaWFsIGNhc2Ugb2YgYXRvbWljUmVhcnJhbmdlIGZvciBhIHNpbmdsZSBvbmUtd2F5IHRyYW5zZmVyXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBbZnJvbVNlYXRdXG4gKiBAcGFyYW0ge1pDRlNlYXR9IFt0b1NlYXRdXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IFtmcm9tQW1vdW50c11cbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gW3RvQW1vdW50c11cbiAqLyRo4oCNX29uY2UudG9Pbmx5KHRvT25seSk7XG5jb25zdCAgICAgICAgYXRvbWljVHJhbnNmZXI9KFxuemNmLFxuZnJvbVNlYXQ9dW5kZWZpbmVkLFxudG9TZWF0PXVuZGVmaW5lZCxcbmZyb21BbW91bnRzPXVuZGVmaW5lZCxcbnRvQW1vdW50cz11bmRlZmluZWQpPT5cbnpjZi5hdG9taWNSZWFycmFuZ2UoaGFyZGVuKFtbZnJvbVNlYXQsdG9TZWF0LGZyb21BbW91bnRzLHRvQW1vdW50c11dKSk7JGjigI1fb25jZS5hdG9taWNUcmFuc2ZlcihhdG9taWNUcmFuc2Zlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVHJhbnNmZXJQYXJ0U2hhcGUiOlsiVHJhbnNmZXJQYXJ0U2hhcGUiXSwiYXRvbWljUmVhcnJhbmdlIjpbImF0b21pY1JlYXJyYW5nZSJdLCJmcm9tT25seSI6WyJmcm9tT25seSJdLCJ0b09ubHkiOlsidG9Pbmx5Il0sImF0b21pY1RyYW5zZmVyIjpbImF0b21pY1RyYW5zZmVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIn7qeS2GwAAthsAADgAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCIuL3NhZmVNYXRoLmpzIl0sImV4cG9ydHMiOlsiY2FsY0xpcVZhbHVlVG9NaW50IiwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIiwiY2FsY1ZhbHVlVG9SZW1vdmUiLCJnZXRJbnB1dFByaWNlIiwiZ2V0T3V0cHV0UHJpY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LG5hdFNhZmVNYXRoOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zYWZlTWF0aC5qc1wiLCBbW1wibmF0U2FmZU1hdGhcIiwgWyRo4oCNX2EgPT4gKG5hdFNhZmVNYXRoID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e3N1YnRyYWN0LGFkZCxtdWx0aXBseSxmbG9vckRpdmlkZX09bmF0U2FmZU1hdGg7XG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0IEJBU0lTX1BPSU5UUz0xMDAwMG47LyogVE9ETyBjaGFuZ2UgdG8gMTBfMDAwbiBvbmNlIHRvb2xpbmcgY29wZXMuKi9cblxuLyoqXG4gKiBDYWxjdWxhdGlvbnMgZm9yIGNvbnN0YW50IHByb2R1Y3QgbWFya2V0cyBsaWtlIFVuaXN3YXAuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vcnVudGltZXZlcmlmaWNhdGlvbi92ZXJpZmllZC1zbWFydC1jb250cmFjdHMvYmxvYi91bmlzd2FwL3VuaXN3YXAveC15LWsucGRmXG4gKi9cblxuLyoqXG4gKiBDb250YWlucyB0aGUgbG9naWMgZm9yIGNhbGN1bGF0aW5nIGhvdyBtdWNoIHNob3VsZCBiZSBnaXZlblxuICogYmFjayB0byB0aGUgdXNlciBpbiBleGNoYW5nZSBmb3Igd2hhdCB0aGV5IHNlbnQgaW4uIFJldXNlZCBpblxuICogc2V2ZXJhbCBkaWZmZXJlbnQgcGxhY2VzLCBpbmNsdWRpbmcgdG8gY2hlY2sgd2hldGhlciBhbiBvZmZlclxuICogaXMgdmFsaWQsIGdldHRpbmcgdGhlIGN1cnJlbnQgcHJpY2UgZm9yIGFuIGFzc2V0IG9uIHVzZXJcbiAqIHJlcXVlc3QsIGFuZCB0byBkbyB0aGUgYWN0dWFsIHJlYWxsb2NhdGlvbiBhZnRlciBhbiBvZmZlciBoYXNcbiAqIGJlZW4gbWFkZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gaW5wdXRWYWx1ZSAtIHRoZSB2YWx1ZSBvZiB0aGUgYXNzZXQgc2VudFxuICogaW4gdG8gYmUgc3dhcHBlZFxuICogQHBhcmFtIHthbnl9IGlucHV0UmVzZXJ2ZSAtIHRoZSB2YWx1ZSBpbiB0aGUgbGlxdWlkaXR5XG4gKiBwb29sIG9mIHRoZSBraW5kIG9mIGFzc2V0IHNlbnQgaW5cbiAqIEBwYXJhbSB7YW55fSBvdXRwdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGtpbmQgb2YgYXNzZXQgdG8gYmUgc2VudCBvdXRcbiAqIEBwYXJhbSB7YmlnaW50fSBbZmVlQmFzaXNQb2ludHNdIC0gdGhlIGZlZSB0YWtlbiBpblxuICogYmFzaXMgcG9pbnRzLiBUaGUgZGVmYXVsdCBpcyAwLjMlIG9yIDMwIGJhc2lzIHBvaW50cy4gVGhlIGZlZVxuICogaXMgdGFrZW4gZnJvbSBpbnB1dFZhbHVlXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9IG91dHB1dFZhbHVlIC0gdGhlIGN1cnJlbnQgcHJpY2UsIGluIHZhbHVlIGZvcm1cbiAqL1xuY29uc3QgICAgICAgIGdldElucHV0UHJpY2U9KFxuaW5wdXRWYWx1ZSxcbmlucHV0UmVzZXJ2ZSxcbm91dHB1dFJlc2VydmUsXG5mZWVCYXNpc1BvaW50cz0zMG4pPT5cbntcbmlucHV0VmFsdWU9TmF0KGlucHV0VmFsdWUpO1xuaW5wdXRSZXNlcnZlPU5hdChpbnB1dFJlc2VydmUpO1xub3V0cHV0UmVzZXJ2ZT1OYXQob3V0cHV0UmVzZXJ2ZSk7XG5pbnB1dFZhbHVlPjBufHxGYWlsIGBpbnB1dFZhbHVlICR7aW5wdXRWYWx1ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG5pbnB1dFJlc2VydmU+MG58fEZhaWwgYGlucHV0UmVzZXJ2ZSAke2lucHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG5vdXRwdXRSZXNlcnZlPjBufHxGYWlsIGBvdXRwdXRSZXNlcnZlICR7b3V0cHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG5cbmNvbnN0IG9uZU1pbnVzRmVlU2NhbGVkPXN1YnRyYWN0KEJBU0lTX1BPSU5UUyxmZWVCYXNpc1BvaW50cyk7XG5jb25zdCBpbnB1dFdpdGhGZWU9bXVsdGlwbHkoaW5wdXRWYWx1ZSxvbmVNaW51c0ZlZVNjYWxlZCk7XG5jb25zdCBudW1lcmF0b3I9bXVsdGlwbHkoaW5wdXRXaXRoRmVlLG91dHB1dFJlc2VydmUpO1xuY29uc3QgZGVub21pbmF0b3I9YWRkKG11bHRpcGx5KGlucHV0UmVzZXJ2ZSxCQVNJU19QT0lOVFMpLGlucHV0V2l0aEZlZSk7XG5yZXR1cm4gZmxvb3JEaXZpZGUobnVtZXJhdG9yLGRlbm9taW5hdG9yKTtcbiB9O1xuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgY2FsY3VsYXRpbmcgaG93IG11Y2ggc2hvdWxkIGJlIHRha2VuXG4gKiBmcm9tIHRoZSB1c2VyIGluIGV4Y2hhbmdlIGZvciB3aGF0IHRoZXkgd2FudCB0byBvYnRhaW4uIFJldXNlZCBpblxuICogc2V2ZXJhbCBkaWZmZXJlbnQgcGxhY2VzLCBpbmNsdWRpbmcgdG8gY2hlY2sgd2hldGhlciBhbiBvZmZlclxuICogaXMgdmFsaWQsIGdldHRpbmcgdGhlIGN1cnJlbnQgcHJpY2UgZm9yIGFuIGFzc2V0IG9uIHVzZXJcbiAqIHJlcXVlc3QsIGFuZCB0byBkbyB0aGUgYWN0dWFsIHJlYWxsb2NhdGlvbiBhZnRlciBhbiBvZmZlciBoYXNcbiAqIGJlZW4gbWFkZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gb3V0cHV0VmFsdWUgLSB0aGUgdmFsdWUgb2YgdGhlIGFzc2V0IHRoZSB1c2VyIHdhbnRzXG4gKiB0byBnZXRcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUgYXNzZXQgYmVpbmcgc3BlbnRcbiAqIEBwYXJhbSB7YW55fSBvdXRwdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGtpbmQgb2YgYXNzZXQgdG8gYmUgc2VudCBvdXRcbiAqIEBwYXJhbSB7YmlnaW50fSBbZmVlQmFzaXNQb2ludHNdIC0gdGhlIGZlZSB0YWtlbiBpblxuICogYmFzaXMgcG9pbnRzLiBUaGUgZGVmYXVsdCBpcyAwLjMlIG9yIDMwIGJhc2lzIHBvaW50cy4gVGhlIGZlZSBpcyB0YWtlbiBmcm9tXG4gKiBvdXRwdXRWYWx1ZVxuICogQHJldHVybnMge05hdFZhbHVlfSBpbnB1dFZhbHVlIC0gdGhlIHZhbHVlIG9mIGlucHV0IHJlcXVpcmVkIHRvIHB1cmNoYXNlIG91dHB1dFxuICovJGjigI1fb25jZS5nZXRJbnB1dFByaWNlKGdldElucHV0UHJpY2UpO1xuY29uc3QgICAgICAgIGdldE91dHB1dFByaWNlPShcbm91dHB1dFZhbHVlLFxuaW5wdXRSZXNlcnZlLFxub3V0cHV0UmVzZXJ2ZSxcbmZlZUJhc2lzUG9pbnRzPTMwbik9Plxue1xub3V0cHV0VmFsdWU9TmF0KG91dHB1dFZhbHVlKTtcbmlucHV0UmVzZXJ2ZT1OYXQoaW5wdXRSZXNlcnZlKTtcbm91dHB1dFJlc2VydmU9TmF0KG91dHB1dFJlc2VydmUpO1xuXG5pbnB1dFJlc2VydmU+MG58fEZhaWwgYGlucHV0UmVzZXJ2ZSAke2lucHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG5vdXRwdXRSZXNlcnZlPjBufHxGYWlsIGBvdXRwdXRSZXNlcnZlICR7b3V0cHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG5vdXRwdXRSZXNlcnZlPm91dHB1dFZhbHVlfHxcbkZhaWwgYG91dHB1dFJlc2VydmUgJHtvdXRwdXRSZXNlcnZlfSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvdXRwdXRWYWx1ZSAke291dHB1dFZhbHVlfWA7XG5cbmNvbnN0IG9uZU1pbnVzRmVlU2NhbGVkPXN1YnRyYWN0KEJBU0lTX1BPSU5UUyxmZWVCYXNpc1BvaW50cyk7XG5jb25zdCBudW1lcmF0b3I9bXVsdGlwbHkobXVsdGlwbHkob3V0cHV0VmFsdWUsaW5wdXRSZXNlcnZlKSxCQVNJU19QT0lOVFMpO1xuY29uc3QgZGVub21pbmF0b3I9bXVsdGlwbHkoXG5zdWJ0cmFjdChvdXRwdXRSZXNlcnZlLG91dHB1dFZhbHVlKSxcbm9uZU1pbnVzRmVlU2NhbGVkKTtcblxucmV0dXJuIGFkZChmbG9vckRpdmlkZShudW1lcmF0b3IsZGVub21pbmF0b3IpLDFuKTtcbiB9O1xuXG4vKipcbiAqIENhbGN1bGF0ZSBob3cgbWFueSBsaXF1aWRpdHkgdG9rZW5zIHdlIHNob3VsZCBiZSBtaW50aW5nIHRvIHNlbmQgYmFjayB0byB0aGVcbiAqIHVzZXIgd2hlbiBhZGRpbmcgbGlxdWlkaXR5LiBXZSBwcm92aWRlIG5ldyBsaXF1aWRpdHkgZXF1YWwgdG8gdGhlIGV4aXN0aW5nXG4gKiBsaXF1aWRpdHkgbXVsdGlwbGllZCBieSB0aGUgcmF0aW8gb2YgbmV3IGNlbnRyYWwgdG9rZW5zIHRvIGNlbnRyYWwgdG9rZW5zXG4gKiBhbHJlYWR5IGhlbGQuIElmIHRoZSBjdXJyZW50IHN1cHBseSBpcyB6ZXJvLCByZXR1cm4gdGhlIGlucHV0VmFsdWUgYXMgdGhlXG4gKiBpbml0aWFsIGxpcXVpZGl0eSB0byBtaW50IGlzIGFyYml0cmFyeS5cbiAqXG4gKiBAcGFyYW0ge2JpZ2ludH0gbGlxVG9rZW5TdXBwbHlcbiAqIEBwYXJhbSB7YmlnaW50fSBpbnB1dFZhbHVlXG4gKiBAcGFyYW0ge2JpZ2ludH0gaW5wdXRSZXNlcnZlXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9XG4gKi8kaOKAjV9vbmNlLmdldE91dHB1dFByaWNlKGdldE91dHB1dFByaWNlKTtcbmNvbnN0ICAgICAgICBjYWxjTGlxVmFsdWVUb01pbnQ9KFxubGlxVG9rZW5TdXBwbHksXG5pbnB1dFZhbHVlLFxuaW5wdXRSZXNlcnZlKT0+XG57XG5saXFUb2tlblN1cHBseT1OYXQobGlxVG9rZW5TdXBwbHkpO1xuaW5wdXRWYWx1ZT1OYXQoaW5wdXRWYWx1ZSk7XG5pbnB1dFJlc2VydmU9TmF0KGlucHV0UmVzZXJ2ZSk7XG5cbmlmKGxpcVRva2VuU3VwcGx5PT09MG4pe1xucmV0dXJuIGlucHV0VmFsdWU7XG4gfVxucmV0dXJuIGZsb29yRGl2aWRlKG11bHRpcGx5KGlucHV0VmFsdWUsbGlxVG9rZW5TdXBwbHkpLGlucHV0UmVzZXJ2ZSk7XG4gfTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgaG93IG11Y2ggb2YgdGhlIHNlY29uZGFyeSB0b2tlbiBpcyByZXF1aXJlZCBmcm9tIHRoZSB1c2VyIHdoZW5cbiAqIGFkZGluZyBsaXF1aWRpdHkuIFdlIHJlcXVpcmUgdGhhdCB0aGUgZGVwb3NpdGVkIHJhdGlvIG9mIGNlbnRyYWwgdG8gc2Vjb25kYXJ5XG4gKiBtYXRjaCB0aGUgY3VycmVudCByYXRpbyBvZiBob2xkaW5ncyBpbiB0aGUgcG9vbC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gY2VudHJhbEluIC0gVGhlIHZhbHVlIG9mIGNlbnRyYWwgYXNzZXRzIGJlaW5nIGRlcG9zaXRlZFxuICogQHBhcmFtIHthbnl9IGNlbnRyYWxQb29sIC0gVGhlIHZhbHVlIG9mIGNlbnRyYWwgYXNzZXRzIGluIHRoZSBwb29sXG4gKiBAcGFyYW0ge2FueX0gc2Vjb25kYXJ5UG9vbCAtIFRoZSB2YWx1ZSBvZiBzZWNvbmRhcnkgYXNzZXRzIGluIHRoZSBwb29sXG4gKiBAcGFyYW0ge2FueX0gc2Vjb25kYXJ5SW4gLSBUaGUgdmFsdWUgb2Ygc2Vjb25kYXJ5IGFzc2V0cyBwcm92aWRlZC4gSWZcbiAqIHRoZSBwb29sIGlzIGVtcHR5LCB0aGUgZW50aXJlIGFtb3VudCB3aWxsIGJlIGFjY2VwdGVkXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9IC0gdGhlIGFtb3VudCBvZiBzZWNvbmRhcnkgcmVxdWlyZWRcbiAqLyRo4oCNX29uY2UuY2FsY0xpcVZhbHVlVG9NaW50KGNhbGNMaXFWYWx1ZVRvTWludCk7XG5jb25zdCAgICAgICAgY2FsY1NlY29uZGFyeVJlcXVpcmVkPShcbmNlbnRyYWxJbixcbmNlbnRyYWxQb29sLFxuc2Vjb25kYXJ5UG9vbCxcbnNlY29uZGFyeUluKT0+XG57XG5jZW50cmFsSW49TmF0KGNlbnRyYWxJbik7XG5jZW50cmFsUG9vbD1OYXQoY2VudHJhbFBvb2wpO1xuc2Vjb25kYXJ5UG9vbD1OYXQoc2Vjb25kYXJ5UG9vbCk7XG5zZWNvbmRhcnlJbj1OYXQoc2Vjb25kYXJ5SW4pO1xuXG5pZihjZW50cmFsUG9vbD09PTBufHxzZWNvbmRhcnlQb29sPT09MG4pe1xucmV0dXJuIHNlY29uZGFyeUluO1xuIH1cblxuY29uc3Qgc2NhbGVkU2Vjb25kYXJ5PWZsb29yRGl2aWRlKFxubXVsdGlwbHkoY2VudHJhbEluLHNlY29uZGFyeVBvb2wpLFxuY2VudHJhbFBvb2wpO1xuXG5jb25zdCBleGFjdD1cbm11bHRpcGx5KGNlbnRyYWxJbixzZWNvbmRhcnlQb29sKT09PVxubXVsdGlwbHkoc2NhbGVkU2Vjb25kYXJ5LGNlbnRyYWxQb29sKTtcblxuLyogZG9lc24ndCBtYXRjaCB0aGUgeC15LWsucGRmIHBhcGVyLCBidXQgbW9yZSBjb3JyZWN0LiBXaGVuIHRoZSByYXRpb3MgYXJlKi9cbi8qIGV4YWN0bHkgZXF1YWwsIGxQcmltZSBpcyBleGFjdGx5IGwgKiAoMSArIGFscGhhKSBhbmQgYWRkaW5nIG9uZSBpcyB3cm9uZyovXG5yZXR1cm4gZXhhY3Q/c2NhbGVkU2Vjb25kYXJ5OjFuK3NjYWxlZFNlY29uZGFyeTtcbiB9O1xuXG4vKiBDYWxjdWxhdGUgaG93IG1hbnkgdW5kZXJseWluZyB0b2tlbnMgKGluIHRoZSBmb3JtIG9mIGEgdmFsdWUpIHNob3VsZCBiZSovXG4vKiByZXR1cm5lZCB3aGVuIHJlbW92aW5nIGxpcXVpZGl0eS4qLyRo4oCNX29uY2UuY2FsY1NlY29uZGFyeVJlcXVpcmVkKGNhbGNTZWNvbmRhcnlSZXF1aXJlZCk7XG5jb25zdCAgICAgICAgY2FsY1ZhbHVlVG9SZW1vdmU9KFxubGlxVG9rZW5TdXBwbHksXG5wb29sVmFsdWUsXG5saXF1aWRpdHlWYWx1ZUluKT0+XG57XG5saXFUb2tlblN1cHBseT1OYXQobGlxVG9rZW5TdXBwbHkpO1xubGlxdWlkaXR5VmFsdWVJbj1OYXQobGlxdWlkaXR5VmFsdWVJbik7XG5wb29sVmFsdWU9TmF0KHBvb2xWYWx1ZSk7XG5cbnJldHVybiBmbG9vckRpdmlkZShtdWx0aXBseShsaXF1aWRpdHlWYWx1ZUluLHBvb2xWYWx1ZSksbGlxVG9rZW5TdXBwbHkpO1xuIH07JGjigI1fb25jZS5jYWxjVmFsdWVUb1JlbW92ZShjYWxjVmFsdWVUb1JlbW92ZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0SW5wdXRQcmljZSI6WyJnZXRJbnB1dFByaWNlIl0sImdldE91dHB1dFByaWNlIjpbImdldE91dHB1dFByaWNlIl0sImNhbGNMaXFWYWx1ZVRvTWludCI6WyJjYWxjTGlxVmFsdWVUb01pbnQiXSwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIjpbImNhbGNTZWNvbmRhcnlSZXF1aXJlZCJdLCJjYWxjVmFsdWVUb1JlbW92ZSI6WyJjYWxjVmFsdWVUb1JlbW92ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACfC5E2thIAALYSAAA1AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsibWFrZUVwaGVtZXJhUHJvdmlkZXIiLCJwcm92aWRlQWxsIiwicHJvdmlkZUVtcHR5U2VhdCIsInByb3ZpZGVTaW5nbGV0b24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYWxsVmFsdWVzLG9iamVjdE1hcCxwcm92aWRlLEU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYWxsVmFsdWVzXCIsIFskaOKAjV9hID0+IChhbGxWYWx1ZXMgPSAkaOKAjV9hKV1dLFtcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBTQ0FMRTogT25seSBmb3IgbG93IGNhcmRpbmFsaXR5IHByb3Zpc2lvbmluZy4gRXZlcnkgdmFsdWUgZnJvbSBpbml0KCkgd2lsbFxuICogcmVtYWluIGluIHRoZSBtYXAgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgaGVhcC4gSWYgYSBrZXkgb2JqZWN0IGlzIEdDZWQsIGl0c1xuICogcmVwcmVzZW50YXRpdmUgYWxzbyByZW1haW5zLlxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IEUgRXBoZW1lcmFsIHN0YXRlXG4gKiBAdGVtcGxhdGUge3t9fSBbSz1hbnldIGtleSBvbiB3aGljaCB0byBwcm92aXNpb25cbiAqIEBwYXJhbSB7KGtleTogSykgPT4gRX0gaW5pdFxuICovXG5jb25zdCAgICAgICAgbWFrZUVwaGVtZXJhUHJvdmlkZXI9KGluaXQpPT57XG4vKiogQHR5cGUge1dlYWtNYXA8SywgRT59ICovXG5jb25zdCBleHRhbnQ9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBQcm92aWRlIGFuIG9iamVjdCB0byBob2xkIHN0YXRlIHRoYXQgbmVlZCBub3QgKG9yIGNhbm5vdCkgYmUgZHVyYWJsZS5cbiAqXG4gKiBAdHlwZSB7KGtleTogSykgPT4gRX1cbiAqL1xucmV0dXJuKGtleSk9PntcbmlmKGV4dGFudC5oYXMoa2V5KSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuIGV4dGFudC5nZXQoa2V5KTtcbiB9XG5jb25zdCBuZXdFcGg9aW5pdChrZXkpO1xuZXh0YW50LnNldChrZXksbmV3RXBoKTtcbnJldHVybiBuZXdFcGg7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZUVwaGVtZXJhUHJvdmlkZXIobWFrZUVwaGVtZXJhUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VFcGhlbWVyYVByb3ZpZGVyKTtcblxuLyoqXG4gKiBQcm92aWRlIGFuIGVtcHR5IFpDRiBzZWF0LlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy9lcnRwJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtaQ0ZTZWF0fVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUVtcHR5U2VhdD0oemNmLGJhZ2dhZ2UsbmFtZSk9PntcbnJldHVybiBwcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+emNmLm1ha2VFbXB0eVNlYXRLaXQoKS56Y2ZTZWF0KTtcbiB9OyRo4oCNX29uY2UucHJvdmlkZUVtcHR5U2VhdChwcm92aWRlRW1wdHlTZWF0KTtcbmhhcmRlbihwcm92aWRlRW1wdHlTZWF0KTtcblxuLyoqXG4gKiBGb3IgdXNlIGluIGNvbnRyYWN0IHVwZ3JhZGVzIHRvIHByb3ZpZGUgdmFsdWVzIHRoYXQgY29tZSBmcm9tIG90aGVyIHZhdHMuXG4gKiBBbGwgdmF0cyBtdXN0IGJlIGFibGUgdG8gZmluaXNoIHRoZWlyIHVwZ3JhZGUgd2l0aG91dCBjb250YWN0aW5nIG90aGVyIHZhdHMsXG4gKiBzbyB3aGF0ZXZlciB2YWx1ZXMgYW4gaW5zdGFuY2UgbmVlZHMgZnJvbSBvdGhlciB2YXRzIG11c3QgYmUgc2F2ZWQgaW4gdGhlIGZpcnN0XG4gKiBpbmNhcm5hdGlvbiBhbmQgcmVhZCBmcm9tIGJhZ2dhZ2UgaW4gZWFjaCBzdWJzZXF1ZW50LlxuICpcbiAqIFRoaXMgYWJzdHJhY3RzIHRoYXQgY29uZGl0aW9uIHNvIHRoYXQgdGhlIGNvbnRyYWN0IGNhbiBjb252ZXJ0IGEgZGljdGlvbmFyeVxuICogb2YgdGh1bmtzIGludG8gYSBkaWN0aW9uYXJ5IG9mIHZhbHVlcyBkdXJpbmcgaXRzIGZpcnN0IGBwcmVwYXJlYCAoc3RhcnQpLlxuICogRWFjaCBzdWJzZXF1ZW50IGBwcmVwYXJlYCBjYWxsIHdpbGwgYXV0b21hdGljYWxseSByZWFkIGZyb20gdGhlIGJhZ2dhZ2UgYW5kXG4gKiBlc2NoZXcgcmVtb3RlIGNhbGxzLlxuICpcbiAqIFRoZSB2YWx1ZXMgYXJlIHRodW5rcyBpbnN0ZWFkIG9mIHByb21pc2VzIHNvIHRoYXQgdGhleSBkb24ndCBzdGFydCBleGVjdXRpbmdcbiAqIHVubmVjZXNzYXJpbHkgb3IgaW5kdWNlIGZhaWx1cmVzLlxuICpcbiAqIEZvciBleGFtcGxlLFxuICpcbiAqICAgICBjb25zdCBpbnZpdGF0aW9uSXNzdWVyUCA9IEUoem9lKS5nZXRJbnZpdGF0aW9uSXNzdWVyKCk7XG4gKiAgICAgY29uc3Qge1xuICogICAgICAgaW52aXRhdGlvbklzc3VlcixcbiAqICAgICAgIGludml0YXRpb25CcmFuZCxcbiAqICAgICB9ID0gYXdhaXQgcHJvdmlkZUFsbChiYWdnYWdlLCB7XG4gKiAgICAgICBpbnZpdGF0aW9uSXNzdWVyOiAoKSA9PiBpbnZpdGF0aW9uSXNzdWVyUCxcbiAqICAgICAgIGludml0YXRpb25CcmFuZDogKCkgPT4gRShpbnZpdGF0aW9uSXNzdWVyUCkuZ2V0QnJhbmQoKSxcbiAqICAgICB9KTtcbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsICgpID0+IEVSZWY8YW55Pj59IFQgZGljdCBvZiB0aHVua3MgKHByb21pc2UgbWFrZXJzKVxuICogQHBhcmFtIHtNYXBTdG9yZTxzdHJpbmcsIGFueT59IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7VH0gdGh1bmtzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7IFtLIGluIGtleW9mIFRdOiBBd2FpdGVkPFJldHVyblR5cGU8VFtLXT4+IH0+fVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUFsbD0oYmFnZ2FnZSx0aHVua3MpPT57XG5jb25zdCBrZXlzPU9iamVjdC5rZXlzKHRodW5rcyk7XG4vKiBhc3N1bWUgaWYgYW55IGtleXMgYXJlIGRlZmluZWQgdGhleSBhbGwgYXJlKi9cbmNvbnN0IGluQmFnZ2FnZT1iYWdnYWdlLmhhcyhrZXlzWzBdKTtcbmlmKGluQmFnZ2FnZSl7XG5jb25zdCBvYmo9b2JqZWN0TWFwKFxudGh1bmtzLFxuLyoqIEB0eXBlIHsodmFsdWU6IGFueSwga2V5OiBzdHJpbmcpID0+IGFueX0gKi9cbihfLGspPT5iYWdnYWdlLmdldChrKSk7XG5cbnJldHVybiBQcm9taXNlLnJlc29sdmUoaGFyZGVuKG9iaikpO1xuIH1cblxuY29uc3Qga2V5ZWRQcm9taXNlcz1vYmplY3RNYXAodGh1bmtzLChmbik9PmZuKCkpO1xuXG5yZXR1cm4gYWxsVmFsdWVzKGtleWVkUHJvbWlzZXMpLnRoZW4oKGtleWVkVmFscyk9PntcbmZvcihjb25zdFtrLHZdb2YgT2JqZWN0LmVudHJpZXMoa2V5ZWRWYWxzKSl7XG5iYWdnYWdlLmluaXQoayx2KTtcbiB9XG5yZXR1cm4ga2V5ZWRWYWxzO1xuIH0pO1xuIH07JGjigI1fb25jZS5wcm92aWRlQWxsKHByb3ZpZGVBbGwpO1xuaGFyZGVuKHByb3ZpZGVBbGwpO1xuXG4vKipcbiAqIExpa2UgcHJvdmlkZUFzeW5jIGluIEF0b21pY1Byb3ZpZGVyIGJ1dCBhc3N1bWVzIG9ubHkgb25lIGNhbGwgc28gdGhlcmUgYXJlIG5vIHJhY2UgY29uZGl0aW9ucy5cbiAqIEFkZGl0aW9uYWxseSBvZmZlcnMgYSBgd2l0aFZhbHVlYCBoZWxwZXIgdXNlZnVsIGZvciB0cmlnZ2VyaW5nIHByb2Nlc2VzcyBvbiBhIHByb3ZpZGVkIG9iamVjdC5cbiAqXG4gKiBAc2VlIHttYWtlQXRvbWljUHJvdmlkZXJ9XG4gKiBAc2VlIHtBdG9taWNQcm92aWRlcn1cbiAqIEB0ZW1wbGF0ZSB7KCkgPT4gRVJlZjxhbnk+fSBUXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBtYXBTdG9yZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHBhcmFtIHtUfSBtYWtlVmFsdWVcbiAqIEBwYXJhbSB7KHZhbHVlOiBBd2FpdGVkPFJldHVyblR5cGU8VD4+KSA9PiB2b2lkfSBbd2l0aFZhbHVlXVxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj59XG4gKi9cbmNvbnN0ICAgICAgICBwcm92aWRlU2luZ2xldG9uPShtYXBTdG9yZSxrZXksbWFrZVZhbHVlLHdpdGhWYWx1ZSk9PntcbmNvbnN0IHN0b3JlZD1tYXBTdG9yZS5oYXMoa2V5KT9cbnVuZGVmaW5lZDpcbkUud2hlbihtYWtlVmFsdWUoKSwodik9Pm1hcFN0b3JlLmluaXQoa2V5LGhhcmRlbih2KSkpO1xuXG5yZXR1cm4gRS53aGVuKHN0b3JlZCwoKT0+e1xuY29uc3QgdmFsdWU9bWFwU3RvcmUuZ2V0KGtleSk7XG5pZih3aXRoVmFsdWUpe1xud2l0aFZhbHVlKHZhbHVlKTtcbiB9XG5yZXR1cm4gdmFsdWU7XG4gfSk7XG4gfTskaOKAjV9vbmNlLnByb3ZpZGVTaW5nbGV0b24ocHJvdmlkZVNpbmdsZXRvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVwaGVtZXJhUHJvdmlkZXIiOlsibWFrZUVwaGVtZXJhUHJvdmlkZXIiXSwicHJvdmlkZUVtcHR5U2VhdCI6WyJwcm92aWRlRW1wdHlTZWF0Il0sInByb3ZpZGVBbGwiOlsicHJvdmlkZUFsbCJdLCJwcm92aWRlU2luZ2xldG9uIjpbInByb3ZpZGVTaW5nbGV0b24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAX479dt8JAADfCQAAMAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2JvbmRpbmdDdXJ2ZXMuanMiLCIuL3NhZmVNYXRoLmpzIiwiLi9zdGF0ZU1hY2hpbmUuanMiLCIuL2F0b21pY1RyYW5zZmVyLmpzIiwiLi96b2VIZWxwZXJzLmpzIiwiLi9yYXRpby5qcyIsIi4vZHVyYWJpbGl0eS5qcyIsIi4vcHJpY2VBdXRob3JpdHkuanMiLCIuL3ByaWNlUXVvdGUuanMiLCIuL3N0YXRpc3RpY3MuanMiLCIuL3JlY29yZGVyLmpzIiwiLi90b3BpY3MuanMiXSwiZXhwb3J0cyI6WyJhdG9taWNUcmFuc2ZlciIsImF0b21pY1RyYW5zZmVyIiwiZ2V0T3V0cHV0UHJpY2UiLCJnZXRPdXRwdXRQcmljZSIsIm1ha2VSYXRpb0Zyb21BbW91bnRzIiwibWFrZVJhdGlvRnJvbUFtb3VudHMiLCJzd2FwIiwic3dhcCIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vZHVyYWJpbGl0eS5qcyIsIi4vcHJpY2VBdXRob3JpdHkuanMiLCIuL3ByaWNlUXVvdGUuanMiLCIuL3JlY29yZGVyLmpzIiwiLi9zdGF0aXN0aWNzLmpzIiwiLi90b3BpY3MuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2JvbmRpbmdDdXJ2ZXMuanNcIiwgW11dLFtcIi4vc2FmZU1hdGguanNcIiwgW11dLFtcIi4vc3RhdGVNYWNoaW5lLmpzXCIsIFtdXSxbXCIuL2F0b21pY1RyYW5zZmVyLmpzXCIsIFtdXSxbXCIuL3pvZUhlbHBlcnMuanNcIiwgW11dLFtcIi4vcmF0aW8uanNcIiwgW11dLFtcIi4vZHVyYWJpbGl0eS5qc1wiLCBbXV0sW1wiLi9wcmljZUF1dGhvcml0eS5qc1wiLCBbXV0sW1wiLi9wcmljZVF1b3RlLmpzXCIsIFtdXSxbXCIuL3N0YXRpc3RpY3MuanNcIiwgW11dLFtcIi4vcmVjb3JkZXIuanNcIiwgW11dLFtcIi4vdG9waWNzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vYm9uZGluZ0N1cnZlcy5qcyI6W1siZ2V0SW5wdXRQcmljZSIsImdldElucHV0UHJpY2UiXSxbImdldE91dHB1dFByaWNlIiwiZ2V0T3V0cHV0UHJpY2UiXSxbImNhbGNMaXFWYWx1ZVRvTWludCIsImNhbGNMaXFWYWx1ZVRvTWludCJdLFsiY2FsY1ZhbHVlVG9SZW1vdmUiLCJjYWxjVmFsdWVUb1JlbW92ZSJdLFsiY2FsY1NlY29uZGFyeVJlcXVpcmVkIiwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIl1dLCIuL3NhZmVNYXRoLmpzIjpbWyJuYXRTYWZlTWF0aCIsIm5hdFNhZmVNYXRoIl1dLCIuL3N0YXRlTWFjaGluZS5qcyI6W1sibWFrZVN0YXRlTWFjaGluZSIsIm1ha2VTdGF0ZU1hY2hpbmUiXV0sIi4vYXRvbWljVHJhbnNmZXIuanMiOltbImF0b21pY1JlYXJyYW5nZSIsImF0b21pY1JlYXJyYW5nZSJdLFsiYXRvbWljVHJhbnNmZXIiLCJhdG9taWNUcmFuc2ZlciJdLFsiZnJvbU9ubHkiLCJmcm9tT25seSJdLFsidG9Pbmx5IiwidG9Pbmx5Il1dLCIuL3pvZUhlbHBlcnMuanMiOltbImRlZmF1bHRBY2NlcHRhbmNlTXNnIiwiZGVmYXVsdEFjY2VwdGFuY2VNc2ciXSxbInN3YXAiLCJzd2FwIl0sWyJmaXRQcm9wb3NhbFNoYXBlIiwiZml0UHJvcG9zYWxTaGFwZSJdLFsiYXNzZXJ0UHJvcG9zYWxTaGFwZSIsImFzc2VydFByb3Bvc2FsU2hhcGUiXSxbImFzc2VydElzc3VlcktleXdvcmRzIiwiYXNzZXJ0SXNzdWVyS2V5d29yZHMiXSxbInNhdGlzZmllcyIsInNhdGlzZmllcyJdLFsiYXNzZXJ0TmF0QXNzZXRLaW5kIiwiYXNzZXJ0TmF0QXNzZXRLaW5kIl0sWyJzd2FwRXhhY3QiLCJzd2FwRXhhY3QiXSxbImRlcG9zaXRUb1NlYXQiLCJkZXBvc2l0VG9TZWF0Il0sWyJ3aXRoZHJhd0Zyb21TZWF0Iiwid2l0aGRyYXdGcm9tU2VhdCJdLFsic2F2ZUFsbElzc3VlcnMiLCJzYXZlQWxsSXNzdWVycyJdLFsib2ZmZXJUbyIsIm9mZmVyVG8iXV0sIi4vcmF0aW8uanMiOltbIm1ha2VSYXRpbyIsIm1ha2VSYXRpbyJdLFsibWFrZVJhdGlvRnJvbUFtb3VudHMiLCJtYWtlUmF0aW9Gcm9tQW1vdW50cyJdLFsiZmxvb3JNdWx0aXBseUJ5IiwiZmxvb3JNdWx0aXBseUJ5Il0sWyJmbG9vckRpdmlkZUJ5IiwiZmxvb3JEaXZpZGVCeSJdLFsiY2VpbE11bHRpcGx5QnkiLCJjZWlsTXVsdGlwbHlCeSJdLFsiY2VpbERpdmlkZUJ5IiwiY2VpbERpdmlkZUJ5Il0sWyJhc3NlcnRJc1JhdGlvIiwiYXNzZXJ0SXNSYXRpbyJdLFsiaW52ZXJ0UmF0aW8iLCJpbnZlcnRSYXRpbyJdLFsib25lTWludXMiLCJvbmVNaW51cyJdLFsiYWRkUmF0aW9zIiwiYWRkUmF0aW9zIl0sWyJtdWx0aXBseVJhdGlvcyIsIm11bHRpcGx5UmF0aW9zIl0sWyJyYXRpb3NTYW1lIiwicmF0aW9zU2FtZSJdLFsicXVhbnRpemUiLCJxdWFudGl6ZSJdLFsicmF0aW9HVEUiLCJyYXRpb0dURSJdLFsic3VidHJhY3RSYXRpb3MiLCJzdWJ0cmFjdFJhdGlvcyJdLFsicmF0aW9Ub051bWJlciIsInJhdGlvVG9OdW1iZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALynJ6+1KwAAtSsAADkAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2Fzc2VydCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3RpbWUiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiUHJpY2VBdXRob3JpdHlJIiwibWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLGFzc2VydCxxLEZhaWwsbWFrZVByb21pc2VLaXQsQW1vdW50TWF0aCxBbW91bnRTaGFwZSxCcmFuZFNoYXBlLG1ha2VOb3RpZmllcixtYWtlVHJhY2VyLFRpbWVzdGFtcFNoYXBlLE07JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dLFtcIkFtb3VudFNoYXBlXCIsIFskaOKAjV9hID0+IChBbW91bnRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiQnJhbmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQnJhbmRTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlTm90aWZpZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VOb3RpZmllciA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJtYWtlVHJhY2VyXCIsIFskaOKAjV9hID0+IChtYWtlVHJhY2VyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXRcIn0pOyRo4oCNX29uY2UubWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0KG1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgdHJhY2U9bWFrZVRyYWNlcignUEEnLGZhbHNlKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQ29tcGFyZUFtb3VudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudExpbWl0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKiogQHR5cGUge0NvbXBhcmVBbW91bnR9ICovXG5jb25zdCBpc0xUPShhbW91bnQsYW1vdW50TGltaXQpPT4hQW1vdW50TWF0aC5pc0dURShhbW91bnQsYW1vdW50TGltaXQpO1xuXG4vKiogQHR5cGUge0NvbXBhcmVBbW91bnR9ICovXG5jb25zdCBpc0xURT0oYW1vdW50LGFtb3VudExpbWl0KT0+QW1vdW50TWF0aC5pc0dURShhbW91bnRMaW1pdCxhbW91bnQpO1xuXG4vKiogQHR5cGUge0NvbXBhcmVBbW91bnR9ICovXG5jb25zdCBpc0dURT0oYW1vdW50LGFtb3VudExpbWl0KT0+QW1vdW50TWF0aC5pc0dURShhbW91bnQsYW1vdW50TGltaXQpO1xuXG4vKiogQHR5cGUge0NvbXBhcmVBbW91bnR9ICovXG5jb25zdCBpc0dUPShhbW91bnQsYW1vdW50TGltaXQpPT4hQW1vdW50TWF0aC5pc0dURShhbW91bnRMaW1pdCxhbW91bnQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBUcmlnZ2VyXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGVDcmVhdGV9IGNyZWF0ZUluc3RhbnRRdW90ZVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cblxuY29uc3QgR3VhcmRDYWxsQW1vdW50VHVwbGU9TS5jYWxsKEFtb3VudFNoYXBlLEFtb3VudFNoYXBlKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpO1xuXG5jb25zdCAgICAgICAgUHJpY2VBdXRob3JpdHlJPU0uaW50ZXJmYWNlKCdQcmljZUF1dGhvcml0eScse1xuZ2V0UXVvdGVJc3N1ZXI6TS5jYWxsKEJyYW5kU2hhcGUsQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRUaW1lclNlcnZpY2U6TS5jYWxsKEJyYW5kU2hhcGUsQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG5xdW90ZUdpdmVuOk0uY2FsbChBbW91bnRTaGFwZSxCcmFuZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnF1b3RlV2FudGVkOk0uY2FsbChCcmFuZFNoYXBlLEFtb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm1ha2VRdW90ZU5vdGlmaWVyOk0uY2FsbChBbW91bnRTaGFwZSxCcmFuZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnF1b3RlQXRUaW1lOk0uY2FsbChUaW1lc3RhbXBTaGFwZSxBbW91bnRTaGFwZSxCcmFuZFNoYXBlKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpLFxuXG5xdW90ZVdoZW5MVDpHdWFyZENhbGxBbW91bnRUdXBsZSxcbnF1b3RlV2hlbkxURTpHdWFyZENhbGxBbW91bnRUdXBsZSxcbnF1b3RlV2hlbkdURTpHdWFyZENhbGxBbW91bnRUdXBsZSxcbnF1b3RlV2hlbkdUOkd1YXJkQ2FsbEFtb3VudFR1cGxlLFxubXV0YWJsZVF1b3RlV2hlbkxUOkd1YXJkQ2FsbEFtb3VudFR1cGxlLFxubXV0YWJsZVF1b3RlV2hlbkxURTpHdWFyZENhbGxBbW91bnRUdXBsZSxcbm11dGFibGVRdW90ZVdoZW5HVEU6R3VhcmRDYWxsQW1vdW50VHVwbGUsXG5tdXRhYmxlUXVvdGVXaGVuR1Q6R3VhcmRDYWxsQW1vdW50VHVwbGV9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge0lzc3Vlcjwnc2V0Jz59IG9wdHMucXVvdGVJc3N1ZXJcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjx1bmtub3duPj59IG9wdHMubm90aWZpZXJcbiAqIEBwYXJhbSB7RVJlZjxYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlPn0gb3B0cy50aW1lclxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSBvcHRzLmNyZWF0ZVF1b3RlXG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gb3B0cy5hY3R1YWxCcmFuZEluXG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gb3B0cy5hY3R1YWxCcmFuZE91dFxuICogQHJldHVybnMge1ByaWNlQXV0aG9yaXR5S2l0fVxuICovJGjigI1fb25jZS5QcmljZUF1dGhvcml0eUkoUHJpY2VBdXRob3JpdHlJKTtcbmZ1bmN0aW9uICAgICAgICBtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQob3B0cyl7XG5jb25zdHtcbnRpbWVyLFxuY3JlYXRlUXVvdGUsXG5hY3R1YWxCcmFuZEluLFxuYWN0dWFsQnJhbmRPdXQsXG5xdW90ZUlzc3Vlcixcbm5vdGlmaWVyfT1cbm9wdHM7XG5cbmxldCBoYXZlRmlyc3RRdW90ZT1mYWxzZTtcblxuRShub3RpZmllcikuXG5nZXRVcGRhdGVTaW5jZSgpLlxudGhlbigoXyk9PmhhdmVGaXJzdFF1b3RlPXRydWUpO1xuXG4vKiogQHR5cGUge1NldDxUcmlnZ2VyPn0gKi9cbmNvbnN0IHRyaWdnZXJzPW5ldyBTZXQoKTtcbmNvbnN0IG11dGFibGVUcmlnZ2Vycz1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSB0cmlnZ2VyQ3JlYXRlUXVvdGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5jb25zdCBmaXJlVHJpZ2dlcnM9YXN5bmModHJpZ2dlckNyZWF0ZVF1b3RlKT0+e1xuaWYoIWhhdmVGaXJzdFF1b3RlKXtcbnJldHVybjtcbiB9XG5hd2FpdCBQcm9taXNlLmFsbChcblsuLi50cmlnZ2VycywuLi5BcnJheS5mcm9tKG11dGFibGVUcmlnZ2Vycy52YWx1ZXMoKSldLm1hcCgodHJpZ2dlcik9PlxudHJpZ2dlcih0cmlnZ2VyQ3JlYXRlUXVvdGUpKSk7XG5cblxuIH07XG5cbi8qKlxuICogQ3JlYXRlIGEgcXVvdGVXaGVuKiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbXBhcmVBbW91bnR9IGNvbXBhcmVBbW91bnRzRm5cbiAqL1xuY29uc3QgbWFrZVF1b3RlV2hlbk91dD0oY29tcGFyZUFtb3VudHNGbik9PlxuLyoqXG4gKiBSZXR1cm4gYSBxdW90ZSB3aGVuIHRyaWdnZXJXaGVuIGlzIHRydWUgb2YgdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudEluIHRoZSBpbnB1dCB2YWx1ZSB0byB0aGUgY2FsY0Ftb3VudFRyaWdnZXJcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRPdXRMaW1pdCB0aGUgdmFsdWUgdG8gY29tcGFyZSB3aXRoIHRoZSBvdXRwdXRcbiAqIG9mIGNhbGNBbW91bnRUcmlnZ2VyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHF1b3RlV2hlbk91dFRyaWdnZXIoYW1vdW50SW4sYW1vdW50T3V0TGltaXQpe1xuYW1vdW50SW49QW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbixhbW91bnRJbik7XG5hbW91bnRPdXRMaW1pdD1BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCxhbW91bnRPdXRMaW1pdCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gKi9cbmNvbnN0IHRyaWdnZXJQSz1tYWtlUHJvbWlzZUtpdCgpO1xuXG4vKiogQHR5cGUge1ByaWNlUXVvdGVUcmlnZ2VyfSAqL1xuY29uc3QgdHJpZ2dlcj1hc3luYyhjcmVhdGVJbnN0YW50UXVvdGUpPT57XG50cnl7XG5jb25zdCBxdW90ZVA9Y3JlYXRlSW5zdGFudFF1b3RlKChjYWxjQW1vdW50T3V0KT0+e1xuaWYoIXRyaWdnZXJzLmhhcyh0cmlnZ2VyKSl7XG4vKiBBbHJlYWR5IGZpcmVkLiovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IGFtb3VudE91dD1jYWxjQW1vdW50T3V0KGFtb3VudEluKTtcblxuaWYoIWNvbXBhcmVBbW91bnRzRm4oYW1vdW50T3V0LGFtb3VudE91dExpbWl0KSl7XG4vKiBEb24ndCBmaXJlIHRoZSB0cmlnZ2VyIHlldC4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5cbi8qIEdlbmVyYXRlIHRoZSBxdW90ZS4qL1xucmV0dXJue2Ftb3VudEluLGFtb3VudE91dH07XG4gfSk7XG5cbmlmKCFxdW90ZVApe1xuLyogV2Ugc2hvdWxkbid0IHJlc29sdmUgeWV0LiovXG5yZXR1cm47XG4gfVxuXG50cmlnZ2Vycy5kZWxldGUodHJpZ2dlcik7XG50cmlnZ2VyUEsucmVzb2x2ZShxdW90ZVApO1xuIH1jYXRjaChlKXtcbi8qIFRyaWdnZXIgZmFpbGVkLCBzbyByZWplY3QgYW5kIGRyb3AuKi9cbnRyaWdnZXJQSy5yZWplY3QoZSk7XG50cmlnZ2Vycy5kZWxldGUodHJpZ2dlcik7XG4gfVxuIH07XG5cbnRyaWdnZXJzLmFkZCh0cmlnZ2VyKTtcblxuLyogRmlyZSBub3csIGp1c3QgaW4gY2FzZS4qL1xuYXdhaXQgdHJpZ2dlcihjcmVhdGVRdW90ZSk7XG5cbnJldHVybiB0cmlnZ2VyUEsucHJvbWlzZTtcbiB9O1xuXG4vKipcbiAqIENyZWF0ZSBhIG11dGFibGVRdW90ZVdoZW4qIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29tcGFyZUFtb3VudH0gY29tcGFyZUFtb3VudHNGblxuICovXG5jb25zdCBtYWtlTXV0YWJsZVF1b3RlPShjb21wYXJlQW1vdW50c0ZuKT0+XG4vKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50SW5cbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50T3V0TGltaXRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbXV0YWJsZVF1b3RlV2hlbk91dFRyaWdnZXIoYW1vdW50SW4sYW1vdW50T3V0TGltaXQpe1xuQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbixhbW91bnRJbik7XG5BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCxhbW91bnRPdXRMaW1pdCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gKi9cbmNvbnN0IHRyaWdnZXJQSz1tYWtlUHJvbWlzZUtpdCgpO1xuXG4vKiogQHR5cGUge011dGFibGVRdW90ZX0gKi9cbmNvbnN0IG11dGFibGVRdW90ZT1GYXIoJ011dGFibGVRdW90ZScse1xuY2FuY2VsOihlKT0+dHJpZ2dlclBLLnJlamVjdChlKSxcbnVwZGF0ZUxldmVsOihuZXdBbW91bnRJbixuZXdBbW91bnRPdXRMaW1pdCk9PntcbmNvbnN0IGNvZXJjZWRBbW91bnRJbj1BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLG5ld0Ftb3VudEluKTtcbmNvbnN0IGNvZXJjZWRBbW91bnRPdXRMaW1pdD1BbW91bnRNYXRoLmNvZXJjZShcbmFjdHVhbEJyYW5kT3V0LFxubmV3QW1vdW50T3V0TGltaXQpO1xuXG5hbW91bnRJbj1jb2VyY2VkQW1vdW50SW47XG5hbW91bnRPdXRMaW1pdD1jb2VyY2VkQW1vdW50T3V0TGltaXQ7XG5maXJlVHJpZ2dlcnMoY3JlYXRlUXVvdGUpO1xuIH0sXG5nZXRQcm9taXNlOigpPT50cmlnZ2VyUEsucHJvbWlzZX0pO1xuXG5cbi8qKiBAdHlwZSB7UHJpY2VRdW90ZVRyaWdnZXJ9ICovXG5jb25zdCBtdXRhYmxlVHJpZ2dlcj1hc3luYyhjcmVhdGVJbnN0YW50UXVvdGUpPT57XG50cnl7XG5jb25zdCBxdW90ZVA9Y3JlYXRlSW5zdGFudFF1b3RlKChjYWxjQW1vdW50T3V0KT0+e1xuaWYoIW11dGFibGVUcmlnZ2Vycy5oYXMobXV0YWJsZVF1b3RlKSl7XG4vKiBBbHJlYWR5IGZpcmVkLiovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IGFtb3VudE91dD1jYWxjQW1vdW50T3V0KGFtb3VudEluKTtcblxuaWYoIWNvbXBhcmVBbW91bnRzRm4oYW1vdW50T3V0LGFtb3VudE91dExpbWl0KSl7XG4vKiBEb24ndCBmaXJlIHRoZSBtdXRhYmxlVHJpZ2dlciB5ZXQuKi9cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuXG4vKiBHZW5lcmF0ZSB0aGUgcXVvdGUuKi9cbnJldHVybnthbW91bnRJbixhbW91bnRPdXR9O1xuIH0pO1xuXG5pZighcXVvdGVQKXtcbi8qIFdlIHNob3VsZG4ndCByZXNvbHZlIHlldC4qL1xucmV0dXJuO1xuIH1cblxubXV0YWJsZVRyaWdnZXJzLmRlbGV0ZShtdXRhYmxlUXVvdGUpO1xudHJpZ2dlclBLLnJlc29sdmUocXVvdGVQKTtcbiB9Y2F0Y2goZSl7XG4vKiBUcmlnZ2VyIGZhaWxlZCwgc28gcmVqZWN0IGFuZCBkcm9wLiovXG50cmlnZ2VyUEsucmVqZWN0KGUpO1xubXV0YWJsZVRyaWdnZXJzLmRlbGV0ZShtdXRhYmxlUXVvdGUpO1xuIH1cbiB9O1xuXG5tdXRhYmxlVHJpZ2dlcnMuc2V0KG11dGFibGVRdW90ZSxtdXRhYmxlVHJpZ2dlcik7XG5cbi8qIEZpcmUgbm93LCBqdXN0IGluIGNhc2UuKi9cbmF3YWl0IG11dGFibGVUcmlnZ2VyKGNyZWF0ZVF1b3RlKTtcblxucmV0dXJuIG11dGFibGVRdW90ZTtcbiB9O1xuXG4vKipcbiAqIEVuc3VyZSB0aGF0IHRoZSBicmFuZEluL2JyYW5kT3V0IHBhaXIgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kSW5cbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kT3V0XG4gKi9cbmNvbnN0IGFzc2VydEJyYW5kcz0oYnJhbmRJbixicmFuZE91dCk9PntcbmJyYW5kSW49PT1hY3R1YWxCcmFuZElufHxcbkZhaWwgYERlc2lyZWQgYnJhbmRJbiAke3EoYnJhbmRJbil9IG11c3QgbWF0Y2ggJHtxKGFjdHVhbEJyYW5kSW4pfWA7XG5icmFuZE91dD09PWFjdHVhbEJyYW5kT3V0fHxcbkZhaWwgYERlc2lyZWQgYnJhbmRPdXQgJHtxKGJyYW5kT3V0KX0gbXVzdCBtYXRjaCAke3EoYWN0dWFsQnJhbmRPdXQpfWA7XG4gfTtcblxuLyoqIEB0eXBlIHtQcmljZUF1dGhvcml0eX0gKi9cbmNvbnN0IHByaWNlQXV0aG9yaXR5PUZhcignUHJpY2VBdXRob3JpdHknLHtcbmdldFF1b3RlSXNzdWVyKGJyYW5kSW4sYnJhbmRPdXQpe1xuYXNzZXJ0QnJhbmRzKGJyYW5kSW4sYnJhbmRPdXQpO1xucmV0dXJuIHF1b3RlSXNzdWVyO1xuIH0sXG5nZXRUaW1lclNlcnZpY2UoYnJhbmRJbixicmFuZE91dCl7XG5hc3NlcnRCcmFuZHMoYnJhbmRJbixicmFuZE91dCk7XG5yZXR1cm4gdGltZXI7XG4gfSxcbm1ha2VRdW90ZU5vdGlmaWVyKGFtb3VudEluLGJyYW5kT3V0KXtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLGJyYW5kT3V0KTtcblxuLyogV3JhcCBvdXIgdW5kZXJseWluZyBub3RpZmllciB3aXRoIHNwZWNpZmljIHF1b3Rlcy4qL1xuY29uc3Qgc3BlY2lmaWNCYXNlTm90aWZpZXI9aGFyZGVuKHtcbiAgICAgIGFzeW5jIGdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PXVuZGVmaW5lZCl7XG4vKiBXZSB1c2UgdGhlIHNhbWUgdXBkYXRlQ291bnQgYXMgb3VyIHVuZGVybHlpbmcgbm90aWZpZXIuKi9cbmNvbnN0IHJlY29yZD1hd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG5cbi8qIFdlIGNyZWF0ZSBhIHF1b3RlIGlubGluZS4qL1xuY29uc3QgcXVvdGU9Y3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQpPT4oe1xuYW1vdW50SW4sXG5hbW91bnRPdXQ6Y2FsY0Ftb3VudE91dChhbW91bnRJbil9KSk7XG5cbmlmKCFxdW90ZSl7XG50aHJvdyBGYWlsIGBjcmVhdGVRdW90ZSByZXR1cm5lZCBmYWxzZXlgO1xuIH1cblxuY29uc3QgdmFsdWU9YXdhaXQgcXVvdGU7XG5yZXR1cm4gaGFyZGVuKHtcbnZhbHVlLFxudXBkYXRlQ291bnQ6cmVjb3JkLnVwZGF0ZUNvdW50fSk7XG5cbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtOb3RpZmllcjxQcmljZVF1b3RlPn0gKi9cbmNvbnN0IHNwZWNpZmljTm90aWZpZXI9RmFyKCdRdW90ZU5vdGlmaWVyJyx7XG4uLi5tYWtlTm90aWZpZXIoc3BlY2lmaWNCYXNlTm90aWZpZXIpLFxuLyogVE9ETyBzdG9wIGV4cG9zaW5nIGJhc2VOb3RpZmllciBtZXRob2RzIGRpcmVjdGx5LiovXG4uLi5zcGVjaWZpY0Jhc2VOb3RpZmllcn0pO1xuXG5yZXR1cm4gc3BlY2lmaWNOb3RpZmllcjtcbiB9LFxuICAgICAgYXN5bmMgcXVvdGVHaXZlbihhbW91bnRJbixicmFuZE91dCl7XG50cmFjZSgncXVvdGVHaXZlbicsYW1vdW50SW4sYnJhbmRPdXQpO1xuQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbixhbW91bnRJbik7XG5hc3NlcnRCcmFuZHMoYW1vdW50SW4uYnJhbmQsYnJhbmRPdXQpO1xuXG5hd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSgpO1xuY29uc3QgcXVvdGU9Y3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQpPT4oe1xuYW1vdW50SW4sXG5hbW91bnRPdXQ6Y2FsY0Ftb3VudE91dChhbW91bnRJbil9KSk7XG5cbmFzc2VydChxdW90ZSk7XG5yZXR1cm4gcXVvdGU7XG4gfSxcbiAgICAgIGFzeW5jIHF1b3RlV2FudGVkKGJyYW5kSW4sYW1vdW50T3V0KXtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kT3V0LGFtb3VudE91dCk7XG5hc3NlcnRCcmFuZHMoYnJhbmRJbixhbW91bnRPdXQuYnJhbmQpO1xuXG5hd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSgpO1xuY29uc3QgcXVvdGU9Y3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQsY2FsY0Ftb3VudEluKT0+e1xuLyogV2UgbmVlZCB0byBkZXRlcm1pbmUgYW4gYW1vdW50SW4gdGhhdCBndWFyYW50ZWVzIGF0IGxlYXN0IHRoZSBhbW91bnRPdXQuKi9cbmNvbnN0IGFtb3VudEluPWNhbGNBbW91bnRJbihhbW91bnRPdXQpO1xuY29uc3QgYWN0dWFsQW1vdW50T3V0PWNhbGNBbW91bnRPdXQoYW1vdW50SW4pO1xuQW1vdW50TWF0aC5pc0dURShhY3R1YWxBbW91bnRPdXQsYW1vdW50T3V0KXx8XG5GYWlsIGBDYWxjdWxhdGlvbiBvZiAke2FjdHVhbEFtb3VudE91dH0gZGlkbid0IGNvdmVyIGV4cGVjdGVkICR7YW1vdW50T3V0fWA7XG5yZXR1cm57YW1vdW50SW4sYW1vdW50T3V0fTtcbiB9KTtcbmFzc2VydChxdW90ZSk7XG5yZXR1cm4gcXVvdGU7XG4gfSxcbiAgICAgIGFzeW5jIHF1b3RlQXRUaW1lKGRlYWRsaW5lLGFtb3VudEluLGJyYW5kT3V0KXtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLGJyYW5kT3V0KTtcblxuYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbmNvbnN0IHF1b3RlUEs9bWFrZVByb21pc2VLaXQoKTtcbmF3YWl0IEUodGltZXIpLnNldFdha2V1cChcbmRlYWRsaW5lLFxuRmFyKCd3YWtlT2JqJyx7XG4gICAgICBhc3luYyB3YWtlKHRpbWVzdGFtcCl7XG5hd2FpdCBudWxsO1xudHJ5e1xuY29uc3QgcXVvdGVQPWNyZWF0ZVF1b3RlKChjYWxjQW1vdW50T3V0KT0+KHtcbmFtb3VudEluLFxuYW1vdW50T3V0OmNhbGNBbW91bnRPdXQoYW1vdW50SW4pLFxudGltZXN0YW1wfSkpO1xuXG5cbi8qIFdlIGRvbid0IHdhaXQgZm9yIHRoZSBxdW90ZSB0byBiZSBhdXRoZW50aWNhdGVkOyByZXNvbHZlKi9cbi8qIGltbWVkaWF0ZWx5LiovXG5xdW90ZVBLLnJlc29sdmUocXVvdGVQKTtcbmF3YWl0IHF1b3RlUEsucHJvbWlzZTtcbiB9Y2F0Y2goZSl7XG5xdW90ZVBLLnJlamVjdChlKTtcbiB9XG4gfX0pKTtcblxuXG5cbi8qIFdhaXQgdW50aWwgdGhlIHdha2V1cCBwYXNzZXMuKi9cbnJldHVybiBxdW90ZVBLLnByb21pc2U7XG4gfSxcbnF1b3RlV2hlbkxUOm1ha2VRdW90ZVdoZW5PdXQoaXNMVCksXG5xdW90ZVdoZW5MVEU6bWFrZVF1b3RlV2hlbk91dChpc0xURSksXG5xdW90ZVdoZW5HVEU6bWFrZVF1b3RlV2hlbk91dChpc0dURSksXG5xdW90ZVdoZW5HVDptYWtlUXVvdGVXaGVuT3V0KGlzR1QpLFxubXV0YWJsZVF1b3RlV2hlbkxUOm1ha2VNdXRhYmxlUXVvdGUoaXNMVCksXG5tdXRhYmxlUXVvdGVXaGVuTFRFOm1ha2VNdXRhYmxlUXVvdGUoaXNMVEUpLFxubXV0YWJsZVF1b3RlV2hlbkdUOm1ha2VNdXRhYmxlUXVvdGUoaXNHVCksXG5tdXRhYmxlUXVvdGVXaGVuR1RFOm1ha2VNdXRhYmxlUXVvdGUoaXNHVEUpfSk7XG5cblxucmV0dXJue3ByaWNlQXV0aG9yaXR5LGFkbWluRmFjZXQ6e2ZpcmVUcmlnZ2Vyc319O1xuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQcmljZUF1dGhvcml0eUkiOlsiUHJpY2VBdXRob3JpdHlJIl0sIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCI6WyJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtqXd8vQIAAD0CAAANQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBlbmRvL25hdCIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJnZXRBbW91bnRJbiIsImdldEFtb3VudE91dCIsImdldFByaWNlRGVzY3JpcHRpb24iLCJnZXRUaW1lc3RhbXAiLCJ1bml0QW1vdW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudE1hdGgsTmF0LEU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyogUHJpY2VBdXRob3JpdGllcyByZXR1cm4gcXVvdGVzIGFzIGEgcGFpciBvZiBhbiBhbW91bnQgYW5kIGEgcGF5bWVudCwgYm90aCovXG4vKiB3aXRoIHRoZSBzYW1lIHZhbHVlLiBUaGUgdW5kZXJseWluZyBhbW91bnQgd3JhcHMgYW1vdW50SW4sIGFtb3VudE91dCwgdGltZXIqL1xuLyogYW5kIHRpbWVzdGFtcC4gVGhlIHBheW1lbnQgaXMgaXNzdWVkIGJ5IHRoZSBxdW90ZUlzc3VlciB0byBzdXBwb3J0IHZlcmFjaXR5Ki9cbi8qIGNoZWNraW5nLiBUaGVzZSBoZWxwZXJzIG1ha2UgaXQgZWFzaWVyIHRvIGV4dHJhY3QgdGhlIGNvbXBvbmVudHMgb2YgdGhlIFF1b3RlKi9cblxuLyoqXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGV9IHF1b3RlXG4gKiBAcmV0dXJucyB7UHJpY2VEZXNjcmlwdGlvbn1cbiAqL1xuY29uc3QgICAgICAgIGdldFByaWNlRGVzY3JpcHRpb249KHF1b3RlKT0+e1xucXVvdGUucXVvdGVBbW91bnQudmFsdWUubGVuZ3RoPT09MXx8XG5GYWlsIGBxdW90ZUFtb3VudCBzZXQgbXVzdCBoYXZlIG9uZSBtZW1iZXJgO1xucmV0dXJuIHF1b3RlLnF1b3RlQW1vdW50LnZhbHVlWzBdO1xuIH07XG5cbi8qKiBAcGFyYW0ge1ByaWNlUXVvdGV9IHF1b3RlICovJGjigI1fb25jZS5nZXRQcmljZURlc2NyaXB0aW9uKGdldFByaWNlRGVzY3JpcHRpb24pO1xuY29uc3QgICAgICAgIGdldEFtb3VudEluPShxdW90ZSk9PmdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLmFtb3VudEluO1xuLyoqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGUgKi8kaOKAjV9vbmNlLmdldEFtb3VudEluKGdldEFtb3VudEluKTtcbmNvbnN0ICAgICAgICBnZXRBbW91bnRPdXQ9KHF1b3RlKT0+Z2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkuYW1vdW50T3V0O1xuLyoqIEB0eXBlIHsocXVvdGU6IFByaWNlUXVvdGUpID0+IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXB9ICovJGjigI1fb25jZS5nZXRBbW91bnRPdXQoZ2V0QW1vdW50T3V0KTtcbmNvbnN0ICAgICAgICBnZXRUaW1lc3RhbXA9KHF1b3RlKT0+Z2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkudGltZXN0YW1wO1xuXG4vKiogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IGJyYW5kICovJGjigI1fb25jZS5nZXRUaW1lc3RhbXAoZ2V0VGltZXN0YW1wKTtcbmNvbnN0ICAgICAgICB1bml0QW1vdW50PWFzeW5jKGJyYW5kKT0+e1xuLyogQnJhbmQgbWV0aG9kcyBhcmUgcmVtb3RlKi9cbmNvbnN0IGRpc3BsYXlJbmZvPWF3YWl0IEUoYnJhbmQpLmdldERpc3BsYXlJbmZvKCk7XG5jb25zdCBkZWNpbWFsUGxhY2VzPWRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXM/PzA7XG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlKGJyYW5kLDEwbioqTmF0KGRlY2ltYWxQbGFjZXMpKTtcbiB9OyRo4oCNX29uY2UudW5pdEFtb3VudCh1bml0QW1vdW50KTtcbmhhcmRlbih1bml0QW1vdW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRQcmljZURlc2NyaXB0aW9uIjpbImdldFByaWNlRGVzY3JpcHRpb24iXSwiZ2V0QW1vdW50SW4iOlsiZ2V0QW1vdW50SW4iXSwiZ2V0QW1vdW50T3V0IjpbImdldEFtb3VudE91dCJdLCJnZXRUaW1lc3RhbXAiOlsiZ2V0VGltZXN0YW1wIl0sInVuaXRBbW91bnQiOlsidW5pdEFtb3VudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABghIU1vDYAALw2AAAwAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvZXJ0cCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9uYXQiLCIuL3NhZmVNYXRoLmpzIl0sImV4cG9ydHMiOlsiYWRkUmF0aW9zIiwiYXNzZXJ0SXNSYXRpbyIsImFzc2VydFBhcnNhYmxlTnVtYmVyIiwiY2VpbERpdmlkZUJ5IiwiY2VpbE11bHRpcGx5QnkiLCJkaXZpZGVCeSIsImZsb29yRGl2aWRlQnkiLCJmbG9vck11bHRpcGx5QnkiLCJpbnZlcnRSYXRpbyIsIm1ha2VSYXRpbyIsIm1ha2VSYXRpb0Zyb21BbW91bnRzIiwibXVsdGlwbHlCeSIsIm11bHRpcGx5UmF0aW9zIiwib25lTWludXMiLCJwYXJzZVJhdGlvIiwicXVhbnRpemUiLCJyYXRpb0dURSIsInJhdGlvVG9OdW1iZXIiLCJyYXRpb3NTYW1lIiwic3VidHJhY3RSYXRpb3MiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcSxGYWlsLEFtb3VudE1hdGgsYXNzZXJ0UmVjb3JkLGlzTmF0LG5hdFNhZmVNYXRoOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dLFtcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcImlzTmF0XCIsIFskaOKAjV9hID0+IChpc05hdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NhZmVNYXRoLmpzXCIsIFtbXCJuYXRTYWZlTWF0aFwiLCBbJGjigI1fYSA9PiAobmF0U2FmZU1hdGggPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7bXVsdGlwbHksZmxvb3JEaXZpZGUsY2VpbERpdmlkZSxiYW5rZXJzRGl2aWRlLGFkZCxzdWJ0cmFjdH09XG5uYXRTYWZlTWF0aDtcblxuLyogbWFrZSBhIFJhdGlvLCB3aGljaCByZXByZXNlbnRzIGEgZnJhY3Rpb24uIEl0IGlzIGEgcGFzcy1ieS1jb3B5IHJlY29yZC4qL1xuLyoqL1xuLyogVGhlIG5hdHVyYWwgc3ludGF4IGZvciB0aGUgbW9zdCBjb21tb24gb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHN1cHBvcnQqL1xuLyogYXJlIEFtb3VudCAqIFJhdGlvIGFuZCBBbW91bnQgLyBSYXRpby4gU2luY2UgdGhlIG9wZXJhdGlvbnMgd2FudCB0byBhZGhlcmUgdG8qL1xuLyogdGhlIHJhdGlvIHJhdGhlciB0aGFuIHRoZSBhbW91bnQsIHdlIHNldHRsZWQgb24gYSBjYWxsaW5nIGNvbnZlbnRpb24gb2YqL1xuLyogW2NlaWx8Zmxvb3JdTXVsdGlwbHlCeShBbW91bnQsIFJhdGlvKSBhbmQgW2NlaWx8Zmxvb3JdRGl2aWRlQnkoQW1vdW50LCBSYXRpbykqL1xuLyoqL1xuLyogVGhlIG1vc3QgY29tbW9uIGtpbmQgb2YgUmF0aW8gY2FuIGJlIGFwcGxpZWQgdG8gQW1vdW50cyBvZiBhIHBhcnRpY3VsYXIqL1xuLyogYnJhbmQsIGFuZCBwcm9kdWNlcyByZXN1bHRzIG9mIHRoZSBzYW1lIGJyYW5kLiBUaGlzIHJlcHJlc2VudHMgYSBtdWx0aXBsaWVyKi9cbi8qIHRoYXQgaXMgb25seSBhcHBsaWNhYmxlIHRvIHRoYXQgYnJhbmQuIFRoZSBsZXNzIGNvbW1vbiBraW5kIG9mIFJhdGlvIGNhbiBiZSovXG4vKiBhcHBsaWVkIHRvIG9uZSBwYXJ0aWN1bGFyIGJyYW5kIG9mIGFtb3VudHMsIGFuZCBwcm9kdWNlcyByZXN1bHRzIG9mIGFub3RoZXIqL1xuLyogcGFydGljdWxhciBicmFuZC4gVGhpcyByZXByZXNlbnRzIHNvbWUga2luZCBvZiBleGNoYW5nZSByYXRlLiBUaGUqL1xuLyogYnJhbmQtY2hlY2tpbmcgaGVscHMgdXMgZW5zdXJlIHRoYXQgbm9ybWFsIFJhdGlvcyBhcmVuJ3QgYXBwbGllZCB0byBhbW91bnRzKi9cbi8qIG9mIHRoZSB3cm9uZyBicmFuZCwgYW5kIHRoYXQgZXhjaGFuZ2UgcmF0ZXMgYXJlIG9ubHkgdXNlZCBpbiB0aGUgYXBwcm9wcmlhdGUqL1xuLyogZGlyZWN0aW9uLiovXG4vKiovXG4vKiBTaW5jZSB0aGUgcmF0aW9zIGFyZSByZXByZXNlbnRlZCBieSBhIG51bWVyYXRvciBhbmQgYSBkZW5vbWluYXRvciwgZXZlcnkqL1xuLyogbXVsdGlwbGljYXRpb24gb3IgZGl2aXNpb24gb3BlcmF0aW9uIHRoYXQgcHJvZHVjZXMgYW4gYW1vdW50IGVuZHMgd2l0aCBhKi9cbi8qIGRpdmlzaW9uIG9mIHRoZSB1bmRlcmx5aW5nIGJpZ2ludHMsIGFuZCBpbnRlZ2VyIGRpdmlzaW9uIHJlcXVpcmVzIGEgbW9kZSovXG4vKiBvZiBbcm91bmRpbmcgdG8gaW50ZWdlcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUm91bmRpbmcjUm91bmRpbmdfdG9faW50ZWdlcikuKi9cbi8qIEJlY2F1c2UgYFJhdGlvYCBvbmx5IHdvcmsgd2l0aCBOYXR1cmFsIG51bWJlcnMsIGp1c3QgdGhyZWUgbW9kZXMgc3VmZmljZToqL1xuLyogLSBmbG9vciByb3VuZHMgZG93biovXG4vKiAtIGNlaWwgcm91bmRzIHVwKi9cbi8qIC0gZGVmYXVsdCAod2l0aG91dCBwcmVmaXgpIG1pbmltaXplcyBiaWFzIGJ5IHJvdW5kaW5nIGhhbGYgdG8gZXZlbiovXG5cbmNvbnN0IFBFUkNFTlQ9MTAwbjtcblxuY29uc3QgcmF0aW9Qcm9wZXJ0eU5hbWVzPVsnbnVtZXJhdG9yJywnZGVub21pbmF0b3InXTtcblxuY29uc3QgICAgICAgIGFzc2VydElzUmF0aW89KHJhdGlvKT0+e1xuYXNzZXJ0UmVjb3JkKHJhdGlvLCdyYXRpbycpO1xuY29uc3Qga2V5cz1PYmplY3Qua2V5cyhyYXRpbyk7XG5rZXlzLmxlbmd0aD09PTJ8fEZhaWwgYFJhdGlvICR7cmF0aW99IG11c3QgYmUgYSByZWNvcmQgd2l0aCAyIGZpZWxkcy5gO1xuZm9yKGNvbnN0IG5hbWUgb2Yga2V5cyl7XG5yYXRpb1Byb3BlcnR5TmFtZXMuaW5jbHVkZXMobmFtZSl8fFxuRmFpbCBgUGFyYW1ldGVyIG11c3QgYmUgYSBSYXRpbyByZWNvcmQsIGJ1dCAke3JhdGlvfSBoYXMgJHtxKG5hbWUpfWA7XG4gfVxuY29uc3QgbnVtZXJhdG9yVmFsdWU9cmF0aW8ubnVtZXJhdG9yLnZhbHVlO1xuY29uc3QgZGVub21pbmF0b3JWYWx1ZT1yYXRpby5kZW5vbWluYXRvci52YWx1ZTtcbmlzTmF0KG51bWVyYXRvclZhbHVlKXx8XG5GYWlsIGBUaGUgbnVtZXJhdG9yIHZhbHVlIG11c3QgYmUgYSBOYXRWYWx1ZSwgbm90ICR7bnVtZXJhdG9yVmFsdWV9YDtcbmlzTmF0KGRlbm9taW5hdG9yVmFsdWUpfHxcbkZhaWwgYFRoZSBkZW5vbWluYXRvciB2YWx1ZSBtdXN0IGJlIGEgTmF0VmFsdWUsIG5vdCAke2Rlbm9taW5hdG9yVmFsdWV9YDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7YmlnaW50fSBudW1lcmF0b3JcbiAqIEBwYXJhbSB7QnJhbmR9IG51bWVyYXRvckJyYW5kXG4gKiBAcGFyYW0ge2JpZ2ludH0gW2Rlbm9taW5hdG9yXSBUaGUgZGVmYXVsdCBkZW5vbWluYXRvciBpcyAxMDBcbiAqIEBwYXJhbSB7QnJhbmR9IFtkZW5vbWluYXRvckJyYW5kXSBUaGUgZGVmYXVsdCBpcyB0byByZXVzZSB0aGUgbnVtZXJhdG9yQnJhbmRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRo4oCNX29uY2UuYXNzZXJ0SXNSYXRpbyhhc3NlcnRJc1JhdGlvKTtcbmNvbnN0ICAgICAgICBtYWtlUmF0aW89KFxubnVtZXJhdG9yLFxubnVtZXJhdG9yQnJhbmQsXG5kZW5vbWluYXRvcj1QRVJDRU5ULFxuZGVub21pbmF0b3JCcmFuZD1udW1lcmF0b3JCcmFuZCk9Plxue1xuZGVub21pbmF0b3I+MG58fFxuRmFpbCBgTm8gaW5maW5pdGUgcmF0aW9zISBEZW5vbWluYXRvciB3YXMgMCAke3EoZGVub21pbmF0b3JCcmFuZCl9YDtcblxuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IHRvIHJldHVybiB0eXBlIGJlY2F1c2UgbWFrZSgpIGVuc3VyZXMqL1xucmV0dXJuIGhhcmRlbih7XG5udW1lcmF0b3I6QW1vdW50TWF0aC5tYWtlKG51bWVyYXRvckJyYW5kLG51bWVyYXRvciksXG5kZW5vbWluYXRvcjpBbW91bnRNYXRoLm1ha2UoZGVub21pbmF0b3JCcmFuZCxkZW5vbWluYXRvcil9KTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtBbW91bnR9IG51bWVyYXRvckFtb3VudFxuICogQHBhcmFtIHtBbW91bnR9IGRlbm9taW5hdG9yQW1vdW50XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLm1ha2VSYXRpbyhtYWtlUmF0aW8pO1xuY29uc3QgICAgICAgIG1ha2VSYXRpb0Zyb21BbW91bnRzPShudW1lcmF0b3JBbW91bnQsZGVub21pbmF0b3JBbW91bnQpPT57XG5BbW91bnRNYXRoLmNvZXJjZShudW1lcmF0b3JBbW91bnQuYnJhbmQsbnVtZXJhdG9yQW1vdW50KTtcbkFtb3VudE1hdGguY29lcmNlKGRlbm9taW5hdG9yQW1vdW50LmJyYW5kLGRlbm9taW5hdG9yQW1vdW50KTtcbnJldHVybiBtYWtlUmF0aW8oXG4vKiBAdHMtZXhwZWN0LWVycm9yIHZhbHVlIGNhbiBiZSBhbnkgQW1vdW50VmFsdWUgYnV0IG1ha2VSYXRpbygpIHN1cHBvcnRzIG9ubHkgYmlnaW50Ki9cbm51bWVyYXRvckFtb3VudC52YWx1ZSxcbm51bWVyYXRvckFtb3VudC5icmFuZCxcbmRlbm9taW5hdG9yQW1vdW50LnZhbHVlLFxuZGVub21pbmF0b3JBbW91bnQuYnJhbmQpO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEBwYXJhbSB7Kn0gZGl2aWRlT3BcbiAqLyRo4oCNX29uY2UubWFrZVJhdGlvRnJvbUFtb3VudHMobWFrZVJhdGlvRnJvbUFtb3VudHMpO1xuY29uc3QgbXVsdGlwbHlIZWxwZXI9KGFtb3VudCxyYXRpbyxkaXZpZGVPcCk9PntcbkFtb3VudE1hdGguY29lcmNlKGFtb3VudC5icmFuZCxhbW91bnQpO1xuYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5hbW91bnQuYnJhbmQ9PT1yYXRpby5kZW5vbWluYXRvci5icmFuZHx8XG5GYWlsIGBhbW91bnQncyBicmFuZCAke3EoYW1vdW50LmJyYW5kKX0gbXVzdCBtYXRjaCByYXRpbydzIGRlbm9taW5hdG9yICR7cShcbnJhdGlvLmRlbm9taW5hdG9yLmJyYW5kKVxuIH1gO1xuXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlKFxucmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuZGl2aWRlT3AoXG5tdWx0aXBseShhbW91bnQudmFsdWUscmF0aW8ubnVtZXJhdG9yLnZhbHVlKSxcbnJhdGlvLmRlbm9taW5hdG9yLnZhbHVlKSk7XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovXG5jb25zdCAgICAgICAgZmxvb3JNdWx0aXBseUJ5PShhbW91bnQscmF0aW8pPT57XG5yZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LHJhdGlvLGZsb29yRGl2aWRlKTtcbiB9O1xuXG4vKiogQHR5cGUge1NjYWxlQW1vdW50fSAqLyRo4oCNX29uY2UuZmxvb3JNdWx0aXBseUJ5KGZsb29yTXVsdGlwbHlCeSk7XG5jb25zdCAgICAgICAgY2VpbE11bHRpcGx5Qnk9KGFtb3VudCxyYXRpbyk9PntcbnJldHVybiBtdWx0aXBseUhlbHBlcihhbW91bnQscmF0aW8sY2VpbERpdmlkZSk7XG4gfTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi8kaOKAjV9vbmNlLmNlaWxNdWx0aXBseUJ5KGNlaWxNdWx0aXBseUJ5KTtcbmNvbnN0ICAgICAgICBtdWx0aXBseUJ5PShhbW91bnQscmF0aW8pPT57XG5yZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LHJhdGlvLGJhbmtlcnNEaXZpZGUpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcGFyYW0geyp9IGRpdmlkZU9wXG4gKi8kaOKAjV9vbmNlLm11bHRpcGx5QnkobXVsdGlwbHlCeSk7XG5jb25zdCBkaXZpZGVIZWxwZXI9KGFtb3VudCxyYXRpbyxkaXZpZGVPcCk9PntcbkFtb3VudE1hdGguY29lcmNlKGFtb3VudC5icmFuZCxhbW91bnQpO1xuYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5hbW91bnQuYnJhbmQ9PT1yYXRpby5udW1lcmF0b3IuYnJhbmR8fFxuRmFpbCBgYW1vdW50J3MgYnJhbmQgJHtxKGFtb3VudC5icmFuZCl9IG11c3QgbWF0Y2ggcmF0aW8ncyBudW1lcmF0b3IgJHtxKFxucmF0aW8ubnVtZXJhdG9yLmJyYW5kKVxuIH1gO1xuXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlKFxucmF0aW8uZGVub21pbmF0b3IuYnJhbmQsXG5kaXZpZGVPcChcbm11bHRpcGx5KGFtb3VudC52YWx1ZSxyYXRpby5kZW5vbWluYXRvci52YWx1ZSksXG5yYXRpby5udW1lcmF0b3IudmFsdWUpKTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi9cbmNvbnN0ICAgICAgICBmbG9vckRpdmlkZUJ5PShhbW91bnQscmF0aW8pPT57XG5yZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCxyYXRpbyxmbG9vckRpdmlkZSk7XG4gfTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi8kaOKAjV9vbmNlLmZsb29yRGl2aWRlQnkoZmxvb3JEaXZpZGVCeSk7XG5jb25zdCAgICAgICAgY2VpbERpdmlkZUJ5PShhbW91bnQscmF0aW8pPT57XG5yZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCxyYXRpbyxjZWlsRGl2aWRlKTtcbiB9O1xuXG4vKiogQHR5cGUge1NjYWxlQW1vdW50fSAqLyRo4oCNX29uY2UuY2VpbERpdmlkZUJ5KGNlaWxEaXZpZGVCeSk7XG5jb25zdCAgICAgICAgZGl2aWRlQnk9KGFtb3VudCxyYXRpbyk9PntcbnJldHVybiBkaXZpZGVIZWxwZXIoYW1vdW50LHJhdGlvLGJhbmtlcnNEaXZpZGUpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRo4oCNX29uY2UuZGl2aWRlQnkoZGl2aWRlQnkpO1xuY29uc3QgICAgICAgIGludmVydFJhdGlvPShyYXRpbyk9PntcbmFzc2VydElzUmF0aW8ocmF0aW8pO1xuXG5yZXR1cm4gbWFrZVJhdGlvKFxuLyoqIEB0eXBlIHtOYXRWYWx1ZX0gKi9yYXRpby5kZW5vbWluYXRvci52YWx1ZSxcbnJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuLyoqIEB0eXBlIHtOYXRWYWx1ZX0gKi9yYXRpby5udW1lcmF0b3IudmFsdWUsXG5yYXRpby5udW1lcmF0b3IuYnJhbmQpO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5pbnZlcnRSYXRpbyhpbnZlcnRSYXRpbyk7XG5jb25zdCAgICAgICAgYWRkUmF0aW9zPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG5hc3NlcnRJc1JhdGlvKGxlZnQpO1xubGVmdC5udW1lcmF0b3IuYnJhbmQ9PT1yaWdodC5udW1lcmF0b3IuYnJhbmR8fFxuRmFpbCBgbnVtZXJhdG9yIGJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcbmxlZnQuZGVub21pbmF0b3IuYnJhbmQ9PT1yaWdodC5kZW5vbWluYXRvci5icmFuZHx8XG5GYWlsIGBkZW5vbWluYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG5cbi8qIFNpbXBsaWZ5aW5nIHRoZSBleHByZXNzaW9uOiovXG4vKiAoYW5kICsgYm5kKSAvIHkgZCoqMiovXG4vKiAoYSArIGIpIG5kIC8geSBkKioyKi9cbi8qICgoYSArIGIpIG4gLyB5IGQpICogKGQgLyBkKSovXG4vKiAoYSArIGIpIG4gLyB5ZCovXG5yZXR1cm4gbWFrZVJhdGlvKFxuYWRkKFxubXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUscmlnaHQuZGVub21pbmF0b3IudmFsdWUpLC8qIGEgbmQqL1xubXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSxyaWdodC5udW1lcmF0b3IudmFsdWUpLyogYiBuZCovKSxcbi8qIChhICsgYikgbmQqL1xubGVmdC5udW1lcmF0b3IuYnJhbmQsXG5tdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwvKiB5IGQqKjIqL1xubGVmdC5kZW5vbWluYXRvci5icmFuZCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLmFkZFJhdGlvcyhhZGRSYXRpb3MpO1xuY29uc3QgICAgICAgIHN1YnRyYWN0UmF0aW9zPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG5hc3NlcnRJc1JhdGlvKGxlZnQpO1xubGVmdC5udW1lcmF0b3IuYnJhbmQ9PT1yaWdodC5udW1lcmF0b3IuYnJhbmR8fFxuRmFpbCBgbnVtZXJhdG9yIGJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcbmxlZnQuZGVub21pbmF0b3IuYnJhbmQ9PT1yaWdodC5kZW5vbWluYXRvci5icmFuZHx8XG5GYWlsIGBkZW5vbWluYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG5cbnJldHVybiBtYWtlUmF0aW8oXG5zdWJ0cmFjdChcbm11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwvKiBhIG5kKi9cbm11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUscmlnaHQubnVtZXJhdG9yLnZhbHVlKS8qIGIgbmQqLyksXG4vKiAoYSAtIGIpIG5kKi9cbmxlZnQubnVtZXJhdG9yLmJyYW5kLFxubXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSxyaWdodC5kZW5vbWluYXRvci52YWx1ZSksLyogeSBkKioyKi9cbmxlZnQuZGVub21pbmF0b3IuYnJhbmQpO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5zdWJ0cmFjdFJhdGlvcyhzdWJ0cmFjdFJhdGlvcyk7XG5jb25zdCAgICAgICAgbXVsdGlwbHlSYXRpb3M9KGxlZnQscmlnaHQpPT57XG5hc3NlcnRJc1JhdGlvKHJpZ2h0KTtcbmFzc2VydElzUmF0aW8obGVmdCk7XG5cbmNvbnN0IGdldFJlbWFpbmluZ0JyYW5kcz0oKT0+e1xuLyogUHJlZmVyIHJlc3VsdHMgdGhhdCBoYXZlIHRoZSBzYW1lIGJyYW5kIGFzIHRoZSBsZWZ0IG9wZXJhbmQuKi9cbmlmKHJpZ2h0Lm51bWVyYXRvci5icmFuZD09PXJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kKXtcbnJldHVybltsZWZ0Lm51bWVyYXRvci5icmFuZCxsZWZ0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiB9XG5pZihyaWdodC5udW1lcmF0b3IuYnJhbmQ9PT1sZWZ0LmRlbm9taW5hdG9yLmJyYW5kKXtcbnJldHVybltsZWZ0Lm51bWVyYXRvci5icmFuZCxyaWdodC5kZW5vbWluYXRvci5icmFuZF07XG4gfVxuaWYobGVmdC5udW1lcmF0b3IuYnJhbmQ9PT1yaWdodC5kZW5vbWluYXRvci5icmFuZCl7XG5yZXR1cm5bcmlnaHQubnVtZXJhdG9yLmJyYW5kLGxlZnQuZGVub21pbmF0b3IuYnJhbmRdO1xuIH1cbmlmKGxlZnQubnVtZXJhdG9yLmJyYW5kPT09bGVmdC5kZW5vbWluYXRvci5icmFuZCl7XG5yZXR1cm5bcmlnaHQubnVtZXJhdG9yLmJyYW5kLHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiB9XG50aHJvdyBGYWlsIGBhdCBsZWFzdCBvbmUgYnJhbmQgbXVzdCBjYW5jZWwgb3V0OiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcbiB9O1xuXG5jb25zdFtudW1lcmF0b3JCcmFuZCxkZW5vbWluYXRvckJyYW5kXT1nZXRSZW1haW5pbmdCcmFuZHMoKTtcbnJldHVybiBtYWtlUmF0aW8oXG5tdWx0aXBseShsZWZ0Lm51bWVyYXRvci52YWx1ZSxyaWdodC5udW1lcmF0b3IudmFsdWUpLFxubnVtZXJhdG9yQnJhbmQsXG5tdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSxcbmRlbm9taW5hdG9yQnJhbmQpO1xuXG4gfTtcblxuLyoqXG4gKiBJZiByYXRpbyBpcyBiZXR3ZWVuIDAgYW5kIDEsIHN1YnRyYWN0IGZyb20gMS5cbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5tdWx0aXBseVJhdGlvcyhtdWx0aXBseVJhdGlvcyk7XG5jb25zdCAgICAgICAgb25lTWludXM9KHJhdGlvKT0+e1xuYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5yYXRpby5udW1lcmF0b3IuYnJhbmQ9PT1yYXRpby5kZW5vbWluYXRvci5icmFuZHx8XG5GYWlsIGBvbmVNaW51cyBvbmx5IHN1cHBvcnRzIHJhdGlvcyB3aXRoIGEgc2luZ2xlIGJyYW5kLCBidXQgJHtyYXRpby5udW1lcmF0b3IuYnJhbmR9IGRvZXNuJ3QgbWF0Y2ggJHtyYXRpby5kZW5vbWluYXRvci5icmFuZH1gO1xucmF0aW8ubnVtZXJhdG9yLnZhbHVlPD1yYXRpby5kZW5vbWluYXRvci52YWx1ZXx8XG5GYWlsIGBQYXJhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTogJHtyYXRpby5udW1lcmF0b3IudmFsdWV9LyR7cmF0aW8uZGVub21pbmF0b3IudmFsdWV9YDtcbnJldHVybiBtYWtlUmF0aW8oXG5zdWJ0cmFjdChyYXRpby5kZW5vbWluYXRvci52YWx1ZSxyYXRpby5udW1lcmF0b3IudmFsdWUpLFxucmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxucmF0aW8uZGVub21pbmF0b3IudmFsdWUsXG5yYXRpby5udW1lcmF0b3IuYnJhbmQpO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLm9uZU1pbnVzKG9uZU1pbnVzKTtcbmNvbnN0ICAgICAgICByYXRpb0dURT0obGVmdCxyaWdodCk9PntcbmlmKGxlZnQubnVtZXJhdG9yLmJyYW5kPT09cmlnaHQubnVtZXJhdG9yLmJyYW5kKXtcbmxlZnQuZGVub21pbmF0b3IuYnJhbmQ9PT1yaWdodC5kZW5vbWluYXRvci5icmFuZHx8XG5GYWlsIGBudW1lcmF0b3IgYnJhbmRzIG1hdGNoLCBidXQgZGVub21pbmF0b3IgYnJhbmRzIGRvbid0OiAke3EobGVmdCl9ICR7cShcbnJpZ2h0KVxuIH1gO1xuIH1lbHNlIGlmKGxlZnQubnVtZXJhdG9yLmJyYW5kPT09bGVmdC5kZW5vbWluYXRvci5icmFuZCl7XG5yaWdodC5udW1lcmF0b3IuYnJhbmQ9PT1yaWdodC5kZW5vbWluYXRvci5icmFuZHx8XG5GYWlsIGBsZWZ0aGFuZCBicmFuZHMgbWF0Y2gsIGJ1dCByaWdodGhhbmQgYnJhbmRzIGRvbid0OiAke3EobGVmdCl9ICR7cShcbnJpZ2h0KVxuIH1gO1xuIH1cbnJldHVybiBuYXRTYWZlTWF0aC5pc0dURShcbm11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSxcbm11bHRpcGx5KHJpZ2h0Lm51bWVyYXRvci52YWx1ZSxsZWZ0LmRlbm9taW5hdG9yLnZhbHVlKSk7XG5cbiB9O1xuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByYXRpb3MgYXJlIHRoZSBzYW1lIHZhbHVlcyAoZXF1YWwgb3IgZXF1aXZhbGFudCBtYXkgcmV0dXJuIGZhbHNlKVxuICpcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UucmF0aW9HVEUocmF0aW9HVEUpO1xuY29uc3QgICAgICAgIHJhdGlvc1NhbWU9KGxlZnQscmlnaHQpPT57XG5yZXR1cm4oXG5BbW91bnRNYXRoLmlzRXF1YWwobGVmdC5udW1lcmF0b3IscmlnaHQubnVtZXJhdG9yKSYmXG5BbW91bnRNYXRoLmlzRXF1YWwobGVmdC5kZW5vbWluYXRvcixyaWdodC5kZW5vbWluYXRvcikpO1xuXG4gfTtcblxuLyoqXG4gKiBNYWtlIGFuIGVxdWl2YWxhbnQgcmF0aW8gd2l0aCBhIG5ldyBkZW5vbWluYXRvclxuICpcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcGFyYW0ge2JpZ2ludH0gbmV3RGVuXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLnJhdGlvc1NhbWUocmF0aW9zU2FtZSk7XG5jb25zdCAgICAgICAgcXVhbnRpemU9KHJhdGlvLG5ld0Rlbik9PntcbmNvbnN0IG9sZERlbj1yYXRpby5kZW5vbWluYXRvci52YWx1ZTtcbmNvbnN0IG9sZE51bT1yYXRpby5udW1lcmF0b3IudmFsdWU7XG5jb25zdCBuZXdOdW09XG5uZXdEZW49PT1vbGREZW4/b2xkTnVtOmJhbmtlcnNEaXZpZGUob2xkTnVtKm5ld0RlbixvbGREZW4pO1xucmV0dXJuIG1ha2VSYXRpbyhcbm5ld051bSxcbnJhdGlvLm51bWVyYXRvci5icmFuZCxcbm5ld0RlbixcbnJhdGlvLmRlbm9taW5hdG9yLmJyYW5kKTtcblxuIH07JGjigI1fb25jZS5xdWFudGl6ZShxdWFudGl6ZSk7XG5cbmNvbnN0IE5VTUVSSUNfUkU9L14oXFxkXFxkKikoPzpcXC4oXFxkKikpPyQvO1xuLyoqIEB0eXBlZGVmIHtiaWdpbnQgfCBudW1iZXIgfCBzdHJpbmd9IFBhcnNhYmxlTnVtYmVyICovXG5cbi8qKlxuICogQ3JlYXRlIGEgcmF0aW8gZnJvbSBhIGdpdmVuIG51bWVyaWMgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQYXJzYWJsZU51bWJlcn0gbnVtZXJpY1xuICogQHBhcmFtIHtCcmFuZH0gbnVtZXJhdG9yQnJhbmRcbiAqIEBwYXJhbSB7QnJhbmR9IFtkZW5vbWluYXRvckJyYW5kXVxuICogQHJldHVybnMge1JhdGlvfVxuICovXG5jb25zdCAgICAgICAgcGFyc2VSYXRpbz0oXG5udW1lcmljLFxubnVtZXJhdG9yQnJhbmQsXG5kZW5vbWluYXRvckJyYW5kPW51bWVyYXRvckJyYW5kKT0+XG57XG5jb25zdCBtYXRjaD0gYCR7bnVtZXJpY31gLm1hdGNoKE5VTUVSSUNfUkUpO1xuaWYoIW1hdGNoKXtcbnRocm93IEZhaWwgYEludmFsaWQgbnVtZXJpYyBkYXRhOiAke251bWVyaWN9YDtcbiB9XG5cbmNvbnN0W18sd2hvbGUscGFydD0nJ109bWF0Y2g7XG5yZXR1cm4gbWFrZVJhdGlvKFxuQmlnSW50KCBgJHt3aG9sZX0ke3BhcnR9YCksXG5udW1lcmF0b3JCcmFuZCxcbjEwbioqQmlnSW50KHBhcnQubGVuZ3RoKSxcbmRlbm9taW5hdG9yQnJhbmQpO1xuXG4gfTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJucy1jaGVjayovXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIFBhcnNhYmxlTnVtYmVyfVxuICovJGjigI1fb25jZS5wYXJzZVJhdGlvKHBhcnNlUmF0aW8pO1xuY29uc3QgICAgICAgIGFzc2VydFBhcnNhYmxlTnVtYmVyPShzcGVjaW1lbik9PntcbmNvbnN0IG1hdGNoPSBgJHtzcGVjaW1lbn1gLm1hdGNoKE5VTUVSSUNfUkUpO1xubWF0Y2h8fEZhaWwgYEludmFsaWQgbnVtZXJpYyBkYXRhOiAke3NwZWNpbWVufWA7XG4gfTtcblxuLyoqXG4gKiBSYXRpb3MgbWlnaHQgYmUgZ3JlYXRlciBvciBsZXNzIHRoYW4gb25lLlxuICpcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovJGjigI1fb25jZS5hc3NlcnRQYXJzYWJsZU51bWJlcihhc3NlcnRQYXJzYWJsZU51bWJlcik7XG5jb25zdCAgICAgICAgcmF0aW9Ub051bWJlcj0ocmF0aW8pPT57XG5jb25zdCBuPU51bWJlcihyYXRpby5udW1lcmF0b3IudmFsdWUpO1xuY29uc3QgZD1OdW1iZXIocmF0aW8uZGVub21pbmF0b3IudmFsdWUpO1xucmV0dXJuIG4vZDtcbiB9OyRo4oCNX29uY2UucmF0aW9Ub051bWJlcihyYXRpb1RvTnVtYmVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJc1JhdGlvIjpbImFzc2VydElzUmF0aW8iXSwibWFrZVJhdGlvIjpbIm1ha2VSYXRpbyJdLCJtYWtlUmF0aW9Gcm9tQW1vdW50cyI6WyJtYWtlUmF0aW9Gcm9tQW1vdW50cyJdLCJmbG9vck11bHRpcGx5QnkiOlsiZmxvb3JNdWx0aXBseUJ5Il0sImNlaWxNdWx0aXBseUJ5IjpbImNlaWxNdWx0aXBseUJ5Il0sIm11bHRpcGx5QnkiOlsibXVsdGlwbHlCeSJdLCJmbG9vckRpdmlkZUJ5IjpbImZsb29yRGl2aWRlQnkiXSwiY2VpbERpdmlkZUJ5IjpbImNlaWxEaXZpZGVCeSJdLCJkaXZpZGVCeSI6WyJkaXZpZGVCeSJdLCJpbnZlcnRSYXRpbyI6WyJpbnZlcnRSYXRpbyJdLCJhZGRSYXRpb3MiOlsiYWRkUmF0aW9zIl0sInN1YnRyYWN0UmF0aW9zIjpbInN1YnRyYWN0UmF0aW9zIl0sIm11bHRpcGx5UmF0aW9zIjpbIm11bHRpcGx5UmF0aW9zIl0sIm9uZU1pbnVzIjpbIm9uZU1pbnVzIl0sInJhdGlvR1RFIjpbInJhdGlvR1RFIl0sInJhdGlvc1NhbWUiOlsicmF0aW9zU2FtZSJdLCJxdWFudGl6ZSI6WyJxdWFudGl6ZSJdLCJwYXJzZVJhdGlvIjpbInBhcnNlUmF0aW8iXSwiYXNzZXJ0UGFyc2FibGVOdW1iZXIiOlsiYXNzZXJ0UGFyc2FibGVOdW1iZXIiXSwicmF0aW9Ub051bWJlciI6WyJyYXRpb1RvTnVtYmVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPM8Lm46JgAAOiYAADMAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsiZGVmaW5lRVJlY29yZGVyS2l0IiwiZGVmaW5lUmVjb3JkZXJLaXQiLCJwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzIiwicHJlcGFyZVJlY29yZGVyIiwicHJlcGFyZVJlY29yZGVyS2l0IiwicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhaWwsU3RvcmFnZU5vZGVTaGFwZSxwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQsbWFrZUZha2VNYXJzaGFsbGVyLG1ha2VGYWtlU3RvcmFnZSxtdXN0TWF0Y2gsTSxtYWtlU2NhbGFyQmlnTWFwU3RvcmUscHJlcGFyZUV4b0NsYXNzLEU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiU3RvcmFnZU5vZGVTaGFwZVwiLCBbJGjigI1fYSA9PiAoU3RvcmFnZU5vZGVTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc1wiLCBbW1wibWFrZUZha2VNYXJzaGFsbGVyXCIsIFskaOKAjV9hID0+IChtYWtlRmFrZU1hcnNoYWxsZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VGYWtlU3RvcmFnZVwiLCBbJGjigI1fYSA9PiAobWFrZUZha2VTdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogUmVjb3JkZXJzIHN1cHBvcnQgcHVibGlzaGluZyBkYXRhIHRvIHZzdG9yYWdlLlxuICpcbiAqIGBSZWNvcmRlcmAgaXMgc2ltaWxhciB0byBgUHVibGlzaGVyYCAoaW4gdGhhdCB0aGV5IHNlbmQgb3V0IGRhdGEpIGJ1dCBoYXMgZGlmZmVyZW50IHNpZ25hdHVyZXM6XG4gKiAtIG1ldGhvZHMgYXJlIGFzeW5jIGJlY2F1c2UgdGhleSBhd2FpdCByZW1vdGUgY2FsbHMgdG8gTWFyc2hhbGxlciBhbmQgU3RvcmFnZU5vZGVcbiAqIC0gbWV0aG9kIG5hbWVzIGNvbnZleSB0aGUgZHVyYWJpbGl0eVxuICogLSBvbWl0cyBmYWlsKClcbiAqIC0gYWRkcyBnZXRTdG9yYWdlTm9kZSgpIGZyb20gaXRzIGR1cmFibGUgc3RhdGVcbiAqXG4gKiBPdGhlciBuYW1lcyBzdWNoIGFzIFN0b3JlZFB1Ymxpc2hlciBvciBDaGFpblN0b3JhZ2VQdWJsaXNoZXIgd2VyZSBjb25zaWRlcmVkLCBidXQgZm91bmQgdG8gYmUgc29tZXRpbWVzIGNvbmZ1c2VkIHdpdGggKmR1cmFiaWxpdHkqLCBhbm90aGVyIHRyYWl0IG9mIHRoaXMgY2xhc3MuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3sgZ2V0U3RvcmFnZU5vZGUoKTogU3RvcmFnZU5vZGUsIGdldFN0b3JhZ2VQYXRoKCk6IFByb21pc2U8c3RyaW5nPiwgd3JpdGUodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+LCB3cml0ZUZpbmFsKHZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPiB9fSBSZWNvcmRlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQaWNrPFB1Ymxpc2hLaXQ8VD4sICdzdWJzY3JpYmVyJz4gJiB7IHJlY29yZGVyOiBSZWNvcmRlcjxUPiB9fSBSZWNvcmRlcktpdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQaWNrPFB1Ymxpc2hLaXQ8VD4sICdzdWJzY3JpYmVyJz4gJiB7IHJlY29yZGVyUDogRVJlZjxSZWNvcmRlcjxUPj4gfX0gRXZlbnR1YWxSZWNvcmRlcktpdFxuICovXG5cbi8qKlxuICogV3JhcCBhIFB1Ymxpc2hlciB0byByZWNvcmQgYWxsIHRoZSB2YWx1ZXMgdG8gY2hhaW4gc3RvcmFnZS5cbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvem9lJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUmVjb3JkZXI9KGJhZ2dhZ2UsbWFyc2hhbGxlcik9PntcbmNvbnN0IG1ha2VSZWNvcmRlcj1wcmVwYXJlRXhvQ2xhc3MoXG5iYWdnYWdlLFxuJ1JlY29yZGVyJyxcbk0uaW50ZXJmYWNlKCdSZWNvcmRlcicse1xuZ2V0U3RvcmFnZU5vZGU6TS5jYWxsKCkucmV0dXJucyhTdG9yYWdlTm9kZVNoYXBlKSxcbmdldFN0b3JhZ2VQYXRoOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxud3JpdGU6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxud3JpdGVGaW5hbDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSl9KSxcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQdWJsaXNoS2l0PFQ+WydwdWJsaXNoZXInXX0gcHVibGlzaGVyXG4gKiBAcGFyYW0ge1N0b3JhZ2VOb2RlfSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtUeXBlZE1hdGNoZXI8VD59IFt2YWx1ZVNoYXBlXVxuICovXG4oXG5wdWJsaXNoZXIsXG5zdG9yYWdlTm9kZSxcbnZhbHVlU2hhcGU9LyoqIEB0eXBlIHtUeXBlZE1hdGNoZXI8YW55Pn0gKi9NLmFueSgpKT0+XG57XG5yZXR1cm57XG5jbG9zZWQ6ZmFsc2UsXG5wdWJsaXNoZXIsXG5zdG9yYWdlTm9kZSxcbnN0b3JhZ2VQYXRoOi8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL3VuZGVmaW5lZCxcbnZhbHVlU2hhcGV9O1xuXG4gfSxcbntcbmdldFN0b3JhZ2VOb2RlKCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5zdG9yYWdlTm9kZTtcbiB9LFxuLyoqXG4gKiBNZW1vaXplcyB0aGUgcmVtb3RlIGNhbGwgdG8gdGhlIHN0b3JhZ2Ugbm9kZVxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gKi9cbiAgICAgIGFzeW5jIGdldFN0b3JhZ2VQYXRoKCl7XG5jb25zdHtzdG9yYWdlUGF0aDpoZWxkUGF0aH09dGhpcy5zdGF0ZTtcbi8qIGVuZCBzeW5jaHJvbm91cyBwcmVsdWRlKi9cbmF3YWl0IG51bGw7XG5pZihoZWxkUGF0aCE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gaGVsZFBhdGg7XG4gfVxuY29uc3QgcGF0aD1hd2FpdCBFKHRoaXMuc3RhdGUuc3RvcmFnZU5vZGUpLmdldFBhdGgoKTtcbnRoaXMuc3RhdGUuc3RvcmFnZVBhdGg9cGF0aDtcbnJldHVybiBwYXRoO1xuIH0sXG4vKipcbiAqIE1hcnNoYWxscyBiZWZvcmUgd3JpdGluZyB0byBzdG9yYWdlIG9yIHB1Ymxpc2hlciB0byBoZWxwIGVuc3VyZSB0aGUgdHdvIHN0cmVhbXMgbWF0Y2guXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbiAgICAgIGFzeW5jIHdyaXRlKHZhbHVlKXtcbmNvbnN0e2Nsb3NlZCxwdWJsaXNoZXIsc3RvcmFnZU5vZGUsdmFsdWVTaGFwZX09dGhpcy5zdGF0ZTtcbiFjbG9zZWR8fEZhaWwgYGNhbm5vdCB3cml0ZSB0byBjbG9zZWQgcmVjb3JkZXJgO1xubXVzdE1hdGNoKHZhbHVlLHZhbHVlU2hhcGUpO1xuY29uc3QgZW5jb2RlZD1hd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG5jb25zdCBzZXJpYWxpemVkPUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuYXdhaXQgRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG5cbi8qIGJlbG93IGhlcmUgZGlmZmVycyBmcm9tIHdyaXRlRmluYWwoKSovXG5yZXR1cm4gcHVibGlzaGVyLnB1Ymxpc2godmFsdWUpO1xuIH0sXG4vKipcbiAqIExpa2UgYHdyaXRlYCBidXQgcHJldmVudHMgZnV0dXJlIHdyaXRlcyBhbmQgdGVybWluYXRlcyB0aGUgcHVibGlzaGVyLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICBhc3luYyB3cml0ZUZpbmFsKHZhbHVlKXtcbmNvbnN0e2Nsb3NlZCxwdWJsaXNoZXIsc3RvcmFnZU5vZGUsdmFsdWVTaGFwZX09dGhpcy5zdGF0ZTtcbiFjbG9zZWR8fEZhaWwgYGNhbm5vdCB3cml0ZSB0byBjbG9zZWQgcmVjb3JkZXJgO1xubXVzdE1hdGNoKHZhbHVlLHZhbHVlU2hhcGUpO1xuY29uc3QgZW5jb2RlZD1hd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG5jb25zdCBzZXJpYWxpemVkPUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuYXdhaXQgRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG5cbi8qIGJlbG93IGhlcmUgZGlmZmVycyBmcm9tIHdyaXRlRmluYWwoKSovXG50aGlzLnN0YXRlLmNsb3NlZD10cnVlO1xucmV0dXJuIHB1Ymxpc2hlci5maW5pc2godmFsdWUpO1xuIH19KTtcblxuXG5cbnJldHVybiBtYWtlUmVjb3JkZXI7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVSZWNvcmRlcihwcmVwYXJlUmVjb3JkZXIpO1xuaGFyZGVuKHByZXBhcmVSZWNvcmRlcik7XG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIHByZXBhcmVSZWNvcmRlcj59IE1ha2VSZWNvcmRlciAqL1xuXG4vKipcbiAqIGBtYWtlUmVjb3JkZXJLaXRgIGlzIHN1aXRhYmxlIGZvciBtYWtpbmcgYSBkdXJhYmxlIGBSZWNvcmRlcktpdGAgd2hpY2ggY2FuIGJlIGhlbGQgaW4gRXhvIHN0YXRlLlxuICpcbiAqIEBzZWUge2RlZmluZUVSZWNvcmRlcktpdH1cbiAqXG4gKiBAcGFyYW0ge3ttYWtlUmVjb3JkZXI6IE1ha2VSZWNvcmRlciwgbWFrZUR1cmFibGVQdWJsaXNoS2l0OiBSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQ+fX0gbWFrZXJzXG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVSZWNvcmRlcktpdD0oe21ha2VSZWNvcmRlcixtYWtlRHVyYWJsZVB1Ymxpc2hLaXR9KT0+e1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdG9yYWdlTm9kZX0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7VHlwZWRNYXRjaGVyPFQ+fSBbdmFsdWVTaGFwZV1cbiAqIEByZXR1cm5zIHtSZWNvcmRlcktpdDxUPn1cbiAqL1xuY29uc3QgbWFrZVJlY29yZGVyS2l0PShzdG9yYWdlTm9kZSx2YWx1ZVNoYXBlKT0+e1xuY29uc3R7c3Vic2NyaWJlcixwdWJsaXNoZXJ9PW1ha2VEdXJhYmxlUHVibGlzaEtpdCgpO1xuY29uc3QgcmVjb3JkZXI9bWFrZVJlY29yZGVyKHB1Ymxpc2hlcixzdG9yYWdlTm9kZSx2YWx1ZVNoYXBlKTtcbnJldHVybiBoYXJkZW4oe3N1YnNjcmliZXIscmVjb3JkZXJ9KTtcbiB9O1xucmV0dXJuIG1ha2VSZWNvcmRlcktpdDtcbiB9O1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBkZWZpbmVSZWNvcmRlcktpdD59IE1ha2VSZWNvcmRlcktpdCAqL1xuXG4vKipcbiAqIGBtYWtlRVJlY29yZGVyS2l0YCBpcyBmb3IgY2xvc3VyZXMgdGhhdCBtdXN0IHJldHVybiBhIGBzdWJzY3JpYmVyYCBzeW5jaHJvbm91c2x5IGJ1dCBjYW4gZGVmZXIgdGhlIGByZWNvcmRlcmAuXG4gKlxuICogQHNlZSB7ZGVmaW5lUmVjb3JkZXJLaXR9XG4gKlxuICogQHBhcmFtIHt7bWFrZVJlY29yZGVyOiBNYWtlUmVjb3JkZXIsIG1ha2VEdXJhYmxlUHVibGlzaEtpdDogUmV0dXJuVHlwZTx0eXBlb2YgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Pn19IG1ha2Vyc1xuICovJGjigI1fb25jZS5kZWZpbmVSZWNvcmRlcktpdChkZWZpbmVSZWNvcmRlcktpdCk7XG5jb25zdCAgICAgICAgZGVmaW5lRVJlY29yZGVyS2l0PSh7bWFrZVJlY29yZGVyLG1ha2VEdXJhYmxlUHVibGlzaEtpdH0pPT57XG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVBcbiAqIEBwYXJhbSB7VHlwZWRNYXRjaGVyPFQ+fSBbdmFsdWVTaGFwZV1cbiAqIEByZXR1cm5zIHtFdmVudHVhbFJlY29yZGVyS2l0PFQ+fVxuICovXG5jb25zdCBtYWtlRVJlY29yZGVyS2l0PShzdG9yYWdlTm9kZVAsdmFsdWVTaGFwZSk9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlRHVyYWJsZVB1Ymxpc2hLaXQoKTtcbmNvbnN0IHJlY29yZGVyUD1FLndoZW4oc3RvcmFnZU5vZGVQLChzdG9yYWdlTm9kZSk9PlxubWFrZVJlY29yZGVyKHB1Ymxpc2hlcixzdG9yYWdlTm9kZSx2YWx1ZVNoYXBlKSk7XG5cbnJldHVybntzdWJzY3JpYmVyLHJlY29yZGVyUH07XG4gfTtcbnJldHVybiBtYWtlRVJlY29yZGVyS2l0O1xuIH07JGjigI1fb25jZS5kZWZpbmVFUmVjb3JkZXJLaXQoZGVmaW5lRVJlY29yZGVyS2l0KTtcbmhhcmRlbihkZWZpbmVFUmVjb3JkZXJLaXQpO1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBkZWZpbmVFUmVjb3JkZXJLaXQ+fSBNYWtlRVJlY29yZGVyS2l0ICovXG5cbi8qKlxuICogQ29udmVuaWVuY2Ugd3JhcHBlciB0byBwcmVwYXJlIHRoZSBEdXJhYmxlUHVibGlzaEtpdCBhbmQgUmVjb3JkZXIga2luZHMuXG4gKiBOb3RlIHRoYXQgYmVjYXVzZSBwcmVwYXJlUmVjb3JkZXIoKSBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBwZXIgYmFnZ2FnZSxcbiAqIHRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFuIEV2ZW50dWFsUmVjb3JkZXJLaXQuXG4gKiBXaGVuIHRoZXJlIGlzLCBwcmVwYXJlIHRoZSBraW5kcyBzZXBhcmF0ZWx5IGFuZCBwYXNzIHRvIHRoZSBraXQgZGVmaW5lcnMuXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUmVjb3JkZXJLaXQ9KGJhZ2dhZ2UsbWFyc2hhbGxlcik9PntcbmNvbnN0IG1ha2VEdXJhYmxlUHVibGlzaEtpdD1wcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQoXG5iYWdnYWdlLFxuJ0R1cmFibGUgUHVibGlzaCBLaXQnKTtcblxuY29uc3QgbWFrZVJlY29yZGVyPXByZXBhcmVSZWNvcmRlcihiYWdnYWdlLG1hcnNoYWxsZXIpO1xucmV0dXJuIGRlZmluZVJlY29yZGVyS2l0KHttYWtlRHVyYWJsZVB1Ymxpc2hLaXQsbWFrZVJlY29yZGVyfSk7XG4gfTtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSB3cmFwcGVyIGZvciBEdXJhYmxlUHVibGlzaEtpdCBhbmQgUmVjb3JkZXIga2luZHMuXG4gKlxuICogTkI6IHRoaXMgZGVmaW5lcyB0d28gZHVyYWJsZSBraW5kcy4gTXVzdCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlIHBlciBiYWdnYWdlLlxuICpcbiAqIGBtYWtlUmVjb3JkZXJLaXRgIGlzIHN1aXRhYmxlIGZvciBtYWtpbmcgYSBkdXJhYmxlIGBSZWNvcmRlcktpdGAgd2hpY2ggY2FuIGJlIGhlbGQgaW4gRXhvIHN0YXRlLlxuICogYG1ha2VFUmVjb3JkZXJLaXRgIGlzIGZvciBjbG9zdXJlcyB0aGF0IG11c3QgcmV0dXJuIGEgYHN1YnNjcmliZXJgIHN5bmNocm9ub3VzbHkgYnV0IGNhbiBkZWZlciB0aGUgYHJlY29yZGVyYC5cbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqLyRo4oCNX29uY2UucHJlcGFyZVJlY29yZGVyS2l0KHByZXBhcmVSZWNvcmRlcktpdCk7XG5jb25zdCAgICAgICAgcHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzPShiYWdnYWdlLG1hcnNoYWxsZXIpPT57XG5jb25zdCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQ9cHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuYmFnZ2FnZSxcbidEdXJhYmxlIFB1Ymxpc2ggS2l0Jyk7XG5cbmNvbnN0IG1ha2VSZWNvcmRlcj1wcmVwYXJlUmVjb3JkZXIoYmFnZ2FnZSxtYXJzaGFsbGVyKTtcblxuY29uc3QgbWFrZVJlY29yZGVyS2l0PWRlZmluZVJlY29yZGVyS2l0KHtcbm1ha2VSZWNvcmRlcixcbm1ha2VEdXJhYmxlUHVibGlzaEtpdH0pO1xuXG5jb25zdCBtYWtlRVJlY29yZGVyS2l0PWRlZmluZUVSZWNvcmRlcktpdCh7XG5tYWtlUmVjb3JkZXIsXG5tYWtlRHVyYWJsZVB1Ymxpc2hLaXR9KTtcblxuXG5yZXR1cm57XG5tYWtlRHVyYWJsZVB1Ymxpc2hLaXQsXG5tYWtlUmVjb3JkZXIsXG5tYWtlUmVjb3JkZXJLaXQsXG5tYWtlRVJlY29yZGVyS2l0fTtcblxuIH07XG5cbi8qKlxuICogRm9yIHVzZSBpbiB0ZXN0c1xuICovJGjigI1fb25jZS5wcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMocHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKTtcbmNvbnN0ICAgICAgICBwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzPSgpPT57XG5jb25zdCBiYWdnYWdlPW1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnbW9jayByZWNvcmRlciBiYWdnYWdlJyk7XG5jb25zdCBtYXJzaGFsbGVyPW1ha2VGYWtlTWFyc2hhbGxlcigpO1xucmV0dXJue1xuLi4ucHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKGJhZ2dhZ2UsbWFyc2hhbGxlciksXG5zdG9yYWdlTm9kZTptYWtlRmFrZVN0b3JhZ2UoJ21vY2sgcmVjb3JkZXIgc3RvcmFnZScpfTtcblxuIH07XG5cbi8qKlxuICogU3RvcC1nYXAgdW50aWwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MTYwXG4gKiBleHBsaWN0bHkgc3BlY2lmeSB0aGUgdHlwZSB0aGF0IHRoZSBQYXR0ZXJuIHdpbGwgdmVyaWZ5IHRocm91Z2ggYSBtYXRjaC5cbiAqXG4gKiBUaGlzIGlzIGEgUGF0dGVybiBidXQgc2luY2UgdGhhdCdzIGBhbnlgLCBpbmNsdWRpbmcgaW4gdGhlIHR5cGVkZWYgdHVybnMgdGhlXG4gKiB3aG9sZSB0aGluZyB0byBgYW55YC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3sgdmFsaWRhdGVkVHlwZT86IFQgfX0gVHlwZWRNYXRjaGVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1R5cGVkTWF0Y2hlcjxhbnk+fSBUTVxuICogQHR5cGVkZWYge1RNIGV4dGVuZHMgVHlwZWRNYXRjaGVyPGluZmVyIFQ+ID8gVCA6IG5ldmVyfSBNYXRjaGVkVHlwZVxuICovJGjigI1fb25jZS5wcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzKHByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVSZWNvcmRlciI6WyJwcmVwYXJlUmVjb3JkZXIiXSwiZGVmaW5lUmVjb3JkZXJLaXQiOlsiZGVmaW5lUmVjb3JkZXJLaXQiXSwiZGVmaW5lRVJlY29yZGVyS2l0IjpbImRlZmluZUVSZWNvcmRlcktpdCJdLCJwcmVwYXJlUmVjb3JkZXJLaXQiOlsicHJlcGFyZVJlY29yZGVyS2l0Il0sInByZXBhcmVSZWNvcmRlcktpdE1ha2VycyI6WyJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMiXSwicHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyI6WyJwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOhpH7e2BgAAtgYAADMAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc2FmZU1hdGguanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsibmF0U2FmZU1hdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqIEB0eXBlZGVmIHsoeDogbnVtYmVyIHwgYmlnaW50LCB5OiBudW1iZXIgfCBiaWdpbnQpID0+IE5hdFZhbHVlfSBOYXRPcCAqL1xuXG4vKipcbiAqIFRoZXNlIG9wZXJhdGlvbnMgc2hvdWxkIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW9ucyB3aXRoIHRoZSB2YWx1ZXMgb2ZcbiAqIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiBuYXRTYWZlTWF0aCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGRpcmVjdGx5LCBhbmQgc28gaXQgbmVlZHMgdG9cbiAqIHZhbGlkYXRlIHRoZSBpbnB1dHMsIGFzIHdlbGwgYXMgdGhlIG91dHB1dHMgd2hlbiBuZWNlc3NhcnkuXG4gKi9cbmNvbnN0ICAgICAgICBuYXRTYWZlTWF0aD1oYXJkZW4oe1xuLyoqIEB0eXBlIHtOYXRPcH0gKi9cbi8qIEJpZ0ludHMgZG9uJ3Qgb2JzZXJ2YWJseSBvdmVyZmxvdyovXG5hZGQ6KHgseSk9Pk5hdCh4KStOYXQoeSksXG4vKiogQHR5cGUge05hdE9wfSAqL1xuc3VidHJhY3Q6KHgseSk9Pk5hdChOYXQoeCktTmF0KHkpKSxcbi8qKiBAdHlwZSB7TmF0T3B9ICovXG5tdWx0aXBseTooeCx5KT0+TmF0KHgpKk5hdCh5KSxcbi8qKiBAdHlwZSB7TmF0T3B9ICovXG5mbG9vckRpdmlkZTooeCx5KT0+TmF0KHgpL05hdCh5KSxcbi8qKiBAdHlwZSB7TmF0T3B9ICovXG5jZWlsRGl2aWRlOih4LHkpPT57XG55PU5hdCh5KTtcbnJldHVybiBOYXQoTmF0KHgpK3ktMW4pL3k7XG4gfSxcbi8qKlxuICogRGl2aWRlIHVzaW5nIGhhbGYtdG8tZXZlbiAoYWthIEJhbmtlcidzIFJvdW5kaW5nKSBhcyBpbiBJRUVFIDc3NCBkZWZhdWx0IHJvdW5kaW5nXG4gKlxuICogQHR5cGUge05hdE9wfVxuICovXG5iYW5rZXJzRGl2aWRlOihhLGIpPT57XG5hPU5hdChhKTtcbmI9TmF0KGIpO1xuXG5jb25zdCBkaXY9YS9iO1xuY29uc3QgcmVtPWElYjtcbi8qIGlmIHJlbWFpbmRlciA+IGhhbGYgZGl2aXNvciwgc2hvdWxkIGhhdmUgcm91bmRlZCB1cCBpbnN0ZWFkIG9mIGRvd24sIHNvIGFkZCAxKi9cbmlmKHJlbSoybj5iKXtcbnJldHVybiBkaXYrMW47XG4gfWVsc2UgaWYocmVtKjJuPT09Yil7XG4vKiBBZGQgMSBpZiByZXN1bHQgaXMgb2RkIHRvIGdldCBhbiBldmVuIHJldHVybiB2YWx1ZSovXG5pZihkaXYlMm49PT0xbilyZXR1cm4gZGl2KzFuO1xuIH1cbnJldHVybiBkaXY7XG4gfSxcbi8qKiBAdHlwZSB7KHg6IG51bWJlciB8IGJpZ2ludCwgeTogbnVtYmVyIHwgYmlnaW50KSA9PiBib29sZWFufSAqL1xuaXNHVEU6KHgseSk9Pk5hdCh4KT49TmF0KHkpfSk7JGjigI1fb25jZS5uYXRTYWZlTWF0aChuYXRTYWZlTWF0aCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0U2FmZU1hdGgiOlsibmF0U2FmZU1hdGgiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAa4MaC5oEAACaBAAANwAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJtYWtlU3RhdGVNYWNoaW5lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyogYWxsb3dlZFRyYW5zaXRpb25zIGlzIGFuIGFycmF5IG9mIGFycmF5cyB3aGljaCBnZXRzIHR1cm5lZCBpbnRvIGFcbiAqIG1hcC4gVGhlIG1hcCBtYXBzIHN0cmluZyBzdGF0ZXMgdG8gYW4gYXJyYXkgb2YgcG90ZW50aWFsIG5leHRcbiAqIHN0YXRlcy4gRm9yIGV4YW1wbGUsXG4gKiBjb25zdCBhbGxvd2VkVHJhbnNpdGlvbnMgPSBbXG4gWydvcGVuJywgWydjbG9zZWQnXV0sXG4gWydjbG9zZWQnLCBbXV0sXG4gKiBdO1xuKi9cbmNvbnN0IG1ha2VTdGF0ZU1hY2hpbmU9KGluaXRpYWxTdGF0ZSxhbGxvd2VkVHJhbnNpdGlvbnNBcnJheSk9PntcbmxldCBzdGF0ZT1pbml0aWFsU3RhdGU7XG5jb25zdCBhbGxvd2VkVHJhbnNpdGlvbnM9bmV3IE1hcChhbGxvd2VkVHJhbnNpdGlvbnNBcnJheSk7XG5yZXR1cm4gaGFyZGVuKHtcbmNhblRyYW5zaXRpb25UbzoobmV4dFN0YXRlKT0+XG5hbGxvd2VkVHJhbnNpdGlvbnMuZ2V0KHN0YXRlKS5pbmNsdWRlcyhuZXh0U3RhdGUpLFxudHJhbnNpdGlvblRvOihuZXh0U3RhdGUpPT57XG5hc3NlcnQoYWxsb3dlZFRyYW5zaXRpb25zLmdldChzdGF0ZSkuaW5jbHVkZXMobmV4dFN0YXRlKSk7XG5zdGF0ZT1uZXh0U3RhdGU7XG4gfSxcbmdldFN0YXR1czooXyk9PnN0YXRlfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVN0YXRlTWFjaGluZShtYWtlU3RhdGVNYWNoaW5lKTtcbmhhcmRlbihtYWtlU3RhdGVNYWNoaW5lKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RhdGVNYWNoaW5lIjpbIm1ha2VTdGF0ZU1hY2hpbmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfm1pbX8FAAB/BQAANQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0aXN0aWNzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJjYWxjdWxhdGVNZWRpYW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUeXBlZE1hdGhcbiAqIEBwcm9wZXJ0eSB7KGE6IFQsIGI6IFQpID0+IFR9IGFkZFxuICogQHByb3BlcnR5IHsoYTogVCwgYjogYmlnaW50KSA9PiBUfSBkaXZpZGVcbiAqIEBwcm9wZXJ0eSB7KGE6IFQsIGI6IFQpID0+IGJvb2xlYW59IGlzR1RFXG4gKi9cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG1lZGlhbiBvZiBhIHNldCBvZiBzYW1wbGVzXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7QXJyYXk8VD59IHNhbXBsZXMgdGhlIGlucHV0IG1lYXN1cmVtZW50c1xuICogQHBhcmFtIHtUeXBlZE1hdGg8VD59IG1hdGhcbiAqIEByZXR1cm5zIHtUIHwgdW5kZWZpbmVkfSB0aGUgbWVkaWFuICh1bmRlZmluZWQgaWYgbm8gc2FtcGxlcylcbiAqL1xuY29uc3QgICAgICAgIGNhbGN1bGF0ZU1lZGlhbj0oc2FtcGxlcyxtYXRoKT0+e1xuY29uc3Qgc29ydGVkPXNhbXBsZXMuc29ydCgoYSxiKT0+e1xuaWYoIW1hdGguaXNHVEUoYSxiKSl7XG5yZXR1cm4tMTtcbiB9ZWxzZSBpZighbWF0aC5pc0dURShiLGEpKXtcbnJldHVybiAxO1xuIH1cbnJldHVybiAwO1xuIH0pO1xuXG5pZihzb3J0ZWQubGVuZ3RoPT09MCl7XG4vKiBObyB2YWxpZCBzYW1wbGVzLCBkb24ndCByZXBvcnQgYW55dGhpbmcuKi9cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuXG5pZihzb3J0ZWQubGVuZ3RoJTIhPT0wKXtcbi8qIE9kZCBsZW5ndGgsIGp1c3QgcGljayB0aGUgbWlkZGxlIGVsZW1lbnQuKi9cbnJldHVybiBzb3J0ZWRbKHNvcnRlZC5sZW5ndGgtMSkvMl07XG4gfVxuXG4vKiBFdmVuIGxlbmd0aCwgdGFrZSB0aGUgbWVhbiBvZiB0aGUgdHdvIG1pZGRsZSB2YWx1ZXMuKi9cbmNvbnN0IHNlY29uZEluZGV4PXNvcnRlZC5sZW5ndGgvMjtcbmNvbnN0IHN1bT1tYXRoLmFkZChzb3J0ZWRbc2Vjb25kSW5kZXgtMV0sc29ydGVkW3NlY29uZEluZGV4XSk7XG5yZXR1cm4gbWF0aC5kaXZpZGUoc3VtLDJuKTtcbiB9OyRo4oCNX29uY2UuY2FsY3VsYXRlTWVkaWFuKGNhbGN1bGF0ZU1lZGlhbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FsY3VsYXRlTWVkaWFuIjpbImNhbGN1bGF0ZU1lZGlhbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+y33fnQcAAJ0HAAAxAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3RvcGljcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIlB1YmxpY1RvcGljU2hhcGUiLCJTdWJzY3JpYmVyU2hhcGUiLCJUb3BpY3NSZWNvcmRTaGFwZSIsIm1ha2VSZWNvcmRlclRvcGljIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFN1YnNjcmliZXJTaGFwZSxNLEU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsIFskaOKAjV9hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wiU3Vic2NyaWJlclNoYXBlXCJdXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbmNvbnN0ICAgICAgICBQdWJsaWNUb3BpY1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5zdWJzY3JpYmVyOlN1YnNjcmliZXJTaGFwZSxcbnN0b3JhZ2VQYXRoOk0ucHJvbWlzZSgpfSxcblxue2Rlc2NyaXB0aW9uOk0uc3RyaW5nKCl9KTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBUIHRvcGljIHZhbHVlXG4gKiBAdHlwZWRlZiB7e1xuICogICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAqICAgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxUPixcbiAqICAgc3RvcmFnZVBhdGg6IEVSZWY8c3RyaW5nPixcbiAqIH19IFB1YmxpY1RvcGljXG4gKi8kaOKAjV9vbmNlLlB1YmxpY1RvcGljU2hhcGUoUHVibGljVG9waWNTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBUb3BpY3NSZWNvcmRTaGFwZT1NLnJlY29yZE9mKE0uc3RyaW5nKCksUHVibGljVG9waWNTaGFwZSk7XG5cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqICAgW3RvcGljTmFtZTogc3RyaW5nXTogUHVibGljVG9waWM8dW5rbm93bj4sXG4gKiB9fSBUb3BpY3NSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9yZWNvcmRlci5qcycpLlJlY29yZGVyS2l0PFQ+IHwgWGltcG9ydCgnLi9yZWNvcmRlci5qcycpLkV2ZW50dWFsUmVjb3JkZXJLaXQ8VD59IHJlY29yZGVyS2l0XG4gKiBAcmV0dXJucyB7UHVibGljVG9waWM8VD59XG4gKi8kaOKAjV9vbmNlLlRvcGljc1JlY29yZFNoYXBlKFRvcGljc1JlY29yZFNoYXBlKTtcbmNvbnN0ICAgICAgICBtYWtlUmVjb3JkZXJUb3BpYz0oZGVzY3JpcHRpb24scmVjb3JkZXJLaXQpPT57XG5jb25zdCByZWNQPVxuJ3JlY29yZGVyJ2luIHJlY29yZGVyS2l0P3JlY29yZGVyS2l0LnJlY29yZGVyOnJlY29yZGVyS2l0LnJlY29yZGVyUDtcbnJldHVybntcbmRlc2NyaXB0aW9uLFxuc3Vic2NyaWJlcjpyZWNvcmRlcktpdC5zdWJzY3JpYmVyLFxuc3RvcmFnZVBhdGg6RShyZWNQKS5nZXRTdG9yYWdlUGF0aCgpfTtcblxuIH07JGjigI1fb25jZS5tYWtlUmVjb3JkZXJUb3BpYyhtYWtlUmVjb3JkZXJUb3BpYyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiU3Vic2NyaWJlclNoYXBlIjpbIlN1YnNjcmliZXJTaGFwZSIsZmFsc2VdfSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlB1YmxpY1RvcGljU2hhcGUiOlsiUHVibGljVG9waWNTaGFwZSJdLCJUb3BpY3NSZWNvcmRTaGFwZSI6WyJUb3BpY3NSZWNvcmRTaGFwZSJdLCJtYWtlUmVjb3JkZXJUb3BpYyI6WyJtYWtlUmVjb3JkZXJUb3BpYyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABlBMIW2gsAANoLAAAwAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VhdEdhaW5zTG9zc2VzUmVjb3JkXG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IHNlYXRcbiAqIEBwcm9wZXJ0eSB7QW1vdW50S2V5d29yZFJlY29yZH0gZ2FpbnMgLSB3aGF0IHRoZSBzZWF0IHdpbGxcbiAqIGdhaW4gYXMgYSByZXN1bHQgb2YgdGhpcyB0cmFkZVxuICogQHByb3BlcnR5IHtBbW91bnRLZXl3b3JkUmVjb3JkfSBsb3NzZXMgLSB3aGF0IHRoZSBzZWF0IFt3aWxsXVxuICogZ2l2ZSB1cCBhcyBhIHJlc3VsdCBvZiB0aGlzIHRyYWRlLiBMb3NzZXMgaXMgb3B0aW9uYWwsIGJ1dCBjYW5cbiAqIG9ubHkgYmUgb21pdHRlZCBpZiB0aGUga2V5d29yZHMgZm9yIGJvdGggc2VhdHMgYXJlIHRoZSBzYW1lLlxuICogSWYgbG9zc2VzIGlzIG5vdCBkZWZpbmVkLCB0aGUgZ2FpbnMgb2YgdGhlIG90aGVyIHNlYXQgaXNcbiAqIHN1YnRyYWN0ZWQuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU3dhcFxuICogSWYgdHdvIHNlYXRzIGNhbiBzYXRpc2Z5IGVhY2ggb3RoZXIncyB3YW50cywgdHJhZGUgZW5vdWdoIHRvXG4gKiBzYXRpc2Z5IHRoZSB3YW50cyBvZiBib3RoIHNlYXRzIGFuZCBleGl0IGJvdGggc2VhdHMuXG4gKlxuICogVGhlIHN1cnBsdXMgcmVtYWlucyB3aXRoIHRoZSBvcmlnaW5hbCBzZWF0LiBGb3IgZXhhbXBsZSBpZiBzZWF0IEFcbiAqIGdpdmVzIDUgbW9vbGEgYW5kIHNlYXQgQiBvbmx5IHdhbnRzIDMgbW9vbGEsIHNlYXQgQSByZXRhaW5zIDJcbiAqIG1vb2xhLlxuICpcbiAqIElmIHRoZSBzd2FwIGZhaWxzLCBubyBhc3NldHMgYXJlIHRyYW5zZmVycmVkLCBib3RoIHNlYXRzIHdpbGwgZmFpbCxcbiAqIGFuZCB0aGUgZnVuY3Rpb24gdGhyb3dzLlxuICpcbiAqIFRoZSBrZXl3b3JkcyBmb3IgYm90aCBzZWF0cyBtdXN0IG1hdGNoLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gbGVmdFNlYXRcbiAqIEBwYXJhbSB7WkNGU2VhdH0gcmlnaHRTZWF0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFN3YXBFeGFjdFxuICpcbiAqIFN3YXAgc3VjaCB0aGF0IGJvdGggc2VhdHMgZ2FpbiB3aGF0IHRoZXkgd2FudCBhbmQgbG9zZSBldmVyeXRoaW5nXG4gKiB0aGF0IHRoZXkgZ2F2ZS4gT25seSBnb29kIGZvciBleGFjdCBhbmQgZW50aXJlIHN3YXBzIHdoZXJlIGVhY2hcbiAqIHNlYXQgd2FudHMgZXZlcnl0aGluZyB0aGF0IHRoZSBvdGhlciBzZWF0IGhhcy4gVGhlIGJlbmVmaXQgb2YgdXNpbmdcbiAqIHRoaXMgbWV0aG9kIGlzIHRoYXQgdGhlIGtleXdvcmRzIG9mIGVhY2ggc2VhdCBkbyBub3QgbWF0dGVyLlxuICpcbiAqIElmIHRoZSBzd2FwIGZhaWxzLCBubyBhc3NldHMgYXJlIHRyYW5zZmVycmVkLCBib3RoIHNlYXRzIHdpbGwgZmFpbCxcbiAqIGFuZCB0aGUgZnVuY3Rpb24gdGhyb3dzLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gbGVmdFNlYXRcbiAqIEBwYXJhbSB7WkNGU2VhdH0gcmlnaHRTZWF0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLEtleXdvcmQ+fSBLZXl3b3JkS2V5d29yZFJlY29yZFxuICpcbiAqIEEgbWFwcGluZyBvZiBrZXl3b3JkcyB0byBrZXl3b3Jkcy5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSZXZlcnNlXG4gKlxuICogR2l2ZW4gYSBtYXBwaW5nIG9mIGtleXdvcmRzIHRvIGtleXdvcmRzLCBpbnZlcnQgdGhlIGtleXMgYW5kXG4gKiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB0byBtYXAgdGhlIG9mZmVycyBtYWRlIHRvIGFub3RoZXIgY29udHJhY3RcbiAqIGJhY2sgdG8gdGhlIGtleXdvcmRzIHVzZWQgaW4gdGhlIGZpcnN0IGNvbnRyYWN0LlxuICogQHBhcmFtIHtLZXl3b3JkS2V5d29yZFJlY29yZH0gW2tleXdvcmRSZWNvcmRdXG4gKiBAcmV0dXJucyB7S2V5d29yZEtleXdvcmRSZWNvcmQgfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1hcEtleXdvcmRzXG4gKlxuICogUmVtYXAgdGhlIGtleXdvcmRzIG9mIGFuIGFtb3VudEtleXdvcmRSZWNvcmQsIGlzc3VlcktleXdvcmRSZWNvcmQsIG9yIGFcbiAqIFBheW1lbnRQS2V5d29yZFJlY29yZCBhY2NvcmRpbmcgdG8gYSBtYXBwaW5nLiBUaGlzIGlzIHVzZWQgdG8gcmVtYXBcbiAqIGZyb20ga2V5d29yZHMgdXNlZCBpbiBjb250cmFjdEEgdG8ga2V5d29yZHMgdXNlZCBpbiBjb250cmFjdEIgYW5kXG4gKiB2aWNlIHZlcnNhIGluIGBvZmZlclRvYFxuICpcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZCB8IFBheW1lbnRQS2V5d29yZFJlY29yZCB8IElzc3VlcktleXdvcmRSZWNvcmQgfCB1bmRlZmluZWQgfSBrZXl3b3JkUmVjb3JkXG4gKiBAcGFyYW0ge0tleXdvcmRLZXl3b3JkUmVjb3JkfSBrZXl3b3JkTWFwcGluZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmF0aW9cbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gbnVtZXJhdG9yXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IGRlbm9taW5hdG9yXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2NhbGVBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50XG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHJldHVybnMge0Ftb3VudDwnbmF0Jz59XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWO0LEE04AABNOAAANQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL2ludGVybmFsIiwiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsIi4vYXRvbWljVHJhbnNmZXIuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRJc3N1ZXJLZXl3b3JkcyIsImFzc2VydE5hdEFzc2V0S2luZCIsImFzc2VydFByb3Bvc2FsU2hhcGUiLCJkZWZhdWx0QWNjZXB0YW5jZU1zZyIsImRlcG9zaXRUb1NlYXQiLCJkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyIsImZpdFByb3Bvc2FsU2hhcGUiLCJtYXBLZXl3b3JkcyIsIm9mZmVyVG8iLCJzYXRpc2ZpZXMiLCJzYXZlQWxsSXNzdWVycyIsInN3YXAiLCJzd2FwRXhhY3QiLCJ3aXRoZHJhd0Zyb21TZWF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG11c3RNYXRjaCxrZXlFUSxFLG1ha2VQcm9taXNlS2l0LEFzc2V0S2luZCxmcm9tVW5pcXVlRW50cmllcyxzYXRpc2ZpZXNXYW50LGF0b21pY1RyYW5zZmVyLGZyb21Pbmx5LHRvT25seTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsIFskaOKAjV9hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRo4oCNX2EpXV1dXSxbXCIuLi9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzXCIsIFtbXCJzYXRpc2ZpZXNXYW50XCIsIFskaOKAjV9hID0+IChzYXRpc2ZpZXNXYW50ID0gJGjigI1fYSldXV1dLFtcIi4vYXRvbWljVHJhbnNmZXIuanNcIiwgW1tcImF0b21pY1RyYW5zZmVyXCIsIFskaOKAjV9hID0+IChhdG9taWNUcmFuc2ZlciA9ICRo4oCNX2EpXV0sW1wiZnJvbU9ubHlcIiwgWyRo4oCNX2EgPT4gKGZyb21Pbmx5ID0gJGjigI1fYSldXSxbXCJ0b09ubHlcIiwgWyRo4oCNX2EgPT4gKHRvT25seSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdCAgICAgICAgZGVmYXVsdEFjY2VwdGFuY2VNc2c9IGBUaGUgb2ZmZXIgaGFzIGJlZW4gYWNjZXB0ZWQuIE9uY2UgdGhlIGNvbnRyYWN0IGhhcyBiZWVuIGNvbXBsZXRlZCwgcGxlYXNlIGNoZWNrIHlvdXIgcGF5b3V0YDskaOKAjV9vbmNlLmRlZmF1bHRBY2NlcHRhbmNlTXNnKGRlZmF1bHRBY2NlcHRhbmNlTXNnKTtcblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCBnZXRLZXlzU29ydGVkPShvYmopPT5oYXJkZW4oUmVmbGVjdC5vd25LZXlzKG9ianx8e30pLnNvcnQoKSk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRJc3N1ZXJLZXl3b3Jkcz0oemNmLGV4cGVjdGVkKT0+e1xuY29uc3R7aXNzdWVyc309emNmLmdldFRlcm1zKCk7XG5jb25zdCBhY3R1YWw9Z2V0S2V5c1NvcnRlZChpc3N1ZXJzKTtcbmV4cGVjdGVkPVsuLi5leHBlY3RlZF07LyogaW4gY2FzZSBoYXJkZW5lZCovXG5leHBlY3RlZC5zb3J0KCk7XG5rZXlFUShhY3R1YWwsaGFyZGVuKGV4cGVjdGVkKSl8fFxuRmFpbCBga2V5d29yZHM6ICR7YWN0dWFsfSB3ZXJlIG5vdCBhcyBleHBlY3RlZDogJHtleHBlY3RlZH1gO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWmNmU2VhdFBhcnRpYWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvcG9zYWxSZWNvcmR9IGdldFByb3Bvc2FsXG4gKiBAcHJvcGVydHkgeygpID0+IEFsbG9jYXRpb259IGdldEN1cnJlbnRBbGxvY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGFuIHVwZGF0ZSB0byBjdXJyZW50QWxsb2NhdGlvbiBzYXRpc2ZpZXNcbiAqIHByb3Bvc2FsLndhbnQuIE5vdGUgdGhhdCB0aGlzIGlzIGhhbGYgb2YgdGhlIG9mZmVyIHNhZmV0eVxuICogY2hlY2s7IHdoZXRoZXIgdGhlIGFsbG9jYXRpb24gY29uc3RpdHV0ZXMgYSByZWZ1bmQgaXMgbm90XG4gKiBjaGVja2VkLiBUaGUgdXBkYXRlIGlzIG1lcmdlZCB3aXRoIGN1cnJlbnRBbGxvY2F0aW9uXG4gKiAodXBkYXRlJ3MgdmFsdWVzIHByZXZhaWxpbmcgaWYgdGhlIGtleXdvcmRzIGFyZSB0aGUgc2FtZSlcbiAqIHRvIHByb2R1Y2UgdGhlIG5ld0FsbG9jYXRpb24uIFRoZSByZXR1cm4gdmFsdWUgaXMgMCBmb3JcbiAqIGZhbHNlIGFuZCAxIGZvciB0cnVlLiBXaGVuIG11bHRpcGxlcyBhcmUgaW50cm9kdWNlZCwgYW55XG4gKiBwb3NpdGl2ZSByZXR1cm4gdmFsdWUgd2lsbCBtZWFuIHRydWUuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaY2ZTZWF0UGFydGlhbH0gc2VhdFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSB1cGRhdGVcbiAqIEByZXR1cm5zIHswfDF9XG4gKi8kaOKAjV9vbmNlLmFzc2VydElzc3VlcktleXdvcmRzKGFzc2VydElzc3VlcktleXdvcmRzKTtcbmNvbnN0ICAgICAgICBzYXRpc2ZpZXM9KHpjZixzZWF0LHVwZGF0ZSk9PntcbmNvbnN0IGN1cnJlbnRBbGxvY2F0aW9uPXNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKTtcbmNvbnN0IG5ld0FsbG9jYXRpb249ey4uLmN1cnJlbnRBbGxvY2F0aW9uLC4uLnVwZGF0ZX07XG5jb25zdCBwcm9wb3NhbD1zZWF0LmdldFByb3Bvc2FsKCk7XG5yZXR1cm4gc2F0aXNmaWVzV2FudChwcm9wb3NhbCxuZXdBbGxvY2F0aW9uKTtcbiB9O1xuXG4vKiogQHR5cGUge1N3YXB9ICovJGjigI1fb25jZS5zYXRpc2ZpZXMoc2F0aXNmaWVzKTtcbmNvbnN0ICAgICAgICBzd2FwPSh6Y2YsbGVmdFNlYXQscmlnaHRTZWF0KT0+e1xudHJ5e1xuemNmLmF0b21pY1JlYXJyYW5nZShcbmhhcmRlbihbXG5bcmlnaHRTZWF0LGxlZnRTZWF0LGxlZnRTZWF0LmdldFByb3Bvc2FsKCkud2FudF0sXG5bbGVmdFNlYXQscmlnaHRTZWF0LHJpZ2h0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnRdXSkpO1xuXG5cbiB9Y2F0Y2goZXJyKXtcbmxlZnRTZWF0LmZhaWwoZXJyKTtcbnJpZ2h0U2VhdC5mYWlsKGVycik7XG50aHJvdyBlcnI7XG4gfVxuXG5sZWZ0U2VhdC5leGl0KCk7XG5yaWdodFNlYXQuZXhpdCgpO1xucmV0dXJuIGRlZmF1bHRBY2NlcHRhbmNlTXNnO1xuIH07XG5cbi8qKiBAdHlwZSB7U3dhcEV4YWN0fSAqLyRo4oCNX29uY2Uuc3dhcChzd2FwKTtcbmNvbnN0ICAgICAgICBzd2FwRXhhY3Q9KHpjZixsZWZ0U2VhdCxyaWdodFNlYXQpPT57XG50cnl7XG56Y2YuYXRvbWljUmVhcnJhbmdlKFxuaGFyZGVuKFtcbmZyb21Pbmx5KHJpZ2h0U2VhdCxyaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS5naXZlKSxcbmZyb21Pbmx5KGxlZnRTZWF0LGxlZnRTZWF0LmdldFByb3Bvc2FsKCkuZ2l2ZSksXG5cbnRvT25seShsZWZ0U2VhdCxsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnQpLFxudG9Pbmx5KHJpZ2h0U2VhdCxyaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KV0pKTtcblxuXG4gfWNhdGNoKGVycil7XG5sZWZ0U2VhdC5mYWlsKGVycik7XG5yaWdodFNlYXQuZmFpbChlcnIpO1xudGhyb3cgZXJyO1xuIH1cblxubGVmdFNlYXQuZXhpdCgpO1xucmlnaHRTZWF0LmV4aXQoKTtcbnJldHVybiBkZWZhdWx0QWNjZXB0YW5jZU1zZztcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIEV4cGVjdGVkUmVjb3JkXG4gKiBAcHJvcGVydHkge1JlY29yZDxLZXl3b3JkLCBudWxsPn0gW3dhbnRdXG4gKiBAcHJvcGVydHkge1JlY29yZDxLZXl3b3JkLCBudWxsPn0gW2dpdmVdXG4gKiBAcHJvcGVydHkge1BhcnRpYWw8UmVjb3JkPGtleW9mIFByb3Bvc2FsUmVjb3JkWydleGl0J10sIG51bGw+Pn0gW2V4aXRdXG4gKi9cblxuLyoqXG4gKiBDaGVjayB0aGUgc2VhdCdzIHByb3Bvc2FsIGFnYWluc3QgYHByb3Bvc2FsU2hhcGVgLlxuICogSWYgdGhlIGNsaWVudCBzdWJtaXRzIGFuIG9mZmVyIHdoaWNoIGRvZXMgbm90IG1hdGNoXG4gKiB0aGVzZSBleHBlY3RhdGlvbnMsIHRoZSBzZWF0IHdpbGwgYmUgZXhpdGVkIChhbmQgcGF5bWVudHMgcmVmdW5kZWQpLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtQYXR0ZXJufSBwcm9wb3NhbFNoYXBlXG4gKi8kaOKAjV9vbmNlLnN3YXBFeGFjdChzd2FwRXhhY3QpO1xuY29uc3QgICAgICAgIGZpdFByb3Bvc2FsU2hhcGU9KHNlYXQscHJvcG9zYWxTaGFwZSk9PlxuLyogVE9ETyByZW1vdmUgdGhpcyBoYXJkZW4sIG9ibGlnYXRpbmcgb3VyIGNhbGxlciB0byBoYXJkZW4uKi9cbm11c3RNYXRjaChzZWF0LmdldFByb3Bvc2FsKCksaGFyZGVuKHByb3Bvc2FsU2hhcGUpLCdwcm9wb3NhbCcpO1xuXG4vKipcbiAqIENoZWNrIHRoZSBzZWF0J3MgcHJvcG9zYWwgYWdhaW5zdCBhbiBgZXhwZWN0ZWRgIHJlY29yZCB0aGF0IHNheXNcbiAqIHdoYXQgXCJzaGFwZVwiIG9mIHByb3Bvc2FsIGlzIGFjY2VwdGFibGUuXG4gKlxuICogTm90ZSB0aGF0IGJ5IG91ciBjdXJyZW50IHRlcm1pbm9sb2d5LCB0aGlzIGZ1bmN0aW9uIGlzIG1pc25hbWVkIGJlY2F1c2VcbiAqIHdlIHVzZVxuICogW1wiU2hhcGVcIiB0byByZWZlciB0byBwYXR0ZXJuc10oaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3N0b3JlL3NyYy90eXBlcy5qcyNMNTYtTDc0KSxcbiAqIGFuZCB0aGUgYGV4cGVjdGVkYCBhcmd1bWVudCBpcyBub3Qgc3VjaCBhIHBhdHRlcm4uIFJhdGhlciBpdCBpcyBhbiBhZC1ob2NcbiAqIHBhdHRlcm4tbGlrZSBzcGVjaWFsIGNhc2UgcmVjb3JkIHRoYXQgaXMgZGlmZmVyZW50IGFuZCBtdWNoIGxlc3MgZXhwcmVzc2l2ZS5cbiAqXG4gKiBUaGlzIEV4cGVjdGVkUmVjb3JkIGlzIGxpa2UgYSBQcm9wb3NhbCwgYnV0IHRoZSBhbW91bnRzIGluICd3YW50J1xuICogYW5kICdnaXZlJyBzaG91bGQgYmUgbnVsbDsgdGhlIGV4aXQgY2xhdXNlIHNob3VsZCBzcGVjaWZ5IGEgcnVsZSB3aXRoXG4gKiBudWxsIGNvbnRlbnRzLiBJZiB0aGUgY2xpZW50IHN1Ym1pdHMgYW4gb2ZmZXIgd2hpY2ggZG9lcyBub3QgbWF0Y2hcbiAqIHRoZXNlIGV4cGVjdGF0aW9ucywgdGhlIHNlYXQgd2lsbCBiZSBleGl0ZWQgKGFuZCBwYXltZW50cyByZWZ1bmRlZCkuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIG9wdGlvbmFsIGBwcm9wb3NhbFNoYXBlYCBhcmd1bWVudCB0byBgbWFrZUludml0YXRpb25gIHdpdGhcbiAqIGEgZ2VudWluZSBwYXR0ZXJuLlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge0V4cGVjdGVkUmVjb3JkfSBleHBlY3RlZFxuICovJGjigI1fb25jZS5maXRQcm9wb3NhbFNoYXBlKGZpdFByb3Bvc2FsU2hhcGUpO1xuY29uc3QgICAgICAgIGFzc2VydFByb3Bvc2FsU2hhcGU9KHNlYXQsZXhwZWN0ZWQpPT57XG5hc3NlcnQudHlwZW9mKGV4cGVjdGVkLCdvYmplY3QnKTtcbiFBcnJheS5pc0FycmF5KGV4cGVjdGVkKXx8RmFpbCBgRXhwZWN0ZWQgbXVzdCBiZSBhbiBub24tYXJyYXkgb2JqZWN0YDtcbmNvbnN0IGFzc2VydFZhbHVlc051bGw9KGUpPT57XG5pZihlIT09dW5kZWZpbmVkKXtcbk9iamVjdC52YWx1ZXMoZSkuZm9yRWFjaChcbih2YWx1ZSk9PlxudmFsdWU9PT1udWxsfHxcbkZhaWwgYFRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgcmVjb3JkIG11c3QgYmUgbnVsbCBidXQgd2FzICR7dmFsdWV9YCk7XG5cbiB9XG4gfTtcblxuLyogQXNzZXJ0IHZhbHVlcyBvZiB0aGUgZXhwZWN0ZWQgcmVjb3JkIGFyZSBhbGwgbnVsbC4gV2UgZG8gbm90Ki9cbi8qIGNoZWNrIHRoZSB2YWx1ZXMgb2YgdGhlIGFjdHVhbCBwcm9wb3NhbC4qL1xuYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC5naXZlKTtcbmFzc2VydFZhbHVlc051bGwoZXhwZWN0ZWQud2FudCk7XG5hc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLmV4aXQpO1xuXG5jb25zdCBhY3R1YWw9c2VhdC5nZXRQcm9wb3NhbCgpO1xuY29uc3QgYXNzZXJ0S2V5cz0oYSxlKT0+e1xuaWYoZSE9PXVuZGVmaW5lZCl7XG5rZXlFUShnZXRLZXlzU29ydGVkKGEpLGdldEtleXNTb3J0ZWQoZSkpfHxcbkZhaWwgYGFjdHVhbCAke2F9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgJHtlfWA7XG4gfVxuIH07XG5hc3NlcnRLZXlzKGFjdHVhbC5naXZlLGV4cGVjdGVkLmdpdmUpO1xuYXNzZXJ0S2V5cyhhY3R1YWwud2FudCxleHBlY3RlZC53YW50KTtcbmFzc2VydEtleXMoYWN0dWFsLmV4aXQsZXhwZWN0ZWQuZXhpdCk7XG4gfTtcblxuLyogR2l2ZW4gYSBicmFuZCwgYXNzZXJ0IHRoYXQgYnJhbmQgaXMgQXNzZXRLaW5kLk5BVC4gKi8kaOKAjV9vbmNlLmFzc2VydFByb3Bvc2FsU2hhcGUoYXNzZXJ0UHJvcG9zYWxTaGFwZSk7XG5jb25zdCAgICAgICAgYXNzZXJ0TmF0QXNzZXRLaW5kPSh6Y2YsYnJhbmQpPT57XG56Y2YuZ2V0QXNzZXRLaW5kKGJyYW5kKT09PUFzc2V0S2luZC5OQVR8fFxuRmFpbCBgYnJhbmQgbXVzdCBiZSBBc3NldEtpbmQuTkFUYDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0TmF0QXNzZXRLaW5kKGFzc2VydE5hdEFzc2V0S2luZCk7XG5cbmNvbnN0ICAgICAgICBkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZz0gYERlcG9zaXQgYW5kIHJlYWxsb2NhdGlvbiBzdWNjZXNzZnVsLmA7XG5cbi8qKlxuICogRGVwb3NpdCBwYXltZW50cyBzdWNoIHRoYXQgdGhlaXIgYW1vdW50cyBhcmUgcmVhbGxvY2F0ZWQgdG8gYSBzZWF0LlxuICogVGhlIGBhbW91bnRzYCBhbmQgYHBheW1lbnRzYCByZWNvcmRzIG11c3QgaGF2ZSBjb3JyZXNwb25kaW5nXG4gKiBrZXl3b3Jkcy5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHJlY2lwaWVudFNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYW1vdW50c1xuICogQHBhcmFtIHtQYXltZW50UEtleXdvcmRSZWNvcmR9IHBheW1lbnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBgRGVwb3NpdCBhbmQgcmVhbGxvY2F0aW9uIHN1Y2Nlc3NmdWwuYFxuICovJGjigI1fb25jZS5kZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyhkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyk7XG5jb25zdCAgICAgICAgZGVwb3NpdFRvU2VhdD1hc3luYyh6Y2YscmVjaXBpZW50U2VhdCxhbW91bnRzLHBheW1lbnRzKT0+e1xuIXJlY2lwaWVudFNlYXQuaGFzRXhpdGVkKCl8fEZhaWwgYFRoZSByZWNpcGllbnRTZWF0IGNhbm5vdCBoYXZlIGV4aXRlZC5gO1xuXG4vKiBXZSB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBvZmZlciB0byBiZSBhYmxlIHRvIGVzY3JvdyBvdXIgcGF5bWVudHMqL1xuLyogd2l0aCBab2UuKi9cbmNvbnN0IHJlYWxsb2NhdGVBZnRlckRlcG9zaXQ9KHRlbXBTZWF0KT0+e1xuLyogQWZ0ZXIgdGhlIGFzc2V0cyBhcmUgZGVwb3NpdGVkLCByZWFsbG9jYXRlIHRoZW0gb250byB0aGUgcmVjaXBpZW50IHNlYXQgYW5kKi9cbi8qIGV4aXQgdGhlIHRlbXBvcmFyeSBzZWF0LiBOb3RlIHRoYXQgdGhlIG9mZmVyUmVzdWx0IGlzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyovXG4vKiBmdW5jdGlvbiwgc28gdGhpcyBzeW5jaHJvbm91cyB0cmFkZSBtdXN0IGhhcHBlbiBiZWZvcmUgdGhlKi9cbi8qIG9mZmVyUmVzdWx0IHJlc29sdmVzLiovXG5hdG9taWNUcmFuc2Zlcih6Y2YsdGVtcFNlYXQscmVjaXBpZW50U2VhdCxhbW91bnRzKTtcbnRlbXBTZWF0LmV4aXQoKTtcbnJldHVybiBkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZztcbiB9O1xuY29uc3QgaW52aXRhdGlvbj16Y2YubWFrZUludml0YXRpb24oXG5yZWFsbG9jYXRlQWZ0ZXJEZXBvc2l0LFxuJ3RlbXBvcmFyeSBzZWF0IGZvciBkZXBvc2l0Jyk7XG5cbmNvbnN0IHByb3Bvc2FsPWhhcmRlbih7Z2l2ZTphbW91bnRzfSk7XG5oYXJkZW4ocGF5bWVudHMpO1xuLyogVG8gZXNjcm93IHRoZSBwYXltZW50LCB3ZSBtdXN0IGdldCB0aGUgWm9lIFNlcnZpY2UgZmFjZXQgYW5kKi9cbi8qIG1ha2UgYW4gb2ZmZXIqL1xuY29uc3Qgem9lPXpjZi5nZXRab2VTZXJ2aWNlKCk7XG5jb25zdCB0ZW1wVXNlclNlYXQ9RSh6b2UpLm9mZmVyKGludml0YXRpb24scHJvcG9zYWwscGF5bWVudHMpO1xuLyogVGhpcyB3aWxsIGJlIGEgcHJvbWlzZSBmb3IgdGhlIHN0cmluZzogYERlcG9zaXQgYW5kIHJlYWxsb2NhdGlvbiovXG4vKiBzdWNjZXNzZnVsLmAgSXQgd2lsbCBvbmx5IGZ1bGZpbGwgYWZ0ZXIgdGhlIGFzc2V0cyBoYXZlIGJlZW4qL1xuLyogc3VjY2Vzc2Z1bGx5IHJlYWxsb2NhdGVkIHRvIHRoZSByZWNpcGllbnQgc2VhdC4qL1xucmV0dXJuIEUodGVtcFVzZXJTZWF0KS5nZXRPZmZlclJlc3VsdCgpO1xuIH07XG5cbi8qKlxuICogV2l0aGRyYXcgcGF5bWVudHMgZnJvbSBhIHNlYXQuIE5vdGUgdGhhdCB3aXRoZHJhd2luZyB0aGUgYW1vdW50cyBvZlxuICogdGhlIHBheW1lbnRzIG11c3Qgbm90IGFuZCBjYW5ub3QgdmlvbGF0ZSBvZmZlciBzYWZldHkgZm9yIHRoZSBzZWF0LiBUaGVcbiAqIGBhbW91bnRzYCBhbmQgYHBheW1lbnRzYCByZWNvcmRzIG11c3QgaGF2ZSBjb3JyZXNwb25kaW5nIGtleXdvcmRzLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbW91bnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50UEtleXdvcmRSZWNvcmQ+fVxuICovJGjigI1fb25jZS5kZXBvc2l0VG9TZWF0KGRlcG9zaXRUb1NlYXQpO1xuY29uc3QgICAgICAgIHdpdGhkcmF3RnJvbVNlYXQ9YXN5bmMoemNmLHNlYXQsYW1vdW50cyk9PntcbiFzZWF0Lmhhc0V4aXRlZCgpfHxGYWlsIGBUaGUgc2VhdCBjYW5ub3QgaGF2ZSBleGl0ZWQuYDtcbmNvbnN0e3pjZlNlYXQ6dGVtcFNlYXQsdXNlclNlYXQ6dGVtcFVzZXJTZWF0UH09emNmLm1ha2VFbXB0eVNlYXRLaXQoKTtcbmF0b21pY1RyYW5zZmVyKHpjZixzZWF0LHRlbXBTZWF0LGFtb3VudHMpO1xudGVtcFNlYXQuZXhpdCgpO1xucmV0dXJuIEUodGVtcFVzZXJTZWF0UCkuZ2V0UGF5b3V0cygpO1xuIH07XG5cbi8qKlxuICogU2F2ZSBhbGwgb2YgdGhlIGlzc3VlcnMgaW4gYW4gaXNzdWVyc0tleXdvcmRSZWNvcmQgdG8gWkNGLCB1c2luZ1xuICogdGhlIG1ldGhvZCBgemNmLnNhdmVJc3N1ZXJgLiBUaGlzIGRvZXMgbm90IGVycm9yIGlmIGFueSBvZiB0aGUga2V5d29yZHNcbiAqIGFscmVhZHkgZXhpc3QuIElmIHRoZSBrZXl3b3JkIGlzIGFscmVhZHkgcHJlc2VudCwgaXQgaXMgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0lzc3VlcktleXdvcmRSZWNvcmR9IGlzc3VlcktleXdvcmRSZWNvcmQgSXNzdWVycyB0byBzYXZlIHRvXG4gKiBaQ0ZcbiAqLyRo4oCNX29uY2Uud2l0aGRyYXdGcm9tU2VhdCh3aXRoZHJhd0Zyb21TZWF0KTtcbmNvbnN0ICAgICAgICBzYXZlQWxsSXNzdWVycz1hc3luYyh6Y2YsaXNzdWVyS2V5d29yZFJlY29yZD1oYXJkZW4oe30pKT0+e1xuY29uc3R7aXNzdWVyc309emNmLmdldFRlcm1zKCk7XG5jb25zdCBpc3N1ZXJzUFNhdmVkPU9iamVjdC5lbnRyaWVzKGlzc3VlcktleXdvcmRSZWNvcmQpLm1hcChcbihba2V5d29yZCxpc3N1ZXJdKT0+e1xuLyogSWYgdGhlIGtleXdvcmQgZG9lcyBub3QgeWV0IGV4aXN0LCBhZGQgaXQgYW5kIHRoZSovXG4vKiBhc3NvY2lhdGVkIGlzc3Vlci4qL1xuaWYoaXNzdWVyc1trZXl3b3JkXT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gemNmLnNhdmVJc3N1ZXIoaXNzdWVyLGtleXdvcmQpO1xuIH1cbnJldHVybiB1bmRlZmluZWQ7XG4gfSk7XG5cbnJldHVybiBQcm9taXNlLmFsbChpc3N1ZXJzUFNhdmVkKTtcbiB9O1xuXG4vKiogQHR5cGUge01hcEtleXdvcmRzfSAqLyRo4oCNX29uY2Uuc2F2ZUFsbElzc3VlcnMoc2F2ZUFsbElzc3VlcnMpO1xuY29uc3QgICAgICAgIG1hcEtleXdvcmRzPShrZXl3b3JkUmVjb3JkPXt9LGtleXdvcmRNYXBwaW5nKT0+e1xucmV0dXJuIGhhcmRlbihcbmZyb21VbmlxdWVFbnRyaWVzKFxuT2JqZWN0LmVudHJpZXMoa2V5d29yZFJlY29yZCkubWFwKChba2V5d29yZCx2YWx1ZV0pPT57XG5pZihrZXl3b3JkTWFwcGluZ1trZXl3b3JkXT09PXVuZGVmaW5lZCl7XG5yZXR1cm5ba2V5d29yZCx2YWx1ZV07XG4gfVxucmV0dXJuW2tleXdvcmRNYXBwaW5nW2tleXdvcmRdLHZhbHVlXTtcbiB9KSkpO1xuXG5cbiB9O1xuLyoqIEB0eXBlIHtSZXZlcnNlfSAqLyRo4oCNX29uY2UubWFwS2V5d29yZHMobWFwS2V5d29yZHMpO1xuY29uc3QgcmV2ZXJzZT0oa2V5d29yZFJlY29yZD17fSk9PntcbnJldHVybiBoYXJkZW4oXG5mcm9tVW5pcXVlRW50cmllcyhcbk9iamVjdC5lbnRyaWVzKGtleXdvcmRSZWNvcmQpLm1hcCgoW2tleSx2YWx1ZV0pPT5bdmFsdWUsa2V5XSkpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBNYWtlIGFuIG9mZmVyIHRvIGFub3RoZXIgY29udHJhY3QgaW5zdGFuY2UgKGxhYmVsZWQgY29udHJhY3RCIGJlbG93KSxcbiAqIHdpdGhkcmF3aW5nIHRoZSBwYXltZW50cyBmb3IgdGhlIG9mZmVyIGZyb20gYSBzZWF0IGluIHRoZSBjdXJyZW50XG4gKiBjb250cmFjdCBpbnN0YW5jZSAoY29udHJhY3RBKSBhbmQgZGVwb3NpdGluZyB0aGUgcGF5b3V0cyBpbiBhbm90aGVyXG4gKiBzZWF0IGluIHRoZSBjdXJyZW50IGNvbnRyYWN0IGluc3RhbmNlIChjb250cmFjdEEpLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqICAgWm9lIENvbnRyYWN0IEZhY2V0IGZvciBjb250cmFjdEFcbiAqXG4gKiBAcGFyYW0ge0VSZWY8SW52aXRhdGlvbjxSZXN1bHQsIEFyZ3M+Pn0gaW52aXRhdGlvblxuICogICBJbnZpdGF0aW9uIHRvIGNvbnRyYWN0QlxuICpcbiAqIEBwYXJhbSB7S2V5d29yZEtleXdvcmRSZWNvcmQgfCB1bmRlZmluZWR9IGtleXdvcmRNYXBwaW5nXG4gKiAgIE1hcHBpbmcgb2Yga2V5d29yZHMgdXNlZCBpbiBjb250cmFjdEEgdG8ga2V5d29yZHMgdG8gYmUgdXNlZCBpblxuICogICBjb250cmFjdEIuIE5vdGUgdGhhdCB0aGUgcGF0aHdheSB0byBkZXBvc2l0IHRoZSBwYXlvdXQgYmFjayB0b1xuICogICBjb250cmFjdEEgcmV2ZXJzZXMgdGhpcyBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWx9IHByb3Bvc2FsXG4gKiAgIFRoZSBwcm9wb3NhbCBmb3IgdGhlIG9mZmVyIHRvIGJlIG1hZGUgdG8gY29udHJhY3RCXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBmcm9tU2VhdFxuICogICBUaGUgc2VhdCBpbiBjb250cmFjdEEgdG8gdGFrZSB0aGUgb2ZmZXIgcGF5bWVudHMgZnJvbS5cbiAqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IFt0b1NlYXRdXG4gKiAgIFRoZSBzZWF0IGluIGNvbnRyYWN0QSB0byBkZXBvc2l0IHRoZSBwYXlvdXQgb2YgdGhlIG9mZmVyIHRvLlxuICogICBJZiBgdG9TZWF0YCBpcyBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdHMgdG8gdGhlIGBmcm9tU2VhdGAuXG4gKlxuICogQHBhcmFtIHtBcmdzfSBbb2ZmZXJBcmdzXVxuICogICBBZGRpdGlvbmFsIGNvbnRyYWN0LXNwZWNpZmljIG9wdGlvbmFsIGFyZ3VtZW50cyBpbiBhIHJlY29yZC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7dXNlclNlYXRQcm9taXNlOiBQcm9taXNlPFVzZXJTZWF0PFJlc3VsdD4+LCBkZXBvc2l0ZWQ6IFByb21pc2U8QW1vdW50S2V5d29yZFJlY29yZD59Pn1cbiAqICAgQSBwcm9taXNlIGZvciB0aGUgdXNlclNlYXQgZm9yIHRoZSBvZmZlciB0byB0aGUgb3RoZXIgY29udHJhY3QsIGFuZCBhXG4gKiAgIHByb21pc2UgKGBkZXBvc2l0ZWRgKSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBwYXlvdXQgZm9yIHRoZSBvZmZlciBoYXMgYmVlblxuICogICBkZXBvc2l0ZWQgdG8gdGhlIGB0b1NlYXRgLlxuICogICBBbnkgZmFpbHVyZXMgb2YgdGhlIGludml0YXRpb24gd2lsbCBiZSByZXR1cm5lZCBieSBgdXNlclNlYXRQcm9taXNlLmdldE9mZmVyUmVzdWx0KClgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBBcmdzIE9mZmVyIGFyZ3NcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBSZXN1bHQgT2ZmZXIgcmVzdWx0XG4gKi9cbmNvbnN0ICAgICAgICBvZmZlclRvPWFzeW5jKFxuemNmLFxuaW52aXRhdGlvbixcbmtleXdvcmRNYXBwaW5nLFxucHJvcG9zYWwsXG5mcm9tU2VhdCxcbnRvU2VhdCxcbm9mZmVyQXJncyk9Plxue1xuaWYoa2V5d29yZE1hcHBpbmc9PT11bmRlZmluZWQpe1xua2V5d29yZE1hcHBpbmc9aGFyZGVuKHt9KTtcbiB9XG5cbmNvbnN0IGRlZmluZWRUb1NlYXQ9dG9TZWF0IT09dW5kZWZpbmVkP3RvU2VhdDpmcm9tU2VhdDtcblxuY29uc3Qgem9lPXpjZi5nZXRab2VTZXJ2aWNlKCk7XG5jb25zdCBtYXBwaW5nUmV2ZXJzZWQ9cmV2ZXJzZShrZXl3b3JkTWFwcGluZyk7XG5cbmNvbnN0IG5ld0tleXdvcmRzPVxucHJvcG9zYWwhPT11bmRlZmluZWQ/XG5tYXBLZXl3b3Jkcyhwcm9wb3NhbC5naXZlLG1hcHBpbmdSZXZlcnNlZCk6XG5oYXJkZW4oe30pO1xuXG4vKiB0aGUgcHJvcG9zYWwgaXMgaW4gdGhlIG90aGVyIGNvbnRyYWN0J3Mga2V5d29yZHMsIGJ1dCB3ZSB3YW50IHRvKi9cbi8qIHVzZSBgcHJvcG9zYWwuZ2l2ZWAgdG8gd2l0aGRyYXcqL1xuY29uc3QgcGF5bWVudHM9YXdhaXQgd2l0aGRyYXdGcm9tU2VhdCh6Y2YsZnJvbVNlYXQsbmV3S2V5d29yZHMpO1xuXG4vKiBNYXAgdG8gdGhlIG90aGVyIGNvbnRyYWN0J3Mga2V5d29yZHMqL1xuY29uc3QgcGF5bWVudHNGb3JPdGhlckNvbnRyYWN0PW1hcEtleXdvcmRzKHBheW1lbnRzLGtleXdvcmRNYXBwaW5nKTtcblxuY29uc3QgdXNlclNlYXRQcm9taXNlPUUoem9lKS5vZmZlcihcbmludml0YXRpb24sXG5wcm9wb3NhbCxcbnBheW1lbnRzRm9yT3RoZXJDb250cmFjdCxcbm9mZmVyQXJncyk7XG5cblxuY29uc3QgZGVwb3NpdGVkUHJvbWlzZUtpdD1tYWtlUHJvbWlzZUtpdCgpO1xuXG5jb25zdCBkb0RlcG9zaXQ9YXN5bmMocGF5b3V0UGF5bWVudHMpPT57XG4vKiBhZnRlciBnZXRQYXlvdXRzKCksIGdldEZpbmFsQWxsb2NhdGlvbigpIHJlc29sdmVzIHByb21wdGx5LiovXG5jb25zdCBhbW91bnRzPWF3YWl0IEUodXNlclNlYXRQcm9taXNlKS5nZXRGaW5hbEFsbG9jYXRpb24oKTtcblxuLyogTWFwIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvbnRyYWN0J3Mga2V5d29yZHMqL1xuY29uc3QgbWFwcGVkQW1vdW50cz1tYXBLZXl3b3JkcyhhbW91bnRzLG1hcHBpbmdSZXZlcnNlZCk7XG5jb25zdCBtYXBwZWRQYXltZW50cz1tYXBLZXl3b3JkcyhwYXlvdXRQYXltZW50cyxtYXBwaW5nUmV2ZXJzZWQpO1xuYXdhaXQgZGVwb3NpdFRvU2VhdCh6Y2YsZGVmaW5lZFRvU2VhdCxtYXBwZWRBbW91bnRzLG1hcHBlZFBheW1lbnRzKTtcbmRlcG9zaXRlZFByb21pc2VLaXQucmVzb2x2ZShtYXBwZWRBbW91bnRzKTtcbiB9O1xuXG5FKHVzZXJTZWF0UHJvbWlzZSkuZ2V0UGF5b3V0cygpLnRoZW4oZG9EZXBvc2l0KTtcblxuLyogVE9ETyByZW5hbWUgcmV0dXJuIGtleTsgdXNlclNlYXRQcm9taXNlIGlzIGEgcmVtb3RlIFVzZXJTZWF0Ki9cbnJldHVybiBoYXJkZW4oe3VzZXJTZWF0UHJvbWlzZSxkZXBvc2l0ZWQ6ZGVwb3NpdGVkUHJvbWlzZUtpdC5wcm9taXNlfSk7XG4gfTskaOKAjV9vbmNlLm9mZmVyVG8ob2ZmZXJUbyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciOlsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciXSwiYXNzZXJ0SXNzdWVyS2V5d29yZHMiOlsiYXNzZXJ0SXNzdWVyS2V5d29yZHMiXSwic2F0aXNmaWVzIjpbInNhdGlzZmllcyJdLCJzd2FwIjpbInN3YXAiXSwic3dhcEV4YWN0IjpbInN3YXBFeGFjdCJdLCJmaXRQcm9wb3NhbFNoYXBlIjpbImZpdFByb3Bvc2FsU2hhcGUiXSwiYXNzZXJ0UHJvcG9zYWxTaGFwZSI6WyJhc3NlcnRQcm9wb3NhbFNoYXBlIl0sImFzc2VydE5hdEFzc2V0S2luZCI6WyJhc3NlcnROYXRBc3NldEtpbmQiXSwiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciOlsiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciXSwiZGVwb3NpdFRvU2VhdCI6WyJkZXBvc2l0VG9TZWF0Il0sIndpdGhkcmF3RnJvbVNlYXQiOlsid2l0aGRyYXdGcm9tU2VhdCJdLCJzYXZlQWxsSXNzdWVycyI6WyJzYXZlQWxsSXNzdWVycyJdLCJtYXBLZXl3b3JkcyI6WyJtYXBLZXl3b3JkcyJdLCJvZmZlclRvIjpbIm9mZmVyVG8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8jB0g1cHAABXBwAANQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0cy9jYWxsU3ByZWFkL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7J2xvbmcnIHwgJ3Nob3J0J30gUG9zaXRpb25LaW5kXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZU9wdGlvbkludml0YXRpb25cbiAqIEBwYXJhbSB7UG9zaXRpb25LaW5kfSBwb3NpdGlvbktpbmRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGF5b2ZmSGFuZGxlclxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBzY2hlZHVsZVBheW9mZnNcbiAqIEBwcm9wZXJ0eSAge01ha2VPcHRpb25JbnZpdGF0aW9ufSBtYWtlT3B0aW9uSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ2FsY3VsYXRlU2hhcmVzUmV0dXJuXG4gKiBSZXR1cm4gdmFsdWUgZnJvbSBjYWxjdWxhdGVTaGFyZXMsIHdoaWNoIHJlcHJlc2VudHMgdGhlIHBvcnRpb25zIGFzc2lnbmVkIHRvXG4gKiB0aGUgbG9uZyBhbmQgc2hvcnQgc2lkZSBvZiBhIHRyYW5zYWN0aW9uLiBUaGVzZSB3aWxsIGJlIHR3byBub24tbmVnYXRpdmVcbiAqIGludGVnZXJzIHRoYXQgc3VtIHRvIDEwMC5cbiAqIEBwcm9wZXJ0eSB7UmF0aW99IGxvbmdTaGFyZVxuICogQHByb3BlcnR5IHtSYXRpb30gc2hvcnRTaGFyZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENhbGN1bGF0ZVNoYXJlc1xuICogY2FsY3VsYXRlIHRoZSBwb3J0aW9uIChhcyBhIHBlcmNlbnRhZ2UpIG9mIHRoZSBjb2xsYXRlcmFsIHRoYXQgc2hvdWxkIGJlXG4gKiBhbGxvY2F0ZWQgdG8gdGhlIGxvbmcgc2lkZSBvZiBhIGNhbGwgc3ByZWFkIGNvbnRyYWN0LiBwcmljZSBnaXZlcyB0aGUgdmFsdWVcbiAqIG9mIHRoZSB1bmRlcmx5aW5nIGFzc2V0IGF0IGNsb3NpbmcgdGhhdCBkZXRlcm1pbmVzIHRoZSBwYXlvdXRzIHRvIHRoZSBwYXJ0aWVzXG4gKlxuICogaWYgcHJpY2UgPD0gc3RyaWtlUHJpY2UxLCByZXR1cm4gUmF0aW8gcmVwcmVzZW50aW5nIDBcbiAqIGlmIHByaWNlID49IHN0cmlrZVByaWNlMiwgcmV0dXJuIFJhdGlvIHJlcHJlc2VudGluZyAxLlxuICogT3RoZXJ3aXNlIHJldHVybiBsb25nU2hhcmUgYW5kIHNob3J0U2hhcmUgcmVwcmVzZW50aW5nIHJhdGlvcyBiZXR3ZWVuIDAlIGFuZFxuICogMTAwJSByZWZsZWN0aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgcHJpY2UgaW4gdGhlIHJhbmdlIGZyb20gc3RyaWtlUHJpY2UxIHRvXG4gKiBzdHJpa2VQcmljZTIuXG4gKiBAcGFyYW0ge0JyYW5kfSBjb2xsYXRlcmFsQnJhbmRcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gcHJpY2VcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gc3RyaWtlUHJpY2UxXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHN0cmlrZVByaWNlMlxuICogQHJldHVybnMge0NhbGN1bGF0ZVNoYXJlc1JldHVybn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlMTAwUGVyY2VudFxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlMFBlcmNlbnRcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANfaWibgBAAC4AQAALQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLmpzIiwiLi9sb2FuL3R5cGVzLmpzIiwiLi9jYWxsU3ByZWFkL3R5cGVzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dLFtcIi4vbG9hbi90eXBlcy5qc1wiLCBbXV0sW1wiLi9jYWxsU3ByZWFkL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADp0ew1oxoAAKMaAAAvAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RzL2xvYW4vdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0eXBlZGVmIHtOb3RpZmllcjxYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wUmVjb3JkPn0gUGVyaW9kTm90aWZpZXJcbiAqXG4gKiAgVGhlIE5vdGlmaWVyIHRoYXQgcHJvdmlkZXMgbm90aWZpY2F0aW9ucyB0aGF0IHBlcmlvZHMgaGF2ZSBwYXNzZWQuXG4gKiAgU2luY2Ugbm90aWZpZXJzIGNhbid0IGJlIHJlbGllZCBvbiB0byBwcm9kdWNlIGFuIG91dHB1dCBldmVyeSB0aW1lXG4gKiAgdGhleSBzaG91bGQsIHdlJ2xsIHRyYWNrIHRoZSB0aW1lIG9mIGxhc3QgcGF5bWVudCwgYW5kIGNhdGNoIHVwIGlmXG4gKiAgYW55IHRpbWVzIGhhdmUgYmVlbiBtaXNzZWQuIENvbXBvdW5kIGludGVyZXN0IHdpbGwgYmUgY2FsY3VsYXRlZFxuICogIHVzaW5nIHRoZSBpbnRlcmVzdFJhdGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SW5zdGFuY2V9IEF1dG9zd2FwSW5zdGFuY2VcbiAqICAgVGhlIHJ1bm5pbmcgY29udHJhY3QgaW5zdGFuY2UgZm9yIGFuIEF1dG9zd2FwIGluc3RhbGxhdGlvbi4gIFRoZVxuICogICBwdWJsaWNGYWNldCBmcm9tIHRoZSBBdXRvc3dhcFxuICogICBpbnN0YW5jZSBpcyB1c2VkIGZvciBwcm9kdWNpbmcgYW4gaW52aXRhdGlvbiB0byBzZWxsIHRoZVxuICogICBjb2xsYXRlcmFsIG9uIGxpcXVpZGF0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTG9hblRlcm1zXG4gKlxuICogQHByb3BlcnR5IHtSYXRpb30gbW1yIC0gTWFpbnRlbmFuY2UgTWFyZ2luIFJlcXVpcmVtZW50LCBhIFJhdGlvIHJlY29yZC5cbiAqIERlZmF1bHQgaXMgMTUwJVxuICpcbiAqIEBwcm9wZXJ0eSB7QXV0b3N3YXBJbnN0YW5jZX0gYXV0b3N3YXBJbnN0YW5jZVxuICpcbiAqIEBwcm9wZXJ0eSB7UHJpY2VBdXRob3JpdHl9IHByaWNlQXV0aG9yaXR5XG4gKlxuICogICBVc2VkIGZvciBnZXR0aW5nIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNvbGxhdGVyYWwgYW5kIHNldHRpbmdcbiAqICAgbGlxdWlkYXRpb24gdHJpZ2dlcnMuXG4gKlxuICogQHByb3BlcnR5IHtQZXJpb2ROb3RpZmllcn0gcGVyaW9kTm90aWZpZXJcbiAqXG4gKiBAcHJvcGVydHkge1JhdGlvfSBpbnRlcmVzdFJhdGVcbiAqICAgVGhlIHJhdGUgaW4gYmFzaXMgcG9pbnRzIHRoYXQgd2lsbCBiZSBtdWx0aXBsaWVkIHdpdGggdGhlIGRlYnQgb25cbiAqICAgZXZlcnkgcGVyaW9kIHRvIGNvbXBvdW5kIGludGVyZXN0LlxuICpcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlJlbGF0aXZlVGltZX0gaW50ZXJlc3RQZXJpb2RcbiAqXG4gKiBAcHJvcGVydHkge0JyYW5kfSBsb2FuQnJhbmRcbiAqIEBwcm9wZXJ0eSB7QnJhbmR9IGNvbGxhdGVyYWxCcmFuZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGVuZGVyU2VhdFByb3BlcnR5XG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IGxlbmRlclNlYXRcbiAqXG4gKiAgIFRoZSBaQ0ZTZWF0IHJlcHJlc2VudGluZyB0aGUgbGVuZGVyJ3MgcG9zaXRpb24gaW4gdGhlIGNvbnRyYWN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0xvYW5UZXJtcyAmIExlbmRlclNlYXRQcm9wZXJ0eX0gTG9hbkNvbmZpZ1dpdGhMZW5kZXJcbiAqXG4gKiBUaGUgbG9hbiBub3cgaGFzIGEgbGVuZGVyU2VhdCwgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIGNvbmZpZy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJvcnJvd2VyQ29uZmlnUHJvcGVydGllc1xuICpcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdH0gY29sbGF0ZXJhbFNlYXRcbiAqXG4gKiAgIFRoZSBaQ0ZTZWF0IGhvbGRpbmcgdGhlIGNvbGxhdGVyYWwgaW4gZXNjcm93IGFmdGVyIHRoZSBib3Jyb3dlclxuICogICBlc2Nyb3dzIGl0XG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8J25hdCc+fSBnZXREZWJ0XG4gKlxuICogICBBIGZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCBkZWJ0XG4gKlxuICogQHByb3BlcnR5IHtQcm9taXNlUmVjb3JkPFByaWNlUXVvdGU+fSBsaXF1aWRhdGlvblByb21pc2VLaXRcbiAqXG4gKiAgIFByb21pc2VLaXQgdGhhdCBpbmNsdWRlcyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIFByaWNlUXVvdGVcbiAqICAgd2hlbiBsaXF1aWRhdGlvbiBpcyB0cmlnZ2VyZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJvcnJvd2VyQ29uZmlnUHJvcGVydGllc01pbnVzRGVidFxuICpcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdH0gY29sbGF0ZXJhbFNlYXRcbiAqXG4gKiAgIFRoZSBaQ0ZTZWF0IGhvbGRpbmcgdGhlIGNvbGxhdGVyYWwgaW4gZXNjcm93IGFmdGVyIHRoZSBib3Jyb3dlclxuICogICBlc2Nyb3dzIGl0XG4gKlxuICogQHByb3BlcnR5IHtQcm9taXNlUmVjb3JkPFByaWNlUXVvdGU+fSBsaXF1aWRhdGlvblByb21pc2VLaXRcbiAqXG4gKiAgIFByb21pc2VLaXQgdGhhdCBpbmNsdWRlcyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIFByaWNlUXVvdGVcbiAqICAgd2hlbiBsaXF1aWRhdGlvbiBpcyB0cmlnZ2VyZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtMb2FuQ29uZmlnV2l0aExlbmRlciAmIEJvcnJvd2VyQ29uZmlnUHJvcGVydGllcyB9IExvYW5Db25maWdXaXRoQm9ycm93ZXJcbiAqXG4gKiBUaGUgbG9hbiBoYXMgYSBsZW5kZXIsIGEgYm9ycm93ZXIsIGFuZCBjb2xsYXRlcmFsIGVzY3Jvd2VkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0xvYW5Db25maWdXaXRoTGVuZGVyICYgQm9ycm93ZXJDb25maWdQcm9wZXJ0aWVzTWludXNEZWJ0XG4gKiB9IExvYW5Db25maWdXaXRoQm9ycm93ZXJNaW51c0RlYnRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTY2hlZHVsZUxpcXVpZGF0aW9uXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0xvYW5Db25maWdXaXRoQm9ycm93ZXJ9IGNvbmZpZ1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VMZW5kSW52aXRhdGlvblxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuVGVybXN9IGNvbmZpZ1xuICogQHJldHVybnMge1Byb21pc2U8SW52aXRhdGlvbj59IGxlbmRJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUJvcnJvd0ludml0YXRpb25cbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7TG9hbkNvbmZpZ1dpdGhMZW5kZXJ9IGNvbmZpZ1xuICogQHJldHVybnMge1Byb21pc2U8SW52aXRhdGlvbj59IGJvcnJvd0ludml0YXRpb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlQ2xvc2VMb2FuSW52aXRhdGlvblxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBjbG9zZUxvYW5JbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBBbGxvd3MgaG9sZGVyIHRvIGFkZCBjb2xsYXRlcmFsIHRvIHRoZSBjb250cmFjdC4gRXhpdHMgdGhlIHNlYXRcbiAqIGFmdGVyIGFkZGluZy5cbiAqXG4gKiBAY2FsbGJhY2sgTWFrZUFkZENvbGxhdGVyYWxJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0xvYW5Db25maWdXaXRoQm9ycm93ZXJ9IGNvbmZpZ1xuICogQHJldHVybnMge1Byb21pc2U8SW52aXRhdGlvbj59IGFkZENvbGxhdGVyYWxJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTGlxdWlkYXRlXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0xvYW5Db25maWdXaXRoQm9ycm93ZXJ9IGNvbmZpZ1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZURlYnRDYWxjdWxhdG9yXG4gKiBAcGFyYW0ge0RlYnRDYWxjdWxhdG9yQ29uZmlnfSBkZWJ0Q2FsY3VsYXRvckNvbmZpZ1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENhbGNJbnRlcmVzdEZuXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IG9sZERlYnRcbiAqIEBwYXJhbSB7UmF0aW99IGludGVyZXN0UmF0ZVxuICogQHJldHVybnMge0Ftb3VudDwnbmF0Jz59IGludGVyZXN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWJ0Q2FsY3VsYXRvckNvbmZpZ1xuICogQHByb3BlcnR5IHtDYWxjSW50ZXJlc3RGbn0gY2FsY0ludGVyZXN0Rm5cbiAqXG4gKiAgIEEgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBpbnRlcmVzdCwgZ2l2ZW4gdGhlIGRlYnQgdmFsdWUgYW5kIGFuXG4gKiAgIGludGVyZXN0IHJhdGUgaW4gYmFzaXMgcG9pbnRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gb3JpZ2luYWxEZWJ0XG4gKlxuICogICBUaGUgZGVidCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxvYW4sIGluIExvYW4gYnJhbmRcbiAqXG4gKiBAcHJvcGVydHkge1BlcmlvZE5vdGlmaWVyfSBwZXJpb2ROb3RpZmllclxuICpcbiAqICAgVGhlIEFzeW5jSXRlcmFibGUgdG8gbm90aWZ5IHdoZW4gYSBwZXJpb2QgaGFzIG9jY3VycmVkXG4gKlxuICogQHByb3BlcnR5IHtSYXRpb30gaW50ZXJlc3RSYXRlXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5SZWxhdGl2ZVRpbWV9IGludGVyZXN0UGVyaW9kXG4gKlxuICogIHRoZSBwZXJpb2QgYXQgd2hpY2ggdGhlIG91dHN0YW5kaW5nIGRlYnQgaW5jcmVhc2VzIGJ5IHRoZSBpbnRlcmVzdFJhdGVcbiAqXG4gKiBAcHJvcGVydHkge1pDRn0gemNmXG4gKlxuICogQHByb3BlcnR5IHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyTWludXNEZWJ0fSBjb25maWdNaW51c0dldERlYnRcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcH0gYmFzZXRpbWUgVGhlIHN0YXJ0aW5nIHBvaW50IGZyb20gd2hpY2ggdG8gY2FsY3VsYXRlXG4gKiBpbnRlcmVzdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbmZpZ01pbnVzR2V0RGVidFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBjb2xsYXRlcmFsU2VhdFxuICogQHByb3BlcnR5IHtQcm9taXNlUmVjb3JkPGFueT59IGxpcXVpZGF0aW9uUHJvbWlzZUtpdFxuICogQHByb3BlcnR5IHtiaWdpbnR9IFttbXJdXG4gKiBAcHJvcGVydHkge0hhbmRsZTwnSW5zdGFuY2UnPn0gYXV0b3N3YXBJbnN0YW5jZVxuICogQHByb3BlcnR5IHtQcmljZUF1dGhvcml0eX0gcHJpY2VBdXRob3JpdHlcbiAqIEBwcm9wZXJ0eSB7UGVyaW9kTm90aWZpZXJ9IHBlcmlvZE5vdGlmaWVyXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gaW50ZXJlc3RSYXRlXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5SZWxhdGl2ZVRpbWV9IGludGVyZXN0UGVyaW9kXG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IGxlbmRlclNlYXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJvcnJvd0ZhY2V0XG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlQ2xvc2VMb2FuSW52aXRhdGlvblxuICpcbiAqIE1ha2UgYW4gaW52aXRhdGlvbiB0byBjbG9zZSB0aGUgbG9hbiBieSByZXBheWluZyB0aGUgZGVidFxuICogICAoaW5jbHVkaW5nIGludGVyZXN0KS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VBZGRDb2xsYXRlcmFsSW52aXRhdGlvblxuICpcbiAqIE1ha2UgYW4gaW52aXRhdGlvbiB0byBhZGQgY29sbGF0ZXJhbCB0byBwcm90ZWN0IGFnYWluc3QgbGlxdWlkYXRpb25cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8UHJpY2VRdW90ZT59IGdldExpcXVpZGF0aW9uUHJvbWlzZVxuICpcbiAqIEdldCBhIHByb21pc2UgZm9yIGEgcHJpY2VRdW90ZSB0aGF0IHdpbGwgcmVzb2x2ZSBpZiBsaXF1aWRhdGlvblxuICogb2NjdXJzLiBUaGUgcHJpY2VRdW90ZSBpcyBmb3IgdGhlIHZhbHVlIG9mIHRoZSBjb2xsYXRlcmFsIHRoYXRcbiAqIHRyaWdnZXJlZCB0aGUgbGlxdWlkYXRpb24uIFRoaXMgbWF5IGJlIGxvd2VyIHRoYW4gZXhwZWN0ZWQgaWYgdGhlXG4gKiBwcmljZSBpcyBtb3ZpbmcgcXVpY2tseS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXB9IGdldExhc3RDYWxjdWxhdGlvblRpbWVzdGFtcFxuICpcbiAqIEdldCB0aGUgdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBkZWJ0IHdhcyBtb3N0IHJlY2VudGx5IHJlY2FsY3VsYXRlZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE5vdGlmaWVyPEFtb3VudD59IGdldERlYnROb3RpZmllclxuICpcbiAqIEdldCBhIE5vdGlmaWVyIHRoYXQgd2lsbCBiZSB1cGRhdGVkIHdoZW4gdGhlIGN1cnJlbnQgZGVidCAoYW4gQW1vdW50IHdpdGggdGhlIExvYW5cbiAqIEJyYW5kKSBjaGFuZ2VzLiBUaGlzIHdpbGwgaW5jcmVhc2UgYXMgaW50ZXJlc3QgaXMgYWRkZWQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnR9IGdldFJlY2VudENvbGxhdGVyYWxBbW91bnRcbiAqXG4gKiBHZXQgYSByZWNlbnQgcmVwb3J0IG9mIHRoZSBhbW91bnQgb2YgY29sbGF0ZXJhbCBpbiB0aGUgbG9hblxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADhZumLSCwAA0gsAACoAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdHMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlbGxJdGVtc1B1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcn0gZ2V0SXRlbXNJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50fSBnZXRBdmFpbGFibGVJdGVtc1xuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlbGxJdGVtc0NyZWF0b3JPbmx5XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VCdXllckludml0YXRpb25cbiAqXG4gKiBAdHlwZWRlZiB7U2VsbEl0ZW1zUHVibGljRmFjZXQgJiBTZWxsSXRlbXNDcmVhdG9yT25seX0gU2VsbEl0ZW1zQ3JlYXRvckZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IGN1c3RvbVZhbHVlUHJvcGVydGllc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvdW50XG4gKiBAcHJvcGVydHkge0lzc3Vlcn0gbW9uZXlJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbGF0aW9ufSBzZWxsSXRlbXNJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7QW1vdW50fSBwcmljZVBlckl0ZW1cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7VXNlclNlYXR9IHNlbGxJdGVtc0NyZWF0b3JTZWF0XG4gKiBAcHJvcGVydHkge1NlbGxJdGVtc0NyZWF0b3JGYWNldH0gc2VsbEl0ZW1zQ3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBzZWxsSXRlbXNJbnN0YW5jZVxuICogQHByb3BlcnR5IHtTZWxsSXRlbXNQdWJsaWNGYWNldH0gc2VsbEl0ZW1zUHVibGljRmFjZXRcbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNaW50QW5kU2VsbE5GVENyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHsoc2VsbFBhcmFtczogU2VsbEl0ZW1zUGFyYW1ldGVycykgPT4gUHJvbWlzZTxTZWxsSXRlbXNSZXN1bHQ+fSBzZWxsVG9rZW5zXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcn0gZ2V0SXNzdWVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdXRvbWF0aWNSZWZ1bmRQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBiaWdpbnR9IGdldE9mZmVyc0NvdW50XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdXRvc3dhcFB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VTd2FwSW52aXRhdGlvbiBzeW5vbnltIGZvclxuICogbWFrZVN3YXBJbkludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZVN3YXBJbkludml0YXRpb24gbWFrZSBhbiBpbnZpdGF0aW9uXG4gKiB0aGF0IGFsbG93cyBvbmUgdG8gZG8gYSBzd2FwIGluIHdoaWNoIHRoZSBJbiBhbW91bnQgaXMgc3BlY2lmaWVkIGFuZCB0aGUgT3V0XG4gKiBhbW91bnQgaXMgY2FsY3VsYXRlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlU3dhcE91dEludml0YXRpb24gbWFrZSBhbiBpbnZpdGF0aW9uXG4gKiB0aGF0IGFsbG93cyBvbmUgdG8gZG8gYSBzd2FwIGluIHdoaWNoIHRoZSBPdXQgYW1vdW50IGlzIHNwZWNpZmllZCBhbmQgdGhlIEluXG4gKiBhbW91bnQgaXMgY2FsY3VsYXRlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlQWRkTGlxdWlkaXR5SW52aXRhdGlvbiBtYWtlIGFuXG4gKiBpbnZpdGF0aW9uIHRoYXQgYWxsb3dzIG9uZSB0byBhZGQgbGlxdWlkaXR5IHRvIHRoZSBwb29sLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlUmVtb3ZlTGlxdWlkaXR5SW52aXRhdGlvbiBtYWtlIGFuXG4gKiBpbnZpdGF0aW9uIHRoYXQgYWxsb3dzIG9uZSB0byByZW1vdmUgbGlxdWlkaXR5IGZyb20gdGhlIHBvb2wuXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcn0gZ2V0TGlxdWlkaXR5SXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IGJpZ2ludH0gZ2V0TGlxdWlkaXR5U3VwcGx5IGdldCB0aGUgY3VycmVudCB2YWx1ZSBvZlxuICogbGlxdWlkaXR5IGhlbGQgYnkgaW52ZXN0b3JzLlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCwgYnJhbmRPdXQ6IEJyYW5kKSA9PiBBbW91bnR9IGdldElucHV0UHJpY2VcbiAqIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGJyYW5kT3V0IHRoYXQgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgYW1vdW50SW4gaXNcbiAqIG9mZmVyZWQgdXNpbmcgbWFrZVN3YXBJbkludml0YXRpb24gYXQgdGhlIGN1cnJlbnQgcHJpY2UuXG4gKiBAcHJvcGVydHkgeyhhbW91bnRPdXQ6IEFtb3VudCwgYnJhbmRJbjogQnJhbmQpID0+IEFtb3VudH0gZ2V0T3V0cHV0UHJpY2VcbiAqIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGJyYW5kSW4gdGhhdCBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBnZXQgYW1vdW50T3V0XG4gKiB1c2luZyBtYWtlU3dhcE91dEludml0YXRpb24gYXQgdGhlIGN1cnJlbnQgcHJpY2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUmVjb3JkPHN0cmluZywgQW1vdW50Pn0gZ2V0UG9vbEFsbG9jYXRpb24gZ2V0IGFuXG4gKiBBbW91bnRLZXl3b3JkUmVjb3JkIHNob3dpbmcgdGhlIGN1cnJlbnQgYmFsYW5jZXMgaW4gdGhlIHBvb2wuXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoMrWfrsnAAC7JwAAKQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2ludGVybmFsLXR5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VhdERhdGFcbiAqIEBwcm9wZXJ0eSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsXG4gKiBAcHJvcGVydHkge0FsbG9jYXRpb259IGluaXRpYWxBbGxvY2F0aW9uXG4gKiBAcHJvcGVydHkge1NlYXRIYW5kbGV9IHNlYXRIYW5kbGVcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbb2ZmZXJBcmdzXVxuICovXG5cbi8qKlxuICogR2l2ZW4gYW4gYWxsb2NhdGlvbiwgd2l0aGRyYXcgcGF5bWVudHMgdG8gY3JlYXRlIGEgcGF5b3V0XG4gKlxuICogQGNhbGxiYWNrIFdpdGhkcmF3UGF5bWVudHNcbiAqIEBwYXJhbSB7QWxsb2NhdGlvbn0gYWxsb2NhdGlvblxuICogQHJldHVybnMge1BheW1lbnRQS2V5d29yZFJlY29yZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFdpdGhkcmF3RmFjZXRcbiAqIEBwcm9wZXJ0eSB7KGFsbG9jYXRpb246QWxsb2NhdGlvbikgPT4gUGF5bWVudFBLZXl3b3JkUmVjb3JkfSB3aXRoZHJhd1BheW1lbnRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbnN0YW5jZUFkbWluSGVscGVyXG4gKiBAcHJvcGVydHkgeyh6b2VTZWF0QWRtaW46IFpvZVNlYXRBZG1pbikgPT4gdm9pZH0gZXhpdFpvZVNlYXRBZG1pblxuICogQHByb3BlcnR5IHsoem9lU2VhdEFkbWluOiBab2VTZWF0QWRtaW4pID0+IGJvb2xlYW59IGhhc0V4aXRlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWm9lU2VhdEFkbWluS2l0XG4gKiBAcHJvcGVydHkge1VzZXJTZWF0fSB1c2VyU2VhdFxuICogQHByb3BlcnR5IHtab2VTZWF0QWRtaW59IHpvZVNlYXRBZG1pblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2Vab2VTZWF0QWRtaW5LaXRcbiAqIE1ha2UgdGhlIFpvZSBzZWF0IGFkbWluLCB1c2VyIHNlYXQgYW5kIGEgbm90aWZpZXJcbiAqIEBwYXJhbSB7QWxsb2NhdGlvbn0gaW5pdGlhbEFsbG9jYXRpb25cbiAqIEBwYXJhbSB7SW5zdGFuY2VBZG1pbkhlbHBlcn0gaW5zdGFuY2VBZG1pbkhlbHBlclxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWxcbiAqIEBwYXJhbSB7V2l0aGRyYXdGYWNldH0gd2l0aGRyYXdGYWNldFxuICogQHBhcmFtIHtFUmVmPEV4aXRPYmo+fSBleGl0T2JqXG4gKiBAcGFyYW0ge0VSZWY8dW5rbm93bj59IFtvZmZlclJlc3VsdF1cbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEByZXR1cm5zIHtab2VTZWF0QWRtaW5LaXR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWm9lU2VhdEFkbWluRXhpdFxuICogQHBhcmFtIHtDb21wbGV0aW9ufSBbY29tcGxldGlvbl1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWm9lU2VhdEFkbWluXG4gKiBAcHJvcGVydHkgeyhhbGxvY2F0aW9uOiBBbGxvY2F0aW9uKSA9PiB2b2lkfSByZXBsYWNlQWxsb2NhdGlvblxuICogQHByb3BlcnR5IHtab2VTZWF0QWRtaW5FeGl0fSBleGl0XG4gKiBAcHJvcGVydHkge1NodXRkb3duV2l0aEZhaWx1cmV9IGZhaWwgY2FsbGVkIHdpdGggdGhlIHJlYXNvblxuICogZm9yIGNhbGxpbmcgZmFpbCBvbiB0aGlzIHNlYXQsIHdoZXJlIHJlYXNvbiBpcyBub3JtYWxseSBhbiBpbnN0YW5jZW9mIEVycm9yLlxuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpYmVyPEFtb3VudEtleXdvcmRSZWNvcmQ+fSBnZXRFeGl0U3Vic2NyaWJlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHsoYnJhbmQ6IEJyYW5kKSA9PiBBc3NldEtpbmR9IEdldEFzc2V0S2luZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSGFuZGxlT2ZmZXJSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTx1bmtub3duPn0gb2ZmZXJSZXN1bHRQcm9taXNlXG4gKiBAcHJvcGVydHkge0V4aXRPYmp9IGV4aXRPYmpcbiAqL1xuXG4vKipcbiAqIFRoZSBzZWF0SGFuZGxlIG1heSBiZSBjcmVhdGVkIGluIGVpdGhlciB0aGUgWm9lIG9yIFpDRiB2YXQsXG4gKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgc2VhdCBjb21lcyBmcm9tIGEgbm9ybWFsIG9mZmVyIG9yIGFcbiAqIHJlcXVlc3QgYnkgdGhlIGNvbnRyYWN0IGZvciBhbiBcImVtcHR5XCIgc2VhdC5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbnN0YW5jZUFkbWluXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGFzc2VydEFjY2VwdGluZ09mZmVyc1xuICogQHByb3BlcnR5IHsoaW52aXRhdGlvbkhhbmRsZTogSW52aXRhdGlvbkhhbmRsZSxcbiAqICAgICBpbml0aWFsQWxsb2NhdGlvbjogQWxsb2NhdGlvbixcbiAqICAgICBwcm9wb3NhbDogUHJvcG9zYWxSZWNvcmQsXG4gKiAgICAgb2ZmZXJBcmdzPzogb2JqZWN0LFxuICogKSA9PiBVc2VyU2VhdCB9IG1ha2VVc2VyU2VhdFxuICogQHByb3BlcnR5IHtNYWtlTm9Fc2Nyb3dTZWF0fSBtYWtlTm9Fc2Nyb3dTZWF0XG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHsoKSA9PiBvYmplY3R9IGdldFB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlcktleXdvcmRSZWNvcmR9IGdldElzc3VlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmRLZXl3b3JkUmVjb3JkfSBnZXRCcmFuZHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gb2JqZWN0fSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXX0gZ2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFsbGF0aW9ufSBnZXRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IENvbXBsZXRpb24pID0+IHZvaWR9IGV4aXRBbGxTZWF0c1xuICogQHByb3BlcnR5IHtTaHV0ZG93bldpdGhGYWlsdXJlfSBmYWlsQWxsU2VhdHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gc3RvcEFjY2VwdGluZ09mZmVyc1xuICogQHByb3BlcnR5IHsoc3RyaW5nOiBzdHJpbmcpID0+IGJvb2xlYW59IGlzQmxvY2tlZFxuICogQHByb3BlcnR5IHsoaGFuZGxlT2ZmZXJPYmo6IEhhbmRsZU9mZmVyT2JqLCBwdWJsaWNGYWNldDogdW5rbm93bikgPT4gdm9pZH0gaW5pdERlbGF5ZWRTdGF0ZVxuICogQHByb3BlcnR5IHsoc3RyaW5nczogc3RyaW5nW10pID0+IHZvaWR9IHNldE9mZmVyRmlsdGVyXG4gKi9cblxuLyoqXG4gKiBUaGUgc2VhdEhhbmRsZSBtYXkgYmUgY3JlYXRlZCBpbiBlaXRoZXIgdGhlIFpvZSBvciBaQ0YgdmF0LFxuICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHNlYXQgY29tZXMgZnJvbSBhIG5vcm1hbCBvZmZlciBvciBhXG4gKiByZXF1ZXN0IGJ5IHRoZSBjb250cmFjdCBmb3IgYW4gXCJlbXB0eVwiIHNlYXQuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSGFuZGxlT2ZmZXJPYmpcbiAqIEBwcm9wZXJ0eSB7KGludml0YXRpb25IYW5kbGU6IEludml0YXRpb25IYW5kbGUsXG4gKiAgICAgICAgICAgICBzZWF0RGF0YTogU2VhdERhdGEsXG4gKiAgICAgICAgICAgICkgPT4gSGFuZGxlT2ZmZXJSZXN1bHR9IGhhbmRsZU9mZmVyXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWm9lSW5zdGFuY2VBZG1pbk1ha2VJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge0ludml0YXRpb25IYW5kbGV9IGludml0YXRpb25IYW5kbGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbY3VzdG9tRGV0YWlsc11cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3Byb3Bvc2FsU2hhcGVdXG4gKiBAcmV0dXJucyB7SW52aXRhdGlvbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZUluc3RhbmNlQWRtaW5cbiAqIEBwcm9wZXJ0eSB7Wm9lSW5zdGFuY2VBZG1pbk1ha2VJbnZpdGF0aW9ufSBtYWtlSW52aXRhdGlvblxuICogQHByb3BlcnR5IHsoaXNzdWVyUDogRVJlZjxJc3N1ZXI+LFxuICogICAgICAgICAgICAga2V5d29yZDogS2V5d29yZFxuICogICAgICAgICAgICApID0+IFByb21pc2U8SXNzdWVyUmVjb3JkPn0gc2F2ZUlzc3VlclxuICogQHByb3BlcnR5IHtNYWtlWm9lTWludH0gbWFrZVpvZU1pbnRcbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJGZWVNaW50fSByZWdpc3RlckZlZU1pbnRcbiAqIEBwcm9wZXJ0eSB7TWFrZU5vRXNjcm93U2VhdH0gbWFrZU5vRXNjcm93U2VhdFxuICogQHByb3BlcnR5IHtSZXBsYWNlQWxsb2NhdGlvbnN9IHJlcGxhY2VBbGxvY2F0aW9uc1xuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogQ29tcGxldGlvbikgPT4gdm9pZH0gZXhpdEFsbFNlYXRzXG4gKiBAcHJvcGVydHkge1NodXRkb3duV2l0aEZhaWx1cmV9IGZhaWxBbGxTZWF0c1xuICogQHByb3BlcnR5IHsoc2VhdEhhbmRsZTogU2VhdEhhbmRsZSwgY29tcGxldGlvbjogQ29tcGxldGlvbikgPT4gdm9pZH0gZXhpdFNlYXRcbiAqIEBwcm9wZXJ0eSB7KHNlYXRIYW5kbGU6IFNlYXRIYW5kbGUsIHJlYXNvbjogRXJyb3IpID0+IHZvaWR9IGZhaWxTZWF0XG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IHN0b3BBY2NlcHRpbmdPZmZlcnNcbiAqIEBwcm9wZXJ0eSB7KHN0cmluZ3M6IEFycmF5PHN0cmluZz4pID0+IHZvaWR9IHNldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkgeygpID0+IEFycmF5PHN0cmluZz59IGdldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkgeyhzZWF0SGFuZGxlOiBTZWF0SGFuZGxlKSA9PiBTdWJzY3JpYmVyPEFtb3VudEtleXdvcmRSZWNvcmQ+fSBnZXRFeGl0U3Vic2NyaWJlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJlZ2lzdGVyRmVlTWludFxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkIC0gdGhlIGtleXdvcmQgdG8gdXNlIGZvciB0aGUgaXNzdWVyXG4gKiBAcGFyYW0ge0ZlZU1pbnRBY2Nlc3N9IGFsbGVnZWRGZWVNaW50QWNjZXNzIC0gYW4gb2JqZWN0IHRoYXRcbiAqIHB1cnBvcnRzIHRvIGJlIHRoZSBvYmplY3QgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBmZWVNaW50XG4gKiBAcmV0dXJucyB7Wm9lTWludDwnbmF0Jz59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgV3JhcElzc3VlcktpdFdpdGhab2VNaW50XG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmQgLSB0aGUga2V5d29yZCB0byB1c2UgZm9yIHRoZSBpc3N1ZXJcbiAqIEBwYXJhbSB7SXNzdWVyS2l0fSBsb2NhbElzc3VlcktpdCAtIGFuIGlzc3VlciBraXQgdGhhdCBvcmlnaW5hdGVzXG4gKiB3aXRoaW4gWm9lXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZVpvZU1pbnRcbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZFxuICogQHBhcmFtIHtBc3NldEtpbmR9IFthc3NldEtpbmRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvXVxuICogQHBhcmFtIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtab2VNaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VOb0VzY3Jvd1NlYXRcbiAqIEBwYXJhbSB7QWxsb2NhdGlvbn0gaW5pdGlhbEFsbG9jYXRpb25cbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsXG4gKiBAcGFyYW0ge0V4aXRPYmp9IGV4aXRPYmpcbiAqIEBwYXJhbSB7U2VhdEhhbmRsZX0gc2VhdEhhbmRsZVxuICogQHJldHVybnMge1VzZXJTZWF0fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJlcGxhY2VBbGxvY2F0aW9uc1xuICogQHBhcmFtIHtTZWF0SGFuZGxlQWxsb2NhdGlvbltdfSBzZWF0SGFuZGxlQWxsb2NhdGlvbnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlYXRIYW5kbGVBbGxvY2F0aW9uXG4gKiBAcHJvcGVydHkge1NlYXRIYW5kbGV9IHNlYXRIYW5kbGVcbiAqIEBwcm9wZXJ0eSB7QWxsb2NhdGlvbn0gYWxsb2NhdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZU1pbnRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXNzdWVyUmVjb3JkPEs+fSBnZXRJc3N1ZXJSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7KHRvdGFsVG9NaW50OiBBbW91bnQ8Sz4pID0+IHZvaWR9IG1pbnRBbmRFc2Nyb3dcbiAqIEBwcm9wZXJ0eSB7KHRvdGFsVG9CdXJuOiBBbW91bnQ8Sz4pID0+IHZvaWR9IHdpdGhkcmF3QW5kQnVyblxuICogTm90ZSB0aGF0IHRoZSBidXJuaW5nIGlzIGFzeW5jaHJvbm91cywgYW5kIHNvIG1heSBub3QgaGF2ZSBoYXBwZW5lZCBieVxuICogdGhlIHRpbWUgd2l0aGRyYXdBbmRCdXJuIHJldHVybnMuIFdlIHJlbHkgb24gb3VyIG90aGVyIGJvb2trZWVwaW5nIHNvIHRoYXRcbiAqIHRoZXNlIGFzc2V0cyBhcmUgYXNzdW1lZCBidXJuZWQgZWxzZXdoZXJlLCBzbyBubyBvbmUgd2lsbCB0cnkgdG8gYWNjZXNzXG4gKiB0aGVtIGV2ZW4gYmVmb3JlIHRoZXkgYXJlIGFjdHVhbGx5IGJ1cm5lZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpDRlJvb3RcbiAqIEBwcm9wZXJ0eSB7U3RhcnRaY2Z9IHN0YXJ0WmNmXG4gKiBAcHJvcGVydHkge1Jlc3RhcnRDb250cmFjdH0gcmVzdGFydENvbnRyYWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFeGVjdXRlQ29udHJhY3RSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBjcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxJbnZpdGF0aW9uPn0gW2NyZWF0b3JJbnZpdGF0aW9uXVxuICogQHByb3BlcnR5IHtvYmplY3R9IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge0hhbmRsZU9mZmVyT2JqfSBoYW5kbGVPZmZlck9ialxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFN0YXJ0WmNmXG4gKiBAcGFyYW0ge0VSZWY8Wm9lSW5zdGFuY2VBZG1pbj59IHpvZUluc3RhbmNlQWRtaW5cbiAqIEBwYXJhbSB7SW5zdGFuY2VSZWNvcmR9IGluc3RhbmNlUmVjb3JkRnJvbVpvZVxuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmRzfSBpc3N1ZXJTdG9yYWdlRnJvbVpvZVxuICogQHBhcmFtIHtvYmplY3R9IFtwcml2YXRlQXJnc11cbiAqIEByZXR1cm5zIHtQcm9taXNlPEV4ZWN1dGVDb250cmFjdFJlc3VsdD59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmVzdGFydENvbnRyYWN0XG4gKiBAcGFyYW0ge29iamVjdH0gW3ByaXZhdGVBcmdzXVxuICogQHJldHVybnMge1Byb21pc2U8RXhlY3V0ZVVwZ3JhZGVhYmxlQ29udHJhY3RSZXN1bHQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VFeGl0T2JqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbFxuICogQHBhcmFtIHtaQ0ZTZWF0fSB6b2VTZWF0QWRtaW5cbiAqIEByZXR1cm5zIHtFeGl0T2JqfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRXhpdE9ialxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBleGl0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SGFuZGxlPCdTZWF0Jz59IFNlYXRIYW5kbGVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRBc3NldEtpbmRCeUJyYW5kXG4gKiBHZXQgdGhlIGFzc2V0S2luZCBmb3IgYSBicmFuZCBrbm93biBieSBab2VcbiAqXG4gKiBUbyBiZSBkZWxldGVkIHdoZW4gYnJhbmRzIGhhdmUgYSBwcm9wZXJ0eSBmb3IgYXNzZXRLaW5kXG4gKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEByZXR1cm5zIHtBc3NldEtpbmR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7QXJyYXk8SXNzdWVyUmVjb3JkPn0gSXNzdWVyUmVjb3Jkc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VaQ0ZTZWF0XG4gKiBAcGFyYW0ge1NlYXREYXRhfSBzZWF0RGF0YVxuICogQHJldHVybnMge1pDRlNlYXR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgRHJvcEFsbFJlZmVyZW5jZXNcbiAqXG4gKiBEcm9wcyBhbGwgb2YgdGhlIHJlZmVyZW5jZXMgaW4gdGhlIHNlYXQtcmVsYXRlZCB3ZWFrU3RvcmVzIGJ5XG4gKiBkcm9wcGluZyB0aGUgc3RvcmVzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpjZlNlYXRNYW5hZ2VyXG4gKiBAcHJvcGVydHkge01ha2VaQ0ZTZWF0fSBtYWtlWkNGU2VhdFxuICogQHByb3BlcnR5IHtSZWFsbG9jYXRlfSByZWFsbG9jYXRlXG4gKiBAcHJvcGVydHkge0Ryb3BBbGxSZWZlcmVuY2VzfSBkcm9wQWxsUmVmZXJlbmNlc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWmNmTWludFJlYWxsb2NhdG9yXG4gKiBAcHJvcGVydHkgeyh6Y2ZTZWF0OiBaQ0ZTZWF0LCBuZXdBbGxvY2F0aW9uOiBBbGxvY2F0aW9uKSA9PiB2b2lkfSByZWFsbG9jYXRlXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ3JlYXRlU2VhdE1hbmFnZXJcbiAqXG4gKiBUaGUgU2VhdE1hbmFnZXIgaG9sZHMgdGhlIGFjdGl2ZSB6Y2ZTZWF0cyBhbmQgY2FuIHJlYWxsb2NhdGUgYW5kXG4gKiBtYWtlIG5ldyB6Y2ZTZWF0cy5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lSW5zdGFuY2VBZG1pbj59IHpvZUluc3RhbmNlQWRtaW5cbiAqIEBwYXJhbSB7R2V0QXNzZXRLaW5kQnlCcmFuZH0gZ2V0QXNzZXRLaW5kQnlCcmFuZFxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBzaHV0ZG93bldpdGhGYWlsdXJlXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSB6Y2ZCYWdnYWdlXG4gKiBAcmV0dXJucyB7eyBzZWF0TWFuYWdlcjogWmNmU2VhdE1hbmFnZXIsIHpjZk1pbnRSZWFsbG9jYXRvcjogWmNmTWludFJlYWxsb2NhdG9yIH19XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFuY2VTdGF0ZUFkZElzc3VlclxuICpcbiAqIEFkZCBhbiBpc3N1ZXIgYW5kIGl0cyBrZXl3b3JkIHRvIHRoZSBpbnN0YW5jZVJlY29yZCBmb3IgdGhlXG4gKiBjb250cmFjdCBpbnN0YW5jZVxuICpcbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZFxuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmR9IGlzc3VlclJlY29yZFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFuY2VTdGF0ZUdldFRlcm1zXG4gKiBAcmV0dXJucyB7QW55VGVybXN9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFuY2VTdGF0ZUdldEluc3RhbGxhdGlvblxuICogQHJldHVybnMge0luc3RhbGxhdGlvbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YW5jZVJlY29yZEdldElzc3VlcnNcbiAqIEByZXR1cm5zIHtJc3N1ZXJLZXl3b3JkUmVjb3JkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEluc3RhbmNlUmVjb3JkR2V0QnJhbmRzXG4gKiBAcmV0dXJucyB7QnJhbmRLZXl3b3JkUmVjb3JkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5zdGFuY2VTdGF0ZVxuICogQHByb3BlcnR5IHtJbnN0YW5jZVN0YXRlQWRkSXNzdWVyfSBhZGRJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7R2V0SW5zdGFuY2VSZWNvcmR9IGdldEluc3RhbmNlUmVjb3JkXG4gKiBAcHJvcGVydHkge0luc3RhbmNlU3RhdGVHZXRUZXJtc30gZ2V0VGVybXNcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VTdGF0ZUdldEluc3RhbGxhdGlvbn0gZ2V0SW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkge0luc3RhbmNlUmVjb3JkR2V0SXNzdWVyc30gZ2V0SXNzdWVyc1xuICogQHByb3BlcnR5IHtJbnN0YW5jZVJlY29yZEdldEJyYW5kc30gZ2V0QnJhbmRzXG4gKiBAcHJvcGVydHkgeyhrZXl3b3JkOiBLZXl3b3JkKSA9PiB2b2lkfSBhc3NlcnRVbmlxdWVLZXl3b3JkXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5zdGFuY2VSZWNvcmRcbiAqIEByZXR1cm5zIHtJbnN0YW5jZVJlY29yZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJTdG9yYWdlR2V0SXNzdWVyUmVjb3Jkc1xuICogQHBhcmFtIHtJc3N1ZXJbXX0gaXNzdWVyc1xuICogQHJldHVybnMge0lzc3VlclJlY29yZHN9XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA74cbCVYIAABWCAAAJQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL21ha2VIYW5kbGUuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVIYW5kbGUiLCJtYWtlSGFuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxpbml0RW1wdHksbWFrZUV4byxwcmVwYXJlRXhvQ2xhc3MsSGFuZGxlSTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dLFtcIm1ha2VFeG9cIiwgWyRo4oCNX2EgPT4gKG1ha2VFeG8gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJIYW5kbGVJXCIsIFskaOKAjV9hID0+IChIYW5kbGVJID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBIXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7SH0gaGFuZGxlVHlwZVxuICogQHJldHVybnMge0ggZXh0ZW5kcyAnSW5zdGFuY2UnID8gKCkgPT4gSW5zdGFuY2UgOiAoKSA9PiBIYW5kbGU8SD59XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVEdXJhYmxlSGFuZGxlPShiYWdnYWdlLGhhbmRsZVR5cGUpPT57XG50eXBlb2YgaGFuZGxlVHlwZT09PSdzdHJpbmcnfHxGYWlsIGBoYW5kbGVUeXBlIG11c3QgYmUgYSBzdHJpbmdgO1xuY29uc3QgbWFrZUhhbmRsZT1wcmVwYXJlRXhvQ2xhc3MoXG5iYWdnYWdlLFxuIGAke2hhbmRsZVR5cGV9SGFuZGxlYCxcbkhhbmRsZUksXG5pbml0RW1wdHksXG57fSk7XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgQml0IGJ5IG91ciBvd24gb3BhcXVlIHR5cGVzLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7KCkgPT4gSGFuZGxlPEg+fSAqL21ha2VIYW5kbGUpO1xuIH07JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlSGFuZGxlKGRlZmluZUR1cmFibGVIYW5kbGUpO1xuaGFyZGVuKGRlZmluZUR1cmFibGVIYW5kbGUpO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBvcGFxdWUgaGFuZGxlIG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSFxuICogQHBhcmFtIHtIfSBoYW5kbGVUeXBlIHRoZSBzdHJpbmcgbGl0ZXJhbCB0eXBlIG9mIHRoZSBoYW5kbGVcbiAqIEByZXR1cm5zIHtIIGV4dGVuZHMgJ0luc3RhbmNlJyA/IEluc3RhbmNlIDogSGFuZGxlPEg+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUhhbmRsZT0oaGFuZGxlVHlwZSk9PntcbnR5cGVvZiBoYW5kbGVUeXBlPT09J3N0cmluZyd8fEZhaWwgYGhhbmRsZVR5cGUgbXVzdCBiZSBhIHN0cmluZ2A7XG4vKiBSZXR1cm4gdGhlIGludGVyc2VjdGlvbiB0eXBlIChyZWFsbHkganVzdCBhbiBlbXB0eSBvYmplY3QpLiovXG4vKiBAdHMtZXhwZWN0LWVycm9yIEJpdCBieSBvdXIgb3duIG9wYXF1ZSB0eXBlcy4qL1xucmV0dXJuICgvKiogQHR5cGUge0hhbmRsZTxIPn0gKi9tYWtlRXhvKGAke2hhbmRsZVR5cGV9SGFuZGxlYCxIYW5kbGVJLHt9KSk7XG4gfTskaOKAjV9vbmNlLm1ha2VIYW5kbGUobWFrZUhhbmRsZSk7XG5oYXJkZW4obWFrZUhhbmRsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmaW5lRHVyYWJsZUhhbmRsZSI6WyJkZWZpbmVEdXJhYmxlSGFuZGxlIl0sIm1ha2VIYW5kbGUiOlsibWFrZUhhbmRsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADG+pcHogUAAKIFAAAtAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvb2JqQXJyYXlDb252ZXJzaW9uLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0Il0sImV4cG9ydHMiOlsiYXJyYXlUb09iaiIsImFzc2VydFN1YnNldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsRmFpbCxxOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKipcbiAqIEB0eXBlZGVmIHtiaWdpbnR8Ym9vbGVhbnxudWxsfG51bWJlcnxzdHJpbmd8c3ltYm9sfHVuZGVmaW5lZH0gUHJpbWl0aXZlXG4gKiBAdHlwZWRlZiB7c3RyaW5nfG51bWJlcnxzeW1ib2x9IFByb3BlcnR5TmFtZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlOYW1lfSBVXG4gKiBAcGFyYW0ge1RbXX0gYXJyYXlcbiAqIEBwYXJhbSB7VVtdfSBrZXlzXG4gKi9cbmNvbnN0ICAgICAgICBhcnJheVRvT2JqPShhcnJheSxrZXlzKT0+e1xuYXJyYXkubGVuZ3RoPT09a2V5cy5sZW5ndGh8fEZhaWwgYGFycmF5IGFuZCBrZXlzIG11c3QgYmUgb2YgZXF1YWwgbGVuZ3RoYDtcbmNvbnN0IG9iaj1cbi8qKiBAdHlwZSB7UmVjb3JkPFUsIFQ+fSAqL1xue307XG5rZXlzLmZvckVhY2goKGtleSxpKT0+b2JqW2tleV09YXJyYXlbaV0pO1xucmV0dXJuIGhhcmRlbihvYmopO1xuIH07XG5cbi8qKlxuICogQXNzZXJ0IGFsbCB2YWx1ZXMgZnJvbSBgcGFydGAgYXBwZWFyIGluIGB3aG9sZWAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gd2hvbGVcbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhcnRcbiAqLyRo4oCNX29uY2UuYXJyYXlUb09iaihhcnJheVRvT2JqKTtcbmNvbnN0ICAgICAgICBhc3NlcnRTdWJzZXQ9KHdob2xlLHBhcnQpPT57XG5wYXJ0LmZvckVhY2goKGtleSk9PntcbmFzc2VydC50eXBlb2Yoa2V5LCdzdHJpbmcnKTtcbndob2xlLmluY2x1ZGVzKGtleSl8fFxuRmFpbCBga2V5ICR7cShrZXkpfSB3YXMgbm90IG9uZSBvZiB0aGUgZXhwZWN0ZWQga2V5cyAke3Eod2hvbGUpfWA7XG4gfSk7XG4gfTskaOKAjV9vbmNlLmFzc2VydFN1YnNldChhc3NlcnRTdWJzZXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFycmF5VG9PYmoiOlsiYXJyYXlUb09iaiJdLCJhc3NlcnRTdWJzZXQiOlsiYXNzZXJ0U3Vic2V0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOWxCczbQwAA20MAACUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIl0sImV4cG9ydHMiOlsiQWRtaW5GYWNldEkiLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIiwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiLCJCdW5kbGVDYXBTaGFwZSIsIkJ1bmRsZVNoYXBlIiwiRXhpdE9iamVjdEkiLCJFeGl0T2JqZWN0U2hhcGUiLCJGZWVNaW50QWNjZXNzU2hhcGUiLCJGdWxsUHJvcG9zYWxTaGFwZSIsIkhhbmRsZUkiLCJIYW5kbGVPZmZlckkiLCJJbnN0YWxsYXRpb25TaGFwZSIsIkluc3RhbmNlQWRtaW5JIiwiSW5zdGFuY2VBZG1pblNoYXBlIiwiSW5zdGFuY2VIYW5kbGVTaGFwZSIsIkluc3RhbmNlUmVjb3JkU2hhcGUiLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCIsIkludml0YXRpb25FbGVtZW50U2hhcGUiLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUmVjb3JkU2hhcGUiLCJLZXl3b3JkU2hhcGUiLCJPZmZlckhhbmRsZXJJIiwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiLCJQcmljZVF1b3RlU2hhcGUiLCJQcm9wb3NhbFNoYXBlIiwiU2VhdERhdGFTaGFwZSIsIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIiwiU2VhdFNoYXBlIiwiVGVybXNTaGFwZSIsIlRpbWVyU2hhcGUiLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSIsIlpjZk1pbnRJIiwiWm9lTWludEkiLCJab2VNaW50U2hhcGUiLCJab2VTZXJ2aWNlSSIsIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCIsImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIiwiaXNPbkRlbWFuZEV4aXRSdWxlIiwiaXNXYWl2ZWRFeGl0UnVsZSIsIm1ha2VIYW5kbGVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRTaGFwZSxBc3NldEtpbmRTaGFwZSxCcmFuZFNoYXBlLERpc3BsYXlJbmZvU2hhcGUsSXNzdWVyS2l0U2hhcGUsSXNzdWVyU2hhcGUsUGF5bWVudFNoYXBlLFN1YnNjcmliZXJTaGFwZSxNLFRpbWVzdGFtcFNoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50U2hhcGVcIiwgWyRo4oCNX2EgPT4gKEFtb3VudFNoYXBlID0gJGjigI1fYSldXSxbXCJBc3NldEtpbmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kU2hhcGUgPSAkaOKAjV9hKV1dLFtcIkJyYW5kU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEJyYW5kU2hhcGUgPSAkaOKAjV9hKV1dLFtcIkRpc3BsYXlJbmZvU2hhcGVcIiwgWyRo4oCNX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaOKAjV9hKV1dLFtcIklzc3VlcktpdFNoYXBlXCIsIFskaOKAjV9hID0+IChJc3N1ZXJLaXRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiSXNzdWVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlclNoYXBlID0gJGjigI1fYSldXSxbXCJQYXltZW50U2hhcGVcIiwgWyRo4oCNX2EgPT4gKFBheW1lbnRTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoga2V5d29yZHMgaGF2ZSBhbiBpbml0aWFsIGNhcCovXG5jb25zdCAgICAgICAgS2V5d29yZFNoYXBlPU0uc3RyaW5nKCk7JGjigI1fb25jZS5LZXl3b3JkU2hhcGUoS2V5d29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIEludml0YXRpb25IYW5kbGVTaGFwZT1NLnJlbW90YWJsZSgnSW52aXRhdGlvbkhhbmRsZScpOyRo4oCNX29uY2UuSW52aXRhdGlvbkhhbmRsZVNoYXBlKEludml0YXRpb25IYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgSW52aXRhdGlvblNoYXBlPU0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uJyk7JGjigI1fb25jZS5JbnZpdGF0aW9uU2hhcGUoSW52aXRhdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnN0YW5jZUhhbmRsZVNoYXBlPU0ucmVtb3RhYmxlKCdJbnN0YW5jZUhhbmRsZScpOyRo4oCNX29uY2UuSW5zdGFuY2VIYW5kbGVTaGFwZShJbnN0YW5jZUhhbmRsZVNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnN0YWxsYXRpb25TaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJyk7JGjigI1fb25jZS5JbnN0YWxsYXRpb25TaGFwZShJbnN0YWxsYXRpb25TaGFwZSk7XG5jb25zdCAgICAgICAgU2VhdFNoYXBlPU0ucmVtb3RhYmxlKCdTZWF0Jyk7JGjigI1fb25jZS5TZWF0U2hhcGUoU2VhdFNoYXBlKTtcblxuY29uc3QgICAgICAgIEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKEtleXdvcmRTaGFwZSxBbW91bnRTaGFwZSk7JGjigI1fb25jZS5BbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKTtcbmNvbnN0ICAgICAgICBBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoXG5LZXl3b3JkU2hhcGUsXG5NLnBhdHRlcm4oKSk7JGjigI1fb25jZS5BbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihcbktleXdvcmRTaGFwZSxcbk0uZXJlZihQYXltZW50U2hhcGUpKTskaOKAjV9vbmNlLlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIElzc3VlcktleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKEtleXdvcmRTaGFwZSxJc3N1ZXJTaGFwZSk7JGjigI1fb25jZS5Jc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKTtcbmNvbnN0ICAgICAgICBJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoXG5LZXl3b3JkU2hhcGUsXG5NLmVyZWYoSXNzdWVyU2hhcGUpKTskaOKAjV9vbmNlLklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKEtleXdvcmRTaGFwZSxCcmFuZFNoYXBlKTskaOKAjV9vbmNlLkJyYW5kS2V5d29yZFJlY29yZFNoYXBlKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIElzc3VlclJlY29yZFNoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5icmFuZDpCcmFuZFNoYXBlLFxuaXNzdWVyOklzc3VlclNoYXBlLFxuYXNzZXRLaW5kOkFzc2V0S2luZFNoYXBlfSxcblxue2Rpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9KTskaOKAjV9vbmNlLklzc3VlclJlY29yZFNoYXBlKElzc3VlclJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVGVybXNTaGFwZT1oYXJkZW4oe1xuaXNzdWVyczpJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUsXG5icmFuZHM6QnJhbmRLZXl3b3JkUmVjb3JkU2hhcGV9KTskaOKAjV9vbmNlLlRlcm1zU2hhcGUoVGVybXNTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEluc3RhbmNlUmVjb3JkU2hhcGU9aGFyZGVuKHtcbmluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25TaGFwZSxcbmluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGUsXG50ZXJtczpNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpfSk7JGjigI1fb25jZS5JbnN0YW5jZVJlY29yZFNoYXBlKEluc3RhbmNlUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBIYW5kbGVJPU0uaW50ZXJmYWNlKCdIYW5kbGUnLHt9KTskaOKAjV9vbmNlLkhhbmRsZUkoSGFuZGxlSSk7XG5cbmNvbnN0ICAgICAgICBtYWtlSGFuZGxlU2hhcGU9KG5hbWUpPT5NLnJlbW90YWJsZSggYCR7bmFtZX1IYW5kbGVgKTskaOKAjV9vbmNlLm1ha2VIYW5kbGVTaGFwZShtYWtlSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIFRpbWVyU2hhcGU9bWFrZUhhbmRsZVNoYXBlKCd0aW1lcicpO1xuXG4vKipcbiAqIEFmdGVyIGRlZmF1bHRzIGFyZSBmaWxsZWQgaW5cbiAqXG4gKiBAc2VlIHtQcm9wb3NhbFJlY29yZH0gdHlwZVxuICovJGjigI1fb25jZS5UaW1lclNoYXBlKFRpbWVyU2hhcGUpO1xuY29uc3QgICAgICAgIEZ1bGxQcm9wb3NhbFNoYXBlPWhhcmRlbih7XG53YW50OkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUsXG5naXZlOkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbi8qIFRvIGFjY2VwdCBvbmx5IG9uZSwgd2UgY291bGQgdXNlIE0ub3IgcmF0aGVyIHRoYW4gTS5zcGxpdFJlY29yZCwqL1xuLyogYnV0IHRoZSBlcnJvciBtZXNzYWdlcyB3b3VsZCBoYXZlIGJlZW4gd29yc2UuIFJhdGhlciwqL1xuLyogY2xlYW5Qcm9wb3NhbCdzIGFzc2VydEV4aXQgY2hlY2tzIHRoYXQgdGhlcmUncyBleGFjdGx5IG9uZS4qL1xuZXhpdDpNLnNwbGl0UmVjb3JkKFxue30sXG57XG5vbkRlbWFuZDpudWxsLFxud2FpdmVkOm51bGwsXG5hZnRlckRlYWRsaW5lOntcbnRpbWVyOk0uZXJlZihUaW1lclNoYXBlKSxcbmRlYWRsaW5lOlRpbWVzdGFtcFNoYXBlfX0sXG5cblxue30pfSk7XG5cblxuLyoqIEBzZWUge1Byb3Bvc2FsfSB0eXBlICovJGjigI1fb25jZS5GdWxsUHJvcG9zYWxTaGFwZShGdWxsUHJvcG9zYWxTaGFwZSk7XG5jb25zdCAgICAgICAgUHJvcG9zYWxTaGFwZT1NLnNwbGl0UmVjb3JkKHt9LEZ1bGxQcm9wb3NhbFNoYXBlLHt9KTskaOKAjV9vbmNlLlByb3Bvc2FsU2hhcGUoUHJvcG9zYWxTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBpc09uRGVtYW5kRXhpdFJ1bGU9KGV4aXQpPT57XG5jb25zdFtleGl0S2V5XT1PYmplY3Qua2V5cyhleGl0KTtcbnJldHVybiBleGl0S2V5PT09J29uRGVtYW5kJztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIFdhaXZlZEV4aXRSdWxlfVxuICovJGjigI1fb25jZS5pc09uRGVtYW5kRXhpdFJ1bGUoaXNPbkRlbWFuZEV4aXRSdWxlKTtcbmNvbnN0ICAgICAgICBpc1dhaXZlZEV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmtleXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSd3YWl2ZWQnO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgQWZ0ZXJEZWFkbGluZUV4aXRSdWxlfVxuICovJGjigI1fb25jZS5pc1dhaXZlZEV4aXRSdWxlKGlzV2FpdmVkRXhpdFJ1bGUpO1xuY29uc3QgICAgICAgIGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmtleXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSdhZnRlckRlYWRsaW5lJztcbiB9OyRo4oCNX29uY2UuaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUoaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUpO1xuXG5jb25zdCAgICAgICAgSW52aXRhdGlvbkVsZW1lbnRTaGFwZT1NLnNwbGl0UmVjb3JkKHtcbmRlc2NyaXB0aW9uOk0uc3RyaW5nKCksXG5oYW5kbGU6SW52aXRhdGlvbkhhbmRsZVNoYXBlLFxuaW5zdGFuY2U6SW5zdGFuY2VIYW5kbGVTaGFwZSxcbmluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25TaGFwZX0pOyRo4oCNX29uY2UuSW52aXRhdGlvbkVsZW1lbnRTaGFwZShJbnZpdGF0aW9uRWxlbWVudFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgT2ZmZXJIYW5kbGVyST1NLmludGVyZmFjZSgnT2ZmZXJIYW5kbGVyJyx7XG5oYW5kbGU6TS5jYWxsKFNlYXRTaGFwZSkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnN0cmluZygpKX0pOyRo4oCNX29uY2UuT2ZmZXJIYW5kbGVySShPZmZlckhhbmRsZXJJKTtcblxuXG5jb25zdCAgICAgICAgU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGU9TS5hcnJheU9mKFxuaGFyZGVuKHtcbnNlYXRIYW5kbGU6U2VhdFNoYXBlLFxuYWxsb2NhdGlvbjpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGV9KSk7JGjigI1fb25jZS5TZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZShTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSk7XG5cblxuXG5jb25zdCAgICAgICAgWm9lTWludFNoYXBlPU0ucmVtb3RhYmxlKCdab2VNaW50Jyk7JGjigI1fb25jZS5ab2VNaW50U2hhcGUoWm9lTWludFNoYXBlKTtcbmNvbnN0ICAgICAgICBab2VNaW50ST1NLmludGVyZmFjZSgnWm9lTWludCcse1xuZ2V0SXNzdWVyUmVjb3JkOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyUmVjb3JkU2hhcGUpLFxubWludEFuZEVzY3JvdzpNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKSxcbndpdGhkcmF3QW5kQnVybjpNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKX0pOyRo4oCNX29uY2UuWm9lTWludEkoWm9lTWludEkpO1xuXG5cbmNvbnN0ICAgICAgICBaY2ZNaW50ST1NLmludGVyZmFjZSgnWmNmTWludCcse1xuZ2V0SXNzdWVyUmVjb3JkOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyUmVjb3JkU2hhcGUpLFxubWludEdhaW5zOk0uY2FsbChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpLlxub3B0aW9uYWwoTS5yZW1vdGFibGUoJ3pjZlNlYXQnKSkuXG5yZXR1cm5zKE0ucmVtb3RhYmxlKCd6Y2ZTZWF0JykpLFxuYnVybkxvc3NlczpNLmNhbGwoXG5BbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5NLnJlbW90YWJsZSgnemNmU2VhdCcpKS5cbnJldHVybnMoKX0pOyRo4oCNX29uY2UuWmNmTWludEkoWmNmTWludEkpO1xuXG5cbmNvbnN0ICAgICAgICBGZWVNaW50QWNjZXNzU2hhcGU9TS5yZW1vdGFibGUoJ0ZlZU1pbnRBY2Nlc3MnKTskaOKAjV9vbmNlLkZlZU1pbnRBY2Nlc3NTaGFwZShGZWVNaW50QWNjZXNzU2hhcGUpO1xuXG5jb25zdCAgICAgICAgRXhpdE9iamVjdEk9TS5pbnRlcmZhY2UoJ0V4aXQgT2JqZWN0Jyx7XG5leGl0Ok0uY2FsbCgpLnJldHVybnMoKX0pOyRo4oCNX29uY2UuRXhpdE9iamVjdEkoRXhpdE9iamVjdEkpO1xuXG5cbmNvbnN0ICAgICAgICBFeGl0T2JqZWN0U2hhcGU9TS5yZW1vdGFibGUoJ0V4aXRPYmonKTskaOKAjV9vbmNlLkV4aXRPYmplY3RTaGFwZShFeGl0T2JqZWN0U2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbmNlQWRtaW5TaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFuY2VBZG1pbicpOyRo4oCNX29uY2UuSW5zdGFuY2VBZG1pblNoYXBlKEluc3RhbmNlQWRtaW5TaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VBZG1pbkk9TS5pbnRlcmZhY2UoJ0luc3RhbmNlQWRtaW4nLHtcbm1ha2VJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnJlY29yZCgpLE0ucGF0dGVybigpKS5cbnJldHVybnMoSW52aXRhdGlvblNoYXBlKSxcbnNhdmVJc3N1ZXI6TS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSxLZXl3b3JkU2hhcGUpLnJldHVybnMoXG5Jc3N1ZXJSZWNvcmRTaGFwZSksXG5cbm1ha2VOb0VzY3Jvd1NlYXQ6TS5jYWxsKFxuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuUHJvcG9zYWxTaGFwZSxcbkV4aXRPYmplY3RTaGFwZSxcblNlYXRTaGFwZSkuXG5yZXR1cm5zKFNlYXRTaGFwZSksXG5leGl0QWxsU2VhdHM6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWxBbGxTZWF0czpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZXhpdFNlYXQ6TS5jYWxsKFNlYXRTaGFwZSxNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsU2VhdDpNLmNhbGwoU2VhdFNoYXBlLE0uYW55KCkpLnJldHVybnMoKSxcbm1ha2Vab2VNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUpLlxub3B0aW9uYWwoXG5Bc3NldEtpbmRTaGFwZSxcbkRpc3BsYXlJbmZvU2hhcGUsXG5NLnNwbGl0UmVjb3JkKGhhcmRlbih7fSksaGFyZGVuKHtlbGVtZW50U2hhcGU6TS5wYXR0ZXJuKCl9KSkpLlxuXG5yZXR1cm5zKE0ucmVtb3RhYmxlKCd6b2VNaW50JykpLFxucmVnaXN0ZXJGZWVNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUsRmVlTWludEFjY2Vzc1NoYXBlKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKSksXG5cbnJlcGxhY2VBbGxvY2F0aW9uczpNLmNhbGwoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpLnJldHVybnMoKSxcbnN0b3BBY2NlcHRpbmdPZmZlcnM6TS5jYWxsKCkucmV0dXJucygpLFxuc2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKE0uYXJyYXlPZihNLnN0cmluZygpKSkucmV0dXJucygpLFxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuZ2V0RXhpdFN1YnNjcmliZXI6TS5jYWxsKFNlYXRTaGFwZSkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuaXNCbG9ja2VkOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0uYm9vbGVhbigpKX0pOyRo4oCNX29uY2UuSW5zdGFuY2VBZG1pbkkoSW5zdGFuY2VBZG1pbkkpO1xuXG5cbmNvbnN0ICAgICAgICBJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdD1oYXJkZW4oe1xuaW5zdGFuY2VTdG9yYWdlTWFuYWdlcjpNLmludGVyZmFjZSgnSW5zdGFuY2VTdG9yYWdlTWFuYWdlcicse1xuZ2V0VGVybXM6TS5jYWxsKCkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbmdldElzc3VlcnM6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0QnJhbmRzOk0uY2FsbCgpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0SW5zdGFsbGF0aW9uOk0uY2FsbCgpLnJldHVybnMoSW5zdGFsbGF0aW9uU2hhcGUpLFxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuc2F2ZUlzc3VlcjpNLmNhbGwoSXNzdWVyU2hhcGUsS2V5d29yZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm1ha2Vab2VNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUpLlxub3B0aW9uYWwoXG5Bc3NldEtpbmRTaGFwZSxcbkRpc3BsYXlJbmZvU2hhcGUsXG5NLnNwbGl0UmVjb3JkKGhhcmRlbih7fSksaGFyZGVuKHtlbGVtZW50U2hhcGU6TS5wYXR0ZXJuKCl9KSkpLlxuXG5yZXR1cm5zKE0uZXJlZihab2VNaW50U2hhcGUpKSxcbnJlZ2lzdGVyRmVlTWludDpNLmNhbGwoS2V5d29yZFNoYXBlLEZlZU1pbnRBY2Nlc3NTaGFwZSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdmZWVNaW50JykpLFxuXG5nZXRJbnN0YW5jZVJlY29yZDpNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlUmVjb3JkU2hhcGUpLFxuZ2V0SXNzdWVyUmVjb3JkczpNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihJc3N1ZXJSZWNvcmRTaGFwZSkpLFxuZ2V0V2l0aGRyYXdGYWNldDpNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdXaXRoZHJhd0ZhY2V0JykpLFxuaW5pdEluc3RhbmNlQWRtaW46TS5jYWxsKFxuSW5zdGFuY2VIYW5kbGVTaGFwZSxcbk0ucmVtb3RhYmxlKCdpbnN0YW5jZUFkbWluJykpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG5kZWxldGVJbnN0YW5jZUFkbWluOk0uY2FsbChJbnN0YW5jZUFkbWluSSkucmV0dXJucygpLFxubWFrZUludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSxNLnN0cmluZygpKS5cbm9wdGlvbmFsKE0ucmVjb3JkKCksTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhQYXltZW50U2hhcGUpLFxuZ2V0Um9vdDpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0QWRtaW5Ob2RlOk0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpKX0pLFxuXG53aXRoZHJhd0ZhY2V0Ok0uaW50ZXJmYWNlKCdXaXRoZHJhd0ZhY2V0Jyx7XG53aXRoZHJhd1BheW1lbnRzOk0uY2FsbChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG5QYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSl9KSxcblxuXG5oZWxwZXJzOk0uaW50ZXJmYWNlKCdJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyIGhlbHBlcicse1xud3JhcElzc3VlcktpdFdpdGhab2VNaW50Ok0uY2FsbChcbktleXdvcmRTaGFwZSxcbklzc3VlcktpdFNoYXBlLFxuTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpKS5cbnJldHVybnMoWm9lTWludFNoYXBlKX0pfSk7JGjigI1fb25jZS5JbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdChJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5cblxuXG5jb25zdCAgICAgICAgQnVuZGxlQ2FwU2hhcGU9TS5yZW1vdGFibGUoJ2J1bmRsZUNhcCcpOyRo4oCNX29uY2UuQnVuZGxlQ2FwU2hhcGUoQnVuZGxlQ2FwU2hhcGUpO1xuY29uc3QgICAgICAgIEJ1bmRsZVNoYXBlPU0uYW5kKFxuTS5zcGxpdFJlY29yZCh7bW9kdWxlRm9ybWF0Ok0uYW55KCl9KSxcbk0ucmVjb3JkT2YoTS5zdHJpbmcoKSxNLnN0cmluZyh7c3RyaW5nTGVuZ3RoTGltaXQ6SW5maW5pdHl9KSkpOyRo4oCNX29uY2UuQnVuZGxlU2hhcGUoQnVuZGxlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZT1NLnNwbGl0UmVjb3JkKFxuaGFyZGVuKHtcbmluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25TaGFwZX0pLFxuXG5oYXJkZW4oe1xuYnVuZGxlOk0ucmVjb3JkT2YoTS5zdHJpbmcoKSxNLnN0cmluZyh7c3RyaW5nTGVuZ3RoTGltaXQ6SW5maW5pdHl9KSksXG5idW5kbGVDYXA6QnVuZGxlQ2FwU2hhcGUsXG5idW5kbGVJRDpNLnN0cmluZygpfSksXG5cbmhhcmRlbih7fSkpOyRo4oCNX29uY2UuVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUoVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBab2VTdG9yYWdlTWFuYWdlcklLaXQ9aGFyZGVuKHtcbnpvZVNlcnZpY2VEYXRhQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTZXJ2aWNlIGRhdGFBY2Nlc3MnLHtcbmdldFRlcm1zOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSkpLFxuZ2V0SXNzdWVyczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0QnJhbmRzOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEluc3RhbGxhdGlvbjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbk0uZXJlZihNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpKSxcblxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uOk0uY2FsbChJbnN0YWxsYXRpb25TaGFwZSkucmV0dXJucyhcbk0uZXJlZihNLnN0cmluZygpKSksXG5cbmluc3RhbGxCdW5kbGU6TS5jYWxsKE0ub3IoSW5zdGFuY2VIYW5kbGVTaGFwZSxCdW5kbGVTaGFwZSkpLnJldHVybnMoXG5NLnByb21pc2UoKSksXG5cbmluc3RhbGxCdW5kbGVJRDpNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5cbmdldFB1YmxpY0ZhY2V0Ok0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpKSksXG5cbmdldE9mZmVyRmlsdGVyOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5vcHQoTS5wYXR0ZXJuKCkpKX0pLFxuXG5cbm1ha2VPZmZlckFjY2VzczpNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBtYWtlT2ZmZXIgYWNjZXNzJyx7XG5nZXRBc3NldEtpbmRCeUJyYW5kOk0uY2FsbChCcmFuZFNoYXBlKS5yZXR1cm5zKEFzc2V0S2luZFNoYXBlKSxcbmdldEluc3RhbmNlQWRtaW46TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpKSxcblxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ub3B0KE0ucGF0dGVybigpKSksXG5cbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5kZXBvc2l0UGF5bWVudHM6TS5jYWxsKFByb3Bvc2FsU2hhcGUsUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG5NLnByb21pc2UoKSl9KSxcblxuXG5zdGFydEluc3RhbmNlQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIHN0YXJ0SW5zdGFuY2UgYWNjZXNzJyx7XG5tYWtlWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcjpNLmNhbGwoXG5NLmFueSgpLFxuSW5zdGFsbGF0aW9uU2hhcGUsXG5NLmFueSgpLFxuSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSxcbk0ub3IoSW5zdGFuY2VIYW5kbGVTaGFwZSxCdW5kbGVTaGFwZSksXG5NLm9yKEJ1bmRsZUNhcFNoYXBlLEJ1bmRsZVNoYXBlKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnVud3JhcEluc3RhbGxhdGlvbjpNLmNhbGxXaGVuKE0uZXJlZihJbnN0YWxsYXRpb25TaGFwZSkpLnJldHVybnMoXG5VbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSl9KSxcblxuXG5pbnZpdGF0aW9uSXNzdWVyQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIGludml0YXRpb25Jc3N1ZXInLHtcbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSl9KX0pOyRo4oCNX29uY2UuWm9lU3RvcmFnZU1hbmFnZXJJS2l0KFpvZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5cblxuXG5jb25zdCAgICAgICAgWm9lU2VydmljZUk9TS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UnLHtcbmluc3RhbGw6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuaW5zdGFsbEJ1bmRsZUlEOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnN0YXJ0SW5zdGFuY2U6TS5jYWxsKE0uZXJlZihJbnN0YWxsYXRpb25TaGFwZSkpLlxub3B0aW9uYWwoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSxNLmFueSgpLE0uYW55KCkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG5vZmZlcjpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLlxub3B0aW9uYWwoUHJvcG9zYWxTaGFwZSxQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSxNLmFueSgpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxuXG5nZXRPZmZlckZpbHRlcjpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5NLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0RmVlSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0QnJhbmRzOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbkJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcblxuZ2V0SXNzdWVyczpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5Jc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuXG5nZXRQdWJsaWNGYWNldDpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnUHVibGljRmFjZXQnKSksXG5cbmdldFRlcm1zOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhNLmFueSgpKSxcbmdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0uZXJlZihNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpKSxcblxuZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uOk0uY2FsbChJbnN0YWxsYXRpb25TaGFwZSkucmV0dXJucyhcbk0uZXJlZihNLnN0cmluZygpKSksXG5cblxuZ2V0SW5zdGFsbGF0aW9uOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRJbnN0YW5jZTpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0Q29uZmlndXJhdGlvbjpNLmNhbGwoKS5yZXR1cm5zKHtcbmZlZUlzc3VlckNvbmZpZzp7XG5uYW1lOk0uc3RyaW5nKCksXG5hc3NldEtpbmQ6J25hdCcsXG5kaXNwbGF5SW5mbzpEaXNwbGF5SW5mb1NoYXBlfX0pLFxuXG5cbmdldEludml0YXRpb25EZXRhaWxzOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLmFueSgpKSxcbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLm9wdChQcm9wb3NhbFNoYXBlKSl9KTskaOKAjV9vbmNlLlpvZVNlcnZpY2VJKFpvZVNlcnZpY2VJKTtcblxuXG5cbmNvbnN0ICAgICAgICBBZG1pbkZhY2V0ST1NLmludGVyZmFjZSgnWmNmQWRtaW5GYWNldCcse1xuZ2V0VmF0U2h1dGRvd25Qcm9taXNlOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxucmVzdGFydENvbnRyYWN0Ok0uY2FsbCgpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxudXBncmFkZUNvbnRyYWN0Ok0uY2FsbChNLnN0cmluZygpKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pOyRo4oCNX29uY2UuQWRtaW5GYWNldEkoQWRtaW5GYWNldEkpO1xuXG5cbmNvbnN0ICAgICAgICBTZWF0RGF0YVNoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5wcm9wb3NhbDpQcm9wb3NhbFNoYXBlLFxuaW5pdGlhbEFsbG9jYXRpb246QW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuc2VhdEhhbmRsZTpTZWF0U2hhcGV9LFxuXG57XG5vZmZlckFyZ3M6TS5hbnkoKX0pOyRo4oCNX29uY2UuU2VhdERhdGFTaGFwZShTZWF0RGF0YVNoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBIYW5kbGVPZmZlckk9TS5pbnRlcmZhY2UoJ0hhbmRsZU9mZmVyJyx7XG5oYW5kbGVPZmZlcjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLFNlYXREYXRhU2hhcGUpLnJldHVybnMoe1xub2ZmZXJSZXN1bHRQcm9taXNlOk0ucHJvbWlzZSgpLFxuZXhpdE9iajpFeGl0T2JqZWN0U2hhcGV9KX0pOyRo4oCNX29uY2UuSGFuZGxlT2ZmZXJJKEhhbmRsZU9mZmVySSk7XG5cblxuXG5jb25zdCAgICAgICAgUHJpY2VRdW90ZVNoYXBlPWhhcmRlbih7XG5xdW90ZUFtb3VudDpBbW91bnRTaGFwZSxcbnF1b3RlUGF5bWVudDpNLmVyZWYoUGF5bWVudFNoYXBlKX0pOyRo4oCNX29uY2UuUHJpY2VRdW90ZVNoYXBlKFByaWNlUXVvdGVTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiS2V5d29yZFNoYXBlIjpbIktleXdvcmRTaGFwZSJdLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiOlsiSW52aXRhdGlvbkhhbmRsZVNoYXBlIl0sIkludml0YXRpb25TaGFwZSI6WyJJbnZpdGF0aW9uU2hhcGUiXSwiSW5zdGFuY2VIYW5kbGVTaGFwZSI6WyJJbnN0YW5jZUhhbmRsZVNoYXBlIl0sIkluc3RhbGxhdGlvblNoYXBlIjpbIkluc3RhbGxhdGlvblNoYXBlIl0sIlNlYXRTaGFwZSI6WyJTZWF0U2hhcGUiXSwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiXSwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIjpbIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIjpbIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiXSwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyUmVjb3JkU2hhcGUiOlsiSXNzdWVyUmVjb3JkU2hhcGUiXSwiVGVybXNTaGFwZSI6WyJUZXJtc1NoYXBlIl0sIkluc3RhbmNlUmVjb3JkU2hhcGUiOlsiSW5zdGFuY2VSZWNvcmRTaGFwZSJdLCJIYW5kbGVJIjpbIkhhbmRsZUkiXSwibWFrZUhhbmRsZVNoYXBlIjpbIm1ha2VIYW5kbGVTaGFwZSJdLCJUaW1lclNoYXBlIjpbIlRpbWVyU2hhcGUiXSwiRnVsbFByb3Bvc2FsU2hhcGUiOlsiRnVsbFByb3Bvc2FsU2hhcGUiXSwiUHJvcG9zYWxTaGFwZSI6WyJQcm9wb3NhbFNoYXBlIl0sImlzT25EZW1hbmRFeGl0UnVsZSI6WyJpc09uRGVtYW5kRXhpdFJ1bGUiXSwiaXNXYWl2ZWRFeGl0UnVsZSI6WyJpc1dhaXZlZEV4aXRSdWxlIl0sImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIjpbImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIl0sIkludml0YXRpb25FbGVtZW50U2hhcGUiOlsiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSJdLCJPZmZlckhhbmRsZXJJIjpbIk9mZmVySGFuZGxlckkiXSwiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiOlsiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiXSwiWm9lTWludFNoYXBlIjpbIlpvZU1pbnRTaGFwZSJdLCJab2VNaW50SSI6WyJab2VNaW50SSJdLCJaY2ZNaW50SSI6WyJaY2ZNaW50SSJdLCJGZWVNaW50QWNjZXNzU2hhcGUiOlsiRmVlTWludEFjY2Vzc1NoYXBlIl0sIkV4aXRPYmplY3RJIjpbIkV4aXRPYmplY3RJIl0sIkV4aXRPYmplY3RTaGFwZSI6WyJFeGl0T2JqZWN0U2hhcGUiXSwiSW5zdGFuY2VBZG1pblNoYXBlIjpbIkluc3RhbmNlQWRtaW5TaGFwZSJdLCJJbnN0YW5jZUFkbWluSSI6WyJJbnN0YW5jZUFkbWluSSJdLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJCdW5kbGVDYXBTaGFwZSI6WyJCdW5kbGVDYXBTaGFwZSJdLCJCdW5kbGVTaGFwZSI6WyJCdW5kbGVTaGFwZSJdLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSI6WyJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSJdLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiWm9lU3RvcmFnZU1hbmFnZXJJS2l0Il0sIlpvZVNlcnZpY2VJIjpbIlpvZVNlcnZpY2VJIl0sIkFkbWluRmFjZXRJIjpbIkFkbWluRmFjZXRJIl0sIlNlYXREYXRhU2hhcGUiOlsiU2VhdERhdGFTaGFwZSJdLCJIYW5kbGVPZmZlckkiOlsiSGFuZGxlT2ZmZXJJIl0sIlByaWNlUXVvdGVTaGFwZSI6WyJQcmljZVF1b3RlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA6Q0Ba5YHAACWBwAAIAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IEggLSB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlXG4gKiBAdHlwZWRlZiB7SCAmIFhpbXBvcnQoXCJAZW5kby9tYXJzaGFsXCIpLlJlbW90YWJsZX0gSGFuZGxlIEEgdHlwZSBjb25zdHJ1Y3RvciBmb3IgYW4gb3BhcXVlIHR5cGVcbiAqIGlkZW50aWZpZWQgYnkgdGhlIEggc3RyaW5nLiBUaGlzIHVzZXMgYW4gaW50ZXJzZWN0aW9uIHR5cGVcbiAqICgnTXlIYW5kbGUnICYge30pIHRvIHRhZyB0aGUgaGFuZGxlJ3MgdHlwZSBldmVuIHRob3VnaCB0aGUgYWN0dWFsXG4gKiB2YWx1ZSBpcyBqdXN0IGFuIGVtcHR5IG9iamVjdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmd9IEtleXdvcmRcbiAqIEB0eXBlZGVmIHtIYW5kbGU8J0ludml0YXRpb24nPn0gSW52aXRhdGlvbkhhbmRsZSAtIGFuIG9wYXF1ZSBoYW5kbGUgZm9yIGFuIGludml0YXRpb25cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgSXNzdWVyPGFueT4+fSBJc3N1ZXJLZXl3b3JkUmVjb3JkXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsIEVSZWY8SXNzdWVyPGFueT4+Pn0gSXNzdWVyUEtleXdvcmRSZWNvcmRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgQnJhbmQ8YW55Pj59IEJyYW5kS2V5d29yZFJlY29yZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RhbmRhcmRUZXJtc1xuICogQHByb3BlcnR5IHtJc3N1ZXJLZXl3b3JkUmVjb3JkfSBpc3N1ZXJzIC0gcmVjb3JkIHdpdGhcbiAqIGtleXdvcmRzIGtleXMsIGlzc3VlciB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7QnJhbmRLZXl3b3JkUmVjb3JkfSBicmFuZHMgLSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICoga2V5cywgYnJhbmQgdmFsdWVzXG4gKlxuICogQHR5cGVkZWYge1N0YW5kYXJkVGVybXMgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSBBbnlUZXJtc1xuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluc3RhbmNlUmVjb3JkXG4gKiBAcHJvcGVydHkge0luc3RhbGxhdGlvbn0gaW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoXCIuL3pvZVNlcnZpY2UvdXRpbHMuanNcIikuSW5zdGFuY2U8YW55Pn0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7QW55VGVybXN9IHRlcm1zIC0gY29udHJhY3QgcGFyYW1ldGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kXG4gKiBAcHJvcGVydHkge0Rpc3BsYXlJbmZvPEs+fSBbZGlzcGxheUluZm9dXG4gKlxuICogQHR5cGVkZWYge0Ftb3VudEtleXdvcmRSZWNvcmR9IEFsbG9jYXRpb25cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbUj11bmtub3duXSBPZmZlciByZXN1bHRcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbQT1uZXZlcl0gT2ZmZXIgYXJnc1xuICogQHR5cGVkZWYge1BheW1lbnQ8J3NldCc+fSBJbnZpdGF0aW9uXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAalWnPiwtAAAsLQAAKwAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAamVzc2llLWNoZWNrKi9cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBab2VTZXJ2aWNlXG4gKlxuICogWm9lIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBkZXBsb3lpbmcgYW5kIHdvcmtpbmcgd2l0aCBzbWFydFxuICogY29udHJhY3RzLiBJdCBpcyBhY2Nlc3NlZCBhcyBhIGxvbmctbGl2ZWQgYW5kIHdlbGwtdHJ1c3RlZCBzZXJ2aWNlXG4gKiB0aGF0IGVuZm9yY2VzIG9mZmVyIHNhZmV0eSBmb3IgdGhlIGNvbnRyYWN0cyB0aGF0IHVzZSBpdC4gWm9lIGhhcyBhXG4gKiBzaW5nbGUgYGludml0YXRpb25Jc3N1ZXJgIGZvciB0aGUgZW50aXJldHkgb2YgaXRzIGxpZmV0aW1lLiBCeVxuICogaGF2aW5nIGEgcmVmZXJlbmNlIHRvIFpvZSwgYSB1c2VyIGNhbiBnZXQgdGhlIGBpbnZpdGF0aW9uSXNzdWVyYFxuICogYW5kIHRodXMgdmFsaWRhdGUgYW55IGBpbnZpdGF0aW9uYCB0aGV5IHJlY2VpdmUgZnJvbSBzb21lb25lIGVsc2UuXG4gKlxuICogWm9lIGhhcyB0d28gZGlmZmVyZW50IGZhY2V0czogdGhlIHB1YmxpYyBab2Ugc2VydmljZSBhbmQgdGhlXG4gKiBjb250cmFjdCBmYWNldCAoWkNGKS4gRWFjaCBjb250cmFjdCBpbnN0YW5jZSBoYXMgYSBjb3B5IG9mIFpDRlxuICogd2l0aGluIGl0cyB2YXQuIFRoZSBjb250cmFjdCBhbmQgWkNGIG5ldmVyIGhhdmUgZGlyZWN0IGFjY2VzcyB0b1xuICogdGhlIHVzZXJzJyBwYXltZW50cyBvciB0aGUgWm9lIHB1cnNlcy5cbiAqXG4gKiBAcHJvcGVydHkge0dldEludml0YXRpb25Jc3N1ZXJ9IGdldEludml0YXRpb25Jc3N1ZXJcbiAqXG4gKiBab2UgaGFzIGEgc2luZ2xlIGBpbnZpdGF0aW9uSXNzdWVyYCBmb3IgdGhlIGVudGlyZXR5IG9mIGl0c1xuICogbGlmZXRpbWUuIEJ5IGhhdmluZyBhIHJlZmVyZW5jZSB0byBab2UsIGEgdXNlciBjYW4gZ2V0IHRoZVxuICogYGludml0YXRpb25Jc3N1ZXJgIGFuZCB0aHVzIHZhbGlkYXRlIGFueSBgaW52aXRhdGlvbmAgdGhleSByZWNlaXZlXG4gKiBmcm9tIHNvbWVvbmUgZWxzZS4gVGhlIG1pbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnZpdGF0aW9uSXNzdWVyXG4gKiBjcmVhdGVzIHRoZSBFUlRQIHBheW1lbnRzIHRoYXQgcmVwcmVzZW50IHRoZSByaWdodCB0byBpbnRlcmFjdCB3aXRoXG4gKiBhIHNtYXJ0IGNvbnRyYWN0IGluIHBhcnRpY3VsYXIgd2F5cy5cbiAqXG4gKiBAcHJvcGVydHkge0luc3RhbGxCdW5kbGV9IGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbEJ1bmRsZUlEfSBpbnN0YWxsQnVuZGxlSURcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi91dGlscycpLlN0YXJ0SW5zdGFuY2V9IHN0YXJ0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7T2ZmZXJ9IG9mZmVyXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdXRpbHMnKS5HZXRQdWJsaWNGYWNldH0gZ2V0UHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7R2V0SXNzdWVyc30gZ2V0SXNzdWVyc1xuICogQHByb3BlcnR5IHtHZXRCcmFuZHN9IGdldEJyYW5kc1xuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3V0aWxzJykuR2V0VGVybXN9IGdldFRlcm1zXG4gKiBAcHJvcGVydHkge0dldE9mZmVyRmlsdGVyfSBnZXRPZmZlckZpbHRlclxuICogQHByb3BlcnR5IHtHZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZX0gZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7R2V0SW5zdGFuY2V9IGdldEluc3RhbmNlXG4gKiBAcHJvcGVydHkge0dldEluc3RhbGxhdGlvbn0gZ2V0SW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkge0dldEludml0YXRpb25EZXRhaWxzfSBnZXRJbnZpdGF0aW9uRGV0YWlsc1xuICogUmV0dXJuIGFuIG9iamVjdCB3aXRoIHRoZSBpbnN0YW5jZSwgaW5zdGFsbGF0aW9uLCBkZXNjcmlwdGlvbiwgaW52aXRhdGlvblxuICogaGFuZGxlLCBhbmQgYW55IGN1c3RvbSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvIHRoZSBjb250cmFjdC5cbiAqIEBwcm9wZXJ0eSB7R2V0RmVlSXNzdWVyfSBnZXRGZWVJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7R2V0Q29uZmlndXJhdGlvbn0gZ2V0Q29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtHZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb259IGdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHsoaW52aXRhdGlvbkhhbmRsZTogSW52aXRhdGlvbkhhbmRsZSkgPT4gUGF0dGVybiB8IHVuZGVmaW5lZH0gZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnZpdGF0aW9uSXNzdWVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJc3N1ZXI8J3NldCc+Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRGZWVJc3N1ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPElzc3VlcjwnbmF0Jz4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldENvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIHt7XG4gKiAgIGZlZUlzc3VlckNvbmZpZzogRmVlSXNzdWVyQ29uZmlnLFxuICogfX1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJc3N1ZXJzXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHJldHVybnMge1Byb21pc2U8SXNzdWVyS2V5d29yZFJlY29yZD59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0QnJhbmRzXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHJldHVybnMge1Byb21pc2U8QnJhbmRLZXl3b3JkUmVjb3JkPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRPZmZlckZpbHRlclxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTZXRPZmZlckZpbHRlclxuICogQHBhcmFtIHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nW119IHN0cmluZ3NcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbGxhdGlvbj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5zdGFuY2VcbiAqIEBwYXJhbSB7RVJlZjxJbnZpdGF0aW9uPn0gaW52aXRhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluc3RhbGxhdGlvblxuICogQHBhcmFtIHtFUmVmPEludml0YXRpb24+fSBpbnZpdGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YWxsYXRpb24+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEludml0YXRpb25EZXRhaWxzXG4gKiBAcGFyYW0ge0VSZWY8SW52aXRhdGlvbj59IGludml0YXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb25EZXRhaWxzPn1cbiAqL1xuXG4vKiBUT0RPIHJlbW92ZSBzdXBwb3J0IGZvciBzb3VyY2UgYnVuZGxlcywgbGVhdmluZyBvbmx5IHN1cHBvcnQgZm9yIGhhc2ggYnVuZGxlcy4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NTY1Ki9cbi8qKlxuICogQGNhbGxiYWNrIEluc3RhbGxCdW5kbGVcbiAqXG4gKiBDcmVhdGUgYW4gaW5zdGFsbGF0aW9uIGJ5IHNhZmVseSBldmFsdWF0aW5nIHRoZSBjb2RlIGFuZFxuICogcmVnaXN0ZXJpbmcgaXQgd2l0aCBab2UuIFJldHVybnMgYW4gaW5zdGFsbGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7QnVuZGxlIHwgU291cmNlQnVuZGxlfSBidW5kbGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYnVuZGxlTGFiZWxdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YWxsYXRpb24+fVxuICovXG5cbi8qIFRPRE8gY29uc29saWRhdGUgaW5zdGFsbEJ1bmRsZUlEIGludG8gaW5zdGFsbC4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80OTc0Ki9cbi8qKlxuICogQGNhbGxiYWNrIEluc3RhbGxCdW5kbGVJRFxuICpcbiAqIENyZWF0ZSBhbiBpbnN0YWxsYXRpb24gZnJvbSBhIEJ1bmRsZSBJRC4gUmV0dXJucyBhbiBpbnN0YWxsYXRpb24uXG4gKlxuICogQHBhcmFtIHtCdW5kbGVJRH0gYnVuZGxlSURcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYnVuZGxlTGFiZWxdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YWxsYXRpb24+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvblxuICpcbiAqIFZlcmlmeSB0aGF0IGFuIGFsbGVnZWQgSW5zdGFsbGF0aW9uIGlzIHJlYWwsIGFuZCByZXR1cm4gdGhlIEJ1bmRsZSBJRCBpdFxuICogd2lsbCB1c2UgZm9yIGNvbnRyYWN0IGNvZGUuXG4gKlxuICogQHBhcmFtIHtFUmVmPEluc3RhbGxhdGlvbj59IGFsbGVnZWRJbnN0YWxsYXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1bmRsZUlEPn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8QXJncywgUmVzdWx0PihcbiAqICAgaW52aXRhdGlvbjogRVJlZjxJbnZpdGF0aW9uPFJlc3VsdCwgQXJncz4+LFxuICogICBwcm9wb3NhbD86IFByb3Bvc2FsLFxuICogICBwYXltZW50S2V5d29yZFJlY29yZD86IFBheW1lbnRQS2V5d29yZFJlY29yZCxcbiAqICAgb2ZmZXJBcmdzPzogQXJncyxcbiAqICAgKSA9PiBQcm9taXNlPFVzZXJTZWF0PFJlc3VsdD4+XG4gKiB9IE9mZmVyXG4gKlxuICogVG8gcmVkZWVtIGFuIGludml0YXRpb24sIHRoZSB1c2VyIG5vcm1hbGx5IHByb3ZpZGVzIGEgcHJvcG9zYWwgKHRoZWlyXG4gKiBydWxlcyBmb3IgdGhlIG9mZmVyKSBhcyB3ZWxsIGFzIHBheW1lbnRzIHRvIGJlIGVzY3Jvd2VkIGJ5IFpvZS4gIElmXG4gKiBlaXRoZXIgdGhlIHByb3Bvc2FsIG9yIHBheW1lbnRzIHdvdWxkIGJlIGVtcHR5LCBpbmRpY2F0ZSB0aGlzIGJ5XG4gKiBvbWl0dGluZyB0aGF0IGFyZ3VtZW50IG9yIHBhc3NpbmcgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBwYXNzaW5nIGFuXG4gKiBlbXB0eSByZWNvcmQuXG4gKlxuICogVGhlIHByb3Bvc2FsIGhhcyB0aHJlZSBwYXJ0czogYHdhbnRgIGFuZCBgZ2l2ZWAgYXJlIHVzZWQgYnkgWm9lIHRvXG4gKiBlbmZvcmNlIG9mZmVyIHNhZmV0eSwgYW5kIGBleGl0YCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhcnRpY3VsYXJcbiAqIHBheW91dC1saXZlbmVzcyBwb2xpY3kgdGhhdCBab2UgY2FuIGd1YXJhbnRlZS4gYHdhbnRgIGFuZCBgZ2l2ZWBcbiAqIGFyZSBvYmplY3RzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuXG4gKiBgcGF5bWVudEtleXdvcmRSZWNvcmRgIGlzIGEgcmVjb3JkIHdpdGgga2V5d29yZHMgYXMga2V5cywgYW5kIHRoZVxuICogdmFsdWVzIGFyZSB0aGUgYWN0dWFsIHBheW1lbnRzIHRvIGJlIGVzY3Jvd2VkLiBBIHBheW1lbnQgaXNcbiAqIGV4cGVjdGVkIGZvciBldmVyeSBydWxlIHVuZGVyIGBnaXZlYC5cbiAqL1xuXG4vKipcbiAqIFpvZSB1c2VzIHNlYXRzIHRvIGFjY2VzcyBvciBtYW5pcHVsYXRlIG9mZmVycy4gVGhleSBsZXQgY29udHJhY3RzIGFuZCB1c2Vyc1xuICogaW50ZXJhY3Qgd2l0aCB0aGVtLiBab2UgaGFzIHR3byBraW5kcyBvZiBzZWF0cy4gWkNGU2VhdHMgYXJlIHVzZWQgd2l0aGluXG4gKiBjb250cmFjdHMgYW5kIHdpdGggemNmIG1ldGhvZHMuIFVzZXJTZWF0cyByZXByZXNlbnQgb2ZmZXJzIGV4dGVybmFsIHRvIFpvZVxuICogYW5kIHRoZSBjb250cmFjdC4gVGhlIHBhcnR5IHdobyBleGVyY2lzZXMgYW4gaW52aXRhdGlvbiBhbmQgc2VuZHMgdGhlIG9mZmVyKClcbiAqIG1lc3NhZ2UgdG8gWm9lIGdldHMgYSBVc2VyU2VhdCB0aGF0IGNhbiBjaGVjayBwYXlvdXRzJyBzdGF0dXMgb3IgcmV0cmlldmUgdGhlXG4gKiByZXN1bHQgb2YgcHJvY2Vzc2luZyB0aGUgb2ZmZXIgaW4gdGhlIGNvbnRyYWN0LiBUaGlzIHZhcmllcywgYnV0IGV4YW1wbGVzIGFyZVxuICogYSBzdHJpbmcgYW5kIGFuIGludml0YXRpb24gZm9yIGFub3RoZXIgc2VhdC5cbiAqXG4gKiBBbHNvLCBhIFVzZXJTZWF0IGNhbiBiZSBoYW5kZWQgdG8gYW4gYWdlbnQgb3V0c2lkZSBab2UgYW5kIHRoZSBjb250cmFjdCxcbiAqIGxldHRpbmcgdGhlbSBxdWVyeSBvciBtb25pdG9yIHRoZSBjdXJyZW50IHN0YXRlLCBhY2Nlc3MgdGhlIHBheW91dHMgYW5kXG4gKiByZXN1bHQsIGFuZCwgaWYgaXQncyBhbGxvd2VkIGZvciB0aGlzIHNlYXQsIGNhbGwgdHJ5RXhpdCgpLlxuICpcbiAqIFNpbmNlIGFueW9uZSBjYW4gYXR0ZW1wdCB0byBleGl0IHRoZSBzZWF0IGlmIHRoZXkgaGF2ZSBhIHJlZmVyZW5jZSB0byBpdCwgeW91XG4gKiBzaG91bGQgb25seSBzaGFyZSBhIFVzZXJTZWF0IHdpdGggdHJ1c3RlZCBwYXJ0aWVzLlxuICpcbiAqIFVzZXJTZWF0IGluY2x1ZGVzIHF1ZXJpZXMgZm9yIHRoZSBhc3NvY2lhdGVkIG9mZmVyJ3MgY3VycmVudCBzdGF0ZSBhbmQgYW5cbiAqIG9wZXJhdGlvbiB0byByZXF1ZXN0IHRoYXQgdGhlIG9mZmVyIGV4aXQsIGFzIGZvbGxvd3M6XG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmFnb3JpYy5jb20vem9lL2FwaS96b2UuaHRtbCN1c2Vyc2VhdC1vYmplY3R9fVxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtPUj11bmtub3duXVxuICogQHR5cGVkZWYge29iamVjdH0gVXNlclNlYXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQcm9wb3NhbFJlY29yZD59IGdldFByb3Bvc2FsXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8UGF5bWVudFBLZXl3b3JkUmVjb3JkPn0gZ2V0UGF5b3V0c1xuICogcmV0dXJucyBhIHByb21pc2UgZm9yIGEgS2V5d29yZFBheW1lbnRSZWNvcmQgY29udGFpbmluZyBhbGwgdGhlIHBheW91dHMgZnJvbVxuICogdGhpcyBzZWF0LiBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlIHNlYXQgaGFzIGV4aXRlZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXdvcmQ6IEtleXdvcmQpID0+IFByb21pc2U8UGF5bWVudDxhbnk+Pn0gZ2V0UGF5b3V0XG4gKiByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIFBheW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgaW5kaWNhdGVkIGtleXdvcmQuXG4gKiBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlIHNlYXQgaGFzIGV4aXRlZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxPUj59IGdldE9mZmVyUmVzdWx0XG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IFt0cnlFeGl0XVxuICogTm90ZTogT25seSB3b3JrcyBpZiB0aGUgc2VhdCdzIGBwcm9wb3NhbGAgaGFzIGFuIGBPbkRlbWFuZGAgYGV4aXRgIGNsYXVzZS4gWm9lJ3NcbiAqIG9mZmVyLXNhZmV0eSBndWFyYW50ZWUgYXBwbGllcyBubyBtYXR0ZXIgaG93IGEgc2VhdCdzIGludGVyYWN0aW9uIHdpdGggYVxuICogY29udHJhY3QgZW5kcy4gVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHRoZSBwYXJ0aWNpcGFudCBtaWdodCBiZSBhYmxlIHRvXG4gKiBjYWxsIGB0cnlFeGl0KClgLCBvciB0aGUgY29udHJhY3QgbWlnaHQgZG8gc29tZXRoaW5nIGV4cGxpY2l0bHkuIE9uIGV4aXRpbmcsXG4gKiB0aGUgc2VhdCBob2xkZXIgZ2V0cyBpdHMgY3VycmVudCBgYWxsb2NhdGlvbmAgYW5kIHRoZSBgc2VhdGAgY2FuIG5vIGxvbmdlclxuICogaW50ZXJhY3Qgd2l0aCB0aGUgY29udHJhY3QuXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Ym9vbGVhbj59IGhhc0V4aXRlZFxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWF0IGhhcyBleGl0ZWQsIGZhbHNlIGlmIGl0IGlzIHN0aWxsIGFjdGl2ZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTwwfDE+fSBudW1XYW50c1NhdGlzZmllZCByZXR1cm5zIDEgaWYgdGhlIHByb3Bvc2FsJ3NcbiAqIHdhbnQgY2xhdXNlIHdhcyBzYXRpc2ZpZWQgYnkgdGhlIGZpbmFsIGFsbG9jYXRpb24sIG90aGVyd2lzZSAwLiBUaGlzIGlzXG4gKiBudW1lcmljIHRvIHN1cHBvcnQgYSBwbGFubmVkIGVuaGFuY2VtZW50IGNhbGxlZCBcIm11bHRpcGxlc1wiIHdoaWNoIHdpbGwgYWxsb3dcbiAqIHRoZSByZXR1cm4gdmFsdWUgdG8gYmUgYW55IG5vbi1uZWdhdGl2ZSBudW1iZXIuIFRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZVxuICogYWZ0ZXIgdGhlIHNlYXQgaGFzIGV4aXRlZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxBbGxvY2F0aW9uPn0gZ2V0RmluYWxBbGxvY2F0aW9uXG4gKiByZXR1cm4gYSBwcm9taXNlIGZvciB0aGUgZmluYWwgYWxsb2NhdGlvbi4gVGhlIHByb21pc2Ugd2lsbCByZXNvbHZlIGFmdGVyIHRoZVxuICogc2VhdCBoYXMgZXhpdGVkLlxuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpYmVyPENvbXBsZXRpb24+fSBnZXRFeGl0U3Vic2NyaWJlciByZXR1cm5zIGEgc3Vic2NyaWJlciB0aGF0XG4gKiB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNlYXQgaGFzIGV4aXRlZCBvciBmYWlsZWQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxQcm9wb3NhbFJlY29yZD59IFByb3Bvc2FsXG4gKlxuICogQHR5cGVkZWYge3tnaXZlOiBBbW91bnRLZXl3b3JkUmVjb3JkLFxuICogICAgICAgICAgICB3YW50OiBBbW91bnRLZXl3b3JkUmVjb3JkLFxuICogICAgICAgICAgICBleGl0OiBFeGl0UnVsZVxuICogICAgICAgICAgIH19IFByb3Bvc2FsUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsIEFtb3VudDxhbnk+Pn0gQW1vdW50S2V5d29yZFJlY29yZFxuICpcbiAqIFRoZSBrZXlzIGFyZSBrZXl3b3JkcywgYW5kIHRoZSB2YWx1ZXMgYXJlIGFtb3VudHMuIEZvciBleGFtcGxlOlxuICogeyBBc3NldDogQW1vdW50TWF0aC5tYWtlKGFzc2V0QnJhbmQsIDVuKSwgUHJpY2U6XG4gKiBBbW91bnRNYXRoLm1ha2UocHJpY2VCcmFuZCwgOW4pIH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdha2VyXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IHdha2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBEZWFkbGluZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGltZXJcbiAqIEBwcm9wZXJ0eSB7KGRlYWRsaW5lOiBEZWFkbGluZSwgd2FrZXJQOiBFUmVmPFdha2VyPikgPT4gdm9pZH0gc2V0V2FrZXVwXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPbkRlbWFuZEV4aXRSdWxlXG4gKiBAcHJvcGVydHkge251bGx9IG9uRGVtYW5kXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXYWl2ZWRFeGl0UnVsZVxuICogQHByb3BlcnR5IHtudWxsfSB3YWl2ZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFmdGVyRGVhZGxpbmVFeGl0UnVsZVxuICogQHByb3BlcnR5IHt7dGltZXI6VGltZXIsIGRlYWRsaW5lOkRlYWRsaW5lfX0gYWZ0ZXJEZWFkbGluZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09uRGVtYW5kRXhpdFJ1bGUgfCBXYWl2ZWRFeGl0UnVsZSB8IEFmdGVyRGVhZGxpbmVFeGl0UnVsZX0gRXhpdFJ1bGVcbiAqXG4gKiBUaGUgcG9zc2libGUga2V5cyBhcmUgJ3dhaXZlZCcsICdvbkRlbWFuZCcsIGFuZCAnYWZ0ZXJEZWFkbGluZScuXG4gKiBgdGltZXJgIGFuZCBgZGVhZGxpbmVgIG9ubHkgYXJlIHVzZWQgZm9yIHRoZSBgYWZ0ZXJEZWFkbGluZWAga2V5LlxuICogVGhlIHBvc3NpYmxlIHJlY29yZHMgYXJlOlxuICogYHsgd2FpdmVkOiBudWxsIH1gXG4gKiBgeyBvbkRlbWFuZDogbnVsbCB9YFxuICogYHsgYWZ0ZXJEZWFkbGluZTogeyB0aW1lciA6VGltZXI8RGVhZGxpbmU+LCBkZWFkbGluZSA6RGVhZGxpbmUgfSB9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IEluc3RhbmNlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC12YXQnKS5WYXRBZG1pblN2Y30gVmF0QWRtaW5TdmNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7YnVuZGxlQ2FwOiBYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLkJ1bmRsZUNhcCB9IHwge25hbWU6IHN0cmluZ30gfCB7aWQ6IEJ1bmRsZUlEfX0gWkNGU3BlY1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGFueT59IFNvdXJjZUJ1bmRsZVxuICogT3BhcXVlIHR5cGUgZm9yIGEgSlNPTmFibGUgc291cmNlIGJ1bmRsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLEVSZWY8UGF5bWVudDxhbnk+Pj59IFBheW1lbnRQS2V5d29yZFJlY29yZFxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLFBheW1lbnQ8YW55Pj59IFBheW1lbnRLZXl3b3JkUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbnZpdGF0aW9uRGV0YWlsc1xuICogQHByb3BlcnR5IHtJbnN0YWxsYXRpb259IGluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7SW52aXRhdGlvbkhhbmRsZX0gaGFuZGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2N1c3RvbURldGFpbHNdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1NGPWFueV0gY29udHJhY3Qgc3RhcnQgZnVuY3Rpb25cbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFsbGF0aW9uPFNGPn0gSW5zdGFsbGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0luc3RhbGxhdGlvbn0gSVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YWxsYXRpb25TdGFydDxJPn0gSW5zdGFsbGF0aW9uU3RhcnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZlZUlzc3VlckNvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7RGlzcGxheUluZm99IGRpc3BsYXlJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBab2VGZWVzQ29uZmlnXG4gKiBAcHJvcGVydHkge05hdFZhbHVlfSBnZXRQdWJsaWNGYWNldEZlZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0hhbmRsZTwnZmVlTWludEFjY2Vzcyc+fSBGZWVNaW50QWNjZXNzXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2O2NrJcWAACXFgAAKgAAAEBhZ29yaWMvem9lLXYwLjI2LjIvdG9vbHMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByaWNlUXVvdGVcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCdzZXQnPn0gcXVvdGVBbW91bnRcbiAqIEFtb3VudCB3aG9zZSB2YWx1ZSBpcyBhIFByaWNlUXVvdGVWYWx1ZVxuICogQHByb3BlcnR5IHtFUmVmPFBheW1lbnQ8J3NldCc+Pn0gcXVvdGVQYXltZW50XG4gKiBUaGUgYHF1b3RlQW1vdW50YCB3cmFwcGVkIGFzIGEgcGF5bWVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tQcmljZURlc2NyaXB0aW9uXX0gUHJpY2VRdW90ZVZhbHVlXG4gKiBBIHNpbmdsZS12YWx1ZWQgc2V0IG9mIFByaWNlRGVzY3JpcHRpb25zLiAgVGhpcyBpcyB0aGUgYHZhbHVlYCBpblxuICogUHJpY2VRdW90ZS5xdW90ZUFtb3VudCAoYHsgYnJhbmQsIHZhbHVlOiBQcmljZVF1b3RlVmFsdWUgfWApLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpY2VEZXNjcmlwdGlvblxuICogQSBkZXNjcmlwdGlvbiBvZiBhIHNpbmdsZSBxdW90ZVxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBhbW91bnRJblxuICogVGhlIGFtb3VudCBzdXBwbGllZCB0byBhIHRyYWRlXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IGFtb3VudE91dFxuICogVGhlIHF1b3RlZCByZXN1bHQgb2YgdHJhZGluZyBgYW1vdW50SW5gXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lclNlcnZpY2V9IHRpbWVyXG4gKiBUaGUgc2VydmljZSB0aGF0IGdhdmUgdGhlIGB0aW1lc3RhbXBgXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXBSZWNvcmR9IHRpbWVzdGFtcFxuICogQSB0aW1lc3RhbXAgYWNjb3JkaW5nIHRvIGB0aW1lcmAgZm9yIHRoZSBxdW90ZVxuICogQHByb3BlcnR5IHthbnl9IFtjb25kaXRpb25zXVxuICogQWRkaXRpb25hbCBjb25kaXRpb25zIGZvciB0aGUgcXVvdGVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBQcmljZVF1b3RlQ3JlYXRlXG4gKiBAcGFyYW0ge1ByaWNlUXVlcnl9IHByaWNlUXVlcnlcbiAqIEByZXR1cm5zIHtFUmVmPFByaWNlUXVvdGU+IHwgdW5kZWZpbmVkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFByaWNlUXVvdGVUcmlnZ2VyXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGVDcmVhdGV9IGNyZWF0ZVF1b3RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmljZUF1dGhvcml0eUFkbWluXG4gKiBAcHJvcGVydHkgeyhjcmVhdGVRdW90ZTogUHJpY2VRdW90ZUNyZWF0ZSkgPT4gUHJvbWlzZTx2b2lkPn0gZmlyZVRyaWdnZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmljZUF1dGhvcml0eUtpdFxuICogQHByb3BlcnR5IHtQcmljZUF1dGhvcml0eX0gcHJpY2VBdXRob3JpdHlcbiAqIEBwcm9wZXJ0eSB7UHJpY2VBdXRob3JpdHlBZG1pbn0gYWRtaW5GYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTXV0YWJsZVF1b3RlXG4gKiBAcHJvcGVydHkgeyhyZWFzb24/OiBhbnkpID0+IHZvaWR9IGNhbmNlbFxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sIGFtb3VudE91dDogQW1vdW50PCduYXQnPikgPT4gdm9pZH0gdXBkYXRlTGV2ZWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxQcmljZVF1b3RlPn0gZ2V0UHJvbWlzZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpY2VBdXRob3JpdHlcbiAqIEFuIG9iamVjdCB0aGF0IG1pbnRzIFByaWNlUXVvdGVzIGFuZCBoYW5kbGVzXG4gKiB0cmlnZ2VycyBhbmQgbm90aWZpZXJzIGZvciBjaGFuZ2VzIGluIHRoZSBwcmljZVxuICpcbiAqIEBwcm9wZXJ0eSB7KGJyYW5kSW46IEJyYW5kLCBicmFuZE91dDogQnJhbmQpID0+IEVSZWY8SXNzdWVyPCdzZXQnPj59IGdldFF1b3RlSXNzdWVyXG4gKiBHZXQgdGhlIEVSVFAgaXNzdWVyIG9mIFByaWNlUXVvdGVzIGZvciBhIGdpdmVuIGJyYW5kSW4vYnJhbmRPdXQgcGFpclxuICpcbiAqIEBwcm9wZXJ0eSB7KGJyYW5kSW46IEJyYW5kLFxuICogICAgICAgICAgICAgYnJhbmRPdXQ6IEJyYW5kXG4gKiApID0+IEVSZWY8WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVyU2VydmljZT59IGdldFRpbWVyU2VydmljZVxuICogR2V0IHRoZSB0aW1lciB1c2VkIGluIFByaWNlUXVvdGVzIGZvciBhIGdpdmVuIGJyYW5kSW4vYnJhbmRPdXQgcGFpclxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQ8J25hdCc+LFxuICogICAgICAgICAgICAgYnJhbmRPdXQ6IEJyYW5kPCduYXQnPlxuICogICAgICAgICAgICApID0+IEVSZWY8Tm90aWZpZXI8UHJpY2VRdW90ZT4+fSBtYWtlUXVvdGVOb3RpZmllclxuICogQmUgbm90aWZpZWQgb2YgdGhlIGxhdGVzdCBQcmljZVF1b3RlcyBmb3IgYSBnaXZlblxuICogYGFtb3VudEluYC4gIFRoZSByYXRlIGF0IHdoaWNoIHRoZXNlIGFyZSBpc3N1ZWQgbWF5IGJlIHZlcnkgZGlmZmVyZW50IGJldHdlZW5cbiAqIGBwcmljZUF1dGhvcml0aWVzYC5cbiAqXG4gKiBAcHJvcGVydHkgeyhkZWFkbGluZTogWGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcCxcbiAqICAgICAgICAgICAgIGFtb3VudEluOiBBbW91bnQ8J25hdCc+LFxuICogICAgICAgICAgICAgYnJhbmRPdXQ6IEJyYW5kPCduYXQnPlxuICogKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZUF0VGltZVxuICogUmVzb2x2ZXMgYWZ0ZXIgYGRlYWRsaW5lYCBwYXNzZXMgb24gdGhlXG4gKiBwcmljZUF1dGhvcml0eSdzIHRpbWVyU2VydmljZSB3aXRoIHRoZSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIGF0IHRoYXQgdGltZVxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQ8J25hdCc+LFxuICogICAgICAgICAgICAgYnJhbmRPdXQ6IEJyYW5kPCduYXQnPlxuICogKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZUdpdmVuXG4gKiBHZXQgYSBxdW90ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYW1vdW50SW5cbiAqXG4gKiBAcHJvcGVydHkgeyhicmFuZEluOiBCcmFuZDwnbmF0Jz4sXG4gKiAgICAgICAgICAgICBhbW91bnRPdXQ6IEFtb3VudDwnbmF0Jz4pID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlV2FudGVkXG4gKiBHZXQgYSBxdW90ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYW1vdW50T3V0XG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50PCduYXQnPlxuICogKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdoZW5HVFxuICogUmVzb2x2ZSB3aGVuIGEgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCBleGNlZWRzIGBhbW91bnRPdXRMaW1pdGBcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50PCduYXQnPixcbiAqICAgICAgICAgICAgIGFtb3VudE91dExpbWl0OiBBbW91bnQ8J25hdCc+XG4gKiApID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlV2hlbkdURVxuICogUmVzb2x2ZSB3aGVuIGEgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCByZWFjaGVzIG9yIGV4Y2VlZHMgYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlV2hlbkxURVxuICogUmVzb2x2ZSB3aGVuIGEgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCByZWFjaGVzIG9yIGRyb3BzIGJlbG93XG4gKiBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCxcbiAqICAgICAgICAgICAgIGFtb3VudE91dExpbWl0OiBBbW91bnRcbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVXaGVuTFRcbiAqIFJlc29sdmUgd2hlbiB0aGUgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCBkcm9wcyBiZWxvdyBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCxcbiAqICAgICAgICAgICAgIGFtb3VudE91dExpbWl0OiBBbW91bnRcbiAqICkgPT4gRVJlZjxNdXRhYmxlUXVvdGU+fSBtdXRhYmxlUXVvdGVXaGVuR1RcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZXhjZWVkcyBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCxcbiAqICAgICAgICAgICAgIGFtb3VudE91dExpbWl0OiBBbW91bnRcbiAqICkgPT4gRVJlZjxNdXRhYmxlUXVvdGU+fSBtdXRhYmxlUXVvdGVXaGVuR1RFXG4gKiBSZXNvbHZlIHdoZW4gYSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIHJlYWNoZXMgb3IgZXhjZWVkc1xuICogYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkxURVxuICogUmVzb2x2ZSB3aGVuIGEgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCByZWFjaGVzIG9yIGRyb3BzIGJlbG93XG4gKiBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCxcbiAqICAgICAgICAgICAgIGFtb3VudE91dExpbWl0OiBBbW91bnRcbiAqICkgPT4gRVJlZjxNdXRhYmxlUXVvdGU+fSBtdXRhYmxlUXVvdGVXaGVuTFRcbiAqIFJlc29sdmUgd2hlbiB0aGUgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCBkcm9wcyBiZWxvdyBgYW1vdW50T3V0TGltaXRgXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KGFtb3VudDogQW1vdW50PCduYXQnPikgPT4gQW1vdW50PCduYXQnPn0gUHJpY2VDYWxjdWxhdG9yXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUHJpY2VRdWVyeVxuICogQHBhcmFtIHtQcmljZUNhbGN1bGF0b3J9IGNhbGNBbW91bnRJblxuICogQHBhcmFtIHtQcmljZUNhbGN1bGF0b3J9IGNhbGNBbW91bnRPdXRcbiAqIEByZXR1cm5zIHt7IGFtb3VudEluOiBBbW91bnQ8J25hdCc+LCBhbW91bnRPdXQ6IEFtb3VudDwnbmF0Jz4sIHRpbWVzdGFtcD86IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXBSZWNvcmQgfSB8IHVuZGVmaW5lZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByaWNlTGV2ZWxcbiAqIEEgZGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgcXVvdGVcbiAqXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IGFtb3VudEluXG4gKiBUaGUgYW1vdW50IHN1cHBsaWVkIHRvIGEgdHJhZGVcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gYW1vdW50T3V0XG4gKiBUaGUgcXVvdGVkIHJlc3VsdCBvZiB0cmFkaW5nIGBhbW91bnRJbmBcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADkBLVV8hkAAPIZAAAhAAAAQGVuZG8vY2FwdHAtdjMuMS4yL3NyYy9hdG9taWNzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJNSU5fREFUQV9CVUZGRVJfTEVOR1RIIiwiTUlOX1RSQU5TRkVSX0JVRkZFUl9MRU5HVEgiLCJUUkFOU0ZFUl9PVkVSSEVBRF9MRU5HVEgiLCJtYWtlQXRvbWljc1RyYXBHdWVzdCIsIm1ha2VBdG9taWNzVHJhcEhvc3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuXG4vKiBUaGlzIGlzIGEgcGF0aG9sb2dpY2FsIG1pbmltdW0sIGJ1dCBleGVyY2lzZWQgYnkgdGhlIHVuaXQgdGVzdC4qL1xuY29uc3QgICAgICAgIE1JTl9EQVRBX0JVRkZFUl9MRU5HVEg9MTtcblxuLyogQ2FsY3VsYXRlIGhvdyBiaWcgdGhlIHRyYW5zZmVyIGJ1ZmZlciBuZWVkcyB0byBiZS4qLyRo4oCNX29uY2UuTUlOX0RBVEFfQlVGRkVSX0xFTkdUSChNSU5fREFUQV9CVUZGRVJfTEVOR1RIKTtcbmNvbnN0ICAgICAgICBUUkFOU0ZFUl9PVkVSSEVBRF9MRU5HVEg9XG5CaWdVaW50NjRBcnJheS5CWVRFU19QRVJfRUxFTUVOVCtJbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOyRo4oCNX29uY2UuVFJBTlNGRVJfT1ZFUkhFQURfTEVOR1RIKFRSQU5TRkVSX09WRVJIRUFEX0xFTkdUSCk7XG5jb25zdCAgICAgICAgTUlOX1RSQU5TRkVSX0JVRkZFUl9MRU5HVEg9XG5NSU5fREFUQV9CVUZGRVJfTEVOR1RIK1RSQU5TRkVSX09WRVJIRUFEX0xFTkdUSDtcblxuLyogVGhlc2UgYXJlIGJpdCBmbGFncyBmb3IgdGhlIHN0YXR1cyBlbGVtZW50IG9mIHRoZSB0cmFuc2ZlciBidWZmZXIuKi8kaOKAjV9vbmNlLk1JTl9UUkFOU0ZFUl9CVUZGRVJfTEVOR1RIKE1JTl9UUkFOU0ZFUl9CVUZGRVJfTEVOR1RIKTtcbmNvbnN0IFNUQVRVU19XQUlUSU5HPTE7XG5jb25zdCBTVEFUVVNfRkxBR19ET05FPTI7XG5jb25zdCBTVEFUVVNfRkxBR19SRUpFQ1Q9NDtcblxuLyoqXG4gKiBSZXR1cm4gYSBzdGF0dXMgYnVmZmVyLCBsZW5ndGggYnVmZmVyLCBhbmQgZGF0YSBidWZmZXIgYmFja2VkIGJ5IHRyYW5zZmVyQnVmZmVyLlxuICpcbiAqIEBwYXJhbSB7U2hhcmVkQXJyYXlCdWZmZXJ9IHRyYW5zZmVyQnVmZmVyIHRoZSBiYWNraW5nIGJ1ZmZlclxuICovXG5jb25zdCBzcGxpdFRyYW5zZmVyQnVmZmVyPSh0cmFuc2ZlckJ1ZmZlcik9PntcbnRyYW5zZmVyQnVmZmVyLmJ5dGVMZW5ndGg+PU1JTl9UUkFOU0ZFUl9CVUZGRVJfTEVOR1RIfHxcbkZhaWwgYFRyYW5zZmVyIGJ1ZmZlciBvZiAke3RyYW5zZmVyQnVmZmVyLmJ5dGVMZW5ndGh9IGJ5dGVzIGlzIHNtYWxsZXIgdGhhbiBNSU5fVFJBTlNGRVJfQlVGRkVSX0xFTkdUSCAke01JTl9UUkFOU0ZFUl9CVUZGRVJfTEVOR1RIfWA7XG5jb25zdCBsZW5idWY9bmV3IEJpZ1VpbnQ2NEFycmF5KHRyYW5zZmVyQnVmZmVyLDAsMSk7XG5cbi8qIFRoZSBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCB0aGlzIG5lZWRzIHRvIGJlIGFuIEludDMyQXJyYXkgZm9yIHVzZSB3aXRoKi9cbi8qIEF0b21pY3Mubm90aWZ5OiovXG4vKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BdG9taWNzL25vdGlmeSNzeW50YXgqL1xuY29uc3Qgc3RhdHVzYnVmPW5ldyBJbnQzMkFycmF5KHRyYW5zZmVyQnVmZmVyLGxlbmJ1Zi5ieXRlTGVuZ3RoLDEpO1xuY29uc3Qgb3ZlcmhlYWRMZW5ndGg9bGVuYnVmLmJ5dGVMZW5ndGgrc3RhdHVzYnVmLmJ5dGVMZW5ndGg7XG5hc3NlcnQuZXF1YWwoXG5vdmVyaGVhZExlbmd0aCxcblRSQU5TRkVSX09WRVJIRUFEX0xFTkdUSCxcblggYEludGVybmFsIGVycm9yOyBhY3R1YWwgb3ZlcmhlYWQgJHtvdmVyaGVhZExlbmd0aH0gb2YgYnl0ZXMgaXMgbm90IFRSQU5TRkVSX09WRVJIRUFEX0xFTkdUSCAke1RSQU5TRkVSX09WRVJIRUFEX0xFTkdUSH1gKTtcblxuY29uc3QgZGF0YWJ1Zj1uZXcgVWludDhBcnJheSh0cmFuc2ZlckJ1ZmZlcixvdmVyaGVhZExlbmd0aCk7XG5kYXRhYnVmLmJ5dGVMZW5ndGg+PU1JTl9EQVRBX0JVRkZFUl9MRU5HVEh8fFxuRmFpbCBgVHJhbnNmZXIgYnVmZmVyIG9mIHNpemUgJHt0cmFuc2ZlckJ1ZmZlci5ieXRlTGVuZ3RofSBvbmx5IHN1cHBvcnRzICR7ZGF0YWJ1Zi5ieXRlTGVuZ3RofSBkYXRhIGJ5dGVzOyBuZWVkIGF0IGxlYXN0ICR7TUlOX0RBVEFfQlVGRkVSX0xFTkdUSH1gO1xucmV0dXJuIGhhcmRlbih7c3RhdHVzYnVmLGxlbmJ1ZixkYXRhYnVmfSk7XG4gfTtcblxuLyoqXG4gKiBDcmVhdGUgYSB0cmFwSG9zdCB0aGF0IGNhbiBiZSBwYWlyZWQgd2l0aCBtYWtlQXRvbWljc1RyYXBHdWVzdC5cbiAqXG4gKiBUaGlzIGhvc3QgZW5jb2RlcyB0aGUgdHJhbnNmZXIgYnVmZmVyIGFuZCByZXR1cm5zIGl0IGluIGNvbnNlY3V0aXZlIHNsaWNlc1xuICogd2hlbiB0aGUgZ3Vlc3QgaXRlcmF0ZXMgb3ZlciBpdC5cbiAqXG4gKiBAcGFyYW0ge1NoYXJlZEFycmF5QnVmZmVyfSB0cmFuc2ZlckJ1ZmZlclxuICogQHJldHVybnMge1RyYXBIb3N0fVxuICovXG5jb25zdCAgICAgICAgbWFrZUF0b21pY3NUcmFwSG9zdD0odHJhbnNmZXJCdWZmZXIpPT57XG5jb25zdHtzdGF0dXNidWYsbGVuYnVmLGRhdGFidWZ9PXNwbGl0VHJhbnNmZXJCdWZmZXIodHJhbnNmZXJCdWZmZXIpO1xuXG5jb25zdCB0ZT1uZXcgVGV4dEVuY29kZXIoKTtcblxucmV0dXJuIGFzeW5jIGZ1bmN0aW9uKnRyYXBIb3N0KFtpc1JlamVjdCxzZXJpYWxpemVkXSl7XG4vKiBHZXQgdGhlIGNvbXBsZXRlIGVuY29kZWQgbWVzc2FnZSBidWZmZXIuKi9cbmNvbnN0IGpzb249SlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCk7XG5jb25zdCBlbmNvZGVkPXRlLmVuY29kZShqc29uKTtcblxuLyogU2VuZCBjaHVua3MgaW4gdGhlIGRhdGEgdHJhbnNmZXIgYnVmZmVyLiovXG5sZXQgaT0wO1xubGV0IGRvbmU9ZmFsc2U7XG53aGlsZSghZG9uZSl7XG4vKiBDb3B5IHRoZSBuZXh0IHNsaWNlIG9mIHRoZSBlbmNvZGVkIGFycnkgdG8gdGhlIGRhdGEgYnVmZmVyLiovXG5jb25zdCBzdWJlbmM9ZW5jb2RlZC5zdWJhcnJheShpLGkrZGF0YWJ1Zi5sZW5ndGgpO1xuZGF0YWJ1Zi5zZXQoc3ViZW5jKTtcblxuLyogU2F2ZSB0aGUgbGVuZ3RoIG9mIHRoZSByZW1haW5pbmcgZGF0YS4qL1xuY29uc3QgcmVtYWluaW5nPUJpZ0ludChlbmNvZGVkLmxlbmd0aC1pKTtcbmxlbmJ1ZlswXT1yZW1haW5pbmc7XG5cbi8qIENhbGN1bGF0ZSB0aGUgbmV4dCBzbGljZSwgYW5kIHdoZXRoZXIgdGhpcyBpcyB0aGUgbGFzdCBvbmUuKi9cbmkrPXN1YmVuYy5sZW5ndGg7XG5kb25lPWk+PWVuY29kZWQubGVuZ3RoO1xuXG4vKiBGaW5kIGJpdGZsYWdzIHRvIHJlcHJlc2VudCB0aGUgcmVqZWN0ZWQgYW5kIGZpbmlzaGVkIHN0YXRlLiovXG5jb25zdCByZWplY3RGbGFnPWlzUmVqZWN0P1NUQVRVU19GTEFHX1JFSkVDVDowO1xuY29uc3QgZG9uZUZsYWc9ZG9uZT9TVEFUVVNfRkxBR19ET05FOjA7XG5cbi8qIE5vdGlmeSBvdXIgZ3Vlc3QgZm9yIHRoaXMgZGF0YSBidWZmZXIuKi9cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2UqL1xuc3RhdHVzYnVmWzBdPXJlamVjdEZsYWd8ZG9uZUZsYWc7XG5BdG9taWNzLm5vdGlmeShzdGF0dXNidWYsMCwrSW5maW5pdHkpO1xuXG5pZighZG9uZSl7XG4vKiBXYWl0IHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gYGl0Lm5leHQoKWAuICBJZiB0aGUgZ3Vlc3QgY2FsbHMqL1xuLyogYGl0LnJldHVybigpYCBvciBgaXQudGhyb3coKWAsIHRoZW4gdGhpcyB5aWVsZCB3aWxsIHJldHVybiBvciB0aHJvdywqL1xuLyogdGVybWluYXRpbmcgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBlYXJseS4qL1xueWllbGQ7XG4gfVxuIH1cbiB9O1xuIH07XG5cbi8qKlxuICogQ3JlYXRlIGEgdHJhcEd1ZXN0IHRoYXQgY2FuIGJlIHBhaXJlZCB3aXRoIG1ha2VBdG9taWNzVHJhcEhvc3QuXG4gKlxuICogVGhpcyBndWVzdCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBjb25zZWN1dGl2ZSBzbGljZXMgb2YgdGhlIEpTT04tZW5jb2RlZCBkYXRhLFxuICogdGhlbiByZXR1cm5zIGl0LlxuICpcbiAqIEBwYXJhbSB7U2hhcmVkQXJyYXlCdWZmZXJ9IHRyYW5zZmVyQnVmZmVyXG4gKiBAcmV0dXJucyB7VHJhcEd1ZXN0fVxuICovJGjigI1fb25jZS5tYWtlQXRvbWljc1RyYXBIb3N0KG1ha2VBdG9taWNzVHJhcEhvc3QpO1xuY29uc3QgICAgICAgIG1ha2VBdG9taWNzVHJhcEd1ZXN0PSh0cmFuc2ZlckJ1ZmZlcik9PntcbmNvbnN0e3N0YXR1c2J1ZixsZW5idWYsZGF0YWJ1Zn09c3BsaXRUcmFuc2ZlckJ1ZmZlcih0cmFuc2ZlckJ1ZmZlcik7XG5cbnJldHVybih7c3RhcnRUcmFwfSk9Pntcbi8qIFN0YXJ0IGJ5IHNlbmRpbmcgdGhlIHRyYXAgY2FsbCB0byB0aGUgaG9zdC4qL1xuY29uc3QgaXQ9c3RhcnRUcmFwKCk7XG5cbi8qKiBAdHlwZSB7VWludDhBcnJheSB8IHVuZGVmaW5lZH0gKi9cbmxldCBlbmNvZGVkO1xubGV0IGk9MDtcbmxldCBkb25lPWZhbHNlO1xud2hpbGUoIWRvbmUpe1xuLyogVGVsbCB0aGF0IHdlIGFyZSByZWFkeSBmb3IgYW5vdGhlciBidWZmZXIuKi9cbnN0YXR1c2J1ZlswXT1TVEFUVVNfV0FJVElORztcbmNvbnN0e2RvbmU6aXREb25lfT1pdC5uZXh0KCk7XG4haXREb25lfHxGYWlsIGBJbnRlcm5hbCBlcnJvcjsgaXQubmV4dCgpIHJldHVybmVkIGRvbmU9JHtpdERvbmV9YDtcblxuLyogV2FpdCBmb3IgdGhlIGhvc3QgdG8gd2FrZSB1cy4qL1xuQXRvbWljcy53YWl0KHN0YXR1c2J1ZiwwLFNUQVRVU19XQUlUSU5HKTtcblxuLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyB0aGUgbGFzdCBidWZmZXIuKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlKi9cbmRvbmU9KHN0YXR1c2J1ZlswXSZTVEFUVVNfRkxBR19ET05FKSE9PTA7XG5cbi8qIEFjY3VtdWxhdGUgdGhlIGVuY29kZWQgYnVmZmVyLiovXG5jb25zdCByZW1haW5pbmc9TnVtYmVyKGxlbmJ1ZlswXSk7XG5jb25zdCBkYXRhbGVuPU1hdGgubWluKHJlbWFpbmluZyxkYXRhYnVmLmJ5dGVMZW5ndGgpO1xuaWYoIWVuY29kZWQpe1xuaWYoZG9uZSl7XG4vKiBTcGVjaWFsIGNhc2U6IHdlIGFyZSBkb25lIG9uIGZpcnN0IHRyeSwgc28gd2UgZG9uJ3QgbmVlZCB0byBjb3B5Ki9cbi8qIGFueXRoaW5nLiovXG5lbmNvZGVkPWRhdGFidWYuc3ViYXJyYXkoMCxkYXRhbGVuKTtcbmJyZWFrO1xuIH1cbi8qIEFsbG9jYXRlIG91ciBidWZmZXIgZm9yIHRoZSByZW1haW5pbmcgZGF0YS4qL1xuZW5jb2RlZD1uZXcgVWludDhBcnJheShyZW1haW5pbmcpO1xuIH1cblxuLyogQ29weSB0aGUgbmV4dCBidWZmZXIuKi9cbmVuY29kZWQuc2V0KGRhdGFidWYuc3ViYXJyYXkoMCxkYXRhbGVuKSxpKTtcbmkrPWRhdGFsZW47XG4gfVxuXG4vKiBUaGlzIHRocm93IGlzIGhhcm1sZXNzIGlmIHRoZSBob3N0IGl0ZXJhdG9yIGhhcyBhbHJlYWR5IGZpbmlzaGVkLCBhbmQqL1xuLyogaWYgbm90IGZpbmlzaGVkLCBjYXB0cCB3aWxsIGNvcnJlY3RseSByYWlzZSBhbiBlcnJvci4qL1xuLyoqL1xuLyogVE9ETzogSXQgd291bGQgYmUgbmljZSB0byB1c2UgYW4gZXJyb3IgdHlwZSwgYnV0IGNhcHRwIGlzIGp1c3QgdG9vKi9cbi8qIG5vaXN5IHdpdGggc3B1cmlvdXMgXCJUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yXCIgbWVzc2FnZXMuKi9cbi8qIGl0LnRocm93KGFzc2VydC5lcnJvcihYYFRyYXAgaG9zdCBoYXMgbm90IGZpbmlzaGVkYCkpOyovXG5pdC50aHJvdyhudWxsKTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2UqL1xuY29uc3QgaXNSZWplY3Q9ISEoc3RhdHVzYnVmWzBdJlNUQVRVU19GTEFHX1JFSkVDVCk7XG5cbi8qIERlY29kZSB0aGUgYWNjdW11bGF0ZWQgZW5jb2RlZCBidWZmZXIuKi9cbmNvbnN0IHRkPW5ldyBUZXh0RGVjb2RlcigndXRmLTgnKTtcbmNvbnN0IGpzb249dGQuZGVjb2RlKGVuY29kZWQpO1xuXG4vKiBQYXJzZSB0aGUgSlNPTiBkYXRhIGludG8gbWFyc2hhbGxlZCBmb3JtLiovXG5jb25zdCBzZXJpYWxpemVkPUpTT04ucGFyc2UoanNvbik7XG5yZXR1cm5baXNSZWplY3Qsc2VyaWFsaXplZF07XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZUF0b21pY3NUcmFwR3Vlc3QobWFrZUF0b21pY3NUcmFwR3Vlc3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Ik1JTl9EQVRBX0JVRkZFUl9MRU5HVEgiOlsiTUlOX0RBVEFfQlVGRkVSX0xFTkdUSCJdLCJUUkFOU0ZFUl9PVkVSSEVBRF9MRU5HVEgiOlsiVFJBTlNGRVJfT1ZFUkhFQURfTEVOR1RIIl0sIk1JTl9UUkFOU0ZFUl9CVUZGRVJfTEVOR1RIIjpbIk1JTl9UUkFOU0ZFUl9CVUZGRVJfTEVOR1RIIl0sIm1ha2VBdG9taWNzVHJhcEhvc3QiOlsibWFrZUF0b21pY3NUcmFwSG9zdCJdLCJtYWtlQXRvbWljc1RyYXBHdWVzdCI6WyJtYWtlQXRvbWljc1RyYXBHdWVzdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABYxdWrIV4AACFeAAAfAAAAQGVuZG8vY2FwdHAtdjMuMS4yL3NyYy9jYXB0cC5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiLi90cmFwLmpzIiwiLi90eXBlcy5qcyIsIi4vZmluYWxpemUuanMiXSwiZXhwb3J0cyI6WyJFIiwibWFrZUNhcFRQIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFJlbW90YWJsZSxGYXIsbWFrZU1hcnNoYWwsUUNMQVNTLEUsSGFuZGxlZFByb21pc2UsaXNQcm9taXNlLG1ha2VQcm9taXNlS2l0LG1ha2VUcmFwLG1ha2VGaW5hbGl6aW5nTWFwOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIlJlbW90YWJsZVwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjigI1fYSldXSxbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSksJGjigI1fbGl2ZVtcIkVcIl1dXSxbXCJIYW5kbGVkUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoSGFuZGxlZFByb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXSxbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90cmFwLmpzXCIsIFtbXCJtYWtlVHJhcFwiLCBbJGjigI1fYSA9PiAobWFrZVRyYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9maW5hbGl6ZS5qc1wiLCBbW1wibWFrZUZpbmFsaXppbmdNYXBcIiwgWyRo4oCNX2EgPT4gKG1ha2VGaW5hbGl6aW5nTWFwID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcblxuY29uc3QgV0VMTF9LTk9XTl9TTE9UX1BST1BFUlRJRVM9aGFyZGVuKFsnYW5zd2VySUQnLCdxdWVzdGlvbklEJywndGFyZ2V0J10pO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBtYXliZVRoZW5hYmxlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNUaGVuYWJsZT0obWF5YmVUaGVuYWJsZSk9PlxubWF5YmVUaGVuYWJsZSYmdHlwZW9mIG1heWJlVGhlbmFibGUudGhlbj09PSdmdW5jdGlvbic7XG5cbi8qKlxuICogUmV2ZXJzZSBzbG90IGRpcmVjdGlvbi5cbiAqXG4gKiBSZXZlcnNlZCB0byBwcmV2ZW50IG5hbWVzcGFjZSBjb2xsaXNpb25zIGJldHdlZW4gc2xvdHMgd2VcbiAqIGFsbG9jYXRlIGFuZCB0aGUgb25lcyB0aGUgb3RoZXIgc2lkZSBhbGxvY2F0ZXMuICBJZiB3ZSBhbGxvY2F0ZVxuICogYSBzbG90LCBzZXJpYWxpemUgaXQgdG8gdGhlIG90aGVyIHNpZGUsIGFuZCB0aGV5IHNlbmQgaXQgYmFjayB0b1xuICogdXMsIHdlIG5lZWQgdG8gcmVmZXJlbmNlIGp1c3Qgb3VyIG93biBzbG90LCBub3Qgb25lIGZyb20gdGhlaXJcbiAqIHNpZGUuXG4gKlxuICogQHBhcmFtIHtDYXBUUFNsb3R9IHNsb3RcbiAqIEByZXR1cm5zIHtDYXBUUFNsb3R9IHNsb3Qgd2l0aCBkaXJlY3Rpb24gcmV2ZXJzZWRcbiAqL1xuY29uc3QgcmV2ZXJzZVNsb3Q9KHNsb3QpPT57XG5jb25zdCBvdGhlckRpcj1zbG90WzFdPT09JysnPyctJzonKyc7XG5jb25zdCByZXZzbG90PSBgJHtzbG90WzBdfSR7b3RoZXJEaXJ9JHtzbG90LnNsaWNlKDIpfWA7XG5yZXR1cm4gcmV2c2xvdDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENhcFRQT3B0aW9ucyB0aGUgb3B0aW9ucyB0byBtYWtlQ2FwVFBcbiAqIEBwcm9wZXJ0eSB7KHZhbDogdW5rbm93biwgc2xvdDogQ2FwVFBTbG90KSA9PiB2b2lkfSBbZXhwb3J0SG9va11cbiAqIEBwcm9wZXJ0eSB7KHZhbDogdW5rbm93biwgc2xvdDogQ2FwVFBTbG90KSA9PiB2b2lkfSBbaW1wb3J0SG9va11cbiAqIEBwcm9wZXJ0eSB7KGVycjogYW55KSA9PiB2b2lkfSBbb25SZWplY3RdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2Vwb2NoXSBhbiBpbnRlZ2VyIHRhZyB0byBhdHRhY2ggdG8gYWxsIG1lc3NhZ2VzIGluIG9yZGVyIHRvXG4gKiBhc3Npc3QgaW4gaWdub3JpbmcgZWFybGllciBkZWZ1bmN0IGluc3RhbmNlJ3MgbWVzc2FnZXNcbiAqIEBwcm9wZXJ0eSB7VHJhcEd1ZXN0fSBbdHJhcEd1ZXN0XSBpZiBzcGVjaWZpZWQsIGVuYWJsZSB0aGlzIENhcFRQIChndWVzdCkgdG9cbiAqIHVzZSBUcmFwKHRhcmdldCkgdG8gYmxvY2sgd2hpbGUgdGhlIHJlY2lwaWVudCAoaG9zdCkgcmVzb2x2ZXMgYW5kXG4gKiBjb21tdW5pY2F0ZXMgdGhlIHJlc3BvbnNlIHRvIHRoZSBtZXNzYWdlXG4gKiBAcHJvcGVydHkge1RyYXBIb3N0fSBbdHJhcEhvc3RdIGlmIHNwZWNpZmllZCwgZW5hYmxlIHRoaXMgQ2FwVFAgKGhvc3QpIHRvIHNlcnZlXG4gKiBvYmplY3RzIG1hcmtlZCB3aXRoIG1ha2VUcmFwSGFuZGxlciB0byBzeW5jaHJvbm91cyBjbGllbnRzIChndWVzdHMpXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtnY0ltcG9ydHNdIGlmIHRydWUsIGFnZ3Jlc3NpdmVseSBnYXJiYWdlIGNvbGxlY3QgaW1wb3J0c1xuICovXG5cbi8qKlxuICogQ3JlYXRlIGEgQ2FwVFAgY29ubmVjdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3VySWQgb3VyIG5hbWUgZm9yIHRoZSBjdXJyZW50IHNpZGVcbiAqIEBwYXJhbSB7KG9iajogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdm9pZH0gcmF3U2VuZCBzZW5kIGEgSlNPTmFibGUgcGFja2V0XG4gKiBAcGFyYW0ge2FueX0gYm9vdHN0cmFwT2JqIHRoZSBvYmplY3QgdG8gZXhwb3J0IHRvIHRoZSBvdGhlciBzaWRlXG4gKiBAcGFyYW0ge0NhcFRQT3B0aW9uc30gb3B0cyBvcHRpb25zIHRvIHRoZSBjb25uZWN0aW9uXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ2FwVFA9KFxub3VySWQsXG5yYXdTZW5kLFxuYm9vdHN0cmFwT2JqPXVuZGVmaW5lZCxcbm9wdHM9e30pPT5cbntcbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gKi9cbmNvbnN0IHNlbmRTdGF0cz17fTtcbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gKi9cbmNvbnN0IHJlY3ZTdGF0cz17fTtcblxuY29uc3QgZ2NTdGF0cz17XG5EUk9QUEVEOjB9O1xuXG5jb25zdCBnZXRTdGF0cz0oKT0+XG5oYXJkZW4oe1xuc2VuZDp7Li4uc2VuZFN0YXRzfSxcbnJlY3Y6ey4uLnJlY3ZTdGF0c30sXG5nYzp7Li4uZ2NTdGF0c319KTtcblxuXG5jb25zdHtcbm9uUmVqZWN0PShlcnIpPT5jb25zb2xlLmVycm9yKCdDYXBUUCcsb3VySWQsJ2V4Y2VwdGlvbjonLGVyciksXG5lcG9jaD0wLFxuZXhwb3J0SG9vayxcbmltcG9ydEhvb2ssXG50cmFwR3Vlc3QsXG50cmFwSG9zdCxcbmdjSW1wb3J0cz1mYWxzZX09XG5vcHRzO1xuXG4vKiBJdCdzIGEgaGF6YXJkIHRvIGhhdmUgdHJhcEd1ZXN0IGFuZCB0cmFwSG9zdCBib3RoIGVuYWJsZWQsIGFzIHdlIG1heSovXG4vKiBlbmNvdW50ZXIgZGVhZGxvY2suICBXaXRob3V0IGEgbG90IG1vcmUgYm9va2tlZXBpbmcsIHdlIGNhbid0IGRldGVjdCBpdCBmb3IqL1xuLyogbW9yZSBnZW5lcmFsIG5ldHdvcmtzIG9mIENhcFRQcywgYnV0IHdlIGFyZSBjb25zZXJ2YXRpdmUgZm9yIGF0IGxlYXN0IHRoaXMqL1xuLyogb25lIGNhc2UuKi9cbiEodHJhcEhvc3QmJnRyYXBHdWVzdCl8fFxuRmFpbCBgQ2FwVFAgJHtvdXJJZH0gY2FuIG9ubHkgYmUgb25lIG9mIGVpdGhlciB0cmFwR3Vlc3Qgb3IgdHJhcEhvc3RgO1xuXG5jb25zdCBkaXNjb25uZWN0UmVhc29uPShpZCk9PlxuRXJyb3IoIGAke0pTT04uc3RyaW5naWZ5KGlkKX0gY29ubmVjdGlvbiBjbG9zZWRgKTtcblxuLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQsIHZvaWQ+Pj59ICovXG5jb25zdCB0cmFwSXRlcmF0b3JSZXN1bHRQPW5ldyBNYXAoKTtcbi8qKiBAdHlwZSB7TWFwPHN0cmluZywgQXN5bmNJdGVyYXRvcjx2b2lkLCB2b2lkLCBhbnk+Pn0gKi9cbmNvbnN0IHRyYXBJdGVyYXRvcj1uZXcgTWFwKCk7XG5cbi8qKiBAdHlwZSB7YW55fSAqL1xubGV0IHVucGx1Zz1mYWxzZTtcbmNvbnN0IHF1aWV0UmVqZWN0PShyZWFzb249dW5kZWZpbmVkLHJldHVybkl0PXRydWUpPT57XG5pZigodW5wbHVnPT09ZmFsc2V8fHJlYXNvbiE9PXVucGx1ZykmJnJlYXNvbiE9PXVuZGVmaW5lZCl7XG5vblJlamVjdChyZWFzb24pO1xuIH1cbmlmKCFyZXR1cm5JdCl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gfVxuXG4vKiBTaWxlbmNlIHRoZSB1bmhhbmRsZWQgcmVqZWN0aW9uIHdhcm5pbmcsIGJ1dCBkb24ndCBhZmZlY3QqL1xuLyogdGhlIHVzZXIncyBoYW5kbGVycy4qL1xuY29uc3QgcD1Qcm9taXNlLnJlamVjdChyZWFzb24pO1xucC5jYXRjaCgoXyk9PnsgfSk7XG5yZXR1cm4gcDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge01hcDxULCBudW1iZXI+fSBzcGVjaW1lblRvUmVmQ291bnRcbiAqIEBwYXJhbSB7KHNwZWNpbWVuOiBUKSA9PiBib29sZWFufSBwcmVkaWNhdGVcbiAqL1xuY29uc3QgbWFrZVJlZkNvdW50ZXI9KHNwZWNpbWVuVG9SZWZDb3VudCxwcmVkaWNhdGUpPT57XG4vKiogQHR5cGUge1NldDxUPn0gKi9cbmNvbnN0IHNlZW49bmV3IFNldCgpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmFkZChzcGVjaW1lbil7XG5pZihwcmVkaWNhdGUoc3BlY2ltZW4pKXtcbnNlZW4uYWRkKHNwZWNpbWVuKTtcbiB9XG5yZXR1cm4gc3BlY2ltZW47XG4gfSxcbmNvbW1pdCgpe1xuLyogSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgZm9yIGVhY2ggc2VlbiBzcGVjaW1lbi4qL1xuZm9yKGNvbnN0IHNwZWNpbWVuIG9mIHNlZW4ua2V5cygpKXtcbmNvbnN0IG51bVJlZnM9c3BlY2ltZW5Ub1JlZkNvdW50LmdldChzcGVjaW1lbil8fDA7XG5zcGVjaW1lblRvUmVmQ291bnQuc2V0KHNwZWNpbWVuLG51bVJlZnMrMSk7XG4gfVxuc2Vlbi5jbGVhcigpO1xuIH0sXG5hYm9ydCgpe1xuc2Vlbi5jbGVhcigpO1xuIH19KTtcblxuIH07XG5cbi8qKiBAdHlwZSB7TWFwPENhcFRQU2xvdCwgbnVtYmVyPn0gKi9cbmNvbnN0IHNsb3RUb051bVJlZnM9bmV3IE1hcCgpO1xuXG5jb25zdCByZWN2U2xvdD1tYWtlUmVmQ291bnRlcihcbnNsb3RUb051bVJlZnMsXG4oc2xvdCk9PnR5cGVvZiBzbG90PT09J3N0cmluZycmJnNsb3RbMV09PT0nLScpO1xuXG5cbmNvbnN0IHNlbmRTbG90PW1ha2VSZWZDb3VudGVyKFxuc2xvdFRvTnVtUmVmcyxcbihzbG90KT0+dHlwZW9mIHNsb3Q9PT0nc3RyaW5nJyYmc2xvdFsxXT09PScrJyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9ialxuICovXG5jb25zdCBzZW5kPShvYmopPT57XG5zZW5kU3RhdHNbb2JqLnR5cGVdPShzZW5kU3RhdHNbb2JqLnR5cGVdfHwwKSsxO1xuXG5mb3IoY29uc3QgcHJvcCBvZiBXRUxMX0tOT1dOX1NMT1RfUFJPUEVSVElFUyl7XG5zZW5kU2xvdC5hZGQob2JqW3Byb3BdKTtcbiB9XG5zZW5kU2xvdC5jb21taXQoKTtcblxuLyogRG9uJ3QgdGhyb3cgaGVyZSBpZiB1bnBsdWdnZWQsIGp1c3QgZG9uJ3Qgc2VuZC4qL1xuaWYodW5wbHVnIT09ZmFsc2Upe1xucmV0dXJuO1xuIH1cblxuLyogQWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSwgaW4gdGhlIG5leHQgdHVybi4qL1xucmF3U2VuZChvYmopO1xuIH07XG5cbi8qKlxuICogY29udmVydFZhbFRvU2xvdCBhbmQgY29udmVydFNsb3RUb1ZhbCBib3RoIHBlcmZvcm0gc2lkZSBlZmZlY3RzLFxuICogcG9wdWxhdGluZyB0aGUgYy1saXN0cyAoaW1wb3J0cy9leHBvcnRzL3F1ZXN0aW9ucy9hbnN3ZXJzKSB1cG9uXG4gKiBtYXJzaGFsbGluZy91bm1hcnNoYWxsaW5nLiAgQXMgd2UgdHJhdmVyc2UgdGhlIGRhdGFzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nXG4gKiB0aGUgbWVzc2FnZSwgd2UgZGlzY292ZXIgd2hhdCB3ZSBuZWVkIHRvIGltcG9ydC9leHBvcnQgYW5kIHNlbmQgcmVsZXZhbnRcbiAqIG1lc3NhZ2VzIGFjcm9zcyB0aGUgd2lyZS5cbiAqL1xuY29uc3R7c2VyaWFsaXplLHVuc2VyaWFsaXplfT1tYWtlTWFyc2hhbChcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb252ZXJ0VmFsVG9TbG90LFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnZlcnRTbG90VG9WYWwsXG57XG5tYXJzaGFsTmFtZTogYGNhcHRwOiR7b3VySWR9YCxcbi8qIFRPRE8gVGVtcG9yYXJ5IGhhY2suKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3ODAqL1xuZXJyb3JJZE51bToyMDAwMCxcbi8qIFRPRE86IGZpeCBjYXB0cCB0byBiZSBjb21wYXRpYmxlIHdpdGggc21hbGxjYXBzKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J2NhcGRhdGEnfSk7XG5cblxuXG4vKiogQHR5cGUge1dlYWtNYXA8YW55LCBDYXBUUFNsb3Q+fSAqL1xuY29uc3QgdmFsVG9TbG90PW5ldyBXZWFrTWFwKCk7LyogZXhwb3J0cyBsb29rZWQgdXAgYnkgdmFsKi9cbi8qKiBAdHlwZSB7TWFwPENhcFRQU2xvdCwgYW55Pn0gKi9cbmNvbnN0IHNsb3RUb0V4cG9ydGVkPW5ldyBNYXAoKTtcbmNvbnN0IHNsb3RUb0ltcG9ydGVkPW1ha2VGaW5hbGl6aW5nTWFwKFxuLyoqXG4gKiBAcGFyYW0ge0NhcFRQU2xvdH0gc2xvdElEXG4gKi9cbihzbG90SUQpPT57XG4vKiBXZSBkcm9wIGFsbCB0aGUgcmVmZXJlbmNlcyB3ZSBrbm93IGFib3V0IGF0IG9uY2UsIHNpbmNlIEdDIHRvbGQgdXMgd2UqL1xuLyogZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmUuKi9cbmNvbnN0IGRlY1JlZnM9c2xvdFRvTnVtUmVmcy5nZXQoc2xvdElEKXx8MDtcbnNsb3RUb051bVJlZnMuZGVsZXRlKHNsb3RJRCk7XG5zZW5kKHt0eXBlOidDVFBfRFJPUCcsc2xvdElELGRlY1JlZnMsZXBvY2h9KTtcbiB9LFxue3dlYWtWYWx1ZXM6Z2NJbXBvcnRzfSk7XG5cbmNvbnN0IGV4cG9ydGVkVHJhcEhhbmRsZXJzPW5ldyBXZWFrU2V0KCk7XG5cbi8qIFVzZWQgdG8gY29uc3RydWN0IHNsb3QgbmFtZXMgZm9yIHByb21pc2VzL25vbi1wcm9taXNlcy4qL1xuLyogSW4gdGhpcyB2ZXJzaW9uIG9mIENhcFRQIHdlIHVzZSBzdHJpbmdzIGZvciBleHBvcnQvaW1wb3J0IHNsb3QgbmFtZXMuKi9cbi8qIHByZWZpeGVkIHdpdGggJ3AnIGlmIHByb21pc2VzIGFuZCAnbycgb3RoZXJ3aXNlOyovXG5sZXQgbGFzdFByb21pc2VJRD0wO1xubGV0IGxhc3RFeHBvcnRJRD0wO1xuLyogU2luY2Ugd2UgZGVjaWRlIHRoZSBpZHMgZm9yIHF1ZXN0aW9ucywgd2UgdXNlIHRoaXMgdG8gaW5jcmVtZW50IHRoZSovXG4vKiBxdWVzdGlvbiBrZXkqL1xuXG4vKiogQHR5cGUge01hcDxDYXBUUFNsb3QsIFNldHRsZXI8dW5rbm93bj4+fSAqL1xuY29uc3Qgc2V0dGxlcnM9bmV3IE1hcCgpO1xuLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBhbnk+fSAqL1xuY29uc3QgYW5zd2Vycz1uZXcgTWFwKCk7LyogY2hvc2VuIGJ5IG91ciBwZWVyKi9cblxuLyoqXG4gKiBDYWxsZWQgYXQgbWFyc2hhbGxpbmcgdGltZS4gIEVpdGhlciByZXRyaWV2ZXMgYW4gZXhpc3RpbmcgZXhwb3J0LCBvciBpZlxuICogbm90IHlldCBleHBvcnRlZCwgcmVjb3JkcyB0aGlzIGV4cG9ydGVkIG9iamVjdC4gIElmIGEgcHJvbWlzZSwgc2V0cyB1cCBhXG4gKiBwcm9taXNlIGxpc3RlbmVyIHRvIGluZm9ybSB0aGUgb3RoZXIgc2lkZSB3aGVuIHRoZSBwcm9taXNlIGlzXG4gKiBmdWxmaWxsZWQvYnJva2VuLlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29udmVydFZhbFRvU2xvdDxDYXBUUFNsb3Q+fVxuICovXG5mdW5jdGlvbiBjb252ZXJ0VmFsVG9TbG90KHZhbCl7XG5pZighdmFsVG9TbG90Lmhhcyh2YWwpKXtcbi8qKlxuICogbmV3IGV4cG9ydFxuICpcbiAqIEB0eXBlIHtDYXBUUFNsb3R9XG4gKi9cbmxldCBzbG90O1xuaWYoaXNQcm9taXNlKHZhbCkpe1xuLyogVGhpcyBpcyBhIHByb21pc2UsIHNvIHdlJ3JlIGdvaW5nIHRvIGluY3JlbWVudCB0aGUgbGFzdFByb21pc2VJZCovXG4vKiBhbmQgdXNlIHRoYXQgdG8gY29uc3RydWN0IHRoZSBzbG90IG5hbWUuICBQcm9taXNlIHNsb3RzIGFyZSBwcmVmYWNlZCovXG4vKiB3aXRoICdwKycuKi9cbmxhc3RQcm9taXNlSUQrPTE7XG5zbG90PSBgcCske2xhc3RQcm9taXNlSUR9YDtcbmNvbnN0IHByb21pc2VJRD1yZXZlcnNlU2xvdChzbG90KTtcbmlmKGV4cG9ydEhvb2spe1xuZXhwb3J0SG9vayh2YWwsc2xvdCk7XG4gfVxuLyogU2V0IHVwIHByb21pc2UgbGlzdGVuZXIgdG8gaW5mb3JtIG90aGVyIHNpZGUgd2hlbiB0aGlzIHByb21pc2UqL1xuLyogaXMgZnVsZmlsbGVkL2Jyb2tlbiovXG5jb25zdCByZWplY3RlZD0ocmVhc29uKT0+XG5zZW5kKHtcbnR5cGU6J0NUUF9SRVNPTFZFJyxcbnByb21pc2VJRCxcbnJlajpzZXJpYWxpemUoaGFyZGVuKHJlYXNvbikpfSk7XG5cbkUud2hlbihcbnZhbCxcbihyZXN1bHQpPT5cbnNlbmQoe1xudHlwZTonQ1RQX1JFU09MVkUnLFxucHJvbWlzZUlELFxucmVzOnNlcmlhbGl6ZShoYXJkZW4ocmVzdWx0KSl9KSxcblxucmVqZWN0ZWRcbi8qIFByb3BhZ2F0ZSBpbnRlcm5hbCBlcnJvcnMgYXMgcmVqZWN0aW9ucy4qLykuXG5jYXRjaChyZWplY3RlZCk7XG4gfWVsc2V7XG4vKiBTaW5jZSB0aGlzIGlzbid0IGEgcHJvbWlzZSwgd2UgaW5zdGVhZCBpbmNyZW1lbnQgdGhlIGxhc3RFeHBvcnRJZCBhbmQqL1xuLyogdXNlIHRoYXQgdG8gY29uc3RydWN0IHRoZSBzbG90IG5hbWUuICBOb24tcHJvbWlzZXMgYXJlIHByZWZhY2VkIHdpdGgqL1xuLyogJ28rJyBmb3Igbm9ybWFsIG9iamVjdHMsIG9yIGB0K2AgZm9yIHN5bmNhYmxlLiovXG5jb25zdCBleHBvcnRJRD1sYXN0RXhwb3J0SUQrMTtcbmlmKGV4cG9ydGVkVHJhcEhhbmRsZXJzLmhhcyh2YWwpKXtcbnNsb3Q9IGB0KyR7ZXhwb3J0SUR9YDtcbiB9ZWxzZXtcbnNsb3Q9IGBvKyR7ZXhwb3J0SUR9YDtcbiB9XG5pZihleHBvcnRIb29rKXtcbmV4cG9ydEhvb2sodmFsLHNsb3QpO1xuIH1cbmxhc3RFeHBvcnRJRD1leHBvcnRJRDtcbiB9XG5cbi8qIE5vdyByZWNvcmQgdGhlIGV4cG9ydCBpbiBib3RoIHZhbFRvU2xvdCBhbmQgc2xvdFRvVmFsIHNvIHdlIGNhbiBsb29rIGl0Ki9cbi8qIHVwIGZyb20gZWl0aGVyIHRoZSB2YWx1ZSBvciB0aGUgc2xvdCBuYW1lIGxhdGVyLiovXG52YWxUb1Nsb3Quc2V0KHZhbCxzbG90KTtcbnNsb3RUb0V4cG9ydGVkLnNldChzbG90LHZhbCk7XG4gfVxuLyogQXQgdGhpcyBwb2ludCwgdGhlIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgZXhwb3J0ZWQsIHNvIHJldHVybiB0aGUqL1xuLyogYXNzb2NpYXRlZCBzbG90IG51bWJlci4qL1xuY29uc3Qgc2xvdD12YWxUb1Nsb3QuZ2V0KHZhbCk7XG5hc3NlcnQudHlwZW9mKHNsb3QsJ3N0cmluZycpO1xuXG5yZXR1cm4gc2VuZFNsb3QuYWRkKHNsb3QpO1xuIH1cblxuY29uc3QgSVNfUkVNT1RFX1BVTVBLSU49aGFyZGVuKHt9KTtcbi8qKlxuICogQHR5cGUge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db252ZXJ0U2xvdFRvVmFsPENhcFRQU2xvdD59XG4gKi9cbmNvbnN0IGFzc2VydFZhbElzTG9jYWw9KHZhbCk9PntcbmNvbnN0IHNsb3Q9dmFsVG9TbG90LmdldCh2YWwpO1xuaWYoc2xvdCYmc2xvdFsxXT09PSctJyl7XG50aHJvdyBJU19SRU1PVEVfUFVNUEtJTjtcbiB9XG4gfTtcblxuY29uc3R7c2VyaWFsaXplOmFzc2VydE9ubHlMb2NhbH09bWFrZU1hcnNoYWwoYXNzZXJ0VmFsSXNMb2NhbCk7XG5jb25zdCBpc09ubHlMb2NhbD0oc3BlY2ltZW4pPT57XG4vKiBUcnkgbWFyc2hhbGxpbmcgdGhlIG9iamVjdCwgYnV0IHRocm93IG9uIHJlZmVyZW5jZXMgdG8gcmVtb3RlIG9iamVjdHMuKi9cbnRyeXtcbmFzc2VydE9ubHlMb2NhbChoYXJkZW4oc3BlY2ltZW4pKTtcbnJldHVybiB0cnVlO1xuIH1jYXRjaChlKXtcbmlmKGU9PT1JU19SRU1PVEVfUFVNUEtJTil7XG5yZXR1cm4gZmFsc2U7XG4gfVxudGhyb3cgZTtcbiB9XG4gfTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIG5ldyBxdWVzdGlvbiBpbiB0aGUgcXVlc3Rpb25zIHRhYmxlIGFuZCBzZXQgdXAgYSBuZXdcbiAqIHJlbW90ZSBoYW5kbGVkIHByb21pc2UuXG4gKlxuICogQHJldHVybnMge1tDYXBUUFNsb3QsIFByb21pc2VdfVxuICovXG5jb25zdCBtYWtlUXVlc3Rpb249KCk9Pntcbmxhc3RQcm9taXNlSUQrPTE7XG5jb25zdCBzbG90SUQ9IGBxLSR7bGFzdFByb21pc2VJRH1gO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3R7cHJvbWlzZSxzZXR0bGVyfT1tYWtlUmVtb3RlS2l0KHNsb3RJRCk7XG5zZXR0bGVycy5zZXQoc2xvdElELHNldHRsZXIpO1xuXG4vKiBUbyBmaXggIzI4NDY6Ki9cbi8qIFdlIHJldHVybiAncCcgdG8gdGhlIGhhbmRsZXIsIGFuZCB0aGUgZXZlbnR1YWwgcmVzb2x1dGlvbiBvZiAncCcgd2lsbCovXG4vKiBiZSB1c2VkIHRvIHJlc29sdmUgdGhlIGNhbGxlcidzIFByb21pc2UsIGJ1dCB0aGUgY2FsbGVyIG5ldmVyIHNlZXMgJ3AnKi9cbi8qIGl0c2VsZi4gVGhlIGNhbGxlciBnb3QgYmFjayB0aGVpciBQcm9taXNlIGJlZm9yZSB0aGUgaGFuZGxlciBldmVyIGdvdCovXG4vKiBpbnZva2VkLCBhbmQgdGh1cyBiZWZvcmUgcXVldWVNZXNzYWdlIHdhcyBjYWxsZWQuIElmIHRoYXQgY2FsbGVyKi9cbi8qIHBhc3NlcyB0aGUgUHJvbWlzZSB0aGV5IHJlY2VpdmVkIGFzIGFyZ3VtZW50IG9yIHJldHVybiB2YWx1ZSwgd2Ugd2FudCovXG4vKiBpdCB0byBzZXJpYWxpemUgYXMgcmVzdWx0VlBJRC4gQW5kIGlmIHNvbWVvbmUgcGFzc2VzIHJlc3VsdFZQSUQgdG8qL1xuLyogdGhlbSwgd2Ugd2FudCB0aGUgdXNlci1sZXZlbCBjb2RlIHRvIGdldCBiYWNrIHRoYXQgUHJvbWlzZSwgbm90ICdwJy4qL1xudmFsVG9TbG90LnNldChwcm9taXNlLHNsb3RJRCk7XG5zbG90VG9JbXBvcnRlZC5zZXQoc2xvdElELHByb21pc2UpO1xuXG5yZXR1cm5bc2VuZFNsb3QuYWRkKHNsb3RJRCkscHJvbWlzZV07XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRcbiAqIEByZXR1cm5zIHtSZW1vdGVLaXQ8VD59XG4gKiBNYWtlIGEgcmVtb3RlIHByb21pc2UgZm9yIGB0YXJnZXRgIChhbiBpZCBpbiB0aGUgcXVlc3Rpb25zIHRhYmxlKVxuICovXG5jb25zdCBtYWtlUmVtb3RlS2l0PSh0YXJnZXQpPT57XG4vKipcbiAqIFRoaXMgaGFuZGxlciBpcyBzZXQgdXAgc3VjaCB0aGF0IGl0IHdpbGwgdHJhbnNmb3JtIGJvdGhcbiAqIGF0dHJpYnV0ZSBhY2Nlc3MgYW5kIG1ldGhvZCBpbnZvY2F0aW9uIG9mIHRoaXMgcmVtb3RlIHByb21pc2VcbiAqIGFzIGFsc28gYmVpbmcgcXVlc3Rpb25zIC8gcmVtb3RlIGhhbmRsZWQgcHJvbWlzZXNcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVIYW5kbGVyPHt9Pn1cbiAqL1xuY29uc3QgaGFuZGxlcj17XG5nZXQoX28scHJvcCl7XG5pZih1bnBsdWchPT1mYWxzZSl7XG5yZXR1cm4gcXVpZXRSZWplY3QodW5wbHVnKTtcbiB9XG5jb25zdFtxdWVzdGlvbklELHByb21pc2VdPW1ha2VRdWVzdGlvbigpO1xuc2VuZCh7XG50eXBlOidDVFBfQ0FMTCcsXG5lcG9jaCxcbnF1ZXN0aW9uSUQsXG50YXJnZXQsXG5tZXRob2Q6c2VyaWFsaXplKGhhcmRlbihbcHJvcF0pKX0pO1xuXG5yZXR1cm4gcHJvbWlzZTtcbiB9LFxuYXBwbHlGdW5jdGlvbihfbyxhcmdzKXtcbmlmKHVucGx1ZyE9PWZhbHNlKXtcbnJldHVybiBxdWlldFJlamVjdCh1bnBsdWcpO1xuIH1cbmNvbnN0W3F1ZXN0aW9uSUQscHJvbWlzZV09bWFrZVF1ZXN0aW9uKCk7XG5zZW5kKHtcbnR5cGU6J0NUUF9DQUxMJyxcbmVwb2NoLFxucXVlc3Rpb25JRCxcbnRhcmdldCxcbm1ldGhvZDpzZXJpYWxpemUoaGFyZGVuKFtudWxsLGFyZ3NdKSl9KTtcblxucmV0dXJuIHByb21pc2U7XG4gfSxcbmFwcGx5TWV0aG9kKF9vLHByb3AsYXJncyl7XG5pZih1bnBsdWchPT1mYWxzZSl7XG5yZXR1cm4gcXVpZXRSZWplY3QodW5wbHVnKTtcbiB9XG4vKiBTdXBwb3J0OiBvfi5bcHJvcF0oLi4uYXJncykgcmVtb3RlIG1ldGhvZCBpbnZvY2F0aW9uKi9cbmNvbnN0W3F1ZXN0aW9uSUQscHJvbWlzZV09bWFrZVF1ZXN0aW9uKCk7XG5zZW5kKHtcbnR5cGU6J0NUUF9DQUxMJyxcbmVwb2NoLFxucXVlc3Rpb25JRCxcbnRhcmdldCxcbm1ldGhvZDpzZXJpYWxpemUoaGFyZGVuKFtwcm9wLGFyZ3NdKSl9KTtcblxucmV0dXJuIHByb21pc2U7XG4gfX07XG5cblxuLyoqIEB0eXBlIHtTZXR0bGVyPFQ+IHwgdW5kZWZpbmVkfSAqL1xubGV0IHNldHRsZXI7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkhhbmRsZWRFeGVjdXRvcjxUPn0gKi9cbmNvbnN0IGV4ZWN1dG9yPShyZXNvbHZlLHJlamVjdCxyZXNvbHZlV2l0aFByZXNlbmNlKT0+e1xuY29uc3Qgcz1GYXIoJ3NldHRsZXInLHtcbnJlc29sdmUsXG5yZWplY3QsXG5yZXNvbHZlV2l0aFByZXNlbmNlOigpPT5yZXNvbHZlV2l0aFByZXNlbmNlKGhhbmRsZXIpfSk7XG5cbnNldHRsZXI9cztcbiB9O1xuXG5jb25zdCBwcm9taXNlPW5ldyBIYW5kbGVkUHJvbWlzZShleGVjdXRvcixoYW5kbGVyKTtcbmFzc2VydChzZXR0bGVyKTtcblxuLyogU2lsZW5jZSB0aGUgdW5oYW5kbGVkIHJlamVjdGlvbiB3YXJuaW5nLCBidXQgZG9uJ3QgYWZmZWN0Ki9cbi8qIHRoZSB1c2VyJ3MgaGFuZGxlcnMuKi9cbnByb21pc2UuY2F0Y2goKGUpPT5xdWlldFJlamVjdChlLGZhbHNlKSk7XG5cbnJldHVybiBoYXJkZW4oe3Byb21pc2Usc2V0dGxlcn0pO1xuIH07XG5cbi8qKlxuICogU2V0IHVwIGltcG9ydFxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29udmVydFNsb3RUb1ZhbDxDYXBUUFNsb3Q+fVxuICovXG5mdW5jdGlvbiBjb252ZXJ0U2xvdFRvVmFsKHRoZWlyU2xvdCxpZmFjZT11bmRlZmluZWQpe1xubGV0IHZhbDtcbmNvbnN0IHNsb3Q9cmV2ZXJzZVNsb3QodGhlaXJTbG90KTtcblxuaWYoc2xvdFsxXT09PScrJyl7XG5zbG90VG9FeHBvcnRlZC5oYXMoc2xvdCl8fEZhaWwgYFVua25vd24gZXhwb3J0ICR7c2xvdH1gO1xucmV0dXJuIHNsb3RUb0V4cG9ydGVkLmdldChzbG90KTtcbiB9XG5pZighc2xvdFRvSW1wb3J0ZWQuaGFzKHNsb3QpKXtcbi8qIE1ha2UgYSBuZXcgaGFuZGxlZCBwcm9taXNlIGZvciB0aGUgc2xvdC4qL1xuY29uc3R7cHJvbWlzZSxzZXR0bGVyfT1tYWtlUmVtb3RlS2l0KHNsb3QpO1xuaWYoc2xvdFswXT09PSdvJ3x8c2xvdFswXT09PSd0Jyl7XG5pZihpZmFjZT09PXVuZGVmaW5lZCl7XG5pZmFjZT0gYEFsbGVnZWQ6IFByZXNlbmNlICR7b3VySWR9ICR7c2xvdH1gO1xuIH1cbi8qIEEgbmV3IHJlbW90ZSBwcmVzZW5jZSovXG4vKiBVc2UgUmVtb3RhYmxlIHJhdGhlciB0aGFuIEZhciB0byBtYWtlIGEgcmVtb3RlIGZyb20gYSBwcmVzZW5jZSovXG52YWw9UmVtb3RhYmxlKGlmYWNlLHVuZGVmaW5lZCxzZXR0bGVyLnJlc29sdmVXaXRoUHJlc2VuY2UoKSk7XG5pZihpbXBvcnRIb29rKXtcbmltcG9ydEhvb2sodmFsLHNsb3QpO1xuIH1cbiB9ZWxzZXtcbnZhbD1wcm9taXNlO1xuaWYoaW1wb3J0SG9vayl7XG5pbXBvcnRIb29rKHZhbCxzbG90KTtcbiB9XG4vKiBBIG5ldyBwcm9taXNlKi9cbnNldHRsZXJzLnNldChzbG90LHNldHRsZXIpO1xuIH1cbnNsb3RUb0ltcG9ydGVkLnNldChzbG90LHZhbCk7XG52YWxUb1Nsb3Quc2V0KHZhbCxzbG90KTtcbiB9XG5cbi8qIElmIHdlIGltcG9ydGVkIHRoaXMgc2xvdCwgbWFyayBpdCBhcyBvbmUgb3VyIHBlZXIgZXhwb3J0ZWQuKi9cbnJldHVybiBzbG90VG9JbXBvcnRlZC5nZXQocmVjdlNsb3QuYWRkKHNsb3QpKTtcbiB9XG5cbi8qIE1lc3NhZ2UgaGFuZGxlciB1c2VkIGZvciBDYXBUUCBkaXNwYXRjaGVyKi9cbmNvbnN0IGhhbmRsZXI9e1xuLyogUmVtb3RlIGlzIGFza2luZyBmb3IgYm9vdHN0cmFwIG9iamVjdCovXG5DVFBfQk9PVFNUUkFQKG9iail7XG5jb25zdHtxdWVzdGlvbklEfT1vYmo7XG5jb25zdCBib290c3RyYXA9XG50eXBlb2YgYm9vdHN0cmFwT2JqPT09J2Z1bmN0aW9uJz9ib290c3RyYXBPYmoob2JqKTpib290c3RyYXBPYmo7XG5FLndoZW4oYm9vdHN0cmFwLChicyk9Pntcbi8qIGNvbnNvbGUubG9nKCdzZW5kaW5nIGJvb3RzdHJhcCcsIGJzKTsqL1xuYW5zd2Vycy5zZXQocXVlc3Rpb25JRCxicyk7XG5zZW5kKHtcbnR5cGU6J0NUUF9SRVRVUk4nLFxuZXBvY2gsXG5hbnN3ZXJJRDpxdWVzdGlvbklELFxucmVzdWx0OnNlcmlhbGl6ZShicyl9KTtcblxuIH0pO1xuIH0sXG5DVFBfRFJPUChvYmope1xuY29uc3R7c2xvdElELGRlY1JlZnM9MH09b2JqO1xuLyogRW5zdXJlIHdlIGFyZSBkZWNyZW1lbnRpbmcgb25lIG9mIG91ciBleHBvcnRzLiovXG5zbG90SURbMV09PT0nLSd8fEZhaWwgYENhbm5vdCBkcm9wIG5vbi1leHBvcnRlZCAke3Nsb3RJRH1gO1xuY29uc3Qgc2xvdD1yZXZlcnNlU2xvdChzbG90SUQpO1xuXG5jb25zdCBudW1SZWZzPXNsb3RUb051bVJlZnMuZ2V0KHNsb3QpfHwwO1xuY29uc3QgdG9EZWNyPU51bWJlcihkZWNSZWZzKTtcbmlmKG51bVJlZnM+dG9EZWNyKXtcbnNsb3RUb051bVJlZnMuc2V0KHNsb3QsbnVtUmVmcy10b0RlY3IpO1xuIH1lbHNle1xuLyogV2UgYXJlIGRyb3BwaW5nIHRoZSBsYXN0IGtub3duIHJlZmVyZW5jZSB0byB0aGlzIHNsb3QuKi9cbmdjU3RhdHMuRFJPUFBFRCs9MTtcbnNsb3RUb051bVJlZnMuZGVsZXRlKHNsb3QpO1xuc2xvdFRvRXhwb3J0ZWQuZGVsZXRlKHNsb3QpO1xuYW5zd2Vycy5kZWxldGUoc2xvdCk7XG4gfVxuIH0sXG4vKiBSZW1vdGUgaXMgaW52b2tpbmcgYSBtZXRob2Qgb3IgcmV0cmlldmluZyBhIHByb3BlcnR5LiovXG5DVFBfQ0FMTChvYmope1xuLyogcXVlc3Rpb25JZDogUmVtb3RlIHByb21pc2UgKGZvciBwcm9taXNlIHBpcGVsaW5pbmcpIHRoaXMgY2FsbCBpcyovXG4vKiB0byBmdWxmaWxsKi9cbi8qIHRhcmdldDogU2xvdCBpZCBvZiB0aGUgdGFyZ2V0IHRvIGJlIGludm9rZWQuICBDaGVja3MgYWdhaW5zdCovXG4vKiBhbnN3ZXJzIGZpcnN0OyBvdGhlcndpc2UgZ29lcyB0aHJvdWdoIHVuc2VyaWFsaXplciovXG5jb25zdHtxdWVzdGlvbklELHRhcmdldCx0cmFwfT1vYmo7XG5cbmNvbnN0W3Byb3AsYXJnc109dW5zZXJpYWxpemUob2JqLm1ldGhvZCk7XG5sZXQgdmFsO1xuaWYoYW5zd2Vycy5oYXModGFyZ2V0KSl7XG52YWw9YW5zd2Vycy5nZXQodGFyZ2V0KTtcbiB9ZWxzZXtcbnZhbD11bnNlcmlhbGl6ZSh7XG5ib2R5OkpTT04uc3RyaW5naWZ5KHtcbltRQ0xBU1NdOidzbG90JyxcbmluZGV4OjB9KSxcblxuc2xvdHM6W3RhcmdldF19KTtcblxuIH1cblxuLyoqIEB0eXBlIHsoaXNSZWplY3Q6IGJvb2xlYW4sIHZhbHVlOiBhbnkpID0+IHZvaWR9ICovXG5sZXQgcHJvY2Vzc1Jlc3VsdD0oaXNSZWplY3QsdmFsdWUpPT57XG4vKiBTZXJpYWxpemUgdGhlIHJlc3VsdC4qL1xubGV0IHNlcmlhbDtcbnRyeXtcbnNlcmlhbD1zZXJpYWxpemUoaGFyZGVuKHZhbHVlKSk7XG4gfWNhdGNoKGVycm9yKXtcbi8qIFByb21vdGUgc2VyaWFsaXphdGlvbiBlcnJvcnMgdG8gcmVqZWN0aW9ucy4qL1xuaXNSZWplY3Q9dHJ1ZTtcbnNlcmlhbD1zZXJpYWxpemUoaGFyZGVuKGVycm9yKSk7XG4gfVxuXG5zZW5kKHtcbnR5cGU6J0NUUF9SRVRVUk4nLFxuZXBvY2gsXG5hbnN3ZXJJRDpxdWVzdGlvbklELFxuW2lzUmVqZWN0PydleGNlcHRpb24nOidyZXN1bHQnXTpzZXJpYWx9KTtcblxuIH07XG5pZih0cmFwKXtcbmV4cG9ydGVkVHJhcEhhbmRsZXJzLmhhcyh2YWwpfHxcbkZhaWwgYFJlZnVzZWQgVHJhcCgke3ZhbH0pIGJlY2F1c2UgdGFyZ2V0IHdhcyBub3QgcmVnaXN0ZXJlZCB3aXRoIG1ha2VUcmFwSGFuZGxlcmA7XG5hc3NlcnQudHlwZW9mKFxudHJhcEhvc3QsXG4nZnVuY3Rpb24nLFxuWCBgQ2FwVFAgY2Fubm90IGFuc3dlciBUcmFwKCR7dmFsfSkgd2l0aG91dCBhIHRyYXBIb3N0IGZ1bmN0aW9uYCk7XG5cblxuLyogV2UgbmVlZCB0byBjcmVhdGUgYSBwcm9taXNlIGZvciB0aGUgXCJpc0RvbmVcIiBpdGVyYXRpb24gcmlnaHQgbm93IHRvKi9cbi8qIHByZXZlbnQgYSByYWNlIHdpdGggdGhlIG90aGVyIHNpZGUuKi9cbmNvbnN0IHJlc3VsdFBLPW1ha2VQcm9taXNlS2l0KCk7XG50cmFwSXRlcmF0b3JSZXN1bHRQLnNldChxdWVzdGlvbklELHJlc3VsdFBLLnByb21pc2UpO1xuXG5wcm9jZXNzUmVzdWx0PShpc1JlamVjdCx2YWx1ZSk9PntcbmNvbnN0IHNlcmlhbGl6ZWQ9c2VyaWFsaXplKGhhcmRlbih2YWx1ZSkpO1xuY29uc3QgYWl0PXRyYXBIb3N0KFtpc1JlamVjdCxzZXJpYWxpemVkXSk7XG5pZighYWl0KXtcbi8qIE9uZS1zaG90LCBubyBhc3luYyBpdGVyYXRvci4qL1xucmVzdWx0UEsucmVzb2x2ZSh7ZG9uZTp0cnVlfSk7XG5yZXR1cm47XG4gfVxuXG4vKiBXZSdyZSByZWFkeSBmb3IgdGhlbSB0byBkcml2ZSB0aGUgaXRlcmF0b3IuKi9cbnRyYXBJdGVyYXRvci5zZXQocXVlc3Rpb25JRCxhaXQpO1xucmVzdWx0UEsucmVzb2x2ZSh7ZG9uZTpmYWxzZX0pO1xuIH07XG4gfVxuXG4vKiBJZiBgYXJnc2AgaXMgc3VwcGxpZWQsIHdlJ3JlIGFwcGx5aW5nIGEgbWV0aG9kIG9yIGZ1bmN0aW9uLi4uKi9cbi8qIG90aGVyd2lzZSB0aGlzIGlzIHByb3BlcnR5IGFjY2VzcyovXG5sZXQgaHA7XG5pZighYXJncyl7XG5ocD1IYW5kbGVkUHJvbWlzZS5nZXQodmFsLHByb3ApO1xuIH1lbHNlIGlmKHByb3A9PT1udWxsKXtcbmhwPUhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24odmFsLGFyZ3MpO1xuIH1lbHNle1xuaHA9SGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QodmFsLHByb3AsYXJncyk7XG4gfVxuXG4vKiBBbnN3ZXIgd2l0aCBvdXIgaGFuZGxlZCBwcm9taXNlKi9cbmFuc3dlcnMuc2V0KHF1ZXN0aW9uSUQsaHApO1xuXG5ocFxuLyogUHJvY2VzcyB0aGlzIGhhbmRsZWQgcHJvbWlzZSBtZXRob2QncyByZXN1bHQgd2hlbiBzZXR0bGVkLiovLlxudGhlbihcbihmdWxmaWxtZW50KT0+cHJvY2Vzc1Jlc3VsdChmYWxzZSxmdWxmaWxtZW50KSxcbihyZWFzb24pPT5wcm9jZXNzUmVzdWx0KHRydWUscmVhc29uKSlcblxuLyogUHJvcGFnYXRlIGludGVybmFsIGVycm9ycyBhcyByZWplY3Rpb25zLiovLlxuY2F0Y2goKHJlYXNvbik9PnByb2Nlc3NSZXN1bHQodHJ1ZSxyZWFzb24pKTtcbiB9LFxuLyogSGF2ZSB0aGUgaG9zdCBzZXJ2ZSBtb3JlIG9mIHRoZSByZXBseS4qL1xuQ1RQX1RSQVBfSVRFUkFURToob2JqKT0+e1xudHJhcEhvc3R8fEZhaWwgYENUUF9UUkFQX0lURVJBVEUgaXMgaW1wb3NzaWJsZSB3aXRob3V0IGEgdHJhcEhvc3RgO1xuY29uc3R7cXVlc3Rpb25JRCxzZXJpYWxpemVkfT1vYmo7XG5cbmNvbnN0IHJlc3VsdFA9dHJhcEl0ZXJhdG9yUmVzdWx0UC5nZXQocXVlc3Rpb25JRCk7XG5yZXN1bHRQfHxGYWlsIGBDVFBfVFJBUF9JVEVSQVRFIGRpZCBub3QgZXhwZWN0ICR7cXVlc3Rpb25JRH1gO1xuXG5jb25zdFttZXRob2QsYXJnc109dW5zZXJpYWxpemUoc2VyaWFsaXplZCk7XG5cbmNvbnN0IGdldE5leHRSZXN1bHRQPWFzeW5jKCk9PntcbmNvbnN0IHJlc3VsdD1hd2FpdCByZXN1bHRQO1xuXG4vKiBEb25lIHdpdGggdGhpcyB0cmFwIGl0ZXJhdG9yLiovXG5jb25zdCBjbGVhbnVwPSgpPT57XG50cmFwSXRlcmF0b3IuZGVsZXRlKHF1ZXN0aW9uSUQpO1xudHJhcEl0ZXJhdG9yUmVzdWx0UC5kZWxldGUocXVlc3Rpb25JRCk7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWV9KTtcbiB9O1xuXG4vKiBXZSB3YW50IHRvIGVuc3VyZSB3ZSBjbGVhbiB1cCB0aGUgaXRlcmF0b3IgaW4gY2FzZSBvZiBhbnkgZmFpbHVyZS4qL1xudHJ5e1xuaWYoIXJlc3VsdHx8cmVzdWx0LmRvbmUpe1xucmV0dXJuIGNsZWFudXAoKTtcbiB9XG5cbmNvbnN0IGFpdD10cmFwSXRlcmF0b3IuZ2V0KHF1ZXN0aW9uSUQpO1xuaWYoIWFpdCl7XG4vKiBUaGUgaXRlcmF0b3IgaXMgZG9uZSwgc28gd2UncmUgZG9uZS4qL1xucmV0dXJuIGNsZWFudXAoKTtcbiB9XG5cbi8qIERyaXZlIHRoZSBuZXh0IGl0ZXJhdGlvbi4qL1xucmV0dXJuIGF3YWl0IGFpdFttZXRob2RdKC4uLmFyZ3MpO1xuIH1jYXRjaChlKXtcbmNsZWFudXAoKTtcbmlmKCFlKXtcbkZhaWwgYHRyYXBHdWVzdCBleHBlY3RlZCB0cmFwSG9zdCBBc3luY0l0ZXJhdG9yKCR7cXVlc3Rpb25JRH0pIHRvIGJlIGRvbmUsIGJ1dCBpdCB3YXNuJ3RgO1xuIH1cbmFzc2VydC5ub3RlKGUsWCBgdHJhcEhvc3QgQXN5bmNJdGVyYXRvcigke3F1ZXN0aW9uSUR9KSB0aHJld2ApO1xudGhyb3cgZTtcbiB9XG4gfTtcblxuLyogU3RvcmUgdGhlIG5leHQgcmVzdWx0IHByb21pc2UuKi9cbmNvbnN0IG5leHRSZXN1bHRQPWdldE5leHRSZXN1bHRQKCk7XG50cmFwSXRlcmF0b3JSZXN1bHRQLnNldChxdWVzdGlvbklELG5leHRSZXN1bHRQKTtcblxuLyogRW5zdXJlIHRoYXQgb3VyIGNhbGxlciBoYW5kbGVzIGFueSByZWplY3Rpb24uKi9cbnJldHVybiBuZXh0UmVzdWx0UC50aGVuKCgpPT57IH0pO1xuIH0sXG4vKiBBbnN3ZXIgdG8gb25lIG9mIG91ciBxdWVzdGlvbnMuKi9cbkNUUF9SRVRVUk4ob2JqKXtcbmNvbnN0e3Jlc3VsdCxleGNlcHRpb24sYW5zd2VySUR9PW9iajtcbmNvbnN0IHNldHRsZXI9c2V0dGxlcnMuZ2V0KGFuc3dlcklEKTtcbmlmKCFzZXR0bGVyKXtcbnRocm93IEVycm9yKFxuIGBHb3QgYW4gYW5zd2VyIHRvIGEgcXVlc3Rpb24gd2UgaGF2ZSBub3QgYXNrZWQuIChhbnN3ZXJJRCA9ICR7YW5zd2VySUR9IClgKTtcblxuIH1cbnNldHRsZXJzLmRlbGV0ZShhbnN3ZXJJRCk7XG5pZignZXhjZXB0aW9uJ2luIG9iail7XG5zZXR0bGVyLnJlamVjdCh1bnNlcmlhbGl6ZShleGNlcHRpb24pKTtcbiB9ZWxzZXtcbnNldHRsZXIucmVzb2x2ZSh1bnNlcmlhbGl6ZShyZXN1bHQpKTtcbiB9XG4gfSxcbi8qIFJlc29sdXRpb24gdG8gYW4gaW1wb3J0ZWQgcHJvbWlzZSovXG5DVFBfUkVTT0xWRShvYmope1xuY29uc3R7cHJvbWlzZUlELHJlcyxyZWp9PW9iajtcbmNvbnN0IHNldHRsZXI9c2V0dGxlcnMuZ2V0KHByb21pc2VJRCk7XG5pZighc2V0dGxlcil7XG4vKiBOb3QgYSBwcm9taXNlIHdlIGtub3cgYWJvdXQ7IG1heWJlIGl0IHdhcyBjb2xsZWN0ZWQ/Ki9cbnRocm93IEVycm9yKFxuIGBHb3QgYSByZXNvbHZlbWVudCBvZiBhIHByb21pc2Ugd2UgaGF2ZSBub3QgaW1wb3J0ZWQuIChwcm9taXNlSUQgPSAke3Byb21pc2VJRH0gKWApO1xuXG4gfVxuc2V0dGxlcnMuZGVsZXRlKHByb21pc2VJRCk7XG5pZigncmVqJ2luIG9iail7XG5zZXR0bGVyLnJlamVjdCh1bnNlcmlhbGl6ZShyZWopKTtcbiB9ZWxzZXtcbnNldHRsZXIucmVzb2x2ZSh1bnNlcmlhbGl6ZShyZXMpKTtcbiB9XG4gfSxcbi8qIFRoZSBvdGhlciBzaWRlIGhhcyBzaWduYWxlZCBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcuKi9cbi8qIFB1bGwgdGhlIHBsdWchKi9cbkNUUF9ESVNDT05ORUNUKG9iail7XG5jb25zdHtyZWFzb249ZGlzY29ubmVjdFJlYXNvbihvdXJJZCl9PW9iajtcbmlmKHVucGx1Zz09PWZhbHNlKXtcbi8qIFJlamVjdCB3aXRoIHRoZSBvcmlnaW5hbCByZWFzb24uKi9cbnF1aWV0UmVqZWN0KG9iai5yZWFzb24sZmFsc2UpO1xudW5wbHVnPXJlYXNvbjtcbi8qIERlbGl2ZXIgdGhlIG9iamVjdCwgZXZlbiB0aG91Z2ggd2UncmUgdW5wbHVnZ2VkLiovXG5yYXdTZW5kKG9iaik7XG4gfVxuLyogV2Ugbm8gbG9uZ2VyIHdpc2ggdG8gc3Vic2NyaWJlIHRvIG9iamVjdCBmaW5hbGl6YXRpb24uKi9cbnNsb3RUb0ltcG9ydGVkLmNsZWFyV2l0aG91dEZpbmFsaXppbmcoKTtcbmZvcihjb25zdCBzZXR0bGVyIG9mIHNldHRsZXJzLnZhbHVlcygpKXtcbnNldHRsZXIucmVqZWN0KHJlYXNvbik7XG4gfVxuIH19O1xuXG5cbi8qIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgb3RoZXIgc2lkZSdzIGJvb3RzdHJhcCBvYmplY3QuKi9cbmNvbnN0IGdldEJvb3RzdHJhcD1hc3luYygpPT57XG5pZih1bnBsdWchPT1mYWxzZSl7XG5yZXR1cm4gcXVpZXRSZWplY3QodW5wbHVnKTtcbiB9XG5jb25zdFtxdWVzdGlvbklELHByb21pc2VdPW1ha2VRdWVzdGlvbigpO1xuc2VuZCh7XG50eXBlOidDVFBfQk9PVFNUUkFQJyxcbmVwb2NoLFxucXVlc3Rpb25JRH0pO1xuXG5yZXR1cm4gaGFyZGVuKHByb21pc2UpO1xuIH07XG5oYXJkZW4oaGFuZGxlcik7XG5cbmNvbnN0IHZhbGlkVHlwZXM9bmV3IFNldChPYmplY3Qua2V5cyhoYW5kbGVyKSk7XG5mb3IoY29uc3QgdCBvZiB2YWxpZFR5cGVzLmtleXMoKSl7XG5zZW5kU3RhdHNbdF09MDtcbnJlY3ZTdGF0c1t0XT0wO1xuIH1cblxuLyogUmV0dXJuIGEgZGlzcGF0Y2ggZnVuY3Rpb24uKi9cbmNvbnN0IGRpc3BhdGNoPShvYmopPT57XG50cnl7XG52YWxpZFR5cGVzLmhhcyhvYmoudHlwZSl8fEZhaWwgYHVua25vd24gbWVzc2FnZSB0eXBlICR7b2JqLnR5cGV9YDtcblxucmVjdlN0YXRzW29iai50eXBlXSs9MTtcbmlmKHVucGx1ZyE9PWZhbHNlKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBmbj1oYW5kbGVyW29iai50eXBlXTtcbmlmKCFmbil7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5mb3IoY29uc3QgcHJvcCBvZiBXRUxMX0tOT1dOX1NMT1RfUFJPUEVSVElFUyl7XG5yZWN2U2xvdC5hZGQob2JqW3Byb3BdKTtcbiB9XG5mbihvYmopO1xucmVjdlNsb3QuY29tbWl0KCk7XG5cbnJldHVybiB0cnVlO1xuIH1jYXRjaChlKXtcbnJlY3ZTbG90LmFib3J0KCk7XG5xdWlldFJlamVjdChlLGZhbHNlKTtcblxucmV0dXJuIGZhbHNlO1xuIH1cbiB9O1xuXG4vKiBBYm9ydCBhIGNvbm5lY3Rpb24uKi9cbmNvbnN0IGFib3J0PShyZWFzb249dW5kZWZpbmVkKT0+e1xuZGlzcGF0Y2goe3R5cGU6J0NUUF9ESVNDT05ORUNUJyxlcG9jaCxyZWFzb259KTtcbiB9O1xuXG5jb25zdCBtYWtlVHJhcEhhbmRsZXI9KG5hbWUsb2JqKT0+e1xuY29uc3QgZmFyPUZhcihuYW1lLG9iaik7XG5leHBvcnRlZFRyYXBIYW5kbGVycy5hZGQoZmFyKTtcbnJldHVybiBmYXI7XG4gfTtcblxuLyogUHV0IHRvZ2V0aGVyIG91ciByZXR1cm4gdmFsdWUuKi9cbmNvbnN0IHJldHM9e1xuYWJvcnQsXG5kaXNwYXRjaCxcbmdldEJvb3RzdHJhcCxcbmdldFN0YXRzLFxuaXNPbmx5TG9jYWwsXG5zZXJpYWxpemUsXG51bnNlcmlhbGl6ZSxcbm1ha2VUcmFwSGFuZGxlcixcblRyYXA6LyoqIEB0eXBlIHtUcmFwIHwgdW5kZWZpbmVkfSAqL3VuZGVmaW5lZH07XG5cblxuaWYodHJhcEd1ZXN0KXtcbmFzc2VydC50eXBlb2YodHJhcEd1ZXN0LCdmdW5jdGlvbicsWCBgb3B0cy50cmFwR3Vlc3QgbXVzdCBiZSBhIGZ1bmN0aW9uYCk7XG5cbi8qIENyZWF0ZSB0aGUgVHJhcCBwcm94eSBtYWtlci4qL1xuY29uc3QgbWFrZVRyYXBJbXBsPVxuKGltcGxNZXRob2QpPT5cbih2YWwsLi4uaW1wbEFyZ3MpPT57XG5Qcm9taXNlLnJlc29sdmUodmFsKSE9PXZhbHx8XG5GYWlsIGBUcmFwKCR7dmFsfSkgdGFyZ2V0IGNhbm5vdCBiZSBhIHByb21pc2VgO1xuXG5jb25zdCBzbG90PXZhbFRvU2xvdC5nZXQodmFsKTtcbi8qIFR5cGVTY3JpcHQgY29uZnVzZWQgYWJvdXQgYHx8YCBjb250cm9sIGZsb3cgc28gdXNlIGBpZmAgaW5zdGVhZCovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwNzM5Ki9cbmlmKCEoc2xvdCYmc2xvdFsxXT09PSctJykpe1xuRmFpbCBgVHJhcCgke3ZhbH0pIHRhcmdldCB3YXMgbm90IGltcG9ydGVkYDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIFR5cGVTY3JpcHQgY29uZnVzZWQgYnkgYEZhaWxgIHRvbz8qL1xuc2xvdFswXT09PSd0J3x8XG5GYWlsIGBUcmFwKCR7dmFsfSkgaW1wb3J0ZWQgdGFyZ2V0IHdhcyBub3QgY3JlYXRlZCB3aXRoIG1ha2VUcmFwSGFuZGxlcmA7XG5cbi8qIFNlbmQgYSBcInRyYXBcIiBtZXNzYWdlLiovXG5sYXN0UHJvbWlzZUlEKz0xO1xuY29uc3QgcXVlc3Rpb25JRD0gYHEtJHtsYXN0UHJvbWlzZUlEfWA7XG5cbi8qIEVuY29kZSB0aGUgXCJtZXRob2RcIiBwYXJhbWV0ZXIgb2YgdGhlIENUUF9DQUxMLiovXG5sZXQgbWV0aG9kO1xuc3dpdGNoKGltcGxNZXRob2Qpe1xuY2FzZSdnZXQnOntcbmNvbnN0W3Byb3BdPWltcGxBcmdzO1xubWV0aG9kPXNlcmlhbGl6ZShoYXJkZW4oW3Byb3BdKSk7XG5icmVhaztcbiB9XG5jYXNlJ2FwcGx5RnVuY3Rpb24nOntcbmNvbnN0W2FyZ3NdPWltcGxBcmdzO1xubWV0aG9kPXNlcmlhbGl6ZShoYXJkZW4oW251bGwsYXJnc10pKTtcbmJyZWFrO1xuIH1cbmNhc2UnYXBwbHlNZXRob2QnOntcbmNvbnN0W3Byb3AsYXJnc109aW1wbEFyZ3M7XG5tZXRob2Q9c2VyaWFsaXplKGhhcmRlbihbcHJvcCxhcmdzXSkpO1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5GYWlsIGBJbnRlcm5hbCBlcnJvcjsgdW5yZWNvZ25pemVkIGltcGxNZXRob2QgJHtpbXBsTWV0aG9kfWA7XG4gfX1cblxuXG4vKiBTZXQgdXAgdGhlIHRyYXAgY2FsbCB3aXRoIGl0cyBpZGVudGlmeWluZyBpbmZvcm1hdGlvbiBhbmQgYSB3YXkgdG8gc2VuZCovXG4vKiBtZXNzYWdlcyBvdmVyIHRoZSBjdXJyZW50IENhcFRQIGRhdGEgY2hhbm5lbC4qL1xuY29uc3RbaXNFeGNlcHRpb24sc2VyaWFsaXplZF09dHJhcEd1ZXN0KHtcbnRyYXBNZXRob2Q6aW1wbE1ldGhvZCxcbi8qIEB0cy1leHBlY3QtZXJyb3IgVHlwZVNjcmlwdCBjb25mdXNlZCBieSBgRmFpbGAgdG9vPyovXG5zbG90LFxudHJhcEFyZ3M6aW1wbEFyZ3MsXG5zdGFydFRyYXA6KCk9Pntcbi8qIFNlbmQgdGhlIGNhbGwgbWV0YWRhdGEgb3ZlciB0aGUgY29ubmVjdGlvbi4qL1xuc2VuZCh7XG50eXBlOidDVFBfQ0FMTCcsXG5lcG9jaCxcbnRyYXA6dHJ1ZSwvKiBUaGlzIGlzIHRoZSBtYWdpYyBtYXJrZXIuKi9cbnF1ZXN0aW9uSUQsXG50YXJnZXQ6c2xvdCxcbm1ldGhvZH0pO1xuXG5cbi8qIFJldHVybiBhbiBJdGVyYXRpb25PYnNlcnZlci4qL1xuY29uc3QgbWFrZUl0ZXJhdG9yTWV0aG9kPVxuKGl0ZXJhdG9yTWV0aG9kLGRvbmUpPT5cbiguLi5hcmdzKT0+e1xuc2VuZCh7XG50eXBlOidDVFBfVFJBUF9JVEVSQVRFJyxcbmVwb2NoLFxucXVlc3Rpb25JRCxcbnNlcmlhbGl6ZWQ6c2VyaWFsaXplKGhhcmRlbihbaXRlcmF0b3JNZXRob2QsYXJnc10pKX0pO1xuXG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH07XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6bWFrZUl0ZXJhdG9yTWV0aG9kKCduZXh0JyxmYWxzZSksXG5yZXR1cm46bWFrZUl0ZXJhdG9yTWV0aG9kKCdyZXR1cm4nLHRydWUpLFxudGhyb3c6bWFrZUl0ZXJhdG9yTWV0aG9kKCd0aHJvdycsdHJ1ZSl9KTtcblxuIH19KTtcblxuXG5jb25zdCB2YWx1ZT11bnNlcmlhbGl6ZShzZXJpYWxpemVkKTtcbiFpc1RoZW5hYmxlKHZhbHVlKXx8XG5GYWlsIGBUcmFwKCR7dmFsfSkgcmVwbHkgY2Fubm90IGJlIGEgVGhlbmFibGU7IGhhdmUgJHt2YWx1ZX1gO1xuXG5pZihpc0V4Y2VwdGlvbil7XG50aHJvdyB2YWx1ZTtcbiB9XG5yZXR1cm4gdmFsdWU7XG4gfTtcblxuLyoqIEB0eXBlIHtUcmFwSW1wbH0gKi9cbmNvbnN0IHRyYXBJbXBsPXtcbmFwcGx5RnVuY3Rpb246bWFrZVRyYXBJbXBsKCdhcHBseUZ1bmN0aW9uJyksXG5hcHBseU1ldGhvZDptYWtlVHJhcEltcGwoJ2FwcGx5TWV0aG9kJyksXG5nZXQ6bWFrZVRyYXBJbXBsKCdnZXQnKX07XG5cbmhhcmRlbih0cmFwSW1wbCk7XG5cbnJldHMuVHJhcD1tYWtlVHJhcCh0cmFwSW1wbCk7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKHJldHMpO1xuIH07JGjigI1fb25jZS5tYWtlQ2FwVFAobWFrZUNhcFRQKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJFIjpbIkUiLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQ2FwVFAiOlsibWFrZUNhcFRQIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABvtuKmlFQAApRUAACIAAABAZW5kby9jYXB0cC12My4xLjIvc3JjL2ZpbmFsaXplLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlRmluYWxpemluZ01hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsaXNPYmplY3Q7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbi8qIEB0cy1jaGVjayovXG5jb25zdHtXZWFrUmVmLEZpbmFsaXphdGlvblJlZ2lzdHJ5fT1nbG9iYWxUaGlzO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUge29iamVjdH0gVlxuICogQHR5cGVkZWYge1BpY2s8TWFwPEssIFY+LCAnZ2V0JyB8ICdoYXMnIHwgJ2RlbGV0ZSc+ICZcbiAqICB7XG4gKiAgIHNldDogKGtleTogSywgdmFsdWU6IFYpID0+IHZvaWQsXG4gKiAgIGNsZWFyV2l0aG91dEZpbmFsaXppbmc6ICgpID0+IHZvaWQsXG4gKiAgIGdldFNpemU6ICgpID0+IG51bWJlcixcbiAqIH19IEZpbmFsaXppbmdNYXBcbiAqL1xuXG4vKipcbiAqXG4gKiBFbHNld2hlcmUgdGhpcyBpcyBrbm93biBhcyBhIFwiV2VhayBWYWx1ZSBNYXBcIi4gV2hlcmVhcyBhIHN0ZCBKUyBXZWFrTWFwXG4gKiBpcyB3ZWFrIG9uIGl0cyBrZXlzLCB0aGlzIG1hcCBpcyB3ZWFrIG9uIGl0cyB2YWx1ZXMuIEl0IGRvZXMgbm90IHJldGFpbiB0aGVzZVxuICogdmFsdWVzIHN0cm9uZ2x5LiBJZiBhIGdpdmVuIHZhbHVlIGRpc2FwcGVhcnMsIHRoZW4gdGhlIGVudHJpZXMgZm9yIGl0XG4gKiBkaXNhcHBlYXIgZnJvbSBldmVyeSB3ZWFrLXZhbHVlLW1hcCB0aGF0IGhvbGRzIGl0IGFzIGEgdmFsdWUuXG4gKlxuICogSnVzdCBhcyBhIFdlYWtNYXAgb25seSBhbGxvd3MgZ2MtYWJsZSB2YWx1ZXMgYXMga2V5cywgYSB3ZWFrLXZhbHVlLW1hcFxuICogb25seSBhbGxvd3MgZ2MtYWJsZSB2YWx1ZXMgYXMgdmFsdWVzLlxuICpcbiAqIFVubGlrZSBhIFdlYWtNYXAsIGEgd2Vhay12YWx1ZS1tYXAgdW5hdm9pZGFibHkgZXhwb3NlcyB0aGUgbm9uLWRldGVybWluaXNtIG9mXG4gKiBnYyB0byBpdHMgY2xpZW50cy4gVGh1cywgYm90aCB0aGUgYWJpbGl0eSB0byBjcmVhdGUgb25lLCBhcyB3ZWxsIGFzIGVhY2hcbiAqIGNyZWF0ZWQgb25lLCBtdXN0IGJlIHRyZWF0ZWQgYXMgZGFuZ2Vyb3VzIGNhcGFiaWxpdGllcyB0aGF0IG11c3QgYmUgY2xvc2VseVxuICogaGVsZC4gQSBwcm9ncmFtIHdpdGggYWNjZXNzIHRvIHRoZXNlIGNhbiByZWFkIHNpZGUgY2hhbm5lbHMgdGhvdWdoIGdjIHRoYXQgZG9cbiAqIG5vdCogcmVseSBvbiB0aGUgYWJpbGl0eSB0byBtZWFzdXJlIGR1cmF0aW9uLiBUaGlzIGlzIGEgc2VwYXJhdGUsIGFuZCBiYWQsXG4gKiB0aW1pbmctaW5kZXBlbmRlbnQgc2lkZSBjaGFubmVsLlxuICpcbiAqIFRoaXMgbm9uLWRldGVybWluaXNtIGFsc28gZW5hYmxlcyBjb2RlIHRvIGVzY2FwZSBkZXRlcm1pbmlzdGljIHJlcGxheS4gSW4gYVxuICogYmxvY2tjaGFpbiBjb250ZXh0LCB0aGlzIGNvdWxkIGNhdXNlIHZhbGlkYXRvcnMgdG8gZGlmZmVyIGZyb20gZWFjaCBvdGhlcixcbiAqIHByZXZlbnRpbmcgY29uc2Vuc3VzLCBhbmQgdGh1cyBwcmV2ZW50aW5nIGNoYWluIHByb2dyZXNzLlxuICpcbiAqIEpTIHN0YW5kYXJkcyB3ZWFrcmVmcyBoYXZlIGJlZW4gY2FyZWZ1bGx5IGRlc2lnbmVkIHNvIHRoYXQgb3BlcmF0aW9ucyB3aGljaFxuICogYGRlcmVmKClgIGEgd2Vha3JlZiBjYXVzZSB0aGF0IHdlYWtyZWYgdG8gcmVtYWluIHN0YWJsZSBmb3IgdGhlIHJlbWFpbmRlciBvZlxuICogdGhhdCB0dXJuLiBUaGUgb3BlcmF0aW9ucyBiZWxvdyBndWFyYW50ZWVkIHRvIGRvIHRoaXMgZGVyZWZpbmcgYXJlIGBoYXNgLFxuICogYGdldGAsIGBzZXRgLCBgZGVsZXRlYC4gTm90ZSB0aGF0IG5laXRoZXIgYGNsZWFyV2l0aG91dEZpbmFsaXppbmdgIG5vclxuICogYGdldFNpemVgIGFyZSBndWFyYW50ZWVkIHRvIGRlcmVmLiBUaHVzLCBhIGNhbGwgdG8gYG1hcC5nZXRTaXplKClgIG1heVxuICogcmVmbGVjdCB2YWx1ZXMgdGhhdCBtaWdodCBzdGlsbCBiZSBjb2xsZWN0ZWQgbGF0ZXIgaW4gdGhlIHNhbWUgdHVybi5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIHtvYmplY3R9IFZcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gdm9pZH0gW2ZpbmFsaXplcl1cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0c11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMud2Vha1ZhbHVlc11cbiAqIEByZXR1cm5zIHtGaW5hbGl6aW5nTWFwPEssIFY+ICZcbiAqICBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIEZpbmFsaXppbmdNYXA8SywgVj4+XG4gKiB9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRmluYWxpemluZ01hcD0oZmluYWxpemVyLG9wdHMpPT57XG5jb25zdHt3ZWFrVmFsdWVzPWZhbHNlfT1vcHRzfHx7fTtcbmlmKCF3ZWFrVmFsdWVzfHwhV2Vha1JlZnx8IUZpbmFsaXphdGlvblJlZ2lzdHJ5KXtcbi8qKiBAdHlwZSBNYXA8SywgVj4gKi9cbmNvbnN0IGtleVRvVmFsPW5ldyBNYXAoKTtcbnJldHVybiBGYXIoJ2Zha2VGaW5hbGl6aW5nTWFwJyx7XG5jbGVhcldpdGhvdXRGaW5hbGl6aW5nOmtleVRvVmFsLmNsZWFyLmJpbmQoa2V5VG9WYWwpLFxuZ2V0OmtleVRvVmFsLmdldC5iaW5kKGtleVRvVmFsKSxcbmhhczprZXlUb1ZhbC5oYXMuYmluZChrZXlUb1ZhbCksXG5zZXQ6KGtleSx2YWwpPT57XG5rZXlUb1ZhbC5zZXQoa2V5LHZhbCk7XG4gfSxcbmRlbGV0ZTprZXlUb1ZhbC5kZWxldGUuYmluZChrZXlUb1ZhbCksXG5nZXRTaXplOigpPT5rZXlUb1ZhbC5zaXplfSk7XG5cbiB9XG4vKiogQHR5cGUgTWFwPEssIFdlYWtSZWY8YW55Pj4gKi9cbmNvbnN0IGtleVRvUmVmPW5ldyBNYXAoKTtcbmNvbnN0IHJlZ2lzdHJ5PW5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoa2V5KT0+e1xuLyogQmVjYXVzZSB0aGlzIHdpbGwgZGVsZXRlIHRoZSBjdXJyZW50IGJpbmRpbmcgb2YgYGtleWAsIHdlIG5lZWQgdG8qL1xuLyogYmUgc3VyZSB0aGF0IGl0IGlzIG5vdCBjYWxsZWQgYmVjYXVzZSBhIHByZXZpb3VzIGJpbmRpbmcgd2FzIGNvbGxlY3RlZC4qL1xuLyogV2UgZG8gdGhpcyB3aXRoIHRoZSBgdW5yZWdpc3RlcmAgaW4gYHNldGAgYmVsb3csIGFzc3VtaW5nIHRoYXQqL1xuLyogYHVucmVnaXN0ZXJgICppbW1lZGlhdGVseSogc3VwcHJlc3NlcyB0aGUgZmluYWxpemF0aW9uIG9mIHRoZSB0aGluZyovXG4vKiBpdCB1bnJlZ2lzdGVycy4gVE9ETyBJZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBndWFyYW50ZWVkLCBpLmUuLCBpZiovXG4vKiBmaW5hbGl6YXRpb25zIHRoYXQgaGF2ZSwgc2F5LCBhbHJlYWR5IGJlZW4gc2NoZWR1bGVkIG1pZ2h0IHN0aWxsKi9cbi8qIGhhcHBlbiBhZnRlciB0aGV5J3ZlIGJlZW4gdW5yZWdpc3RlcmVkLCB3ZSB3aWxsIG5lZWQgdG8gcmV2aXNpdCB0aGlzLiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZmluYWxpemluZ01hcC5kZWxldGUoa2V5KTtcbiB9KTtcbmNvbnN0IGZpbmFsaXppbmdNYXA9RmFyKCdmaW5hbGl6aW5nTWFwJyx7XG4vKipcbiAqIGBjbGVhcldpdGhvdXRGaW5hbGl6aW5nYCBkb2VzIG5vdCBgZGVyZWZgIGFueXRoaW5nLCBhbmQgc28gZG9lcyBub3RcbiAqIHN1cHByZXNzIGNvbGxlY3Rpb24gb2YgdGhlIHdlYWtseS1wb2ludGVkLXRvIHZhbHVlcyB1bnRpbCB0aGUgZW5kIG9mIHRoZVxuICogdHVybi4gIEJlY2F1c2UgYGNsZWFyV2l0aG91dEZpbmFsaXppbmdgIGltbWVkaWF0ZWx5IHJlbW92ZXMgYWxsIGVudHJpZXNcbiAqIGZyb20gdGhpcyBtYXAsIHRoaXMgcG9zc2libGUgY29sbGVjdGlvbiBpcyBub3Qgb2JzZXJ2YWJsZSB1c2luZyBvbmx5IHRoaXNcbiAqIG1hcCBpbnN0YW5jZS4gIEJ1dCBpdCBpcyBvYnNlcnZhYmxlIHZpYSBvdGhlciB1c2VzIG9mIFdlYWtSZWYgb3JcbiAqIEZpbmFsaXphdGlvbkdyb3VwLCBpbmNsdWRpbmcgb3RoZXIgbWFwIGluc3RhbmNlcyBtYWRlIGJ5IHRoaXNcbiAqIGBtYWtlRmluYWxpemluZ01hcGAuXG4gKi9cbmNsZWFyV2l0aG91dEZpbmFsaXppbmc6KCk9PntcbmZvcihjb25zdCByZWYgb2Yga2V5VG9SZWYudmFsdWVzKCkpe1xucmVnaXN0cnkudW5yZWdpc3RlcihyZWYpO1xuIH1cbmtleVRvUmVmLmNsZWFyKCk7XG4gfSxcbi8qIERvZXMgZGVyZWYsIGFuZCB0aHVzIGRvZXMgZ3VhcmFudGVlIHN0YWJpbGl0eSBvZiB0aGUgdmFsdWUgdW50aWwgdGhlKi9cbi8qIGVuZCBvZiB0aGUgdHVybi4qL1xuLyogUHJlZmVyOiBnZXQ6IGtleSA9PiBrZXlUb1JlZi5nZXQoa2V5KT8uZGVyZWYoKSwqL1xuZ2V0OihrZXkpPT57XG5jb25zdCB3cj1rZXlUb1JlZi5nZXQoa2V5KTtcbmlmKCF3cil7XG5yZXR1cm4gd3I7XG4gfVxucmV0dXJuIHdyLmRlcmVmKCk7XG4gfSxcbmhhczooa2V5KT0+ZmluYWxpemluZ01hcC5nZXQoa2V5KSE9PXVuZGVmaW5lZCxcbi8qIERvZXMgZGVyZWYsIGFuZCB0aHVzIGRvZXMgZ3VhcmFudGVlIHN0YWJpbGl0eSBvZiBib3RoIG9sZCBhbmQgbmV3IHZhbHVlcyovXG4vKiB1bnRpbCB0aGUgZW5kIG9mIHRoZSB0dXJuLiovXG5zZXQ6KGtleSxyZWYpPT57XG5hc3NlcnQoaXNPYmplY3QocmVmKSk7XG5maW5hbGl6aW5nTWFwLmRlbGV0ZShrZXkpO1xuY29uc3QgbmV3V1I9bmV3IFdlYWtSZWYocmVmKTtcbmtleVRvUmVmLnNldChrZXksbmV3V1IpO1xucmVnaXN0cnkucmVnaXN0ZXIocmVmLGtleSxuZXdXUik7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuY29uc3Qgd3I9a2V5VG9SZWYuZ2V0KGtleSk7XG5pZighd3Ipe1xucmV0dXJuIGZhbHNlO1xuIH1cblxucmVnaXN0cnkudW5yZWdpc3Rlcih3cik7XG5rZXlUb1JlZi5kZWxldGUoa2V5KTtcblxuLyogT3VyIHNlbWFudGljcyBhcmUgdG8gZmluYWxpemUgdXBvbiBleHBsaWNpdCBgZGVsZXRlYCwgYHNldGAgKHdoaWNoKi9cbi8qIGNhbGxzIGBkZWxldGVgKSBvciBnYXJiYWdlIGNvbGxlY3Rpb24gKHdoaWNoIGFsc28gY2FsbHMgYGRlbGV0ZWApLiovXG4vKiBgY2xlYXJXaXRob3V0RmluYWxpemluZ2AgaXMgZXhlbXB0LiovXG5pZihmaW5hbGl6ZXIpe1xuZmluYWxpemVyKGtleSk7XG4gfVxucmV0dXJuIHRydWU7XG4gfSxcbmdldFNpemU6KCk9PmtleVRvUmVmLnNpemV9KTtcblxucmV0dXJuIGZpbmFsaXppbmdNYXA7XG4gfTskaOKAjV9vbmNlLm1ha2VGaW5hbGl6aW5nTWFwKG1ha2VGaW5hbGl6aW5nTWFwKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRmluYWxpemluZ01hcCI6WyJtYWtlRmluYWxpemluZ01hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABsLHsEawIAAGsCAAAfAAAAQGVuZG8vY2FwdHAtdjMuMS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9tYXJzaGFsIiwiLi9jYXB0cC5qcyIsIi4vbG9vcGJhY2suanMiLCIuL2F0b21pY3MuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL2F0b21pY3MuanMiLCIuL2NhcHRwLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbXV0sW1wiLi9jYXB0cC5qc1wiLCBbXV0sW1wiLi9sb29wYmFjay5qc1wiLCBbXV0sW1wiLi9hdG9taWNzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBlbmRvL25hdCI6W1siTmF0IiwiTmF0Il1dLCIuL2xvb3BiYWNrLmpzIjpbWyJtYWtlTG9vcGJhY2siLCJtYWtlTG9vcGJhY2siXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAA5mG/tTDQAAUw0AACIAAABAZW5kby9jYXB0cC12My4xLjIvc3JjL2xvb3BiYWNrLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCIuL2NhcHRwLmpzIiwiLi90cmFwLmpzIiwiLi9maW5hbGl6ZS5qcyJdLCJleHBvcnRzIjpbIkUiLCJtYWtlTG9vcGJhY2siXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLEUsbWFrZUNhcFRQLG5lYXJUcmFwSW1wbCxtYWtlRmluYWxpemluZ01hcDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NhcHRwLmpzXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSksJGjigI1fbGl2ZVtcIkVcIl1dXSxbXCJtYWtlQ2FwVFBcIiwgWyRo4oCNX2EgPT4gKG1ha2VDYXBUUCA9ICRo4oCNX2EpXV1dXSxbXCIuL3RyYXAuanNcIiwgW1tcIm5lYXJUcmFwSW1wbFwiLCBbJGjigI1fYSA9PiAobmVhclRyYXBJbXBsID0gJGjigI1fYSldXV1dLFtcIi4vZmluYWxpemUuanNcIiwgW1tcIm1ha2VGaW5hbGl6aW5nTWFwXCIsIFskaOKAjV9hID0+IChtYWtlRmluYWxpemluZ01hcCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5FUmVmPFQ+fSBFUmVmXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgYW4gYXN5bmMtaXNvbGF0ZWQgY2hhbm5lbCB0byBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG91cklkXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vY2FwdHAuanMnKS5DYXBUUE9wdGlvbnN9IFtuZWFyT3B0aW9uc11cbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9jYXB0cC5qcycpLkNhcFRQT3B0aW9uc30gW2Zhck9wdGlvbnNdXG4gKiBAcmV0dXJucyB7e1xuICogICBtYWtlRmFyPFQ+KHg6IFQpOiBFUmVmPFQ+LFxuICogICBtYWtlTmVhcjxUPih4OiBUKTogRVJlZjxUPixcbiAqICAgbWFrZVRyYXBIYW5kbGVyPFQ+KHg6IFQpOiBULFxuICogICBpc09ubHlOZWFyKHg6IGFueSk6IGJvb2xlYW4sXG4gKiAgIGlzT25seUZhcih4OiBhbnkpOiBib29sZWFuLFxuICogICBnZXROZWFyU3RhdHMoKTogYW55LFxuICogICBnZXRGYXJTdGF0cygpOiBhbnksXG4gKiAgIFRyYXA6IFRyYXBcbiAqIH19XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTG9vcGJhY2s9KG91cklkLG5lYXJPcHRpb25zLGZhck9wdGlvbnMpPT57XG5sZXQgbGFzdE5vbmNlPTA7XG5jb25zdCBub25jZVRvUmVmPW1ha2VGaW5hbGl6aW5nTWFwKCk7XG5cbmNvbnN0IGJvb3RzdHJhcD1GYXIoJ3JlZkdldHRlcicse1xuZ2V0UmVmKG5vbmNlKXtcbi8qIEZpbmQgdGhlIGxvY2FsIHJlZiBmb3IgdGhlIHNwZWNpZmllZCBub25jZS4qL1xuY29uc3QgeEZhcj1ub25jZVRvUmVmLmdldChub25jZSk7XG5ub25jZVRvUmVmLmRlbGV0ZShub25jZSk7XG5yZXR1cm4geEZhcjtcbiB9fSk7XG5cblxuY29uc3Qgc2xvdEJvZHk9SlNPTi5zdHJpbmdpZnkoe1xuJ0BxY2xhc3MnOidzbG90JyxcbmluZGV4OjB9KTtcblxuXG4vKiBDcmVhdGUgdGhlIHR1bm5lbC4qL1xuY29uc3R7XG5UcmFwLFxuZGlzcGF0Y2g6bmVhckRpc3BhdGNoLFxuZ2V0Qm9vdHN0cmFwOmdldEZhckJvb3RzdHJhcCxcbmdldFN0YXRzOmdldE5lYXJTdGF0cyxcbmlzT25seUxvY2FsOmlzT25seU5lYXJcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovfT1cbm1ha2VDYXBUUCggYG5lYXItJHtvdXJJZH1gLChvKT0+ZmFyRGlzcGF0Y2gobyksYm9vdHN0cmFwLHtcbnRyYXBHdWVzdDooe3RyYXBNZXRob2Qsc2xvdCx0cmFwQXJnc30pPT57XG5sZXQgdmFsdWU7XG5sZXQgaXNFeGNlcHRpb249ZmFsc2U7XG50cnl7XG4vKiBDcm9zcyB0aGUgYm91bmRhcnkgdG8gcHVsbCBvdXQgdGhlIGZhciBvYmplY3QuKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCBmYXI9ZmFyVW5zZXJpYWxpemUoe2JvZHk6c2xvdEJvZHksc2xvdHM6W3Nsb3RdfSk7XG52YWx1ZT1uZWFyVHJhcEltcGxbdHJhcE1ldGhvZF0oZmFyLHRyYXBBcmdzWzBdLHRyYXBBcmdzWzFdKTtcbiB9Y2F0Y2goZSl7XG5pc0V4Y2VwdGlvbj10cnVlO1xudmFsdWU9ZTtcbiB9XG5oYXJkZW4odmFsdWUpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybltpc0V4Y2VwdGlvbixmYXJTZXJpYWxpemUodmFsdWUpXTtcbiB9LFxuLi4ubmVhck9wdGlvbnN9KTtcblxuYXNzZXJ0KFRyYXApO1xuXG5jb25zdHtcbm1ha2VUcmFwSGFuZGxlcixcbmRpc3BhdGNoOmZhckRpc3BhdGNoLFxuZ2V0Qm9vdHN0cmFwOmdldE5lYXJCb290c3RyYXAsXG5nZXRTdGF0czpnZXRGYXJTdGF0cyxcbmlzT25seUxvY2FsOmlzT25seUZhcixcbnVuc2VyaWFsaXplOmZhclVuc2VyaWFsaXplLFxuc2VyaWFsaXplOmZhclNlcmlhbGl6ZX09XG5tYWtlQ2FwVFAoIGBmYXItJHtvdXJJZH1gLG5lYXJEaXNwYXRjaCxib290c3RyYXAsZmFyT3B0aW9ucyk7XG5cbmNvbnN0IGZhckdldHRlcj1nZXRGYXJCb290c3RyYXAoKTtcbmNvbnN0IG5lYXJHZXR0ZXI9Z2V0TmVhckJvb3RzdHJhcCgpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8eyBnZXRSZWYobm9uY2U6IG51bWJlcik6IFQgfT59IHJlZkdldHRlclxuICovXG5jb25zdCBtYWtlUmVmTWFrZXI9XG4ocmVmR2V0dGVyKT0+XG4vKipcbiAqIEBwYXJhbSB7VH0geFxuICogQHJldHVybnMge1Byb21pc2U8VD59XG4gKi9cbmFzeW5jKHgpPT57XG5sYXN0Tm9uY2UrPTE7XG5jb25zdCBteU5vbmNlPWxhc3ROb25jZTtcbmNvbnN0IHZhbD1hd2FpdCB4O1xubm9uY2VUb1JlZi5zZXQobXlOb25jZSxoYXJkZW4odmFsKSk7XG5yZXR1cm4gRShyZWZHZXR0ZXIpLmdldFJlZihteU5vbmNlKTtcbiB9O1xuXG5yZXR1cm57XG5tYWtlRmFyOm1ha2VSZWZNYWtlcihmYXJHZXR0ZXIpLFxubWFrZU5lYXI6bWFrZVJlZk1ha2VyKG5lYXJHZXR0ZXIpLFxuaXNPbmx5TmVhcixcbmlzT25seUZhcixcbmdldE5lYXJTdGF0cyxcbmdldEZhclN0YXRzLFxubWFrZVRyYXBIYW5kbGVyLFxuVHJhcH07XG5cbiB9OyRo4oCNX29uY2UubWFrZUxvb3BiYWNrKG1ha2VMb29wYmFjayk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiRSI6WyJFIixmYWxzZV19LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxvb3BiYWNrIjpbIm1ha2VMb29wYmFjayJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABcfBQTcQgAAHEIAAAeAAAAQGVuZG8vY2FwdHAtdjMuMS4yL3NyYy90cmFwLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlVHJhcCIsIm5lYXJUcmFwSW1wbCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuXG4vKipcbiAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgVHJhcCBmb3IgbmVhciBvYmplY3RzLlxuICpcbiAqIEB0eXBlIHtUcmFwSW1wbH1cbiAqL1xuY29uc3QgICAgICAgIG5lYXJUcmFwSW1wbD1oYXJkZW4oe1xuYXBwbHlGdW5jdGlvbih0YXJnZXQsYXJncyl7XG5yZXR1cm4gdGFyZ2V0KC4uLmFyZ3MpO1xuIH0sXG5hcHBseU1ldGhvZCh0YXJnZXQscHJvcCxhcmdzKXtcbnJldHVybiB0YXJnZXRbcHJvcF0oLi4uYXJncyk7XG4gfSxcbmdldCh0YXJnZXQscHJvcCl7XG5yZXR1cm4gdGFyZ2V0W3Byb3BdO1xuIH19KTtcblxuXG4vKiogQHR5cGUge1Byb3h5SGFuZGxlcjxhbnk+fSAqLyRo4oCNX29uY2UubmVhclRyYXBJbXBsKG5lYXJUcmFwSW1wbCk7XG5jb25zdCBiYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyPXtcbnNldChfdGFyZ2V0LF9wcm9wLF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmlzRXh0ZW5zaWJsZShfdGFyZ2V0KXtcbnJldHVybiBmYWxzZTtcbiB9LFxuc2V0UHJvdG90eXBlT2YoX3RhcmdldCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5kZWxldGVQcm9wZXJ0eShfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiBmYWxzZTtcbiB9fTtcblxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgVHJhcCh4KVxuICpcbiAqIEBwYXJhbSB7Kn0geCBBbnkgdmFsdWUgcGFzc2VkIHRvIFRyYXAoeClcbiAqIEBwYXJhbSB7VHJhcEltcGx9IHRyYXBJbXBsXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyfVxuICovXG5jb25zdCBUcmFwUHJveHlIYW5kbGVyPSh4LHRyYXBJbXBsKT0+e1xucmV0dXJuIGhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0KF90YXJnZXQscCxfcmVjZWl2ZXIpe1xucmV0dXJuKC4uLmFyZ3MpPT50cmFwSW1wbC5hcHBseU1ldGhvZCh4LHAsYXJncyk7XG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnQXJyYXk9W10pe1xucmV0dXJuIHRyYXBJbXBsLmFwcGx5RnVuY3Rpb24oeCxhcmdBcnJheSk7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFRPRE86IGhhcyBwcm9wZXJ0eSBpcyBub3QgeWV0IHRyYW5zZmVycmFibGUgb3ZlciBjYXB0cC4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1RyYXBJbXBsfSB0cmFwSW1wbFxuICogQHJldHVybnMge1RyYXB9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlVHJhcD0odHJhcEltcGwpPT57XG5jb25zdCBUcmFwPSh4KT0+e1xuY29uc3QgaGFuZGxlcj1UcmFwUHJveHlIYW5kbGVyKHgsdHJhcEltcGwpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfTtcblxuY29uc3QgbWFrZVRyYXBHZXR0ZXJQcm94eT0oeCk9PntcbmNvbnN0IGhhbmRsZXI9aGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5oYXMoX3RhcmdldCxfcHJvcCl7XG4vKiBUT0RPOiBoYXMgcHJvcGVydHkgaXMgbm90IHlldCB0cmFuc2ZlcnJhYmxlIG92ZXIgY2FwdHAuKi9cbnJldHVybiB0cnVlO1xuIH0sXG5nZXQoX3RhcmdldCxwcm9wKXtcbnJldHVybiB0cmFwSW1wbC5nZXQoeCxwcm9wKTtcbiB9fSk7XG5cbnJldHVybiBuZXcgUHJveHkoT2JqZWN0LmNyZWF0ZShudWxsKSxoYW5kbGVyKTtcbiB9O1xuVHJhcC5nZXQ9bWFrZVRyYXBHZXR0ZXJQcm94eTtcblxucmV0dXJuIGhhcmRlbihUcmFwKTtcbiB9OyRo4oCNX29uY2UubWFrZVRyYXAobWFrZVRyYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5lYXJUcmFwSW1wbCI6WyJuZWFyVHJhcEltcGwiXSwibWFrZVRyYXAiOlsibWFrZVRyYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuvSlo48IAACPCAAAHwAAAEBlbmRvL2NhcHRwLXYzLjEuMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiogQHR5cGVkZWYge3N0cmluZ30gQ2FwVFBTbG90ICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVHJhcEltcGxcbiAqIEBwcm9wZXJ0eSB7KHRhcmdldDogYW55LCBhcmdzOiBBcnJheTxhbnk+KSA9PiBhbnl9IGFwcGx5RnVuY3Rpb24gZnVuY3Rpb25cbiAqIGFwcGxpY2F0aW9uXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgdGFyZ2V0OiBhbnksXG4gKiAgIG1ldGhvZDogc3RyaW5nIHwgc3ltYm9sIHwgbnVtYmVyLFxuICogICBhcmdzOiBBcnJheTxhbnk+XG4gKiApID0+IGFueX0gYXBwbHlNZXRob2QgbWV0aG9kIGludm9jYXRpb24sIHdoaWNoIGlzIGFuIGF0b21pYyBsb29rdXAgb2YgbWV0aG9kXG4gKiBhbmQgYXBwbHlcbiAqIEBwcm9wZXJ0eSB7KHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wgfCBudW1iZXIpID0+IGFueX0gZ2V0IHByb3BlcnR5XG4gKiBsb29rdXBcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbYm9vbGVhbiwgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNhcERhdGE8Q2FwVFBTbG90Pl19IFRyYXBDb21wbGV0aW9uIFRoZSBoZWFkIG9mIHRoZSBwYWlyXG4gKiBpcyB0aGUgYGlzUmVqZWN0ZWRgIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3luYyBjYWxsIHdhcyBhbiBleGNlcHRpb24sXG4gKiBhbmQgdGFpbCBvZiB0aGUgcGFpciBpcyB0aGUgc2VyaWFsaXplZCBmdWxmaWxsbWVudCB2YWx1ZSBvciByZWplY3Rpb24gcmVhc29uLlxuICogKFRoZSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBhIG5vbi10aGVuYWJsZS4gIFRoZSByZWplY3Rpb24gcmVhc29uIGlzIG5vcm1hbGx5XG4gKiBhbiBlcnJvci4pXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUcmFwUmVxdWVzdCB0aGUgYXJndW1lbnQgdG8gVHJhcEd1ZXN0XG4gKiBAcHJvcGVydHkge2tleW9mIFRyYXBJbXBsfSB0cmFwTWV0aG9kIHRoZSBUcmFwSW1wbCBtZXRob2QgdGhhdCB3YXMgY2FsbGVkXG4gKiBAcHJvcGVydHkge0NhcFRQU2xvdH0gc2xvdCB0aGUgdGFyZ2V0IHNsb3RcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8YW55Pn0gdHJhcEFyZ3MgYXJndW1lbnRzIHRvIHRoZSBUcmFwSW1wbCBtZXRob2RcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUmVxdWlyZWQ8SXRlcmF0b3I8dm9pZCwgdm9pZCwgYW55Pj59IHN0YXJ0VHJhcCBzdGFydCB0aGVcbiAqIHRyYXAgcHJvY2VzcyBvbiB0aGUgdHJhcEhvc3QsIGFuZCBkcml2ZSB0aGUgb3RoZXIgc2lkZS5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBUcmFwR3Vlc3QgVXNlIG91dC1vZi1iYW5kIGNvbW11bmljYXRpb25zIHRvIHN5bmNocm9ub3VzbHkgcmV0dXJuIGFcbiAqIFRyYXBDb21wbGV0aW9uIHZhbHVlIGluZGljYXRpbmcgdGhlIGZpbmFsIHJlc3VsdHMgb2YgYSBUcmFwIGNhbGwuXG4gKiBAcGFyYW0ge1RyYXBSZXF1ZXN0fSByZXFcbiAqIEByZXR1cm5zIHtUcmFwQ29tcGxldGlvbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBUcmFwSG9zdCBzdGFydCB0aGUgcHJvY2VzcyBvZiB0cmFuc2ZlcnJpbmcgdGhlIFRyYXAgcmVxdWVzdCdzXG4gKiByZXN1bHRzXG4gKiBAcGFyYW0ge1RyYXBDb21wbGV0aW9ufSBjb21wbGV0aW9uXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYXRvcjx2b2lkLCB2b2lkLCBhbnk+IHwgdW5kZWZpbmVkfSBJZiBhbiBBc3luY0l0ZXJhdG9yIGlzXG4gKiByZXR1cm5lZCwgaXQgd2lsbCBzYXRpc2Z5IGEgZnV0dXJlIGd1ZXN0IEl0ZXJhdGlvbk9ic2VydmVyLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90cy10eXBlcy5qcycpLlRyYXB9IFRyYXAgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHMtdHlwZXMnKS5UcmFwSGFuZGxlcjxUPn0gVHJhcEhhbmRsZXJcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAeKPu0fgEAAH4BAAAhAAAAQGVuZG8vZW52LW9wdGlvbnMtdjAuMS4xL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAshzifZgMAACYDAAAKwAAAEBlbmRvL2Vudi1vcHRpb25zLXYwLjEuMS9zcmMvZW52LW9wdGlvbnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qIGBAZW5kby9lbnYtb3B0aW9uc2AgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgcXVpdGUgZWFybHksIGFuZCBzbyBzaG91bGQqL1xuLyogYXZvaWQgaW1wb3J0aW5nIGZyb20gc2VzIG9yIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiBzZXMuKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuLyogUHJlbHVkZSBvZiBjaGVhcCBnb29kIC0gZW5vdWdoIGltaXRhdGlvbnMgb2YgdGhpbmdzIHdlJ2QgdXNlIG9yKi9cbi8qIGRvIGRpZmZlcmVudGx5IGlmIHdlIGNvdWxkIGRlcGVuZCBvbiBzZXMqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuXG4vKiBTaG91bGQgYmUgZXF1aXZhbGVudCB0byB0aGUgb25lIGluIHNlcycgY29tbW9ucy5qcyBldmVuIHRob3VnaCBpdCovXG4vKiB1c2VzIHRoZSBvdGhlciB0ZWNobmlxdWUuKi9cbmNvbnN0IHVuY3VycnlUaGlzPVxuKGZuKT0+XG4ocmVjZWl2ZXIsLi4uYXJncyk9PlxuYXBwbHkoZm4scmVjZWl2ZXIsYXJncyk7XG5jb25zdCBhcnJheVB1c2g9dW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBGYWlsPShsaXRlcmFscywuLi5hcmdzKT0+e1xubGV0IG1zZz1saXRlcmFsc1swXTtcbmZvcihsZXQgaT0wO2k8YXJncy5sZW5ndGg7aSs9MSl7XG5tc2c9IGAke21zZ30ke2FyZ3NbaV19JHtsaXRlcmFsc1tpKzFdfWA7XG4gfVxudGhyb3cgRXJyb3IobXNnKTtcbiB9O1xuXG4vKiBlbmQgcHJlbHVkZSovXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogYG1ha2VFbnZpcm9ubWVudENhcHRvcmAgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGdldHRpbmcgZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlcywgaWYgdGhleSBhcmUgbmVlZGVkLCBhbmQgYSB3YXkgdG8gY2F0YWxvZyB0aGUgbmFtZXMgb2YgYWxsXG4gKiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2VyZSBjYXB0dXJlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYUdsb2JhbFxuICovXG5jb25zdCAgICAgICAgbWFrZUVudmlyb25tZW50Q2FwdG9yPShhR2xvYmFsKT0+e1xuY29uc3QgY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzPVtdO1xuXG4vKipcbiAqIEdldHMgYW4gZW52aXJvbm1lbnQgb3B0aW9uIGJ5IG5hbWUgYW5kIHJldHVybnMgdGhlIG9wdGlvbiB2YWx1ZSBvciB0aGVcbiAqIGdpdmVuIGRlZmF1bHQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0U2V0dGluZ1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb249KG9wdGlvbk5hbWUsZGVmYXVsdFNldHRpbmcpPT57XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCovXG50eXBlb2Ygb3B0aW9uTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYEVudmlyb25tZW50IG9wdGlvbiBuYW1lICR7cShvcHRpb25OYW1lKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwqL1xudHlwZW9mIGRlZmF1bHRTZXR0aW5nPT09J3N0cmluZyd8fFxuRmFpbCBgRW52aXJvbm1lbnQgb3B0aW9uIGRlZmF1bHQgc2V0dGluZyAke3EoXG5kZWZhdWx0U2V0dGluZylcbiB9IG11c3QgYmUgYSBzdHJpbmcuYDtcblxuLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5sZXQgc2V0dGluZz1kZWZhdWx0U2V0dGluZztcbmNvbnN0IGdsb2JhbFByb2Nlc3M9YUdsb2JhbC5wcm9jZXNzO1xuaWYoZ2xvYmFsUHJvY2VzcyYmdHlwZW9mIGdsb2JhbFByb2Nlc3M9PT0nb2JqZWN0Jyl7XG5jb25zdCBnbG9iYWxFbnY9Z2xvYmFsUHJvY2Vzcy5lbnY7XG5pZihnbG9iYWxFbnYmJnR5cGVvZiBnbG9iYWxFbnY9PT0nb2JqZWN0Jyl7XG5pZihvcHRpb25OYW1lIGluIGdsb2JhbEVudil7XG5hcnJheVB1c2goY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzLG9wdGlvbk5hbWUpO1xuY29uc3Qgb3B0aW9uVmFsdWU9Z2xvYmFsRW52W29wdGlvbk5hbWVdO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwqL1xudHlwZW9mIG9wdGlvblZhbHVlPT09J3N0cmluZyd8fFxuRmFpbCBgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWVkICR7cShcbm9wdGlvbk5hbWUpXG4gfSwgaWYgcHJlc2VudCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUsIGdvdCAke3EoXG5vcHRpb25WYWx1ZSlcbiB9YDtcbnNldHRpbmc9b3B0aW9uVmFsdWU7XG4gfVxuIH1cbiB9XG5yZXR1cm4gc2V0dGluZztcbiB9O1xuZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uKTtcblxuY29uc3QgZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzPSgpPT57XG5yZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiB9O1xuZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbnJldHVybiBmcmVlemUoe2dldEVudmlyb25tZW50T3B0aW9uLGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lc30pO1xuIH07JGjigI1fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbnZpcm9ubWVudENhcHRvciI6WyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtC+LggcuAAAHLgAAJAAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMy9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCB0cmFja1R1cm5zOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIiwgWyRo4oCNX2EgPT4gKHRyYWNrVHVybnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7YXNzaWduLGNyZWF0ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge1Byb3h5SGFuZGxlcjxhbnk+fSAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcj17XG5zZXQoX3RhcmdldCxfcHJvcCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5pc0V4dGVuc2libGUoX3RhcmdldCl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbnNldFByb3RvdHlwZU9mKF90YXJnZXQsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuZGVsZXRlUHJvcGVydHkoX3RhcmdldCxfcHJvcCl7XG5yZXR1cm4gZmFsc2U7XG4gfX07XG5cblxuLyogRSBQcm94eSBoYW5kbGVycyBwcmV0ZW5kIHRoYXQgYW55IHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgdGFyZ2V0IGFuZCByZXR1cm5zKi9cbi8qIGEgZnVuY3Rpb24gZm9yIHRoZWlyIHZhbHVlLiBXaGlsZSB0aGlzIGZ1bmN0aW9uIGlzIFwiYm91bmRcIiBieSBjb250ZXh0LCBpdCBpcyovXG4vKiBtZWFudCB0byBiZSBjYWxsZWQgYXMgYSBtZXRob2QuIEZvciB0aGF0IHJlYXNvbiwgdGhlIHJldHVybmVkIGZ1bmN0aW9uKi9cbi8qIGluY2x1ZGVzIGEgY2hlY2sgdGhhdCB0aGUgYHRoaXNgIGFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBpbml0aWFsKi9cbi8qIHJlY2VpdmVyIHdoZW4gdGhlIGZ1bmN0aW9uIHdhcyByZXRyaWV2ZWQuKi9cbi8qIEUgUHJveHkgaGFuZGxlcnMgYWxzbyBmb3J3YXJkIGRpcmVjdCBjYWxscyB0byB0aGUgdGFyZ2V0IGluIGNhc2UgdGhlIHJlbW90ZSovXG4vKiBpcyBhIGZ1bmN0aW9uIGluc3RlYWQgb2YgYW4gb2JqZWN0LiBObyBzdWNoIHJlY2VpdmVyIGNoZWNrcyBhcmUgbmVjZXNzYXJ5IGluKi9cbi8qIHRoYXQgY2FzZS4qL1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRSh4KS5cbiAqXG4gKiBAcGFyYW0geyp9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFKHgpXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVQcm94eUhhbmRsZXI9KHgsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0OihfdGFyZ2V0LHAscmVjZWl2ZXIpPT57XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcF0oLi4uYXJncyl7XG5pZih0aGlzIT09cmVjZWl2ZXIpe1xuLyogUmVqZWN0IHRoZSBhc3luYyBmdW5jdGlvbiBjYWxsKi9cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5yZWplY3QoXG5hc3NlcnQuZXJyb3IoXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cH1cIiBtZXRob2Qgb2YgRSgke3EoeCl9KWApKTtcblxuXG4gfVxuXG5yZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QoeCxwLGFyZ3MpO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovfVtcbnBdKTtcblxuIH0sXG5hcHBseTooX3RhcmdldCxfdGhpc0FyZyxhcmdBcnJheT1bXSk9PntcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHgsYXJnQXJyYXkpO1xuIH0sXG5oYXM6KF90YXJnZXQsX3ApPT57XG4vKiBXZSBqdXN0IHByZXRlbmQgZXZlcnl0aGluZyBleGlzdHMuKi9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXI9KHgsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0OihfdGFyZ2V0LHAscmVjZWl2ZXIpPT57XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcF0oLi4uYXJncyl7XG4vKiBUaHJvdyBzaW5jZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBub3RoaW5nKi9cbnRoaXM9PT1yZWNlaXZlcnx8XG5GYWlsIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShwKX1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EoXG54KVxuIH0pYDtcbkhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkoeCxwLGFyZ3MpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL31bXG5wXSk7XG5cbiB9LFxuYXBwbHk6KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKT0+e1xuSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvblNlbmRPbmx5KHgsYXJnc0FycmF5KTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfSxcbmhhczooX3RhcmdldCxfcCk9Pntcbi8qIFdlIGp1c3QgcHJldGVuZCB0aGF0IGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUuZ2V0KHgpXG4gKiBJdCBpcyBhIHZhcmlhbnQgb24gdGhlIEUoeCkgUHJveHkgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0geyp9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLmdldCh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyPSh4LEhhbmRsZWRQcm9taXNlKT0+XG5oYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhczooX3RhcmdldCxfcHJvcCk9PnRydWUsXG5nZXQ6KF90YXJnZXQscHJvcCk9PkhhbmRsZWRQcm9taXNlLmdldCh4LHByb3ApfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICovXG5jb25zdCBtYWtlRT0oSGFuZGxlZFByb21pc2UpPT57XG5yZXR1cm4gaGFyZGVuKFxuYXNzaWduKFxuLyoqXG4gKiBFKHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGNhbGwgYXJiaXRyYXJ5IG1ldGhvZHMuIEVhY2ggb2YgdGhlc2VcbiAqIG1ldGhvZCBjYWxscyByZXR1cm5zIGEgcHJvbWlzZS4gVGhlIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgb24gd2hhdGV2ZXJcbiAqICd4JyBkZXNpZ25hdGVzIChvciByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBtZXRob2QvZnVuY3Rpb24gY2FsbFxuICogQHJldHVybnMge0VDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICovXG4oeCk9PmhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxtYWtlRVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKSkpLFxue1xuLyoqXG4gKiBFLmdldCh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBnZXQgYXJiaXRyYXJ5IHByb3BlcnRpZXMuXG4gKiBFYWNoIG9mIHRoZXNlIHByb3BlcnRpZXMgcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSBwcm9wZXJ0eS4gIFRoZSBwcm9taXNlXG4gKiB2YWx1ZSB3aWxsIGJlIHRoZSBwcm9wZXJ0eSBmZXRjaGVkIGZyb20gd2hhdGV2ZXIgJ3gnIGRlc2lnbmF0ZXMgKG9yXG4gKiByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBwcm9wZXJ0eSBnZXRcbiAqIEByZXR1cm5zIHtFR2V0dGVyczxMb2NhbFJlY29yZDxUPj59IHByb3BlcnR5IGdldCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbmdldDooeCk9PlxuaGFyZGVuKFxubmV3IFByb3h5KGNyZWF0ZShudWxsKSxtYWtlRUdldFByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKSkpLFxuXG5cbi8qKlxuICogRS5yZXNvbHZlKHgpIGNvbnZlcnRzIHggdG8gYSBoYW5kbGVkIHByb21pc2UuIEl0IGlzXG4gKiBzaG9ydGhhbmQgZm9yIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeClcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBoYW5kbGVkIHByb21pc2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBoYW5kbGVkIHByb21pc2UgZm9yIHhcbiAqIEByZWFkb25seVxuICovXG5yZXNvbHZlOkhhbmRsZWRQcm9taXNlLnJlc29sdmUsXG5cbi8qKlxuICogRS5zZW5kT25seSByZXR1cm5zIGEgcHJveHkgc2ltaWxhciB0byBFLCBidXQgZm9yIHdoaWNoIHRoZSByZXN1bHRzXG4gKiBhcmUgaWdub3JlZCAodW5kZWZpbmVkIGlzIHJldHVybmVkKS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgbWV0aG9kL2Z1bmN0aW9uIGNhbGxcbiAqIEByZXR1cm5zIHtFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbnNlbmRPbmx5Oih4KT0+XG5oYXJkZW4oXG5uZXcgUHJveHkoKCk9PnsgfSxtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpKSksXG5cblxuLyoqXG4gKiBFLndoZW4oeCwgcmVzLCByZWopIGlzIGVxdWl2YWxlbnQgdG9cbiAqIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihyZXMsIHJlailcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtVID0gVF1cbiAqIEBwYXJhbSB7VHxQcm9taXNlTGlrZTxUPn0geCB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgaGFuZGxlZCBwcm9taXNlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gRVJlZjxVPn0gW29uZnVsZmlsbGVkXVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IEVSZWY8VT59IFtvbnJlamVjdGVkXVxuICogQHJldHVybnMge1Byb21pc2U8VT59XG4gKiBAcmVhZG9ubHlcbiAqL1xud2hlbjooeCxvbmZ1bGZpbGxlZCxvbnJlamVjdGVkKT0+XG5IYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4oXG4uLi50cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSkpfSkpO1xuXG5cblxuXG4gfTtcblxuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxtYWtlRT59IEVQcm94eSAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlIHRoYXQgYWNjZXB0cyBib3RoIG5lYXIgYW5kIG1hcnNoYWxsZWQgcmVmZXJlbmNlcyB0aGF0IHdlcmVcbiAqIHJldHVybmVkIGZyb20gYFJlbW90YWJsZWAgb3IgYEZhcmAsIGFuZCBhbHNvIHByb21pc2VzIGZvciBzdWNoIHJlZmVyZW5jZXMuXG4gKlxuICogQHRlbXBsYXRlIFByaW1hcnkgVGhlIHR5cGUgb2YgdGhlIHByaW1hcnkgcmVmZXJlbmNlLlxuICogQHRlbXBsYXRlIFtMb2NhbD1EYXRhT25seTxQcmltYXJ5Pl0gVGhlIGxvY2FsIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdC5cbiAqIEB0eXBlZGVmIHtFUmVmPExvY2FsICYgWGltcG9ydCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPExvY2FsLCBQcmltYXJ5Pj59IEZhclJlZlxuICovXG5cbi8qKlxuICogYERhdGFPbmx5PFQ+YCBtZWFucyB0byByZXR1cm4gYSByZWNvcmQgdHlwZSBgVDJgIGNvbnNpc3Rpbmcgb25seSBvZlxuICogcHJvcGVydGllcyB0aGF0IGFyZSAqbm90KiBmdW5jdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgdG8gYmUgZmlsdGVyZWQuXG4gKiBAdHlwZWRlZiB7T21pdDxULCBGaWx0ZXJlZEtleXM8VCwgWGltcG9ydCgnLi90eXBlcycpLkNhbGxhYmxlPj59IERhdGFPbmx5XG4gKi9cblxuLyoqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMxMzk0fVxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQcm9taXNlTGlrZTxUPiB8IFR9IEVSZWZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnLi90eXBlcycpLkNhbGxhYmxlfSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBSZXR1cm5UeXBlPFQ+IGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT4gICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlXG4gKiAgICAgPyBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBmdW5jdGlvblxuICogICAgIDogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj4gIC8vIG1ha2UgaXQgcmV0dXJuIGEgcHJvbWlzZVxuICogKX0gRUNhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUW1BdPlxuICogICAgIDogbmV2ZXI7XG4gKiB9fSBFTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT5cbiAqICAgICA/IFRbUF1cbiAqICAgICA6IFByb21pc2U8QXdhaXRlZDxUW1BdPj47XG4gKiB9fSBFR2V0dGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGV9IFRcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTx2b2lkPn0gRVNlbmRPbmx5Q2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gRVNlbmRPbmx5Q2FsbGFibGU8VFtQXT5cbiAqICAgICA6IG5ldmVyO1xuICogfX0gRVNlbmRPbmx5TWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/IEVTZW5kT25seUNhbGxhYmxlPFQ+ICYgRVNlbmRPbmx5TWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICAgICA6IEVTZW5kT25seU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUPiAmIEVNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogICAgIDogRU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFQ2FsbGFibGVPck1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIFJldHVybiBhIHVuaW9uIG9mIHByb3BlcnR5IG5hbWVzL3N5bWJvbHMvbnVtYmVycyBQIGZvciB3aGljaCB0aGUgcmVjb3JkIGVsZW1lbnQgVFtQXSdzIHR5cGUgZXh0ZW5kcyBVLlxuICpcbiAqIEdpdmVuIGNvbnN0IHggPSB7IGE6IDEyMywgYjogJ2hlbGxvJywgYzogNDIsIDQ5OiAoKSA9PiB7fSwgNTM6IDY3IH0sXG4gKlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBudW1iZXI+IGlzIHRoZSB0eXBlICdhJyB8ICdjJyB8IDUzLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBzdHJpbmc+IGlzIHRoZSB0eXBlICdiJy5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgNDIgfCA2Nz4gaXMgdGhlIHR5cGUgJ2MnIHwgNTMuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIGJvb2xlYW4+IGlzIHRoZSB0eXBlIG5ldmVyLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHR5cGVkZWYge3sgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBVID8gUCA6IG5ldmVyOyB9W2tleW9mIFRdfSBGaWx0ZXJlZEtleXNcbiAqL1xuXG4vKipcbiAqIGBQaWNrQ2FsbGFibGU8VD5gIG1lYW5zIHRvIHJldHVybiBhIHNpbmdsZSByb290IGNhbGxhYmxlIG9yIGEgcmVjb3JkIHR5cGVcbiAqIGNvbnNpc3Rpbmcgb25seSBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFJldHVyblR5cGU8VD4gICAgICAgICAgICAgICAgICAgICAvLyBhIHJvb3QgY2FsbGFibGUsIG5vIG1ldGhvZHNcbiAqICAgICA6IFBpY2s8VCwgRmlsdGVyZWRLZXlzPFQsIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZT4+ICAgICAgICAgIC8vIGFueSBjYWxsYWJsZSBtZXRob2RzXG4gKiApfSBQaWNrQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIGBSZW1vdGVGdW5jdGlvbnM8VD5gIG1lYW5zIHRvIHJldHVybiB0aGUgZnVuY3Rpb25zIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlbW90ZWx5IGNhbGxhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgWGltcG9ydCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+ICAgICAvLyBpZiBhIGdpdmVuIFQgaXMgc29tZSByZW1vdGUgaW50ZXJmYWNlIFJcbiAqICAgICA/IFBpY2tDYWxsYWJsZTxSPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHJldHVybiB0aGUgY2FsbGFibGUgcHJvcGVydGllcyBvZiBSXG4gKiAgICAgOiBBd2FpdGVkPFQ+IGV4dGVuZHMgWGltcG9ydCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+IC8vIG90aGVyd2lzZSwgaWYgdGhlIGZpbmFsIHJlc29sdXRpb24gb2YgVCBpcyBzb21lIHJlbW90ZSBpbnRlcmZhY2UgUlxuICogICAgID8gUGlja0NhbGxhYmxlPFI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBjYWxsYWJsZSBwcm9wZXJ0aWVzIG9mIFJcbiAqICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlmIFQgaXMgYSBwcm9taXNlXG4gKiAgICAgPyBBd2FpdGVkPFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZXR1cm4gcmVzb2x2ZWQgdmFsdWUgVFxuICogICAgIDogVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgcmV0dXJuIFRcbiAqICl9IFJlbW90ZUZ1bmN0aW9uc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj5cbiAqICAgICA/IExcbiAqICAgICA6IEF3YWl0ZWQ8VD4gZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj5cbiAqICAgICA/IExcbiAqICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPlxuICogICAgID8gQXdhaXRlZDxUPlxuICogICAgIDogVFxuICogKX0gTG9jYWxSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUiA9IHVua25vd25dXG4gKiBAdHlwZWRlZiB7e1xuICogICBwcm9taXNlOiBQcm9taXNlPFI+O1xuICogICBzZXR0bGVyOiBYaW1wb3J0KCcuL3R5cGVzJykuU2V0dGxlcjxSPjtcbiAqIH19IEVQcm9taXNlS2l0XG4gKi9cblxuLyoqXG4gKiBUeXBlIGZvciBhbiBvYmplY3QgdGhhdCBtdXN0IG9ubHkgYmUgaW52b2tlZCB3aXRoIEUuICBJdCBzdXBwb3J0cyBhIGdpdmVuXG4gKiBpbnRlcmZhY2UgYnV0IGRlY2xhcmVzIGFsbCB0aGUgZnVuY3Rpb25zIGFzIGFzeW5jYWJsZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IEVSZWY8QXdhaXRlZDxFT25seTxSZXR1cm5UeXBlPFQ+Pj4+XG4gKiAgICAgOiBUIGV4dGVuZHMgUmVjb3JkPFByb3BlcnR5S2V5LCBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGU+XG4gKiAgICAgPyB7XG4gKiAgICAgICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgWGltcG9ydCgnLi90eXBlcycpLkNhbGxhYmxlXG4gKiAgICAgICAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUW0tdPikgPT4gRVJlZjxBd2FpdGVkPEVPbmx5PFJldHVyblR5cGU8VFtLXT4+Pj5cbiAqICAgICAgICAgICA6IFRbS107XG4gKiAgICAgICB9XG4gKiAgICAgOiBUXG4gKiApfSBFT25seVxuICovJGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA3C+1PHwIAAB8CAAAqAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4zL3NyYy9uby1zaGltLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyJdLCJleHBvcnRzIjpbIkUiLCJIYW5kbGVkUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlRTskaOKAjV9pbXBvcnRzKFtbXCIuL0UuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKG1ha2VFID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuY29uc3QgaHA9SGFuZGxlZFByb21pc2U7JGjigI1fb25jZS5ocChocCk7XG5jb25zdCAgICAgICAgRT1tYWtlRShIYW5kbGVkUHJvbWlzZSk7JGjigI1fb25jZS5FKEUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADqoR10lxAAAJcQAAAuAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4zL3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUVudmlyb25tZW50Q2FwdG9yOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJtYWtlRW52aXJvbm1lbnRDYXB0b3JcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbnZpcm9ubWVudENhcHRvciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0e2dldEVudmlyb25tZW50T3B0aW9ufT1tYWtlRW52aXJvbm1lbnRDYXB0b3IoZ2xvYmFsVGhpcyk7XG5cbi8qIE5PVEU6IFdlIGNhbid0IGltcG9ydCB0aGVzZSBiZWNhdXNlIHRoZXkncmUgbm90IGluIHNjb3BlIGJlZm9yZSBsb2NrZG93bi4qL1xuLyogaW1wb3J0IHsgYXNzZXJ0LCBkZXRhaWxzIGFzIFgsIEZhaWwgfSBmcm9tICdAYWdvcmljL2Fzc2VydCc7Ki9cblxuLyogV0FSTklORzogR2xvYmFsIE11dGFibGUgU3RhdGUhKi9cbi8qIFRoaXMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIGBhc3NlcnRgIHRoYXQgbWFrZXMgaXQgYXZhaWxhYmxlIHRvIHRoZSovXG4vKiBjYXVzYWwgY29uc29sZSwgd2hpY2ggYWZmZWN0cyB0aGUgY29uc29sZSBsb2cgb3V0cHV0LiBOb3JtYWxseSB3ZSovXG4vKiByZWdhcmQgdGhlIGFiaWxpdHkgdG8gc2VlIGNvbnNvbGUgbG9nIG91dHB1dCBhcyBhIG1ldGEtbGV2ZWwgcHJpdmlsZWdlKi9cbi8qIGFuYWxvZ291cyB0byB0aGUgYWJpbGl0eSB0byBkZWJ1Zy4gQXNpZGUgZnJvbSB0aGF0LCB0aGlzIG1vZHVsZSBzaG91bGQqL1xuLyogbm90IGhhdmUgYW55IG9ic2VydmFibHkgbXV0YWJsZSBzdGF0ZS4qL1xuXG5sZXQgaGlkZGVuUHJpb3JFcnJvcjtcbmxldCBoaWRkZW5DdXJyZW50VHVybj0wO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudD0wO1xuXG5jb25zdCBERUJVRz1nZXRFbnZpcm9ubWVudE9wdGlvbignREVCVUcnLCcnKTtcblxuLyogVHVybiBvbiBpZiB5b3Ugc2VlbSB0byBiZSBsb3NpbmcgZXJyb3IgbG9nZ2luZyBhdCB0aGUgdG9wIG9mIHRoZSBldmVudCBsb29wKi9cbmNvbnN0IFZFUkJPU0U9REVCVUcuc3BsaXQoJzonKS5pbmNsdWRlcygndHJhY2stdHVybnMnKTtcblxuLyogVHJhY2stdHVybnMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIGJlIGVuYWJsZWQgYnkgYW4gZW52aXJvbm1lbnQqL1xuLyogb3B0aW9uLiovXG5jb25zdCBUUkFDS19UVVJOUz1nZXRFbnZpcm9ubWVudE9wdGlvbignVFJBQ0tfVFVSTlMnLCdkaXNhYmxlZCcpO1xuaWYoVFJBQ0tfVFVSTlMhPT0nZW5hYmxlZCcmJlRSQUNLX1RVUk5TIT09J2Rpc2FibGVkJyl7XG50aHJvdyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgVFJBQ0tfVFVSTlMgJHtKU09OLnN0cmluZ2lmeShUUkFDS19UVVJOUyl9YCk7XG4gfVxuY29uc3QgRU5BQkxFRD0oVFJBQ0tfVFVSTlN8fCdkaXNhYmxlZCcpPT09J2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvdXQgb2YgdHJhY2tUdXJucygpIHRvIGRpc2NvdXJhZ2UgdGhlKi9cbi8qIGNsb3N1cmVzIGZyb20gaG9sZGluZyBvbnRvICdhcmdzJyBvciAnZnVuYycgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LCovXG4vKiB3aGljaCB3ZSd2ZSBzZWVuIGNhdXNlIEhhbmRsZWRQcm9taXNlIGFyZ3VtZW50cyB0byBiZSByZXRhaW5lZCBmb3IqL1xuLyogYSBzdXJwcmlzaW5nbHkgbG9uZyB0aW1lLiovXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGU9KGRldGFpbHNOb3RlKT0+KHJlYXNvbik9PntcbmlmKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKHJlYXNvbixkZXRhaWxzTm90ZSk7XG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLHJlYXNvbik7XG4gfVxuIH07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbj1cbihmdW5jLHNlbmRpbmdFcnJvcixYKT0+XG4oLi4uYXJncyk9PntcbmhpZGRlblByaW9yRXJyb3I9c2VuZGluZ0Vycm9yO1xuaGlkZGVuQ3VycmVudFR1cm4rPTE7XG5oaWRkZW5DdXJyZW50RXZlbnQ9MDtcbnRyeXtcbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbmlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLGVycik7XG4gfVxudGhyb3cgZXJyO1xuIH1cbi8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG5jb25zdCBkZXRhaWxzTm90ZT1YIGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xucmV0dXJuIHJlc3VsdDtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEdpdmVuIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzLCByZXR1cm5zIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzIHdob3NlXG4gKiBgdGhpc2AtZnJlZSBjYWxsIGJlaGF2aW9ycyBhcmUgbm90IG9ic2VydmFibHkgZGlmZmVyZW50IHRvIHRob3NlIHRoYXRcbiAqIGNhbm5vdCBzZWUgY29uc29sZSBvdXRwdXQuIFRoZSBvbmx5IHB1cnBvc2UgaXMgdG8gY2F1c2UgYWRkaXRpb25hbFxuICogaW5mb3JtYXRpb24gdG8gYXBwZWFyIG9uIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBjYWxsIHRvIGB0cmFja1R1cm5zYCBpcyBpdHNlbGYgYSBzZW5kaW5nIGV2ZW50LCB0aGF0IG9jY3VycyBpbiBzb21lIGNhbGxcbiAqIHN0YWNrIGluIHNvbWUgdHVybiBudW1iZXIgYXQgc29tZSBldmVudCBudW1iZXIgd2l0aGluIHRoYXQgdHVybi4gRWFjaCBjYWxsXG4gKiB0byBhbnkgb2YgdGhlIHJldHVybmVkIGBUdXJuU3RhcnRGbmBzIGlzIGEgcmVjZWl2aW5nIGV2ZW50IHRoYXQgYmVnaW5zIGEgbmV3XG4gKiB0dXJuLiBUaGlzIHNlbmRpbmcgZXZlbnQgY2F1c2VkIGVhY2ggb2YgdGhvc2UgcmVjZWl2aW5nIGV2ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUge1R1cm5TdGFydGVyRm5bXX0gVFxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9RXJyb3IoXG4gYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gKTtcblxuaWYoaGlkZGVuUHJpb3JFcnJvciE9PXVuZGVmaW5lZCl7XG5hc3NlcnQubm90ZShzZW5kaW5nRXJyb3IsWCBgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gfVxuXG5yZXR1cm4gKC8qKiBAdHlwZSB7VH0gKi9cbmZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSkpO1xuXG4gfTtcblxuLyoqXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqXG4gKiBAdHlwZWRlZiB7KCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IHVuZGVmaW5lZH0gVHVyblN0YXJ0ZXJGblxuICovJGjigI1fb25jZS50cmFja1R1cm5zKHRyYWNrVHVybnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACDL6O+mAIAAJgCAAAZAAAAQGVuZG8vZXhvLXYwLjIuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9leG8tbWFrZXJzLmpzIiwiLi9zcmMvZXhvLXRvb2xzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyIsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZXhvLW1ha2Vycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXhvLXRvb2xzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2V4by1tYWtlcnMuanMiOltbImluaXRFbXB0eSIsImluaXRFbXB0eSJdLFsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyJdLFsiZGVmaW5lRXhvQ2xhc3NLaXQiLCJkZWZpbmVFeG9DbGFzc0tpdCJdLFsibWFrZUV4byIsIm1ha2VFeG8iXV0sIi4vc3JjL2V4by10b29scy5qcyI6W1siR0VUX0lOVEVSRkFDRV9HVUFSRCIsIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAGoNBYiGQAAIhkAACIAAABAZW5kby9leG8tdjAuMi4zL3NyYy9leG8tbWFrZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vcGF0dGVybnMiLCIuL2V4by10b29scy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3NLaXQiLCJpbml0RW1wdHkiLCJtYWtlRXhvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VFbnZpcm9ubWVudENhcHRvcixvYmplY3RNYXAsZGVmZW5kUHJvdG90eXBlLGRlZmVuZFByb3RvdHlwZUtpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wibWFrZUVudmlyb25tZW50Q2FwdG9yXCIsIFskaOKAjV9hID0+IChtYWtlRW52aXJvbm1lbnRDYXB0b3IgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXV1dLFtcIi4vZXhvLXRvb2xzLmpzXCIsIFtbXCJkZWZlbmRQcm90b3R5cGVcIiwgWyRo4oCNX2EgPT4gKGRlZmVuZFByb3RvdHlwZSA9ICRo4oCNX2EpXV0sW1wiZGVmZW5kUHJvdG90eXBlS2l0XCIsIFskaOKAjV9hID0+IChkZWZlbmRQcm90b3R5cGVLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbmNvbnN0e2NyZWF0ZSxzZWFsLGZyZWV6ZSxkZWZpbmVQcm9wZXJ0eX09T2JqZWN0O1xuXG5jb25zdHtnZXRFbnZpcm9ubWVudE9wdGlvbn09bWFrZUVudmlyb25tZW50Q2FwdG9yKGdsb2JhbFRoaXMpO1xuY29uc3QgREVCVUc9Z2V0RW52aXJvbm1lbnRPcHRpb24oJ0RFQlVHJywnJyk7XG5cbi8qIFR1cm4gb24gdG8gZ2l2ZSBlYWNoIGV4byBpbnN0YW5jZSBpdHMgb3duIHRvU3RyaW5nVGFnIHZhbHVlLiovXG5jb25zdCBMQUJFTF9JTlNUQU5DRVM9REVCVUcuc3BsaXQoJywnKS5pbmNsdWRlcygnbGFiZWwtaW5zdGFuY2VzJyk7XG5cbmNvbnN0IG1ha2VTZWxmPShwcm90byxpbnN0YW5jZUNvdW50KT0+e1xuY29uc3Qgc2VsZj1jcmVhdGUocHJvdG8pO1xuaWYoTEFCRUxfSU5TVEFOQ0VTKXtcbmRlZmluZVByb3BlcnR5KHNlbGYsU3ltYm9sLnRvU3RyaW5nVGFnLHtcbnZhbHVlOiBgJHtwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddfSMke2luc3RhbmNlQ291bnR9YCxcbndyaXRhYmxlOmZhbHNlLFxuZW51bWVyYWJsZTpmYWxzZSxcbmNvbmZpZ3VyYWJsZTpmYWxzZX0pO1xuXG4gfVxucmV0dXJuIGhhcmRlbihzZWxmKTtcbiB9O1xuXG5jb25zdCBlbXB0eVJlY29yZD1oYXJkZW4oe30pO1xuXG4vKipcbiAqIFdoZW4gY2FsbGluZyBgZGVmaW5lRHVyYWJsZUtpbmRgIGFuZFxuICogaXRzIHNpYmxpbmdzLCB1c2VkIGFzIHRoZSBgaW5pdGAgZnVuY3Rpb24gYXJndW1lbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGVcbiAqIHN0YXRlIHJlY29yZCBvZiB0aGUgKHZpcnR1YWwvZHVyYWJsZSkgaW5zdGFuY2VzIG9mIHRoZSBraW5kL2V4b0NsYXNzXG4gKiBzaG91bGQgYmUgZW1wdHksIGFuZCB0aGF0IHRoZSByZXR1cm5lZCBtYWtlciBmdW5jdGlvbiBzaG91bGQgaGF2ZSB6ZXJvXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuY29uc3QgICAgICAgIGluaXRFbXB0eT0oKT0+ZW1wdHlSZWNvcmQ7XG5cbi8qKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vZXhvLXRvb2xzLmpzJykuRmFjZXROYW1lfSBGYWNldE5hbWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2V4by10b29scy5qcycpLk1ldGhvZHN9IE1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUyA9IGFueV1cbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gW00gPSBhbnldXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9leG8tdG9vbHMuanMnKS5DbGFzc0NvbnRleHR9IENsYXNzQ29udGV4dFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gW0YgPSBhbnldXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9leG8tdG9vbHMuanMnKS5LaXRDb250ZXh0fSBLaXRDb250ZXh0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1tuYW1lOiBzdHJpbmddOiBYaW1wb3J0KCdAZW5kby9wYXR0ZXJucycpLlBhdHRlcm59fSBTdGF0ZVNoYXBlXG4gKiBJdCBsb29rcyBsaWtlIGEgY29weVJlY29yZCBwYXR0ZXJuLCBidXQgdGhlIGludGVycHJldGF0aW9uIGlzIGRpZmZlcmVudC5cbiAqIEVhY2ggcHJvcGVydHkgaXMgZGlzdGluY3QsIGlzIGNoZWNrZWQgYW5kIGNoYW5nZWQgc2VwYXJhdGVseS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBDXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGYXJDbGFzc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KGNvbnRleHQ6IEMpID0+IHZvaWR9IFtmaW5pc2hdXG4gKiBAcHJvcGVydHkge1N0YXRlU2hhcGV9IFtzdGF0ZVNoYXBlXVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSSBpbml0IGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IE0gbWV0aG9kc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7TSAmIFRoaXNUeXBlPHsgc2VsZjogTSwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RmFyQ2xhc3NPcHRpb25zPENsYXNzQ29udGV4dDxSZXR1cm5UeXBlPEk+LCBNPj59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoTSAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgTT4pfVxuICovJGjigI1fb25jZS5pbml0RW1wdHkoaW5pdEVtcHR5KTtcbmNvbnN0ICAgICAgICBkZWZpbmVFeG9DbGFzcz0odGFnLGludGVyZmFjZUd1YXJkLGluaXQsbWV0aG9kcyxvcHRpb25zKT0+e1xuaGFyZGVuKG1ldGhvZHMpO1xuY29uc3R7ZmluaXNoPXVuZGVmaW5lZH09b3B0aW9uc3x8e307XG4vKiogQHR5cGUge1dlYWtNYXA8TSxDbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPiwgTT4+fSAqL1xuY29uc3QgY29udGV4dE1hcD1uZXcgV2Vha01hcCgpO1xuY29uc3QgcHJvdG89ZGVmZW5kUHJvdG90eXBlKFxudGFnLFxuKHNlbGYpPT4vKiogQHR5cGUge2FueX0gKi9jb250ZXh0TWFwLmdldChzZWxmKSxcbm1ldGhvZHMsXG50cnVlLFxuaW50ZXJmYWNlR3VhcmQpO1xuXG5sZXQgaW5zdGFuY2VDb3VudD0wO1xuLyoqXG4gKiBAcGFyYW0gIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKi9cbmNvbnN0IG1ha2VJbnN0YW5jZT0oLi4uYXJncyk9Pntcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbmNvbnN0IHN0YXRlPXNlYWwoaW5pdCguLi5hcmdzKSk7XG5pbnN0YW5jZUNvdW50Kz0xO1xuLyoqIEB0eXBlIHtNfSAqL1xuY29uc3Qgc2VsZj1tYWtlU2VsZihwcm90byxpbnN0YW5jZUNvdW50KTtcblxuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuLyoqIEB0eXBlIHtDbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPixNPn0gKi9cbmNvbnN0IGNvbnRleHQ9ZnJlZXplKHtzdGF0ZSxzZWxmfSk7XG5jb250ZXh0TWFwLnNldChzZWxmLGNvbnRleHQpO1xuaWYoZmluaXNoKXtcbmZpbmlzaChjb250ZXh0KTtcbiB9XG5yZXR1cm4gKC8qKiBAdHlwZSB7TSAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgTT59ICovXG5zZWxmKTtcblxuIH07XG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZSk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUV4b0NsYXNzKGRlZmluZUV4b0NsYXNzKTtcbmhhcmRlbihkZWZpbmVFeG9DbGFzcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSSBpbml0IGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxGYWNldE5hbWUsIE1ldGhvZHM+fSBGIGZhY2V0IG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge0YgJiBUaGlzVHlwZTx7IGZhY2V0czogRiwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT4gfSBtZXRob2RzS2l0XG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxLaXRDb250ZXh0PFJldHVyblR5cGU8ST4sRj4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gRn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUV4b0NsYXNzS2l0PShcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbm1ldGhvZHNLaXQsXG5vcHRpb25zKT0+XG57XG5oYXJkZW4obWV0aG9kc0tpdCk7XG5jb25zdHtmaW5pc2g9dW5kZWZpbmVkfT1vcHRpb25zfHx7fTtcbmNvbnN0IGNvbnRleHRNYXBLaXQ9b2JqZWN0TWFwKG1ldGhvZHNLaXQsKCk9Pm5ldyBXZWFrTWFwKCkpO1xuY29uc3QgZ2V0Q29udGV4dEtpdD1vYmplY3RNYXAoXG5tZXRob2RzS2l0LFxuKF92LG5hbWUpPT4oZmFjZXQpPT5jb250ZXh0TWFwS2l0W25hbWVdLmdldChmYWNldCkpO1xuXG5jb25zdCBwcm90b3R5cGVLaXQ9ZGVmZW5kUHJvdG90eXBlS2l0KFxudGFnLFxuZ2V0Q29udGV4dEtpdCxcbm1ldGhvZHNLaXQsXG50cnVlLFxuaW50ZXJmYWNlR3VhcmRLaXQpO1xuXG5sZXQgaW5zdGFuY2VDb3VudD0wO1xuLyoqXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqL1xuY29uc3QgbWFrZUluc3RhbmNlS2l0PSguLi5hcmdzKT0+e1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbi8qIERvbid0IGZyZWV6ZSBjb250ZXh0IHVudGlsIHdlIGFkZCBmYWNldHMqL1xuLyoqIEB0eXBlIHtLaXRDb250ZXh0PFJldHVyblR5cGU8ST4sRj59ICovXG5jb25zdCBjb250ZXh0PXtzdGF0ZSxmYWNldHM6e319O1xuaW5zdGFuY2VDb3VudCs9MTtcbmNvbnN0IGZhY2V0cz1vYmplY3RNYXAocHJvdG90eXBlS2l0LChwcm90byxmYWNldE5hbWUpPT57XG5jb25zdCBzZWxmPW1ha2VTZWxmKHByb3RvLGluc3RhbmNlQ291bnQpO1xuY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLnNldChzZWxmLGNvbnRleHQpO1xucmV0dXJuIHNlbGY7XG4gfSk7XG5jb250ZXh0LmZhY2V0cz1mYWNldHM7XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5mcmVlemUoY29udGV4dCk7XG5pZihmaW5pc2gpe1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbnJldHVybiBjb250ZXh0LmZhY2V0cztcbiB9O1xucmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2VLaXQpO1xuIH07JGjigI1fb25jZS5kZWZpbmVFeG9DbGFzc0tpdChkZWZpbmVFeG9DbGFzc0tpdCk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3NLaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9wYXR0ZXJucycpLkludGVyZmFjZUd1YXJkPHsgW00gaW4ga2V5b2YgVF06IFhpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuTWV0aG9kR3VhcmQgfT4gfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkIENBVkVBVDogc3RhdGljIHR5cGluZyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBgY2FsbFdoZW5gIHRyYW5zZm9ybWF0aW9uXG4gKiBAcGFyYW0ge1R9IG1ldGhvZHNcbiAqIEBwYXJhbSB7RmFyQ2xhc3NPcHRpb25zPENsYXNzQ29udGV4dDx7fSxUPj59IFtvcHRpb25zXVxuICogQHJldHVybnMge1QgJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUV4bz0odGFnLGludGVyZmFjZUd1YXJkLG1ldGhvZHMsb3B0aW9ucz11bmRlZmluZWQpPT57XG5jb25zdCBtYWtlSW5zdGFuY2U9ZGVmaW5lRXhvQ2xhc3MoXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXRFbXB0eSxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxucmV0dXJuIG1ha2VJbnN0YW5jZSgpO1xuIH07JGjigI1fb25jZS5tYWtlRXhvKG1ha2VFeG8pO1xuaGFyZGVuKG1ha2VFeG8pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImluaXRFbXB0eSI6WyJpbml0RW1wdHkiXSwiZGVmaW5lRXhvQ2xhc3MiOlsiZGVmaW5lRXhvQ2xhc3MiXSwiZGVmaW5lRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRXhvQ2xhc3NLaXQiXSwibWFrZUV4byI6WyJtYWtlRXhvIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPtxtTB+KwAAfisAACEAAABAZW5kby9leG8tdjAuMi4zL3NyYy9leG8tdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiR0VUX0lOVEVSRkFDRV9HVUFSRCIsImRlZmVuZFByb3RvdHlwZSIsImRlZmVuZFByb3RvdHlwZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixoYXNPd25Qcm9wZXJ0eU9mLGxpc3REaWZmZXJlbmNlLG9iamVjdE1hcCxtdXN0TWF0Y2gsTTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV0sW1wib2JqZWN0TWFwXCIsIFskaOKAjV9hID0+IChvYmplY3RNYXAgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuTWV0aG9kfSBNZXRob2QgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5NZXRob2RHdWFyZH0gTWV0aG9kR3VhcmQgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHthcHBseSxvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZGVmaW5lUHJvcGVydGllc309T2JqZWN0O1xuXG4vKipcbiAqIEEgbWV0aG9kIGd1YXJkLCBmb3IgaW5jbHVzaW9uIGluIGFuIGludGVyZmFjZSBndWFyZCwgdGhhdCBlbmZvcmNlcyBvbmx5IHRoYXRcbiAqIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NhYmxlIGFuZCB0aGF0IHRoZSByZXN1bHQgaXMgcGFzc2FibGUuIChJbiBmYXIgY2xhc3NlcyxcbiAqIFwiYW55XCIgbWVhbnMgYW55ICpwYXNzYWJsZSouKSBUaGlzIGlzIHRoZSBsZWFzdCBwb3NzaWJsZSBlbmZvcmNlbWVudCBmb3IgYVxuICogbWV0aG9kIGd1YXJkLCBhbmQgaXMgaW1wbGllZCBieSBhbGwgb3RoZXIgbWV0aG9kIGd1YXJkcy5cbiAqL1xuY29uc3QgTWluTWV0aG9kR3VhcmQ9TS5jYWxsKCkucmVzdChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpO1xuXG5jb25zdCBkZWZlbmRTeW5jQXJncz0oYXJncyxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e2FyZ0d1YXJkcyxvcHRpb25hbEFyZ0d1YXJkcyxyZXN0QXJnR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3QgcGFyYW1zUGF0dGVybj1NLnNwbGl0QXJyYXkoXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCk7XG5cbm11c3RNYXRjaChoYXJkZW4oYXJncykscGFyYW1zUGF0dGVybixsYWJlbCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcmV0dXJucyB7TWV0aG9kfVxuICovXG5jb25zdCBkZWZlbmRTeW5jTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtyZXR1cm5HdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdHtzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbnN5bmNNZXRob2QoLi4uYXJncyl7XG5kZWZlbmRTeW5jQXJncyhoYXJkZW4oYXJncyksbWV0aG9kR3VhcmQsbGFiZWwpO1xuY29uc3QgcmVzdWx0PWFwcGx5KG1ldGhvZCx0aGlzLGFyZ3MpO1xubXVzdE1hdGNoKGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9fTtcblxucmV0dXJuIHN5bmNNZXRob2Q7XG4gfTtcblxuY29uc3QgaXNBd2FpdEFyZ0d1YXJkPShhcmdHdWFyZCk9PlxuYXJnR3VhcmQmJnR5cGVvZiBhcmdHdWFyZD09PSdvYmplY3QnJiZhcmdHdWFyZC5rbGFzcz09PSdhd2FpdEFyZyc7XG5cbmNvbnN0IGRlc3luYz0obWV0aG9kR3VhcmQpPT57XG5jb25zdHthcmdHdWFyZHMsb3B0aW9uYWxBcmdHdWFyZHM9W10scmVzdEFyZ0d1YXJkfT1tZXRob2RHdWFyZDtcbiFpc0F3YWl0QXJnR3VhcmQocmVzdEFyZ0d1YXJkKXx8XG5GYWlsIGBSZXN0IGFyZ3MgbWF5IG5vdCBiZSBhd2FpdGVkOiAke3Jlc3RBcmdHdWFyZH1gO1xuY29uc3QgcmF3QXJnR3VhcmRzPVsuLi5hcmdHdWFyZHMsLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG5jb25zdCBhd2FpdEluZGV4ZXM9W107XG5mb3IobGV0IGk9MDtpPHJhd0FyZ0d1YXJkcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBhcmdHdWFyZD1yYXdBcmdHdWFyZHNbaV07XG5pZihpc0F3YWl0QXJnR3VhcmQoYXJnR3VhcmQpKXtcbnJhd0FyZ0d1YXJkc1tpXT1hcmdHdWFyZC5hcmdHdWFyZDtcbmF3YWl0SW5kZXhlcy5wdXNoKGkpO1xuIH1cbiB9XG5yZXR1cm57XG5hd2FpdEluZGV4ZXMsXG5yYXdNZXRob2RHdWFyZDp7XG5hcmdHdWFyZHM6cmF3QXJnR3VhcmRzLnNsaWNlKDAsYXJnR3VhcmRzLmxlbmd0aCksXG5vcHRpb25hbEFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG5yZXN0QXJnR3VhcmR9fTtcblxuXG4gfTtcblxuY29uc3QgZGVmZW5kQXN5bmNNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0e2F3YWl0SW5kZXhlcyxyYXdNZXRob2RHdWFyZH09ZGVzeW5jKG1ldGhvZEd1YXJkKTtcbmNvbnN0e2FzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbmFzeW5jTWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgYXdhaXRMaXN0PWF3YWl0SW5kZXhlcy5tYXAoKGkpPT5hcmdzW2ldKTtcbmNvbnN0IHA9UHJvbWlzZS5hbGwoYXdhaXRMaXN0KTtcbmNvbnN0IHJhd0FyZ3M9Wy4uLmFyZ3NdO1xuY29uc3QgcmVzdWx0UD1FLndoZW4ocCwoYXdhaXRlZEFyZ3MpPT57XG5mb3IobGV0IGo9MDtqPGF3YWl0SW5kZXhlcy5sZW5ndGg7ais9MSl7XG5yYXdBcmdzW2F3YWl0SW5kZXhlc1tqXV09YXdhaXRlZEFyZ3Nbal07XG4gfVxuZGVmZW5kU3luY0FyZ3MocmF3QXJncyxyYXdNZXRob2RHdWFyZCxsYWJlbCk7XG5yZXR1cm4gYXBwbHkobWV0aG9kLHRoaXMscmF3QXJncyk7XG4gfSk7XG5yZXR1cm4gRS53aGVuKHJlc3VsdFAsKHJlc3VsdCk9Pntcbm11c3RNYXRjaChoYXJkZW4ocmVzdWx0KSxyZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbnJldHVybiByZXN1bHQ7XG4gfSk7XG4gfX07XG5cbnJldHVybiBhc3luY01ldGhvZDtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKi9cbmNvbnN0IGRlZmVuZE1ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7a2xhc3MsY2FsbEtpbmR9PW1ldGhvZEd1YXJkO1xuYXNzZXJ0KGtsYXNzPT09J21ldGhvZEd1YXJkJyk7XG5pZihjYWxsS2luZD09PSdzeW5jJyl7XG5yZXR1cm4gZGVmZW5kU3luY01ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpO1xuIH1lbHNle1xuYXNzZXJ0KGNhbGxLaW5kPT09J2FzeW5jJyk7XG5yZXR1cm4gZGVmZW5kQXN5bmNNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBGYWNldE5hbWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBbTSA9IGFueV1cbiAqIEB0eXBlZGVmIHt7IHN0YXRlOiBTLCBzZWxmOiBNIH19IENsYXNzQ29udGV4dFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gW0YgPSBhbnldXG4gKiBAdHlwZWRlZiB7eyBzdGF0ZTogUywgZmFjZXRzOiBGIH19IEtpdENvbnRleHRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoZmFjZXQ6IGFueSkgPT4gS2l0Q29udGV4dH0gS2l0Q29udGV4dFByb3ZpZGVyXG4gKiBAdHlwZWRlZiB7KChyZXByZXNlbnRhdGl2ZTogYW55KSA9PiBDbGFzc0NvbnRleHQpIHwgS2l0Q29udGV4dFByb3ZpZGVyfSBDb250ZXh0UHJvdmlkZXJcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RUYWdcbiAqIEBwYXJhbSB7Q29udGV4dFByb3ZpZGVyfSBjb250ZXh0UHJvdmlkZXJcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gW21ldGhvZEd1YXJkXVxuICovXG5jb25zdCBiaW5kTWV0aG9kPShcbm1ldGhvZFRhZyxcbmNvbnRleHRQcm92aWRlcixcbmJlaGF2aW9yTWV0aG9kLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5tZXRob2RHdWFyZD11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YoYmVoYXZpb3JNZXRob2QsJ2Z1bmN0aW9uJyk7XG5cbmNvbnN0IGdldENvbnRleHQ9KHNlbGYpPT57XG5jb25zdCBjb250ZXh0PWNvbnRleHRQcm92aWRlcihzZWxmKTtcbmNvbnRleHR8fFxuRmFpbCBgJHtxKG1ldGhvZFRhZyl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtzZWxmfWA7XG5yZXR1cm4gY29udGV4dDtcbiB9O1xuXG4vKiBWaW9sYXRpbmcgYWxsIEplc3NpZSBydWxlcyB0byBjcmVhdGUgcmVwcmVzZW50YXRpdmVzIHRoYXQgaW5oZXJpdCovXG4vKiBtZXRob2RzIGZyb20gYSBzaGFyZWQgcHJvdG90eXBlLiBUaGUgYm91bmQgbWV0aG9kIHRoZXJlZm9yZSBuZWVkcyovXG4vKiB0byBtZW50aW9uIGB0aGlzYC4gV2UgZGVmaW5lIGl0IHVzaW5nIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4vKiBzbyB0aGF0IGl0IHdpbGwgYmUgYHRoaXNgIHNlbnNpdGl2ZSBidXQgbm90IGNvbnN0cnVjdGFibGUuKi9cbi8qKi9cbi8qIFdlIG5vcm1hbGx5IGNvbnNpZGVyIGB0aGlzYCB1bnNhZmUgYmVjYXVzZSBvZiB0aGUgaGF6YXJkIG9mIGEqL1xuLyogbWV0aG9kIG9mIG9uZSBhYnN0cmFjdGlvbiBiZWluZyBhcHBsaWVkIHRvIGFuIGluc3RhbmNlIG9mKi9cbi8qIGFub3RoZXIgYWJzdHJhY3Rpb24uIFRvIHByZXZlbnQgdGhhdCBhdHRhY2ssIHRoZSBib3VuZCBtZXRob2QqL1xuLyogY2hlY2tzIHRoYXQgaXRzIGB0aGlzYCBpcyBpbiB0aGUgbWFwIGluIHdoaWNoIGl0cyByZXByZXNlbnRhdGl2ZXMqL1xuLyogYXJlIHJlZ2lzdGVyZWQuKi9cbmxldHttZXRob2R9PXRoaXNmdWxNZXRob2RzP1xue1xubWV0aG9kKC4uLmFyZ3Mpe1xudGhpc3x8XG5GYWlsIGB0aGlzZnVsIG1ldGhvZCAke21ldGhvZFRhZ30gY2FsbGVkIHdpdGhvdXQgJ3RoaXMnIG9iamVjdGA7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsY29udGV4dCxhcmdzKTtcbiB9fTpcblxue1xubWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgY29udGV4dD1nZXRDb250ZXh0KHRoaXMpO1xucmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLG51bGwsW2NvbnRleHQsLi4uYXJnc10pO1xuIH19O1xuXG5pZihtZXRob2RHdWFyZCl7XG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1lbHNlIGlmKHRoaXNmdWxNZXRob2RzKXtcbi8qIEZvciBmYXIgY2xhc3NlcyBlbnN1cmUgdGhhdCBpbnB1dHMgYW5kIG91dHB1dHMgYXJlIHBhc3NhYmxlLiovXG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxNaW5NZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1cbmRlZmluZVByb3BlcnRpZXMobWV0aG9kLHtcbm5hbWU6e3ZhbHVlOm1ldGhvZFRhZ30sXG5sZW5ndGg6e1xudmFsdWU6dGhpc2Z1bE1ldGhvZHM/YmVoYXZpb3JNZXRob2QubGVuZ3RoOmJlaGF2aW9yTWV0aG9kLmxlbmd0aC0xfX0pO1xuXG5cbnJldHVybiBtZXRob2Q7XG4gfTtcblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgYXV0b21hdGljYWxseSBhZGRlZCBkZWZhdWx0IG1ldGEtbWV0aG9kIGZvclxuICogb2J0YWluaW5nIGFuIGV4bydzIGludGVyZmFjZSwgaWYgaXQgaGFzIG9uZS5cbiAqXG4gKiBUT0RPIE5hbWUgdG8gYmUgYmlrZXNoZWQuIFBlcmhhcHMgZXZlbiB3aGV0aGVyIGl0IGlzIGFcbiAqIHN0cmluZyBvciBzeW1ib2wgdG8gYmUgYmlrZXNoZWQuXG4gKlxuICogVE9ETyBCZXdhcmUgdGhhdCBhbiBleG8ncyBpbnRlcmZhY2UgY2FuIGNoYW5nZSBhY3Jvc3MgYW4gdXBncmFkZSxcbiAqIHNvIHJlbW90ZXMgdGhhdCBjYWNoZSBpdCBjYW4gYmVjb21lIHN0YWxlLlxuICovXG5jb25zdCAgICAgICAgR0VUX0lOVEVSRkFDRV9HVUFSRD1TeW1ib2wuZm9yKCdnZXRJbnRlcmZhY2VHdWFyZCcpO1xuXG4vKipcbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9wYXR0ZXJucycpLkludGVyZmFjZUd1YXJkfSBpbnRlcmZhY2VHdWFyZFxuICogQHJldHVybnMge1R9XG4gKi8kaOKAjV9vbmNlLkdFVF9JTlRFUkZBQ0VfR1VBUkQoR0VUX0lOVEVSRkFDRV9HVUFSRCk7XG5jb25zdCB3aXRoR2V0SW50ZXJmYWNlR3VhcmRNZXRob2Q9KGJlaGF2aW9yTWV0aG9kcyxpbnRlcmZhY2VHdWFyZCk9PlxuaGFyZGVuKHtcbltHRVRfSU5URVJGQUNFX0dVQVJEXSgpe1xucmV0dXJuIGludGVyZmFjZUd1YXJkO1xuIH0sXG4uLi5iZWhhdmlvck1ldGhvZHN9KTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7Q29udGV4dFByb3ZpZGVyfSBjb250ZXh0UHJvdmlkZXJcbiAqIEBwYXJhbSB7VH0gYmVoYXZpb3JNZXRob2RzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZDx7IFtNIGluIGtleW9mIFRdOiBNZXRob2RHdWFyZCB9Pn0gW2ludGVyZmFjZUd1YXJkXVxuICogQHJldHVybnMge1QgJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fVxuICovXG5jb25zdCAgICAgICAgZGVmZW5kUHJvdG90eXBlPShcbnRhZyxcbmNvbnRleHRQcm92aWRlcixcbmJlaGF2aW9yTWV0aG9kcyxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxuaW50ZXJmYWNlR3VhcmQ9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBwcm90b3R5cGU9e307XG5pZihoYXNPd25Qcm9wZXJ0eU9mKGJlaGF2aW9yTWV0aG9kcywnY29uc3RydWN0b3InKSl7XG4vKiBCeSBpZ25vcmluZyBhbnkgbWV0aG9kIG5hbWVkIFwiY29uc3RydWN0b3JcIiwgd2UgY2FuIHVzZSBhKi9cbi8qIGNsYXNzLnByb3RvdHlwZSBhcyBhIGJlaGF2aW9yTWV0aG9kcy4qL1xuY29uc3R7Y29uc3RydWN0b3I6XywuLi5tZXRob2RzfT1iZWhhdmlvck1ldGhvZHM7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTIG1pc3NlcyB0aGF0IGhhc093biBjaGVjayBtYWtlcyB0aGlzIHNhZmUqL1xuYmVoYXZpb3JNZXRob2RzPWhhcmRlbihtZXRob2RzKTtcbiB9XG5sZXQgbWV0aG9kR3VhcmRzO1xuaWYoaW50ZXJmYWNlR3VhcmQpe1xuY29uc3R7XG5rbGFzcyxcbmludGVyZmFjZU5hbWUsXG5tZXRob2RHdWFyZHM6bWcsXG5zbG9wcHk9ZmFsc2V9PVxuaW50ZXJmYWNlR3VhcmQ7XG5tZXRob2RHdWFyZHM9bWc7XG5hc3NlcnQuZXF1YWwoa2xhc3MsJ0ludGVyZmFjZScpO1xuYXNzZXJ0LnR5cGVvZihpbnRlcmZhY2VOYW1lLCdzdHJpbmcnKTtcbntcbmNvbnN0IG1ldGhvZE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzKTtcbmNvbnN0IG1ldGhvZEd1YXJkTmFtZXM9b3duS2V5cyhtZXRob2RHdWFyZHMpO1xuY29uc3QgdW5pbXBsZW1lbnRlZD1saXN0RGlmZmVyZW5jZShtZXRob2RHdWFyZE5hbWVzLG1ldGhvZE5hbWVzKTtcbnVuaW1wbGVtZW50ZWQubGVuZ3RoPT09MHx8XG5GYWlsIGBtZXRob2RzICR7cSh1bmltcGxlbWVudGVkKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5pZighc2xvcHB5KXtcbmNvbnN0IHVuZ3VhcmRlZD1saXN0RGlmZmVyZW5jZShtZXRob2ROYW1lcyxtZXRob2RHdWFyZE5hbWVzKTtcbnVuZ3VhcmRlZC5sZW5ndGg9PT0wfHxcbkZhaWwgYG1ldGhvZHMgJHtxKHVuZ3VhcmRlZCl9IG5vdCBndWFyZGVkIGJ5ICR7cShpbnRlcmZhY2VOYW1lKX1gO1xuIH1cbiB9XG5iZWhhdmlvck1ldGhvZHM9d2l0aEdldEludGVyZmFjZUd1YXJkTWV0aG9kKFxuYmVoYXZpb3JNZXRob2RzLFxuaW50ZXJmYWNlR3VhcmQpO1xuXG4gfVxuXG5mb3IoY29uc3QgcHJvcCBvZiBvd25LZXlzKGJlaGF2aW9yTWV0aG9kcykpe1xucHJvdG90eXBlW3Byb3BdPWJpbmRNZXRob2QoXG4gYEluICR7cShwcm9wKX0gbWV0aG9kIG9mICgke3RhZ30pYCxcbmNvbnRleHRQcm92aWRlcixcbmJlaGF2aW9yTWV0aG9kc1twcm9wXSxcbnRoaXNmdWxNZXRob2RzLFxuLyogVE9ETyBzb21lIHRvb2wgZG9lcyBub3QgeWV0IHVuZGVyc3RhbmQgdGhlIGA/LltgIHN5bnRheCovXG5tZXRob2RHdWFyZHMmJm1ldGhvZEd1YXJkc1twcm9wXSk7XG5cbiB9XG5cbnJldHVybiBGYXIodGFnLC8qKiBAdHlwZSB7VH0gKi9wcm90b3R5cGUpO1xuIH07JGjigI1fb25jZS5kZWZlbmRQcm90b3R5cGUoZGVmZW5kUHJvdG90eXBlKTtcbmhhcmRlbihkZWZlbmRQcm90b3R5cGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UmVjb3JkPEZhY2V0TmFtZSwgS2l0Q29udGV4dFByb3ZpZGVyPn0gY29udGV4dFByb3ZpZGVyS2l0XG4gKiBAcGFyYW0ge1JlY29yZDxGYWNldE5hbWUsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gYmVoYXZpb3JNZXRob2RzS2l0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgWGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZD59IFtpbnRlcmZhY2VHdWFyZEtpdF1cbiAqL1xuY29uc3QgICAgICAgIGRlZmVuZFByb3RvdHlwZUtpdD0oXG50YWcsXG5jb250ZXh0UHJvdmlkZXJLaXQsXG5iZWhhdmlvck1ldGhvZHNLaXQsXG50aGlzZnVsTWV0aG9kcz1mYWxzZSxcbmludGVyZmFjZUd1YXJkS2l0PXVuZGVmaW5lZCk9Plxue1xuY29uc3QgZmFjZXROYW1lcz1vd25LZXlzKGJlaGF2aW9yTWV0aG9kc0tpdCkuc29ydCgpO1xuZmFjZXROYW1lcy5sZW5ndGg+MXx8RmFpbCBgQSBtdWx0aS1mYWNldCBvYmplY3QgbXVzdCBoYXZlIG11bHRpcGxlIGZhY2V0c2A7XG5pZihpbnRlcmZhY2VHdWFyZEtpdCl7XG5jb25zdCBpbnRlcmZhY2VOYW1lcz1vd25LZXlzKGludGVyZmFjZUd1YXJkS2l0KTtcbmNvbnN0IGV4dHJhSW50ZXJmYWNlTmFtZXM9bGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcyxpbnRlcmZhY2VOYW1lcyk7XG5leHRyYUludGVyZmFjZU5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgSW50ZXJmYWNlcyAke3EoZXh0cmFJbnRlcmZhY2VOYW1lcyl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuY29uc3QgZXh0cmFGYWNldE5hbWVzPWxpc3REaWZmZXJlbmNlKGludGVyZmFjZU5hbWVzLGZhY2V0TmFtZXMpO1xuZXh0cmFGYWNldE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbm90IGd1YXJkZWQgYnkgaW50ZXJmYWNlc2A7XG4gfVxuY29uc3QgY29udGV4dE1hcE5hbWVzPW93bktleXMoY29udGV4dFByb3ZpZGVyS2l0KTtcbmNvbnN0IGV4dHJhQ29udGV4dE5hbWVzPWxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsY29udGV4dE1hcE5hbWVzKTtcbmV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoY29udGV4dE1hcE5hbWVzLGZhY2V0TmFtZXMpO1xuZXh0cmFGYWNldE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbWlzc2luZyBjb250ZXh0c2A7XG5yZXR1cm4gb2JqZWN0TWFwKGJlaGF2aW9yTWV0aG9kc0tpdCwoYmVoYXZpb3JNZXRob2RzLGZhY2V0TmFtZSk9PlxuZGVmZW5kUHJvdG90eXBlKFxuIGAke3RhZ30gJHtmYWNldE5hbWV9YCxcbmNvbnRleHRQcm92aWRlcktpdFtmYWNldE5hbWVdLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHMsXG5pbnRlcmZhY2VHdWFyZEtpdCYmaW50ZXJmYWNlR3VhcmRLaXRbZmFjZXROYW1lXSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuZGVmZW5kUHJvdG90eXBlS2l0KGRlZmVuZFByb3RvdHlwZUtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiR0VUX0lOVEVSRkFDRV9HVUFSRCI6WyJHRVRfSU5URVJGQUNFX0dVQVJEIl0sImRlZmVuZFByb3RvdHlwZSI6WyJkZWZlbmRQcm90b3R5cGUiXSwiZGVmZW5kUHJvdG90eXBlS2l0IjpbImRlZmVuZFByb3RvdHlwZUtpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABBDDOUQAIAAEACAAAeAAAAQGVuZG8vZmFyLXYwLjIuMTkvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiIsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAZW5kby9ldmVudHVhbC1zZW5kIjpbWyJFIiwiRSJdXSwiQGVuZG8vcGFzcy1zdHlsZSI6W1siRmFyIiwiRmFyIl0sWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl0sWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAd8zmrSgcAAEoHAAAdAAAAQGVuZG8vbWFyc2hhbC12MC44LjYvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vc3JjL3JhbmtPcmRlci5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanNcIiwgW11dLFtcIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9yYW5rT3JkZXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6W1siZGVlcGx5RnVsZmlsbGVkIiwiZGVlcGx5RnVsZmlsbGVkIl1dLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXV0sIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjpbWyJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiXSxbIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSJdLFsiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNFbmNvZGVkUmVtb3RhYmxlIl0sWyJ6ZXJvUGFkIiwiemVyb1BhZCJdLFsicmVjb3JkTmFtZXMiLCJyZWNvcmROYW1lcyJdLFsicmVjb3JkVmFsdWVzIiwicmVjb3JkVmFsdWVzIl1dLCIuL3NyYy9yYW5rT3JkZXIuanMiOltbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIl0sWyJjb21wYXJlUmFuayIsImNvbXBhcmVSYW5rIl0sWyJpc1JhbmtTb3J0ZWQiLCJpc1JhbmtTb3J0ZWQiXSxbInNvcnRCeVJhbmsiLCJzb3J0QnlSYW5rIl0sWyJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQW50aVJhbmsiXSxbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXSxbImdldFBhc3NTdHlsZUNvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiXSxbImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sWyJ1bmlvblJhbmtDb3ZlcnMiLCJ1bmlvblJhbmtDb3ZlcnMiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAA5MahaaDQAAmg0AACsAAABAZW5kby9tYXJzaGFsLXYwLjguNi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJkZWVwbHlGdWxmaWxsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxpc1Byb21pc2UsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5FUmVmPFQ+fSBFUmVmICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZnJvbUVudHJpZXN9PU9iamVjdDtcblxuLyoqXG4gKiBHaXZlbiBhIFBhc3NhYmxlIGB2YWxgIHdob3NlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgbWF5IGNvbnRhaW4gbGVhZlxuICogcHJvbWlzZXMsIHJldHVybiBhIHByb21pc2UgZm9yIGEgcmVwbGFjZW1lbnQgUGFzc2FibGUsXG4gKiB3aGVyZSB0aGF0IHJlcGxhY2VtZW50IGlzICpkZWVwbHkgZnVsZmlsbGVkKiwgaS5lLiwgaXRzXG4gKiBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW55IHByb21pc2VzLlxuICpcbiAqIFRoaXMgaXMgYSBkZWVwIGZvcm0gb2YgYFByb21pc2UuYWxsYCBzcGVjaWFsaXplZCBmb3IgUGFzc2FibGVzLiBGb3IgZWFjaFxuICogZW5jb3VudGVyZWQgcHJvbWlzZSwgcmVwbGFjZSBpdCB3aXRoIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm0gb2ZcbiAqIGl0cyBmdWxmaWxsbWVudC5cbiAqIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgcmVqZWN0LCB0aGVuIHRoZSBwcm9taXNlIGZvciB0aGUgcmVwbGFjZW1lbnRcbiAqIHJlamVjdHMuIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgbmV2ZXIgc2V0dGxlLCB0aGVuIHRoZSBwcm9taXNlIGZvclxuICogdGhlIHJlcGxhY2VtZW50IG5ldmVyIHNldHRsZXMuXG4gKlxuICogSWYgdGhlIHJlcGxhY2VtZW50IHdvdWxkIG5vdCBiZSBQYXNzYWJsZSwgaS5lLiwgaWYgYHZhbGAgaXMgbm90XG4gKiBQYXNzYWJsZSwgb3IgaWYgYW55IG9mIHRoZSB0cmFuc2l0aXZlIHByb21pc2VzIGZ1bGZpbGwgdG8gc29tZXRoaW5nXG4gKiB0aGF0IGlzIG5vdCBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSByZWplY3RzLlxuICpcbiAqIElmIGB2YWxgIG9yIGl0cyBwYXJ0cyBhcmUgbm9uLWtleSBQYXNzYWJsZXMgb25seSAqYmVjYXVzZSogdGhleSBjb250YWluc1xuICogcHJvbWlzZXMsIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm1zIG9mIHZhbCBvciBpdHMgcGFydHMgbWF5IGJlIGtleXMuIFRoaXNcbiAqIGlzIGZvciB0aGUgaGlnaGVyIFwic3RvcmVcIiBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0byBkZXRlcm1pbmUsIGJlY2F1c2UgaXRcbiAqIGRlZmluZXMgdGhlIFwia2V5XCIgbm90aW9uIGluIHF1ZXN0aW9uLlxuICpcbiAqIC8vIFRPRE86IFRoYXQgaGlnaGVyIGxldmVsIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIG1pZ3JhdGVkIGZyb21cbiAqIC8vIGBAYWdvcmljL3N0b3JlYCB0byBgQGVuZG8vcGF0dGVybnNgLiBPbmNlIHRoYXQgaXMgZmFyIGVub3VnaCBhbG9uZyxcbiAqIC8vIHJldmlzZSB0aGUgYWJvdmUgY29tbWVudCB0byBtYXRjaC5cbiAqIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNDUxXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXNzYWJsZT59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWQ9YXN5bmModmFsKT0+e1xuaWYoIWlzT2JqZWN0KHZhbCkpe1xucmV0dXJuIHZhbDtcbiB9XG5pZihpc1Byb21pc2UodmFsKSl7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuY29uc3QgbmFtZXM9b3duS2V5cyh2YWwpO1xuY29uc3QgdmFsUHM9bmFtZXMubWFwKChuYW1lKT0+ZGVlcGx5RnVsZmlsbGVkKHZhbFtuYW1lXSkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5cbmhhcmRlbihmcm9tRW50cmllcyh2YWxzLm1hcCgoYyxpKT0+W25hbWVzW2ldLGNdKSkpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5jb25zdCB2YWxQcz12YWwubWFwKChwKT0+ZGVlcGx5RnVsZmlsbGVkKHApKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+aGFyZGVuKHZhbHMpKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyh2YWwpO1xucmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodmFsLnBheWxvYWQpLChwYXlsb2FkKT0+XG5tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKSk7XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoWCBgVW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9OyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADtyz4DkPwAA5D8AACoAAABAZW5kby9tYXJzaGFsLXYwLjguNi9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGFzc2VydFJlY29yZCxpc0Vycm9yTGlrZSxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvdmVyfSBSYW5rQ292ZXIgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtmcm9tRW50cmllcyxpc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCwgd2UgaGF2ZSBvbmx5XG4gKiBzdHJpbmctbmFtZWQgb3duIHByb3BlcnRpZXMuIGByZWNvcmROYW1lc2AgcmV0dXJucyB0aG9zZSBuYW1lICpyZXZlcnNlKlxuICogc29ydGVkLCBiZWNhdXNlIHRoYXQncyBob3cgcmVjb3JkcyBhcmUgY29tcGFyZWQsIGVuY29kZWQsIGFuZCBzb3J0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmROYW1lcz0ocmVjb3JkKT0+XG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjEwMDM2NTcyNDQqL1xuLyogY29tcGFyZXMgdHdvIHdheXMgb2YgcmV2ZXJzZSBzb3J0aW5nLCBhbmQgc2hvd3MgdGhhdCBgLnNvcnQoKS5yZXZlcnNlKClgKi9cbi8qIGlzIGN1cnJlbnRseSBmYXN0ZXIgb24gTW9kZGFibGUgWFMsIHdoaWxlIHRoZSBvdGhlciB3YXksKi9cbi8qIGAuc29ydChyZXZlcnNlQ29tcGFyYXRvcilgLCBpcyBmYXN0ZXIgb24gdjguIFdlIGN1cnJlbnRseSBjYXJlIG1vcmUgYWJvdXQqL1xuLyogWFMgcGVyZm9ybWFuY2UsIHNvIHdlIHJldmVyc2Ugc29ydCB1c2luZyBgLnNvcnQoKS5yZXZlcnNlKClgLiovXG5oYXJkZW4oLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJlY29yZCkuc29ydCgpLnJldmVyc2UoKSk7JGjigI1fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkIGFuZCBgbmFtZXNgIGlzIGByZWNvcmROYW1lcyhyZWNvcmQpYCxcbiAqIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZFZhbHVlcz0ocmVjb3JkLG5hbWVzKT0+XG5oYXJkZW4obmFtZXMubWFwKChuYW1lKT0+cmVjb3JkW25hbWVdKSk7JGjigI1fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gblxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICB6ZXJvUGFkPShuLHNpemUpPT57XG5jb25zdCBuU3RyPSBgJHtufWA7XG5hc3NlcnQoblN0ci5sZW5ndGg8PXNpemUpO1xuY29uc3Qgc3RyPSBgMDAwMDAwMDAwMDAwMDAwMDAwMDAke25TdHJ9YDtcbmNvbnN0IHJlc3VsdD1zdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGgtc2l6ZSk7XG5hc3NlcnQocmVzdWx0Lmxlbmd0aD09PXNpemUpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLyogVGhpcyBpcyB0aGUgSmF2YVNjcmlwdCBhbmFsb2cgdG8gYSBDIHVuaW9uOiBhIHdheSB0byBtYXAgYmV0d2VlbiBhIGZsb2F0IGFzIGEqL1xuLyogbnVtYmVyIGFuZCB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgZmxvYXQgYXMgYSBidWZmZXIgZnVsbCBvZiBieXRlcy4gIE5vdGUqL1xuLyogdGhhdCB0aGUgbXV0YXRpb24gb2Ygc3RhdGljIHN0YXRlIGhlcmUgbWFrZXMgdGhpcyBpbnZhbGlkIEplc3NpZSBjb2RlLCBidXQqL1xuLyogZG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgdGhlIG51Z2F0b3J5IGFuZCBncmF0dWl0b3VzIGFsbG9jYXRpb25zIHRoYXQgd291bGQqL1xuLyogaGFwcGVuIGV2ZXJ5IHRpbWUgeW91IGRvIGEgY29udmVyc2lvbiAtLSBhbmQgaW4gcHJhY3RpY2FsIHRlcm1zIGl0J3Mgc2FmZSovXG4vKiBiZWNhdXNlIHdlIHB1dCB0aGUgdmFsdWUgaW4gb25lIHNpZGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgdGFrZSBpdCBvdXQgdGhlKi9cbi8qIG90aGVyOyB0aGVyZSBpcyBubyBhY3R1YWwgc3RhdGUgcmV0YWluZWQgaW4gdGhlIGNsYXNzaWMgc2Vuc2UgYW5kIHRodXMgbm8qL1xuLyogcmUtZW50cmFuY3kgaXNzdWUuKi9cbmNvbnN0IGFzTnVtYmVyPW5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHM9bmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8qIEphdmFTY3JpcHQgbnVtYmVycyBhcmUgZW5jb2RlZCBieSBvdXRwdXR0aW5nIHRoZSBiYXNlLTE2Ki9cbi8qIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgSUVFRSBmbG9hdGluZyBwb2ludCovXG4vKiByZXByZXNlbnRhdGlvbi4gIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFsbCBiaXRzIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gYXJlKi9cbi8qIGNvbXBsZW1lbnRlZCBwcmlvciB0byB0aGUgYmFzZS0xNiBjb252ZXJzaW9uLCB3aGlsZSBmb3IgcG9zaXRpdmUgdmFsdWVzLCB0aGUqL1xuLyogc2lnbiBiaXQgaXMgY29tcGxlbWVudGVkLiAgVGhpcyBlbnN1cmVzIGJvdGggdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBiZWZvcmUqL1xuLyogcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGFjY29yZGluZyB0byB0aGVpciBuZWdhdGl2ZSovXG4vKiBtYWduaXR1ZGUgcmF0aGVyIHRoYW4gdGhlaXIgcG9zaXRpdmUgbWFnbml0dWRlLiAgVGhpcyByZXN1bHRzIGluIGFuIEFTQ0lJKi9cbi8qIGVuY29kaW5nIHdob3NlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtZXJpYyBzb3J0IG9yZGVyKi9cbi8qIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMuKi9cblxuLyogVE9ETyBDaG9vc2UgdGhlIHNhbWUgY2Fub25pY2FsIE5hTiBlbmNvZGluZyB0aGF0IGNvc21XYXNtIGFuZCBld2FzbSBjaG9zZS4qL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cz0nZmZmODAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpbmFyeTY0PShuKT0+e1xuLyogTm9ybWFsaXplIC0wIHRvIDAgYW5kIE5hTiB0byBhIGNhbm9uaWNhbCBlbmNvZGluZyovXG5pZihpcyhuLC0wKSl7XG5uPTA7XG4gfWVsc2UgaWYoaXMobixOYU4pKXtcbnJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuIH1cbmFzTnVtYmVyWzBdPW47XG5sZXQgYml0cz1hc0JpdHNbMF07XG5pZihuPDApe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxucmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLDE2KX1gO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZUJpbmFyeTY0PShlbmNvZGVkKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdmJyl8fEZhaWwgYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBiaXRzPUJpZ0ludCggYDB4JHtlbmNvZGVkLnN1YnN0cmluZygxKX1gKTtcbmlmKGVuY29kZWRbMV08JzgnKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbmFzQml0c1swXT1iaXRzO1xuY29uc3QgcmVzdWx0PWFzTnVtYmVyWzBdO1xuIWlzKHJlc3VsdCwtMCl8fEZhaWwgYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtlbmNvZGVkfWA7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogRW5jb2RlIGEgSmF2YVNjcmlwdCBiaWdpbnQgdXNpbmcgYSB2YXJpYW50IG9mIEVsaWFzIGRlbHRhIGNvZGluZywgd2l0aCBhblxuICogaW5pdGlhbCBjb21wb25lbnQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2l0IGNvdW50IGFzIGEgdW5hcnkgc3RyaW5nLCBhXG4gKiBzZWNvbmQgY29tcG9uZW50IGZvciB0aGUgZGVjaW1hbCBkaWdpdCBjb3VudCwgYW5kIGEgdGhpcmQgY29tcG9uZW50IGZvciB0aGVcbiAqIGRlY2ltYWwgZGlnaXRzIHByZWNlZGVkIGJ5IGEgZ3JhdHVpdG91cyBzZXBhcmF0aW5nIGNvbG9uLlxuICogVG8gZW5zdXJlIHRoYXQgdGhlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBvZiBlbmNvZGVkIHZhbHVlcyBtYXRjaGVzIHRoZVxuICogbnVtZXJpYyBzb3J0IG9yZGVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMsIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bmFyeVxuICogcHJlZml4IGFyZSBkaWZmZXJlbnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyAodHlwZSBcIm5cIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mXG4gKiBcIiNcInMgW3doaWNoIHNvcnQgYmVmb3JlIGRlY2ltYWwgZGlnaXRzXSkgdnMuIHBvc2l0aXZlIGFuZCB6ZXJvIHZhbHVlcyAodHlwZVxuICogXCJwXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBcIn5cInMgW3doaWNoIHNvcnQgYWZ0ZXIgZGVjaW1hbCBkaWdpdHNdKSBhbmRcbiAqIGVhY2ggZGVjaW1hbCBkaWdpdCBvZiB0aGUgZW5jb2RpbmcgZm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBpdHNcbiAqIHRlbidzIGNvbXBsZW1lbnQgKHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzIG9mIHRoZSBzYW1lIHNjYWxlIHNvcnQgYnlcbiAqICpkZXNjZW5kaW5nKiBhYnNvbHV0ZSB2YWx1ZSkuXG4gKlxuICogQHBhcmFtIHtiaWdpbnR9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpZ0ludD0obik9PntcbmNvbnN0IGFicz1uPDBuPy1uOm47XG5jb25zdCBuRGlnaXRzPWFicy50b1N0cmluZygpLmxlbmd0aDtcbmNvbnN0IGxEaWdpdHM9bkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbmlmKG48MG4pe1xucmV0dXJuIGBuJHtcbi8qIEEgXCIjXCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nIycucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbigxMCoqbERpZ2l0cy1uRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsJzAnKVxuIH06JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBkaWdpdHMuKi9cbigxMG4qKkJpZ0ludChuRGlnaXRzKStuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsJzAnKVxuIH1gO1xuIH1lbHNle1xucmV0dXJuIGBwJHtcbi8qIEEgXCJ+XCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nficucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbm5EaWdpdHNcbiB9OiR7XG4vKiBUaGUgZGlnaXRzLiovXG5uXG4gfWA7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmNvbnN0IGRlY29kZUJpZ0ludD0oZW5jb2RlZCk9PntcbmNvbnN0IHR5cGVQcmVmaXg9ZW5jb2RlZC5jaGFyQXQoMCk7LyogZmFzdGVyIHRoYW4gZW5jb2RlZFswXSovXG5sZXQgcmVtPWVuY29kZWQuc2xpY2UoMSk7XG50eXBlUHJlZml4PT09J3AnfHxcbnR5cGVQcmVmaXg9PT0nbid8fFxuRmFpbCBgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG5jb25zdCBsRGlnaXRzPXJlbS5zZWFyY2goL1swLTldLykrMTtcbmxEaWdpdHM+PTF8fEZhaWwgYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cy0xKTtcblxucmVtLmxlbmd0aD49bERpZ2l0c3x8RmFpbCBgQ29tcGxldGUgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuY29uc3Qgc25EaWdpdHM9cmVtLnNsaWNlKDAsbERpZ2l0cyk7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMpO1xuL15bMC05XSskLy50ZXN0KHNuRGlnaXRzKXx8RmFpbCBgRGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbkRpZ2l0cz1wYXJzZUludChzbkRpZ2l0cywxMCk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuMDpcIiBhbmQgXCJuMDA64oCmXCIgYW5kIFwibjkxOuKAplwiIHRocm91Z2ggXCJuOTk64oCmXCI/Ki9cbm5EaWdpdHM9MTAqKmxEaWdpdHMtbkRpZ2l0cztcbiB9XG5cbnJlbS5zdGFydHNXaXRoKCc6Jyl8fEZhaWwgYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5yZW09cmVtLnNsaWNlKDEpO1xucmVtLmxlbmd0aD09PW5EaWdpdHN8fFxuRmFpbCBgRml4ZWQtbGVuZ3RoIGRpZ2l0IHNlcXVlbmNlIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuPUJpZ0ludChyZW0pO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjk6MFwiIGFuZCBcIm44OjAwXCIgYW5kIFwibjg6OTFcIiB0aHJvdWdoIFwibjg6OTlcIj8qL1xubj0tKDEwbioqQmlnSW50KG5EaWdpdHMpLW4pO1xuIH1cblxucmV0dXJuIG47XG4gfTtcblxuLyogYCdcXHUwMDAwJ2AgaXMgdGhlIHRlcm1pbmF0b3IgYWZ0ZXIgZWxlbWVudHMuKi9cbi8qIGAnXFx1MDAwMSdgIGlzIHRoZSBiYWNrc2xhc2gtbGlrZSBlc2NhcGUgY2hhcmFjdGVyLCBmb3IqL1xuLyogZXNjYXBpbmcgYm90aCBvZiB0aGVzZSBjaGFyYWN0ZXJzLiovXG5cbmNvbnN0IGVuY29kZUFycmF5PShhcnJheSxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IGNoYXJzPVsnWyddO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpe1xuY29uc3QgZW5jPWVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuZm9yKGNvbnN0IGMgb2YgZW5jKXtcbmlmKGM9PT0nXFx1MDAwMCd8fGM9PT0nXFx1MDAwMScpe1xuY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuIH1cbmNoYXJzLnB1c2goYyk7XG4gfVxuY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuIH1cbnJldHVybiBjaGFycy5qb2luKCcnKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfSBkZWNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5jb25zdCBkZWNvZGVBcnJheT0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmVuY29kZWQuc3RhcnRzV2l0aCgnWycpfHxGYWlsIGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmNvbnN0IGVsZW1lbnRzPVtdO1xuY29uc3QgZWxlbUNoYXJzPVtdO1xuZm9yKGxldCBpPTE7aTxlbmNvZGVkLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGM9ZW5jb2RlZFtpXTtcbmlmKGM9PT0nXFx1MDAwMCcpe1xuY29uc3QgZW5jb2RlZEVsZW1lbnQ9ZWxlbUNoYXJzLmpvaW4oJycpO1xuZWxlbUNoYXJzLmxlbmd0aD0wO1xuY29uc3QgZWxlbWVudD1kZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMScpe1xuaSs9MTtcbmk8ZW5jb2RlZC5sZW5ndGh8fEZhaWwgYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7ZW5jb2RlZH1gO1xuY29uc3QgYzI9ZW5jb2RlZFtpXTtcbmMyPT09J1xcdTAwMDAnfHxcbmMyPT09J1xcdTAwMDEnfHxcbkZhaWwgYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjMn1gO1xuZWxlbUNoYXJzLnB1c2goYzIpO1xuIH1lbHNle1xuZWxlbUNoYXJzLnB1c2goYyk7XG4gfVxuIH1cbmVsZW1DaGFycy5sZW5ndGg9PT0wfHxGYWlsIGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2VuY29kZWR9YDtcbnJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlY29yZD0ocmVjb3JkLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgbmFtZXM9cmVjb3JkTmFtZXMocmVjb3JkKTtcbmNvbnN0IHZhbHVlcz1yZWNvcmRWYWx1ZXMocmVjb3JkLG5hbWVzKTtcbnJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcyx2YWx1ZXNdKSxlbmNvZGVQYXNzYWJsZSl9YDtcbiB9O1xuXG5jb25zdCBkZWNvZGVSZWNvcmQ9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5hc3NlcnQoZW5jb2RlZC5zdGFydHNXaXRoKCcoJykpO1xuY29uc3Qga2V5c3ZhbHM9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xua2V5c3ZhbHMubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFtrZXlzLHZhbHNdPWtleXN2YWxzO1xuXG5wYXNzU3R5bGVPZihrZXlzKT09PSdjb3B5QXJyYXknJiZcbnBhc3NTdHlsZU9mKHZhbHMpPT09J2NvcHlBcnJheScmJlxua2V5cy5sZW5ndGg9PT12YWxzLmxlbmd0aCYmXG5rZXlzLmV2ZXJ5KChrZXkpPT50eXBlb2Yga2V5PT09J3N0cmluZycpfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtlbmNvZGVkfWA7XG5jb25zdCBtYXBFbnRyaWVzPWtleXMubWFwKChrZXksaSk9PltrZXksdmFsc1tpXV0pO1xuY29uc3QgcmVjb3JkPWhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG5hc3NlcnRSZWNvcmQocmVjb3JkLCdkZWNvZGVkIHJlY29yZCcpO1xucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQ9KHRhZ2dlZCxlbmNvZGVQYXNzYWJsZSk9PlxuIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLHRhZ2dlZC5wYXlsb2FkXSksZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJzonKSk7XG5jb25zdCB0YWdwYXlsb2FkPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbnRhZ3BheWxvYWQubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFt0YWcscGF5bG9hZF09dGFncGF5bG9hZDtcbnBhc3NTdHlsZU9mKHRhZyk9PT0nc3RyaW5nJ3x8XG5GYWlsIGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLHBheWxvYWQpO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlUGFzc2FibGU9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmVuY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5lbmNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbmVuY29kZU9wdGlvbnM7XG5cbmNvbnN0IGVuY29kZVBhc3NhYmxlPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG5yZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6e1xucmV0dXJuJ3YnO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4neic7XG4gfVxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gfVxuY2FzZSdzdHJpbmcnOntcbnJldHVybiBgcyR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOntcbnJldHVybiBgYiR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGUocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJ3InKXx8XG5GYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcInJcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCchJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiFcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgnPycpfHxcbkZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBgeSR7bmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKX1gO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xucmV0dXJuIGVuY29kZVJlY29yZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlUGFzc2FibGU9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmRlY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5kZWNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbmRlY29kZU9wdGlvbnM7XG5cbmNvbnN0IGRlY29kZVBhc3NhYmxlPShlbmNvZGVkKT0+e1xuc3dpdGNoKGVuY29kZWQuY2hhckF0KDApKXtcbmNhc2Undic6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd6Jzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnZic6e1xucmV0dXJuIGRlY29kZUJpbmFyeTY0KGVuY29kZWQpO1xuIH1cbmNhc2Uncyc6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpO1xuIH1cbmNhc2UnYic6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpIT09J2ZhbHNlJztcbiB9XG5jYXNlJ24nOlxuY2FzZSdwJzp7XG5yZXR1cm4gZGVjb2RlQmlnSW50KGVuY29kZWQpO1xuIH1cbmNhc2Uncic6e1xucmV0dXJuIGRlY29kZVJlbW90YWJsZShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJz8nOntcbnJldHVybiBkZWNvZGVQcm9taXNlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnISc6e1xucmV0dXJuIGRlY29kZUVycm9yKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UneSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGVkLnN1YnN0cmluZygxKSk7XG4gfVxuY2FzZSdbJzp7XG5yZXR1cm4gZGVjb2RlQXJyYXkoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZScoJzp7XG5yZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnOic6e1xucmV0dXJuIGRlY29kZVRhZ2dlZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGludmFsaWQgZGF0YWJhc2Uga2V5OiAke2VuY29kZWR9YDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG5jb25zdCAgICAgICAgaXNFbmNvZGVkUmVtb3RhYmxlPShlbmNvZGVkKT0+ZW5jb2RlZC5jaGFyQXQoMCk9PT0ncic7JGjigI1fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGUge1JlY29yZDxQYXNzU3R5bGUsIHN0cmluZz59XG4gKiBUaGUgc2luZ2xlIHByZWZpeCBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQgZm9yIGVhY2ggUGFzc1N0eWxlIGNhdGVnb3J5LlxuICogYGJpZ2ludGAgaXMgYSB0d28gY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIGVhY2ggb2YgdGhvc2UgY2hhcmFjdGVyc1xuICogaW5kaXZpZHVhbGx5IGlzIGEgdmFsaWQgYmlnaW50IHByZWZpeC4gYG5gIGZvciBcIm5lZ2F0aXZlXCIgYW5kIGBwYCBmb3JcbiAqIFwicG9zaXRpdmVcIi4gVGhlIG9yZGVyaW5nIG9mIHRoZXNlIHByZWZpeGVzIGlzIHRoZSBzYW1lIGFzIHRoZVxuICogcmFua09yZGVyaW5nIG9mIHRoZWlyIHJlc3BlY3RpdmUgUGFzc1N0eWxlcy4gVGhpcyB0YWJsZSBpcyBpbXBvcnRlZCBieVxuICogcmFua09yZGVyLmpzIGZvciB0aGlzIHB1cnBvc2UuXG4gKlxuICogSW4gYWRkaXRpb24sIGB8YCBpcyB0aGUgcmVtb3RhYmxlLT5vcmRpbmFsIG1hcHBpbmcgcHJlZml4OlxuICogVGhpcyBpcyBub3QgdXNlZCBpbiBjb3ZlcnMgYnV0IGl0IGlzXG4gKiByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBOb3RlIHRoYXQgdGhlIHByZWZpeCBpcyA+IGFueVxuICogcHJlZml4IHVzZWQgYnkgYW55IGNvdmVyIHNvIHRoYXQgb3JkaW5hbCBtYXBwaW5nIGtleXMgYXJlIGFsd2F5cyBvdXRzaWRlXG4gKiB0aGUgcmFuZ2Ugb2YgdmFsaWQgY29sbGVjdGlvbiBlbnRyeSBrZXlzLlxuICovXG5jb25zdCAgICAgICAgcGFzc1N0eWxlUHJlZml4ZXM9e1xuZXJyb3I6JyEnLFxuY29weVJlY29yZDonKCcsXG50YWdnZWQ6JzonLFxucHJvbWlzZTonPycsXG5jb3B5QXJyYXk6J1snLFxuYm9vbGVhbjonYicsXG5udW1iZXI6J2YnLFxuYmlnaW50OiducCcsXG5yZW1vdGFibGU6J3InLFxuc3RyaW5nOidzJyxcbm51bGw6J3YnLFxuc3ltYm9sOid5JyxcbnVuZGVmaW5lZDoneid9OyRo4oCNX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xuXG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUHJlZml4ZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAGyqe0OQAAADkAAACsAAABAZW5kby9tYXJzaGFsLXYwLjguNi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJRQ0xBU1MiLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiLCJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsaXNPYmplY3QsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ1VuaW9ufSBFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbmRlZmluZVByb3BlcnRpZXMsXG5pcyxcbmVudHJpZXMsXG5mcm9tRW50cmllcyxcbmZyZWV6ZX09XG5PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogU3BlY2lhbCBwcm9wZXJ0eSBuYW1lIHRoYXQgaW5kaWNhdGVzIGFuIGVuY29kaW5nIHRoYXQgbmVlZHMgc3BlY2lhbFxuICogZGVjb2RpbmcuXG4gKi9cbmNvbnN0IFFDTEFTUz0nQHFjbGFzcyc7JGjigI1fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtlbmNvZGVkIGlzIEVuY29kaW5nVW5pb259XG4gKi9cbmNvbnN0IGhhc1FDbGFzcz0oZW5jb2RlZCk9Pmhhc093blByb3BlcnR5T2YoZW5jb2RlZCxRQ0xBU1MpO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBxY2xhc3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzPShlbmNvZGVkLHFjbGFzcyk9PlxuaXNPYmplY3QoZW5jb2RlZCkmJlxuIWlzQXJyYXkoZW5jb2RlZCkmJlxuaGFzUUNsYXNzKGVuY29kZWQpJiZcbmVuY29kZWRbUUNMQVNTXT09PXFjbGFzcztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb0NhcERhdGFPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlRXJyb3JUb0NhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0ocmVtKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIpPT5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvQ2FwRGF0YU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IEVuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvQ2FwRGF0YT0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPWRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhPWRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGE9ZG9udEVuY29kZUVycm9yVG9DYXBEYXRhfT1cbmVuY29kZU9wdGlvbnM7XG5cbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRlbHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9DYXBEYXRhYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvQ2FwRGF0YWAgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGFzIFtRQ0xBU1NdIGNvbXBvc2l0ZXMuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdzdHJpbmcnOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJue1tRQ0xBU1NdOid1bmRlZmluZWQnfTtcbiB9XG5jYXNlJ251bWJlcic6e1xuLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm57W1FDTEFTU106J05hTid9O1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOidJbmZpbml0eSd9O1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonLUluZmluaXR5J307XG4gfVxuLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm57XG5bUUNMQVNTXTonYmlnaW50JyxcbmRpZ2l0czpTdHJpbmcocGFzc2FibGUpfTtcblxuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm57XG5bUUNMQVNTXTonc3ltYm9sJyxcbm5hbWV9O1xuXG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLFFDTEFTUykpe1xuLyogSGlsYmVydCBob3RlbCovXG5jb25zdHtbUUNMQVNTXTpxY2xhc3NWYWx1ZSwuLi5yZXN0fT1wYXNzYWJsZTtcbi8qKiBAdHlwZSB7RW5jb2Rpbmd9ICovXG5jb25zdCByZXN1bHQ9e1xuW1FDTEFTU106J2hpbGJlcnQnLFxub3JpZ2luYWw6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocWNsYXNzVmFsdWUpfTtcblxuaWYob3duS2V5cyhyZXN0KS5sZW5ndGg+PTEpe1xuLyogV2UgaGFyZGVuIHRoZSBlbnRpcmUgY2FwRGF0YSBlbmNvZGluZyBiZWZvcmUgd2UgcmV0dXJuIGl0LiovXG4vKiBgZW5jb2RlVG9DYXBEYXRhYCByZXF1aXJlcyB0aGF0IGl0cyBpbnB1dCBiZSBQYXNzYWJsZSwgYW5kKi9cbi8qIHRoZXJlZm9yZSBoYXJkZW5lZC4qL1xuLyogVGhlIGBmcmVlemVgIGhlcmUgaXMgbmVlZGVkIGFueXdheSwgYmVjYXVzZSB0aGUgYHJlc3RgIGlzKi9cbi8qIGZyZXNobHkgY29uc3RydWN0ZWQgYnkgdGhlIGAuLi5gIGFib3ZlLCBhbmQgd2UncmUgdXNpbmcgaXQqL1xuLyogYXMgaW1wdXQgaW4gYW5vdGhlciBjYWxsIHRvIGBlbmNvZGVUb0NhcERhdGFgLiovXG5yZXN1bHQucmVzdD1lbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W25hbWUsZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG5bUUNMQVNTXTondGFnZ2VkJyxcbnRhZzpnZXRUYWcocGFzc2FibGUpLFxucGF5bG9hZDplbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG5wYXNzYWJsZSxcbmVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcblxuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUylcbiB9ICR7cSgnc2xvdCcpfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nc2xvdCcpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ2Vycm9yJykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ2Vycm9yJylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbnJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVQcm9taXNlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0oc2xvdEVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGE9KGVycm9yRW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2hcbiAqIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvblxuICogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmVcbiAqIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuXG4gKlxuICogVGhpcyBzZWVtcyBsaWtlIHRoZSBiZXN0IHN0YXJ0aW5nIHBvaW50IHRvIGluY3JlbWVudGFsbHkgZXZvbHZlIHRvIGFuXG4gKiBBUEkgd2hlcmUgdGhlc2UgY2FuIHJlbGlhYmx5IGRpZmZlci5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzRcbiAqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbUNhcERhdGE9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhPWRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhfT1cbmRlY29kZU9wdGlvbnM7XG5cbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPT09ZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhfHxcbkZhaWwgYEFuIGltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uIGZvciBub3c6IElmIGVpdGhlciBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSBvciBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lOiAke3EoXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSlcbiB9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbi8qKlxuICogYGRlY29kZUZyb21DYXBEYXRhYCBtYXkgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBqc29uRW5jb2RlZGBcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvQ2FwRGF0YWBcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbUNhcERhdGFgIGNhbm5vdCByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbUNhcERhdGFgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30ganNvbkVuY29kZWQgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tQ2FwRGF0YT0oanNvbkVuY29kZWQpPT57XG5pZighaXNPYmplY3QoanNvbkVuY29kZWQpKXtcbi8qIHByaW1pdGl2ZXMgcGFzcyB0aHJvdWdoKi9cbnJldHVybiBqc29uRW5jb2RlZDtcbiB9XG5pZihpc0FycmF5KGpzb25FbmNvZGVkKSl7XG5yZXR1cm4ganNvbkVuY29kZWQubWFwKChlbmNvZGVkVmFsKT0+ZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCkpO1xuIH1lbHNlIGlmKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpe1xuY29uc3QgcWNsYXNzPWpzb25FbmNvZGVkW1FDTEFTU107XG50eXBlb2YgcWNsYXNzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCAke3EoUUNMQVNTKX0gdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuc3dpdGNoKHFjbGFzcyl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZSdJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtkaWdpdHN9PWpzb25FbmNvZGVkO1xudHlwZW9mIGRpZ2l0cz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbnJldHVybiBCaWdJbnQoZGlnaXRzKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogRGVwcmVjYXRlZCBxY2xhc3MuIFRPRE8gbWFrZSBjb25kaXRpb25hbCovXG4vKiBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRXZlbnR1YWxseSByZW1vdmUsIGJ1dCBhZnRlciBjb25maWRlbnQqL1xuLyogdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBzdXBwb3J0ZWQgc2VuZGVycy4qL1xuLyoqL1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbnJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e25hbWV9PWpzb25FbmNvZGVkO1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e3RhZyxwYXlsb2FkfT1qc29uRW5jb2RlZDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gfVxuY2FzZSdzbG90Jzp7XG4vKiBTZWUgbm90ZSBhYm92ZSBhYm91dCBob3cgdGhlIGN1cnJlbnQgZW5jb2RpbmcgY2Fubm90IHJlbGlhYmx5Ki9cbi8qIGRpc3Rpbmd1aXNoIHdoaWNoIHdlIHNob3VsZCBjYWxsLCBzbyBpbiB0aGUgbm9uLWRlZmF1bHQgY2FzZSovXG4vKiBib3RoIG11c3QgYmUgdGhlIHNhbWUgYW5kIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHdlIGNhbGwuKi9cbmNvbnN0IGRlY29kZWQ9ZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuLyogQkVXQVJFOiBjYXBkYXRhIGRvZXMgbm90IGNoZWNrIHRoYXQgYGRlY29kZWRgIGlzKi9cbi8qIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZSwgc2luY2UgdGhhdCB3b3VsZCBicmVhayBzb21lKi9cbi8qIGNhcGRhdGEgY2xpZW50cy4gV2UgYXJlIGRlcHJlY2F0aW5nIGNhcGRhdGEsIGFuZCB0aGVzZSBjbGllbnRzKi9cbi8qIHdpbGwgbmVlZCB0byB1cGRhdGUgYmVmb3JlIHN3aXRjaGluZyB0byBzbWFsbGNhcHMuKi9cbnJldHVybiBkZWNvZGVkO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGRlY29kZWQ9ZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG5pZihwYXNzU3R5bGVPZihkZWNvZGVkKT09PSdlcnJvcicpe1xucmV0dXJuIGRlY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbUNhcERhdGEgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke2RlY29kZWR9YDtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtvcmlnaW5hbCxyZXN0fT1qc29uRW5jb2RlZDtcbmhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ29yaWdpbmFsJyl8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7anNvbkVuY29kZWR9YDtcbi8qIERvbid0IGhhcmRlbiBzaW5jZSB3ZSdyZSBub3QgZG9uZSBtdXRhdGluZyBpdCovXG5jb25zdCByZXN1bHQ9e1tRQ0xBU1NdOmRlY29kZUZyb21DYXBEYXRhKG9yaWdpbmFsKX07XG5pZihoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdyZXN0Jykpe1xuY29uc3QgaXNOb25FbXB0eU9iamVjdD1cbnR5cGVvZiByZXN0PT09J29iamVjdCcmJlxucmVzdCE9PW51bGwmJlxub3duS2V5cyhyZXN0KS5sZW5ndGg+PTE7XG5pZighaXNOb25FbXB0eU9iamVjdCl7XG50aHJvdyBGYWlsIGBSZXN0IGVuY29kaW5nIG11c3QgYmUgYSBub24tZW1wdHkgb2JqZWN0OiAke3Jlc3R9YDtcbiB9XG5jb25zdCByZXN0T2JqPWRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuLyogVE9ETyByZWFsbHkgc2hvdWxkIGFzc2VydCB0aGF0IGBwYXNzU3R5bGVPZihyZXN0KWAgaXMqL1xuLyogYCdjb3B5UmVjb3JkJ2AgYnV0IHdlJ2QgaGF2ZSB0byBoYXJkZW4gaXQgYW5kIGl0IGlzIHRvbyovXG4vKiBlYXJseSB0byBkbyB0aGF0LiovXG4haGFzT3duUHJvcGVydHlPZihyZXN0T2JqLFFDTEFTUyl8fFxuRmFpbCBgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoaXMgaXMgdGhlIGVycm9yIGNhc2Ugd2UncmUgdGVzdGluZyBmb3IqL1xuY2FzZSdpYmlkJzp7XG50aHJvdyBGYWlsIGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbnFjbGFzcylcbiB9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9ZWxzZXtcbmFzc2VydCh0eXBlb2YganNvbkVuY29kZWQ9PT0nb2JqZWN0JyYmanNvbkVuY29kZWQhPT1udWxsKTtcbmNvbnN0IGRlY29kZUVudHJ5PShbbmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgJHtxKG5hbWUpfSBvZiAke2pzb25FbmNvZGVkfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21DYXBEYXRhKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADD18oB3TsAAN07AAAtAAAAQGVuZG8vbWFyc2hhbC12MC44LjYvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ30gU21hbGxjYXBzRW5jb2RpbmcgKlgvKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2RpbmdVbmlvbn0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqWC8qL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nICovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtpcyxlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IEJBTkc9JyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIPSctJy5jaGFyQ29kZUF0KDApO1xuXG4vKipcbiAqIEFuIGBlbmNvZGVUb1NtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYSBwYXNzYWJsZSBhbmQgcmV0dXJucyBhXG4gKiBKU09OLXJlcHJlc2VudGFibGUgb2JqZWN0IChpLmUuLCByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoXG4gKiBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXBsYWNlcnMgb3IgcmV2aXZlcnNcbiAqIHJldHVybnMgYW4gZXF1aXZhbGVudCBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBvYmplY3QgaWRlbnRpdHkpLlxuICogV2UgY2FsbCB0aGlzIHJlcHJlc2VudGF0aW9uIGEgU21hbGxjYXBzIEVuY29kaW5nLlxuICpcbiAqIEEgYGRlY29kZUZyb21TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGFzIGFyZ3VtZW50IHdoYXQgaXRcbiAqICphc3N1bWVzKiBpcyB0aGUgcmVzdWx0IG9mIGEgcGxhaW4gYEpTT04ucGFyc2VgIHdpdGggbm8gcmVzb2x2ZXIuIEl0IHRoZW5cbiAqIG11c3QgdmFsaWRhdGUgdGhhdCBpdCBpcyBhIHZhbGlkIFNtYWxsY2FwcyBFbmNvZGluZywgYW5kIGlmIGl0IGlzLFxuICogcmV0dXJuIGEgY29ycmVzcG9uZGluZyBwYXNzYWJsZS5cbiAqXG4gKiBTbWFsbGNhcHMgY29uc2lkZXJzIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gYCFgIChhc2NpaSBjb2RlIDMzLCBCQU5HKVxuICogYW5kIGAtYCAoYXNjaWkgY29kZSA0NSwgREFTSCkgdG8gYmUgc3BlY2lhbCBwcmVmaXhlcyBhbGxvd2luZ1xuICogcmVwcmVzZW50YXRpb24gb2YgSlNPTi1pbmNvbXBhdGlibGUgZGF0YSB1c2luZyBzdHJpbmdzLlxuICogVGhlc2UgY2hhcmFjdGVycywgaW4gb3JkZXIsIGFyZSBgIVwiIyQlJicoKSorLC1gXG4gKiBPZiB0aGVzZSwgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICogYCFgIC0gZXNjYXBlZCBzdHJpbmdcbiAqICAqIGArYCAtIG5vbi1uZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAtYCAtIG5lZ2F0aXZlIGJpZ2ludFxuICogICogYCNgIC0gbWFuaWZlc3QgY29uc3RhbnRcbiAqICAqIGAlYCAtIHN5bWJvbFxuICogICogYCRgIC0gcmVtb3RhYmxlXG4gKiAgKiBgJmAgLSBwcm9taXNlXG4gKlxuICogQWxsIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyAoYFwiJygpKixgKSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4gKlxuICogVGhlIG1hbmlmZXN0IGNvbnN0YW50cyB0aGF0IHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyBmb3IgdmFsdWVzOlxuICogICogYCN1bmRlZmluZWRgXG4gKiAgKiBgI05hTmBcbiAqICAqIGAjSW5maW5pdHlgXG4gKiAgKiBgIy1JbmZpbml0eWBcbiAqXG4gKiBhbmQgZm9yIHByb3BlcnR5IG5hbWVzIGFuYWxvZ291cyB0byBjYXBkYXRhIEBxY2xhc3M6XG4gKiAgKiBgI3RhZ2BcbiAqICAqIGAjZXJyb3JgXG4gKlxuICogQWxsIG90aGVyIGVuY29kZWQgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgI2AgYXJlIHJlc2VydmVkIGZvclxuICogZnV0dXJlIHVzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFN0clxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWw9KGVuY29kZWRTdHIpPT57XG5pZihlbmNvZGVkU3RyPT09Jycpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIGNoYXJDb2RlQXQoMCkgYW5kIG51bWJlciBjb21wYXJlIGlzIGEgYml0IGZhc3Rlci4qL1xuY29uc3QgY29kZT1lbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgeW9kYSovXG5yZXR1cm4gQkFORzw9Y29kZSYmY29kZTw9REFTSDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIpPT5cbkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIGVuY29kZU9wdGlvbnMgaXMgYWN0dWFsbHkgb3B0aW9uYWwsIGJ1dCBub3QgbWFya2VkIGFzIHN1Y2ggdG8gd29yayBhcm91bmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAyODZcbiAqXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9TbWFsbGNhcHM9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz1kb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz1kb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwc309XG5lbmNvZGVPcHRpb25zO1xuXG5jb25zdCBhc3NlcnRFbmNvZGVkRXJyb3I9KGVuY29kaW5nKT0+e1xudHlwZW9mIGVuY29kaW5nPT09J29iamVjdCcmJmhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpfHxcbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKFxuZW5jb2RpbmcpXG4gfWA7XG4vKiBBc3NlcnQgdGhhdCB0aGUgI2Vycm9yIHByb3BlcnR5IGRlY29kZXMgdG8gYSBzdHJpbmcuKi9cbmNvbnN0IG1lc3NhZ2U9ZW5jb2RpbmdbJyNlcnJvciddO1xudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJyYmKFxuIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSl8fG1lc3NhZ2Uuc3RhcnRzV2l0aCgnIScpKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIHN0cmluZyBtZXNzYWdlOiAke3EobWVzc2FnZSl9YDtcbiB9O1xuXG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtTbWFsbGNhcHNFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvU21hbGxjYXBzYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvU21hbGxjYXBzYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cj0ocGFzc2FibGUpPT57XG4vKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbi8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBpbnRvIHNtYWxsY2FwcyBzdHJpbmdzLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzp7XG4vKiBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmlmKHN0YXJ0c1NwZWNpYWwocGFzc2FibGUpKXtcbi8qIFN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGEgc3BlY2lhbCBjaGFyIGFyZSBxdW90ZWQgd2l0aCBgIWAuKi9cbi8qIFNpbmNlIGAhYCBpcyBpdHNlbGYgYSBzcGVjaWFsIGNoYXJhY3RlciwgdGhpcyB0cml2aWFsbHkgZG9lcyovXG4vKiB0aGUgSGlsYmVydCBob3RlbC4gQWxzbywgc2luY2UgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUqL1xuLyogYSBjb250aW51b3VzIHN1YnJhbmdlIG9mIGFzY2lpLCB0aGlzIHF1b3RpbmcgaXMgc29ydC1vcmRlciovXG4vKiBwcmVzZXJ2aW5nLiovXG5yZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gfVxuLyogQWxsIG90aGVyIHN0cmluZ3MgcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4nI3VuZGVmaW5lZCc7XG4gfVxuY2FzZSdudW1iZXInOntcbi8qIFNwZWNpYWwtY2FzZSBudW1iZXJzIHdpdGggbm8gZGlnaXQtYmFzZWQgcmVwcmVzZW50YXRpb24uKi9cbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJuJyNOYU4nO1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJuJyNJbmZpbml0eSc7XG4gfWVsc2UgaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJuJyMtSW5maW5pdHknO1xuIH1cbi8qIFBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGVsc2UsIHJlcGxhY2luZyAtMCB3aXRoIDAuKi9cbnJldHVybiBpcyhwYXNzYWJsZSwtMCk/MDpwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3Qgc3RyPVN0cmluZyhwYXNzYWJsZSk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7YmlnaW50fSAqL3Bhc3NhYmxlPDBuP3N0cjpgKyR7c3RyfWApO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm4gYCUke25hbWV9YDtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4vKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbmNvbnN0IG5hbWVzPW93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbnJldHVybiBmcm9tRW50cmllcyhcbm5hbWVzLm1hcCgobmFtZSk9PltcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKV0pKTtcblxuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbicjdGFnJzplbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKGdldFRhZyhwYXNzYWJsZSkpLFxucGF5bG9hZDplbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5zdGFydHNXaXRoKCckJykpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5zdGFydHNXaXRoKCcmJykpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCImXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5hc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbmNvbnN0IHJlc3VsdD1oYXJkZW4oXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpKTtcblxuYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvU21hbGxjYXBzKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5oYXJkZW4obWFrZUVuY29kZVRvU21hbGxjYXBzKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7cShlbmNvZGluZyl9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogU21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21TbWFsbGNhcHM9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9ZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwc309XG5kZWNvZGVPcHRpb25zO1xuXG4vKipcbiAqIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtYXkgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBlbmNvZGluZ2BcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvU21hbGxjYXBzYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBjYW5ub3QgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21TbWFsbGNhcHNgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtTbWFsbGNhcHNFbmNvZGluZ30gZW5jb2RpbmcgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PntcbnN3aXRjaCh0eXBlb2YgZW5jb2Rpbmcpe1xuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmlmKCFzdGFydHNTcGVjaWFsKGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY29uc3QgYz1lbmNvZGluZy5jaGFyQXQoMCk7XG5zd2l0Y2goYyl7XG5jYXNlJyEnOntcbi8qIHVuLWhpbGJlcnQtaWZ5IHRoZSBzdHJpbmcqL1xucmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuIH1cbmNhc2UnJSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gfVxuY2FzZScjJzp7XG5zd2l0Y2goZW5jb2Rpbmcpe1xuY2FzZScjdW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnI05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJyNJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnIy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH1cbmNhc2UnKyc6XG5jYXNlJy0nOntcbnJldHVybiBCaWdJbnQoZW5jb2RpbmcpO1xuIH1cbmNhc2UnJCc6e1xuY29uc3QgcmVzdWx0PWRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3JlbW90YWJsZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZScmJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3Byb21pc2UnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBTcGVjaWFsIGNoYXIgJHtxKFxuYylcbiB9IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlOiAke2VuY29kaW5nfWA7XG4gfX1cblxuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihlbmNvZGluZz09PW51bGwpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cblxuaWYoaXNBcnJheShlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nLm1hcCgodmFsKT0+ZGVjb2RlRnJvbVNtYWxsY2Fwcyh2YWwpKTtcbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyN0YWcnKSl7XG5jb25zdHsnI3RhZyc6dGFnLHBheWxvYWQsLi4ucmVzdH09ZW5jb2Rpbmc7XG50eXBlb2YgdGFnPT09J3N0cmluZyd8fFxuRmFpbCBgVmFsdWUgb2YgXCIjdGFnXCIsIHRoZSB0YWcsIG11c3QgYmUgYSBzdHJpbmc6ICR7ZW5jb2Rpbmd9YDtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGAjdGFnIHJlY29yZCB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShvd25LZXlzKHJlc3QpKX1gO1xucmV0dXJuIG1ha2VUYWdnZWQoXG5kZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG5kZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpKTtcblxuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJykpe1xuY29uc3QgcmVzdWx0PWRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbnBhc3NTdHlsZU9mKHJlc3VsdCk9PT0nZXJyb3InfHxcbkZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5cbmNvbnN0IGRlY29kZUVudHJ5PShbZW5jb2RlZE5hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgZW5jb2RlZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbmVuY29kZWROYW1lKVxuIH0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4hZW5jb2RlZE5hbWUuc3RhcnRzV2l0aCgnIycpfHxcbkZhaWwgYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuY29uc3QgbmFtZT1kZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG50eXBlb2YgZW5jb2RpbmcpXG4gfTogJHtlbmNvZGluZ31gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAf21Zn7gqAAC4KgAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC42L3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsUUNMQVNTOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9hID0+IChRQ0xBU1MgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2FwRGF0YTxUPn0gQ2FwRGF0YSAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtzdHJpbmdpZnk6cXVvdGV9PUpTT047XG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5kZW50ZXJcbiAqIEBwcm9wZXJ0eSB7KG9wZW5CcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gb3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7KHRva2VuOiBzdHJpbmcpID0+IG51bWJlcn0gbmV4dFxuICogQHByb3BlcnR5IHsoY2xvc2VCcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gY2xvc2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBkb25lXG4gKi9cblxuLyoqXG4gKiBHZW5lcm91cyB3aGl0ZXNwYWNlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyPSgpPT57XG5jb25zdCBzdHJpbmdzPVtdO1xubGV0IGxldmVsPTA7XG5sZXQgbmVlZFNwYWNlPWZhbHNlO1xuY29uc3QgbGluZT0oKT0+e1xubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywnICAnLnJlcGVhdChsZXZlbCkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+e1xubGV2ZWwrPTE7XG5pZihuZWVkU3BhY2Upe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gfSxcbmxpbmUsXG5uZXh0Oih0b2tlbik9PntcbmlmKG5lZWRTcGFjZSYmdG9rZW4hPT0nLCcpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPXRydWU7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmFzc2VydChsZXZlbD49MSk7XG5sZXZlbC09MTtcbmxpbmUoKTtcbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+e1xuYXNzZXJ0LmVxdWFsKGxldmVsLDApO1xucmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Ygb25lIHRva2VuIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlclxuICogb2YgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGlzIHBhdHRlcm4sIHRoZW4gdGhlIHR3byB0b2tlbnMgbXVzdCBiZVxuICogc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgdG8gcHJlc2VydmUgdGhlaXIgbWVhbmluZy4gT3RoZXJ3aXNlIHRoZVxuICogd2hpdGVzcGFjZSBpbiB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBUaGUgYDwhYCBhbmQgYC0+YCBjYXNlcyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGZvcm1hdGlvbiBvZiBhblxuICogaHRtbC1saWtlIGNvbW1lbnQuIEkgZG9uJ3QgdGhpbmsgdGhlIGRvdWJsZSBhbmdsZSBicmFja2V0cyBhcmUgYWN0dWFsbHlcbiAqIG5lZWRlZCBidXQgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgaXQgZW5vdWdoIHRvIHJlbW92ZSB0aGVtLlxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybj0vXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qKlxuICogTWluaW11bSB3aGl0ZXNwYWNlIG5lZWRlZCB0byBwcmVzZXZlIG1lYW5pbmcuXG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlcj0oKT0+e1xuLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbmNvbnN0IHN0cmluZ3M9W107XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+c3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KSxcbmxpbmU6KCk9PnN0cmluZ3MubGVuZ3RoLFxubmV4dDoodG9rZW4pPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSl7XG5jb25zdCBsYXN0PXN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV07XG5pZihsYXN0Lmxlbmd0aD49MSYmdG9rZW4ubGVuZ3RoPj0xKXtcbmNvbnN0IHBhaXI9IGAke2xhc3RbbGFzdC5sZW5ndGgtMV19JHt0b2tlblswXX1gO1xuaWYoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG4gfVxuIH1cbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEmJnN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV09PT0nLCcpe1xuc3RyaW5ncy5wb3AoKTtcbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PnN0cmluZ3Muam9pbignJyl9KTtcblxuIH07XG5cbmNvbnN0IGlkZW50UGF0dGVybj0vXlthLXpBLVpdXFx3KiQvO1xuaGFyZGVuKGlkZW50UGF0dGVybik7XG5jb25zdCBBdEF0UHJlZml4UGF0dGVybj0vXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGluZ1xuICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkSW5kZW50XG4gKiBAcGFyYW0ge2FueVtdfSBbc2xvdHNdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVUb0p1c3Rpbj0oZW5jb2Rpbmcsc2hvdWxkSW5kZW50PWZhbHNlLHNsb3RzPVtdKT0+e1xuLyoqXG4gKiBUaGUgZmlyc3QgcGFzcyBkb2VzIHNvbWUgaW5wdXQgdmFsaWRhdGlvbi5cbiAqIEl0cyBjb250cm9sIGZsb3cgc2hvdWxkIG1pcnJvciBgcmVjdXJgIGFzIGNsb3NlbHkgYXMgcG9zc2libGVcbiAqIGFuZCB0aGUgdHdvIHNob3VsZCBiZSBtYWludGFpbmVkIHRvZ2V0aGVyLiBUaGV5IG11c3QgdmlzaXQgZXZlcnl0aGluZ1xuICogaW4gdGhlIHNhbWUgb3JkZXIuXG4gKlxuICogVE9ETyBub3cgdGhhdCBpYmlkcyBhcmUgZ29uZSwgd2Ugc2hvdWxkIGZvbGQgdGhpcyBiYWNrIHRvZ2V0aGVyIGludG9cbiAqIG9uZSB2YWxpZGF0aW5nIHBhc3MuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IHByZXBhcmU9KHJhd1RyZWUpPT57XG5pZighaXNPYmplY3QocmF3VHJlZSkpe1xucmV0dXJuO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xudHlwZW9mIHFjbGFzcz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbnJldHVybjtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xudHlwZW9mIGRpZ2l0cz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbnJldHVybjtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xucmV0dXJuO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5yZXR1cm47XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZih0YWcsJ3N0cmluZycpO1xucHJlcGFyZShwYXlsb2FkKTtcbnJldHVybjtcbiB9XG5jYXNlJ3Nsb3QnOntcbmNvbnN0e2luZGV4LGlmYWNlfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5OYXQoaW5kZXgpO1xuaWYoaWZhY2UhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihpZmFjZSwnc3RyaW5nJyk7XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbidvcmlnaW5hbCdpbiByYXdUcmVlfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbnByZXBhcmUob3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5pZih0eXBlb2YgcmVzdCE9PSdvYmplY3QnKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGA7XG4gfVxuaWYocmVzdD09PW51bGwpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIG51bGxgO1xuIH1cbmlmKGlzQXJyYXkocmVzdCkpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiB9XG5pZihRQ0xBU1MgaW4gcmVzdCl7XG50aHJvdyBGYWlsIGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuIH1cbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xucHJlcGFyZShyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIG5hbWUpfWA7XG5nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpIT09dW5kZWZpbmVkfHxcbkZhaWwgYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gO1xucmV0dXJuO1xuIH1cblxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbnByZXBhcmUocmF3VHJlZVtpXSk7XG4gfVxuIH1lbHNle1xuY29uc3QgbmFtZXM9b3duS2V5cyhyYXdUcmVlKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gfVxucHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiB9XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VJbmRlbnRlcj1zaG91bGRJbmRlbnQ/bWFrZVllc0luZGVudGVyOm1ha2VOb0luZGVudGVyO1xubGV0IG91dD1tYWtlSW5kZW50ZXIoKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFzcyByZWN1cnNpb24gYWZ0ZXIgdGhlIGZpcnN0IHBhc3MgYHByZXBhcmVgLlxuICogVGhlIGZpcnN0IHBhc3MgZGlkIHNvbWUgaW5wdXQgdmFsaWRhdGlvbiBzb1xuICogaGVyZSB3ZSBjYW4gc2FmZWx5IGFzc3VtZSBldmVyeXRoaW5nIHRob3NlIHRoaW5ncyBhcmUgdmFsaWRhdGVkLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZT0ocmF3VHJlZSk9Pntcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gfTtcblxuY29uc3QgZGVjb2RlUHJvcGVydHk9KG5hbWUsdmFsdWUpPT57XG5vdXQubGluZSgpO1xuaWYobmFtZT09PSdfX3Byb3RvX18nKXtcbi8qIEphdmFTY3JpcHQgaW50ZXJwcmV0cyBge19fcHJvdG9fXzogeCwgLi4ufWAqL1xuLyogYXMgbWFraW5nIGFuIG9iamVjdCBpbmhlcml0aW5nIGZyb20gYHhgLCB3aGVyZWFzKi9cbi8qIGluIEpTT04gaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgbmFtZS4gUHJlc2VydmUgdGhlKi9cbi8qIEpTT04gbWVhbmluZy4qL1xub3V0Lm5leHQoIGBbXCJfX3Byb3RvX19cIl06YCk7XG4gfWVsc2UgaWYoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpe1xub3V0Lm5leHQoIGAke25hbWV9OmApO1xuIH1lbHNle1xub3V0Lm5leHQoIGAke3F1b3RlKG5hbWUpfTpgKTtcbiB9XG5kZWNvZGUodmFsdWUpO1xub3V0Lm5leHQoJywnKTtcbiB9O1xuXG4vKipcbiAqIE1vZGVsZWQgYWZ0ZXIgYGZ1bGxSZXZpdmVgIGluIG1hcnNoYWwuanNcbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByZWN1cj0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG4vKiBwcmltaXRpdmVzIGdldCBxdW90ZWQqL1xucmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YocWNsYXNzLCdzdHJpbmcnKTtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4vKiBTd2l0Y2hpbmcgb24gYGVuY29kZWRbUUNMQVNTXWAgKG9yIGFueXRoaW5nIGxlc3MgZGlyZWN0LCBsaWtlKi9cbi8qIGBxY2xhc3NgKSBkb2VzIG5vdCBkaXNjcmltaW5hdGUgcmF3VHJlZSBpbiB0eXBlc2NyaXB0QDQuMi4zIGFuZCovXG4vKiBlYXJsaWVyLiovXG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG4vKiBUaGVpciBxY2xhc3MgaXMgdGhlaXIgZXhwcmVzc2lvbiBzb3VyY2UuKi9cbnJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGRpZ2l0cywnc3RyaW5nJyk7XG5yZXR1cm4gb3V0Lm5leHQoIGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogVE9ETyBkZXByZWNhdGVkLiBFdmVudHVhbGx5IHJlbW92ZS4qL1xucmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5jb25zdCByZWdpc3RlcmVkTmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihyZWdpc3RlcmVkTmFtZT09PXVuZGVmaW5lZCl7XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuYXNzZXJ0KG1hdGNoIT09bnVsbCk7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5hc3NlcnQoU3ltYm9sW3N1ZmZpeF09PT1zeW0pO1xuYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLiR7c3VmZml4fWApO1xuIH1cbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC5mb3IoJHtxdW90ZShyZWdpc3RlcmVkTmFtZSl9KWApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbm91dC5uZXh0KCBgbWFrZVRhZ2dlZCgke3F1b3RlKHRhZyl9LGApO1xuZGVjb2RlKHBheWxvYWQpO1xucmV0dXJuIG91dC5uZXh0KCcpJyk7XG4gfVxuXG5jYXNlJ3Nsb3QnOntcbmxldHtpZmFjZX09cmF3VHJlZTtcbmNvbnN0IGluZGV4PU51bWJlcihOYXQocmF3VHJlZS5pbmRleCkpO1xuY29uc3QgbmVzdGVkUmVuZGVyPShhcmcpPT57XG5jb25zdCBvbGRPdXQ9b3V0O1xudHJ5e1xub3V0PW1ha2VOb0luZGVudGVyKCk7XG5kZWNvZGUoYXJnKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH1maW5hbGx5e1xub3V0PW9sZE91dDtcbiB9XG4gfTtcbmlmKGluZGV4PHNsb3RzLmxlbmd0aCl7XG5jb25zdCBzbG90PW5lc3RlZFJlbmRlcihzbG90c1tpbmRleF0pO1xuaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdFRvVmFsKCR7c2xvdH0pYCk7XG4gfVxuaWZhY2U9bmVzdGVkUmVuZGVyKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3RUb1ZhbCgke3Nsb3R9LCR7aWZhY2V9KWApO1xuIH1lbHNlIGlmKGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0pYCk7XG4gfVxuaWZhY2U9bmVzdGVkUmVuZGVyKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0sJHtpZmFjZX0pYCk7XG4gfVxuXG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG5vdXQub3BlbigneycpO1xuZGVjb2RlUHJvcGVydHkoUUNMQVNTLG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihyZXN0LCdvYmplY3QnKTtcbmFzc2VydChyZXN0IT09bnVsbCk7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbm5hbWUpXG4gfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgO1xuIH1cbmRlY29kZVByb3BlcnR5KG5hbWUscmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG5cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbnJldHVybiBvdXQubmV4dCggYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gfVxuXG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCdbXScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ1snKTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xub3V0LmxpbmUoKTtcbmRlY29kZShyYXdUcmVlW2ldKTtcbm91dC5uZXh0KCcsJyk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnXScpO1xuIH1cbiB9ZWxzZXtcbi8qIHJhd1RyZWUgaXMgYW4gYEVuY29kaW5nUmVjb3JkYCB3aGljaCBvbmx5IGhhcyBzdHJpbmcga2V5cywqL1xuLyogYnV0IHNpbmNlIG93bktleXMgaXMgbm90IGdlbmVyaWMsIGl0IGNhbid0IHByb3BhZ2F0ZSB0aGF0Ki9cbmNvbnN0IG5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyYXdUcmVlKTtcbmlmKG5hbWVzLmxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCd7fScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ3snKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmRlY29kZVByb3BlcnR5KG5hbWUscmF3VHJlZVtuYW1lXSk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cbiB9XG4gfTtcbnByZXBhcmUoZW5jb2RpbmcpO1xuZGVjb2RlKGVuY29kaW5nKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH07JGjigI1fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABPT1RvcBgAA3AYAAC0AAABAZW5kby9tYXJzaGFsLXYwLjguNi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZU1hcnNoYWw7JGjigI1faW1wb3J0cyhbW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFZhbFRvU2xvdD0odmFsKT0+XG5GYWlsIGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWw9KHNsb3QsX2lmYWNlKT0+XG5GYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90cyAke3Nsb3R9YDtcblxuY29uc3QgYmFkQXJyYXlIYW5kbGVyPWhhcmRlbih7XG5nZXQ6KF90YXJnZXQsbmFtZSxfcmVjZWl2ZXIpPT57XG5pZihuYW1lPT09J2xlbmd0aCcpe1xucmV0dXJuIDA7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gfX0pO1xuXG5cbmNvbnN0IGJhZEFycmF5PWhhcmRlbihuZXcgUHJveHkoaGFyZGVuKFtdKSxiYWRBcnJheUhhbmRsZXIpKTtcblxuY29uc3R7c2VyaWFsaXplLHVuc2VyaWFsaXplfT1tYWtlTWFyc2hhbChcbmRvTm90Q29udmVydFZhbFRvU2xvdCxcbmRvTm90Q29udmVydFNsb3RUb1ZhbCxcbntcbmVycm9yVGFnZ2luZzonb2ZmJyxcbi8qIFRPRE8gZml4IHRlc3RzIHRvIHdvcmtzIHdpdGggc21hbGxjYXBzLiovXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidjYXBkYXRhJ30pO1xuXG5cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHN0cmluZ2lmeT0odmFsKT0+c2VyaWFsaXplKHZhbCkuYm9keTskaOKAjV9vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBwYXJzZT0oc3RyKT0+XG51bnNlcmlhbGl6ZShcbmhhcmRlbih7XG5ib2R5OnN0cixcbnNsb3RzOmJhZEFycmF5fSkpOyRo4oCNX29uY2UucGFyc2UocGFyc2UpO1xuXG5cbmhhcmRlbihwYXJzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAQCg0W7DIAAOwyAAAjAAAAQGVuZG8vbWFyc2hhbC12MC44LjYvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5T2YsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRo4oCNX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5NYWtlTWFyc2hhbE9wdGlvbnN9IE1ha2VNYXJzaGFsT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxTbG90Pn0gQ29udmVydFNsb3RUb1ZhbCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxTbG90Pn0gQ29udmVydFZhbFRvU2xvdCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVG9DYXBEYXRhPFNsb3Q+fSBUb0NhcERhdGEgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkZyb21DYXBEYXRhPFNsb3Q+fSBGcm9tQ2FwRGF0YSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIHtDb252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm49KHgpPT54O1xuLyoqIEB0eXBlIHtDb252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkZWZhdWx0U2xvdFRvVmFsRm49KHgsXyk9Png7XG5cbi8qKlxuICogQHRlbXBsYXRlIFNsb3RcbiAqIEBwYXJhbSB7Q29udmVydFZhbFRvU2xvdDxTbG90Pn0gW2NvbnZlcnRWYWxUb1Nsb3RdXG4gKiBAcGFyYW0ge0NvbnZlcnRTbG90VG9WYWw8U2xvdD59IFtjb252ZXJ0U2xvdFRvVmFsXVxuICogQHBhcmFtIHtNYWtlTWFyc2hhbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXJzaGFsPShcbmNvbnZlcnRWYWxUb1Nsb3Q9ZGVmYXVsdFZhbFRvU2xvdEZuLFxuY29udmVydFNsb3RUb1ZhbD1kZWZhdWx0U2xvdFRvVmFsRm4sXG57XG5lcnJvclRhZ2dpbmc9J29uJyxcbm1hcnNoYWxOYW1lPSdhbm9uLW1hcnNoYWwnLFxuLyogVE9ETyBUZW1wb3JhcnkgaGFjay4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc4MCovXG5lcnJvcklkTnVtPTEwMDAwLFxuLyogV2UgcHJlZmVyIHRoYXQgdGhlIGNhbGxlciBpbnN0ZWFkIGxvZyB0byBzb21ld2hlcmUgaGlkZGVuKi9cbi8qIHRvIGJlIHJldmVhbGVkIHdoZW4gY29ycmVsYXRpbmcgd2l0aCB0aGUgcmVjZWl2ZWQgZXJyb3IuKi9cbm1hcnNoYWxTYXZlRXJyb3I9KGVycik9PlxuY29uc29sZS5sb2coJ1RlbXBvcmFyeSBsb2dnaW5nIG9mIHNlbnQgZXJyb3InLGVyciksXG4vKiBEZWZhdWx0IHRvICdjYXBkYXRhJyBiZWNhdXNlIGl0IHdhcyBpbXBsZW1lbnRlZCBmaXJzdC4qL1xuLyogU29tZXRpbWVzLCBvbnRvZ2VueSBkb2VzIHJlY2FwaXR1bGF0ZSBwaHlsb2dlbnkgOykqL1xuc2VyaWFsaXplQm9keUZvcm1hdD0nY2FwZGF0YSd9PVxue30pPT5cbntcbmFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsJ3N0cmluZycpO1xuZXJyb3JUYWdnaW5nPT09J29uJ3x8XG5lcnJvclRhZ2dpbmc9PT0nb2ZmJ3x8XG5GYWlsIGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gO1xuY29uc3QgbmV4dEVycm9ySWQ9KCk9PntcbmVycm9ySWROdW0rPTE7XG5yZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1RvQ2FwRGF0YTxTbG90Pn1cbiAqL1xuY29uc3QgdG9DYXBEYXRhPShyb290KT0+e1xuY29uc3Qgc2xvdHM9W107XG4vKiBtYXBzIHZhbCAocHJvbWlzZSBvciByZW1vdGFibGUpIHRvIGluZGV4IG9mIHNsb3RzW10qL1xuY29uc3Qgc2xvdE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGUgfCBQcm9taXNlfSBwYXNzYWJsZVxuICogQHJldHVybnMge3tpbmRleDogbnVtYmVyLCByZXBlYXQ6IGJvb2xlYW59fVxuICovXG5jb25zdCBlbmNvZGVTbG90Q29tbW9uPShwYXNzYWJsZSk9PntcbmxldCBpbmRleD1zbG90TWFwLmdldChwYXNzYWJsZSk7XG5pZihpbmRleCE9PXVuZGVmaW5lZCl7XG4vKiBUT0RPIGFzc2VydCB0aGF0IGl0J3MgdGhlIHNhbWUgaWZhY2UgYXMgYmVmb3JlKi9cbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OnRydWV9KTtcbiB9XG5cbmluZGV4PXNsb3RzLmxlbmd0aDtcbmNvbnN0IHNsb3Q9Y29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG5zbG90cy5wdXNoKHNsb3QpO1xuc2xvdE1hcC5zZXQocGFzc2FibGUsaW5kZXgpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OmZhbHNlfSk7XG4gfTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiB1bmtub3dufSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yQ29tbW9uPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBtZXNzYWdlPWVuY29kZVJlY3VyKCBgJHtlcnIubWVzc2FnZX1gKTtcbmFzc2VydC50eXBlb2YobWVzc2FnZSwnc3RyaW5nJyk7XG5jb25zdCBuYW1lPWVuY29kZVJlY3VyKCBgJHtlcnIubmFtZX1gKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG4vKiBNdXN0IGVuY29kZSBgY2F1c2VgLCBgZXJyb3JzYC4qL1xuLyogbmVzdGVkIG5vbi1wYXNzYWJsZSBlcnJvcnMgbXVzdCBiZSBvayBmcm9tIGhlcmUuKi9cbmlmKGVycm9yVGFnZ2luZz09PSdvbicpe1xuLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4vKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4vKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4vKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4vKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbi8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG5jb25zdCBlcnJvcklkPWVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuYXNzZXJ0LnR5cGVvZihlcnJvcklkLCdzdHJpbmcnKTtcbmFzc2VydC5ub3RlKGVycixYIGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbm1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbnJldHVybiBoYXJkZW4oe2Vycm9ySWQsbWVzc2FnZSxuYW1lfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHttZXNzYWdlLG5hbWV9KTtcbiB9XG4gfTtcblxuaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdjYXBkYXRhJyl7XG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YT0ocGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGluZGV4fSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaWZhY2UsaW5kZXh9KTtcbiB9XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPSh2YWwsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHZhbCxnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gaXNFcnJvckxpa2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonZXJyb3InLC4uLmVyckRhdGF9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb0NhcERhdGE9bWFrZUVuY29kZVRvQ2FwRGF0YSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGF9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvQ2FwRGF0YShyb290KTtcbmNvbnN0IGJvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbmJvZHksXG5zbG90c30pO1xuXG4gfWVsc2UgaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdzbWFsbGNhcHMnKXtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzPShwcmVmaXgscGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuLyogVE9ETyBleHBsb3JlIHJlbW92aW5nIHRoaXMgc3BlY2lhbCBjYXNlKi9cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuIH1cbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW1vdGFibGUsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLHJlbW90YWJsZSxnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJyxwcm9taXNlKTtcblxuY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xuY29uc3R7bWVzc2FnZSwuLi5yZXN0fT1lcnJEYXRhO1xucmV0dXJuIGhhcmRlbih7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0fSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9bWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc30pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG5jb25zdCBzbWFsbGNhcHNCb2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG4vKiBWYWxpZCBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGEgdmFsaWQgc2lnbmFsKi9cbi8qIGluZGljYXRpbmcgc21hbGxjYXBzIGZvcm1hdC4qL1xuYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbnNsb3RzfSk7XG5cbiB9ZWxzZXtcbi8qIFRoZSBgdGhyb3dgIGlzIGEgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBBZGRlZCBmb3IgY29uZnVzZWQgbGludGVycy4qL1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuIH1cbiB9O1xuXG5jb25zdCBtYWtlRnVsbFJldml2ZT0oc2xvdHMpPT57XG4vKiogQHR5cGUge01hcDxudW1iZXIsIFBhc3NhYmxlPn0gKi9cbmNvbnN0IHZhbE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1JlbW90YWJsZSB8IFByb21pc2V9XG4gKi9cbmNvbnN0IGRlY29kZVNsb3RDb21tb249KHNsb3REYXRhKT0+e1xuY29uc3R7aWZhY2U9dW5kZWZpbmVkLGluZGV4LC4uLnJlc3R9PXNsb3REYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG5pZih2YWxNYXAuaGFzKGluZGV4KSl7XG5yZXR1cm4gdmFsTWFwLmdldChpbmRleCk7XG4gfVxuLyogVE9ETyBTRUNVUklUWSBIQVpBUkQ6IG11c3QgZW5mb2NlIHRoYXQgcmVtb3RhYmxlIHZzIHByb21pc2UqL1xuLyogaXMgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGVkIHN0cmluZy4qL1xuY29uc3Qgc2xvdD1zbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuY29uc3QgdmFsPWNvbnZlcnRTbG90VG9WYWwoc2xvdCxpZmFjZSk7XG52YWxNYXAuc2V0KGluZGV4LHZhbCk7XG5yZXR1cm4gdmFsO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fSBlcnJEYXRhXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuY29uc3QgZGVjb2RlRXJyb3JDb21tb249KGVyckRhdGEsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtlcnJvcklkPXVuZGVmaW5lZCxtZXNzYWdlLG5hbWUsLi4ucmVzdH09ZXJyRGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbi8qIFRPRE8gTXVzdCBkZWNvZGUgYGNhdXNlYCBhbmQgYGVycm9yc2AgcHJvcGVydGllcyovXG4vKiBjYXBEYXRhIGRvZXMgbm90IHRyYW5zZm9ybSBzdHJpbmdzLiBUaGUgY2FsbHMgdG8gYGRlY29kZVJlY3VyYCovXG4vKiBhcmUgZm9yIHJldXNlIGJ5IG90aGVyIGVuY29kaW5ncyB0aGF0IGRvLCBzdWNoIGFzIHNtYWxsY2Fwcy4qL1xuY29uc3QgZE5hbWU9ZGVjb2RlUmVjdXIobmFtZSk7XG5jb25zdCBkTWVzc2FnZT1kZWNvZGVSZWN1cihtZXNzYWdlKTtcbmNvbnN0IGRFcnJvcklkPWVycm9ySWQmJmRlY29kZVJlY3VyKGVycm9ySWQpO1xudHlwZW9mIGROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xudHlwZW9mIGRNZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSl8fEVycm9yO1xuLyogZXJyb3JJZCBpcyBhIGxhdGUgYWRkaXRpb24gc28gYmUgdG9sZXJhbnQgb2YgaXRzIGFic2VuY2UuKi9cbmNvbnN0IGVycm9yTmFtZT1cbmRFcnJvcklkPT09dW5kZWZpbmVkP1xuIGBSZW1vdGUke0VDLm5hbWV9YDpcbiBgUmVtb3RlJHtFQy5uYW1lfSgke2RFcnJvcklkfSlgO1xuY29uc3QgZXJyb3I9YXNzZXJ0LmVycm9yKGRNZXNzYWdlLEVDLHtlcnJvck5hbWV9KTtcbnJldHVybiBoYXJkZW4oZXJyb3IpO1xuIH07XG5cbi8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuLyogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uKi9cbi8qIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlKi9cbi8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzQqL1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHJhd1RyZWUsX2RlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5zbG90RGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhPShyYXdUcmVlLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5lcnJEYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21DYXBEYXRhPW1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGF9KTtcblxuXG5jb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHM9KHByZWZpeCk9Pntcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ0VuY29kaW5nXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gX2RlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlIHwgUHJvbWlzZX1cbiAqL1xucmV0dXJuKHN0cmluZ0VuY29kaW5nLF9kZWNvZGVSZWN1cik9PntcbmFzc2VydChzdHJpbmdFbmNvZGluZy5zdGFydHNXaXRoKHByZWZpeCkpO1xuLyogc2xvdHM6ICRzbG90SW5kZXguaWZhY2Ugb3IgJHNsb3RJbmRleCovXG5jb25zdCBpPXN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbmNvbnN0IGluZGV4PU51bWJlcihzdHJpbmdFbmNvZGluZy5zbGljZSgxLGk8MD91bmRlZmluZWQ6aSkpO1xuLyogaSA8IDAgbWVhbnMgdGhlcmUgd2FzIG5vIGlmYWNlIGluY2x1ZGVkLiovXG5jb25zdCBpZmFjZT1pPDA/dW5kZWZpbmVkOnN0cmluZ0VuY29kaW5nLnNsaWNlKGkrMSk7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7aWZhY2UsaW5kZXh9KTtcbiB9O1xuIH07XG5jb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJCcpO1xuY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCcmJyk7XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcsZGVjb2RlUmVjdXIpPT57XG5jb25zdHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3RFcnJEYXRhfT1lbmNvZGluZztcbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RFcnJEYXRhLCdtZXNzYWdlJyl8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oe21lc3NhZ2UsLi4ucmVzdEVyckRhdGF9LGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwc30pO1xuXG5cbnJldHVybiBoYXJkZW4oe3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtGcm9tQ2FwRGF0YTxTbG90Pn1cbiAqL1xuY29uc3QgZnJvbUNhcERhdGE9KGRhdGEpPT57XG5jb25zdHtib2R5LHNsb3RzfT1kYXRhO1xudHlwZW9mIGJvZHk9PT0nc3RyaW5nJ3x8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG5pc0FycmF5KGRhdGEuc2xvdHMpfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5zbG90cyBhcmUgbm90IEFycmF5KWA7XG5jb25zdHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfT1tYWtlRnVsbFJldml2ZShzbG90cyk7XG5sZXQgcmVzdWx0O1xuLyogSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhbiB1bmFtYmlndW91cyBzaWduYWwuKi9cbmlmKGJvZHkuc3RhcnRzV2l0aCgnIycpKXtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9Ym9keS5zbGljZSgxKTtcbmNvbnN0IGVuY29kaW5nPWhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuIH1lbHNle1xuY29uc3QgcmF3VHJlZT1oYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiB9XG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM3Ki9cbi8qIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpeGVkIG9uY2Ugd2UndmUgY29tcGxldGVkIHRoZSBzd2l0Y2gqL1xuLyogdG8gc21hbGxjYXBzLiovXG5hc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtcbnRvQ2FwRGF0YSxcbmZyb21DYXBEYXRhLFxuXG4vKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqL1xuLyoqIEBkZXByZWNhdGVkIHVzZSB0b0NhcERhdGEgKi9cbnNlcmlhbGl6ZTp0b0NhcERhdGEsXG4vKiogQGRlcHJlY2F0ZWQgdXNlIGZyb21DYXBEYXRhICovXG51bnNlcmlhbGl6ZTpmcm9tQ2FwRGF0YX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADppIhVfkAAAH5AAAAlAAAAQGVuZG8vbWFyc2hhbC12MC44LjYvc3JjL3JhbmtPcmRlci5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiLi9lbmNvZGVQYXNzYWJsZS5qcyJdLCJleHBvcnRzIjpbIkZ1bGxSYW5rQ292ZXIiLCJhc3NlcnRSYW5rU29ydGVkIiwiY29tcGFyYXRvck1pcnJvckltYWdlIiwiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZVJhbmsiLCJjb3ZlcmVkRW50cmllcyIsImdldEluZGV4Q292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciIsImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpc1JhbmtTb3J0ZWQiLCJtYWtlQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Iiwic29ydEJ5UmFuayIsInVuaW9uUmFua0NvdmVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJwYXNzU3R5bGVQcmVmaXhlc1wiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlUHJlZml4ZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb3Zlcn0gUmFua0NvdmVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SYW5rQ29tcGFyaXNvbn0gUmFua0NvbXBhcmlzb24gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb21wYXJlfSBSYW5rQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxzZXRQcm90b3R5cGVPZixpc309T2JqZWN0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W251bWJlciwgbnVtYmVyXX0gSW5kZXhDb3ZlclxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbiB1c2VkIGJ5IEphdmFTY3JpcHQncyBNYXAgYW5kIFNldFxuICogYWJzdHJhY3Rpb25zLCB3aGVyZSBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGFuZCAtMCBpcyB0aGUgc2FtZSBhc1xuICogMC4gTWFyc2hhbCBzZXJpYWxpemVzIC0wIGFzIHplcm8sIHNvIHRoZSBzZW1hbnRpY3Mgb2Ygb3VyIGRpc3RyaWJ1dGVkXG4gKiBvYmplY3Qgc3lzdGVtIGRvZXMgbm90IGRpc3Rpbmd1aXNoIDAgZnJvbSAtMC5cbiAqXG4gKiBgc2FtZVZhbHVlWmVyb2AgaXMgdGhlIEVjbWFTY3JpcHQgc3BlYyBuYW1lIGZvciB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24sXG4gKiBidXQgVE9ETyB3ZSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSBBUEkuXG4gKlxuICogQHBhcmFtIHthbnl9IHhcbiAqIEBwYXJhbSB7YW55fSB5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc2FtZVZhbHVlWmVybz0oeCx5KT0+eD09PXl8fGlzKHgseSk7XG5cbmNvbnN0IHRyaXZpYWxDb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnksIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xubGVmdDxyaWdodD8tMTpsZWZ0PT09cmlnaHQ/MDoxO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8UGFzc1N0eWxlLCB7IGluZGV4OiBudW1iZXIsIGNvdmVyOiBSYW5rQ292ZXIgfT59IFBhc3NTdHlsZVJhbmtzUmVjb3JkXG4gKi9cblxuY29uc3QgcGFzc1N0eWxlUmFua3M9LyoqIEB0eXBlIHtQYXNzU3R5bGVSYW5rc1JlY29yZH0gKi9cbmZyb21FbnRyaWVzKFxuZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbi8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LiovLlxuc29ydCgoW19sZWZ0U3R5bGUsbGVmdFByZWZpeGVzXSxbX3JpZ2h0U3R5bGUscmlnaHRQcmVmaXhlc10pPT57XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLHJpZ2h0UHJlZml4ZXMpO1xuIH0pLlxubWFwKChbcGFzc1N0eWxlLHByZWZpeGVzXSxpbmRleCk9Pntcbi8qIENvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhbnkgY2hhcmFjdGVyIGluIGBwcmVmaXhlc2AsKi9cbi8qIHZlcmlmeWluZyB0aGF0IGl0IGlzIHNvcnRlZCBzbyB0aGF0IGlzKi9cbi8qIGFsbCBzIHN1Y2ggdGhhdCBwcmVmaXhlcy5hdCgwKSDiiaQgcyA8IHN1Y2Nlc3NvcihwcmVmaXhlcy5hdCgtMSkpLiovXG5wcmVmaXhlcz09PVsuLi5wcmVmaXhlc10uc29ydCgpLmpvaW4oJycpfHxcbkZhaWwgYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG5jb25zdCBjb3Zlcj1bXG5wcmVmaXhlcy5jaGFyQXQoMCksXG5TdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoLTEpKzEpXTtcblxucmV0dXJuW3Bhc3NTdHlsZSx7aW5kZXgsY292ZXJ9XTtcbiB9KSk7XG5cblxuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKipcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRQYXNzU3R5bGVDb3Zlcj0ocGFzc1N0eWxlKT0+cGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaOKAjV9vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZD1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmU9fSBjb21wYXJlUmVtb3RhYmxlc1xuICogQW4gb3B0aW9uIHRvIGNyZWF0ZSBhIGNvbXBhcmF0b3IgaW4gd2hpY2ggYW4gaW50ZXJuYWwgb3JkZXIgaXNcbiAqIGFzc2lnbmVkIHRvIHJlbW90YWJsZXMuIFRoaXMgZGVmYXVsdHMgdG8gYSBjb21wYXJhdG9yIHRoYXRcbiAqIGFsd2F5cyByZXR1cm5zIGAwYCwgbWVhbmluZyB0aGF0IGFsbCByZW1vdGFibGVzIGFyZSB0aWVkXG4gKiBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyYXRvcktpdH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb21wYXJhdG9yS2l0PShjb21wYXJlUmVtb3RhYmxlcz0oX3gsX3kpPT4wKT0+e1xuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGNvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT57XG5pZihzYW1lVmFsdWVaZXJvKGxlZnQscmlnaHQpKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG5wYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxucGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgpO1xuXG4gfVxuLyogZXNsaW50LWRpc2FibGUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyAtLVxuICogV2Uga25vdyBgbGVmdGAgYW5kIGByaWdodGAgYXJlIGNvbXBhcmFibGUuXG4gKi9cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbi8qIEZvciBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIGFsbCBtZW1iZXJzIG9mIHRoYXQgcGFzc1N0eWxlIGFyZSB0aWVkKi9cbi8qIGZvciB0aGUgc2FtZSByYW5rLiovXG5yZXR1cm4gMDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOntcbi8qIFdpdGhpbiBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIHRoZSByYW5rIG9yZGVyaW5nIGFncmVlcyB3aXRoKi9cbi8qIEphdmFTY3JpcHQncyByZWxhdGlvbmFsIG9wZXJhdG9ycyBgPGAgYW5kIGA+YC4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGNvbXBhcmF0b3IoXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wocmlnaHQpKTtcblxuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBgTmFOYCdzIHJhbmsgaXMgYWZ0ZXIgYWxsIG90aGVyIG51bWJlcnMuKi9cbmlmKE51bWJlci5pc05hTihsZWZ0KSl7XG5hc3NlcnQoIU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIDE7XG4gfWVsc2UgaWYoTnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG5yZXR1cm4tMTtcbiB9XG4vKiBUaGUgcmFuayBvcmRlcmluZyBvZiBub24tTmFOIG51bWJlcnMgYWdyZWVzIHdpdGggSmF2YVNjcmlwdCdzKi9cbi8qIHJlbGF0aW9uYWwgb3BlcmF0b3JzICc8JyBhbmQgJz4nLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBpbnZlcnNlIHNvcnRlZCBvcmRlciBvZiBwcm9wZXJ0eSBuYW1lcywgdGhlbiovXG4vKiBsZXhpY29ncmFwaGljIGJ5IGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoYXQgc2FtZSBpbnZlcnNlKi9cbi8qIG9yZGVyIG9mIHRoZWlyIHByb3BlcnR5IG5hbWVzLiBDb21wYXJpbmcgbmFtZXMgYnkgdGhlbXNlbHZlcyBmaXJzdCwqL1xuLyogYWxsIHJlY29yZHMgd2l0aCB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YgcHJvcGVydHkgbmFtZXMgc29ydCBuZXh0IHRvKi9cbi8qIGVhY2ggb3RoZXIgaW4gYSByYW5rLXNvcnQgb2YgY29weVJlY29yZHMuKi9cblxuLyogVGhlIGNvcHlSZWNvcmQgaW52YXJpYW50cyBlbmZvcmNlZCBieSBwYXNzU3R5bGVPZiBlbnN1cmUgdGhhdCovXG4vKiBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIGFyZSBzdHJpbmdzLiBXZSBuZWVkIHRoZSByZXZlcnNlIHNvcnRlZCBvcmRlciovXG4vKiBvZiB0aGVzZSBuYW1lcywgd2hpY2ggd2UgdGhlbiBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5LiBUaGlzIGVuc3VyZXMqL1xuLyogdGhhdCBpZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFggYXJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiByZWNvcmQgWSwqL1xuLyogdGhlbiByZWNvcmQgWCB3aWxsIGhhdmUgYW4gZWFybGllciByYW5rIGFuZCBzb3J0IHRvIHRoZSBsZWZ0IG9mIFkuKi9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0TmFtZXMscmlnaHROYW1lcyk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IoXG5yZWNvcmRWYWx1ZXMobGVmdCxsZWZ0TmFtZXMpLFxucmVjb3JkVmFsdWVzKHJpZ2h0LHJpZ2h0TmFtZXMpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0W2ldLHJpZ2h0W2ldKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIHdlcmUgdGllZCwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuLyogSWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaGFzIGFuIGVhcmxpZXIgcmFuayB0aGFuIFkuKi9cbnJldHVybiBjb21wYXJhdG9yKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgYFtTeW1ib2wudG9TdHJpbmdUYWddYCB0aGVuIGAucGF5bG9hZGAuKi9cbmNvbnN0IGxhYmVsQ29tcD1jb21wYXJhdG9yKGdldFRhZyhsZWZ0KSxnZXRUYWcocmlnaHQpKTtcbmlmKGxhYmVsQ29tcCE9PTApe1xucmV0dXJuIGxhYmVsQ29tcDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQscmlnaHQucGF5bG9hZCk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gO1xuIH19XG5cbi8qIGVzbGludC1lbmFibGUgKi9cbiB9O1xuXG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgYW50aUNvbXBhcmF0b3I9KHgseSk9PmNvbXBhcmF0b3IoeSx4KTtcblxubWVtb09mU29ydGVkLnNldChjb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xubWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGNvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3IpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoYW50aUNvbXBhcmF0b3IsY29tcGFyYXRvcik7XG5cbnJldHVybiBoYXJkZW4oe2NvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3J9KTtcbiB9O1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmU9fVxuICovJGjigI1fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG5jb25zdCAgICAgICAgY29tcGFyYXRvck1pcnJvckltYWdlPShjb21wYXJhdG9yKT0+XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLmdldChjb21wYXJhdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuY29uc3QgICAgICAgIGlzUmFua1NvcnRlZD0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuaWYoc3ViTWVtb09mU29ydGVkLmhhcyhwYXNzYWJsZXMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpPT09J2NvcHlBcnJheScpO1xuZm9yKGxldCBpPTE7aTxwYXNzYWJsZXMubGVuZ3RoO2krPTEpe1xuaWYoY29tcGFyZShwYXNzYWJsZXNbaS0xXSxwYXNzYWJsZXNbaV0pPj0xKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuc3ViTWVtb09mU29ydGVkLmFkZChwYXNzYWJsZXMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmlzUmFua1NvcnRlZChpc1JhbmtTb3J0ZWQpO1xuaGFyZGVuKGlzUmFua1NvcnRlZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFJhbmtTb3J0ZWQ9KHNvcnRlZCxjb21wYXJlKT0+XG5pc1JhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpfHxcbi8qIFRPRE8gYXNzZXJ0IG9uIGJ1ZyBjb3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi4gRml4LiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuRmFpbCBgTXVzdCBiZSByYW5rIHNvcnRlZDogJHtzb3J0ZWR9IHZzICR7c29ydEJ5UmFuayhzb3J0ZWQsY29tcGFyZSl9YDskaOKAjV9vbmNlLmFzc2VydFJhbmtTb3J0ZWQoYXNzZXJ0UmFua1NvcnRlZCk7XG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qKlxuICogVE9ETyBTRUNVUklUWSBCVUc6IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDI2MFxuICogc29ydEJ5UmFuayBjdXJyZW50bHkgdXNlcyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGRpcmVjdGx5LCBhbmRcbiAqIHNvIG9ubHkgd29ya3MgY29ycmVjdGx5IHdoZW4gZ2l2ZW4gYSBgY29tcGFyZWAgZnVuY3Rpb24gdGhhdCBjb25zaWRlcnNcbiAqIGB1bmRlZmluZWRgIHN0cmljdGx5IGJpZ2dlciAoYD5gKSB0aGFuIGV2ZXJ5dGhpbmcgZWxzZS4gVGhpcyBpc1xuICogYmVjYXVzZSBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGJpemFycmVseSBtb3ZlcyBhbGwgYHVuZGVmaW5lZGBzIHRvXG4gKiB0aGUgZW5kIG9mIHRoZSBhcnJheSByZWdhcmRsZXNzLCB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIGBjb21wYXJlYFxuICogZnVuY3Rpb24uIFRoaXMgaXMgYSBnZW51aW5lIGJ1ZyBmb3IgdXMgTk9XIGJlY2F1c2Ugc29tZXRpbWVzIHdlIHNvcnRcbiAqIGluIHJldmVyc2Ugb3JkZXIgYnkgcGFzc2luZyBhIHJldmVyc2VkIHJhbmsgY29tcGFyaXNvbiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFBhc3NhYmxlPn0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7UGFzc2FibGVbXX1cbiAqL1xuY29uc3QgICAgICAgIHNvcnRCeVJhbms9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuaWYoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKXtcbmhhcmRlbihwYXNzYWJsZXMpO1xuLyogQ2FsbGluZyBpc1JhbmtTb3J0ZWQgZ2l2ZXMgaXQgYSBjaGFuY2UgdG8gZ2V0IG1lbW9pemVkIGZvciovXG4vKiB0aGlzIGBjb21wYXJlYCBmdW5jdGlvbiBldmVuIGlmIGl0IHdhcyBhbHJlYWR5IG1lbW9pemVkIGZvciBhIGRpZmZlcmVudCovXG4vKiBgY29tcGFyZWAgZnVuY3Rpb24uKi9cbmlmKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsY29tcGFyZSkpe1xucmV0dXJuIHBhc3NhYmxlcztcbiB9XG4gfVxuY29uc3QgdW5zb3J0ZWQ9Wy4uLnBhc3NhYmxlc107XG51bnNvcnRlZC5mb3JFYWNoKGhhcmRlbik7XG5jb25zdCBzb3J0ZWQ9aGFyZGVuKHVuc29ydGVkLnNvcnQoY29tcGFyZSkpO1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbnN1Yk1lbW9PZlNvcnRlZC5hZGQoc29ydGVkKTtcbnJldHVybiBzb3J0ZWQ7XG4gfTskaOKAjV9vbmNlLnNvcnRCeVJhbmsoc29ydEJ5UmFuayk7XG5oYXJkZW4oc29ydEJ5UmFuayk7XG5cbi8qKlxuICogU2VlXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfc2VhcmNoX2FsZ29yaXRobSNQcm9jZWR1cmVfZm9yX2ZpbmRpbmdfdGhlX2xlZnRtb3N0X2VsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcGFyYW0geyhcImxlZnRNb3N0XCIgfCBcInJpZ2h0TW9zdFwiKT19IGJpYXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJhbmtTZWFyY2g9KHNvcnRlZCxjb21wYXJlLGtleSxiaWFzPSdsZWZ0TW9zdCcpPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmxldCBsZWZ0PTA7XG5sZXQgcmlnaHQ9c29ydGVkLmxlbmd0aDtcbndoaWxlKGxlZnQ8cmlnaHQpe1xuY29uc3QgbT1NYXRoLmZsb29yKChsZWZ0K3JpZ2h0KS8yKTtcbmNvbnN0IGNvbXA9Y29tcGFyZShzb3J0ZWRbbV0sa2V5KTtcbmlmKGNvbXA8PS0xfHxjb21wPT09MCYmYmlhcz09PSdyaWdodE1vc3QnKXtcbmxlZnQ9bSsxO1xuIH1lbHNle1xuYXNzZXJ0KGNvbXA+PTF8fGNvbXA9PT0wJiZiaWFzPT09J2xlZnRNb3N0Jyk7XG5yaWdodD1tO1xuIH1cbiB9XG5yZXR1cm4gYmlhcz09PSdsZWZ0TW9zdCc/bGVmdDpyaWdodC0xO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSByYW5rQ292ZXJcbiAqIEByZXR1cm5zIHtJbmRleENvdmVyfVxuICovXG5jb25zdCAgICAgICAgZ2V0SW5kZXhDb3Zlcj0oc29ydGVkLGNvbXBhcmUsW2xlZnRLZXkscmlnaHRLZXldKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5jb25zdCBsZWZ0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxsZWZ0S2V5LCdsZWZ0TW9zdCcpO1xuY29uc3QgcmlnaHRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLHJpZ2h0S2V5LCdyaWdodE1vc3QnKTtcbnJldHVybltsZWZ0SW5kZXgscmlnaHRJbmRleF07XG4gfTskaOKAjV9vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qKiBAdHlwZSB7UmFua0NvdmVyfSAqL1xuY29uc3QgICAgICAgIEZ1bGxSYW5rQ292ZXI9aGFyZGVuKFsnJywneyddKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqLyRo4oCNX29uY2UuRnVsbFJhbmtDb3ZlcihGdWxsUmFua0NvdmVyKTtcbmNvbnN0ICAgICAgICBjb3ZlcmVkRW50cmllcz0oc29ydGVkLFtsZWZ0SW5kZXgscmlnaHRJbmRleF0pPT57XG4vKiogQHR5cGUge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59ICovXG5jb25zdCBpdGVyYWJsZT1oYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPWxlZnRJbmRleDtcbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuaWYoaTw9cmlnaHRJbmRleCl7XG5jb25zdCBlbGVtZW50PXNvcnRlZFtpXTtcbmkrPTE7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTpbaSxlbGVtZW50XSxkb25lOmZhbHNlfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTp1bmRlZmluZWQsZG9uZTp0cnVlfSk7XG4gfVxuIH19KTtcblxuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5jb3ZlcmVkRW50cmllcyhjb3ZlcmVkRW50cmllcyk7XG5oYXJkZW4oY292ZXJlZEVudHJpZXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWF4UmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik+PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWluUmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik8PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIHVuaW9uUmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgdW5pb25SYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1pblJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5tYXhSYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZSh1bmlvblJhbmtDb3ZlclBhaXIsWyd7JywnJ10pO1xuIH07JGjigI1fb25jZS51bmlvblJhbmtDb3ZlcnModW5pb25SYW5rQ292ZXJzKTtcbmhhcmRlbih1bmlvblJhbmtDb3ZlcnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGludGVyc2VjdFJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IGludGVyc2VjdFJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWF4UmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1pblJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKGludGVyc2VjdFJhbmtDb3ZlclBhaXIsWycnLCd7J10pO1xuIH07JGjigI1fb25jZS5pbnRlcnNlY3RSYW5rQ292ZXJzKGludGVyc2VjdFJhbmtDb3ZlcnMpO1xuXG5jb25zdCAgICAgICB7Y29tcGFyYXRvcjpjb21wYXJlUmFuayxhbnRpQ29tcGFyYXRvcjpjb21wYXJlQW50aVJhbmt9PVxubWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wYXJhdG9yIGtpdCBpbiB3aGljaCByZW1vdGFibGVzIGFyZSBmdWxseSBvcmRlcmVkXG4gKiBieSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZmlyc3Qgc2VlbiBieSAqdGhpcyogY29tcGFyYXRvciBraXQuXG4gKiBCRVdBUkU6IFRoaXMgaXMgb2JzZXJ2YWJsZSBtdXRhYmxlIHN0YXRlLCBzbyBzdWNoIGEgY29tcGFyYXRvciBraXRcbiAqIHNob3VsZCBuZXZlciBiZSBzaGFyZWQgYW1vbmcgc3Vic3lzdGVtcyB0aGF0IHNob3VsZCBub3QgYmUgYWJsZVxuICogdG8gY29tbXVuaWNhdGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgb3JkZXIgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIGZvciBzdG9yZVxuICogb3JkZXJpbmcsIHNpbmNlIGl0IGhhcyBubyBtZW1vcnkgb2YgZGVsZXRlZCBrZXlzLlxuICpcbiAqIFRoZXNlIGZ1bGwgb3JkZXIgY29tcGFyYXRvciBraXQgaXMgc3RyaWN0bHkgbW9yZSBwcmVjaXNlIHRoYXQgdGhlXG4gKiByYW5rIG9yZGVyIGNvbXBhcmF0b3Iga2l0cyBhYm92ZS4gQXMgYSByZXN1bHQsIGFueSBhcnJheSB3aGljaCBpc1xuICogc29ydGVkIGJ5IHN1Y2ggYSBmdWxsIG9yZGVyIHdpbGwgcGFzcyB0aGUgaXNSYW5rU29ydGVkIHRlc3Qgd2l0aFxuICogYSBjb3JyZXNwb25kaW5nIHJhbmsgb3JkZXIuXG4gKlxuICogQW4gYXJyYXkgd2hpY2ggaXMgc29ydGVkIGJ5IGEgKmZyZXNoKiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIGkuZS4sXG4gKiBvbmUgdGhhdCBoYXMgbm90IHlldCBzZWVuIGFueSByZW1vdGFibGVzLCB3aWxsIG9mIGNvdXJzZSByZW1haW5cbiAqIHNvcnRlZCBieSBhY2NvcmRpbmcgdG8gKnRoYXQqIGZ1bGwgb3JkZXIgY29tcGFyYXRvci4gQW4gYXJyYXkgKm9mXG4gKiBzY2FsYXJzKiBzb3J0ZWQgYnkgYSBmcmVzaCBmdWxsIG9yZGVyIHdpbGwgcmVtYWluIHNvcnRlZCBldmVuXG4gKiBhY2NvcmRpbmcgdG8gYSBuZXcgZnJlc2ggZnVsbCBvcmRlciBjb21wYXJhdG9yLCBzaW5jZSBpdCB3aWxsIHNlZVxuICogdGhlIHJlbW90YWJsZXMgaW4gdGhlIHNhbWUgb3JkZXIgYWdhaW4uIFVuZm9ydHVuYXRlbHksIHRoaXMgaXNcbiAqIG5vdCB0cnVlIG9mIGFycmF5cyBvZiBwYXNzYWJsZXMgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsb25nTGl2ZWRcbiAqIEByZXR1cm5zIHtGdWxsQ29tcGFyYXRvcktpdH1cbiAqLyRo4oCNX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRo4oCNX29uY2UuY29tcGFyZUFudGlSYW5rKGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCAgICAgICAgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQ9KGxvbmdMaXZlZD1mYWxzZSk9PntcbmxldCBudW1TZWVuPTA7XG4vKiBXaGVuIGR5bmFtaWNhbGx5IGNyZWF0ZWQgd2l0aCBzaG9ydCBsaWZldGltZXMgKHRoZSBkZWZhdWx0KSBhIFdlYWtNYXAqL1xuLyogd291bGQgcGVyZm9ybSBwb29ybHksIGFuZCB0aGUgbGVhayBjcmVhdGVkIGJ5IGEgTWFwIG9ubHkgbGFzdHMgYXMgbG9uZyovXG4vKiBhcyB0aGUgTWFwLiovXG5jb25zdCBNYXBDb25zdHJ1Y3Rvcj1sb25nTGl2ZWQ/V2Vha01hcDpNYXA7XG5jb25zdCBzZWVuPW5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuY29uc3QgdGFnPShyKT0+e1xuaWYoc2Vlbi5oYXMocikpe1xucmV0dXJuIHNlZW4uZ2V0KHIpO1xuIH1cbm51bVNlZW4rPTE7XG5zZWVuLnNldChyLG51bVNlZW4pO1xucmV0dXJuIG51bVNlZW47XG4gfTtcbmNvbnN0IGNvbXBhcmVSZW1vdGFibGVzPSh4LHkpPT5jb21wYXJlUmFuayh0YWcoeCksdGFnKHkpKTtcbnJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbmhhcmRlbihtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACEAAABAZW5kby9tYXJzaGFsLXYwLjguNi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATbI/K78LAAC/CwAAHgAAAEBlbmRvL25hdC12NC4xLjI4L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsICduYW1lJywge3ZhbHVlOiBcImlzTmF0XCJ9KTskaOKAjV9vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJOYXRcIn0pOyRo4oCNX29uY2UuTmF0KE5hdCk7ICAgLyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5yZXR1cm4gYWxsZWdlZE51bT49MDtcbiB9XG5pZih0eXBlb2YgYWxsZWdlZE51bSE9PSdudW1iZXInKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbnJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSYmYWxsZWdlZE51bT49MDtcbiB9XG5cbi8qKlxuICogSWYgYGFsbGVnZWROdW1iZXJgIHBhc3NlcyB0aGUgYGlzTmF0YCB0ZXN0LCB0aGVuIHJldHVybiBpdCBhcyBhIGJpZ2ludC5cbiAqIE90aGVyd2lzZSB0aHJvdyBhbiBhcHByb3ByaWF0ZSBlcnJvci5cbiAqXG4gKiBJZiBgYWxsZWdlZE51bWAgaXMgbmVpdGhlciBhIGJpZ2ludCBub3IgYSBudW1iZXIsIGBOYXRgIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBpcyBub3QgYSBbc2FmZWx5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiBub24tbmVnYXRpdmUgaW50ZWdlciwgYE5hdGAgdGhyb3dzIGEgYFJhbmdlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBiaWdpbnQgaWYgbmVjZXNzYXJ5IGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIGFsbGVnZWROdW07XG4gfVxuXG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdudW1iZXInKXtcbmlmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSl7XG50aHJvdyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBub3QgYSBzYWZlIGludGVnZXJgKTtcbiB9XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgVHlwZUVycm9yKFxuIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgKTtcblxuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPlDfNZ8CAAAfAgAACAAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImlzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvaXRlci1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXJyb3IuanNcIiwgW11dLFtcIi4vc3JjL3JlbW90YWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvc3ltYm9sLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2l0ZXItaGVscGVycy5qcyI6W1sibWFwSXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLFsiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSJdXSwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOltbIlBBU1NfU1RZTEUiLCJQQVNTX1NUWUxFIl0sWyJpc09iamVjdCIsImlzT2JqZWN0Il0sWyJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q2hlY2tlciJdLFsiZ2V0VGFnIiwiZ2V0VGFnIl0sWyJoYXNPd25Qcm9wZXJ0eU9mIiwiaGFzT3duUHJvcGVydHlPZiJdXSwiLi9zcmMvZXJyb3IuanMiOltbImdldEVycm9yQ29uc3RydWN0b3IiLCJnZXRFcnJvckNvbnN0cnVjdG9yIl0sWyJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSxbImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiXV0sIi4vc3JjL3JlbW90YWJsZS5qcyI6W1siZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdXSwiLi9zcmMvc3ltYm9sLmpzIjpbWyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sWyJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCJdLFsibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sWyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXV0sIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjpbWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl0sWyJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIl1dLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIjpbWyJtYWtlVGFnZ2VkIiwibWFrZVRhZ2dlZCJdXSwiLi9zcmMvbWFrZS1mYXIuanMiOltbIlJlbW90YWJsZSIsIlJlbW90YWJsZSJdLFsiRmFyIiwiRmFyIl0sWyJUb0ZhckZ1bmN0aW9uIiwiVG9GYXJGdW5jdGlvbiJdXSwiLi9zcmMvdHlwZUd1YXJkcy5qcyI6W1siYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVjb3JkIl0sWyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiXSxbImFzc2VydFJlbW90YWJsZSIsImFzc2VydFJlbW90YWJsZSJdLFsiaXNSZW1vdGFibGUiLCJpc1JlbW90YWJsZSJdLFsiaXNSZWNvcmQiLCJpc1JlY29yZCJdLFsiaXNDb3B5QXJyYXkiLCJpc0NvcHlBcnJheSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3ka2qpMHAACTBwAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40L3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXkscHJvdG90eXBlOmFycmF5UHJvdG90eXBlfT1BcnJheTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNhbkJlVmFsaWQ9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmlzQXJyYXkoY2FuZGlkYXRlKXx8XG4hIWNoZWNrJiZjaGVjayhmYWxzZSxYIGBBcnJheSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCk7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weUFycmF5SGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlBcnJheScsXG5cbmNhbkJlVmFsaWQsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKT09PWFycmF5UHJvdG90eXBlfHxcbmFzc2VydC5mYWlsKFggYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogU2luY2Ugd2UncmUgYWxyZWFkeSBlbnN1cmVkIGNhbmRpZGF0ZSBpcyBhbiBhcnJheSwgaXQgc2hvdWxkIG5vdCBiZSovXG4vKiBwb3NzaWJsZSBmb3IgdGhlIGZvbGxvd2luZyB0ZXN0IHRvIGZhaWwqL1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ2xlbmd0aCcsZmFsc2UsYXNzZXJ0Q2hlY2tlcik7XG5jb25zdCBsZW49LyoqIEB0eXBlIHt1bmtub3duW119ICovY2FuZGlkYXRlLmxlbmd0aDtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsaSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qICsxIGZvciB0aGUgJ2xlbmd0aCcgcHJvcGVydHkgaXRzZWxmLiovXG5vd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoPT09bGVuKzF8fFxuYXNzZXJ0LmZhaWwoWCBgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmNhbmRpZGF0ZS5ldmVyeSgodik9PiEhcGFzc1N0eWxlT2ZSZWN1cih2KSk7XG4gfX0pOyRo4oCNX29uY2UuQ29weUFycmF5SGVscGVyKENvcHlBcnJheUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACD9dsszwcAAM8HAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlSZWNvcmRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRQcm90b3R5cGVPZix2YWx1ZXMscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlSZWNvcmRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weVJlY29yZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSE9PW9iamVjdFByb3RvdHlwZSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxuXG5yZXR1cm4gb3duS2V5cyhjYW5kaWRhdGUpLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4odHlwZW9mIGtleT09PSdzdHJpbmcnfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcblggYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbiFjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuLyogVE9ETzogVXBkYXRlIG1lc3NhZ2Ugbm93IHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBcImltcGxpY2l0IFJlbW90YWJsZVwiLiovXG5YIGBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH0pO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbkNvcHlSZWNvcmRIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsbmFtZSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmZvcihjb25zdCB2YWwgb2YgdmFsdWVzKGNhbmRpZGF0ZSkpe1xucGFzc1N0eWxlT2ZSZWN1cih2YWwpO1xuIH1cbiB9fSk7JGjigI1fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADToDhxnREAAJ0RAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQvc3JjL2Vycm9yLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJFcnJvckhlbHBlciIsImdldEVycm9yQ29uc3RydWN0b3IiLCJpc0Vycm9yTGlrZSIsInRvUGFzc2FibGVFcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiBUT0RPOiBNYWludGVuYW5jZSBoYXphcmQ6IENvb3JkaW5hdGUgd2l0aCB0aGUgbGlzdCBvZiBlcnJvcnMgaW4gdGhlIFNFUyovXG4vKiB3aGlsZWxpc3QuIEN1cnJlbnRseSwgYm90aCBvbWl0IEFnZ3JlZ2F0ZUVycm9yLCB3aGljaCBpcyBub3cgc3RhbmRhcmQuIEJvdGgqL1xuLyogbXVzdCBldmVudHVhbGx5IGluY2x1ZGUgaXQuKi9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzPW5ldyBNYXAoW1xuWydFcnJvcicsRXJyb3JdLFxuWydFdmFsRXJyb3InLEV2YWxFcnJvcl0sXG5bJ1JhbmdlRXJyb3InLFJhbmdlRXJyb3JdLFxuWydSZWZlcmVuY2VFcnJvcicsUmVmZXJlbmNlRXJyb3JdLFxuWydTeW50YXhFcnJvcicsU3ludGF4RXJyb3JdLFxuWydUeXBlRXJyb3InLFR5cGVFcnJvcl0sXG5bJ1VSSUVycm9yJyxVUklFcnJvcl1dKTtcblxuXG5jb25zdCAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3Rvcj0obmFtZSk9PmVycm9yQ29uc3RydWN0b3JzLmdldChuYW1lKTskaOKAjV9vbmNlLmdldEVycm9yQ29uc3RydWN0b3IoZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5oYXJkZW4oZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrRXJyb3JMaWtlPShjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbi8qIFRPRE86IE5lZWQgYSBiZXR0ZXIgdGVzdCB0aGFuIGluc3RhbmNlb2YqL1xucmV0dXJuKFxuY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3J8fFxucmVqZWN0JiZyZWplY3QoWCBgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH07XG5oYXJkZW4oY2hlY2tFcnJvckxpa2UpO1xuXG4vKipcbiAqIFZhbGlkYXRpbmcgZXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUgcmFpc2VzIGEgdGVuc2lvbiBiZXR3ZWVuIHNlY3VyaXR5XG4gKiB2cyBwcmVzZXJ2aW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIEZvciBlcnJvcnMsIHdlIG5lZWQgdG8gcmVtZW1iZXJcbiAqIHRoZSBlcnJvciBpdHNlbGYgZXhpc3RzIHRvIGhlbHAgdXMgZGlhZ25vc2UgYSBidWcgdGhhdCdzIGxpa2VseSBtb3JlXG4gKiBwcmVzc2luZyB0aGFuIGEgdmFsaWRpdHkgYnVnIGluIHRoZSBlcnJvciBpdHNlbGYuIFRodXMsIHdoZW5ldmVyIGl0IGlzIHNhZmVcbiAqIHRvIGRvIHNvLCB3ZSBwcmVmZXIgdG8gbGV0IHRoZSBlcnJvci1saWtlIHRlc3Qgc3VjY2VlZCBhbmQgdG8gY291Y2ggdGhlc2VcbiAqIGNvbXBsYWludHMgYXMgbm90ZXMgb24gdGhlIGVycm9yLlxuICpcbiAqIFRvIHJlc29sdmUgdGhpcywgc3VjaCBhIG1hbGZvcm1lZCBlcnJvciBvYmplY3Qgd2lsbCBzdGlsbCBwYXNzXG4gKiBgaXNFcnJvckxpa2VgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3AgbGV2ZWwgZXJyb3IgdG8gcmVwb3J0IGZyb20sXG4gKiBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc0Vycm9yTGlrZT0oY2FuZGlkYXRlKT0+Y2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlKTskaOKAjV9vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIEVycm9ySGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2Vycm9yJyxcblxuY2FuQmVWYWxpZDpjaGVja0Vycm9yTGlrZSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PntcbkVycm9ySGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbmNvbnN0e25hbWV9PXByb3RvO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbkVDJiZFQy5wcm90b3R5cGU9PT1wcm90b3x8XG5GYWlsIGBFcnJvcnMgbXVzdCBpbmhlcml0IGZyb20gYW4gZXJyb3IgY2xhc3MgLnByb3RvdHlwZSAke2NhbmRpZGF0ZX1gO1xuXG5jb25zdHtcbi8qIE11c3QgYWxsb3cgYGNhdXNlYCwgYGVycm9yc2AqL1xubWVzc2FnZTptRGVzYyxcbi8qIEFsbG93IGJ1dCBpZ25vcmUgb25seSBleHRyYW5lb3VzIG93biBgc3RhY2tgIHByb3BlcnR5LiovXG5zdGFjazpfb3B0U3RhY2tEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg8MXx8XG5GYWlsIGBQYXNzZWQgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnRpZXMgJHtyZXN0RGVzY3N9YDtcbmlmKG1EZXNjKXtcbnR5cGVvZiBtRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IGJlIGEgc3RyaW5nLXZhbHVlZCBkYXRhIHByb3BlcnR5LmA7XG4hbURlc2MuZW51bWVyYWJsZXx8XG5GYWlsIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBub3QgYmUgZW51bWVyYWJsZWA7XG4gfVxucmV0dXJuIHRydWU7XG4gfX0pO1xuXG5cbi8qKlxuICogUmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpYyBpbmZvIG9mIHRoZVxuICogb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqLyRo4oCNX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xuY29uc3QgICAgICAgIHRvUGFzc2FibGVFcnJvcj0oZXJyKT0+e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1lcnI7XG5cbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoIGAke25hbWV9YCl8fEVycm9yO1xuY29uc3QgbmV3RXJyb3I9aGFyZGVuKG5ldyBFQyggYCR7bWVzc2FnZX1gKSk7XG4vKiBFdmVuIHRoZSBjbGVhbmVkIHVwIGVycm9yIGNvcHksIGlmIHNlbnQgdG8gdGhlIGNvbnNvbGUsIHNob3VsZCovXG4vKiBjYXVzZSBoaWRkZW4gZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBvZiB0aGUgb3JpZ2luYWwgZXJyb3IqL1xuLyogdG8gYmUgbG9nZ2VkLiovXG5hc3NlcnQubm90ZShuZXdFcnJvcixYIGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbnJldHVybiBuZXdFcnJvcjtcbiB9OyRo4oCNX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABKO2aDVQgAAFUIAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQvc3JjL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCBhbmRcbiAqIGhhdmUgdGhlIHNhbWUgdGVybWluYXRpb24gLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZSBvciBmYWlsdXJlXG4gKiByZWFzb24uIEJ1dCB0aGUgbm9uLWZpbmFsIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbm9uLWZpbmFsXG4gKiB2YWx1ZXMgZnJvbSBgYmFzZUl0ZXJhdG9yYCBhcyB0cmFuc2Zvcm1lZCBieSBgZnVuY2AuXG4gKlxuICogQHRlbXBsYXRlIFQsVVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gVX0gZnVuY1xuICogQHJldHVybnMge0l0ZXJhYmxlPFU+fVxuICovXG5jb25zdCAgICAgICAgbWFwSXRlcmFibGU9KGJhc2VJdGVyYWJsZSxmdW5jKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdtYXBwZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3R7dmFsdWU6YmFzZVZhbHVlLGRvbmV9PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdCB2YWx1ZT1kb25lP2Jhc2VWYWx1ZTpmdW5jKGJhc2VWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSxkb25lfSk7XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuXG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGEgc3Vic2V0IG9mIHRoZSBub24tZmluYWwgdmFsdWVzIGZyb20gdGhlXG4gKiBgYmFzZUl0ZXJhdG9yYCAtLS0gdGhvc2UgZm9yIHdoaWNoIGBwcmVkKHZhbHVlKWAgd2FzIHRydXRoeS4gVGhlIHJlc3VsdFxuICogaGFzIHRoZSBzYW1lIHRlcm1pbmF0aW9uIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlXG4gKiBvciBmYWlsdXJlIHJlYXNvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gYm9vbGVhbn0gcHJlZFxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgZmlsdGVySXRlcmFibGU9KGJhc2VJdGVyYWJsZSxwcmVkKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignZmlsdGVyZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmZvcig7Oyl7XG5jb25zdCByZXN1bHQ9YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0e3ZhbHVlLGRvbmV9PXJlc3VsdDtcbmlmKGRvbmV8fHByZWQodmFsdWUpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5cbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+lX/zTIaAAAyGgAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40L3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxhc3NlcnRJZmFjZSxnZXRJbnRlcmZhY2VPZixSZW1vdGFibGVIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydElmYWNlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbnNldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcblxuLyoqXG4gKiBOb3cgdGhhdCB0aGUgcmVtb3RhYmxlUHJvdG8gZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIGB0b1N0cmluZ2AgbWV0aG9kLFxuICogZW5zdXJlIGl0IGFsd2F5cyBpbmhlcml0cyBmcm9tIHNvbWV0aGluZy4gVGhlIG9yaWdpbmFsIHByb3RvdHlwZSBvZlxuICogYHJlbW90YWJsZWAgaWYgdGhlcmUgd2FzIG9uZSwgb3IgYE9iamVjdC5wcm90b3R5cGVgIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG89KHJlbW90YWJsZSxpZmFjZSk9PntcbmxldCBvbGRQcm90bz1nZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuaWYodHlwZW9mIHJlbW90YWJsZT09PSdvYmplY3QnKXtcbmlmKG9sZFByb3RvPT09bnVsbCl7XG5vbGRQcm90bz1vYmplY3RQcm90b3R5cGU7XG4gfVxub2xkUHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuRmFpbCBgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2UgaWYodHlwZW9mIHJlbW90YWJsZT09PSdmdW5jdGlvbicpe1xub2xkUHJvdG8hPT1udWxsfHxcbkZhaWwgYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xub2xkUHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5nZXRQcm90b3R5cGVPZihvbGRQcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG5GYWlsIGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNle1xuRmFpbCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuIH1cbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2xkUHJvdG8se1xuW1BBU1NfU1RZTEVdOnt2YWx1ZToncmVtb3RhYmxlJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6aWZhY2V9fSkpO1xuXG5cbiB9O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZT0oY2FuZGlkYXRlKT0+XG5SZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV0gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvclxuICogdGhlIHJlbW90YWJsZS4gRm9yIG5vdywgYSBzdHJpbmcgaWZhY2UgbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGhcbiAqIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiLCB0byBzZXJ2ZSBhcyB0aGUgYWxsZWdlZCBuYW1lLiBNb3JlXG4gKiBnZW5lcmFsIGlmYWNlcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZC4gVGhpcyBpcyB0ZW1wb3JhcnkuIFdlIGluY2x1ZGUgdGhlXG4gKiBcIkFsbGVnZWRcIiBvciBcIkRlYnVnTmFtZVwiIGFzIGEgcmVtaW5kZXIgdGhhdCB3ZSBkbyBub3QgeWV0IGhhdmUgU3dpbmdTZXRcbiAqIG9yIENvbW1zIFZhdFxuICogc3VwcG9ydCBmb3IgZW5zdXJpbmcgdGhpcyBpcyBhY2NvcmRpbmcgdG8gdGhlIHZhdCBob3N0aW5nIHRoZSBvYmplY3QuXG4gKiBDdXJyZW50bHksIEFsaWNlIGNhbiB0ZWxsIEJvYiBhYm91dCBDYXJvbCwgd2hlcmUgVmF0QSAob24gQWxpY2UncyBiZWhhbGYpXG4gKiBtaXNyZXByZXNlbnRzIENhcm9sJ3MgYGlmYWNlYC4gVmF0QiBhbmQgdGhlcmVmb3JlIEJvYiB3aWxsIHRoZW4gc2VlXG4gKiBDYXJvbCdzIGBpZmFjZWAgYXMgbWlzcmVwcmVzZW50ZWQgYnkgVmF0QS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSBbcHJvcHNdIEN1cnJlbnRseSBtYXkgb25seSBiZSB1bmRlZmluZWQuXG4gKiBUaGF0IHBsYW4gaXMgdGhhdCBvd24tcHJvcGVydGllcyBhcmUgY29waWVkIHRvIHRoZSByZW1vdGFibGVcbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSByZW1vdGFibGUsIG1vZGlmaWVkIGZvciBkZWJ1Z2dhYmlsaXR5XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGU9KFxuaWZhY2U9J1JlbW90YWJsZScsXG5wcm9wcz11bmRlZmluZWQsXG5yZW1vdGFibGU9LyoqIEB0eXBlIHtUfSAqL3t9KT0+XG57XG5hc3NlcnRJZmFjZShpZmFjZSk7XG5hc3NlcnQoaWZhY2UpO1xuLyogVE9ETzogV2hlbiBpZmFjZSBpcyByaWNoZXIgdGhhbiBqdXN0IHN0cmluZywgd2UgbmVlZCB0byBnZXQgdGhlIGFsbGVnZWROYW1lKi9cbi8qIGluIGEgZGlmZmVyZW50IHdheS4qL1xucHJvcHM9PT11bmRlZmluZWR8fEZhaWwgYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuLyogRmFpbCBmYXN0OiBjaGVjayB0aGF0IHRoZSB1bm1vZGlmaWVkIG9iamVjdCBpcyBhYmxlIHRvIGJlY29tZSBhIFJlbW90YWJsZS4qL1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IG1hcmtlZC4qL1xuIShQQVNTX1NUWUxFIGluIHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBhICR7cShcbnJlbW90YWJsZVtQQVNTX1NUWUxFXSlcbiB9YDtcbi8qIGBpc0Zyb3plbmAgYWx3YXlzIHJldHVybnMgdHJ1ZSB3aXRoIGEgZmFrZSBgaGFyZGVuYCwgYnV0IHdlIHdhbnQgdGhhdCBjYXNlKi9cbi8qIHRvIHN1Y2NlZWQgYW55d2F5LiBGYWtpbmcgYGhhcmRlbmAgaXMgb25seSBjb3JyZWN0bmVzcyBwcmVzZXJ2aW5nKi9cbi8qIGlmIHRoZSBjb2RlIGluIHF1ZXN0aW9uIGNvbnRhaW5zIG5vIGJ1Z3MgdGhhdCB0aGUgcmVhbCBgaGFyZGVuYCB3b3VsZCovXG4vKiBoYXZlIGNhdWdodC4qL1xuLyogQHRzLWlnbm9yZSBgaXNGYWtlYCBwdXJwb3NlbHkgbm90IGluIHRoZSB0eXBlKi9cbmhhcmRlbi5pc0Zha2V8fFxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IGZyb3plbi4qL1xuIWlzRnJvemVuKHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IGZyb3plbmA7XG5jb25zdCByZW1vdGFibGVQcm90bz1tYWtlUmVtb3RhYmxlUHJvdG8ocmVtb3RhYmxlLGlmYWNlKTtcblxuLyogVGFrZSBhIHN0YXRpYyBjb3B5IG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGFzIGRhdGEgcHJvcGVydGllcy4qL1xuLyogY29uc3QgcHJvcERlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh7IC4uLnByb3BzIH0pOyovXG5jb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjaz0odGFyZ2V0KT0+e1xuLyogZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BEZXNjcyk7Ki9cbnNldFByb3RvdHlwZU9mKHRhcmdldCxyZW1vdGFibGVQcm90byk7XG5oYXJkZW4odGFyZ2V0KTtcbmFzc2VydENhbkJlUmVtb3RhYmxlKHRhcmdldCk7XG4gfTtcblxuLyogRmFpbCBmYXN0OiBjaGVjayBhIGZyZXNoIHJlbW90YWJsZSB0byBzZWUgaWYgb3VyIHJ1bGVzIGZpdC4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4vKiBBY3R1YWxseSBmaW5pc2ggdGhlIG5ldyByZW1vdGFibGUuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHJlbW90YWJsZSk7XG5cbi8qIENPTU1JVFRFRCEqL1xuLyogV2UncmUgY29tbWl0dGVkLCBzbyBrZWVwIHRoZSBpbnRlcmZhY2UgZm9yIGZ1dHVyZSByZWZlcmVuY2UuKi9cbmFzc2VydChpZmFjZSE9PXVuZGVmaW5lZCk7LyogVG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5Ki9cbnJldHVybiAoLyoqIEB0eXBlIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSAqL3JlbW90YWJsZSk7XG4gfTskaOKAjV9vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qKlxuICogQSBjb25jaXNlIGNvbnZlbmllbmNlIGZvciB0aGUgbW9zdCBjb21tb24gYFJlbW90YWJsZWAgdXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIFRoaXMgbmFtZSB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIGBBbGxlZ2VkOiBgXG4gKiBmb3Igbm93IHRvIGZvcm0gdGhlIGBSZW1vdGFibGVgIGBpZmFjZWAgYXJndW1lbnQuXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGVdIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKi9cbmNvbnN0ICAgICAgICBGYXI9KGZhck5hbWUscmVtb3RhYmxlPXVuZGVmaW5lZCk9PntcbmNvbnN0IHI9cmVtb3RhYmxlPT09dW5kZWZpbmVkPy8qKiBAdHlwZSB7VH0gKi97fTpyZW1vdGFibGU7XG5yZXR1cm4gUmVtb3RhYmxlKCBgQWxsZWdlZDogJHtmYXJOYW1lfWAsdW5kZWZpbmVkLHIpO1xuIH07JGjigI1fb25jZS5GYXIoRmFyKTtcbmhhcmRlbihGYXIpO1xuXG4vKipcbiAqIENvZXJjZSBgZnVuY2AgdG8gYSBmYXIgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgaXRzIGNhbGwgYmVoYXZpb3IuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGEgZmFyIGZ1bmN0aW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSBtYWtlIGFuZCByZXR1cm4gYVxuICogbmV3IGZhciBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgZm9yd2FyZHMgY2FsbHMgdG8gaXQuIFRoaXNcbiAqIHdvcmtzIGV2ZW4gaWYgYGZ1bmNgIGlzIGFscmVhZHkgZnJvemVuLiBgVG9GYXJGdW5jdGlvbmAgaXMgdG8gYmUgdXNlZFxuICogd2hlbiB0aGUgZnVuY3Rpb24gY29tZXMgZnJvbSBlbHNld2hlcmUgdW5kZXIgbGVzcyBjb250cm9sLiBGb3IgZnVuY3Rpb25zXG4gKiB5b3UgYXV0aG9yIGluIHBsYWNlLCBiZXR0ZXIgdG8gdXNlIGBGYXJgIG9uIHRoZWlyIGZ1bmN0aW9uIGxpdGVyYWwgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgdG8gYmUgdXNlZCBvbmx5IGlmIGBmdW5jYCBpcyBub3QgYWxyZWFkeSBhXG4gKiBmYXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBmdW5jXG4gKi9cbmNvbnN0ICAgICAgICBUb0ZhckZ1bmN0aW9uPShmYXJOYW1lLGZ1bmMpPT57XG5pZihnZXRJbnRlcmZhY2VPZihmdW5jKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYztcbiB9XG5yZXR1cm4gRmFyKGZhck5hbWUsKC4uLmFyZ3MpPT5mdW5jKC4uLmFyZ3MpKTtcbiB9OyRo4oCNX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAKRe+UdBAAAHQQAACkAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNC9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgUEFTU19TVFlMRSxhc3NlcnRQYXNzYWJsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtjcmVhdGUscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgbWFrZVRhZ2dlZD0odGFnLHBheWxvYWQpPT57XG50eXBlb2YgdGFnPT09J3N0cmluZyd8fFxuRmFpbCBgVGhlIHRhZyBvZiBhIHRhZ2dlZCByZWNvcmQgbXVzdCBiZSBhIHN0cmluZzogJHt0YWd9YDtcbmFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9iamVjdFByb3RvdHlwZSx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOid0YWdnZWQnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTp0YWd9LFxucGF5bG9hZDp7dmFsdWU6cGF5bG9hZCxlbnVtZXJhYmxlOnRydWV9fSkpO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGUAoxvUZAAD1GQAAMAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40L3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjYW5CZU1ldGhvZCIsImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiLCJjaGVja05vcm1hbFByb3BlcnR5IiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldFRhZyIsImhhc093blByb3BlcnR5T2YiLCJpc09iamVjdCIsImlzVHlwZWRBcnJheSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbmdldFByb3RvdHlwZU9mLFxuaGFzT3duUHJvcGVydHk6b2JqZWN0SGFzT3duUHJvcGVydHksXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHt0b1N0cmluZ1RhZzp0b1N0cmluZ1RhZ1N5bWJvbH09U3ltYm9sO1xuXG5jb25zdCB0eXBlZEFycmF5UHJvdG90eXBlPWdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxudHlwZWRBcnJheVByb3RvdHlwZSxcbnRvU3RyaW5nVGFnU3ltYm9sKTtcblxuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPXR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9PT0nZnVuY3Rpb24nKTtcblxuY29uc3QgICAgICAgIGhhc093blByb3BlcnR5T2Y9KG9iaixwcm9wKT0+XG5hcHBseShvYmplY3RIYXNPd25Qcm9wZXJ0eSxvYmosW3Byb3BdKTskaOKAjV9vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG5oYXJkZW4oaGFzT3duUHJvcGVydHlPZik7XG5cbmNvbnN0ICAgICAgICBpc09iamVjdD0odmFsKT0+T2JqZWN0KHZhbCk9PT12YWw7JGjigI1fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKipcbiAqIER1cGxpY2F0ZXMgcGFja2FnZXMvc2VzL3NyYy9tYWtlLWhhcmRlbmVyLmpzIHRvIGF2b2lkIGEgZGVwZW5kZW5jeS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9iamVjdFxuICovXG5jb25zdCAgICAgICAgaXNUeXBlZEFycmF5PShvYmplY3QpPT57XG4vKiBUaGUgb2JqZWN0IG11c3QgcGFzcyBhIGJyYW5kIGNoZWNrIG9yIHRvU3RyaW5nVGFnIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC4qL1xuY29uc3QgdGFnPWFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyxvYmplY3QsW10pO1xucmV0dXJuIHRhZyE9PXVuZGVmaW5lZDtcbiB9OyRo4oCNX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuY29uc3QgICAgICAgIFBBU1NfU1RZTEU9U3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qKlxuICogRm9yIGEgZnVuY3Rpb24gdG8gYmUgYSB2YWxpZCBtZXRob2QsIGl0IG11c3Qgbm90IGJlIHBhc3NhYmxlLlxuICogT3RoZXJ3aXNlLCB3ZSByaXNrIGNvbmZ1c2luZyBwYXNzLWJ5LWNvcHkgZGF0YSBjYXJyeWluZ1xuICogZmFyIGZ1bmN0aW9ucyB3aXRoIGF0dGVtcHRzIGF0IGZhciBvYmplY3RzIHdpdGggbWV0aG9kcy5cbiAqXG4gKiBUT0RPIEhBWkFSRCBCZWNhdXNlIHdlIGNoZWNrIHRoaXMgb24gdGhlIHdheSB0byBoYXJkZW5pbmcgYSByZW1vdGFibGUsXG4gKiB3ZSBjYW5ub3QgeWV0IGNoZWNrIHRoYXQgYGZ1bmNgIGlzIGhhcmRlbmVkLiBIb3dldmVyLCB3aXRob3V0XG4gKiBkb2luZyBzbywgaXQncyBpbmhlcml0YW5jZSBtaWdodCBjaGFuZ2UgYWZ0ZXIgdGhlIGBQQVNTX1NUWUxFYFxuICogY2hlY2sgYmVsb3cuXG4gKlxuICogQHBhcmFtIHthbnl9IGZ1bmNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuY29uc3QgICAgICAgIGNhbkJlTWV0aG9kPShmdW5jKT0+XG50eXBlb2YgZnVuYz09PSdmdW5jdGlvbicmJiEoUEFTU19TVFlMRSBpbiBmdW5jKTskaOKAjV9vbmNlLmNhbkJlTWV0aG9kKGNhbkJlTWV0aG9kKTtcbmhhcmRlbihjYW5CZU1ldGhvZCk7XG5cbi8qKlxuICogQmVsb3cgd2UgaGF2ZSBhIHNlcmllcyBvZiBwcmVkaWNhdGUgZnVuY3Rpb25zIGFuZCB0aGVpciAoY3VycmllZCkgYXNzZXJ0aW9uXG4gKiBmdW5jdGlvbnMuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGFzc2VydGlvbiBmdW5jdGlvbiBpcyBqdXN0IHRvIGFzc2VydCB0aGF0XG4gKiB0aGUgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUgZnVuY3Rpb24gd291bGQgaGF2ZSByZXR1cm5lZCB0cnVlLiBCdXQgaXRcbiAqIHJlcHJvZHVjZXMgdGhlIGludGVybmFsIHRlc3RzIHNvIGZhaWx1cmVzIGNhbiBnaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDaGVja2VyPShjb25kLGRldGFpbHMpPT57XG5hc3NlcnQoY29uZCxkZXRhaWxzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5hc3NlcnRDaGVja2VyKGFzc2VydENoZWNrZXIpO1xuaGFyZGVuKGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIGFuZCBlbnVtZXJhYmlsaXR5IG9mIGFuIG93biBkYXRhIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxzeW1ib2x9IHByb3BlcnR5TmFtZVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRCZUVudW1lcmFibGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja05vcm1hbFByb3BlcnR5PShcbmNhbmRpZGF0ZSxcbnByb3BlcnR5TmFtZSxcbnNob3VsZEJlRW51bWVyYWJsZSxcbmNoZWNrKT0+XG57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgZGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLHByb3BlcnR5TmFtZSk7XG5pZihkZXNjPT09dW5kZWZpbmVkKXtcbnJldHVybihcbnJlamVjdCYmcmVqZWN0KFggYCR7cShwcm9wZXJ0eU5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxucmV0dXJuKFxuKGhhc093blByb3BlcnR5T2YoZGVzYywndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkmJihcblxuc2hvdWxkQmVFbnVtZXJhYmxlP1xuZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKTpcblxuIWRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKFxucHJvcGVydHlOYW1lKVxuIH0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpKTtcblxuXG4gfTskaOKAjV9vbmNlLmNoZWNrTm9ybWFsUHJvcGVydHkoY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5oYXJkZW4oY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5cbmNvbnN0ICAgICAgICBnZXRUYWc9KHRhZ1JlY29yZCk9PnRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRo4oCNX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuY29uc3QgICAgICAgIGNoZWNrUGFzc1N0eWxlPShvYmosZXhwZWN0ZWRQYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgYWN0dWFsPW9ialtQQVNTX1NUWUxFXTtcbnJldHVybihcbmFjdHVhbD09PWV4cGVjdGVkUGFzc1N0eWxlfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkUGFzc1N0eWxlKX0sIG5vdCAke3EoYWN0dWFsKX06ICR7b2JqfWApKTtcblxuIH07JGjigI1fb25jZS5jaGVja1Bhc3NTdHlsZShjaGVja1Bhc3NTdHlsZSk7XG5oYXJkZW4oY2hlY2tQYXNzU3R5bGUpO1xuXG5jb25zdCBtYWtlQ2hlY2tUYWdSZWNvcmQ9KGNoZWNrUHJvdG8pPT57XG4vKipcbiAqIEBwYXJhbSB7eyBbUEFTU19TVFlMRV06IHN0cmluZyB9fSB0YWdSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnUmVjb3JkPSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbnJldHVybihcbihpc09iamVjdCh0YWdSZWNvcmQpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgQSBub24tb2JqZWN0IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiYoXG5pc0Zyb3plbih0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEEgdGFnUmVjb3JkIG11c3QgYmUgZnJvemVuOiAke3RhZ1JlY29yZH1gKSkmJihcbiFpc0FycmF5KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QoWCBgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsUEFTU19TVFlMRSxmYWxzZSxjaGVjaykmJlxuY2hlY2tQYXNzU3R5bGUodGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjaykmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsU3ltYm9sLnRvU3RyaW5nVGFnLGZhbHNlLGNoZWNrKSYmKFxudHlwZW9mIGdldFRhZyh0YWdSZWNvcmQpPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpJiZcblxuY2hlY2tQcm90byh0YWdSZWNvcmQsZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSxjaGVjaykpO1xuXG4gfTtcbnJldHVybiBoYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuIH07XG5cbmNvbnN0ICAgICAgICBjaGVja1RhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKGZhbHNlLFggYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcblxuaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcblxuY29uc3QgICAgICAgIGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5wcm90byE9PW51bGwmJmdldFByb3RvdHlwZU9mKHByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soXG5mYWxzZSxcblggYEZvciBmdW5jdGlvbnMsIGEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tGdW5jdGlvblRhZ1JlY29yZChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcblxuXG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIl0sImlzT2JqZWN0IjpbImlzT2JqZWN0Il0sImlzVHlwZWRBcnJheSI6WyJpc1R5cGVkQXJyYXkiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJjaGVja05vcm1hbFByb3BlcnR5IjpbImNoZWNrTm9ybWFsUHJvcGVydHkiXSwiZ2V0VGFnIjpbImdldFRhZyJdLCJjaGVja1Bhc3NTdHlsZSI6WyJjaGVja1Bhc3NTdHlsZSJdLCJjaGVja1RhZ1JlY29yZCI6WyJjaGVja1RhZ1JlY29yZCJdLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIjpbImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAm6uLx6AeAACgHgAAKgAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40L3NyYy9wYXNzU3R5bGVPZi5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2NvcHlBcnJheS5qcyIsIi4vY29weVJlY29yZC5qcyIsIi4vdGFnZ2VkLmpzIiwiLi9lcnJvci5qcyIsIi4vcmVtb3RhYmxlLmpzIiwiLi9zeW1ib2wuanMiLCIuL3NhZmUtcHJvbWlzZS5qcyJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlIiwicGFzc1N0eWxlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGlzT2JqZWN0LGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLENvcHlBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixSZW1vdGFibGVIZWxwZXIsYXNzZXJ0UGFzc2FibGVTeW1ib2wsYXNzZXJ0U2FmZVByb21pc2U7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsIFskaOKAjV9hID0+IChpc1R5cGVkQXJyYXkgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weUFycmF5SGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsIFskaOKAjV9hID0+IChUYWdnZWRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vc2FmZS1wcm9taXNlLmpzXCIsIFtbXCJhc3NlcnRTYWZlUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2FmZVByb21pc2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVPZn0gUGFzc1N0eWxlT2YgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByaW1pdGl2ZVN0eWxlfSBQcmltaXRpdmVTdHlsZSAqL1xuXG4vKiogQHR5cGVkZWYge0V4Y2x1ZGU8UGFzc1N0eWxlLCBQcmltaXRpdmVTdHlsZSB8IFwicHJvbWlzZVwiPn0gSGVscGVyUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0Zyb3plbn09T2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBQYXNzU3R5bGVIZWxwZXI+IH1cbiAqL1xuXG5jb25zdCBtYWtlSGVscGVyVGFibGU9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG4vKiogQHR5cGUge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIGFueT4gJiB7X19wcm90b19fOiBudWxsfX0gKi9cbmNvbnN0IEhlbHBlclRhYmxlPXtcbl9fcHJvdG9fXzpudWxsLFxuY29weUFycmF5OnVuZGVmaW5lZCxcbmNvcHlSZWNvcmQ6dW5kZWZpbmVkLFxudGFnZ2VkOnVuZGVmaW5lZCxcbmVycm9yOnVuZGVmaW5lZCxcbnJlbW90YWJsZTp1bmRlZmluZWR9O1xuXG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuY29uc3R7c3R5bGVOYW1lfT1oZWxwZXI7XG5zdHlsZU5hbWUgaW4gSGVscGVyVGFibGV8fEZhaWwgYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPT09dW5kZWZpbmVkfHxcbkZhaWwgYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPWhlbHBlcjtcbiB9XG5mb3IoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKXtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV0hPT11bmRlZmluZWR8fFxuRmFpbCBgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKEhlbHBlclRhYmxlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnMgVGhlIHBhc3NTdHlsZUhlbHBlcnMgdG8gcmVnaXN0ZXIsXG4gKiBpbiBwcmlvcml0eSBvcmRlci5cbiAqIE5PVEUgVGhlc2UgbXVzdCBhbGwgYmUgXCJ0cnVzdGVkXCIsXG4gKiBjb21wbGV0ZSwgYW5kIG5vbi1jb2xsaWRpbmcuIGBtYWtlUGFzc1N0eWxlT2ZgIG1heSAqYXNzdW1lKiB0aGF0IGVhY2ggaGVscGVyXG4gKiBkb2VzIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uIGBtYWtlUGFzc1N0eWxlT2ZgIGlzIG5vdCB0cnlpbmcgdG8gZGVmZW5kXG4gKiBpdHNlbGYgYWdhaW5zdCBtYWxpY2lvdXMgaGVscGVycywgdGhvdWdoIGl0IGRvZXMgZGVmZW5kIGFnYWluc3Qgc29tZVxuICogYWNjaWRlbnRzLlxuICogQHJldHVybnMge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2Y9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG5jb25zdCBIZWxwZXJUYWJsZT1tYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG5jb25zdCByZW1vdGFibGVIZWxwZXI9SGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4vKipcbiAqIFB1cmVseSBmb3IgcGVyZm9ybWFuY2UuIEhvd2V2ZXIgaXQgaXMgbXV0YWJsZSBzdGF0aWMgc3RhdGUsIGFuZFxuICogaXQgZG9lcyBoYXZlIHNvbWUgb2JzZXJ2YWJpbGl0eSBvbiBwcm94aWVzLiBUT0RPIG5lZWQgdG8gYXNzZXNzXG4gKiB3aGV0aGVyIHRoaXMgY3JlYXRlcyBhIHN0YXRpYyBjb21tdW5pY2F0aW9ucyBjaGFubmVsLlxuICpcbiAqIHBhc3NTdHlsZU9mIGRvZXMgYSBmdWxsIHJlY3Vyc2l2ZSB3YWxrIG9mIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgaW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB0aGV5IGFyZSBhY3ljbGljLiBJbiBhZGRpdGlvblxuICogaXQgaXMgdXNlZCBieSBvdGhlciBhbGdvcml0aG1zIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2UgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBzbyB3aXRob3V0IHRoaXMgY2FjaGUsIHRoZXNlIGFsZ29yaXRobXMgY291bGQgYmVcbiAqIE8oTioqMikgb3Igd29yc2UuXG4gKlxuICogQHR5cGUge1dlYWtNYXA8UGFzc2FibGUsIFBhc3NTdHlsZT59XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU1lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mPShwYXNzYWJsZSk9Pntcbi8qIEV2ZW4gd2hlbiBhIFdlYWtTZXQgaXMgY29ycmVjdCwgd2hlbiB0aGUgc2V0IGhhcyBhIHNob3J0ZXIgbGlmZXRpbWUqL1xuLyogdGhhbiBpdHMga2V5cywgd2UgcHJlZmVyIGEgU2V0IGR1ZSB0byBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiovXG4vKiB0cmFkZW9mZnMuKi9cbmNvbnN0IGluUHJvZ3Jlc3M9bmV3IFNldCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZSZWN1cj0oaW5uZXIpPT57XG5jb25zdCBpbm5lcklzT2JqZWN0PWlzT2JqZWN0KGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xuaWYocGFzc1N0eWxlTWVtby5oYXMoaW5uZXIpKXtcbi8qIEB0cy1pZ25vcmUgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdCBgZ2V0YCBhZnRlciBgaGFzYCBpcyBzYWZlKi9cbnJldHVybiBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gfVxuIWluUHJvZ3Jlc3MuaGFzKGlubmVyKXx8XG5GYWlsIGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbmluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5wYXNzU3R5bGVNZW1vLnNldChpbm5lcixwYXNzU3R5bGUpO1xuaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuIH1cbnJldHVybiBwYXNzU3R5bGU7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWw9KGlubmVyKT0+e1xuY29uc3QgdHlwZXN0cj10eXBlb2YgaW5uZXI7XG5zd2l0Y2godHlwZXN0cil7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOntcbnJldHVybiB0eXBlc3RyO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG5yZXR1cm4nc3ltYm9sJztcbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoaW5uZXI9PT1udWxsKXtcbnJldHVybidudWxsJztcbiB9XG5pZighaXNGcm96ZW4oaW5uZXIpKXtcbmFzc2VydC5mYWlsKFxuLyogVHlwZWRBcnJheXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGluIGhhcmRlbigpKi9cbi8qIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3BlY2lhbCBlcnJvciBtZXNzYWdlIGhlcmUuKi9cbmlzVHlwZWRBcnJheShpbm5lcik/XG5YIGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmA6XG5YIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCk7XG5cbiB9XG5pZihpc1Byb21pc2UoaW5uZXIpKXtcbmFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbnJldHVybidwcm9taXNlJztcbiB9XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbmNvbnN0IHBhc3NTdHlsZVRhZz1pbm5lcltQQVNTX1NUWUxFXTtcbmlmKHBhc3NTdHlsZVRhZyE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywnc3RyaW5nJyk7XG5jb25zdCBoZWxwZXI9SGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbmhlbHBlciE9PXVuZGVmaW5lZHx8XG5GYWlsIGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuICgvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi9wYXNzU3R5bGVUYWcpO1xuIH1cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5pZihoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpe1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gfVxuIH1cbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmNhc2UnZnVuY3Rpb24nOntcbmlzRnJvemVuKGlubmVyKXx8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChYIGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07XG5cbnJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiB9O1xucmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG4gfTtcblxuLyoqXG4gKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgYFZhdGFEYXRhYCBnbG9iYWwgY29udGFpbmluZyBhIGBwYXNzU3R5bGVPZmAsXG4gKiB0aGVuIHByZXN1bWFibHkgaXQgd2FzIGVuZG93ZWQgZm9yIHVzIGJ5IGxpdmVzbG90cywgc28gd2Ugc2hvdWxkIHVzZVxuICogYW5kIGV4cG9ydCB0aGF0IG9uZSBpbnN0ZWFkLiBPdGhlciBzb2Z0d2FyZSBtYXkgaGF2ZSBsZWZ0IGl0IGZvciB1cyBoZXJlLFxuICogYnV0IGl0IHdvdWxkIHJlcXVpcmUgd3JpdGUgYWNjZXNzIHRvIG91ciBnbG9iYWwsIG9yIHRoZSBhYmlsaXR5IHRvXG4gKiBwcm92aWRlIGVuZG93bWVudHMgdG8gb3VyIGdsb2JhbCwgYm90aCBvZiB3aGljaCBzZWVtcyBhZGVxdWF0ZSBhcyBhIHRlc3Qgb2ZcbiAqIHdoZXRoZXIgaXQgaXMgYXV0aG9yaXplZCB0byBzZXJ2ZSB0aGUgc2FtZSByb2xlIGFzIGxpdmVzbG90cy5cbiAqXG4gKiBOT1RFIEhBWkFSRDogVGhpcyB1c2UgYnkgbGl2ZXNsb3RzIGRvZXMgcmVseSBvbiBgcGFzc1N0eWxlT2ZgIGJlaW5nXG4gKiBkZXRlcm1pbmlzdGljLiBJZiBpdCBpcyBub3QsIHRoZW4gaW4gYSBsaXZlc2xvdC1saWtlIHZpcnR1YWxpemVkXG4gKiBlbnZpcm9ubWVudCwgaXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IEdDLlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgICAgICAgIHBhc3NTdHlsZU9mPVxuLyogUHJlZmVyOiBnbG9iYWxUaGlzPy5WYXREYXRhPy5wYXNzU3R5bGVPZiB8fCovXG5nbG9iYWxUaGlzJiZnbG9iYWxUaGlzLlZhdERhdGEmJmdsb2JhbFRoaXMuVmF0RGF0YS5wYXNzU3R5bGVPZnx8XG5tYWtlUGFzc1N0eWxlT2YoW1xuQ29weUFycmF5SGVscGVyLFxuQ29weVJlY29yZEhlbHBlcixcblRhZ2dlZEhlbHBlcixcbkVycm9ySGVscGVyLFxuUmVtb3RhYmxlSGVscGVyXSk7JGjigI1fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlPSh2YWwpPT57XG5wYXNzU3R5bGVPZih2YWwpOy8qIHRocm93cyBpZiB2YWwgaXMgbm90IGEgcGFzc2FibGUqL1xuIH07JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZShhc3NlcnRQYXNzYWJsZSk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABSxon3DIQAAwyEAACgAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNC9zcmMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImdldEludGVyZmFjZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsaGFzT3duUHJvcGVydHlPZixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNPYmplY3QsZ2V0VGFnOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5NYXJzaGFsR2V0SW50ZXJmYWNlT2Z9IE1hcnNoYWxHZXRJbnRlcmZhY2VPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGUsXG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tJZmFjZT0oaWZhY2UsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4odHlwZW9mIGlmYWNlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpJiYoXG5cbmlmYWNlPT09J1JlbW90YWJsZSd8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJyl8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRm9yIG5vdywgaWZhY2UgJHtxKFxuaWZhY2UpXG4gfSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aCBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIjsgdW5pbXBsZW1lbnRlZGApKSk7XG5cblxuIH07XG5cbi8qKlxuICogQW4gYGlmYWNlYCBtdXN0IGJlIHB1cmUuIFJpZ2h0IG5vdyBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aGljaCBpcyBwdXJlLlxuICogTGF0ZXIgd2UgZXhwZWN0IHRvIGluY2x1ZGUgc29tZSBvdGhlciB2YWx1ZXMgdGhhdCBxdWFsaWZ5IGFzIGBQdXJlRGF0YWAsXG4gKiB3aGljaCBpcyBhIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBlbmRpbmcgb25seSBpbiBwcmltaXRpdmVzIG9yXG4gKiBlbXB0eSBwYXNzLWJ5LWNvcHkgY29tcG9zaXRlcy4gTm8gcmVtb3RhYmxlcywgcHJvbWlzZXMsIG9yIGVycm9ycy5cbiAqIFdlICphc3N1bWUqIGZvciBub3cgdGhhdCB0aGUgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGNvbnRhaW5zIG5vXG4gKiBwcm94aWVzLlxuICpcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydElmYWNlPShpZmFjZSk9PmNoZWNrSWZhY2UoaWZhY2UsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0IHwgRnVuY3Rpb259IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2Y9KG9yaWdpbmFsLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlzT2JqZWN0KG9yaWdpbmFsKXx8XG5GYWlsIGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuLyogQSB2YWxpZCByZW1vdGFibGUgb2JqZWN0IG11c3QgaW5oZXJpdCBmcm9tIGEgXCJ0YWcgcmVjb3JkXCIgLS0gYSovXG4vKiBwbGFpbi1vYmplY3QgcHJvdG90eXBlIGNvbnNpc3Rpbmcgb2Ygb25seSovXG4vKiBhIGBQQVNTX1NUWUxFYCBwcm9wZXJ0eSB3aXRoIHZhbHVlIFwicmVtb3RhYmxlXCIgYW5kIGEgc3VpdGFibGUgYFN5bWJvbC50b1N0cmluZ1RhZ2AqL1xuLyogcHJvcGVydHkuIFRoZSByZW1vdGFibGUgY291bGQgaW5oZXJpdCBkaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLCBvciovXG4vKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4vKiBpbmhlcml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQuKi9cbi8qKi9cbi8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuLyogd2l0aCBQQVNTX1NUWUxFIGZyb20gSlNEb2MuKi9cbi8qKi9cbi8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4vKiBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nLCovXG4vKiB9fSovXG4vKiovXG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG5pZihwcm90bz09PW9iamVjdFByb3RvdHlwZXx8cHJvdG89PT1udWxsKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVtb3RhYmxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQ6ICR7cShvcmlnaW5hbCl9YCkpO1xuXG4gfVxuXG5pZih0eXBlb2Ygb3JpZ2luYWw9PT0nb2JqZWN0Jyl7XG5jb25zdCBwcm90b1Byb3RvPWdldFByb3RvdHlwZU9mKHByb3RvKTtcbmlmKHByb3RvUHJvdG8hPT1vYmplY3RQcm90b3R5cGUmJnByb3RvUHJvdG8hPT1udWxsKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sY2hlY2spO1xuIH1cbmlmKCFjaGVja1RhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9ZWxzZSBpZih0eXBlb2Ygb3JpZ2luYWw9PT0nZnVuY3Rpb24nKXtcbmlmKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOnt2YWx1ZTppZmFjZX0sXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbnJldHVybihcbihvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkmJlxuXG5jaGVja0lmYWNlKGlmYWNlLGNoZWNrKSk7XG5cbiB9O1xuXG4vKipcbiAqIEtlZXAgYSB3ZWFrIHNldCBvZiBjb25maXJtZWQgcmVtb3RhYmxlcyBmb3IgbWFyc2hhbCBwZXJmb3JtYW5jZVxuICogKHdpdGhvdXQgd2hpY2ggd2Ugd291bGQgaW5jdXIgYSByZWR1bmRhbnQgdmVyaWZpY2F0aW9uIGluXG4gKiBnZXRJbnRlcmZhY2VPZikuXG4gKiBXZSBkb24ndCByZW1lbWJlciByZWplY3Rpb25zIGJlY2F1c2UgdGhleSBhcmUgcG9zc2libGUgdG8gY29ycmVjdFxuICogd2l0aCBlLmcuIGBoYXJkZW5gLlxuICpcbiAqIEB0eXBlIHtXZWFrU2V0PFJlbW90YWJsZT59XG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXM9bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZT0odmFsLGNoZWNrKT0+e1xuaWYoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoIWlzRnJvemVuKHZhbCkpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YCk7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCByZXN1bHQ9Y2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKiBAdHlwZSB7TWFyc2hhbEdldEludGVyZmFjZU9mfSAqL1xuY29uc3QgICAgICAgIGdldEludGVyZmFjZU9mPSh2YWwpPT57XG5pZihcbiFpc09iamVjdCh2YWwpfHxcbnZhbFtQQVNTX1NUWUxFXSE9PSdyZW1vdGFibGUnfHxcbiFjaGVja1JlbW90YWJsZSh2YWwpKVxue1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm4gZ2V0VGFnKHZhbCk7XG4gfTskaOKAjV9vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGVIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZToncmVtb3RhYmxlJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCB2YWxpZFR5cGU9XG4oaXNPYmplY3QoY2FuZGlkYXRlKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKSYmKFxuIWlzQXJyYXkoY2FuZGlkYXRlKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG5pZighdmFsaWRUeXBlKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nb2JqZWN0Jyl7XG4vKiBFdmVyeSBvd24gcHJvcGVydHkgKHJlZ2FyZGxlc3Mgb2YgZW51bWVyYWJpbGl0eSkqL1xuLyogbXVzdCBoYXZlIGEgZnVuY3Rpb24gdmFsdWUuKi9cbnJldHVybiBvd25LZXlzKGRlc2NzKS5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuLyogVHlwZWNhc3QgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuKGhhc093blByb3BlcnR5T2YoZGVzY3NbLyoqIEB0eXBlIHtzdHJpbmd9ICova2V5XSwndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxua2V5PT09U3ltYm9sLnRvU3RyaW5nVGFnJiZjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLGNoZWNrKXx8XG4oY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmtleSE9PVBBU1NfU1RZTEV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpO1xuXG4gfSk7XG4gfWVsc2UgaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdmdW5jdGlvbicpe1xuLyogRmFyIGZ1bmN0aW9ucyBjYW5ub3QgYmUgbWV0aG9kcywgYW5kIGNhbm5vdCBoYXZlIG1ldGhvZHMuKi9cbi8qIFRoZXkgbXVzdCBoYXZlIGV4YWN0bHkgZXhwZWN0ZWQgYC5uYW1lYCBhbmQgYC5sZW5ndGhgIHByb3BlcnRpZXMqL1xuY29uc3R7XG5uYW1lOm5hbWVEZXNjLFxubGVuZ3RoOmxlbmd0aERlc2MsXG4vKiBAdHMtaWdub3JlIFRTIGRvZXNuJ3QgbGlrZSBzeW1ib2xzIGFzIGNvbXB1dGVkIGluZGV4ZXM/PyovXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp0b1N0cmluZ1RhZ0Rlc2MsXG4uLi5yZXN0RGVzY3N9PVxuZGVzY3M7XG5jb25zdCByZXN0S2V5cz1vd25LZXlzKHJlc3REZXNjcyk7XG5yZXR1cm4oXG4obmFtZURlc2MmJnR5cGVvZiBuYW1lRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5sZW5ndGhEZXNjJiZ0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZT09PSdudW1iZXInfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG50b1N0cmluZ1RhZ0Rlc2M9PT11bmRlZmluZWR8fFxuKHR5cGVvZiB0b1N0cmluZ1RhZ0Rlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiZcblxuY2hlY2tJZmFjZSh0b1N0cmluZ1RhZ0Rlc2MudmFsdWUsY2hlY2spKSYmKFxucmVzdEtleXMubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9ucyB1bmV4cGVjdGVkIHByb3BlcnRpZXMgYmVzaWRlcyAubmFtZSBhbmQgLmxlbmd0aCAke3Jlc3RLZXlzfWApKSk7XG5cblxuIH1cbnJldHVybiByZWplY3QmJnJlamVjdChYIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWApO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT5jaGVja1JlbW90YWJsZShjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlciksXG5cbmV2ZXJ5OihfcGFzc2FibGUsX2ZuKT0+dHJ1ZX0pOyRo4oCNX29uY2UuUmVtb3RhYmxlSGVscGVyKFJlbW90YWJsZUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAym6GHmg8AAJoPAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGFzc2VydENoZWNrZXIsaGFzT3duUHJvcGVydHlPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0Zyb3plbixnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2V9IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuY29uc3Qga2V5cz1vd25LZXlzKHByKTtcblxuaWYoa2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuY29uc3QgdW5rbm93bktleXM9a2V5cy5maWx0ZXIoXG4oa2V5KT0+dHlwZW9mIGtleSE9PSdzeW1ib2wnfHwhaGFzT3duUHJvcGVydHlPZihQcm9taXNlLnByb3RvdHlwZSxrZXkpKTtcblxuXG5pZih1bmtub3duS2V5cy5sZW5ndGghPT0wKXtcbnJldHVybiByZWplY3QoXG5YIGAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWApO1xuXG4gfVxuXG4vKipcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBhbHNvIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuY29uc3QgY2hlY2tTYWZlQXN5bmNIb29rc0tleT0oa2V5KT0+e1xuY29uc3QgdmFsPXByW2tleV07XG5pZih2YWw9PT11bmRlZmluZWR8fHR5cGVvZiB2YWw9PT0nbnVtYmVyJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihcbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmXG52YWwhPT1udWxsJiZcbmlzRnJvemVuKHZhbCkmJlxuZ2V0UHJvdG90eXBlT2YodmFsKT09PU9iamVjdC5wcm90b3R5cGUpXG57XG5jb25zdCBzdWJLZXlzPW93bktleXModmFsKTtcbmlmKHN1YktleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmlmKFxuc3ViS2V5cy5sZW5ndGg9PT0xJiZcbnN1YktleXNbMF09PT0nZGVzdHJveWVkJyYmXG52YWwuZGVzdHJveWVkPT09ZmFsc2UpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIHJlamVjdChcblggYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpcyAke3ZhbH1gKTtcblxuIH07XG5cbnJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZUFzeW5jSG9va3NLZXkpO1xuIH07XG5cbi8qKlxuICogVW5kZXIgSGFyZGVuZWQgSlMgYSBwcm9taXNlIGlzIFwic2FmZVwiIGlmIGl0cyBgdGhlbmAgbWV0aG9kIGNhbiBiZSBjYWxsZWRcbiAqIHN5bmNocm9ub3VzbHkgd2l0aG91dCBnaXZpbmcgdGhlIHByb21pc2UgYW4gb3Bwb3J0dW5pdHkgZm9yIGFcbiAqIHJlZW50cmFuY3kgYXR0YWNrIGR1cmluZyB0aGF0IGNhbGwuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85XG4gKiByYWlzZXMgdGhlIGlzc3VlIG9mIHRlc3RpbmcgdGhhdCBhIHNwZWNpbWVuIGlzIGEgc2FmZSBwcm9taXNlXG4gKiBzdWNoIHRoYXQgdGhlIHRlc3QgYWxzbyBkb2VzIG5vdCBnaXZlIHRoZSBzcGVjaW1lbiBhXG4gKiByZWVudHJhbmN5IG9wcG9ydHVuaXR5LiBUaGF0IGlzIHdlbGwgYmV5b25kIHRoZSBhbWJpdGlvbiBoZXJlLlxuICogVE9ETyBUaG91Z2ggaWYgd2UgZmlndXJlIG91dCBhIG5pY2Ugc29sdXRpb24sIGl0IG1pZ2h0IGJlIGdvb2QgdG9cbiAqIHVzZSBpdCBoZXJlIGFzIHdlbGwuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZT0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbnJldHVybihcbihpc0Zyb3plbihwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkpJiYoXG5pc1Byb21pc2UocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApKSYmKFxuZ2V0UHJvdG90eXBlT2YocHIpPT09UHJvbWlzZS5wcm90b3R5cGV8fFxucmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IGluaGVyaXQgZnJvbSBQcm9taXNlLnByb3RvdHlwZTogJHtxKFxuZ2V0UHJvdG90eXBlT2YocHIpKVxuIH1gKSkmJlxuXG5jaGVja1Byb21pc2VPd25LZXlzKC8qKiBAdHlwZSB7UHJvbWlzZX0gKi9wcixjaGVjaykpO1xuXG4gfTtcbmhhcmRlbihjaGVja1NhZmVQcm9taXNlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuY29uc3QgICAgICAgIGlzU2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwciwoeCk9PngpOyRo4oCNX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuY29uc3QgICAgICAgIGFzc2VydFNhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRTYWZlUHJvbWlzZShhc3NlcnRTYWZlUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMcf1VBHEgAARxIAACUAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNC9zcmMvc3ltYm9sLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBjb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogVGhlIHdlbGwga25vd24gc3ltYm9scyBhcmUgc3RhdGljIHN5bWJvbCB2YWx1ZXMgb24gdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yLlxuICovXG5jb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcz1uZXcgTWFwKFxub3duS2V5cyhTeW1ib2wpLlxuZmlsdGVyKFxuKG5hbWUpPT50eXBlb2YgbmFtZT09PSdzdHJpbmcnJiZ0eXBlb2YgU3ltYm9sW25hbWVdPT09J3N5bWJvbCcpLlxuXG5maWx0ZXIoKG5hbWUpPT57XG4vKiBAdHMtZXhwZWN0LWVycm9yIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovXG4hbmFtZS5zdGFydHNXaXRoKCdAQCcpfHxcbkZhaWwgYERpZCBub3QgZXhwZWN0IFN5bWJvbCB0byBoYXZlIGEgc3ltYm9sLXZhbHVlZCBwcm9wZXJ0eSBuYW1lIHN0YXJ0aW5nIHdpdGggXCJAQFwiICR7cShcbm5hbWUpXG4gfWA7XG5yZXR1cm4gdHJ1ZTtcbiB9KVxuLyogQHRzLWlnbm9yZSBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqLy5cbm1hcCgobmFtZSk9PltTeW1ib2xbbmFtZV0sIGBAQCR7bmFtZX1gXSkpO1xuXG5cbi8qKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3ltXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUGFzc2FibGVTeW1ib2w9KHN5bSk9PlxudHlwZW9mIHN5bT09PSdzeW1ib2wnJiYoXG50eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pPT09J3N0cmluZyd8fHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaOKAjV9vbmNlLmlzUGFzc2FibGVTeW1ib2woaXNQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oaXNQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG5pc1Bhc3NhYmxlU3ltYm9sKHN5bSl8fFxuRmFpbCBgT25seSByZWdpc3RlcmVkIHN5bWJvbHMgb3Igd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZTogJHtxKHN5bSl9YDskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qKlxuICogSWYgYHN5bWAgaXMgYSBwYXNzYWJsZSBzeW1ib2wsIHJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpc1xuICogc3ltYm9sLiBJZiBgc3ltYCBpcyBhIG5vbi1wYXNzYWJsZSBzeW1ib2wsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLiBTaW5jZSB0aGUgcmVnaXN0cmF0aW9uIHN0cmluZyBvZiBhIHJlZ2lzdGVyZWQgc3ltYm9sIGNhbiBiZSBhbnlcbiAqIHN0cmluZywgaWYgd2Ugc2ltcGx5IHVzZWQgdGhhdCB0byBpZGVudGlmeSB0aG9zZSBzeW1ib2xzLCB0aGVyZSB3b3VsZCBub3RcbiAqIGJlIGFueSByZW1haW5pbmcgc3RyaW5ncyBsZWZ0IG92ZXIgdG8gaWRlbnRpZnkgdGhlIHdlbGwta25vd24gc3ltYm9scy5cbiAqIEluc3RlYWQsIHdlIHJlc2VydmUgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgXCJAQFwiYCBmb3IgcHVycG9zZXMgb2YgdGhpc1xuICogZW5jb2RpbmcuIFdlIGlkZW50aWZ5IGEgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhcyBgU3ltYm9sLml0ZXJhdG9yYFxuICogYnkgcHJlZml4aW5nIHRoZSBwcm9wZXJ0eSBuYW1lIHdpdGggYFwiQEBcImAsIHN1Y2ggYXMgYFwiQEBpdGVyYXRvclwiYC5cbiAqIEZvciByZWdpc3RlcmVkIHN5bWJvbHMgd2hvc2UgbmFtZSBoYXBwZW5zIHRvIGJlZ2luIHdpdGggYFwiQEBcImAsIHN1Y2hcbiAqIGFzIGBTeW1ib2wuZm9yKCdAQGl0ZXJhdG9yJylgIG9yIGBTeW1ib2wuZm9yKCdAQGZvbycpYCwgd2UgaWRlbnRpZnlcbiAqIHRoZW0gYnkgcHJlZml4aW5nIHRoZW0gd2l0aCBhbiBleHRyYSBgXCJAQFwiYCwgc3VjaCBhc1xuICogYFwiQEBAQGl0ZXJhdG9yXCJgIG9yIGBcIkBAQEBmb29cImAuIChUaGlzIGlzIHRoZSBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nXG4gKiB0ZWNobmlxdWUuKVxuICpcbiAqIEBwYXJhbSB7c3ltYm9sfSBzeW1cbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovXG5jb25zdCAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sPShzeW0pPT57XG5jb25zdCBuYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKG5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHdlbGxLbm93blN5bWJvbE5hbWVzLmdldChzeW0pO1xuIH1cbmlmKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gYEBAJHtuYW1lfWA7XG4gfVxucmV0dXJuIG5hbWU7XG4gfTskaOKAjV9vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIElmIGBuYW1lYCBpcyBhIHN0cmluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieVxuICogYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAsIHJldHVybiB0aGUgc3ltYm9sIGFyZ3VtZW50IGl0IHdhcyBwcm9kdWNlZCB0b1xuICogcmVwcmVzZW50LlxuICpcbiAqICAgIElmIGBuYW1lYCBkb2VzIG5vdCBiZWdpbiB3aXRoIGBcIkBAXCJgLCB0aGVuIGp1c3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgcmVnaXN0ZXJlZCBzeW1ib2wsIGBTeW1ib2wuZm9yKG5hbWUpYC5cbiAqICAgIElmIGBuYW1lYCBpcyBgXCJAQFwiYCBmb2xsb3dlZCBieSBhIHdlbGwga25vd24gc3ltYm9sJ3MgcHJvcGVydHkgbmFtZSBvblxuICogICAgICBgU3ltYm9sYCBzdWNoIGBcIkBAaXRlcmF0b3JcIiwgcmV0dXJuIHRoYXQgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhc1xuICogICAgICBgU3ltYm9sLml0ZXJhdG9yYFxuICogICAgSWYgYG5hbWVgIGJlZ2lucyB3aXRoIGBcIkBAQEBcImAgaXQgZW5jb2RlcyB0aGUgcmVnaXN0ZXJlZCBzeW1ib2wgd2hvc2VcbiAqICAgICAgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpbnN0ZWFkLlxuICogICAgT3RoZXJ3aXNlLCBpZiBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGl0IG1heSBlbmNvZGUgYSByZWdpc3RlcmVkIHN5bWJvbFxuICogICAgICBmcm9tIGEgZnV0dXJlIHZlcnNpb24gb2YgSmF2YVNjcmlwdCwgYnV0IGl0IGlzIG5vdCBvbmUgd2UgY2FuIGRlY29kZVxuICogICAgICB5ZXQsIHNvIHRocm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sPX1cbiAqL1xuY29uc3QgICAgICAgIHBhc3NhYmxlU3ltYm9sRm9yTmFtZT0obmFtZSk9PntcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuaWYobWF0Y2gpe1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuaWYoc3VmZml4LnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiB9ZWxzZXtcbmNvbnN0IHN5bT1TeW1ib2xbc3VmZml4XTtcbmlmKHR5cGVvZiBzeW09PT0nc3ltYm9sJyl7XG5yZXR1cm4gc3ltO1xuIH1cbkZhaWwgYFJlc2VydmVkIGZvciB3ZWxsIGtub3duIHN5bWJvbCAke3Eoc3VmZml4KX06ICR7cShuYW1lKX1gO1xuIH1cbiB9XG5yZXR1cm4gU3ltYm9sLmZvcihuYW1lKTtcbiB9OyRo4oCNX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlU3ltYm9sIjpbImlzUGFzc2FibGVTeW1ib2wiXSwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACW8XPv9BwAA/QcAACUAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNC9zcmMvdGFnZ2VkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJUYWdnZWRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjaGVja1RhZ1JlY29yZCxQQVNTX1NUWUxFLGNoZWNrTm9ybWFsUHJvcGVydHksY2hlY2tQYXNzU3R5bGU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJjaGVja1Bhc3NTdHlsZVwiLCBbJGjigI1fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgVGFnZ2VkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3RhZ2dlZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwndGFnZ2VkJyxjaGVjayksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwndGFnZ2VkJyxhc3NlcnRDaGVja2VyKTtcblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOl9sYWJlbERlc2MsXG5wYXlsb2FkOl9wYXlsb2FkRGVzYywvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbkZhaWwgYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdwYXlsb2FkJyx0cnVlLGFzc2VydENoZWNrZXIpO1xuXG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5wYXNzU3R5bGVPZlJlY3VyKGNhbmRpZGF0ZS5wYXlsb2FkKTtcbiB9fSk7JGjigI1fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHqgfmgSDQAAEg0AACkAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNC9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBhcnJheSwgQUtBIGEgXCJjb3B5QXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFyclxuICogQHJldHVybnMge2FyciBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuY29uc3QgaXNDb3B5QXJyYXk9KGFycik9PnBhc3NTdHlsZU9mKGFycik9PT0nY29weUFycmF5JzskaOKAjV9vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBBS0EgYVxuICogXCJjb3B5UmVjb3JkXCIgaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHJldHVybnMge3JlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbmNvbnN0IGlzUmVjb3JkPShyZWNvcmQpPT5wYXNzU3R5bGVPZihyZWNvcmQpPT09J2NvcHlSZWNvcmQnOyRo4oCNX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHJlbW90YWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtyZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5jb25zdCBpc1JlbW90YWJsZT0ocmVtb3RhYmxlKT0+cGFzc1N0eWxlT2YocmVtb3RhYmxlKT09PSdyZW1vdGFibGUnOyRo4oCNX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0QXJyYXlcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFycmF5XG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnJheSBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydEFycmF5fSAqL1xuY29uc3QgYXNzZXJ0Q29weUFycmF5PShhcnJheSxvcHROYW1lT2ZBcnJheT0nQWxsZWdlZCBhcnJheScpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YoYXJyYXkpO1xucGFzc1N0eWxlPT09J2NvcHlBcnJheSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJheX0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBhcnJheSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVjb3JkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVjb3JkfSAqL1xuY29uc3QgYXNzZXJ0UmVjb3JkPShyZWNvcmQsb3B0TmFtZU9mUmVjb3JkPSdBbGxlZ2VkIHJlY29yZCcpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVjb3JkKTtcbnBhc3NTdHlsZT09PSdjb3B5UmVjb3JkJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVjb3JkKX0gJHtyZWNvcmR9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZW1vdGFibGVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZW1vdGFibGVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZW1vdGFibGV9ICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGU9KFxucmVtb3RhYmxlLFxub3B0TmFtZU9mUmVtb3RhYmxlPSdBbGxlZ2VkIHJlbW90YWJsZScpPT5cbntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZW1vdGFibGUpO1xucGFzc1N0eWxlPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAY/McSuIKAADiCgAAHgAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIiwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIiwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIiwiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyIsIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4vc3JjL3V0aWxzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiLCJiYWdDb21wYXJlIiwiYmFnQ29tcGFyZSIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCIsImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciIsImtleUxUIiwia2V5TFQiLCJvYmplY3RNYXAiLCJvYmplY3RNYXAiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2tleXMvY2hlY2tLZXkuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weVNldC5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5QmFnLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy91dGlscy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXV0sIi4vc3JjL2tleXMvY29weVNldC5qcyI6W1siY29lcmNlVG9FbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiXV0sIi4vc3JjL2tleXMvY29weUJhZy5qcyI6W1siY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIl1dLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjpbWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdXSwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjpbWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOltbImJhZ0lzU3VwZXJiYWciLCJiYWdJc1N1cGVyYmFnIl0sWyJiYWdDb21wYXJlIiwiYmFnQ29tcGFyZSJdLFsiYmFnVW5pb24iLCJiYWdVbmlvbiJdLFsiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSW50ZXJzZWN0aW9uIl0sWyJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnRGlzam9pbnRTdWJ0cmFjdCJdXSwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIjpbWyJNIiwiTSJdLFsiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIl0sWyJpc1BhdHRlcm4iLCJpc1BhdHRlcm4iXSxbImFzc2VydFBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIl0sWyJtYXRjaGVzIiwibWF0Y2hlcyJdLFsibXVzdE1hdGNoIiwibXVzdE1hdGNoIl1dLCIuL3NyYy91dGlscy5qcyI6W1sibGlzdERpZmZlcmVuY2UiLCJsaXN0RGlmZmVyZW5jZSJdLFsib2JqZWN0TWFwIiwib2JqZWN0TWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB3ZHAMpEYAAKRGAAAqAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4zL3NyYy9rZXlzL2NoZWNrS2V5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCIuLi91dGlscy5qcyIsIi4vY29weVNldC5qcyIsIi4vY29weUJhZy5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weVNldCIsImFzc2VydEtleSIsImFzc2VydFByaW1pdGl2ZUtleSIsImFzc2VydFNjYWxhcktleSIsImNoZWNrQ29weUJhZyIsImNoZWNrQ29weU1hcCIsImNoZWNrQ29weVNldCIsImNoZWNrS2V5IiwiY2hlY2tTY2FsYXJLZXkiLCJjb3B5TWFwS2V5U2V0IiwiZXZlcnlDb3B5QmFnRW50cnkiLCJldmVyeUNvcHlNYXBLZXkiLCJldmVyeUNvcHlNYXBWYWx1ZSIsImV2ZXJ5Q29weVNldEtleSIsImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwS2V5cyIsImdldENvcHlNYXBWYWx1ZXMiLCJnZXRDb3B5U2V0S2V5cyIsImlzQ29weUJhZyIsImlzQ29weU1hcCIsImlzQ29weVNldCIsImlzS2V5IiwiaXNQcmltaXRpdmVLZXkiLCJpc1NjYWxhcktleSIsIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weU1hcCIsIm1ha2VDb3B5U2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsYXNzZXJ0UGFzc2FibGUsRmFyLGdldFRhZyxpc09iamVjdCxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGlkZW50Q2hlY2tlcixjaGVja0VsZW1lbnRzLG1ha2VTZXRPZkVsZW1lbnRzLGNoZWNrQmFnRW50cmllcyxtYWtlQmFnT2ZFbnRyaWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuLi91dGlscy5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChpZGVudENoZWNrZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5U2V0LmpzXCIsIFtbXCJjaGVja0VsZW1lbnRzXCIsIFskaOKAjV9hID0+IChjaGVja0VsZW1lbnRzID0gJGjigI1fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJjaGVja0JhZ0VudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQmFnRW50cmllcyA9ICRo4oCNX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLCBbJGjigI1fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyaXNvbn0gS2V5Q29tcGFyaXNvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleX0gS2V5ICovXG4vKiogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV0gQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ29weUJhZzxLPn0gQ29weUJhZyAqL1xuLyoqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkNvcHlTZXQ8Sz59IENvcHlTZXQgKi9cbi8qKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XSBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVj1QYXNzYWJsZV0gQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ29weU1hcDxLLCBWPn0gQ29weU1hcCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleUNvbXBhcmV9IEtleUNvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vIFByaW1pdGl2ZSBhbmQgU2NhbGFyIGtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUHJpbWl0aXZlS2V5PSh2YWwsY2hlY2spPT57XG5pZihpc09iamVjdCh2YWwpKXtcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgJHtxKHR5cGVvZiB2YWwpfSBjYW5ub3QgYmUgYSBwcmltaXRpdmU6ICR7dmFsfWApKTtcblxuIH1cbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1ByaW1pdGl2ZUtleT0odmFsKT0+Y2hlY2tQcmltaXRpdmVLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc1ByaW1pdGl2ZUtleShpc1ByaW1pdGl2ZUtleSk7XG5oYXJkZW4oaXNQcmltaXRpdmVLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQcmltaXRpdmVLZXk9KHZhbCk9PntcbmNoZWNrUHJpbWl0aXZlS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UHJpbWl0aXZlS2V5KGFzc2VydFByaW1pdGl2ZUtleSk7XG5oYXJkZW4oYXNzZXJ0UHJpbWl0aXZlS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tTY2FsYXJLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzUHJpbWl0aXZlS2V5KHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5pZihwYXNzU3R5bGU9PT0ncmVtb3RhYmxlJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgc2NhbGFyIGtleTogJHt2YWx9YCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5jaGVja1NjYWxhcktleShjaGVja1NjYWxhcktleSk7XG5jb25zdCAgICAgICAgaXNTY2FsYXJLZXk9KHZhbCk9PmNoZWNrU2NhbGFyS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNTY2FsYXJLZXkoaXNTY2FsYXJLZXkpO1xuaGFyZGVuKGlzU2NhbGFyS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0U2NhbGFyS2V5PSh2YWwpPT57XG5jaGVja1NjYWxhcktleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydFNjYWxhcktleShhc3NlcnRTY2FsYXJLZXkpO1xuaGFyZGVuKGFzc2VydFNjYWxhcktleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PEtleT59ICovXG5jb25zdCBrZXlNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrS2V5PSh2YWwsY2hlY2spPT57XG5pZighaXNPYmplY3QodmFsKSl7XG4vKiBUT0RPIFRoZXJlIGlzIG5vdCB5ZXQgYSBjaGVja1Bhc3NhYmxlLCBidXQgcGVyaGFwcyB0aGVyZSBzaG91bGQgYmUuKi9cbi8qIElmIHRoYXQgaGFwcGVucywgd2Ugc2hvdWxkIGNhbGwgaXQgaGVyZSBpbnN0ZWFkLiovXG5hc3NlcnRQYXNzYWJsZSh2YWwpO1xucmV0dXJuIHRydWU7XG4gfVxuaWYoa2V5TWVtby5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcmVzdWx0PWNoZWNrS2V5SW50ZXJuYWwodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG4vKiBEb24ndCBjYWNoZSB0aGUgdW5kZWZpbmVkIGNhc2VzLCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkIGFnYWluKi9cbi8qIHdpdGggYGFzc2VydENoZWNrZXJgIGl0J2xsIHRocm93IGEgZGlhZ25vc3RpYyBhZ2FpbiovXG5rZXlNZW1vLmFkZCh2YWwpO1xuIH1cbi8qIE5vdGUgdGhhdCB3ZSBkbyBub3QgbWVtb2l6ZSBhIG5lZ2F0aXZlIGp1ZGdlbWVudCwgc28gdGhhdCBpZiBpdCBpcyB0cmllZCovXG4vKiBhZ2FpbiB3aXRoIGEgY2hlY2tlciwgaXQgd2lsbCBzdGlsbCBwcm9kdWNlIGEgdXNlZnVsIGRpYWdub3N0aWMuKi9cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrS2V5KGNoZWNrS2V5KTtcbmhhcmRlbihjaGVja0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzS2V5PSh2YWwpPT5jaGVja0tleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzS2V5KGlzS2V5KTtcbmhhcmRlbihpc0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtLZXl9IHZhbFxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0S2V5PSh2YWwpPT57XG5jaGVja0tleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEtleShhc3NlcnRLZXkpO1xuaGFyZGVuKGFzc2VydEtleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weVNldCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5U2V0IGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weVNldD59ICovXG5jb25zdCBjb3B5U2V0TWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5U2V0PShzLGNoZWNrKT0+e1xuaWYoY29weVNldE1lbW8uaGFzKHMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlc3VsdD1cbihwYXNzU3R5bGVPZihzKT09PSd0YWdnZWQnJiZnZXRUYWcocyk9PT0nY29weVNldCd8fFxuY2hlY2soZmFsc2UsWCBgTm90IGEgY29weVNldDogJHtzfWApKSYmXG5jaGVja0VsZW1lbnRzKHMucGF5bG9hZCxjaGVjaykmJlxuY2hlY2tLZXkocy5wYXlsb2FkLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb3B5U2V0TWVtby5hZGQocyk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5U2V0KGNoZWNrQ29weVNldCk7XG5oYXJkZW4oY2hlY2tDb3B5U2V0KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5U2V0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7cyBpcyBDb3B5U2V0fVxuICovXG5cbi8qKiBAdHlwZSB7SXNDb3B5U2V0fSAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldD0ocyk9PmNoZWNrQ29weVNldChzLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0NvcHlTZXQoaXNDb3B5U2V0KTtcbmhhcmRlbihpc0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5U2V0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzIGlzIENvcHlTZXR9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5U2V0fSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlTZXQ9KHMpPT57XG5jaGVja0NvcHlTZXQocyxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weVNldChhc3NlcnRDb3B5U2V0KTtcbmhhcmRlbihhc3NlcnRDb3B5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weVNldEtleXM9KHMpPT57XG5hc3NlcnRDb3B5U2V0KHMpO1xucmV0dXJuIHMucGF5bG9hZDtcbiB9OyRo4oCNX29uY2UuZ2V0Q29weVNldEtleXMoZ2V0Q29weVNldEtleXMpO1xuaGFyZGVuKGdldENvcHlTZXRLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcGFyYW0geyhrZXk6IEssIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weVNldEtleT0ocyxmbik9PlxuZ2V0Q29weVNldEtleXMocykuZXZlcnkoKGtleSxpbmRleCk9PmZuKGtleSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5U2V0S2V5KGV2ZXJ5Q29weVNldEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5U2V0S2V5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlTZXQ9KGVsZW1lbnRJdGVyKT0+e1xuY29uc3QgcmVzdWx0PW1ha2VTZXRPZkVsZW1lbnRzKGVsZW1lbnRJdGVyKTtcbmFzc2VydENvcHlTZXQocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5U2V0KG1ha2VDb3B5U2V0KTtcbmhhcmRlbihtYWtlQ29weVNldCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weUJhZyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5QmFnIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weUJhZz59ICovXG5jb25zdCBjb3B5QmFnTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5QmFnPShiLGNoZWNrKT0+e1xuaWYoY29weUJhZ01lbW8uaGFzKGIpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlc3VsdD1cbihwYXNzU3R5bGVPZihiKT09PSd0YWdnZWQnJiZnZXRUYWcoYik9PT0nY29weUJhZyd8fFxuY2hlY2soZmFsc2UsWCBgTm90IGEgY29weUJhZzogJHtifWApKSYmXG5jaGVja0JhZ0VudHJpZXMoYi5wYXlsb2FkLGNoZWNrKSYmXG5jaGVja0tleShiLnBheWxvYWQsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvcHlCYWdNZW1vLmFkZChiKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlCYWcoY2hlY2tDb3B5QmFnKTtcbmhhcmRlbihjaGVja0NvcHlCYWcpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlCYWdcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtiIGlzIENvcHlCYWd9XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlCYWd9ICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnPShiKT0+Y2hlY2tDb3B5QmFnKGIsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weUJhZyhpc0NvcHlCYWcpO1xuaGFyZGVuKGlzQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlCYWdcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHthc3NlcnRzIGIgaXMgQ29weUJhZ31cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlCYWd9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weUJhZz0oYik9PntcbmNoZWNrQ29weUJhZyhiLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QmFnKGFzc2VydENvcHlCYWcpO1xuaGFyZGVuKGFzc2VydENvcHlCYWcpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlCYWc8Sz59IGJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+WydwYXlsb2FkJ119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5QmFnRW50cmllcz0oYik9PntcbmFzc2VydENvcHlCYWcoYik7XG5yZXR1cm4gYi5wYXlsb2FkO1xuIH07JGjigI1fb25jZS5nZXRDb3B5QmFnRW50cmllcyhnZXRDb3B5QmFnRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weUJhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlCYWc8Sz59IGJcbiAqIEBwYXJhbSB7KGVudHJ5OiBbSywgYmlnaW50XSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5QmFnRW50cnk9KGIsZm4pPT5cbmdldENvcHlCYWdFbnRyaWVzKGIpLmV2ZXJ5KChlbnRyeSxpbmRleCk9PmZuKGVudHJ5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlCYWdFbnRyeShldmVyeUNvcHlCYWdFbnRyeSk7XG5oYXJkZW4oZXZlcnlDb3B5QmFnRW50cnkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlCYWc9KGJhZ0VudHJ5SXRlcik9PntcbmNvbnN0IHJlc3VsdD1tYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJ5SXRlcik7XG5hc3NlcnRDb3B5QmFnKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weUJhZyhtYWtlQ29weUJhZyk7XG5oYXJkZW4obWFrZUNvcHlCYWcpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weUJhZ0Zyb21FbGVtZW50cz0oZWxlbWVudEl0ZXIpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcbmNvbnN0IHNvcnRlZD1zb3J0QnlSYW5rKGVsZW1lbnRJdGVyLGZ1bGxDb21wYXJlKTtcbi8qKiBAdHlwZSB7W0ssYmlnaW50XVtdfSAqL1xuY29uc3QgZW50cmllcz1bXTtcbmZvcihsZXQgaT0wO2k8c29ydGVkLmxlbmd0aDspe1xuY29uc3Qgaz1zb3J0ZWRbaV07XG5sZXQgaj1pKzE7XG53aGlsZShqPHNvcnRlZC5sZW5ndGgmJmZ1bGxDb21wYXJlKGssc29ydGVkW2pdKT09PTApe1xuais9MTtcbiB9XG5lbnRyaWVzLnB1c2goW2ssQmlnSW50KGotaSldKTtcbmk9ajtcbiB9XG5yZXR1cm4gbWFrZUNvcHlCYWcoZW50cmllcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcbmhhcmRlbihtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weU1hcCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5TWFwJ3Mga2V5cyBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PENvcHlNYXA+fSAqL1xuY29uc3QgY29weU1hcE1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weU1hcD0obSxjaGVjayk9PntcbmlmKGNvcHlNYXBNZW1vLmhhcyhtKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZighKHBhc3NTdHlsZU9mKG0pPT09J3RhZ2dlZCcmJmdldFRhZyhtKT09PSdjb3B5TWFwJykpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlNYXA6ICR7bX1gKTtcbiB9XG5jb25zdHtwYXlsb2FkfT1tO1xuaWYocGFzc1N0eWxlT2YocGF5bG9hZCkhPT0nY29weVJlY29yZCcpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBiZSBhIHJlY29yZDogJHttfWApO1xuIH1cbmNvbnN0e2tleXMsdmFsdWVzLC4uLnJlc3R9PXBheWxvYWQ7XG5jb25zdCByZXN1bHQ9XG4ob3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3Qgb25seSBoYXZlIC5rZXlzIGFuZCAudmFsdWVzOiAke219YCkpJiZcblxuY2hlY2tFbGVtZW50cyhrZXlzLGNoZWNrKSYmXG5jaGVja0tleShrZXlzLGNoZWNrKSYmKFxucGFzc1N0eWxlT2YodmFsdWVzKT09PSdjb3B5QXJyYXknfHxcbmNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIC52YWx1ZXMgbXVzdCBiZSBhIGNvcHlBcnJheTogJHttfWApKSYmKFxua2V5cy5sZW5ndGg9PT12YWx1ZXMubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBrZXlzIGFuZCB2YWx1ZXM6ICR7bX1gKSk7XG5cbmlmKHJlc3VsdCl7XG5jb3B5TWFwTWVtby5hZGQobSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5TWFwKGNoZWNrQ29weU1hcCk7XG5oYXJkZW4oY2hlY2tDb3B5TWFwKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5TWFwXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7bSBpcyBDb3B5TWFwPEtleSwgUGFzc2FibGU+fVxuICovXG5cbi8qKiBAdHlwZSB7SXNDb3B5TWFwfSAqL1xuY29uc3QgICAgICAgIGlzQ29weU1hcD0obSk9PmNoZWNrQ29weU1hcChtLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmhhcmRlbihpc0NvcHlNYXApO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5TWFwXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBtIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5TWFwfSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlNYXA9KG0pPT57XG5jaGVja0NvcHlNYXAobSxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weU1hcChhc3NlcnRDb3B5TWFwKTtcbmhhcmRlbihhc3NlcnRDb3B5TWFwKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwS2V5cz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5yZXR1cm4gbS5wYXlsb2FkLmtleXM7XG4gfTskaOKAjV9vbmNlLmdldENvcHlNYXBLZXlzKGdldENvcHlNYXBLZXlzKTtcbmhhcmRlbihnZXRDb3B5TWFwS2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7VltdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcFZhbHVlcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5yZXR1cm4gbS5wYXlsb2FkLnZhbHVlcztcbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcFZhbHVlcyhnZXRDb3B5TWFwVmFsdWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwVmFsdWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwRW50cmllcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5jb25zdHtcbnBheWxvYWQ6e2tleXMsdmFsdWVzfX09XG5tO1xuY29uc3R7bGVuZ3RofT0vKiogQHR5cGUge0FycmF5fSAqL2tleXM7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT0wO1xucmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFtLLFZdLHZvaWQ+fSAqL1xubGV0IHJlc3VsdDtcbmlmKGk8bGVuZ3RoKXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6W2tleXNbaV0sdmFsdWVzW2ldXX0pO1xuaSs9MTtcbnJldHVybiByZXN1bHQ7XG4gfWVsc2V7XG5yZXN1bHQ9aGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcEVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwS2V5PShtLGZuKT0+XG5nZXRDb3B5TWFwS2V5cyhtKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlNYXBLZXkoZXZlcnlDb3B5TWFwS2V5KTtcbmhhcmRlbihldmVyeUNvcHlNYXBLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsodmFsdWU6IFYsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weU1hcFZhbHVlPShtLGZuKT0+XG5nZXRDb3B5TWFwVmFsdWVzKG0pLmV2ZXJ5KCh2YWx1ZSxpbmRleCk9PmZuKHZhbHVlLGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlNYXBWYWx1ZShldmVyeUNvcHlNYXBWYWx1ZSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwVmFsdWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5TWFwS2V5U2V0PShtKT0+XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBhbHJlYWR5IGluIHRoZSBpbnRlcm5hbCBmb3JtIHVzZWQgYnkgY29weVNldHMuKi9cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLG0ucGF5bG9hZC5rZXlzKTskaOKAjV9vbmNlLmNvcHlNYXBLZXlTZXQoY29weU1hcEtleVNldCk7XG5oYXJkZW4oY29weU1hcEtleVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIFZdPn0gZW50cmllc1xuICogQHJldHVybnMge0NvcHlNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5TWFwPShlbnRyaWVzKT0+e1xuLyogVGhpcyBpcyB3ZWlyZCwgYnV0IHJldmVyc2UgcmFuayBzb3J0aW5nIHRoZSBlbnRyaWVzIGlzIGEgZ29vZCBmaXJzdCBzdGVwKi9cbi8qIGZvciBnZXR0aW5nIHRoZSByYW5rIHNvcnRlZCBrZXlzIHRvZ2V0aGVyIHdpdGggdGhlIHZhbHVlcyovXG4vKiBvcmdhbml6ZWQgYnkgdGhvc2Uga2V5cy4gQWxzbywgYW1vbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCovXG4vKiBrZXlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzLCB0aG9zZSBhcmUgcmFuayBzb3J0ZWQuKi9cbi8qIFRPRE8gVGhpcyovXG4vKiBjb3VsZCBzb2x2ZSB0aGUgY29weU1hcCBjb3ZlciBpc3N1ZSBleHBsYWluZWQgaW4gcGF0dGVybk1hdGNoZXJzLmpzLiovXG4vKiBCdXQgb25seSBpZiB3ZSBpbmNsdWRlIHRoaXMgY3JpdGVyaWEgaW4gb3VyIHZhbGlkYXRpb24gb2YgY29weU1hcHMsKi9cbi8qIHdoaWNoIHdlIGN1cnJlbnRseSBkbyBub3QuKi9cbmNvbnN0IHNvcnRlZEVudHJpZXM9c29ydEJ5UmFuayhlbnRyaWVzLGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCBrZXlzPXNvcnRlZEVudHJpZXMubWFwKChbayxfdl0pPT5rKTtcbmNvbnN0IHZhbHVlcz1zb3J0ZWRFbnRyaWVzLm1hcCgoW19rLHZdKT0+dik7XG5jb25zdCByZXN1bHQ9bWFrZVRhZ2dlZCgnY29weU1hcCcse2tleXMsdmFsdWVzfSk7XG5hc3NlcnRDb3B5TWFwKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weU1hcChtYWtlQ29weU1hcCk7XG5oYXJkZW4obWFrZUNvcHlNYXApO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyBSZWN1ciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlJbnRlcm5hbD0odmFsLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja0tleShjaGlsZCxjaGVjayk7XG5cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWwpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gdmFsLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xucmV0dXJuIGNoZWNrQ29weVNldCh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weUJhZyc6e1xucmV0dXJuIGNoZWNrQ29weUJhZyh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weU1hcCc6e1xucmV0dXJuKFxuY2hlY2tDb3B5TWFwKHZhbCxjaGVjaykmJlxuLyogRm9yIGEgY29weU1hcCB0byBiZSBhIGtleSwgYWxsIGl0cyBrZXlzIGFuZCB2YWx1ZXMgbXVzdCovXG4vKiBiZSBrZXlzLiBLZXlzIGFscmVhZHkgY2hlY2tlZCBieSBgY2hlY2tDb3B5TWFwYCBzaW5jZSovXG4vKiB0aGF0J3MgYSBjb3B5TWFwIHJlcXVpcmVtZW50IGluIGdlbmVyYWwuKi9cbmV2ZXJ5Q29weU1hcFZhbHVlKHZhbCxjaGVja0l0KSk7XG5cbiB9XG5kZWZhdWx0OntcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgcGFzc2FibGUgdGFnZ2VkICR7cSh0YWcpfSBpcyBub3QgYSBrZXk6ICR7dmFsfWApKTtcblxuIH19XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogQWxsIHJlbW90YWJsZXMgYXJlIGtleXMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEga2V5YCk7XG4gfVxuZGVmYXVsdDp7XG4vKiBVbmV4cGVjdGVkIHRhZ3MgYXJlIGp1c3Qgbm9uLWtleXMsIGJ1dCBhbiB1bmV4cGVjdGVkIHBhc3NTdHlsZSovXG4vKiBpcyBhbHdheXMgYW4gZXJyb3IuKi9cbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHt2YWx9YDtcbiB9fVxuXG4gfTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1ByaW1pdGl2ZUtleSI6WyJpc1ByaW1pdGl2ZUtleSJdLCJhc3NlcnRQcmltaXRpdmVLZXkiOlsiYXNzZXJ0UHJpbWl0aXZlS2V5Il0sImNoZWNrU2NhbGFyS2V5IjpbImNoZWNrU2NhbGFyS2V5Il0sImlzU2NhbGFyS2V5IjpbImlzU2NhbGFyS2V5Il0sImFzc2VydFNjYWxhcktleSI6WyJhc3NlcnRTY2FsYXJLZXkiXSwiY2hlY2tLZXkiOlsiY2hlY2tLZXkiXSwiaXNLZXkiOlsiaXNLZXkiXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSJdLCJjaGVja0NvcHlTZXQiOlsiY2hlY2tDb3B5U2V0Il0sImlzQ29weVNldCI6WyJpc0NvcHlTZXQiXSwiYXNzZXJ0Q29weVNldCI6WyJhc3NlcnRDb3B5U2V0Il0sImdldENvcHlTZXRLZXlzIjpbImdldENvcHlTZXRLZXlzIl0sImV2ZXJ5Q29weVNldEtleSI6WyJldmVyeUNvcHlTZXRLZXkiXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiXSwiY2hlY2tDb3B5QmFnIjpbImNoZWNrQ29weUJhZyJdLCJpc0NvcHlCYWciOlsiaXNDb3B5QmFnIl0sImFzc2VydENvcHlCYWciOlsiYXNzZXJ0Q29weUJhZyJdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyJdLCJldmVyeUNvcHlCYWdFbnRyeSI6WyJldmVyeUNvcHlCYWdFbnRyeSJdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyJdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLCJjaGVja0NvcHlNYXAiOlsiY2hlY2tDb3B5TWFwIl0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwiYXNzZXJ0Q29weU1hcCI6WyJhc3NlcnRDb3B5TWFwIl0sImdldENvcHlNYXBLZXlzIjpbImdldENvcHlNYXBLZXlzIl0sImdldENvcHlNYXBWYWx1ZXMiOlsiZ2V0Q29weU1hcFZhbHVlcyJdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyJdLCJldmVyeUNvcHlNYXBLZXkiOlsiZXZlcnlDb3B5TWFwS2V5Il0sImV2ZXJ5Q29weU1hcFZhbHVlIjpbImV2ZXJ5Q29weU1hcFZhbHVlIl0sImNvcHlNYXBLZXlTZXQiOlsiY29weU1hcEtleVNldCJdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADKwU2bdxoAAHcaAAAtAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4zL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCIuL2NoZWNrS2V5LmpzIiwiLi9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIl0sImV4cG9ydHMiOlsiY29tcGFyZUtleXMiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsZ2V0VGFnLGNvbXBhcmVSYW5rLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyxhc3NlcnRLZXksYmFnQ29tcGFyZSxzZXRDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV1dXSxbXCIuL21lcmdlLWJhZy1vcGVyYXRvcnMuanNcIiwgW1tcImJhZ0NvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKGJhZ0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzXCIsIFtbXCJzZXRDb21wYXJlXCIsIFskaOKAjV9hID0+IChzZXRDb21wYXJlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuLi90eXBlcycpLktleUNvbXBhcmV9ICovXG5jb25zdCAgICAgICAgY29tcGFyZUtleXM9KGxlZnQscmlnaHQpPT57XG5hc3NlcnRLZXkobGVmdCk7XG5hc3NlcnRLZXkocmlnaHQpO1xuY29uc3QgbGVmdFN0eWxlPXBhc3NTdHlsZU9mKGxlZnQpO1xuY29uc3QgcmlnaHRTdHlsZT1wYXNzU3R5bGVPZihyaWdodCk7XG5pZihsZWZ0U3R5bGUhPT1yaWdodFN0eWxlKXtcbi8qIERpZmZlcmVudCBwYXNzU3R5bGVzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG5yZXR1cm4gTmFOO1xuIH1cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ3N5bWJvbCc6e1xuLyogZm9yIHRoZXNlLCBrZXlzIGNvbXBhcmUgdGhlIHNhbWUgYXMgcmFuayovXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdudW1iZXInOntcbmNvbnN0IHJhbmtDb21wPWNvbXBhcmVSYW5rKGxlZnQscmlnaHQpO1xuaWYocmFua0NvbXA9PT0wKXtcbnJldHVybiAwO1xuIH1cbmlmKE51bWJlci5pc05hTihsZWZ0KXx8TnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG4vKiBOYU4gaXMgZXF1YWwgdG8gaXRzZWxmLCBidXQgaW5jb21tZW5zdXJhdGUgd2l0aCBldmVyeXRoaW5nIGVsc2UqL1xuYXNzZXJ0KCFOdW1iZXIuaXNOYU4obGVmdCl8fCFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbnJldHVybiBOYU47XG4gfVxuLyogQW1vbmcgbm9uLU5hTiBudW1iZXJzLCBrZXkgb3JkZXIgaXMgdGhlIHNhbWUgYXMgcmFuayBvcmRlci4gTm90ZSB0aGF0Ki9cbi8qIGluIGJvdGggb3JkZXJzLCBgLTBgIGlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzIGFzIGAwYC4qL1xucmV0dXJuIHJhbmtDb21wO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5pZihsZWZ0PT09cmlnaHQpe1xucmV0dXJuIDA7XG4gfVxuLyogSWYgdHdvIHJlbW90YWJsZXMgYXJlIG5vdCBpZGVudGljYWwsIHRoZW4gYXMga2V5cyB0aGV5IGFyZSovXG4vKiBpbmNvbW1lbnN1cmF0ZS4qL1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBrZXkgb3JkZXIuIFJhbmsgb3JkZXIgb2YgYXJyYXlzIGlzIGxleGljb2dyYXBoaWMgYnkqL1xuLyogcmFuayBvcmRlci4qL1xuLyogQmVjYXVzZSB0aGUgaW52YXJpYW50cyBhYm92ZSBhcHBseSB0byB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5LCovXG4vKiB0aGV5IGFwcGx5IHRvIHRoZSBhcnJheSBhcyBhIHdob2xlLiovXG5jb25zdCBsZW49TWF0aC5taW4obGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY29uc3QgcmVzdWx0PWNvbXBhcmVLZXlzKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgYXJlIGtleUVRLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBUaHVzLCBpZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBpcyBzbWFsbGVyIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBQYXJldG8gcGFydGlhbCBvcmRlciBjb21wYXJpc29uLiovXG5jb25zdCBsZWZ0TmFtZXM9cmVjb3JkTmFtZXMobGVmdCk7XG5jb25zdCByaWdodE5hbWVzPXJlY29yZE5hbWVzKHJpZ2h0KTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFrZXlFUShsZWZ0TmFtZXMscmlnaHROYW1lcykpe1xuLyogSWYgdGhleSBkbyBub3QgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnRpZXMsKi9cbi8qIHRoZXkgYXJlIGluY29tbWVuc3VyYXRlLiovXG4vKiBOb3RlIHRoYXQgcmFuayBzb3J0aW5nIG9mIGNvcHlSZWNvcmRzIGdyb3VwcyBhbGwgY29weVJlY29yZHMgd2l0aCovXG4vKiB0aGUgc2FtZSBrZXlzIHRvZ2V0aGVyLCBlbmFibGluZyByYW5nZSBzZWFyY2hpbmcgb3ZlciBjb3B5UmVjb3JkcyovXG4vKiB0byBhdm9pZCBtb3JlIGlycmVsZXZhbnQgb25lcy4qL1xucmV0dXJuIE5hTjtcbiB9XG5jb25zdCBsZWZ0VmFsdWVzPXJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyk7XG5jb25zdCByaWdodFZhbHVlcz1yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcyk7XG4vKiBQcmVzdW1lIHRoYXQgYm90aCBjb3B5UmVjb3JkcyBoYXZlIHRoZSBzYW1lIGtleSBvcmRlciovXG4vKiB1bnRpbCBlbmNvdW50ZXJpbmcgYSBwcm9wZXJ0eSBkaXNwcm92aW5nIHRoYXQgaHlwb3RoZXNpcy4qL1xubGV0IHJlc3VsdD0wO1xuZm9yKGxldCBpPTA7aTxsZWZ0VmFsdWVzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGNvbXA9Y29tcGFyZUtleXMobGVmdFZhbHVlc1tpXSxyaWdodFZhbHVlc1tpXSk7XG5pZihOdW1iZXIuaXNOYU4oY29tcCkpe1xucmV0dXJuIE5hTjtcbiB9XG5pZihyZXN1bHQhPT1jb21wJiZjb21wIT09MCl7XG5pZihyZXN1bHQ9PT0wKXtcbnJlc3VsdD1jb21wO1xuIH1lbHNle1xuYXNzZXJ0KFxucmVzdWx0PT09LTEmJmNvbXA9PT0xfHxyZXN1bHQ9PT0xJiZjb21wPT09LTEpO1xuXG5yZXR1cm4gTmFOO1xuIH1cbiB9XG4gfVxuLyogSWYgY29weVJlY29yZCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5UmVjb3JkIFksIHRoZW4gdGhleSBtdXN0IGhhdmUgdGhlKi9cbi8qIHNhbWUgcHJvcGVydHkgbmFtZXMgYW5kIGV2ZXJ5IHZhbHVlIGluIFggbXVzdCBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvKi9cbi8qIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIFkgKHdpdGggYXQgbGVhc3Qgb25lIHZhbHVlIHNtYWxsZXIpLiovXG4vKiBUaGUgcmFuayBvcmRlciBvZiBYIGFuZCBZIGlzIGJhc2VkIG9uIGxleGljb2dyYXBoaWMgcmFuayBvcmRlciBvZiovXG4vKiB0aGVpciB2YWx1ZXMsIGFzIG9yZ2FuaXplZCBieSByZXZlcnNlIGxleGljb2dyYXBoaWMgb3JkZXIgb2YgdGhlaXIqL1xuLyogcHJvcGVydHkgbmFtZXMuKi9cbi8qIFRodXMgaWYgY29tcGFyZUtleXMoWCxZKSA8IDAgdGhlbiBjb21wYXJlUmFuayhYLFkpIDwgMC4qL1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgbGVmdFRhZz1nZXRUYWcobGVmdCk7XG5jb25zdCByaWdodFRhZz1nZXRUYWcocmlnaHQpO1xuaWYobGVmdFRhZyE9PXJpZ2h0VGFnKXtcbi8qIGRpZmZlcmVudCB0YWdzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG5yZXR1cm4gTmFOO1xuIH1cbnN3aXRjaChsZWZ0VGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogY29weVNldCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5U2V0IFkgd2hlbiBldmVyeSBlbGVtZW50IG9mIFgqL1xuLyogaXMga2V5RVEgdG8gc29tZSBlbGVtZW50IG9mIFkgYW5kIHNvbWUgZWxlbWVudCBvZiBZIGlzKi9cbi8qIG5vdCBrZXlFUSB0byBhbnkgZWxlbWVudCBvZiBYLiovXG5yZXR1cm4gc2V0Q29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbi8qIGNvcHlCYWcgWCBpcyBzbWFsbGVyIHRoYW4gY29weUJhZyBZIHdoZW4gZXZlcnkgZWxlbWVudCBvZiBYKi9cbi8qIG9jY3VycyBubyBtb3JlIHRoYW4gdGhlIGtleUVRIGVsZW1lbnQgb2YgWSwgYW5kIHNvbWUgZWxlbWVudCovXG4vKiBvZiBZIG9jY3VycyBtb3JlIHRoYW4gc29tZSBlbGVtZW50IG9mIFgsIHdoZXJlIGJlaW5nIGFic2VudCovXG4vKiBmcm9tIFggY291bnRzIGFzIG9jY3VycmluZyB6ZXJvIHRpbWVzLiovXG5yZXR1cm4gYmFnQ29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8qIFR3byBjb3B5TWFwcyB0aGF0IGhhdmUgZGlmZmVyZW50IGtleXMgKGFjY29yZGluZyB0byBrZXlFUSkgYXJlKi9cbi8qIGluY29tbWVuc3VyYXRlLiBUaGUgcmVwcmVzZW50YXRpb24gb2YgY29weU1hcHMgaW5jbHVkZXMgdGhlIGtleXMqL1xuLyogZmlyc3QsIGluIHRoZSBzYW1lIHJldmVyc2UgcmFuayBvcmRlciB1c2VkIGJ5IHNldHMuIFRodXMsIGFsbCovXG4vKiBjb3B5TWFwcyB3aXRoIGtleXMgb2YgdGhlIHNhbWUgcmFuayAod2hpY2ggaXMqL1xuLyogbGVzcyBwcmVjaXNlISkgd2lsbCBiZSBncm91cGVkIHRvZ2V0aGVyIHdoZW4gY29weU1hcHMgYXJlIHNvcnRlZCovXG4vKiBieSByYW5rLCBtaW5pbWl6aW5nIHRoZSBudW1iZXIgb2YgbWlzc2VzIHdoZW4gcmFuZ2Ugc2VhcmNoaW5nLiovXG4vKiovXG4vKiBBbW9uZyBjb3B5TWFwcyB3aXRoIHRoZSBzYW1lIGtleXMgKGFjY29yZGluZyB0byBrZXlFUSksIHRoZXkqL1xuLyogY29tcGFyZSBieSBhIGNvcnJlc3BvbmRpbmcgY29tcGFyaXNvbiBvZiB0aGVpciB2YWx1ZXMuIFRodXMsIGFzKi9cbi8qIHdpdGggcmVjb3JkcywgZm9yIHR3byBjb3B5TWFwcyBYIGFuZCBZLCBpZiBgY29tcGFyZUtleXMoWCxZKSA8Ki9cbi8qIDBgIHRoZW4sIGJlY2F1c2UgdGhlc2UgdmFsdWVzIG9iZXkgdGhlIGFib3ZlIGludmFyaWFudHMsIG5vbmUgb2YqL1xuLyogdGhlIHZhbHVlcyBpbiBYIGhhdmUgYSBsYXRlciByYW5rIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUqL1xuLyogb2YgWS4gVGh1cywgYGNvbXBhcmVSYW5rKFgsWSkgPD0gMGAuIFRPRE8gaW1wbGVtZW50Ki9cbnRocm93IEZhaWwgYE1hcCBjb21wYXJpc29uIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7bGVmdH0gdnMgJHtyaWdodH1gO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCB0YWcgJHtxKGxlZnRUYWcpfTogJHtsZWZ0fWA7XG4gfX1cblxuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKGxlZnRTdHlsZSl9OiAke2xlZnR9YDtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmNvbXBhcmVLZXlzKGNvbXBhcmVLZXlzKTtcbmhhcmRlbihjb21wYXJlS2V5cyk7XG5cbmNvbnN0ICAgICAgICBrZXlMVD0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPDA7JGjigI1fb25jZS5rZXlMVChrZXlMVCk7XG5oYXJkZW4oa2V5TFQpO1xuXG5jb25zdCAgICAgICAga2V5TFRFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk8PTA7JGjigI1fb25jZS5rZXlMVEUoa2V5TFRFKTtcbmhhcmRlbihrZXlMVEUpO1xuXG5jb25zdCAgICAgICAga2V5RVE9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT09PTA7JGjigI1fb25jZS5rZXlFUShrZXlFUSk7XG5oYXJkZW4oa2V5RVEpO1xuXG5jb25zdCAgICAgICAga2V5R1RFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk+PTA7JGjigI1fb25jZS5rZXlHVEUoa2V5R1RFKTtcbmhhcmRlbihrZXlHVEUpO1xuXG5jb25zdCAgICAgICAga2V5R1Q9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT4wOyRo4oCNX29uY2Uua2V5R1Qoa2V5R1QpO1xuaGFyZGVuKGtleUdUKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyJdLCJrZXlMVCI6WyJrZXlMVCJdLCJrZXlMVEUiOlsia2V5TFRFIl0sImtleUVRIjpbImtleUVRIl0sImtleUdURSI6WyJrZXlHVEUiXSwia2V5R1QiOlsia2V5R1QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVSDC/SoUAAAqFAAAKQAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMy9zcmMva2V5cy9jb3B5QmFnLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRCYWdFbnRyaWVzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIiwiY2hlY2tCYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwibWFrZUJhZ09mRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcImlzUmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG4vKiogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV0gQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ29weUJhZzxLPn0gQ29weUJhZyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleX0gS2V5ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeVxuICoga25vd24gdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXRcbiAqIHJhdGhlciB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlXG4gKiBhcnJheSBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZS1rZXlzIGZpbmRpbmcgYXMgd2VsbCwgaW5kZXBlbmRlbnRcbiAqIG9mIHRoZSBgZnVsbE9yZGVyYCB1c2UgdG8gcmVhY2ggdGhpcyBmaW5kaW5nLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVLZXlzPShiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGNoZWNrKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbi8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbi8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuZnVsbENvbXBhcmU9ZnVsbENvbXBhcmV8fG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbi8qIFNpbmNlIHRoZSBrZXkgaXMgbW9yZSBzaWduaWZpY2FudCB0aGFuIHRoZSB2YWx1ZSAodGhlIGNvdW50KSwqL1xuLyogc29ydGluZyBieSBmdWxsT3JkZXIgaXMgZ3VhcmFudGVlZCB0byBtYWtlIGR1cGxpY2F0ZSBrZXlzKi9cbi8qIGFkamFjZW50IGluZGVwZW5kZW50IG9mIHRoZWlyIGNvdW50cy4qL1xuYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXMsZnVsbENvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1iYWdFbnRyaWVzO1xuZm9yKGxldCBpPTE7aTxsZW5ndGg7aSs9MSl7XG5jb25zdCBrMD1iYWdFbnRyaWVzW2ktMV1bMF07XG5jb25zdCBrMT1iYWdFbnRyaWVzW2ldWzBdO1xuaWYoZnVsbENvbXBhcmUoazAsazEpPT09MCl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gW2Z1bGxDb21wYXJlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmU9dW5kZWZpbmVkKT0+e1xuY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyxmdWxsQ29tcGFyZSxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7W1Bhc3NhYmxlLGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmFzc2VydE5vRHVwbGljYXRlS2V5cyhhc3NlcnROb0R1cGxpY2F0ZUtleXMpO1xuY29uc3QgICAgICAgIGNoZWNrQmFnRW50cmllcz0oYmFnRW50cmllcyxjaGVjayk9PntcbmlmKHBhc3NTdHlsZU9mKGJhZ0VudHJpZXMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtiYWdFbnRyaWVzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChiYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuaykpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5mb3IoY29uc3QgZW50cnkgb2YgYmFnRW50cmllcyl7XG5pZihcbnBhc3NTdHlsZU9mKGVudHJ5KSE9PSdjb3B5QXJyYXknfHxcbmVudHJ5Lmxlbmd0aCE9PTJ8fFxudHlwZW9mIGVudHJ5WzFdIT09J2JpZ2ludCcpXG57XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgYmUgcGFpciBvZiBhIGtleSBhbmQgYSBiaWdpbnQgcmVwcmVzZW50aW5nIGEgY291bnQ6ICR7ZW50cnl9YCk7XG5cbiB9XG5pZihlbnRyeVsxXTwxKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBoYXZlIGEgcG9zaXRpdmUgY291bnQ6ICR7ZW50cnl9YCk7XG5cbiB9XG4gfVxucmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsdW5kZWZpbmVkLGNoZWNrKTtcbiB9OyRo4oCNX29uY2UuY2hlY2tCYWdFbnRyaWVzKGNoZWNrQmFnRW50cmllcyk7XG5oYXJkZW4oY2hlY2tCYWdFbnRyaWVzKTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJucy1jaGVjayAtLSBkb2Vzbid0IHVuZGVyc3RhbmQgYXNzZXJ0cyovXG4vKipcbiAqIEBwYXJhbSB7W1Bhc3NhYmxlLGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHJldHVybnMge2Fzc2VydHMgYmFnRW50cmllcyBpcyBbUGFzc2FibGUsYmlnaW50XVtdfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0QmFnRW50cmllcz0oYmFnRW50cmllcyk9PntcbmNoZWNrQmFnRW50cmllcyhiYWdFbnRyaWVzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRCYWdFbnRyaWVzKGFzc2VydEJhZ0VudHJpZXMpO1xuaGFyZGVuKGFzc2VydEJhZ0VudHJpZXMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlVG9CYWdFbnRyaWVzPShiYWdFbnRyaWVzTGlzdCk9PntcbmNvbnN0IGJhZ0VudHJpZXM9c29ydEJ5UmFuayhiYWdFbnRyaWVzTGlzdCxjb21wYXJlQW50aVJhbmspO1xuYXNzZXJ0QmFnRW50cmllcyhiYWdFbnRyaWVzKTtcbnJldHVybiBiYWdFbnRyaWVzO1xuIH07JGjigI1fb25jZS5jb2VyY2VUb0JhZ0VudHJpZXMoY29lcmNlVG9CYWdFbnRyaWVzKTtcbmhhcmRlbihjb2VyY2VUb0JhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBiaWdpbnRdPn0gYmFnRW50cnlJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VCYWdPZkVudHJpZXM9KGJhZ0VudHJ5SXRlcik9PlxubWFrZVRhZ2dlZCgnY29weUJhZycsY29lcmNlVG9CYWdFbnRyaWVzKGJhZ0VudHJ5SXRlcikpOyRo4oCNX29uY2UubWFrZUJhZ09mRW50cmllcyhtYWtlQmFnT2ZFbnRyaWVzKTtcbmhhcmRlbihtYWtlQmFnT2ZFbnRyaWVzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIl0sImNoZWNrQmFnRW50cmllcyI6WyJjaGVja0JhZ0VudHJpZXMiXSwiYXNzZXJ0QmFnRW50cmllcyI6WyJhc3NlcnRCYWdFbnRyaWVzIl0sImNvZXJjZVRvQmFnRW50cmllcyI6WyJjb2VyY2VUb0JhZ0VudHJpZXMiXSwibWFrZUJhZ09mRW50cmllcyI6WyJtYWtlQmFnT2ZFbnRyaWVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAod/r+jEAAAoxAAACkAAABAZW5kby9wYXR0ZXJucy12MC4yLjMvc3JjL2tleXMvY29weVNldC5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0RWxlbWVudHMiLCJhc3NlcnROb0R1cGxpY2F0ZXMiLCJjaGVja0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyIsIm1ha2VTZXRPZkVsZW1lbnRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChpc1JhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5U2V0PEs+fSBDb3B5U2V0ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5fSBLZXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgZWxlbWVudHNgIGlzIGFscmVhZHkga25vd25cbiAqIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0IHJhdGhlclxuICogdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZSBhcnJheVxuICogZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlLGNoZWNrKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbi8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbi8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuZnVsbENvbXBhcmU9ZnVsbENvbXBhcmV8fG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmVsZW1lbnRzPXNvcnRCeVJhbmsoZWxlbWVudHMsZnVsbENvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmZvcihsZXQgaT0xO2k8bGVuZ3RoO2krPTEpe1xuY29uc3QgazA9ZWxlbWVudHNbaS0xXTtcbmNvbnN0IGsxPWVsZW1lbnRzW2ldO1xuaWYoZnVsbENvbXBhcmUoazAsazEpPT09MCl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgdmFsdWUgaGFzIGR1cGxpY2F0ZXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gW2Z1bGxDb21wYXJlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmFzc2VydE5vRHVwbGljYXRlcyhhc3NlcnROb0R1cGxpY2F0ZXMpO1xuY29uc3QgICAgICAgIGNoZWNrRWxlbWVudHM9KGVsZW1lbnRzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoZWxlbWVudHMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIGEgY29weUFycmF5OiAke2VsZW1lbnRzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChlbGVtZW50cyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWApO1xuXG4gfVxucmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaOKAjV9vbmNlLmNoZWNrRWxlbWVudHMoY2hlY2tFbGVtZW50cyk7XG5oYXJkZW4oY2hlY2tFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRFbGVtZW50cz0oZWxlbWVudHMpPT57XG5jaGVja0VsZW1lbnRzKGVsZW1lbnRzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRFbGVtZW50cyhhc3NlcnRFbGVtZW50cyk7XG5oYXJkZW4oYXNzZXJ0RWxlbWVudHMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlVG9FbGVtZW50cz0oZWxlbWVudHNMaXN0KT0+e1xuY29uc3QgZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50c0xpc3QsY29tcGFyZUFudGlSYW5rKTtcbmFzc2VydEVsZW1lbnRzKGVsZW1lbnRzKTtcbnJldHVybiBlbGVtZW50cztcbiB9OyRo4oCNX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVNldE9mRWxlbWVudHM9KGVsZW1lbnRJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5U2V0Jyxjb2VyY2VUb0VsZW1lbnRzKGVsZW1lbnRJdGVyKSk7JGjigI1fb25jZS5tYWtlU2V0T2ZFbGVtZW50cyhtYWtlU2V0T2ZFbGVtZW50cyk7XG5oYXJkZW4obWFrZVNldE9mRWxlbWVudHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADUlAM6eSUAAHklAAA1AAAAQGVuZG8vcGF0dGVybnMtdjAuMi4zL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIi4vY29weUJhZy5qcyJdLCJleHBvcnRzIjpbImJhZ0NvbXBhcmUiLCJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNEaXNqb2ludCIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGFzc2VydE5vRHVwbGljYXRlS2V5cyxtYWtlQmFnT2ZFbnRyaWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZUtleXNcIiwgWyRo4oCNX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlS2V5cyA9ICRo4oCNX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLCBbJGjigI1fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleUNvbXBhcmlzb259IEtleUNvbXBhcmlzb24gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlJhbmtDb21wYXJlfSBSYW5rQ29tcGFyZSAqL1xuXG4vKiBCYXNlZCBvbiBtZXJnZS1zZXQtb3BlcmF0b3JzLmpzLCBidXQgYWx0ZXJlZCBmb3IgdGhlIGJhZyByZXByZXNlbnRhdGlvbi4qL1xuLyogVE9ETyBzaGFyZSBtb3JlIGNvZGUgd2l0aCBtZXJnZS1zZXQtb3BlcmF0b3JzLmpzLCByYXRoZXIgdGhhbiovXG4vKiBkdXBsaWNhdGluZyB3aXRoIGNoYW5nZXMuKi9cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHkgcmFuayBzb3J0ZWQgYnkgYHJhbmtDb21wYXJlYCwgd2hlcmVcbiAqIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGJhZ0VudHJpZXMgd2hvc2Uga2V5cyBhcmUgdGllZCBmb3IgdGhlIHNhbWVcbiAqIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBiYWdFbnRyaWVzIGluIG9yZGVyXG4gKiBhY2NvcmRpbmcgdG8gYGZ1bGxPcmRlcmAsIHdoaWNoIHNob3VsZCBkaWZmZXIgZnJvbSBgcmFua09yZGVyYCBvbmx5XG4gKiBieSBiZWluZyBtb3JlIHByZWNpc2UuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byByZXNvcnRpbmcgdGhlIGVudGlyZSBgYmFnRW50cmllc2AgYXJyYXlcbiAqIGFjY29yZGluZ1xuICogdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgYmFnV2luZG93UmVzb3J0PShiYWdFbnRyaWVzLHJhbmtDb21wYXJlLGZ1bGxDb21wYXJlKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChiYWdFbnRyaWVzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09YmFnRW50cmllcztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vKiBmYWxsIHRocm91Z2gqL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgZW50cnk9YmFnRW50cmllc1tpXTtcbmxldCBqPWkrMTtcbndoaWxlKFxuajxsZW5ndGgmJlxucmFua0NvbXBhcmUoZW50cnlbMF0sYmFnRW50cmllc1tqXVswXSk9PT0wKVxue1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6ZW50cnl9KTtcbiB9XG5jb25zdCBzaW1pbGFyUnVuPWJhZ0VudHJpZXMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4vKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4vKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG5hc3NlcnROb0R1cGxpY2F0ZUtleXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4vKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4vKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbi8qIGFzIGlzLiovXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpbbnVsbCwwbl19KTtcbiB9XG4gfX0pfSk7XG5cblxuIH07XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB3aG9zZSBpdGVyYXRpb24gcmVzdWx0cyBhcmUgW2tleSwgeENvdW50LCB5Q291bnRdIHR1cGxlc1xuICogcmVwcmVzZW50aW5nIHRoZSBuZXh0IGtleSBpbiB0aGUgbG9jYWwgZnVsbCBvcmRlciwgYXMgd2VsbCBhcyBob3cgbWFueVxuICogdGltZXMgaXQgb2NjdXJyZWQgaW4gdGhlIHggaW5wdXQgaXRlcmF0b3IgYW5kIHRoZSB5IGlucHV0IGl0ZXJhdG9yLlxuICpcbiAqIEZvciBzZXRzLCB0aGVzZSBjb3VudHMgYXJlIGFsd2F5cyAwIG9yIDEsIGJ1dCB0aGlzIHJlcHJlc2VudGF0aW9uXG4gKiBnZW5lcmFsaXplcyBuaWNlbHkgZm9yIGJhZ3MuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB4YmFnRW50cmllc1xuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHliYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZT0oeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5jb25zdCB4cz1iYWdXaW5kb3dSZXNvcnQoeGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPWJhZ1dpbmRvd1Jlc29ydCh5YmFnRW50cmllcyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuLyogVGhlc2Ugc2l4IGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbi8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4vKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB4O1xubGV0IHhjO1xubGV0IHhEb25lO1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHk7XG5sZXQgeWM7XG5sZXQgeURvbmU7XG5cbmNvbnN0IHhpPXhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtcbmRvbmU6eERvbmUsXG52YWx1ZTpbeCx4Y119PVxueGkubmV4dCgpKTtcbiB9O1xubmV4dFgoKTtcblxuY29uc3QgeWk9eXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFk9KCk9PntcbiF5RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe1xuZG9uZTp5RG9uZSxcbnZhbHVlOlt5LHljXX09XG55aS5uZXh0KCkpO1xuIH07XG5uZXh0WSgpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbmxldCBkb25lPWZhbHNlO1xuLyoqIEB0eXBlIHtbVCxiaWdpbnQsYmlnaW50XX0gKi9cbmxldCB2YWx1ZTtcbmlmKHhEb25lJiZ5RG9uZSl7XG5kb25lPXRydWU7XG4vKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG52YWx1ZT1bbnVsbCwwbiwwbl07XG4gfWVsc2UgaWYoeERvbmUpe1xuLyogb25seSB5cyBhcmUgbGVmdCovXG52YWx1ZT1beSwwbix5Y107XG5uZXh0WSgpO1xuIH1lbHNlIGlmKHlEb25lKXtcbi8qIG9ubHkgeHMgYXJlIGxlZnQqL1xudmFsdWU9W3gseGMsMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbmNvbnN0IGNvbXA9ZnVsbENvbXBhcmUoeCx5KTtcbmlmKGNvbXA9PT0wKXtcbi8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbnZhbHVlPVt4LHhjLHljXTtcbm5leHRYKCk7XG5uZXh0WSgpO1xuIH1lbHNlIGlmKGNvbXA8MCl7XG4vKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG52YWx1ZT1beCx4Yywwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuY29tcD4wfHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xudmFsdWU9W3ksMG4seWNdO1xubmV4dFkoKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZSx2YWx1ZX0pO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5oYXJkZW4obWVyZ2UpO1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzU3VwZXJzZXQgYXMgd2VsbC4qL1xuLyogVGhlIGdlbmVyYWxpemF0aW9uIGlzIGZyZWUuKi9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBiYWdJdGVySXNTdXBlcmJhZz0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yzx5Yyl7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcmJhZyBvZiB5Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc0Rpc2pvaW50IGFzIHdlbGwuKi9cbi8qIFRoZSBjb2RlIGlzIGlkZW50aWNhbC4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc0Rpc2pvaW50PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0xbiYmeWM+PTFuKXtcbi8qIFNvbWV0aGluZyBpbiBib3RoLCBzbyBub3QgZGlzam9pbnQqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlckNvbXBhcmUgYXMgd2VsbC4qL1xuLyogVGhlIGdlbmVyYWxpemF0aW9uIGlzIGZyZWUuKi9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtLZXlDb21wYXJpc29ufVxuICovXG5jb25zdCBiYWdJdGVyQ29tcGFyZT0oeHlpKT0+e1xubGV0IGxvbmVZPWZhbHNlO1xubGV0IGxvbmVYPWZhbHNlO1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yzx5Yyl7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcmJhZyBvZiB5Ki9cbmxvbmVZPXRydWU7XG4gfVxuaWYoeGM+eWMpe1xuLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJiYWcgb2YgeCovXG5sb25lWD10cnVlO1xuIH1cbmlmKGxvbmVYJiZsb25lWSl7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG5pZihsb25lWCl7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihsb25lWSl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbiFsb25lWCYmIWxvbmVZfHxcbkZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLGxvbmVZXSl9YDtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludCxiaWdpbnRdW119IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlclVuaW9uPSh4eWkpPT57XG4vKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5yZXN1bHQucHVzaChbbSx4Yyt5Y10pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlckludGVyc2VjdGlvbj0oeHlpKT0+e1xuLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuY29uc3QgbWM9eGM8PXljP3hjOnljO1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0PSh4eWkpPT57XG4vKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5jb25zdCBtYz14Yy15Yztcbm1jPj0wbnx8RmFpbCBgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG5pZihtYz49MW4pe1xuLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbnJlc3VsdC5wdXNoKFttLG1jXSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgbWVyZ2VpZnk9KGJhZ0l0ZXJPcCk9Pih4YmFnRW50cmllcyx5YmFnRW50cmllcyk9PlxuYmFnSXRlck9wKG1lcmdlKHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKSk7XG5cbmNvbnN0IGJhZ0VudHJpZXNJc1N1cGVyYmFnPW1lcmdlaWZ5KGJhZ0l0ZXJJc1N1cGVyYmFnKTtcbmNvbnN0IGJhZ0VudHJpZXNJc0Rpc2pvaW50PW1lcmdlaWZ5KGJhZ0l0ZXJJc0Rpc2pvaW50KTtcbmNvbnN0IGJhZ0VudHJpZXNDb21wYXJlPW1lcmdlaWZ5KGJhZ0l0ZXJDb21wYXJlKTtcbmNvbnN0IGJhZ0VudHJpZXNVbmlvbj1tZXJnZWlmeShiYWdJdGVyVW5pb24pO1xuY29uc3QgYmFnRW50cmllc0ludGVyc2VjdGlvbj1tZXJnZWlmeShiYWdJdGVySW50ZXJzZWN0aW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0PW1lcmdlaWZ5KGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3QmFnaWZ5PShiYWdFbnRyaWVzT3ApPT4oeGJhZyx5YmFnKT0+XG5iYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLHliYWcucGF5bG9hZCk7XG5cbmNvbnN0IGJhZ2lmeT0oYmFnRW50cmllc09wKT0+KHhiYWcseWJhZyk9PlxubWFrZUJhZ09mRW50cmllcyhiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLHliYWcucGF5bG9hZCkpO1xuXG5jb25zdCAgICAgICAgYmFnSXNTdXBlcmJhZz1yYXdCYWdpZnkoYmFnRW50cmllc0lzU3VwZXJiYWcpOyRo4oCNX29uY2UuYmFnSXNTdXBlcmJhZyhiYWdJc1N1cGVyYmFnKTtcbmNvbnN0ICAgICAgICBiYWdJc0Rpc2pvaW50PXJhd0JhZ2lmeShiYWdFbnRyaWVzSXNEaXNqb2ludCk7JGjigI1fb25jZS5iYWdJc0Rpc2pvaW50KGJhZ0lzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIGJhZ0NvbXBhcmU9cmF3QmFnaWZ5KGJhZ0VudHJpZXNDb21wYXJlKTskaOKAjV9vbmNlLmJhZ0NvbXBhcmUoYmFnQ29tcGFyZSk7XG5jb25zdCAgICAgICAgYmFnVW5pb249YmFnaWZ5KGJhZ0VudHJpZXNVbmlvbik7JGjigI1fb25jZS5iYWdVbmlvbihiYWdVbmlvbik7XG5jb25zdCAgICAgICAgYmFnSW50ZXJzZWN0aW9uPWJhZ2lmeShiYWdFbnRyaWVzSW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLmJhZ0ludGVyc2VjdGlvbihiYWdJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIGJhZ0Rpc2pvaW50U3VidHJhY3Q9YmFnaWZ5KGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLmJhZ0Rpc2pvaW50U3VidHJhY3QoYmFnRGlzam9pbnRTdWJ0cmFjdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIl0sImJhZ0lzRGlzam9pbnQiOlsiYmFnSXNEaXNqb2ludCJdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiXSwiYmFnVW5pb24iOlsiYmFnVW5pb24iXSwiYmFnSW50ZXJzZWN0aW9uIjpbImJhZ0ludGVyc2VjdGlvbiJdLCJiYWdEaXNqb2ludFN1YnRyYWN0IjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdXfni54oAACeKAAANQAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMy9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCIuL2NvcHlTZXQuanMiXSwiZXhwb3J0cyI6WyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzVW5pb24iLCJzZXRDb21wYXJlIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssYXNzZXJ0Tm9EdXBsaWNhdGVzLG1ha2VTZXRPZkVsZW1lbnRzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5U2V0LmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZXNcIiwgWyRo4oCNX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlcyA9ICRo4oCNX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyaXNvbn0gS2V5Q29tcGFyaXNvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBlbGVtZW50c2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZSB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBlbGVtZW50cyB0aWVkIGZvciB0aGUgc2FtZSByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgZWxlbWVudHMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBlbGVtZW50c2AgYXJyYXkgYWNjb3JkaW5nXG4gKiAgdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0IHdpbmRvd1Jlc29ydD0oZWxlbWVudHMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGVsZW1lbnRzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZWxlbWVudHM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLyogZmFsbCB0aHJvdWdoKi9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IHZhbHVlPWVsZW1lbnRzW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoajxsZW5ndGgmJnJhbmtDb21wYXJlKHZhbHVlLGVsZW1lbnRzW2pdKT09PTApe1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9XG5jb25zdCBzaW1pbGFyUnVuPWVsZW1lbnRzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuYXNzZXJ0Tm9EdXBsaWNhdGVzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbi8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4vKiBhcyBpcy4qL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6bnVsbH0pO1xuIH1cbiB9fSl9KTtcblxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IHhlbGVtZW50c1xuICogQHBhcmFtIHtUW119IHllbGVtZW50c1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2U9KHhlbGVtZW50cyx5ZWxlbWVudHMpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5jb25zdCB4cz13aW5kb3dSZXNvcnQoeGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5jb25zdCB5cz13aW5kb3dSZXNvcnQoeWVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vKiBUaGVzZSBmb3VyIGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbi8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4vKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB4O1xubGV0IHhEb25lO1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHk7XG5sZXQgeURvbmU7XG5cbmNvbnN0IHhpPXhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnhEb25lLHZhbHVlOnh9PXhpLm5leHQoKSk7XG4gfTtcbm5leHRYKCk7XG5cbmNvbnN0IHlpPXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnlEb25lLHZhbHVlOnl9PXlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtib29sZWFufSAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLyogb25seSB4cyBhcmUgbGVmdCovXG52YWx1ZT1beCwxbiwwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuY29uc3QgY29tcD1mdWxsQ29tcGFyZSh4LHkpO1xuaWYoY29tcD09PTApe1xuLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xudmFsdWU9W3gsMW4sMW5dO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG5jb21wPjB8fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG52YWx1ZT1beSwwbiwxbl07XG5uZXh0WSgpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlfSk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTtcbmhhcmRlbihtZXJnZSk7XG5cbmNvbnN0IGl0ZXJJc1N1cGVyc2V0PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMsX3ljXW9mIHh5aSl7XG5pZih4Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtLZXlDb21wYXJpc29ufVxuICovXG5jb25zdCBpdGVyQ29tcGFyZT0oeHlpKT0+e1xubGV0IGxvbmVZPWZhbHNlO1xubGV0IGxvbmVYPWZhbHNlO1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xubG9uZVk9dHJ1ZTtcbiB9XG5pZih5Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB4IGlzIG5vdCBpbiB5LCBzbyB5IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHgqL1xubG9uZVg9dHJ1ZTtcbiB9XG5pZihsb25lWCYmbG9uZVkpe1xucmV0dXJuIE5hTjtcbiB9XG4gfVxuaWYobG9uZVgpe1xucmV0dXJuIDE7XG4gfWVsc2UgaWYobG9uZVkpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG4hbG9uZVgmJiFsb25lWXx8XG5GYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCxsb25lWV0pfWA7XG5yZXR1cm4gMDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlclVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTBuKXtcbnJlc3VsdC5wdXNoKG0pO1xuIH1lbHNle1xueWM+PTBufHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG4vKiBpZiB4IGFuZCB5IHdlcmUgYm90aCByZWFkeSwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCBhbmQqL1xuLyogYWJvdmUgY2xhdXNlIGFscmVhZHkgdG9vayBjYXJlIG9mIGl0LiBPdGhlcndpc2UgcHVzaCBoZXJlLiovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyRGlzam9pbnRVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnhjPT09MG58fHljPT09MG58fEZhaWwgYFNldHMgbXVzdCBub3QgaGF2ZSBjb21tb24gZWxlbWVudHM6ICR7bX1gO1xuaWYoeGM+PTFuKXtcbnJlc3VsdC5wdXNoKG0pO1xuIH1lbHNle1xueWM+PTFufHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVySW50ZXJzZWN0aW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogSWYgdGhleSBhcmUgYm90aCBwcmVzZW50LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50Ki9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFN1YnRyYWN0PSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xueGM+PTFufHxGYWlsIGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbmlmKHljPT09MG4pe1xuLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IG1lcmdlaWZ5PShpdGVyT3ApPT4oeGVsZW1lbnRzLHllbGVtZW50cyk9PlxuaXRlck9wKG1lcmdlKHhlbGVtZW50cyx5ZWxlbWVudHMpKTtcblxuY29uc3QgICAgICAgIGVsZW1lbnRzSXNTdXBlcnNldD1tZXJnZWlmeShpdGVySXNTdXBlcnNldCk7JGjigI1fb25jZS5lbGVtZW50c0lzU3VwZXJzZXQoZWxlbWVudHNJc1N1cGVyc2V0KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0lzRGlzam9pbnQ9bWVyZ2VpZnkoaXRlcklzRGlzam9pbnQpOyRo4oCNX29uY2UuZWxlbWVudHNJc0Rpc2pvaW50KGVsZW1lbnRzSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgZWxlbWVudHNDb21wYXJlPW1lcmdlaWZ5KGl0ZXJDb21wYXJlKTskaOKAjV9vbmNlLmVsZW1lbnRzQ29tcGFyZShlbGVtZW50c0NvbXBhcmUpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzVW5pb249bWVyZ2VpZnkoaXRlclVuaW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzVW5pb24oZWxlbWVudHNVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFVuaW9uPW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFVuaW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzRGlzam9pbnRVbmlvbihlbGVtZW50c0Rpc2pvaW50VW5pb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGl0ZXJJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2UuZWxlbWVudHNJbnRlcnNlY3Rpb24oZWxlbWVudHNJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdD1tZXJnZWlmeShpdGVyRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5lbGVtZW50c0Rpc2pvaW50U3VidHJhY3QoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3U2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxuZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKTtcblxuY29uc3Qgc2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxubWFrZVNldE9mRWxlbWVudHMoZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBzZXRJc1N1cGVyc2V0PXJhd1NldGlmeShlbGVtZW50c0lzU3VwZXJzZXQpOyRo4oCNX29uY2Uuc2V0SXNTdXBlcnNldChzZXRJc1N1cGVyc2V0KTtcbmNvbnN0ICAgICAgICBzZXRJc0Rpc2pvaW50PXJhd1NldGlmeShlbGVtZW50c0lzRGlzam9pbnQpOyRo4oCNX29uY2Uuc2V0SXNEaXNqb2ludChzZXRJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBzZXRDb21wYXJlPXJhd1NldGlmeShlbGVtZW50c0NvbXBhcmUpOyRo4oCNX29uY2Uuc2V0Q29tcGFyZShzZXRDb21wYXJlKTtcbmNvbnN0ICAgICAgICBzZXRVbmlvbj1zZXRpZnkoZWxlbWVudHNVbmlvbik7JGjigI1fb25jZS5zZXRVbmlvbihzZXRVbmlvbik7XG5jb25zdCAgICAgICAgc2V0RGlzam9pbnRVbmlvbj1zZXRpZnkoZWxlbWVudHNEaXNqb2ludFVuaW9uKTskaOKAjV9vbmNlLnNldERpc2pvaW50VW5pb24oc2V0RGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgc2V0SW50ZXJzZWN0aW9uPXNldGlmeShlbGVtZW50c0ludGVyc2VjdGlvbik7JGjigI1fb25jZS5zZXRJbnRlcnNlY3Rpb24oc2V0SW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFN1YnRyYWN0PXNldGlmeShlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2Uuc2V0RGlzam9pbnRTdWJ0cmFjdChzZXREaXNqb2ludFN1YnRyYWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJlbGVtZW50c0lzU3VwZXJzZXQiOlsiZWxlbWVudHNJc1N1cGVyc2V0Il0sImVsZW1lbnRzSXNEaXNqb2ludCI6WyJlbGVtZW50c0lzRGlzam9pbnQiXSwiZWxlbWVudHNDb21wYXJlIjpbImVsZW1lbnRzQ29tcGFyZSJdLCJlbGVtZW50c1VuaW9uIjpbImVsZW1lbnRzVW5pb24iXSwiZWxlbWVudHNEaXNqb2ludFVuaW9uIjpbImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLCJlbGVtZW50c0ludGVyc2VjdGlvbiI6WyJlbGVtZW50c0ludGVyc2VjdGlvbiJdLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiOlsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sInNldElzU3VwZXJzZXQiOlsic2V0SXNTdXBlcnNldCJdLCJzZXRJc0Rpc2pvaW50IjpbInNldElzRGlzam9pbnQiXSwic2V0Q29tcGFyZSI6WyJzZXRDb21wYXJlIl0sInNldFVuaW9uIjpbInNldFVuaW9uIl0sInNldERpc2pvaW50VW5pb24iOlsic2V0RGlzam9pbnRVbmlvbiJdLCJzZXRJbnRlcnNlY3Rpb24iOlsic2V0SW50ZXJzZWN0aW9uIl0sInNldERpc2pvaW50U3VidHJhY3QiOlsic2V0RGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB+yPj9EscAABLHAAA1AAAAQGVuZG8vcGF0dGVybnMtdjAuMi4zL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIi4uL3V0aWxzLmpzIiwiLi4va2V5cy9jb21wYXJlS2V5cy5qcyIsIi4uL2tleXMvY2hlY2tLZXkuanMiXSwiZXhwb3J0cyI6WyJNIiwiYXNzZXJ0UGF0dGVybiIsImNoZWNrTWF0Y2hlcyIsImRlZmF1bHRMaW1pdHMiLCJnZXRSYW5rQ292ZXIiLCJpc1BhdHRlcm4iLCJtYXRjaGVzIiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGhhc093blByb3BlcnR5T2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLGNvbXBhcmVSYW5rLGdldFBhc3NTdHlsZUNvdmVyLGludGVyc2VjdFJhbmtDb3ZlcnMsdW5pb25SYW5rQ292ZXJzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyxpZGVudENoZWNrZXIsYXBwbHlMYWJlbGluZ0Vycm9yLGZyb21VbmlxdWVFbnRyaWVzLGxpc3REaWZmZXJlbmNlLGtleUVRLGtleUdULGtleUdURSxrZXlMVCxrZXlMVEUsYXNzZXJ0S2V5LGNoZWNrS2V5LGlzS2V5LGNoZWNrU2NhbGFyS2V5LGNoZWNrQ29weVNldCxjaGVja0NvcHlNYXAsY29weU1hcEtleVNldCxjaGVja0NvcHlCYWc7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dLFtcImdldFBhc3NTdHlsZUNvdmVyXCIsIFskaOKAjV9hID0+IChnZXRQYXNzU3R5bGVDb3ZlciA9ICRo4oCNX2EpXV0sW1wiaW50ZXJzZWN0UmFua0NvdmVyc1wiLCBbJGjigI1fYSA9PiAoaW50ZXJzZWN0UmFua0NvdmVycyA9ICRo4oCNX2EpXV0sW1widW5pb25SYW5rQ292ZXJzXCIsIFskaOKAjV9hID0+ICh1bmlvblJhbmtDb3ZlcnMgPSAkaOKAjV9hKV1dLFtcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdXRpbHMuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJhcHBseUxhYmVsaW5nRXJyb3JcIiwgWyRo4oCNX2EgPT4gKGFwcGx5TGFiZWxpbmdFcnJvciA9ICRo4oCNX2EpXV0sW1wiZnJvbVVuaXF1ZUVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjigI1fYSldXSxbXCJsaXN0RGlmZmVyZW5jZVwiLCBbJGjigI1fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJrZXlHVFwiLCBbJGjigI1fYSA9PiAoa2V5R1QgPSAkaOKAjV9hKV1dLFtcImtleUdURVwiLCBbJGjigI1fYSA9PiAoa2V5R1RFID0gJGjigI1fYSldXSxbXCJrZXlMVFwiLCBbJGjigI1fYSA9PiAoa2V5TFQgPSAkaOKAjV9hKV1dLFtcImtleUxURVwiLCBbJGjigI1fYSA9PiAoa2V5TFRFID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0tleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tLZXkgPSAkaOKAjV9hKV1dLFtcImlzS2V5XCIsIFskaOKAjV9hID0+IChpc0tleSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5TWFwXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlNYXAgPSAkaOKAjV9hKV1dLFtcImNvcHlNYXBLZXlTZXRcIiwgWyRo4oCNX2EgPT4gKGNvcHlNYXBLZXlTZXQgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5QmFnID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtxdW90ZTpxLGJhcmU6YixkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuY29uc3R7ZW50cmllcyx2YWx1ZXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKiBAdHlwZSB7V2Vha1NldDxQYXR0ZXJuPn0gKi9cbmNvbnN0IHBhdHRlcm5NZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGNoIEhlbHBlcnMgSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBGb3IgZm9yd2FyZCByZWZlcmVuY2VzIHRvIGBNYCAqL1xubGV0IE1NO1xuXG4vKipcbiAqIFRoZSBhY3R1YWwgZGVmYXVsdCB2YWx1ZXMgaGVyZSBhcmUsIGF0IHRoZSBwcmVzZW50IHRpbWUsIGZhaXJseVxuICogYXJiaXRyYXJ5IGNob2ljZXMgYW5kIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgc2V0dGxlIGRvd24uIE9mIGNvdXJzZVxuICogYXQgc29tZSBwb2ludCB3ZSdsbCBuZWVkIHRvIHN0b3AgY2hhbmdpbmcgdGhlbS4gQnV0IHdlIHNob3VsZCBmaXJzdFxuICogc2VlIGhvdyBvdXIgc3lzdGVtIGhvbGRzIHVwIHdpdGggdGhlc2UgY2hvaWNlcy4gVGhlIG1haW4gY3JpdGVyaWFcbiAqIGlzIHRoYXQgdGhleSBiZSBiaWcgZW5vdWdoIHRoYXQgXCJub3JtYWxcIiBpbm5vY2VudCBwcm9ncmFtcyByYXJlbHlcbiAqIGVuY291bnRlciB0aGVzZSBsaW1pdHMuXG4gKlxuICogRXhwb3J0ZWQgcHJpbWFyaWx5IGZvciB0ZXN0aW5nLlxuICovXG5jb25zdCAgICAgICAgZGVmYXVsdExpbWl0cz1oYXJkZW4oe1xuZGVjaW1hbERpZ2l0c0xpbWl0OjEwMCxcbnN0cmluZ0xlbmd0aExpbWl0OjEwMF8wMDAsXG5zeW1ib2xOYW1lTGVuZ3RoTGltaXQ6MTAwLFxubnVtUHJvcGVydGllc0xpbWl0OjgwLFxucHJvcGVydHlOYW1lTGVuZ3RoTGltaXQ6MTAwLFxuYXJyYXlMZW5ndGhMaW1pdDoxMF8wMDAsXG5udW1TZXRFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQ6MTBfMDAwLFxubnVtTWFwRW50cmllc0xpbWl0OjUwMDB9KTtcblxuXG4vKipcbiAqIFVzZSB0aGUgcmVzdWx0IG9ubHkgdG8gZ2V0IHRoZSBsaW1pdHMgeW91IG5lZWQgYnkgZGVzdHJ1Y3R1cmluZy5cbiAqIFRodXMsIHRoZSByZXN1bHQgb25seSBuZWVkcyB0byBzdXBwb3J0IGRlc3RydWN0dXJpbmcuIFRoZSBjdXJyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiB1c2VzIGluaGVyaXRhbmNlIGFzIGEgY2hlYXAgaGFjay5cbiAqXG4gKiBAcGFyYW0ge0xpbWl0c30gW2xpbWl0c11cbiAqIEByZXR1cm5zIHtBbGxMaW1pdHN9XG4gKi8kaOKAjV9vbmNlLmRlZmF1bHRMaW1pdHMoZGVmYXVsdExpbWl0cyk7XG5jb25zdCBsaW1pdD0obGltaXRzPXt9KT0+XG4vKiogQHR5cGUge0FsbExpbWl0c30gKi9oYXJkZW4oe19fcHJvdG9fXzpkZWZhdWx0TGltaXRzLC4uLmxpbWl0c30pO1xuXG5jb25zdCBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdD0oXG5wYXlsb2FkLFxubWFpblBheWxvYWRTaGFwZSxcbmNoZWNrLFxubGFiZWwpPT5cbntcbmFzc2VydChBcnJheS5pc0FycmF5KG1haW5QYXlsb2FkU2hhcGUpKTtcbmlmKCFBcnJheS5pc0FycmF5KHBheWxvYWQpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIG11c3QgYmUgYW4gYXJyYXk6ICR7cGF5bG9hZH1gKTtcbiB9XG5cbi8qIFdhcyB0aGUgZm9sbG93aW5nLCBidXQgaXRzIG92ZXJ1c2Ugb2YgcGF0dGVybnMgY2F1c2VkIGFuIGluZmluaXRlIHJlZ3Jlc3MqL1xuLyogY29uc3QgcGF5bG9hZExpbWl0U2hhcGUgPSBoYXJkZW4oKi9cbi8qIE0uc3BsaXQoKi9cbi8qIG1haW5QYXlsb2FkU2hhcGUsKi9cbi8qIE0ucGFydGlhbChoYXJkZW4oW00ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5udW1iZXIoKSldKSwgaGFyZGVuKFtdKSksKi9cbi8qICksKi9cbi8qICk7Ki9cbi8qIHJldHVybiBjaGVja01hdGNoZXMocGF5bG9hZCwgcGF5bG9hZExpbWl0U2hhcGUsIGNoZWNrLCBsYWJlbCk7Ki9cblxuY29uc3QgbWFpbkxlbmd0aD1tYWluUGF5bG9hZFNoYXBlLmxlbmd0aDtcbmlmKCEocGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RofHxwYXlsb2FkLmxlbmd0aD09PW1haW5MZW5ndGgrMSkpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7cShsYWJlbCl9IHBheWxvYWQgdW5leHBlY3RlZCBzaXplOiAke3BheWxvYWR9YCk7XG4gfVxuY29uc3QgbGltaXRzPXBheWxvYWRbbWFpbkxlbmd0aF07XG5wYXlsb2FkPWhhcmRlbihwYXlsb2FkLnNsaWNlKDAsbWFpbkxlbmd0aCkpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFjaGVja01hdGNoZXMocGF5bG9hZCxtYWluUGF5bG9hZFNoYXBlLGNoZWNrLGxhYmVsKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuaWYobGltaXRzPT09dW5kZWZpbmVkKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbihwYXNzU3R5bGVPZihsaW1pdHMpPT09J2NvcHlSZWNvcmQnfHxcbmNoZWNrKGZhbHNlLFggYExpbWl0cyBtdXN0IGJlIGEgcmVjb3JkOiAke3EobGltaXRzKX1gKSkmJlxuZW50cmllcyhsaW1pdHMpLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5wYXNzU3R5bGVPZih2YWx1ZSk9PT0nbnVtYmVyJ3x8XG5jaGVjayhmYWxzZSxYIGBWYWx1ZSBvZiBsaW1pdCAke3Eoa2V5KX0gYnV0IGJlIGEgbnVtYmVyOiAke3EodmFsdWUpfWApKSk7XG5cblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHBhcmFtIHtudW1iZXJ9IGRlY2ltYWxEaWdpdHNMaW1pdFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG5jb25zdCBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdD0oc3BlY2ltZW4sZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrKT0+e1xuaWYoXG5NYXRoLmZsb29yKE1hdGgubG9nMTAoTWF0aC5hYnMoTnVtYmVyKHNwZWNpbWVuKSkpKSsxPD1cbmRlY2ltYWxEaWdpdHNMaW1pdClcbntcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgYmlnaW50ICR7c3BlY2ltZW59IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7ZGVjaW1hbERpZ2l0c0xpbWl0fSBkaWdpdHNgKTtcblxuIH07XG5cbi8qKlxuICogQHJldHVybnMge1BhdHRlcm5LaXR9XG4gKi9cbmNvbnN0IG1ha2VQYXR0ZXJuS2l0PSgpPT57XG4vKipcbiAqIElmIHRoaXMgaXMgYSByZWNvZ25pemVkIG1hdGNoIHRhZywgcmV0dXJuIHRoZSBNYXRjaEhlbHBlci5cbiAqIE90aGVyd2lzZSByZXN1bHQgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEByZXR1cm5zIHtNYXRjaEhlbHBlciB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgbWF5YmVNYXRjaEhlbHBlcj0odGFnKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuSGVscGVyc0J5TWF0Y2hUYWdbdGFnXTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7RXhjbHVkZTxQYXNzU3R5bGUsICd0YWdnZWQnPiB8XG4gKiAgICdjb3B5U2V0JyB8ICdjb3B5QmFnJyB8ICdjb3B5TWFwJyB8IGtleW9mIEhlbHBlcnNCeU1hdGNoVGFnXG4gKiB9IEtpbmRcbiAqIEl0IGlzIGVpdGhlciBhIFBhc3NTdHlsZSBvdGhlciB0aGFuICd0YWdnZWQnLCBvciwgaWYgdGhlIHVuZGVybHlpbmdcbiAqIFBhc3NTdHlsZSBpcyAndGFnZ2VkJywgdGhlbiB0aGUgYGdldFRhZ2AgdmFsdWUgZm9yIHRhZ3MgdGhhdCBhcmVcbiAqIHJlY29nbml6ZWQgYXQgdGhlIHN0b3JlIGxldmVsIG9mIGFic3RyYWN0aW9uLiBGb3IgZWFjaCBvZiB0aG9zZVxuICogdGFncywgYSB0YWdnZWQgcmVjb3JkIG9ubHkgaGFzIHRoYXQga2luZCBpZiBpdCBzYXRpc2ZpZXMgdGhlIGludmFyaWFudHNcbiAqIHRoYXQgdGhlIHN0b3JlIGxldmVsIGFzc29jaWF0ZXMgd2l0aCB0aGF0IGtpbmQuXG4gKi9cblxuLyoqIEB0eXBlIHtNYXA8S2luZCwgdW5rbm93bj59ICovXG5jb25zdCBzaW5nbGV0b25LaW5kcz1uZXcgTWFwKFtcblsnbnVsbCcsbnVsbF0sXG5bJ3VuZGVmaW5lZCcsdW5kZWZpbmVkXV0pO1xuXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8Q29weVRhZ2dlZCwgS2luZD59XG4gKiBPbmx5IGZvciB0YWdnZWQgcmVjb3JkcyBvZiByZWNvZ25pemVkIGtpbmRzIHdob3NlIHN0b3JlLWxldmVsIGludmFyaWFudHNcbiAqIGhhdmUgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gKi9cbmNvbnN0IHRhZ01lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIHRhZ3MsIGFuZCBvbmx5IGlmIHRoZSB0YWdnZWRcbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB0YWdnZWRcbiAqIEBwYXJhbSB7S2luZH0gdGFnXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tUYWdnZWQ9KHRhZ2dlZCx0YWcsY2hlY2spPT57XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCh0YWdnZWQucGF5bG9hZCxjaGVjayk7XG4gfVxuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbnJldHVybiBjaGVja0NvcHlTZXQodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbnJldHVybiBjaGVja0NvcHlCYWcodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbnJldHVybiBjaGVja0NvcHlNYXAodGFnZ2VkLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9OiAke3RhZ2dlZH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgb25seSBhIHJlY29nbml6ZWQga2luZCwgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuIHBhc3NlcyB0aGVcbiAqIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKiBPdGhlcndpc2UsIGBjaGVjayhmYWxzZSwgLi4uKWAgYW5kIHJldHVybnMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge0tpbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGtpbmRPZj0oc3BlY2ltZW4sY2hlY2s9aWRlbnRDaGVja2VyKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHBhc3NTdHlsZSE9PSd0YWdnZWQnKXtcbnJldHVybiBwYXNzU3R5bGU7XG4gfVxuLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgc3BlY2ltZW4gaXMgd2VsbCBmb3JtZWQqL1xuLyogYXMgYSB0YWdnZWQgcmVjb3JkLCB3aGljaCBpcyBkZWZpbmVkIGF0IHRoZSBtYXJzaGFsIGxldmVsIG9mIGFic3RyYWN0aW9uLCovXG4vKiBzaW5jZSBgcGFzc1N0eWxlT2ZgIGNoZWNrcyB0aG9zZSBpbnZhcmlhbnRzLiovXG5pZih0YWdNZW1vLmhhcyhzcGVjaW1lbikpe1xucmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiB9XG5jb25zdCB0YWc9Z2V0VGFnKHNwZWNpbWVuKTtcbmlmKGNoZWNrVGFnZ2VkKHNwZWNpbWVuLHRhZyxjaGVjaykpe1xudGFnTWVtby5zZXQoc3BlY2ltZW4sdGFnKTtcbnJldHVybiB0YWc7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuY2hlY2soZmFsc2UsWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9YCk7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuaGFyZGVuKGtpbmRPZik7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2luZD0oc3BlY2ltZW4sa2luZCxjaGVjayk9Pntcbi8qIGNoZWNrIG51bGwgYW5kIHVuZGVmaW5lZCBhcyBLZXlzKi9cbmlmKHNpbmdsZXRvbktpbmRzLmhhcyhraW5kKSl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHNpbmdsZXRvbktpbmRzLmdldChraW5kKSxjaGVjayk7XG4gfVxuXG5jb25zdCByZWFsS2luZD1raW5kT2Yoc3BlY2ltZW4sY2hlY2spO1xuaWYoa2luZD09PXJlYWxLaW5kKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGNoZWNrIT09aWRlbnRDaGVja2VyKXtcbi8qIGBraW5kYCBhbmQgYHJlYWxLaW5kYCBjYW4gYmUgZW1iZWRkZWQgd2l0aG91dCBxdW90ZXMqL1xuLyogYmVjYXVzZSB0aGV5IGFyZSBkcmF3biBmcm9tIHRoZSBlbnVtZXJhdGVkIGNvbGxlY3Rpb24gb2Yga25vd24gS2luZHMuKi9cbmNoZWNrKGZhbHNlLFggYCR7YihyZWFsS2luZCl9ICR7c3BlY2ltZW59IC0gTXVzdCBiZSBhICR7YihraW5kKX1gKTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLZXl9IGtleUFzUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrQXNLZXlQYXR0PShzcGVjaW1lbixrZXlBc1BhdHRlcm4sY2hlY2spPT57XG5pZihpc0tleShzcGVjaW1lbikmJmtleUVRKHNwZWNpbWVuLGtleUFzUGF0dGVybikpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuLyogV2hlbiB0aGUgbWlzbWF0Y2ggb2NjdXJzIGFnYWluc3QgYSBrZXkgdXNlZCBhcyBhIHBhdHRlcm4sKi9cbi8qIHRoZSBwYXR0ZXJuIHNob3VsZCBzdGlsbCBiZSByZWRhY3RlZC4qL1xuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlOiAke2tleUFzUGF0dGVybn1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBpc1BhdHRlcm4gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge0NoZWNrUGF0dGVybn0gKi9cbmNvbnN0IGNoZWNrUGF0dGVybj0ocGF0dCxjaGVjayk9PntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIEFsbCBrZXlzIGFyZSBwYXR0ZXJucy4gRm9yIHRoZXNlLCB0aGUga2V5TWVtbyB3aWxsIGRvLiovXG4vKiBBbGwgcHJpbWl0aXZlcyB0aGF0IGFyZSBwYXR0ZXJucyBhcmUgYWxzbyBrZXlzLCB3aGljaCB0aGlzKi9cbi8qIGFsc28gdGFrZXMgY2FyZSBvZiB3aXRob3V0IG1lbW8uIFRoZSByZXN0IG9mIG91ciBjaGVja2luZyBsb2dpYyovXG4vKiBpcyBvbmx5IGNvbmNlcm5lZCB3aXRoIG5vbi1rZXkgcGF0dGVybnMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmlmKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcmVzdWx0PWNoZWNrUGF0dGVybkludGVybmFsKHBhdHQsY2hlY2spO1xuaWYocmVzdWx0KXtcbnBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dCAtIGtub3duIG5vdCB0byBiZSBhIGtleSwgYW5kIHRoZXJlZm9yZSBrbm93blxuICogbm90IHRvIGJlIHByaW1pdGl2ZS5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbD0ocGF0dCxjaGVjayk9Pntcbi8qIFB1cnBvc2VseSBwYXJhbGxlbHMgY2hlY2tLZXkuIFRPRE8gcmV1c2UgbW9yZSBsb2dpYyBiZXR3ZWVuIHRoZW0uKi9cbi8qIE1vc3Qgb2YgdGhlIHRleHQgb2YgdGhlIHN3aXRjaCBiZWxvdyBub3QgZGVhbGluZyB3aXRoIG1hdGNoZXJzIGlzKi9cbi8qIGVzc2VudGlhbGx5IGlkZW50aWNhbC4qL1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja1BhdHRlcm4oY2hpbGQsY2hlY2spO1xuXG5jb25zdCBraW5kPWtpbmRPZihwYXR0LGNoZWNrKTtcbnN3aXRjaChraW5kKXtcbmNhc2UgdW5kZWZpbmVkOntcbnJldHVybiBmYWxzZTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiB2YWx1ZXMocGF0dCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEgcGF0dGVybiBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUqL1xuLyogcGF0dGVybnMqL1xucmV0dXJuIHBhdHQuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBrZXlzIGFuZCB0aGVyZWZvcmUgYWxyZWFkeSBrbm93biB0byBiZSovXG4vKiBwYXR0ZXJucy4qL1xuLyogQSBjb3B5TWFwIGlzIGEgcGF0dGVybiBpZiBpdHMgdmFsdWVzIGFyZSBwYXR0ZXJucy4qL1xucmV0dXJuIGNoZWNrUGF0dGVybihwYXR0LnZhbHVlcyxjaGVjayk7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShraW5kKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuIH1cbmRlZmF1bHQ6e1xuaWYobWF5YmVNYXRjaEhlbHBlcihraW5kKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1BhdHRlcm49KHBhdHQpPT5jaGVja1BhdHRlcm4ocGF0dCxpZGVudENoZWNrZXIpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICovXG5jb25zdCBhc3NlcnRQYXR0ZXJuPShwYXR0KT0+e1xuY2hlY2tQYXR0ZXJuKHBhdHQsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gbWF0Y2hlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja01hdGNoZXM9KHNwZWNpbWVuLHBhdHRlcm4sY2hlY2ssbGFiZWw9dW5kZWZpbmVkKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuYXBwbHlMYWJlbGluZ0Vycm9yKGNoZWNrTWF0Y2hlc0ludGVybmFsLFtzcGVjaW1lbixwYXR0ZXJuLGNoZWNrXSxsYWJlbCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTWF0Y2hlc0ludGVybmFsPShzcGVjaW1lbixwYXR0LGNoZWNrKT0+e1xuLyogV29ydGggYmVpbmcgYSBiaXQgdmVyYm9zZSBhbmQgcmVwZXRpdGl2ZSBpbiBvcmRlciB0byBvcHRpbWl6ZSovXG5jb25zdCBwYXR0ZXJuS2luZD1raW5kT2YocGF0dCxjaGVjayk7XG5jb25zdCBzcGVjaW1lbktpbmQ9a2luZE9mKHNwZWNpbWVuKTsvKiBtYXkgYmUgdW5kZWZpbmVkKi9cbnN3aXRjaChwYXR0ZXJuS2luZCl7XG5jYXNlIHVuZGVmaW5lZDp7XG5yZXR1cm4gRmFpbCBgcGF0dGVybiBleHBlY3RlZDogJHtwYXR0fWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gRmFpbCBgcHJvbWlzZXMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gRmFpbCBgZXJyb3JzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ3N5bWJvbCc6XG5jYXNlJ2NvcHlTZXQnOlxuY2FzZSdjb3B5QmFnJzpcbmNhc2UncmVtb3RhYmxlJzp7XG4vKiBUaGVzZSBraW5kcyBhcmUgbmVjZXNzYXJpbHkga2V5cyovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5QXJyYXknKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weUFycmF5IHRvIG1hdGNoIGEgY29weUFycmF5IHBhdHRlcm46ICR7cShcbnBhdHQpXG4gfWApO1xuXG4gfVxuY29uc3R7bGVuZ3RofT1wYXR0O1xuaWYoc3BlY2ltZW4ubGVuZ3RoIT09bGVuZ3RoKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgQXJyYXkgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGFzIGxvbmcgYXMgY29weUFycmF5IHBhdHRlcm46ICR7cShcbnBhdHQpXG4gfWApO1xuXG4gfVxucmV0dXJuIHBhdHQuZXZlcnkoKHAsaSk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSxwLGNoZWNrLGkpKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cShcbnBhdHQpXG4gfWApO1xuXG4gfVxuLyogVE9ETyBEZXRlY3QgYW5kIGFjY3VtdWxhdGUgZGlmZmVyZW5jZSBpbiBvbmUgcGFzcy4qL1xuLyogUmF0aGVyIHRoYW4gdXNpbmcgdHdvIGNhbGxzIHRvIGBsaXN0RGlmZmVyZW5jZWAgdG8gZGV0ZWN0IGFuZCovXG4vKiByZXBvcnQgaWYgYW5kIGhvdyB0aGVzZSBsaXN0cyBkaWZmZXIsIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkqL1xuLyogaW4gc29ydGVkIG9yZGVyLCB3ZSBzaG91bGQgaW5zdGVhZCB1c2UgYW4gYWxnb3JpdGhtIGxpa2UqL1xuLyogYGl0ZXJEaXNqb2ludFVuaW9uYCBmcm9tIG1lcmdlLXNvcnQtb3BlcmF0b3JzLmpzKi9cbmNvbnN0IHNwZWNpbWVuTmFtZXM9cmVjb3JkTmFtZXMoc3BlY2ltZW4pO1xuY29uc3QgcGF0dE5hbWVzPXJlY29yZE5hbWVzKHBhdHQpO1xuY29uc3QgbWlzc2luZz1saXN0RGlmZmVyZW5jZShwYXR0TmFtZXMsc3BlY2ltZW5OYW1lcyk7XG5pZihtaXNzaW5nLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBoYXZlIG1pc3NpbmcgcHJvcGVydGllcyAke3EobWlzc2luZyl9YCk7XG5cbiB9XG5jb25zdCB1bmV4cGVjdGVkPWxpc3REaWZmZXJlbmNlKHNwZWNpbWVuTmFtZXMscGF0dE5hbWVzKTtcbmlmKHVuZXhwZWN0ZWQubGVuZ3RoPj0xKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG5vdCBoYXZlIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKFxudW5leHBlY3RlZClcbiB9YCk7XG5cbiB9XG5jb25zdCBzcGVjaW1lblZhbHVlcz1yZWNvcmRWYWx1ZXMoc3BlY2ltZW4sc3BlY2ltZW5OYW1lcyk7XG5jb25zdCBwYXR0VmFsdWVzPXJlY29yZFZhbHVlcyhwYXR0LHBhdHROYW1lcyk7XG5yZXR1cm4gcGF0dE5hbWVzLmV2ZXJ5KChsYWJlbCxpKT0+XG5jaGVja01hdGNoZXMoc3BlY2ltZW5WYWx1ZXNbaV0scGF0dFZhbHVlc1tpXSxjaGVjayxsYWJlbCkpO1xuXG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weU1hcCcpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5TWFwIHRvIG1hdGNoIGEgY29weU1hcCBwYXR0ZXJuOiAke3EoXG5wYXR0KVxuIH1gKTtcblxuIH1cbmNvbnN0e3BheWxvYWQ6cGF0dFBheWxvYWR9PXBhdHQ7XG5jb25zdHtwYXlsb2FkOnNwZWNpbWVuUGF5bG9hZH09c3BlY2ltZW47XG5jb25zdCBwYXR0S2V5U2V0PWNvcHlNYXBLZXlTZXQocGF0dFBheWxvYWQpO1xuY29uc3Qgc3BlY2ltZW5LZXlTZXQ9Y29weU1hcEtleVNldChzcGVjaW1lblBheWxvYWQpO1xuLyogQ29tcGFyZSBrZXlzIGFzIGNvcHlTZXRzKi9cbmlmKCFjaGVja01hdGNoZXMoc3BlY2ltZW5LZXlTZXQscGF0dEtleVNldCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHBhdHRWYWx1ZXM9cGF0dFBheWxvYWQudmFsdWVzO1xuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9c3BlY2ltZW5QYXlsb2FkLnZhbHVlcztcbi8qIGNvbXBhcmUgdmFsdWVzIGFzIGNvcHlBcnJheXMqL1xucmV0dXJuIGNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlcyxwYXR0VmFsdWVzLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbmNvbnN0IG1hdGNoSGVscGVyPW1heWJlTWF0Y2hIZWxwZXIocGF0dGVybktpbmQpO1xuaWYobWF0Y2hIZWxwZXIpe1xucmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LnBheWxvYWQsY2hlY2spO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBzaG91bGQgaGF2ZSByZWNvZ25pemVkICR7cShwYXR0ZXJuS2luZCl9IGA7XG4gfX1cblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IG1hdGNoZXM9KHNwZWNpbWVuLHBhdHQpPT5cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcik7XG5cbi8qKlxuICogUmV0dXJuaW5nIG5vcm1hbGx5IGluZGljYXRlcyBzdWNjZXNzLiBNYXRjaCBmYWlsdXJlIGlzIGluZGljYXRlZCBieVxuICogdGhyb3dpbmcuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKi9cbmNvbnN0IG11c3RNYXRjaD0oc3BlY2ltZW4scGF0dCxsYWJlbD11bmRlZmluZWQpPT57XG5pZihjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxpZGVudENoZWNrZXIsbGFiZWwpKXtcbnJldHVybjtcbiB9XG4vKiBzaG91bGQgb25seSB0aHJvdyovXG5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxhc3NlcnRDaGVja2VyLGxhYmVsKTtcbkZhaWwgYGludGVybmFsOiAke2xhYmVsfTogaW5jb25zaXN0ZW50IHBhdHRlcm4gbWF0Y2g6ICR7cShwYXR0KX1gO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGdldFJhbmtDb3ZlciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7R2V0UmFua0NvdmVyfSAqL1xuY29uc3QgZ2V0UmFua0NvdmVyPShwYXR0LGVuY29kZVBhc3NhYmxlKT0+e1xuaWYoaXNLZXkocGF0dCkpe1xuY29uc3QgZW5jb2RlZD1lbmNvZGVQYXNzYWJsZShwYXR0KTtcbmlmKGVuY29kZWQhPT11bmRlZmluZWQpe1xucmV0dXJuW2VuY29kZWQsIGAke2VuY29kZWR9fmBdO1xuIH1cbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGF0dCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weUFycmF5Jzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlBcnJheXMuKi9cbi8qKi9cbi8qIGNvbnN0IHJhbmtDb3ZlcnMgPSBwYXR0Lm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogcmFua0NvdmVycy5tYXAoKFtsZWZ0LCBfcmlnaHRdKSA9PiBsZWZ0KSwqL1xuLyogcmFua0NvdmVycy5tYXAoKFtfbGVmdCwgcmlnaHRdKSA9PiByaWdodCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weVJlY29yZHMuKi9cbi8qKi9cbi8qIGNvbnN0IHBhdHRLZXlzID0gb3duS2V5cyhwYXR0KTsqL1xuLyogY29uc3QgcGF0dEVudHJpZXMgPSBoYXJkZW4ocGF0dEtleXMubWFwKGtleSA9PiBba2V5LCBwYXR0W2tleV1dKSk7Ki9cbi8qIGNvbnN0IFtsZWZ0RW50cmllc0xpbWl0LCByaWdodEVudHJpZXNMaW1pdF0gPSovXG4vKiBnZXRSYW5rQ292ZXIocGF0dEVudHJpZXMpOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMobGVmdEVudHJpZXNMaW1pdCksKi9cbi8qIGZyb21VbmlxdWVFbnRyaWVzKHJpZ2h0RW50cmllc0xpbWl0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHBhdHQpO1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbi8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG5yZXR1cm4gbWF0Y2hIZWxwZXIuZ2V0UmFua0NvdmVyKHBhdHQucGF5bG9hZCxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weVNldHMuKi9cbi8qKi9cbi8qIC8vIFNob3VsZCBhbHJlYWR5IGJlIHZhbGlkYXRlZCBieSBjaGVja1BhdHRlcm4uIEJ1dCBiZWNhdXNlIHRoaXMqL1xuLyogLy8gaXMgYSBjaGVjayB0aGF0IG1heSBsb29zZW4gb3ZlciB0aW1lLCB3ZSBhbHNvIGFzc2VydCovXG4vKiAvLyBldmVyeXdoZXJlIHdlIHN0aWxsIHJlbHkgb24gdGhlIHJlc3RyaWN0aW9uLiovXG4vKiBgYGBqcyovXG4vKiBwYXR0LnBheWxvYWQubGVuZ3RoID09PSAxIHx8Ki9cbi8qIEZhaWxgTm9uLXNpbmdsZXRvbiBjb3B5U2V0cyB3aXRoIG1hdGNoZXIgbm90IHlldCBpbXBsZW1lbnRlZDogJHtwYXR0fWA7Ki9cbi8qIGBgYCovXG4vKiovXG4vKiBjb25zdCBbbGVmdEVsZW1lbnRMaW1pdCwgcmlnaHRFbGVtZW50TGltaXRdID0gZ2V0UmFua0NvdmVyKCovXG4vKiBwYXR0LnBheWxvYWRbMF0sKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlQ29weVNldChbbGVmdEVsZW1lbnRMaW1pdF0pLCovXG4vKiBtYWtlQ29weVNldChbcmlnaHRFbGVtZW50TGltaXRdKSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5TWFwcy4qL1xuLyoqL1xuLyogLy8gQSBtYXRjaGluZyBjb3B5TWFwIG11c3QgaGF2ZSB0aGUgc2FtZSBrZXlzLCBvciBhdCBtb3N0IG9uZSovXG4vKiAvLyBub24ta2V5IGtleSBwYXR0ZXJuLiBUaHVzIHdlIGNhbiBhc3N1bWUgdGhhdCB2YWx1ZSBwb3NpdGlvbnMqL1xuLyogLy8gbWF0Y2ggMS10by0xLiovXG4vKiAvLyovXG4vKiAvLyBUT0RPIEkgbWF5IGJlIG92ZXJsb29raW5nIHRoYXQgdGhlIGxlc3MgcHJlY2lzZSByYW5rT3JkZXIqL1xuLyogLy8gZXF1aXZhbGVuY2UgY2xhc3MgbWF5IGNhdXNlIHZhbHVlcyB0byBiZSBvdXQgb2Ygb3JkZXIsKi9cbi8qIC8vIG1ha2luZyB0aGlzIHJhbmtDb3ZlciBub3QgYWN0dWFsbHkgY292ZXIuIEluIHRoYXQgY2FzZSwgZm9yKi9cbi8qIC8vIGFsbCB0aGUgdmFsdWVzIGZvciBrZXlzIGF0IHRoZSBzYW1lIHJhbmssIHdlIHNob3VsZCB1bmlvbiB0aGVpciovXG4vKiAvLyByYW5rIGNvdmVycy4gVE9ETyBQT1NTSUJMRSBTSUxFTlQgQ09SUkVDVE5FU1MgQlVHKi9cbi8qIC8vKi9cbi8qIC8vIElmIHRoaXMgaXMgYSBidWcsIGl0IHByb2JhYmx5IGFmZmVjdHMgdGhlIGdldFJhbmtDb3ZlciovXG4vKiAvLyBjYXNlcyBvZiBtYXRjaExURUhlbHBlciBhbmQgbWF0Y2hHVEVIZWxwZXIgb24gY29weU1hcCBhcyovXG4vKiAvLyB3ZWxsLiBTZWUgbWFrZUNvcHlNYXAgZm9yIGFuIGlkZWEgb24gZml4aW5nKi9cbi8qIC8vIHRoaXMgYnVnLiovXG4vKiBjb25zdCBbbGVmdFBheWxvYWRMaW1pdCwgcmlnaHRQYXlsb2FkTGltaXRdID0gZ2V0UmFua0NvdmVyKCovXG4vKiBwYXR0LnBheWxvYWQsKi9cbi8qIGVuY29kZVBhc3NhYmxlLCovXG4vKiApOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogbWFrZVRhZ2dlZCgnY29weU1hcCcsIGxlZnRQYXlsb2FkTGltaXQpLCovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgcmlnaHRQYXlsb2FkTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxuYnJlYWs7LyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuIH1cbmRlZmF1bHQ6e1xuYnJlYWs7LyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuIH07XG5cbmNvbnN0IGFycmF5RXZlcnlNYXRjaFBhdHRlcm49KGFycmF5LHBhdHQsY2hlY2ssbGFiZWxQcmVmaXg9JycpPT57XG5pZihjaGVja0tpbmQocGF0dCwnbWF0Y2g6YW55JyxpZGVudENoZWNrZXIpKXtcbi8qIGlmIHRoZSBwYXR0ZXJuIGlzIE0uYW55KCksIHdlIGtub3cgaXRzIHRydWUqL1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGFycmF5LmV2ZXJ5KChlbCxpKT0+XG5jaGVja01hdGNoZXMoZWwscGF0dCxjaGVjaywgYCR7bGFiZWxQcmVmaXh9WyR7aX1dYCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTWF0Y2ggSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQW55SGVscGVyPUZhcignbWF0Y2g6YW55IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihfc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWUsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihtYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxubWF0Y2hlclBheWxvYWQ9PT11bmRlZmluZWR8fFxuY2hlY2soZmFsc2UsWCBgbWF0Y2g6YW55IHBheWxvYWQ6ICR7bWF0Y2hlclBheWxvYWR9IC0gTXVzdCBiZSB1bmRlZmluZWRgKSxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnJywneyddfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQW5kSGVscGVyPUZhcignbWF0Y2g6YW5kIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbnJldHVybiBwYXR0cy5ldmVyeSgocGF0dCk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGNoZWNrKSk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRQYXR0cyxjaGVjayk9PntcbmNvbnN0IGNoZWNrSXQ9KHBhdHQpPT5jaGVja1BhdHRlcm4ocGF0dCxjaGVjayk7XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YoYWxsZWdlZFBhdHRzKT09PSdjb3B5QXJyYXknfHxcbmNoZWNrKGZhbHNlLFggYE5lZWRzIGFycmF5IG9mIHN1Yi1wYXR0ZXJuczogJHtxKGFsbGVnZWRQYXR0cyl9YCkpJiZcbmFsbGVnZWRQYXR0cy5ldmVyeShjaGVja0l0KSk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG5pbnRlcnNlY3RSYW5rQ292ZXJzKFxuY29tcGFyZVJhbmssXG5wYXR0cy5tYXAoKHApPT5nZXRSYW5rQ292ZXIocCxlbmNvZGVQYXNzYWJsZSkpKX0pO1xuXG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoT3JIZWxwZXI9RmFyKCdtYXRjaDpvciBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scGF0dHMsY2hlY2spPT57XG5jb25zdHtsZW5ndGh9PXBhdHRzO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gbm8gcGF0dGVybiBkaXNqdW5jdHMgdG8gbWF0Y2g6ICR7cShwYXR0cyl9YCk7XG5cbiB9XG5pZihcbnBhdHRzLmxlbmd0aD09PTImJlxuIW1hdGNoZXMoc3BlY2ltZW4scGF0dHNbMF0pJiZcbmNoZWNrS2luZChwYXR0c1swXSwnbWF0Y2g6a2luZCcsaWRlbnRDaGVja2VyKSYmXG5wYXR0c1swXS5wYXlsb2FkPT09J3VuZGVmaW5lZCcpXG57XG4vKiBXb3J0aCBzcGVjaWFsIGNhc2luZyB0aGUgb3B0aW9uYWwgcGF0dGVybiBmb3IqL1xuLyogYmV0dGVyIGVycm9yIG1lc3NhZ2VzLiovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHRzWzFdLGNoZWNrKTtcbiB9XG5pZihwYXR0cy5zb21lKChwYXR0KT0+bWF0Y2hlcyhzcGVjaW1lbixwYXR0KSkpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBtYXRjaCBvbmUgb2YgJHtxKHBhdHRzKX1gKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFuZEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihwYXR0cyxlbmNvZGVQYXNzYWJsZSk9PlxudW5pb25SYW5rQ292ZXJzKFxuY29tcGFyZVJhbmssXG5wYXR0cy5tYXAoKHApPT5nZXRSYW5rQ292ZXIocCxlbmNvZGVQYXNzYWJsZSkpKX0pO1xuXG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTm90SGVscGVyPUZhcignbWF0Y2g6bm90IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0LGNoZWNrKT0+e1xuaWYobWF0Y2hlcyhzcGVjaW1lbixwYXR0KSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBmYWlsIG5lZ2F0ZWQgcGF0dGVybjogJHtxKHBhdHQpfWApO1xuXG4gfWVsc2V7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tQYXR0ZXJuLFxuXG5nZXRSYW5rQ292ZXI6KF9wYXR0LF9lbmNvZGVQYXNzYWJsZSk9PlsnJywneyddfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU2NhbGFySGVscGVyPUZhcignbWF0Y2g6c2NhbGFyIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbmNoZWNrU2NhbGFyS2V5KHNwZWNpbWVuLGNoZWNrKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6bWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5bJ2EnLCd6fiddfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoS2V5SGVscGVyPUZhcignbWF0Y2g6a2V5IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbmNoZWNrS2V5KHNwZWNpbWVuLGNoZWNrKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6bWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5bJ2EnLCd6fiddfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUGF0dGVybkhlbHBlcj1GYXIoJ21hdGNoOnBhdHRlcm4gaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tQYXR0ZXJuKHNwZWNpbWVuLGNoZWNrKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6bWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5bJ2EnLCd6fiddfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoS2luZEhlbHBlcj1GYXIoJ21hdGNoOmtpbmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6Y2hlY2tLaW5kLFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZEtleUtpbmQsY2hlY2spPT5cbnR5cGVvZiBhbGxlZ2VkS2V5S2luZD09PSdzdHJpbmcnfHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBtYXRjaDpraW5kOiBwYXlsb2FkOiAke2FsbGVnZWRLZXlLaW5kfSAtIEEga2luZCBuYW1lIG11c3QgYmUgYSBzdHJpbmdgKSxcblxuXG5nZXRSYW5rQ292ZXI6KGtpbmQsX2VuY29kZVBhc3NhYmxlKT0+e1xubGV0IHN0eWxlO1xuc3dpdGNoKGtpbmQpe1xuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weU1hcCc6e1xuc3R5bGU9J3RhZ2dlZCc7XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbnN0eWxlPWtpbmQ7XG5icmVhaztcbiB9fVxuXG5yZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIoc3R5bGUpO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hCaWdpbnRIZWxwZXI9RmFyKCdtYXRjaDpiaWdpbnQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2RlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnYmlnaW50JyxjaGVjaykmJlxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOmJpZ2ludCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ2JpZ2ludCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTmF0SGVscGVyPUZhcignbWF0Y2g6bmF0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2JpZ2ludCcsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtiaWdpbnR9ICovc3BlY2ltZW4+PTBuLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIG5vbi1uZWdhdGl2ZWApJiZcblxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOm5hdCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuLyogVE9ETyBDb3VsZCBiZSBtb3JlIHByZWNpc2UqL1xuZ2V0UGFzc1N0eWxlQ292ZXIoJ2JpZ2ludCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3RyaW5nSGVscGVyPUZhcignbWF0Y2g6c3RyaW5nIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtzdHJpbmdMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbi8qIHByZXR0aWVyLWlnbm9yZSovXG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ3N0cmluZycsY2hlY2spJiYoXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG4vKiogQHR5cGUge3N0cmluZ30gKi9zcGVjaW1lbi5sZW5ndGg8PXN0cmluZ0xlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBzdHJpbmcgJHtzcGVjaW1lbn0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzdHJpbmdMZW5ndGhMaW1pdH1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOnN0cmluZyBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N0cmluZycpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3ltYm9sSGVscGVyPUZhcignbWF0Y2g6c3ltYm9sIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdzeW1ib2wnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3Qgc3ltYm9sTmFtZT1uYW1lRm9yUGFzc2FibGVTeW1ib2woc3BlY2ltZW4pO1xuXG5pZih0eXBlb2Ygc3ltYm9sTmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYGludGVybmFsOiBQYXNzYWJsZSBzeW1ib2wgJHtzcGVjaW1lbn0gbXVzdCBoYXZlIGEgcGFzc2FibGUgbmFtZWA7XG4gfVxucmV0dXJuIGNoZWNrKFxuc3ltYm9sTmFtZS5sZW5ndGg8PXN5bWJvbE5hbWVMZW5ndGhMaW1pdCxcblggYFN5bWJvbCBuYW1lICR7cShcbnN5bWJvbE5hbWUpXG4gfSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N5bWJvbE5hbWVMZW5ndGhMaW1pdH1gKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6c3ltYm9sIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3Zlcignc3ltYm9sJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZW1vdGFibGVIZWxwZXI9RmFyKCdtYXRjaDpyZW1vdGFibGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJlbW90YWJsZURlc2MsY2hlY2spPT57XG4vKiBVbmZvcnR1bmF0ZSBkdXBsaWNhdGlvbiBvZiBjaGVja0tpbmQgbG9naWMsIGJ1dCBubyBiZXR0ZXIgY2hvaWNlcy4qL1xuaWYoY2hlY2tLaW5kKHNwZWNpbWVuLCdyZW1vdGFibGUnLGlkZW50Q2hlY2tlcikpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2s9PT1pZGVudENoZWNrZXIpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e2xhYmVsfT1yZW1vdGFibGVEZXNjO1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmNvbnN0IGtpbmREZXRhaWxzPVxucGFzc1N0eWxlIT09J3RhZ2dlZCc/XG4vKiBQYXNzIHN0eWxlIGNhbiBiZSBlbWJlZGRlZCBpbiBkZXRhaWxzIHdpdGhvdXQgcXVvdGVzLiovXG5iKHBhc3NTdHlsZSk6XG4vKiBUYWcgbXVzdCBiZSBxdW90ZWQgYmVjYXVzZSBpdCBpcyBwb3RlbnRpYWxseSBhdHRhY2tlci1jb250cm9sbGVkKi9cbi8qICh1bmxpa2UgYGtpbmRPZmAsIHRoaXMgZG9lcyBub3QgcmVqZWN0IHVucmVjb2duaXplZCB0YWdzKS4qL1xucShnZXRUYWcoc3BlY2ltZW4pKTtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuLyogYGxhYmVsYCBjYW4gYmUgZW1iZWRkZWQgd2l0aG91dCBxdW90ZXMgYmVjYXVzZSBpdCBpcyBwcm92aWRlZCBieSovXG4vKiBsb2NhbCBjb2RlIGxpa2UgYE0ucmVtb3RhYmxlKFwiLi4uXCIpYC4qL1xuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgcmVtb3RhYmxlICR7YihsYWJlbCl9LCBub3QgJHtraW5kRGV0YWlsc31gKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkUmVtb3RhYmxlRGVzYyxjaGVjayk9PlxuY2hlY2tNYXRjaGVzKFxuYWxsZWdlZFJlbW90YWJsZURlc2MsXG5oYXJkZW4oe2xhYmVsOk1NLnN0cmluZygpfSksXG5jaGVjayxcbidtYXRjaDpyZW1vdGFibGUgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX3JlbW90YWJsZURlc2MsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcigncmVtb3RhYmxlJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEVIZWxwZXI9RmFyKCdtYXRjaDpsdGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5TFRFKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDw9ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOihyaWdodE9wZXJhbmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbi8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4vKiB0byBiZSBgbGV0YCovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbmxldFtsZWZ0Qm91bmQscmlnaHRCb3VuZF09Z2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbmNvbnN0IG5ld1JpZ2h0Qm91bmQ9IGAke2VuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCl9fmA7XG5pZihuZXdSaWdodEJvdW5kIT09dW5kZWZpbmVkKXtcbnJpZ2h0Qm91bmQ9bmV3UmlnaHRCb3VuZDtcbiB9XG5yZXR1cm5bbGVmdEJvdW5kLHJpZ2h0Qm91bmRdO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEhlbHBlcj1GYXIoJ21hdGNoOmx0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDwgJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoR1RFSGVscGVyPUZhcignbWF0Y2g6Z3RlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdMZWZ0Qm91bmQ9ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKTtcbmlmKG5ld0xlZnRCb3VuZCE9PXVuZGVmaW5lZCl7XG5sZWZ0Qm91bmQ9bmV3TGVmdEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEdUSGVscGVyPUZhcignbWF0Y2g6Z3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5R1Qoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPiAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjptYXRjaEdURUhlbHBlci5nZXRSYW5rQ292ZXJ9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZWNvcmRPZkhlbHBlcj1GYXIoJ21hdGNoOnJlY29yZE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVByb3BlcnRpZXNMaW1pdCxwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spJiZcbmNoZWNrKFxub3duS2V5cyhzcGVjaW1lbikubGVuZ3RoPD1udW1Qcm9wZXJ0aWVzTGltaXQsXG5YIGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1Qcm9wZXJ0aWVzTGltaXQpXG4gfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWApJiZcblxuZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5cbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrLFxuW1xua2V5Lmxlbmd0aDw9cHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG5YIGBQcm9wZXJ0eSBuYW1lIG11c3Qgbm90IGJlIGxvbmdlciB0aGFuICR7cShcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0KVxuIH1gXSxcblxua2V5KSYmXG5cbmNoZWNrTWF0Y2hlcyhcbmhhcmRlbihba2V5LHZhbHVlXSksXG5oYXJkZW4oW2tleVBhdHQsdmFsdWVQYXR0XSksXG5jaGVjayxcbmtleSkpKTtcblxuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfZW50cnlQYXR0KT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFycmF5T2ZIZWxwZXI9RmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbc3ViUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2FycmF5TGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG4vKiBwcmV0dGllci1pZ25vcmUqL1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QXJyYXknLGNoZWNrKSYmKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5sZW5ndGg8PWFycmF5TGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YCkpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbixzdWJQYXR0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU2V0T2ZIZWxwZXI9RmFyKCdtYXRjaDpzZXRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2tleVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtudW1TZXRFbGVtZW50c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5U2V0JyxjaGVjaykmJlxuY2hlY2soXG4vKiogQHR5cGUge0FycmF5fSAqL3NwZWNpbWVuLnBheWxvYWQubGVuZ3RoPG51bVNldEVsZW1lbnRzTGltaXQsXG5YIGBTZXQgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKG51bVNldEVsZW1lbnRzTGltaXQpfSBlbGVtZW50czogJHtcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoXG4gfWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLGtleVBhdHQsY2hlY2ssJ3NldCBlbGVtZW50cycpKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6c2V0T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQmFnT2ZIZWxwZXI9RmFyKCdtYXRjaDpiYWdPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LGNvdW50UGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LGRlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weUJhZycsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDw9XG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuWCBgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQpXG4gfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCkmJlxuXG5zcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuKFtrZXksY291bnRdLGkpPT5cbmNoZWNrTWF0Y2hlcyhrZXksa2V5UGF0dCxjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkmJlxuYXBwbHlMYWJlbGluZ0Vycm9yKFxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG5bY291bnQsZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrXSxcbiBgYmFnIGNvdW50c1ske2l9XWApJiZcblxuY2hlY2tNYXRjaGVzKGNvdW50LGNvdW50UGF0dCxjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpiYWdPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hNYXBPZkhlbHBlcj1GYXIoJ21hdGNoOm1hcE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bU1hcEVudHJpZXNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weU1hcCcsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5wYXlsb2FkLmtleXMubGVuZ3RoPD1cbm51bU1hcEVudHJpZXNMaW1pdCxcblggYENvcHlNYXAgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiAke3EoXG5udW1NYXBFbnRyaWVzTGltaXQpXG4gfSBlbnRyaWVzOiAke3NwZWNpbWVufWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQua2V5cyxcbmtleVBhdHQsXG5jaGVjayxcbidtYXAga2V5cycpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQudmFsdWVzLFxudmFsdWVQYXR0LFxuY2hlY2ssXG4nbWFwIHZhbHVlcycpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6bWFwT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJuW119IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgcmVzdFNwZWNpbWVuOiBQYXNzYWJsZVtdXG4gKiB9fVxuICovXG5jb25zdCBzcGxpdEFycmF5UGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG5jb25zdCBudW1SZXF1aXJlZD1yZXF1aXJlZFBhdHQubGVuZ3RoO1xuY29uc3QgbnVtT3B0aW9uYWw9b3B0aW9uYWxQYXR0Lmxlbmd0aDtcbmNvbnN0IHJlcXVpcmVkU3BlY2ltZW49c3BlY2ltZW4uc2xpY2UoMCxudW1SZXF1aXJlZCk7XG5jb25zdCBvcHRpb25hbFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKFxubnVtUmVxdWlyZWQsXG5udW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5cbmNvbnN0IHJlc3RTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShudW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5yZXR1cm4gaGFyZGVuKHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufSk7XG4gfTtcblxuLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiBlbGVtZW50cyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm5zIHtQYXR0ZXJuW119IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdEFycmF5UGF0dGVybj0ob3B0aW9uYWxQYXR0LGxlbmd0aCk9PlxuaGFyZGVuKG9wdGlvbmFsUGF0dC5zbGljZSgwLGxlbmd0aCkubWFwKChwYXR0KT0+TU0ub3B0KHBhdHQpKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0QXJyYXlIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9W10scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0QXJyYXlQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0QXJyYXlQYXR0ZXJuKFxub3B0aW9uYWxQYXR0LFxub3B0aW9uYWxTcGVjaW1lbi5sZW5ndGgpO1xuXG5sZXQgYXJnTnVtPTA7XG5yZXR1cm4oXG4ocmVxdWlyZWRTcGVjaW1lbi5sZW5ndGg9PT1yZXF1aXJlZFBhdHQubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBFeHBlY3RlZCBhdCBsZWFzdCAke3EoXG5yZXF1aXJlZFBhdHQubGVuZ3RoKVxuIH0gYXJndW1lbnRzOiAke3NwZWNpbWVufWApKSYmXG5cbnJlcXVpcmVkUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfWApKSYmXG5cbnBhcnRpYWxQYXR0LmV2ZXJ5KChwLGkpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG5jaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSxwLGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9P2ApKSYmXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5QXJyYXknJiYoXG5vcHRpb25hbFBhdHQ9PT11bmRlZmluZWR8fFxuaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkmJlxucGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KT09PSdjb3B5QXJyYXknKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCBhcnJheSwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IGFycmF5LCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbnNwbGl0QXJyYXkpXG4gfWApO1xuXG4gfSxcblxuZ2V0UmFua0NvdmVyOihbXG5fcmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGFzc2FibGU+fSBzcGVjaW1lblxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcmV0dXJucyB7e1xuICogICByZXF1aXJlZFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPixcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIHJlc3RTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT5cbiAqIH19XG4gKi9cbmNvbnN0IHNwbGl0UmVjb3JkUGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG4vKiBOb3QgZnJvemVuISBNdXRhdGVkIGluIHBsYWNlKi9cbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCByZXF1aXJlZEVudHJpZXM9W107XG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3Qgb3B0aW9uYWxFbnRyaWVzPVtdO1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IHJlc3RFbnRyaWVzPVtdO1xuZm9yKGNvbnN0W25hbWUsdmFsdWVdb2YgZW50cmllcyhzcGVjaW1lbikpe1xuaWYoaGFzT3duUHJvcGVydHlPZihyZXF1aXJlZFBhdHQsbmFtZSkpe1xucmVxdWlyZWRFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZSBpZihoYXNPd25Qcm9wZXJ0eU9mKG9wdGlvbmFsUGF0dCxuYW1lKSl7XG5vcHRpb25hbEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1lbHNle1xucmVzdEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtcbnJlcXVpcmVkU3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVxdWlyZWRFbnRyaWVzKSxcbm9wdGlvbmFsU3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMob3B0aW9uYWxFbnRyaWVzKSxcbnJlc3RTcGVjaW1lbjpmcm9tVW5pcXVlRW50cmllcyhyZXN0RW50cmllcyl9KTtcblxuIH07XG5cbi8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gdmFsdWVzIHdoaWNoIGFyZSBgdW5kZWZpbmVkYCBwYXNzIHVuY29uZGl0aW9uYWxseS5cbiAqIFdlIGVuY29kZSB0aGlzIHdpdGggdGhlIGBNLm9yYCBwYXR0ZXJuIHNvIGl0IGFsc28gcHJvZHVjZXMgYSBnb29kXG4gKiBjb21wcmVzc2lvbiBkaXN0aW5ndWlzaGluZyBgdW5kZWZpbmVkYCBmcm9tIGFic2VuY2UuXG4gKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7Q29weVJlY29yZDxQYXR0ZXJuPn0gVGhlIHBhcnRpYWxQYXR0XG4gKi9cbmNvbnN0IGFkYXB0UmVjb3JkUGF0dGVybj0ob3B0aW9uYWxQYXR0LG5hbWVzKT0+XG5mcm9tVW5pcXVlRW50cmllcyhuYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxNTS5vcHQob3B0aW9uYWxQYXR0W25hbWVdKV0pKTtcblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdFJlY29yZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXt9LHJlc3RQYXR0PU1NLmFueSgpXSxcbmNoZWNrKT0+XG57XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5UmVjb3JkJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e3JlcXVpcmVkU3BlY2ltZW4sb3B0aW9uYWxTcGVjaW1lbixyZXN0U3BlY2ltZW59PVxuc3BsaXRSZWNvcmRQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcblxuY29uc3QgcGFydGlhbE5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhvcHRpb25hbFNwZWNpbWVuKTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0UmVjb3JkUGF0dGVybihvcHRpb25hbFBhdHQscGFydGlhbE5hbWVzKTtcbnJldHVybihcbmNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuLHJlcXVpcmVkUGF0dCxjaGVjaykmJlxucGFydGlhbE5hbWVzLmV2ZXJ5KChuYW1lKT0+XG5jaGVja01hdGNoZXMoXG5vcHRpb25hbFNwZWNpbWVuW25hbWVdLFxucGFydGlhbFBhdHRbbmFtZV0sXG5jaGVjayxcbiBgJHtuYW1lfT9gKSkmJlxuXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5UmVjb3JkJyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weVJlY29yZCcpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xucmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSl9KTtcblxuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIE1hdGNoSGVscGVyPn0gKi9cbmNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnPWhhcmRlbih7XG4nbWF0Y2g6YW55JzptYXRjaEFueUhlbHBlcixcbidtYXRjaDphbmQnOm1hdGNoQW5kSGVscGVyLFxuJ21hdGNoOm9yJzptYXRjaE9ySGVscGVyLFxuJ21hdGNoOm5vdCc6bWF0Y2hOb3RIZWxwZXIsXG5cbidtYXRjaDpzY2FsYXInOm1hdGNoU2NhbGFySGVscGVyLFxuJ21hdGNoOmtleSc6bWF0Y2hLZXlIZWxwZXIsXG4nbWF0Y2g6cGF0dGVybic6bWF0Y2hQYXR0ZXJuSGVscGVyLFxuJ21hdGNoOmtpbmQnOm1hdGNoS2luZEhlbHBlcixcbidtYXRjaDpiaWdpbnQnOm1hdGNoQmlnaW50SGVscGVyLFxuJ21hdGNoOm5hdCc6bWF0Y2hOYXRIZWxwZXIsXG4nbWF0Y2g6c3RyaW5nJzptYXRjaFN0cmluZ0hlbHBlcixcbidtYXRjaDpzeW1ib2wnOm1hdGNoU3ltYm9sSGVscGVyLFxuJ21hdGNoOnJlbW90YWJsZSc6bWF0Y2hSZW1vdGFibGVIZWxwZXIsXG5cbidtYXRjaDpsdCc6bWF0Y2hMVEhlbHBlcixcbidtYXRjaDpsdGUnOm1hdGNoTFRFSGVscGVyLFxuJ21hdGNoOmd0ZSc6bWF0Y2hHVEVIZWxwZXIsXG4nbWF0Y2g6Z3QnOm1hdGNoR1RIZWxwZXIsXG5cbidtYXRjaDphcnJheU9mJzptYXRjaEFycmF5T2ZIZWxwZXIsXG4nbWF0Y2g6cmVjb3JkT2YnOm1hdGNoUmVjb3JkT2ZIZWxwZXIsXG4nbWF0Y2g6c2V0T2YnOm1hdGNoU2V0T2ZIZWxwZXIsXG4nbWF0Y2g6YmFnT2YnOm1hdGNoQmFnT2ZIZWxwZXIsXG4nbWF0Y2g6bWFwT2YnOm1hdGNoTWFwT2ZIZWxwZXIsXG4nbWF0Y2g6c3BsaXRBcnJheSc6bWF0Y2hTcGxpdEFycmF5SGVscGVyLFxuJ21hdGNoOnNwbGl0UmVjb3JkJzptYXRjaFNwbGl0UmVjb3JkSGVscGVyfSk7XG5cblxuY29uc3QgbWFrZU1hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuY29uc3QgbWF0Y2hlcj1tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbmFzc2VydFBhdHRlcm4obWF0Y2hlcik7XG5yZXR1cm4gbWF0Y2hlcjtcbiB9O1xuXG5jb25zdCBtYWtlS2luZE1hdGNoZXI9KGtpbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6a2luZCcsa2luZCk7XG5cbmNvbnN0IEFueVNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDphbnknLHVuZGVmaW5lZCk7XG5jb25zdCBTY2FsYXJTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6c2NhbGFyJyx1bmRlZmluZWQpO1xuY29uc3QgS2V5U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmtleScsdW5kZWZpbmVkKTtcbmNvbnN0IFBhdHRlcm5TaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsdW5kZWZpbmVkKTtcbmNvbnN0IEJvb2xlYW5TaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Jvb2xlYW4nKTtcbmNvbnN0IE51bWJlclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG5jb25zdCBCaWdJbnRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiaWdpbnQnLFtdKTtcbmNvbnN0IE5hdFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsW10pO1xuY29uc3QgU3RyaW5nU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c3RyaW5nJyxbXSk7XG5jb25zdCBTeW1ib2xTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzeW1ib2wnLFtdKTtcbmNvbnN0IFJlY29yZFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IEFycmF5U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsW0FueVNoYXBlXSk7XG5jb25zdCBTZXRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsW0FueVNoYXBlXSk7XG5jb25zdCBCYWdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBNYXBTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBSZW1vdGFibGVTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuY29uc3QgRXJyb3JTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG5jb25zdCBQcm9taXNlU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdwcm9taXNlJyk7XG5jb25zdCBVbmRlZmluZWRTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIEZvciB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBheWxvYWQgaXMgdGhlIG9wdGlvbmFsIGxpbWl0cyxcbiAqIHNvIHRoYXQgd2hlbiBpdCBpcyBgdW5kZWZpbmVkYCBpdCBpcyBkcm9wcGVkIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAqIHBheWxvYWRzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGF5bG9hZFxuICovXG5jb25zdCBtYWtlTGltaXRzTWF0Y2hlcj0odGFnLHBheWxvYWQpPT57XG5pZihwYXlsb2FkW3BheWxvYWQubGVuZ3RoLTFdPT09dW5kZWZpbmVkKXtcbnBheWxvYWQ9aGFyZGVuKHBheWxvYWQuc2xpY2UoMCxwYXlsb2FkLmxlbmd0aC0xKSk7XG4gfVxucmV0dXJuIG1ha2VNYXRjaGVyKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG5jb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlcj0obGFiZWw9dW5kZWZpbmVkKT0+XG5sYWJlbD09PXVuZGVmaW5lZD9cblJlbW90YWJsZVNoYXBlOlxubWFrZU1hdGNoZXIoJ21hdGNoOnJlbW90YWJsZScsaGFyZGVuKHtsYWJlbH0pKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSBlbXB0eVxuICogQHBhcmFtIHtUfSBiYXNlXG4gKiBAcGFyYW0ge1R9IFtvcHRpb25hbF1cbiAqIEBwYXJhbSB7VH0gW3Jlc3RdXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBtYWtlU3BsaXRQYXlsb2FkPShcbmVtcHR5LFxuYmFzZSxcbm9wdGlvbmFsPXVuZGVmaW5lZCxcbnJlc3Q9dW5kZWZpbmVkKT0+XG57XG5pZihyZXN0KXtcbnJldHVybltiYXNlLG9wdGlvbmFsfHxlbXB0eSxyZXN0XTtcbiB9XG5pZihvcHRpb25hbCl7XG5yZXR1cm5bYmFzZSxvcHRpb25hbF07XG4gfVxucmV0dXJuW2Jhc2VdO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHsnc3luYyd8J2FzeW5jJ30gY2FsbEtpbmRcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gYXJnR3VhcmRzXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IFtvcHRpb25hbEFyZ0d1YXJkc11cbiAqIEBwYXJhbSB7QXJnR3VhcmR9IFtyZXN0QXJnR3VhcmRdXG4gKiBAcmV0dXJucyB7TWV0aG9kR3VhcmRNYWtlcn1cbiAqL1xuY29uc3QgbWFrZU1ldGhvZEd1YXJkTWFrZXI9KFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcz11bmRlZmluZWQsXG5yZXN0QXJnR3VhcmQ9dW5kZWZpbmVkKT0+XG5cbmhhcmRlbih7XG5vcHRpb25hbDooLi4ub3B0QXJnR3VhcmRzKT0+e1xub3B0aW9uYWxBcmdHdWFyZHM9PT11bmRlZmluZWR8fFxuRmFpbCBgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG5yZXN0QXJnR3VhcmQ9PT11bmRlZmluZWR8fFxuRmFpbCBgb3B0aW9uYWwgYXJnIGd1YXJkcyBtdXN0IGNvbWUgYmVmb3JlIHJlc3QgYXJnYDtcbnJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihjYWxsS2luZCxhcmdHdWFyZHMsb3B0QXJnR3VhcmRzKTtcbiB9LFxucmVzdDoockFyZ0d1YXJkKT0+e1xucmVzdEFyZ0d1YXJkPT09dW5kZWZpbmVkfHxGYWlsIGBDYW4gb25seSBoYXZlIG9uZSByZXN0IGFyZ2A7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxuckFyZ0d1YXJkKTtcblxuIH0sXG5yZXR1cm5zOihyZXR1cm5HdWFyZD1VbmRlZmluZWRTaGFwZSk9PlxuaGFyZGVuKHtcbmtsYXNzOi8qKiBAdHlwZSB7Y29uc3R9ICovJ21ldGhvZEd1YXJkJyxcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yZXN0QXJnR3VhcmQsXG5yZXR1cm5HdWFyZH0pfSk7XG5cblxuXG5jb25zdCBtYWtlQXdhaXRBcmdHdWFyZD0oYXJnR3VhcmQpPT5cbmhhcmRlbih7XG5rbGFzczovKiogQHR5cGUge2NvbnN0fSAqLydhd2FpdEFyZycsXG5hcmdHdWFyZH0pO1xuXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7TWF0Y2hlck5hbWVzcGFjZX0gKi9cbmNvbnN0IE09aGFyZGVuKHtcbmFueTooKT0+QW55U2hhcGUsXG5hbmQ6KC4uLnBhdHRzKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmFuZCcscGF0dHMpLFxub3I6KC4uLnBhdHRzKT0+bWFrZU1hdGNoZXIoJ21hdGNoOm9yJyxwYXR0cyksXG5ub3Q6KHN1YlBhdHQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bm90JyxzdWJQYXR0KSxcblxuc2NhbGFyOigpPT5TY2FsYXJTaGFwZSxcbmtleTooKT0+S2V5U2hhcGUsXG5wYXR0ZXJuOigpPT5QYXR0ZXJuU2hhcGUsXG5raW5kOm1ha2VLaW5kTWF0Y2hlcixcbmJvb2xlYW46KCk9PkJvb2xlYW5TaGFwZSxcbm51bWJlcjooKT0+TnVtYmVyU2hhcGUsXG5iaWdpbnQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmlnaW50JyxbbGltaXRzXSk6QmlnSW50U2hhcGUsXG5uYXQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bmF0JyxbbGltaXRzXSk6TmF0U2hhcGUsXG5zdHJpbmc6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3RyaW5nJyxbbGltaXRzXSk6U3RyaW5nU2hhcGUsXG5zeW1ib2w6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3ltYm9sJyxbbGltaXRzXSk6U3ltYm9sU2hhcGUsXG5yZWNvcmQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLnJlY29yZE9mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOlJlY29yZFNoYXBlLFxuYXJyYXk6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmFycmF5T2YoTS5hbnkoKSxsaW1pdHMpOkFycmF5U2hhcGUsXG5zZXQ6KGxpbWl0cz11bmRlZmluZWQpPT5saW1pdHM/TS5zZXRPZihNLmFueSgpLGxpbWl0cyk6U2V0U2hhcGUsXG5iYWc6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmJhZ09mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOkJhZ1NoYXBlLFxubWFwOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5tYXBPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpNYXBTaGFwZSxcbnJlbW90YWJsZTptYWtlUmVtb3RhYmxlTWF0Y2hlcixcbmVycm9yOigpPT5FcnJvclNoYXBlLFxucHJvbWlzZTooKT0+UHJvbWlzZVNoYXBlLFxudW5kZWZpbmVkOigpPT5VbmRlZmluZWRTaGFwZSxcbm51bGw6KCk9Pm51bGwsXG5cbmx0OihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bHQnLHJpZ2h0T3BlcmFuZCksXG5sdGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpsdGUnLHJpZ2h0T3BlcmFuZCksXG5lcTooa2V5KT0+e1xuYXNzZXJ0S2V5KGtleSk7XG5yZXR1cm4ga2V5PT09dW5kZWZpbmVkP00udW5kZWZpbmVkKCk6a2V5O1xuIH0sXG5uZXE6KGtleSk9Pk0ubm90KE0uZXEoa2V5KSksXG5ndGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpndGUnLHJpZ2h0T3BlcmFuZCksXG5ndDoocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmd0JyxyaWdodE9wZXJhbmQpLFxuXG5yZWNvcmRPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpyZWNvcmRPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuYXJyYXlPZjooc3ViUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDphcnJheU9mJyxbc3ViUGF0dCxsaW1pdHNdKSxcbnNldE9mOihrZXlQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnNldE9mJyxba2V5UGF0dCxsaW1pdHNdKSxcbmJhZ09mOihrZXlQYXR0PU0uYW55KCksY291bnRQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJhZ09mJyxba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzXSksXG5tYXBPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDptYXBPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuc3BsaXRBcnJheTooYmFzZSxvcHRpb25hbD11bmRlZmluZWQscmVzdD11bmRlZmluZWQpPT5cbm1ha2VNYXRjaGVyKFxuJ21hdGNoOnNwbGl0QXJyYXknLFxubWFrZVNwbGl0UGF5bG9hZChbXSxiYXNlLG9wdGlvbmFsLHJlc3QpKSxcblxuc3BsaXRSZWNvcmQ6KGJhc2Usb3B0aW9uYWw9dW5kZWZpbmVkLHJlc3Q9dW5kZWZpbmVkKT0+XG5tYWtlTWF0Y2hlcihcbidtYXRjaDpzcGxpdFJlY29yZCcsXG5tYWtlU3BsaXRQYXlsb2FkKHt9LGJhc2Usb3B0aW9uYWwscmVzdCkpLFxuXG5zcGxpdDooYmFzZSxyZXN0PXVuZGVmaW5lZCk9PntcbmlmKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSk9PT0nY29weUFycmF5Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgaXQgc2hvdWxkIGJlIGFuIGFycmF5Ki9cbnJldHVybiBNLnNwbGl0QXJyYXkoYmFzZSxyZXN0JiZbXSxyZXN0KTtcbiB9ZWxzZXtcbnJldHVybiBNLnNwbGl0UmVjb3JkKGJhc2UscmVzdCYme30scmVzdCk7XG4gfVxuIH0sXG5wYXJ0aWFsOihiYXNlLHJlc3Q9dW5kZWZpbmVkKT0+e1xuaWYocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xucmV0dXJuIE0uc3BsaXRBcnJheShbXSxiYXNlLHJlc3QpO1xuIH1lbHNle1xucmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sYmFzZSxyZXN0KTtcbiB9XG4gfSxcblxuZXJlZjoodCk9Pk0ub3IodCxNLnByb21pc2UoKSksXG5vcHQ6KHQpPT5NLm9yKE0udW5kZWZpbmVkKCksdCksXG5cbmludGVyZmFjZTooaW50ZXJmYWNlTmFtZSxtZXRob2RHdWFyZHMse3Nsb3BweT1mYWxzZX09e30pPT57XG5mb3IoY29uc3RbXyxtZXRob2RHdWFyZF1vZiBlbnRyaWVzKG1ldGhvZEd1YXJkcykpe1xubWV0aG9kR3VhcmQua2xhc3M9PT0nbWV0aG9kR3VhcmQnfHxcbkZhaWwgYHVucmVjb2duaXplIG1ldGhvZCBndWFyZCAke21ldGhvZEd1YXJkfWA7XG4gfVxucmV0dXJuIGhhcmRlbih7XG5rbGFzczovKiogQHR5cGUge2NvbnN0fSAqLydJbnRlcmZhY2UnLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkcyxcbnNsb3BweX0pO1xuXG4gfSxcbmNhbGw6KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdzeW5jJyxhcmdHdWFyZHMpLFxuY2FsbFdoZW46KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdhc3luYycsYXJnR3VhcmRzKSxcblxuYXdhaXQ6KGFyZ0d1YXJkKT0+bWFrZUF3YWl0QXJnR3VhcmQoYXJnR3VhcmQpfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxubXVzdE1hdGNoLFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19KTtcblxuIH07XG5cbi8qIE9ubHkgaW5jbHVkZSB0aG9zZSB3aG9zZSBtZWFuaW5nIGlzIGluZGVwZW5kZW50IG9mIGFuIGltcHV0ZWQgc29ydCBvcmRlciovXG4vKiBvZiByZW1vdGFibGVzLCBvciBvZiBlbmNvZGluZyBvZiBwYXNzYWJsZSBhcyBzb3J0YWJsZSBzdHJpbmdzLiBUaHVzLCovXG4vKiBnZXRSYW5rQ292ZXIgaXMgb21pdHRlZC4gVG8gZ2V0IG9uZSwgeW91J2QgbmVlZCB0byBpbnN0YW50aWF0ZSovXG4vKiBgbWFrZVBhdHRlcm5LaXQoKWAgeW91cnNlbGYuIFNpbmNlIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZXh0ZXJuYWwqL1xuLyogdXNlcyBvZiBgZ2V0UmFua0NvdmVyYCwgZm9yIGNsYXJpdHkgZHVyaW5nIGRldmVsb3BtZW50LCBgbWFrZVBhdHRlcm5LaXRgKi9cbi8qIGlzIG5vdCBjdXJyZW50bHkgZXhwb3J0ZWQuKi9cbmNvbnN0ICAgICAgIHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5tdXN0TWF0Y2gsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuZ2V0UmFua0NvdmVyLFxuTX09XG5tYWtlUGF0dGVybktpdCgpOyRo4oCNX29uY2UuY2hlY2tNYXRjaGVzKGNoZWNrTWF0Y2hlcyk7JGjigI1fb25jZS5tYXRjaGVzKG1hdGNoZXMpOyRo4oCNX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7JGjigI1fb25jZS5hc3NlcnRQYXR0ZXJuKGFzc2VydFBhdHRlcm4pOyRo4oCNX29uY2UuaXNQYXR0ZXJuKGlzUGF0dGVybik7JGjigI1fb25jZS5nZXRSYW5rQ292ZXIoZ2V0UmFua0NvdmVyKTskaOKAjV9vbmNlLk0oTSk7XG5cbk1NPU07XG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlUYWdnZWR9IENvcHlUYWdnZWQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5SYW5rQ29tcGFyZX0gUmFua0NvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlJhbmtDb3Zlcn0gUmFua0NvdmVyICovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5BcmdHdWFyZH0gQXJnR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5NZXRob2RHdWFyZE1ha2VyfSBNZXRob2RHdWFyZE1ha2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuTWF0Y2hlck5hbWVzcGFjZX0gTWF0Y2hlck5hbWVzcGFjZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleX0gS2V5ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuUGF0dGVybn0gUGF0dGVybiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLlBhdHRlcm5LaXR9IFBhdHRlcm5LaXQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5DaGVja1BhdHRlcm59IENoZWNrUGF0dGVybiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkxpbWl0c30gTGltaXRzICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQWxsTGltaXRzfSBBbGxMaW1pdHMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5HZXRSYW5rQ292ZXJ9IEdldFJhbmtDb3ZlciAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyXG4gKiBUaGlzIGZhY3RvcnMgb3V0IG9ubHkgdGhlIHBhcnRzIHNwZWNpZmljIHRvIGVhY2gga2luZCBvZiBNYXRjaGVyLiBJdCBpc1xuICogZW5jYXBzdWxhdGVkLCBhbmQgaXRzIG1ldGhvZHMgY2FuIG1ha2UgdGhlIHN0YXRlZCB1bmNoZWNrZXIgYXNzdW1wdGlvbnNcbiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF5bG9hZDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlclxuICogKSA9PiBib29sZWFufSBjaGVja0lzV2VsbEZvcm1lZFxuICogUmVwb3J0cyB3aGV0aGVyIGBhbGxlZ2VkUGF5bG9hZGAgaXMgdmFsaWQgYXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkXG4gKiB3aG9zZSB0YWcgY29ycmVzcG9uZHMgd2l0aCB0aGlzIE1hdGNoSGVscGVyJ3MgTWF0Y2hlcnMuXG4gKlxuICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgbWF0Y2hlclBheWxvYWQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiApID0+IGJvb2xlYW59IGNoZWNrTWF0Y2hlc1xuICogQXNzdW1pbmcgdmFsaWRpdHkgb2YgYG1hdGNoZXJQYXlsb2FkYCBhcyB0aGUgcGF5bG9hZCBvZiBhIE1hdGNoZXIgY29ycmVzcG9uZGluZ1xuICogd2l0aCB0aGlzIE1hdGNoSGVscGVyLCByZXBvcnRzIHdoZXRoZXIgYHNwZWNpbWVuYCBpcyBtYXRjaGVkIGJ5IHRoYXQgTWF0Y2hlci5cbiAqXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4uL3R5cGVzJykuR2V0UmFua0NvdmVyfSBnZXRSYW5rQ292ZXJcbiAqIEFzc3VtZXMgdGhpcyBpcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZ1xuICogbWF0Y2hUYWcuIFJldHVybiBhIFJhbmtDb3ZlciB0byBib3VuZCBmcm9tIGJlbG93IGFuZCBhYm92ZSxcbiAqIGluIHJhbmsgb3JkZXIsIGFsbCBwb3NzaWJsZSBQYXNzYWJsZXMgdGhhdCB3b3VsZCBtYXRjaCB0aGlzIE1hdGNoZXIuXG4gKiBUaGUgbGVmdCBlbGVtZW50IG11c3QgYmUgYmVmb3JlIG9yIHRoZSBzYW1lIHJhbmsgYXMgYW55IHBvc3NpYmxlXG4gKiBtYXRjaGluZyBzcGVjaW1lbi4gVGhlIHJpZ2h0IGVsZW1lbnQgbXVzdCBiZSBhZnRlciBvciB0aGUgc2FtZVxuICogcmFuayBhcyBhbnkgcG9zc2libGUgbWF0Y2hpbmcgc3BlY2ltZW4uXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0TGltaXRzIjpbImRlZmF1bHRMaW1pdHMiXSwiY2hlY2tNYXRjaGVzIjpbImNoZWNrTWF0Y2hlcyJdLCJtYXRjaGVzIjpbIm1hdGNoZXMiXSwibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiJdLCJnZXRSYW5rQ292ZXIiOlsiZ2V0UmFua0NvdmVyIl0sIk0iOlsiTSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACYGTuzNAEAADQBAAAiAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACWHvfH6hoAAOoaAAAiAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4zL3NyYy91dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJhcHBseUxhYmVsaW5nRXJyb3IiLCJmcm9tVW5pcXVlRW50cmllcyIsImlkZW50Q2hlY2tlciIsImxpc3REaWZmZXJlbmNlIiwib2JqZWN0TWFwIiwidGhyb3dMYWJlbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsaXNQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2Zyb21FbnRyaWVzLGVudHJpZXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyogVE9ETyBtaWdyYXRlIHRvIHByb3BlciBob21lKi9cbi8qIEZyb20gdGhlIGBhZ29yaWMtc2RrYCBtb25vcmVwby4gTW92ZWQgaGVyZSB0ZW1wb3JhcmlseSBiZWNhdXNlIHRoZSBwYXR0ZXJuKi9cbi8qIGNvZGUgaXMgbWlncmF0ZWQgZnJvbSBgQGFnb3JpYy9zdG9yZWAgdG8gYEBlbmRvL3BhdHRlcm5zYCwgYW5kIGRlcGVuZHMgb24qL1xuLyogdGhlIGZ1bmN0aW9uYWxpdHkgaW4gdGhpcyBmaWxlLCB3aGljaCBpcyBvdGhlcndpc2UgYXZhaWxhYmxlIG9ubHkqL1xuLyogd2l0aGluIHRoZSBgYWdvcmljLXNka2AgbW9ub3JlcG8uKi9cblxuLyoqXG4gKiBUT0RPIGFzIGxvbmcgYXMgYEBlbmRvL3Bhc3Mtc3R5bGVgIHJlbWFpbnMgdGhlIHByb3BlciBob21lIG9mIHRoZVxuICogYENoZWNrZXJgIHR5cGUsIGl0IHByb2JhYmx5IG1ha2VzIG1vc3Qgc2Vuc2UgdG8gbW92ZSBgaWRlbnRDaGVja2VyYFxuICogaW50byBgQGVuZG8vcGFzcy1zdHlsZWAgYXMgd2VsbC5cbiAqXG4gKiBJbiB0aGUgYGFzc2VydEZvb2AvYGlzRm9vYC9gY2hlY2tGb29gIHBhdHRlcm4sIGBjaGVja0Zvb2AgaGFzIGEgYGNoZWNrYFxuICogcGFyYW1ldGVyIG9mIHR5cGUgYENoZWNrZXJgLiBgYXNzZXJ0Rm9vYCBjYWxscyBgY2hlY2tGb29gIHBhc3Nlc1xuICogYGFzc2VydENoZWNrZXJgIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaXNGb29gIHBhc3NlcyBgaWRlbnRDaGVja2VyYFxuICogYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpZGVudENoZWNrZXJgIGFjdHMgcHJlY2lzZWx5IGxpa2UgYW5cbiAqIGlkZW50aXR5IGZ1bmN0aW9uLCBidXQgaXMgdHlwZWQgYXMgYSBgQ2hlY2tlcmAgdG8gaW5kaWNhdGUgaXRzXG4gKiBpbnRlbmRlZCB1c2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpZGVudENoZWNrZXI9KGNvbmQsX2RldGFpbHMpPT5jb25kOyRo4oCNX29uY2UuaWRlbnRDaGVja2VyKGlkZW50Q2hlY2tlcik7XG5oYXJkZW4oaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBUaHJvd3MgaWYgbXVsdGlwbGUgZW50cmllcyB1c2UgdGhlIHNhbWUgcHJvcGVydHkgbmFtZS4gT3RoZXJ3aXNlIGFjdHNcbiAqIGxpa2UgYE9iamVjdC5mcm9tRW50cmllc2AgYnV0IGhhcmRlbnMgdGhlIHJlc3VsdC5cbiAqIFVzZSBpdCB0byBwcm90ZWN0IGZyb20gcHJvcGVydHkgbmFtZXMgY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxWXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7W2s6IEtdOiBWfX1cbiAqL1xuY29uc3QgICAgICAgIGZyb21VbmlxdWVFbnRyaWVzPShhbGxFbnRyaWVzKT0+e1xuY29uc3QgZW50cmllc0FycmF5PVsuLi5hbGxFbnRyaWVzXTtcbmNvbnN0IHJlc3VsdD1oYXJkZW4oZnJvbUVudHJpZXMoZW50cmllc0FycmF5KSk7XG5pZihvd25LZXlzKHJlc3VsdCkubGVuZ3RoPT09ZW50cmllc0FycmF5Lmxlbmd0aCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNvbnN0IG5hbWVzPW5ldyBTZXQoKTtcbmZvcihjb25zdFtuYW1lLF9db2YgZW50cmllc0FycmF5KXtcbmlmKG5hbWVzLmhhcyhuYW1lKSl7XG5GYWlsIGBjb2xsaXNpb24gb24gcHJvcGVydHkgbmFtZSAke3EobmFtZSl9OiAke2VudHJpZXNBcnJheX1gO1xuIH1cbm5hbWVzLmFkZChuYW1lKTtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZmFpbGVkIHRvIGNyZWF0ZSBvYmplY3QgZnJvbSB1bmlxdWUgZW50cmllc2A7XG4gfTskaOKAjV9vbmNlLmZyb21VbmlxdWVFbnRyaWVzKGZyb21VbmlxdWVFbnRyaWVzKTtcbmhhcmRlbihmcm9tVW5pcXVlRW50cmllcyk7XG5cbi8qKlxuICogQnkgYW5hbG9neSB3aXRoIGhvdyBgQXJyYXkucHJvdG90eXBlLm1hcGAgd2lsbCBtYXAgdGhlIGVsZW1lbnRzIG9mXG4gKiBhbiBhcnJheSB0byB0cmFuc2Zvcm1lZCBlbGVtZW50cyBvZiBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSxcbiAqIGBvYmplY3RNYXBgIHdpbGwgZG8gbGlrZXdpc2UgZm9yIHRoZSBzdHJpbmctbmFtZWQgb3duIGVudW1lcmFibGVcbiAqIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LlxuICpcbiAqIFR5cGljYWwgdXNhZ2UgYXBwbGllcyBgb2JqZWN0TWFwYCB0byBhIENvcHlSZWNvcmQsIGkuZS4sXG4gKiBhbiBvYmplY3QgZm9yIHdoaWNoIGBwYXNzU3R5bGVPZihvcmlnaW5hbCkgPT09ICdjb3B5UmVjb3JkJ2AuIEZvciB0aGVzZSxcbiAqIG5vbmUgb2YgdGhlIGZvbGxvd2luZyBlZGdlIGNhc2VzIGFyaXNlLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBDb3B5UmVjb3JkXG4gKiB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydHkgbmFtZXMsIHdob3NlIHZhbHVlcyBhcmUgdGhlIG1hcHBlZCBmb3JtIG9mXG4gKiB0aGUgb3JpZ2luYWwncyB2YWx1ZXMuXG4gKlxuICogV2hlbiB0aGUgb3JpZ2luYWwgaXMgbm90IGEgQ29weVJlY29yZCwgc29tZSBlZGdlIGNhc2VzIHRvIGJlIGF3YXJlIG9mXG4gKiAgICAqIE5vIG1hdHRlciBob3cgbXV0YWJsZSB0aGUgb3JpZ2luYWwgb2JqZWN0LCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzXG4gKiAgICAgIGhhcmRlbmVkLlxuICogICAgKiBPbmx5IHRoZSBzdHJpbmctbmFtZWQgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZiB0aGUgb3JpZ2luYWxcbiAqICAgICAgYXJlIG1hcHBlZC4gQWxsIG90aGVyIHByb3BlcnRpZXMgYXJlIGlnbm9yZWQuXG4gKiAgICAqIElmIGFueSBvZiB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyB3ZXJlIGFjY2Vzc29ycywgYE9iamVjdC5lbnRyaWVzYFxuICogICAgICB3aWxsIGNhdXNlIGl0cyBgZ2V0dGVyYCB0byBiZSBjYWxsZWQgYW5kIHdpbGwgdXNlIHRoZSByZXN1bHRpbmdcbiAqICAgICAgdmFsdWUuXG4gKiAgICAqIE5vIG1hdHRlciB3aGV0aGVyIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSB3YXMgYW4gYWNjZXNzb3IsIHdyaXRhYmxlLFxuICogICAgICBvciBjb25maWd1cmFibGUsIGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqICAgICAgbm9uLXdyaXRhYmxlLCBub24tY29uZmlndXJhYmxlLCBkYXRhIHByb3BlcnRpZXMuXG4gKiAgICAqIE5vIG1hdHRlciB3aGF0IHRoZSBvcmlnaW5hbCBvYmplY3QgbWF5IGhhdmUgaW5oZXJpdGVkIGZyb20sIGFuZFxuICogICAgICBubyBtYXR0ZXIgd2hldGhlciBpdCB3YXMgYSBzcGVjaWFsIGtpbmQgb2Ygb2JqZWN0IHN1Y2ggYXMgYW4gYXJyYXksXG4gKiAgICAgIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgYSBwbGFpbiBvYmplY3QgaW5oZXJpdGluZyBkaXJlY3RseVxuICogICAgICBmcm9tIGBPYmplY3QucHJvdG90eXBlYCBhbmQgd2hvc2Ugc3RhdGUgaXMgb25seSB0aGVzZSBuZXcgbWFwcGVkXG4gKiAgICAgIG93biBwcm9wZXJ0aWVzLlxuICpcbiAqIFdpdGggdGhlc2UgZGlmZmVyZW5jZXMsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIG9iamVjdCB3YXMgbm90IGEgQ29weVJlY29yZCxcbiAqIGlmIGFsbCB0aGUgbWFwcGVkIHZhbHVlcyBhcmUgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiBhIENvcHlSZWNvcmQuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBPXG4gKiBAcGFyYW0ge099IG9yaWdpbmFsXG4gKiBAdGVtcGxhdGUgUiBtYXAgcmVzdWx0XG4gKiBAcGFyYW0geyh2YWx1ZTogT1trZXlvZiBPXSwga2V5OiBrZXlvZiBPKSA9PiBSfSBtYXBGblxuICogQHJldHVybnMge3sgW1AgaW4ga2V5b2YgT106IFJ9fVxuICovXG5jb25zdCAgICAgICAgb2JqZWN0TWFwPShvcmlnaW5hbCxtYXBGbik9PntcbmNvbnN0IGVudHM9ZW50cmllcyhvcmlnaW5hbCk7XG5jb25zdCBtYXBFbnRzPWVudHMubWFwKChbayx2XSk9PltrLG1hcEZuKHYsayldKTtcbnJldHVybiBoYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cykpO1xuIH07JGjigI1fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IGxlZnROYW1lc1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSByaWdodE5hbWVzXG4gKi9cbmNvbnN0ICAgICAgICBsaXN0RGlmZmVyZW5jZT0obGVmdE5hbWVzLHJpZ2h0TmFtZXMpPT57XG5jb25zdCByaWdodFNldD1uZXcgU2V0KHJpZ2h0TmFtZXMpO1xucmV0dXJuIGxlZnROYW1lcy5maWx0ZXIoKG5hbWUpPT4hcmlnaHRTZXQuaGFzKG5hbWUpKTtcbiB9OyRo4oCNX29uY2UubGlzdERpZmZlcmVuY2UobGlzdERpZmZlcmVuY2UpO1xuaGFyZGVuKGxpc3REaWZmZXJlbmNlKTtcblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBpbm5lckVyclxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBsYWJlbFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvclxuICogQHJldHVybnMge25ldmVyfVxuICovXG5cbi8qIEV2YWRlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTQ1MCB1c2luZyBibGFuayBsaW5lKi9cbmNvbnN0ICAgICAgICB0aHJvd0xhYmVsZWQ9KGlubmVyRXJyLGxhYmVsLEVycm9yQ29uc3RydWN0b3I9dW5kZWZpbmVkKT0+e1xuaWYodHlwZW9mIGxhYmVsPT09J251bWJlcicpe1xubGFiZWw9IGBbJHtsYWJlbH1dYDtcbiB9XG5jb25zdCBvdXRlckVycj1hc3NlcnQuZXJyb3IoXG4gYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YCxcbkVycm9yQ29uc3RydWN0b3IpO1xuXG5hc3NlcnQubm90ZShvdXRlckVycixYIGBDYXVzZWQgYnkgJHtpbm5lckVycn1gKTtcbnRocm93IG91dGVyRXJyO1xuIH07JGjigI1fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBLFJcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gUn0gZnVuY1xuICogQHBhcmFtIHtBW119IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge1J9XG4gKi9cbmNvbnN0ICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3I9KGZ1bmMsYXJncyxsYWJlbD11bmRlZmluZWQpPT57XG5pZihsYWJlbD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYyguLi5hcmdzKTtcbiB9XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG50aHJvd0xhYmVsZWQoZXJyLGxhYmVsKTtcbiB9XG5pZihpc1Byb21pc2UocmVzdWx0KSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIElmIHJlc3VsdCBpcyBhIHJlamVjdGVkIHByb21pc2UsIHRoaXMgd2lsbCovXG4vKiByZXR1cm4gYSBwcm9taXNlIHdpdGggYSBkaWZmZXJlbnQgcmVqZWN0aW9uIHJlYXNvbi4gQnV0IHRoaXMqL1xuLyogY29uZnVzZXMgVHlwZVNjcmlwdCBiZWNhdXNlIGl0IHR5cGVzIHRoYXQgY2FzZSBhcyBgUHJvbWlzZTxuZXZlcj5gKi9cbi8qIHdoaWNoIGlzIGNvb2wgZm9yIGEgcHJvbWlzZSB0aGF0IHdpbGwgbmV2ZXIgZnVsZmxsLiovXG4vKiBCdXQgVHlwZVNjcmlwdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGlzIHdpbGwgb25seSBoYXBwZW4qL1xuLyogd2hlbiBgcmVzdWx0YCB3YXMgYSByZWplY3RlZCBwcm9taXNlLiBJbiBvbmx5IHRoaXMgY2FzZSBgUmAqL1xuLyogc2hvdWxkIGFscmVhZHkgYWxsb3cgYFByb21pc2U8bmV2ZXI+YCBhcyBhIHN1YnR5cGUuKi9cbnJldHVybiBFLndoZW4ocmVzdWx0LHVuZGVmaW5lZCwocmVhc29uKT0+dGhyb3dMYWJlbGVkKHJlYXNvbixsYWJlbCkpO1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfTskaOKAjV9vbmNlLmFwcGx5TGFiZWxpbmdFcnJvcihhcHBseUxhYmVsaW5nRXJyb3IpO1xuaGFyZGVuKGFwcGx5TGFiZWxpbmdFcnJvcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdLCJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl0sImxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl0sInRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXSwiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAABwljLcAkAAHAJAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ny9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsIFskaOKAjV9hID0+IChtZW1vUmFjZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VQcm9taXNlS2l0XCJ9KTskaOKAjV9vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCAnbmFtZScsIHt2YWx1ZTogXCJyYWNlUHJvbWlzZXNcIn0pOyRo4oCNX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSAqL1xuY29uc3QgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZT1nbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlfHxQcm9taXNlO1xuXG4vKipcbiAqIG1ha2VQcm9taXNlS2l0KCkgYnVpbGRzIGEgUHJvbWlzZSBvYmplY3QsIGFuZCByZXR1cm5zIGEgcmVjb3JkXG4gKiBjb250YWluaW5nIHRoZSBwcm9taXNlIGl0c2VsZiwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBmYWNldHMgZm9yIHJlc29sdmluZ1xuICogYW5kIHJlamVjdGluZyBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1hpbXBvcnQoJy4vc3JjL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPn1cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VQcm9taXNlS2l0KCl7XG5jb25zdHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn09bWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbmNvbnN0IHByb21pc2U9bmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtwcm9taXNlLHJlc29sdmUscmVqZWN0fSk7XG4gfVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLyogTkI6IEFub3RoZXIgaW1wbGVtZW50YXRpb24gZm9yIFByb21pc2UucmFjZSB3b3VsZCBiZSB0byB1c2UgdGhlIHJlbGVhc2luZyBleGVjdXRvciwqL1xuLyogSG93ZXZlciB3aGlsZSBpdCB3b3VsZCBubyBsb25nZXIgbGVhayB0aGUgcmFjZWQgcHJvbWlzZSBvYmplY3RzIHRoZW1zZWx2ZXMsIGl0IHdvdWxkKi9cbi8qIHN0aWxsIGxlYWsgcmVhY3Rpb25zIG9uIHRoZSBub24tcmVzb2x2ZWQgcHJvbWlzZXMgY29udGVuZGluZyBmb3IgdGhlIHJhY2UuKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5mdW5jdGlvbiAgICAgICAgcmFjZVByb21pc2VzKHZhbHVlcyl7XG5yZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSx2YWx1ZXMpKTtcbiB9XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZUtpdCI6WyJtYWtlUHJvbWlzZUtpdCJdLCJyYWNlUHJvbWlzZXMiOlsicmFjZVByb21pc2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIh9gazfAgAA3wIAACsAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3L3NyYy9pcy1wcm9taXNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpc1Byb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCAnbmFtZScsIHt2YWx1ZTogXCJpc1Byb21pc2VcIn0pOyRo4oCNX29uY2UuaXNQcm9taXNlKGlzUHJvbWlzZSk7ICAgLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG1heWJlUHJvbWlzZSBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge21heWJlUHJvbWlzZSBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5mdW5jdGlvbiAgICAgICAgaXNQcm9taXNlKG1heWJlUHJvbWlzZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSk9PT1tYXliZVByb21pc2U7XG4gfVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcm9taXNlIjpbImlzUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdp03rvhIAAL4SAAAqAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ny9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG5jb25zdCBpc09iamVjdD0odmFsdWUpPT5PYmplY3QodmFsdWUpPT09dmFsdWU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZmVycmVkXG4gKiBAcHJvcGVydHkgeyh2YWx1ZT86IFhpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVSZWY8VD4gKSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcHJvcGVydHkgeyhlcnI/OiBhbnkgKSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgbmV2ZXJcbiAqICB8IHtzZXR0bGVkOiBmYWxzZSwgZGVmZXJyZWRzOiBTZXQ8RGVmZXJyZWQ+fVxuICogIHwge3NldHRsZWQ6IHRydWUsIGRlZmVycmVkcz86IHVuZGVmaW5lZH1cbiAqIH0gUHJvbWlzZU1lbW9SZWNvcmRcbiAqL1xuXG4vKiBLZXlzIGFyZSB0aGUgdmFsdWVzIHBhc3NlZCB0byByYWNlLCB2YWx1ZXMgYXJlIGEgcmVjb3JkIG9mIGRhdGEgY29udGFpbmluZyBhKi9cbi8qIHNldCBvZiBkZWZlcnJlZHMgYW5kIHdoZXRoZXIgdGhlIHZhbHVlIGhhcyBzZXR0bGVkLiovXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBQcm9taXNlTWVtb1JlY29yZD59ICovXG5jb25zdCBrbm93blByb21pc2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlTWVtb1JlY29yZCB8IHVuZGVmaW5lZH0gcmVjb3JkXG4gKiBAcmV0dXJucyB7U2V0PERlZmVycmVkPn1cbiAqL1xuY29uc3QgbWFya1NldHRsZWQ9KHJlY29yZCk9PntcbmlmKCFyZWNvcmR8fHJlY29yZC5zZXR0bGVkKXtcbnJldHVybiBuZXcgU2V0KCk7XG4gfVxuXG5jb25zdHtkZWZlcnJlZHN9PXJlY29yZDtcbk9iamVjdC5hc3NpZ24ocmVjb3JkLHtcbmRlZmVycmVkczp1bmRlZmluZWQsXG5zZXR0bGVkOnRydWV9KTtcblxuT2JqZWN0LmZyZWV6ZShyZWNvcmQpO1xucmV0dXJuIGRlZmVycmVkcztcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlTWVtb1JlY29yZH1cbiAqL1xuY29uc3QgZ2V0TWVtb1JlY29yZD0odmFsdWUpPT57XG5pZighaXNPYmplY3QodmFsdWUpKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgYSBwcmltaXRpdmUsIGF0dGVtcHRpbmcgdG8gdXNlIGl0IGFzIGEga2V5IGluIHRoZSovXG4vKiB3ZWFrbWFwIHdvdWxkIHRocm93IGFuIGVycm9yLiBMdWNraWx5LCBpdCBpcyBzYWZlIHRvIGNhbGwqL1xuLyogYFByb21pc2UucmVzb2x2ZShjb250ZW5kZXIpLnRoZW5gIG9uIGEgcHJpbWl0aXZlIHZhbHVlIG11bHRpcGxlIHRpbWVzKi9cbi8qIGJlY2F1c2UgdGhlIHByb21pc2UgZnVsZmlsbHMgaW1tZWRpYXRlbHkuIFNvIHdlIGZha2UgYSBzZXR0bGVkIHJlY29yZC4qL1xucmV0dXJuIGhhcmRlbih7c2V0dGxlZDp0cnVlfSk7XG4gfVxuXG5sZXQgcmVjb3JkPWtub3duUHJvbWlzZXMuZ2V0KHZhbHVlKTtcblxuaWYoIXJlY29yZCl7XG5yZWNvcmQ9e2RlZmVycmVkczpuZXcgU2V0KCksc2V0dGxlZDpmYWxzZX07XG5rbm93blByb21pc2VzLnNldCh2YWx1ZSxyZWNvcmQpO1xuLyogVGhpcyBjYWxsIHRvIGB0aGVuYCBoYXBwZW5zIG9uY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgdmFsdWUuKi9cblByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbih2YWwpPT57XG5mb3IoY29uc3R7cmVzb2x2ZX1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlc29sdmUodmFsKTtcbiB9XG4gfSxcbihlcnIpPT57XG5mb3IoY29uc3R7cmVqZWN0fW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVqZWN0KGVycik7XG4gfVxuIH0pO1xuXG4gfVxucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdHtyYWNlfT17XG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQcm9taXNlQ29uc3RydWN0b3J9IFtQPVByb21pc2VDb25zdHJ1Y3Rvcl1cbiAqIEB0aGlzIHtQfVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbnJhY2UodmFsdWVzKXtcbmxldCBkZWZlcnJlZDtcbi8qKiBAdHlwZSB7VFtdfSAqL1xuY29uc3QgY2FjaGVkVmFsdWVzPVtdO1xuY29uc3QgQz10aGlzO1xuY29uc3QgcmVzdWx0PW5ldyBDKChyZXNvbHZlLHJlamVjdCk9PntcbmRlZmVycmVkPXtyZXNvbHZlLHJlamVjdH07XG5mb3IoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbmNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbmNvbnN0e3NldHRsZWQsZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKHNldHRsZWQpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBzZXR0bGVkIChpbmNsdWRpbmcgcHJpbWl0aXZlcyksIGl0IGlzIHNhZmUqL1xuLyogdG8gY2FsbCBgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuYCBvbiBpdC4qL1xuQy5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUscmVqZWN0KTtcbiB9ZWxzZXtcbmRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG5cbi8qIFRoZSBmaW5hbGx5IGNhbGxiYWNrIGV4ZWN1dGVzIHdoZW4gYW55IHZhbHVlIHNldHRsZXMsIHByZXZlbnRpbmcgYW55IG9mKi9cbi8qIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBmcm9tIHJldGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb2x2ZWQgdmFsdWUuKi9cbnJldHVybiByZXN1bHQuZmluYWxseSgoKT0+e1xuZm9yKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcyl7XG5jb25zdHtkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoZGVmZXJyZWRzKXtcbmRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG4gfX07JGjigI1fb25jZS5yYWNlKHJhY2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA00Ow7mkHAABpBwAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTcvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2FsbGJhY2sgUHJvbWlzZUV4ZWN1dG9yIFRoZSBwcm9taXNlIGV4ZWN1dG9yXG4gKiBAcGFyYW0geyh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpIGJ1aWxkcyByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgd2hpY2ggZHJvcCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIGdhdGhlcmVkIGZyb20gYW4gZXhlY3V0b3IgdG8gYmUgdXNlZCB3aXRoIGFcbiAqIHByb21pc2UgY29uc3RydWN0b3IuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQaWNrPFhpbXBvcnQoJy4vdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+LCAncmVzb2x2ZScgfCAncmVqZWN0Jz4gJiB7IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8VD59fVxuICovXG5jb25zdCAgICAgICAgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0PSgpPT57XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHZhbHVlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZXNvbHZlO1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKChyZWFzb246IHVua25vd24pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVqZWN0O1xuXG4vKiogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbmNvbnN0IHJlc29sdmU9KHZhbHVlKT0+e1xuaWYoaW50ZXJuYWxSZXNvbHZlKXtcbmludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09bnVsbCk7XG4gfVxuIH07XG5cbi8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuY29uc3QgcmVqZWN0PShyZWFzb24pPT57XG5pZihpbnRlcm5hbFJlamVjdCl7XG5pbnRlcm5hbFJlamVjdChyZWFzb24pO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVqZWN0PT09bnVsbCk7XG4gfVxuIH07XG5cbmNvbnN0IGV4ZWN1dG9yPShyZXMscmVqKT0+e1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PXVuZGVmaW5lZCYmaW50ZXJuYWxSZWplY3Q9PT11bmRlZmluZWQpO1xuaW50ZXJuYWxSZXNvbHZlPXJlcztcbmludGVybmFsUmVqZWN0PXJlajtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTcvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAyuJeT0GAAA9BgAAB0AAABAZW5kby9zdHJlYW0tdjAuMy4yNi9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJtYWtlUGlwZSIsIm1ha2VRdWV1ZSIsIm1ha2VTdHJlYW0iLCJtYXBSZWFkZXIiLCJtYXBXcml0ZXIiLCJwcmltZSIsInB1bXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxtYWtlUHJvbWlzZUtpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlc29sdmUodmFsdWU/OiBUIHwgUHJvbWlzZTxUPik6IHZvaWQsXG4gKiAgIHJlamVjdChlcnJvcjogRXJyb3IpOiB2b2lkLFxuICogICBwcm9taXNlOiBQcm9taXNlPFQ+XG4gKiB9fSBQcm9taXNlS2l0XG4gKi9cblxuLyogVHlwZVNjcmlwdCBSZWFkT25seSBzZW1hbnRpY3MgYXJlIG5vdCBzdWZmaWNpZW50bHkgZXhwcmVzc2l2ZSB0byBkaXN0aW5ndWlzaCovXG4vKiBhIHZhbHVlIG9uZSBwcm9taXNlcyBub3QgdG8gYWx0ZXIgZnJvbSBhIHZhbHVlIG9uZSBtdXN0IG5vdCBhbHRlciwqL1xuLyogbWFraW5nIGl0IHVzZWxlc3MuKi9cbmNvbnN0IGZyZWV6ZT0vKiogQHR5cGUgezxUPih2OiBUIHwgUmVhZG9ubHk8VD4pID0+IFR9ICovT2JqZWN0LmZyZWV6ZTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Bc3luY1F1ZXVlPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVF1ZXVlPSgpPT57XG5sZXR7cHJvbWlzZTp0YWlsUHJvbWlzZSxyZXNvbHZlOnRhaWxSZXNvbHZlfT1tYWtlUHJvbWlzZUtpdCgpO1xucmV0dXJue1xucHV0KHZhbHVlKXtcbmNvbnN0e3Jlc29sdmUscHJvbWlzZX09bWFrZVByb21pc2VLaXQoKTtcbnRhaWxSZXNvbHZlKGZyZWV6ZSh7dmFsdWUscHJvbWlzZX0pKTtcbnRhaWxSZXNvbHZlPXJlc29sdmU7XG4gfSxcbmdldCgpe1xuY29uc3QgcHJvbWlzZT10YWlsUHJvbWlzZS50aGVuKChuZXh0KT0+bmV4dC52YWx1ZSk7XG50YWlsUHJvbWlzZT10YWlsUHJvbWlzZS50aGVuKChuZXh0KT0+bmV4dC5wcm9taXNlKTtcbnJldHVybiBoYXJkZW4ocHJvbWlzZSk7XG4gfX07XG5cbiB9OyRo4oCNX29uY2UubWFrZVF1ZXVlKG1ha2VRdWV1ZSk7XG5oYXJkZW4obWFrZVF1ZXVlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmVhZFJldHVyblxuICogQHRlbXBsYXRlIFRXcml0ZVJldHVyblxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXN5bmNRdWV1ZTxJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJlYWRSZXR1cm4+Pn0gYWNrc1xuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXN5bmNRdWV1ZTxJdGVyYXRvclJlc3VsdDxUV3JpdGUsIFRXcml0ZVJldHVybj4+fSBkYXRhXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RyZWFtPShhY2tzLGRhdGEpPT57XG5jb25zdCBzdHJlYW09aGFyZGVuKHtcbi8qKlxuICogQHBhcmFtIHtUV3JpdGV9IHZhbHVlXG4gKi9cbm5leHQodmFsdWUpe1xuLyogTm90ZSB0aGUgc2hhbGxvdyBmcmVlemUgc2luY2UgdmFsdWUgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgZnJlZXphYmxlKi9cbi8qICh0eXBlZCBhcnJheXMgYXJlIG5vdCkuKi9cbmRhdGEucHV0KGZyZWV6ZSh7dmFsdWUsZG9uZTpmYWxzZX0pKTtcbnJldHVybiBhY2tzLmdldCgpO1xuIH0sXG4vKipcbiAqIEBwYXJhbSB7VFdyaXRlUmV0dXJufSB2YWx1ZVxuICovXG5yZXR1cm4odmFsdWUpe1xuZGF0YS5wdXQoZnJlZXplKHt2YWx1ZSxkb25lOnRydWV9KSk7XG5yZXR1cm4gYWNrcy5nZXQoKTtcbiB9LFxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICovXG50aHJvdyhlcnJvcil7XG5kYXRhLnB1dChoYXJkZW4oUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG5yZXR1cm4gYWNrcy5nZXQoKTtcbiB9LFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe1xucmV0dXJuIHN0cmVhbTtcbiB9fSk7XG5cbnJldHVybiBzdHJlYW07XG4gfTskaOKAjV9vbmNlLm1ha2VTdHJlYW0obWFrZVN0cmVhbSk7XG5oYXJkZW4obWFrZVN0cmVhbSk7XG5cbi8qIEpTRG9jIFR5cGVTY3JpcHQgc2VlbXMgdW5hYmxlIHRvIGV4cHJlc3MgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uJ3MqL1xuLyogZW50YW5nbGVtZW50IG9mIHF1ZXVlcywgYnV0IHRoZSBkZWZpbml0aW9uIGluIHR5cGVzLmQudHMgd29ya3MgZm9yIHRoZSBlbmQqL1xuLyogdXNlci4qL1xuY29uc3QgICAgICAgIG1ha2VQaXBlPSgpPT57XG5jb25zdCBkYXRhPW1ha2VRdWV1ZSgpO1xuY29uc3QgYWNrcz1tYWtlUXVldWUoKTtcbmNvbnN0IHJlYWRlcj1tYWtlU3RyZWFtKGFja3MsZGF0YSk7XG5jb25zdCB3cml0ZXI9bWFrZVN0cmVhbShkYXRhLGFja3MpO1xucmV0dXJuIGhhcmRlbihbd3JpdGVyLHJlYWRlcl0pO1xuIH07JGjigI1fb25jZS5tYWtlUGlwZShtYWtlUGlwZSk7XG5oYXJkZW4obWFrZVBpcGUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUUmVhZFxuICogQHRlbXBsYXRlIFRXcml0ZVxuICogQHRlbXBsYXRlIFRSZWFkUmV0dXJuXG4gKiBAdGVtcGxhdGUgVFdyaXRlUmV0dXJuXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TdHJlYW08VFdyaXRlLCBUUmVhZCwgVFdyaXRlUmV0dXJuLCBUUmVhZFJldHVybj59IHdyaXRlclxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU3RyZWFtPFRSZWFkLCBUV3JpdGUsIFRSZWFkUmV0dXJuLCBUV3JpdGVSZXR1cm4+fSByZWFkZXJcbiAqIEBwYXJhbSB7VFdyaXRlfSBwcmltZXJcbiAqL1xuY29uc3QgICAgICAgIHB1bXA9YXN5bmMod3JpdGVyLHJlYWRlcixwcmltZXIpPT57XG4vKiogQHBhcmFtIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmVhZFJldHVybj4+fSBwcm9taXNlICovXG5jb25zdCB0aWNrPShwcm9taXNlKT0+XG5FLndoZW4oXG5wcm9taXNlLFxuKHJlc3VsdCk9PntcbmlmKHJlc3VsdC5kb25lKXtcbnJldHVybiB3cml0ZXIucmV0dXJuKHJlc3VsdC52YWx1ZSk7XG4gfWVsc2V7XG4vKiBCZWhvbGQ6IG11dHVhbCByZWN1cnNpb24uKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gdG9jayh3cml0ZXIubmV4dChyZXN1bHQudmFsdWUpKTtcbiB9XG4gfSxcbigvKiogQHR5cGUge0Vycm9yfSAqL2Vycm9yKT0+e1xucmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gfSk7XG5cbi8qKiBAcGFyYW0ge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VFdyaXRlLCBUV3JpdGVSZXR1cm4+Pn0gcHJvbWlzZSAqL1xuY29uc3QgdG9jaz0ocHJvbWlzZSk9PlxuRS53aGVuKFxucHJvbWlzZSxcbihyZXN1bHQpPT57XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gcmVhZGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuIH1lbHNle1xucmV0dXJuIHRpY2socmVhZGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gfVxuIH0sXG4oLyoqIEB0eXBlIHtFcnJvcn0gKi9lcnJvcik9PntcbnJldHVybiByZWFkZXIudGhyb3coZXJyb3IpO1xuIH0pO1xuXG5hd2FpdCB0aWNrKHJlYWRlci5uZXh0KHByaW1lcikpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9OyRo4oCNX29uY2UucHVtcChwdW1wKTtcbmhhcmRlbihwdW1wKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmV0dXJuXG4gKiBAcGFyYW0ge0FzeW5jR2VuZXJhdG9yPFRSZWFkLCBUUmV0dXJuLCBUV3JpdGU+fSBnZW5lcmF0b3JcbiAqIEBwYXJhbSB7VFdyaXRlfSBwcmltZXJcbiAqL1xuY29uc3QgICAgICAgIHByaW1lPShnZW5lcmF0b3IscHJpbWVyKT0+e1xuLyogV2UgY2FwdHVyZSB0aGUgZmlyc3QgcmV0dXJuZWQgcHJvbWlzZS4qL1xuY29uc3QgZmlyc3Q9Z2VuZXJhdG9yLm5leHQocHJpbWVyKTtcbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8VFJlYWQsIFRSZXR1cm4+PX0gKi9cbmxldCByZXN1bHQ7XG5jb25zdCBwcmltZWQ9aGFyZGVuKHtcbi8qKiBAcGFyYW0ge1RXcml0ZX0gdmFsdWUgKi9cbiAgICAgIGFzeW5jIG5leHQodmFsdWUpe1xuaWYocmVzdWx0PT09dW5kZWZpbmVkKXtcbnJlc3VsdD1hd2FpdCBmaXJzdDtcbmlmKHJlc3VsdC5kb25lKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbnJldHVybiBnZW5lcmF0b3IubmV4dCh2YWx1ZSk7XG4gfSxcbi8qKiBAcGFyYW0ge1RSZXR1cm59IHZhbHVlICovXG4gICAgICBhc3luYyByZXR1cm4odmFsdWUpe1xuaWYocmVzdWx0PT09dW5kZWZpbmVkKXtcbnJlc3VsdD1hd2FpdCBmaXJzdDtcbmlmKHJlc3VsdC5kb25lKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbnJldHVybiBnZW5lcmF0b3IucmV0dXJuKHZhbHVlKTtcbiB9LFxuLyoqIEBwYXJhbSB7RXJyb3J9IGVycm9yICovXG4gICAgICBhc3luYyB0aHJvdyhlcnJvcil7XG5pZihyZXN1bHQ9PT11bmRlZmluZWQpe1xucmVzdWx0PWF3YWl0IGZpcnN0O1xuaWYocmVzdWx0LmRvbmUpe1xudGhyb3cgZXJyb3I7XG4gfVxuIH1cbnJldHVybiBnZW5lcmF0b3IudGhyb3coZXJyb3IpO1xuIH19KTtcblxucmV0dXJuIHByaW1lZDtcbiB9OyRo4oCNX29uY2UucHJpbWUocHJpbWUpO1xuaGFyZGVuKHByaW1lKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVEluXG4gKiBAdGVtcGxhdGUgVE91dFxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZGVyPFRJbj59IHJlYWRlclxuICogQHBhcmFtIHsodmFsdWU6IFRJbikgPT4gVE91dH0gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlYWRlcjxUT3V0Pn1cbiAqL1xuY29uc3QgICAgICAgIG1hcFJlYWRlcj0ocmVhZGVyLHRyYW5zZm9ybSk9PntcbmFzeW5jIGZ1bmN0aW9uKnRyYW5zZm9ybUdlbmVyYXRvcigpe1xuZm9yIGF3YWl0KGNvbnN0IHZhbHVlIG9mIHJlYWRlcil7XG55aWVsZCB0cmFuc2Zvcm0odmFsdWUpO1xuIH1cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIGhhcmRlbih0cmFuc2Zvcm1HZW5lcmF0b3IoKSk7XG4gfTskaOKAjV9vbmNlLm1hcFJlYWRlcihtYXBSZWFkZXIpO1xuaGFyZGVuKG1hcFJlYWRlcik7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRJblxuICogQHRlbXBsYXRlIFRPdXRcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLldyaXRlcjxUT3V0Pn0gd3JpdGVyXG4gKiBAcGFyYW0geyh2YWx1ZTogVEluKSA9PiBUT3V0fSB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuV3JpdGVyPFRJbj59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBXcml0ZXI9KHdyaXRlcix0cmFuc2Zvcm0pPT57XG5jb25zdCB0cmFuc2Zvcm1lZFdyaXRlcj1oYXJkZW4oe1xuLyoqXG4gKiBAcGFyYW0ge1RJbn0gdmFsdWVcbiAqL1xuICAgICAgYXN5bmMgbmV4dCh2YWx1ZSl7XG5yZXR1cm4gd3JpdGVyLm5leHQodHJhbnNmb3JtKHZhbHVlKSk7XG4gfSxcbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqL1xuICAgICAgYXN5bmMgdGhyb3coZXJyb3Ipe1xucmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gfSxcbi8qKlxuICogQHBhcmFtIHt1bmRlZmluZWR9IHZhbHVlXG4gKi9cbiAgICAgIGFzeW5jIHJldHVybih2YWx1ZSl7XG5yZXR1cm4gd3JpdGVyLnJldHVybih2YWx1ZSk7XG4gfSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbiB9fSk7XG5cbnJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbiB9OyRo4oCNX29uY2UubWFwV3JpdGVyKG1hcFdyaXRlcik7XG5oYXJkZW4obWFwV3JpdGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUXVldWUiOlsibWFrZVF1ZXVlIl0sIm1ha2VTdHJlYW0iOlsibWFrZVN0cmVhbSJdLCJtYWtlUGlwZSI6WyJtYWtlUGlwZSJdLCJwdW1wIjpbInB1bXAiXSwicHJpbWUiOlsicHJpbWUiXSwibWFwUmVhZGVyIjpbIm1hcFJlYWRlciJdLCJtYXBXcml0ZXIiOlsibWFwV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIu6h5KtAQAArQEAABwAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9tYWluLmpzeyJpbXBvcnRzIjpbIi4vcmluZzAvbWFpbi5qcyIsIi4vcmluZzEvbWFpbi5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vcmluZzAvbWFpbi5qcyIsIi4vcmluZzEvbWFpbi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vcmluZzAvbWFpbi5qc1wiLCBbXV0sW1wiLi9yaW5nMS9tYWluLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACdzxOJXQEAAF0BAAAfAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvRS5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyJAZW5kby9mYXIiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPi0yb+pAwAAqQMAACwAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXN5bmNHZW5lcmF0ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogUmV0dXJuIGFuIGFzeW5jIGl0ZXJhYmxlIHRoYXQgcHJvZHVjZXMgaXRlcmF0b3IgcmVzdWx0cyB2aWEgYG5leHRgLlxuICpcbiAqIFRoaXMgd29ya3MgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIFN5bWJvbC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxUUmV0dXJuXG4gKiBAcGFyYW0geygpID0+IEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+IHxcbiAqICAgICAgICAgICAgICAgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj5cbiAqIH0gbmV4dCBwcm9kdWNlIGEgc2luZ2xlLXN0ZXAgaXRlcmF0b3IgcmVzdWx0XG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIGFzeW5jR2VuZXJhdGU9KG5leHQpPT57XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbnJldHVybiBoYXJkZW4oe1xubmV4dDphc3luYygpPT5oYXJkZW4obmV4dCgpKX0pO1xuXG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLmFzeW5jR2VuZXJhdGUoYXN5bmNHZW5lcmF0ZSk7XG5oYXJkZW4oYXN5bmNHZW5lcmF0ZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNHZW5lcmF0ZSI6WyJhc3luY0dlbmVyYXRlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKCj2XrQAQAA0AEAACIAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWluLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyIsIi4vbWFrZXJzLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vRS5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiLCIuL21ha2Vycy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbXV0sW1wiLi9tYWtlcnMuanNcIiwgW11dLFtcIi4vYXN5bmMtZ2VuZXJhdGUuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG+be2LjCAAA4wgAACQAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWtlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VNYXAiLCJtYWtlUHJvbWlzZSIsIm1ha2VTZXQiLCJtYWtlV2Vha01hcCIsIm1ha2VXZWFrU2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIFRoZXNlIHdvcmsgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIGBuZXdgLiovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiIC8+Ki9cblxuLyoqIEB0eXBlIHs8VD4oZXhlY3V0b3I6IChyZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT5cbiAqIHZvaWQpID0+IHZvaWQpID0+IFByb21pc2U8VD59ICovXG5jb25zdCAgICAgICAgbWFrZVByb21pc2U9KGV4ZWN1dG9yKT0+aGFyZGVuKG5ldyBQcm9taXNlKGV4ZWN1dG9yKSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZShtYWtlUHJvbWlzZSk7XG5oYXJkZW4obWFrZVByb21pc2UpO1xuXG4vKiogQHR5cGVkZWYgezxLLCBWPihlbnRyaWVzPzogcmVhZG9ubHkgKHJlYWRvbmx5IFtLLCBWXSlbXSkgPT4gTWFwPEssIFY+fSBNYXBGcm9tRW50cmllcyAqL1xuLyoqIEB0eXBlZGVmIHs8SywgVj4oaXRlcmFibGU6IEl0ZXJhYmxlPHJlYWRvbmx5IFtLLCBWXT4pID0+IE1hcDxLLCBWPn0gTWFwRnJvbUl0ZXJhYmxlICovXG5cbi8qKiBAdHlwZSB7TWFwRnJvbUVudHJpZXMgJiBNYXBGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZU1hcD0oZW50cmllc09ySXRlcmFibGUpPT5oYXJkZW4obmV3IE1hcChlbnRyaWVzT3JJdGVyYWJsZSkpOyRo4oCNX29uY2UubWFrZU1hcChtYWtlTWFwKTtcbmhhcmRlbihtYWtlTWFwKTtcblxuLyoqIEB0eXBlZGVmIHs8VD4odmFsdWVzPzogcmVhZG9ubHkgVFtdKSA9PiBTZXQ8VD59IFNldEZyb21WYWx1ZXMgKi9cbi8qKiBAdHlwZWRlZiB7PFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPikgPT4gU2V0PFQ+fSBTZXRGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7U2V0RnJvbVZhbHVlcyAmIFNldEZyb21JdGVyYWJsZX0gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0PSh2YWx1ZXMpPT5oYXJkZW4obmV3IFNldCh2YWx1ZXMpKTskaOKAjV9vbmNlLm1ha2VTZXQobWFrZVNldCk7XG5oYXJkZW4obWFrZVNldCk7XG5cbi8qKiBAdHlwZWRlZiB7PEsgZXh0ZW5kcyB7fSwgViA9IGFueT4oZW50cmllcz86IHJlYWRvbmx5IFtLLCBWXVtdIHwgbnVsbCkgPT4gV2Vha01hcDxLLCBWPn0gV2Vha01hcEZyb21FbnRyaWVzICovXG4vKiogQHR5cGVkZWYgezxLIGV4dGVuZHMge30sIFY+KGl0ZXJhYmxlOiBJdGVyYWJsZTxbSywgVl0+KSA9PiBXZWFrTWFwPEssIFY+fSBXZWFrTWFwRnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1dlYWtNYXBGcm9tRW50cmllcyAmIFdlYWtNYXBGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtNYXA9KGVudHJpZXMpPT5oYXJkZW4obmV3IFdlYWtNYXAoZW50cmllcykpOyRo4oCNX29uY2UubWFrZVdlYWtNYXAobWFrZVdlYWtNYXApO1xuaGFyZGVuKG1ha2VXZWFrTWFwKTtcblxuLyoqIEB0eXBlZGVmIHs8VCBleHRlbmRzIHt9Pih2YWx1ZXM/OiByZWFkb25seSBUW10pID0+IFdlYWtTZXQ8VD59IFdlYWtTZXRGcm9tVmFsdWVzICovXG4vKiogQHR5cGVkZWYgezxUIGV4dGVuZHMge30+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPikgPT4gV2Vha1NldDxUPn0gV2Vha1NldEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtXZWFrU2V0RnJvbVZhbHVlcyAmIFdlYWtTZXRGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtTZXQ9KHZhbHVlcyk9PmhhcmRlbihuZXcgV2Vha1NldCh2YWx1ZXMpKTskaOKAjV9vbmNlLm1ha2VXZWFrU2V0KG1ha2VXZWFrU2V0KTtcbmhhcmRlbihtYWtlV2Vha1NldCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2UiOlsibWFrZVByb21pc2UiXSwibWFrZU1hcCI6WyJtYWtlTWFwIl0sIm1ha2VTZXQiOlsibWFrZVNldCJdLCJtYWtlV2Vha01hcCI6WyJtYWtlV2Vha01hcCJdLCJtYWtlV2Vha1NldCI6WyJtYWtlV2Vha1NldCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC0LPWY/gQAAP4EAAApAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanN7ImltcG9ydHMiOlsiLi4vcmluZzAvbWFpbi5qcyJdLCJleHBvcnRzIjpbImFzeW5jRG9XaGlsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCIuLi9yaW5nMC9tYWluLmpzXCIsIFtbXCJtYWtlUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogUmVzb2x2ZSByZXR1cm5lZCBwcm9taXNlIHdpdGggdW5kZWZpbmVkIHdoZW4gYGJvZHlgIHJldHVybnMgZmFsc3kuXG4gKlxuICogVGhpcyB3b3JrcyBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgYGF3YWl0YCBub3QgYXQgdGhlIGZ1bmN0aW9uLWxldmVsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFQgfCBQcm9taXNlPFQ+fSBib2R5IHBlcmZvcm0gc2lkZS1lZmZlY3RzLCBhbmQgcmV0dXJuIHRydXRoeSBpZlxuICogd2Ugc2hvdWxkIHJ1biBhZ2FpblxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmNvbnN0ICAgICAgICBhc3luY0RvV2hpbGU9KGJvZHkpPT57XG5jb25zdCBsb29wPWFzeW5jKHJlc29sdmUscmVqZWN0KT0+e1xuY29uc3QgZG9Db250aW51ZT1hd2FpdCBib2R5KCk7XG5pZighZG9Db250aW51ZSl7XG4vKiBSZXNvbHZlIHRoZSBvdXRlcm1vc3QgcHJvbWlzZS4qL1xucmVzb2x2ZSh1bmRlZmluZWQpO1xucmV0dXJuO1xuIH1cblxuLyogRG8gdGhlIGxvb3AgYWdhaW4uICBXZSBhcmUgY2FyZWZ1bCBub3QgdG8gYXdhaXQgc28gdGhhdCB3ZSBkb24ndCBjcmVhdGUgYSovXG4vKiBwcm9taXNlIGNoYWluLiovXG5sb29wKHJlc29sdmUscmVqZWN0KS5jYXRjaChyZWplY3QpO1xuIH07XG5cbnJldHVybiBtYWtlUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT5sb29wKHJlc29sdmUscmVqZWN0KS5jYXRjaChyZWplY3QpKTtcbiB9OyRo4oCNX29uY2UuYXN5bmNEb1doaWxlKGFzeW5jRG9XaGlsZSk7XG5oYXJkZW4oYXN5bmNEb1doaWxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0RvV2hpbGUiOlsiYXN5bmNEb1doaWxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJYTQrJyAQAAcgEAACIAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMS9tYWluLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9hc3luYy10b29scy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAQIeAwoAAAAAAAAAAAA3q+3c9pIBAPaSAQAUAAAAAAAAAAAAAACkgQAAAABjb21wYXJ0bWVudC1tYXAuanNvblBLAQIeAwoAAAAAAAAAAAA5ilYCOwsAADsLAAAjAAAAAAAAAAAAAACkgSiTAQBAYWdvcmljL2Fzc2VydC12MC42LjAvc3JjL2Fzc2VydC5qc1BLAQIeAwoAAAAAAAAAAAAFuYfs2i4AANouAAAiAAAAAAAAAAAAAACkgaSeAQBAYWdvcmljL2Fzc2VydC12MC42LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAAlb/LVpAQAAaQEAACAAAAAAAAAAAAAAAKSBvs0BAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9oZWFwLmpzUEsBAh4DCgAAAAAAAAAAABOvGoHsCgAA7AoAACQAAAAAAAAAAAAAAKSBZc8BAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAAAqfoo+kQQAAJEEAAArAAAAAAAAAAAAAACkgZPaAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2lzLXBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAL9hH3PJAwAAyQMAACQAAAAAAAAAAAAAAKSBbd8BAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMva2V5cy5qc1BLAQIeAwoAAAAAAAAAAADOSDYZwQ0AAMENAAApAAAAAAAAAAAAAACkgXjjAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL21ha2Utb25jZS5qc1BLAQIeAwoAAAAAAAAAAACriiOmbAEAAGwBAAAgAAAAAAAAAAAAAACkgYDxAQBAYWdvcmljL2VydHAtdjAuMTYuMi9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAACIPZYmPDcAADw3AAAmAAAAAAAAAAAAAACkgSrzAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50TWF0aC5qc1BLAQIeAwoAAAAAAAAAAADAS0Jf1QUAANUFAAAnAAAAAAAAAAAAAACkgaoqAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanNQSwECHgMKAAAAAAAAAAAAQzB73OgBAADoAQAAIQAAAAAAAAAAAAAApIHEMAIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAMY1p2fWIAAA1iAAACUAAAAAAAAAAAAAAKSB6zICAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pc3N1ZXJLaXQuanNQSwECHgMKAAAAAAAAAAAATsIZ2q0FAACtBQAAOgAAAAAAAAAAAAAApIEEVAIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABcKf4+wQUAAMEFAAA6AAAAAAAAAAAAAACkgQlaAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAPEBYesmBgAAJgYAADYAAAAAAAAAAAAAAKSBImACAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABjSZDanwcAAJ8HAAA2AAAAAAAAAAAAAACkgZxmAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAsDioH6UEAAClBAAAIwAAAAAAAAAAAAAApIGPbgIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanNQSwECHgMKAAAAAAAAAAAA8zds38MxAADDMQAAKQAAAAAAAAAAAAAApIF1cwIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanNQSwECHgMKAAAAAAAAAAAAEMvZsMAPAADADwAAIQAAAAAAAAAAAAAApIF/pQIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3B1cnNlLmpzUEsBAh4DCgAAAAAAAAAAAD6sU2AUBgAAFAYAAC0AAAAAAAAAAAAAAKSBfrUCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAADFEhRu/iYAAP4mAAAmAAAAAAAAAAAAAACkgd27AgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAACX3LrAaz8AAGs/AAApAAAAAAAAAAAAAACkgR/jAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAACriiOmbAEAAGwBAAAmAAAAAAAAAAAAAACkgdEiAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAAD3qap29AMAAPQDAAArAAAAAAAAAAAAAACkgYEkAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29uc3RhbnRzLmpzUEsBAh4DCgAAAAAAAAAAAD3iTkL8CwAA/AsAAD8AAAAAAAAAAAAAAKSBvigDAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvYXNzZXJ0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAABjRghYdREAAHURAAA+AAAAAAAAAAAAAACkgRc1AwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qc1BLAQIeAwoAAAAAAAAAAADGxPToqw8AAKsPAABBAAAAAAAAAAAAAACkgehGAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc1BLAQIeAwoAAAAAAAAAAADyInlNSBYAAEgWAABAAAAAAAAAAAAAAACkgfJWAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzUEsBAh4DCgAAAAAAAAAAABltwM8RQgAAEUIAAEEAAAAAAAAAAAAAAKSBmG0DAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzUEsBAh4DCgAAAAAAAAAAADVg83HnFwAA5xcAAEYAAAAAAAAAAAAAAKSBCLADAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanNQSwECHgMKAAAAAAAAAAAAbf+G140jAACNIwAAMgAAAAAAAAAAAAAApIFTyAMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJub3IuanNQSwECHgMKAAAAAAAAAAAAlv+ODogdAACIHQAANQAAAAAAAAAAAAAApIEw7AMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanNQSwECHgMKAAAAAAAAAAAAFqpnmNErAADRKwAAMAAAAAAAAAAAAAAApIELCgQAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0SGVscGVyLmpzUEsBAh4DCgAAAAAAAAAAAOvplasJCgAACQoAACcAAAAAAAAAAAAAAKSBKjYEAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAApwM3Qpw8AAKcPAAAqAAAAAAAAAAAAAACkgXhABABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvcXVlc3Rpb24uanNQSwECHgMKAAAAAAAAAAAA5Ur/OCg7AAAoOwAALAAAAAAAAAAAAAAApIFnUAQAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAcg2HHF1hAABdYQAALwAAAAAAAAAAAAAApIHZiwQAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAA6FEl/WMKAABjCgAALAAAAAAAAAAAAAAApIGD7QQAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3ZhbGlkYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAu7v/Q8RaAADEWgAAOQAAAAAAAAAAAAAApIEw+AQAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9hdWN0aW9uL2F1Y3Rpb25Cb29rLmpzUEsBAh4DCgAAAAAAAAAAADlQu8//ZQAA/2UAADgAAAAAAAAAAAAAAKSBS1MFAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvYXVjdGlvbi9hdWN0aW9uZWVyLmpzUEsBAh4DCgAAAAAAAAAAAELbGWyjFwAAoxcAADcAAAAAAAAAAAAAAKSBoLkFAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvYXVjdGlvbi9vZmZlckJvb2suanNQSwECHgMKAAAAAAAAAAAA+DEc4JYeAACWHgAANAAAAAAAAAAAAAAApIGY0QUAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9hdWN0aW9uL3BhcmFtcy5qc1BLAQIeAwoAAAAAAAAAAAA/oueOmxoAAJsaAAA6AAAAAAAAAAAAAACkgYDwBQBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL2F1Y3Rpb24vc2NoZWR1bGVNYXRoLmpzUEsBAh4DCgAAAAAAAAAAAPbHjPZ8KwAAfCsAADcAAAAAAAAAAAAAAKSBcwsGAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvYXVjdGlvbi9zY2hlZHVsZXIuanNQSwECHgMKAAAAAAAAAAAA2RC7CpwWAACcFgAAOgAAAAAAAAAAAAAApIFENwYAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9hdWN0aW9uL3NvcnRlZE9mZmVycy5qc1BLAQIeAwoAAAAAAAAAAABAG2yTnwkAAJ8JAAAyAAAAAAAAAAAAAACkgThOBgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL2F1Y3Rpb24vdXRpbC5qc1BLAQIeAwoAAAAAAAAAAAAM1H5eMREAADERAAA1AAAAAAAAAAAAAACkgSdYBgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL2NvbnRyYWN0U3VwcG9ydC5qc1BLAQIeAwoAAAAAAAAAAAAr1LTjehgAAHoYAAA9AAAAAAAAAAAAAACkgatpBgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ZhdWx0RmFjdG9yeS9zdG9yZVV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAEVnGwSWKAAAligAACcAAAAAAAAAAAAAAKSBgIIGAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jYWxsYmFjay5qc1BLAQIeAwoAAAAAAAAAAACqj91GIgYAACIGAAAlAAAAAAAAAAAAAACkgVurBgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY29uZmlnLmpzUEsBAh4DCgAAAAAAAAAAABfJM4DIBAAAyAQAACQAAAAAAAAAAAAAAKSBwLEGAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9kZWJ1Zy5qc1BLAQIeAwoAAAAAAAAAAAC4c/LWQwIAAEMCAAAkAAAAAAAAAAAAAACkgcq2BgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAzC8l6dopAADaKQAALwAAAAAAAAAAAAAApIFPuQYAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNQSwECHgMKAAAAAAAAAAAAou7IgN4QAADeEAAAKwAAAAAAAAAAAAAApIF24wYAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldGhvZC10b29scy5qc1BLAQIeAwoAAAAAAAAAAADqQ+El3gMAAN4DAAAsAAAAAAAAAAAAAACkgZ30BgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdGVzdGluZy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAABUOfoRLQIAAC0CAAApAAAAAAAAAAAAAACkgcX4BgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAADexqKMKwcAACsHAAAqAAAAAAAAAAAAAACkgTn7BgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXBncmFkZS1hcGkuanNQSwECHgMKAAAAAAAAAAAAoumxkuM8AADjPAAAJAAAAAAAAAAAAAAApIGsAgcAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAD5iXDZcAQAAXAEAACIAAAAAAAAAAAAAAKSB0T8HAEBhZ29yaWMvbmV0d29yay12MC4xLjAvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAB35TaDoYAAA6GAAAIwAAAAAAAAAAAAAApIFtQQcAQGFnb3JpYy9uZXR3b3JrLXYwLjEuMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAq4ojpmwBAABsAQAAIwAAAAAAAAAAAAAApIHoWQcAQGFnb3JpYy9ub3RpZmllci12MC42LjIvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAzbURkdUSAADVEgAAMwAAAAAAAAAAAAAApIGVWwcAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzUEsBAh4DCgAAAAAAAAAAAE3i7xocBwAAHAcAACQAAAAAAAAAAAAAAKSBu24HAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADLr+BaWhgAAFoYAAAnAAAAAAAAAAAAAACkgRl2BwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvbm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAAPHsaGXM4AABzOAAAKgAAAAAAAAAAAAAApIG4jgcAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3B1Ymxpc2gta2l0LmpzUEsBAh4DCgAAAAAAAAAAAFlqkoyDCgAAgwoAAC4AAAAAAAAAAAAAAKSBc8cHAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZWQtbm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAAP99Lb9UhAADVIQAAJwAAAAAAAAAAAAAApIFC0gcAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3Jlc3ViLmpzUEsBAh4DCgAAAAAAAAAAADn7qBoiJAAAIiQAACgAAAAAAAAAAAAAAKSBXPQHAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmUuanNQSwECHgMKAAAAAAAAAAAAzEjhp8ULAADFCwAAKQAAAAAAAAAAAAAApIHEGAgAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZXIuanNQSwECHgMKAAAAAAAAAAAAkI6zQwwGAAAMBgAAJAAAAAAAAAAAAAAApIHQJAgAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3RvcGljLmpzUEsBAh4DCgAAAAAAAAAAAPhRDxM/MAAAPzAAACwAAAAAAAAAAAAAAKSBHisIAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90eXBlcy1hbWJpZW50LmpzUEsBAh4DCgAAAAAAAAAAAGF+tZn2BgAA9gYAAC0AAAAAAAAAAAAAAKSBp1sIAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAAA+Ylw2XAEAAFwBAAAgAAAAAAAAAAAAAACkgehiCABAYWdvcmljL3N0b3JlLXYwLjkuMi9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAAA22/kqIwwAACMMAAAhAAAAAAAAAAAAAACkgYJkCABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAEgekoUALAABACwAALAAAAAAAAAAAAAAApIHkcAgAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanNQSwECHgMKAAAAAAAAAAAAfydKn7wGAAC8BgAAMAAAAAAAAAAAAAAApIFufAgAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzUEsBAh4DCgAAAAAAAAAAAAiSbGIQFgAAEBYAADEAAAAAAAAAAAAAAKSBeIMIAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAAoTr2EzsPAAA7DwAAMQAAAAAAAAAAAAAApIHXmQgAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABH3fK9cRMAAHETAAA1AAAAAAAAAAAAAACkgWGpCABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABzHuAYCQ8AAAkPAAA1AAAAAAAAAAAAAACkgSW9CABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACy12MInRkAAJ0ZAAAuAAAAAAAAAAAAAACkgYHMCABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAMUArIJYKgAAWCoAACEAAAAAAAAAAAAAAKSBauYIAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAoAAAAAAAAAAAAAACkgQERCQBAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMi4yL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAACGYIdi/AQAAvwEAABwAAAAAAAAAAAAAAKSBexIJAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAANgqRWKoiAACqIgAAIwAAAAAAAAAAAAAApIF0FAkAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdGltZU1hdGguanNQSwECHgMKAAAAAAAAAAAAntgJoakHAACpBwAAJQAAAAAAAAAAAAAApIFfNwkAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAAAKLNUppSkAAKUpAAAoAAAAAAAAAAAAAACkgUs/CQBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAACeMtJmSCAAAkggAACQAAAAAAAAAAAAAAKSBNmkJAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACShkCK+ygAAPsoAAAwAAAAAAAAAAAAAACkgQpyCQBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAAbKkMVcADAADAAwAAHwAAAAAAAAAAAAAApIFTmwkAQGFnb3JpYy96b2UtdjAuMjYuMi9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAADlJDLZQBwAAEAcAAAoAAAAAAAAAAAAAACkgVCfCQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jbGVhblByb3Bvc2FsLmpzUEsBAh4DCgAAAAAAAAAAAJqoOUK8EAAAvBAAADQAAAAAAAAAAAAAAKSB1rsJAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanNQSwECHgMKAAAAAAAAAAAAFQLNlPsnAAD7JwAALgAAAAAAAAAAAAAApIHkzAkAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAdOoKXuRIAALkSAAA5AAAAAAAAAAAAAACkgSv1CQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanNQSwECHgMKAAAAAAAAAAAAifup5LYbAAC2GwAAOAAAAAAAAAAAAAAApIE7CAoAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanNQSwECHgMKAAAAAAAAAAAAnwuRNrYSAAC2EgAANQAAAAAAAAAAAAAApIFHJAoAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanNQSwECHgMKAAAAAAAAAAAAX479dt8JAADfCQAAMAAAAAAAAAAAAAAApIFQNwoAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALynJ6+1KwAAtSsAADkAAAAAAAAAAAAAAKSBfUEKAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qc1BLAQIeAwoAAAAAAAAAAAC2pd3y9AgAAPQIAAA1AAAAAAAAAAAAAACkgYltCgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qc1BLAQIeAwoAAAAAAAAAAABghIU1vDYAALw2AAAwAAAAAAAAAAAAAACkgdB2CgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanNQSwECHgMKAAAAAAAAAAAA8zwubjomAAA6JgAAMwAAAAAAAAAAAAAApIHarQoAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzUEsBAh4DCgAAAAAAAAAAAOhpH7e2BgAAtgYAADMAAAAAAAAAAAAAAKSBZdQKAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9zYWZlTWF0aC5qc1BLAQIeAwoAAAAAAAAAAABrgxoLmgQAAJoEAAA3AAAAAAAAAAAAAACkgWzbCgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzUEsBAh4DCgAAAAAAAAAAAH5taW1/BQAAfwUAADUAAAAAAAAAAAAAAKSBW+AKAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0aXN0aWNzLmpzUEsBAh4DCgAAAAAAAAAAAD7Lfd+dBwAAnQcAADEAAAAAAAAAAAAAAKSBLeYKAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC90b3BpY3MuanNQSwECHgMKAAAAAAAAAAAAZQTCFtoLAADaCwAAMAAAAAAAAAAAAAAApIEZ7goAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAFjtCxBNOAAATTgAADUAAAAAAAAAAAAAAKSBQfoKAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAPIwdINXBwAAVwcAADUAAAAAAAAAAAAAAKSB4TILAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0cy9jYWxsU3ByZWFkL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAADX2lom4AQAAuAEAAC0AAAAAAAAAAAAAAKSBizoLAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAADp0ew1oxoAAKMaAAAvAAAAAAAAAAAAAACkgY48CwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdHMvbG9hbi90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAA4Wbpi0gsAANILAAAqAAAAAAAAAAAAAACkgX5XCwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdHMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAoMrWfrsnAAC7JwAAKQAAAAAAAAAAAAAApIGYYwsAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvaW50ZXJuYWwtdHlwZXMuanNQSwECHgMKAAAAAAAAAAAA74cbCVYIAABWCAAAJQAAAAAAAAAAAAAApIGaiwsAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvbWFrZUhhbmRsZS5qc1BLAQIeAwoAAAAAAAAAAADG+pcHogUAAKIFAAAtAAAAAAAAAAAAAACkgTOUCwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9vYmpBcnJheUNvbnZlcnNpb24uanNQSwECHgMKAAAAAAAAAAAA5bEJzNtDAADbQwAAJQAAAAAAAAAAAAAApIEgmgsAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAADpDQFrlgcAAJYHAAAgAAAAAAAAAAAAAACkgT7eCwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABqVac+LC0AACwtAAArAAAAAAAAAAAAAACkgRLmCwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAANjtjayXFgAAlxYAACoAAAAAAAAAAAAAAKSBhxMMAEBhZ29yaWMvem9lLXYwLjI2LjIvdG9vbHMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAADkBLVV8hkAAPIZAAAhAAAAAAAAAAAAAACkgWYqDABAZW5kby9jYXB0cC12My4xLjIvc3JjL2F0b21pY3MuanNQSwECHgMKAAAAAAAAAAAAWMXVqyFeAAAhXgAAHwAAAAAAAAAAAAAApIGXRAwAQGVuZG8vY2FwdHAtdjMuMS4yL3NyYy9jYXB0cC5qc1BLAQIeAwoAAAAAAAAAAAAb7bippRUAAKUVAAAiAAAAAAAAAAAAAACkgfWiDABAZW5kby9jYXB0cC12My4xLjIvc3JjL2ZpbmFsaXplLmpzUEsBAh4DCgAAAAAAAAAAAGwsewRrAgAAawIAAB8AAAAAAAAAAAAAAKSB2rgMAEBlbmRvL2NhcHRwLXYzLjEuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAADmYb+1MNAABTDQAAIgAAAAAAAAAAAAAApIGCuwwAQGVuZG8vY2FwdHAtdjMuMS4yL3NyYy9sb29wYmFjay5qc1BLAQIeAwoAAAAAAAAAAABcfBQTcQgAAHEIAAAeAAAAAAAAAAAAAACkgRXJDABAZW5kby9jYXB0cC12My4xLjIvc3JjL3RyYXAuanNQSwECHgMKAAAAAAAAAAAAuvSlo48IAACPCAAAHwAAAAAAAAAAAAAApIHC0QwAQGVuZG8vY2FwdHAtdjMuMS4yL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAeKPu0fgEAAH4BAAAhAAAAAAAAAAAAAACkgY7aDABAZW5kby9lbnYtb3B0aW9ucy12MC4xLjEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAshzifZgMAACYDAAAKwAAAAAAAAAAAAAApIFL3AwAQGVuZG8vZW52LW9wdGlvbnMtdjAuMS4xL3NyYy9lbnYtb3B0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAAC0L4uCBy4AAAcuAAAkAAAAAAAAAAAAAACkgSzpDABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjMvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAANwvtTx8CAAAfAgAAKgAAAAAAAAAAAAAApIF1Fw0AQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4zL3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAOqhHXSXEAAAlxAAAC4AAAAAAAAAAAAAAKSB3BkNAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMy9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAgy+jvpgCAACYAgAAGQAAAAAAAAAAAAAApIG/Kg0AQGVuZG8vZXhvLXYwLjIuMy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAABqDQWIhkAACIZAAAiAAAAAAAAAAAAAACkgY4tDQBAZW5kby9leG8tdjAuMi4zL3NyYy9leG8tbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAAPtxtTB+KwAAfisAACEAAAAAAAAAAAAAAKSB8EYNAEBlbmRvL2V4by12MC4yLjMvc3JjL2V4by10b29scy5qc1BLAQIeAwoAAAAAAAAAAABBDDOUQAIAAEACAAAeAAAAAAAAAAAAAACkga1yDQBAZW5kby9mYXItdjAuMi4xOS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAHfM5q0oHAABKBwAAHQAAAAAAAAAAAAAApIEpdQ0AQGVuZG8vbWFyc2hhbC12MC44LjYvaW5kZXguanNQSwECHgMKAAAAAAAAAAAADkxqFpoNAACaDQAAKwAAAAAAAAAAAAAApIGufA0AQGVuZG8vbWFyc2hhbC12MC44LjYvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1BLAQIeAwoAAAAAAAAAAAA7cs+A5D8AAOQ/AAAqAAAAAAAAAAAAAACkgZGKDQBAZW5kby9tYXJzaGFsLXYwLjguNi9zcmMvZW5jb2RlUGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAAbKp7Q5AAAAOQAAAKwAAAAAAAAAAAAAApIG9yg0AQGVuZG8vbWFyc2hhbC12MC44LjYvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1BLAQIeAwoAAAAAAAAAAADD18oB3TsAAN07AAAtAAAAAAAAAAAAAACkgRQLDgBAZW5kby9tYXJzaGFsLXYwLjguNi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanNQSwECHgMKAAAAAAAAAAAAf21Zn7gqAAC4KgAAKgAAAAAAAAAAAAAApIE8Rw4AQGVuZG8vbWFyc2hhbC12MC44LjYvc3JjL21hcnNoYWwtanVzdGluLmpzUEsBAh4DCgAAAAAAAAAAABPT1RvcBgAA3AYAAC0AAAAAAAAAAAAAAKSBPHIOAEBlbmRvL21hcnNoYWwtdjAuOC42L3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1BLAQIeAwoAAAAAAAAAAAAQCg0W7DIAAOwyAAAjAAAAAAAAAAAAAACkgWN5DgBAZW5kby9tYXJzaGFsLXYwLjguNi9zcmMvbWFyc2hhbC5qc1BLAQIeAwoAAAAAAAAAAADppIhVfkAAAH5AAAAlAAAAAAAAAAAAAACkgZCsDgBAZW5kby9tYXJzaGFsLXYwLjguNi9zcmMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAAJgZO7M0AQAANAEAACEAAAAAAAAAAAAAAKSBUe0OAEBlbmRvL21hcnNoYWwtdjAuOC42L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABNsj8rvwsAAL8LAAAeAAAAAAAAAAAAAACkgcTuDgBAZW5kby9uYXQtdjQuMS4yOC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA+UN81nwIAAB8CAAAIAAAAAAAAAAAAAAApIG/+g4AQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA3ka2qpMHAACTBwAAKAAAAAAAAAAAAAAApIF5Aw8AQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAACD9dsszwcAAM8HAAApAAAAAAAAAAAAAACkgVILDwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuNC9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAADToDhxnREAAJ0RAAAkAAAAAAAAAAAAAACkgWgTDwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuNC9zcmMvZXJyb3IuanNQSwECHgMKAAAAAAAAAAAASjtmg1UIAABVCAAAKwAAAAAAAAAAAAAApIFHJQ8AQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQvc3JjL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAD6Vf/NMhoAADIaAAAnAAAAAAAAAAAAAACkgeUtDwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuNC9zcmMvbWFrZS1mYXIuanNQSwECHgMKAAAAAAAAAAAAApF75R0EAAAdBAAAKQAAAAAAAAAAAAAApIFcSA8AQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQvc3JjL21ha2VUYWdnZWQuanNQSwECHgMKAAAAAAAAAAAAGUAoxvUZAAD1GQAAMAAAAAAAAAAAAAAApIHATA8AQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAJuri8egHgAAoB4AACoAAAAAAAAAAAAAAKSBA2cPAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40L3NyYy9wYXNzU3R5bGVPZi5qc1BLAQIeAwoAAAAAAAAAAAAUsaJ9wyEAAMMhAAAoAAAAAAAAAAAAAACkgeuFDwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuNC9zcmMvcmVtb3RhYmxlLmpzUEsBAh4DCgAAAAAAAAAAADKboYeaDwAAmg8AACsAAAAAAAAAAAAAAKSB9KcPAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40L3NyYy9zYWZlLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAxx/VUEcSAABHEgAAJQAAAAAAAAAAAAAApIHXtw8AQGVuZG8vcGFzcy1zdHlsZS12MC4xLjQvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAAAlvFz7/QcAAP0HAAAlAAAAAAAAAAAAAACkgWHKDwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuNC9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAHqgfmgSDQAAEg0AACkAAAAAAAAAAAAAAKSBodIPAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40L3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAJgZO7M0AQAANAEAACQAAAAAAAAAAAAAAKSB+t8PAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS40L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABj8xxK4goAAOIKAAAeAAAAAAAAAAAAAACkgXDhDwBAZW5kby9wYXR0ZXJucy12MC4yLjMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAd2RwDKRGAACkRgAAKgAAAAAAAAAAAAAApIGO7A8AQGVuZG8vcGF0dGVybnMtdjAuMi4zL3NyYy9rZXlzL2NoZWNrS2V5LmpzUEsBAh4DCgAAAAAAAAAAAMrBTZt3GgAAdxoAAC0AAAAAAAAAAAAAAKSBejMQAEBlbmRvL3BhdHRlcm5zLXYwLjIuMy9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1BLAQIeAwoAAAAAAAAAAABVIML9KhQAACoUAAApAAAAAAAAAAAAAACkgTxOEABAZW5kby9wYXR0ZXJucy12MC4yLjMvc3JjL2tleXMvY29weUJhZy5qc1BLAQIeAwoAAAAAAAAAAAAKHf6/oxAAAKMQAAApAAAAAAAAAAAAAACkga1iEABAZW5kby9wYXR0ZXJucy12MC4yLjMvc3JjL2tleXMvY29weVNldC5qc1BLAQIeAwoAAAAAAAAAAADUlAM6eSUAAHklAAA1AAAAAAAAAAAAAACkgZdzEABAZW5kby9wYXR0ZXJucy12MC4yLjMvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAAB1d+eLnigAAJ4oAAA1AAAAAAAAAAAAAACkgWOZEABAZW5kby9wYXR0ZXJucy12MC4yLjMvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAAB+yPj9EscAABLHAAA1AAAAAAAAAAAAAACkgVTCEABAZW5kby9wYXR0ZXJucy12MC4yLjMvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAiAAAAAAAAAAAAAACkgbmJEQBAZW5kby9wYXR0ZXJucy12MC4yLjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAJYe98fqGgAA6hoAACIAAAAAAAAAAAAAAKSBLYsRAEBlbmRvL3BhdHRlcm5zLXYwLjIuMy9zcmMvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAAcJYy3AJAABwCQAAIgAAAAAAAAAAAAAApIFXphEAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ny9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACIfYGs3wIAAN8CAAArAAAAAAAAAAAAAACkgQewEQBAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3L3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAB2nTeu+EgAAvhIAACoAAAAAAAAAAAAAAKSBL7MRAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTcvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAADTQ7DuaQcAAGkHAAA1AAAAAAAAAAAAAACkgTXGEQBAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3L3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAmAAAAAAAAAAAAAACkgfHNEQBAZW5kby9wcm9taXNlLWtpdC12MC4yLjU3L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAMriXk9BgAAPQYAAAdAAAAAAAAAAAAAACkgWnPEQBAZW5kby9zdHJlYW0tdjAuMy4yNi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACLuoeSrQEAAK0BAAAcAAAAAAAAAAAAAACkgZjoEQBqZXNzaWUuanMtdjAuMy4yL3NyYy9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAJ3PE4ldAQAAXQEAAB8AAAAAAAAAAAAAAKSBf+oRAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL0UuanNQSwECHgMKAAAAAAAAAAAA+LTJv6kDAACpAwAALAAAAAAAAAAAAAAApIEZ7BEAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanNQSwECHgMKAAAAAAAAAAAAoKPZetABAADQAQAAIgAAAAAAAAAAAAAApIEM8BEAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAABvm3ti4wgAAOMIAAAkAAAAAAAAAAAAAACkgRzyEQBqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAtCz1mP4EAAD+BAAAKQAAAAAAAAAAAAAApIFB+xEAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAlhNCsnIBAAByAQAAIgAAAAAAAAAAAAAApIGGABIAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvbWFpbi5qc1BLBQYAAAAAuAC4AJk/AAA4AhIAAAA=","endoZipBase64Sha512":"009b2ad92cd398fcaba1dd16287a7039506b0668f649dc770ab13509aca882ec7afaaaf8acd27cd511e5a2851def82dd0d1ea1dded97f8d6a89ee84313f98855"};
|