@agoric/builders 0.3.0-u23.0 → 0.3.0-u23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/package.json +17 -17
  3. package/scripts/bundles/bundle-binaryVoteCounter-js-meta.json +0 -790
  4. package/scripts/bundles/bundle-binaryVoteCounter.js +0 -1
  5. package/scripts/bundles/bundle-committee-js-meta.json +0 -810
  6. package/scripts/bundles/bundle-committee.js +0 -1
  7. package/scripts/bundles/bundle-contractGovernor-js-meta.json +0 -805
  8. package/scripts/bundles/bundle-contractGovernor.js +0 -1
  9. package/scripts/bundles/bundle-econCommitteeCharter-js-meta.json +0 -765
  10. package/scripts/bundles/bundle-econCommitteeCharter.js +0 -1
  11. package/scripts/bundles/bundle-feeDistributor-js-meta.json +0 -770
  12. package/scripts/bundles/bundle-feeDistributor.js +0 -1
  13. package/scripts/bundles/bundle-fluxAggregatorKit-js-meta.json +0 -960
  14. package/scripts/bundles/bundle-fluxAggregatorKit.js +0 -1
  15. package/scripts/bundles/bundle-mintHolder-js-meta.json +0 -740
  16. package/scripts/bundles/bundle-mintHolder.js +0 -1
  17. package/scripts/bundles/bundle-priceAggregator-js-meta.json +0 -990
  18. package/scripts/bundles/bundle-priceAggregator.js +0 -1
  19. package/scripts/bundles/bundle-provisionPool-js-meta.json +0 -915
  20. package/scripts/bundles/bundle-provisionPool.js +0 -1
  21. package/scripts/bundles/bundle-psm-js-meta.json +0 -980
  22. package/scripts/bundles/bundle-psm.js +0 -1
  23. package/scripts/bundles/bundle-reserve-js-meta.json +0 -975
  24. package/scripts/bundles/bundle-reserve.js +0 -1
  25. package/scripts/bundles/bundle-scaledPriceAuthority-js-meta.json +0 -880
  26. package/scripts/bundles/bundle-scaledPriceAuthority.js +0 -1
  27. package/scripts/bundles/bundle-vaultFactory-js-meta.json +0 -1045
  28. package/scripts/bundles/bundle-vaultFactory.js +0 -1
  29. package/scripts/bundles/bundle-walletFactory-js-meta.json +0 -990
  30. package/scripts/bundles/bundle-walletFactory.js +0 -1
@@ -1 +0,0 @@
1
- export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAADfW4gVFCwBABQsAQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS4zIiwKICAgICJtb2R1bGUiOiAiLi9zcmMvd2FsbGV0RmFjdG9yeS5qcyIKICB9LAogICJjb21wYXJ0bWVudHMiOiB7CiAgICAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2Jhc2Utem9uZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4byI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjEuNS4xMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2hlYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaGVhcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMyZmM5NmFlMmZlMDg2NmU2N2Q3YTI4NmI1MjM0MzE5NThlZGRhNjZlNjAwYjJiYzRjNDVjZmMxZDJjNjIxZjY0NDAzZmEwMmFiNTVhZjY3NzA4N2YyMjYwZDJiNGU2ZDY1ZDM2NmY5ODc4YWRlNTk2N2U5ZTA5YTVmNjYyOGRhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTJmNmE4Njg2NGNiNTE3ZjllZTVlMGU5NzM1ZTNkYjE4YzcyYWI1MTI1ODQ4ZmI4ZmI1ZmJiMjc0NmQyYWEyNDUyM2FkZGEyOTI0Y2FjZTE1ZTc2ZWIzMTI5ZjIwNzU2MWVhYTRiOGY4MWIwOGE4Mjk5MWY1YzkzMWMwOTQyOTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDViYTc5MTUzZGI4ODNkZWEwODA4YTkwNjM2ZDcxNmRmMDM0YTcwNmI3Zjg1ZGFkMzc3NzMyODUwOWFjNmZkZjllOTU0YWNmOTk5OTkzMDk1NzRmMTNjM2Y3YWNjOTYxMDM5Yjk0NDliODM1ODQzZGQ5ZDk5NDU1M2FkNzcwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODc4MTgzN2U0YWE1ZTEyZjJiZmU5MmFjMjJmY2Q3ZmNiY2JjYmE0OTRjMmMzMGM1MjU1NjI5Yzc4MzYwNDMwMWZkY2Y3YWFhN2UyYWU5YTY1YWE5ODEyZjljYzRlZGQyNDQ5NGIzYmY0MmYwNTU2N2JjZmM3MzljYmUxZTZhMzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0MWNkNjFlNDM5YTRhNzM3MWRlM2UzZTFmYzNmMWEyYmY0MzhhZDkwMWFjMmNiZDRjMWNlMGJiZTJmMWI0MmUyZWQ0N2ViMGYxYjU4ZDI1ZTMyNjFmZTVkYTY5YTY2MjY2MDkwYzA5MThmN2M0MTljMGYwNDY4ZjI1ZGQwNGMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2Utb25jZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1vbmNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2ZlMjE0MzJiYWJmOWEzODUyM2JmY2MyNzNkOWE0YWE3NTM1MjQzMmQ5MGYzN2U4YjJhNjRhYmUzZTBiZjA4YmI4M2RkYzI5NGQ2Yzk1NjcwMzE4ZDU1NDA1M2VhNDhlNjQ3ZTk2OWVhOGMzMDFlNjQyNDM3N2RkMjM0OTM1N2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJlcGFyZS1hdHRlbnVhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcmVwYXJlLWF0dGVudWF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNmI0YWIzMWViMjkzMjJhN2E3MjIzOTViYmI2YmQ5NGE0MDEwNWQyMmU4NTI4YTA2NDQwOTBhNDllZWIzYmU2ODgzODBiNjZjZmEyYWU1MWIwNTZiOGQxMjJhMzI1ZGY1NjE5YzYwZjJmZWFhODUwOGE1YjJiZjNkZmUyM2YzNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcmVwYXJlLXJldm9jYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJlcGFyZS1yZXZvY2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZWZmZDFjYTczNWY1ZDgxNDE3NGEzMDdlMzdhYWFjZjU0NTc2NjQyNTRhY2Y4NGUxZTNhNmQxMzBmZjhlNDhmNjA2YmZlOTgwMzE4OWM0ZDg4YmRmZDkzYzJjMWFhYWM3NThlMjJjMWU4NGJiYjc5ZmI5OWZjNjE4NjM1MjMyNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93YXRjaC1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy93YXRjaC1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTRkODk4ZTg1N2VlOWQ4ZjY3MGU3MmRjOTBjODZkYWE2YTRkOTViMDAxYzIxMDc5ZjdlMDQ2OTA2MDRjYjliZjY5ZTZiMjdjMTRkZjdjNmQ0ODI4ZTdhMTg0OGJkOTNjMjA1YzYyNjhiYzVkN2QzYjcyNmNkOGYyZDgzODA2ZDgiCiAgICAgICAgfSwKICAgICAgICAiLi96b25lLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiem9uZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTFmYjk1N2FiMjM2ZjdjOTNjMzk5ZDZiODk4MzY5ZmYxMjMwYWEwN2EwOWZlZmVhYTQ1NDk3ZjRjNjc3Yjk3YmJlZjQxMGRjODg5NWEwM2ZjYmE2NWI0YmM1MTYzZWY0MmEzMjc4Zjc3MGYyNjcwYTU2ZTg5M2Y0ZWZiZTM5ZWQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZXJ0cC12MC4xNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2VydHAiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZHVyYWJsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hbW91bnRNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hbW91bnRNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTIxZjhjYTVhMmRiZDRhZTU2ZWEwOTcxM2IzN2Q5YTUxNTM2NzJmODhkMWIxYWI5OTE0Y2EyYjk5MjhhNDQ3Y2FkNmEyY2RlNDkyNTEyYWI1ZThiMDFjZjg0YTkwOTdmNzU3YTZmNWZiY2I1NWI1MzY4MGQ1OTVmYTBmYzk2ZTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWY1OTk1MTkzM2M1NjJkZWRkYjM5NTQ4OWU1Nzk5MjYzZTYwMDU0YjRhNzZhNWI4NjljNjQ1MjE4OGEwNDlmYTEzODg3YmZhODM2ODI2NjljMzQyYzRhYmY3MjFiNmM4ZDRmN2ZjMGZmMTVjZjcxODc4YTk2Y2QyZDk3NDRlOGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGlzcGxheUluZm8uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Rpc3BsYXlJbmZvLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMThjNTYxZTI5NDZhMjcyYTY5YTNhZjA2M2YyNTk1MzI4MDgwMmM3YjQxNDBkYjZjM2YxOWY4ZjJlZTMzYTljMjVkYzA4MWJhMDNlOTIwM2ExODA5ZDc2YWViNzM2MzEzZDdjM2ZhMThiZGM4MWQwYTJlZTBkNWNmZGRiMjk0Y2UiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmFlNDYxZTA2YWE3OTQxMGVhYTcwZTE2NWMzNTQxNjdlZGFlNzUzNGJlOTI3MGFjNDU2ZmQ3OTI3MGJmN2Q4Y2IyMDYxNDAxMmM1MjgzMzUyYzgyNDJkYTE3ZWM1YWE3N2ZlMDJlZGQ3N2Y5ZjliMTU5MTk1MTlkYWNmZDQ5YTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXNzdWVyS2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pc3N1ZXJLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZDY4OWUxZmVmNGI5NTMwZjMyYjliOTExYzE1ZWZjMTY1NmY0NGFhMGQ0NWIxMmExZDI0ZDgwOWU3MDNhM2NlNDFhMDI1YjYzYjg5ZjNiN2Y0ZTljYWY3NWQzOGE3ZWM2M2ZkNTk4NTMwYmRlNTFjNmY2NGM1NmM1YmM1NzEwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRiNWRkNTY1MWY5NDJlZmZhMGE2ZmM5NmI0ZDc0MzczODU4YzAwYzMzZGMxNmNlNTMzMzRkMzIwNmQzZTk5MTVlMzUyYzBmNmQ3YTQ4ZTlhNzY0N2NhOGUwNzgwNzNhNWQ3ZGZjNWYzNjU5ODI4YjFiNDAxNWMyZWUzODZiNWJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2RlZWY5YjAwNTc5ZjFhYTZiYzZiYjkwYTZhM2U2MjllZjc5YTdkYjgwNWNjNTEyYWQ5ZDVhZWIwNTYwNzhiY2UwZTQ1Y2VkZWEyMWFiMGJlNzhiMGU2MGMwMWJmNTEwM2Q0ZjliMTExMDZiNzVlZGZkMTgxZTMyMjhlYWMxNzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTYyNDc2NDMzYTU0N2I3ZDY5YzE5YWIwZDAxMjA4NTgxZDg4ZmRiNWRhMjYxOTkwMWU2MTNiMTU3YmIyNDA1ZjlmZWU5ZGVhZjkxYjdhY2RiMTg2ZDQyNjgxNzQzNTczNDYwZTBlYzY0YmMxNDlmNzI0Y2Q3M2U0NmU4ZTBjYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjY4N2ZkMzkxZjM1Nzg1MTdhOGFhYTMyMmJjNTg0NGI2MGU1YWQ5Y2UxMzExMWJmMDY5YmFlYTE2MDFmODg4NjljZjc5MmQ4YjcwZTNmZTE2NWVkZTExYTc5ZWU1ZTQ0NmRhNmI5ZGMxYjFjNGEyMDU1OGM0ZTdlYTU0ZTU0MzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2MzEyMDlkZTM4NmViZTMzZjRlMDZhOGM4YjFiOWYyM2YwZTRlZjg1MDhmNGRhZTI0ZjA5ZmIxOTExNjA2Mzg0NTZjODViNGE1OWVlNzIzYWY4NzIyYzc5ZWY5ZGM2MmY5NThkN2U4NTNiMDU4YzZiNjQ0NDFjYmZmYWYyNjQ5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnRMZWRnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnRMZWRnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYTViMTI0MWNhMDU0NTYwMGJlNzRhMDIwMWY5ODczMjI2NjVmMzVlMDZmN2JhZGRjMjIwY2RjYTQ3OTQzYzZjMGZjZWMxYTYyOWFkMTY5YzYyNTRhMTgxY2E3MjZjMzAwYTg5YTA1ZTRjODYwNzBmZmYwZWRlN2Q3NjNiYTY3MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wdXJzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHVyc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZWY1Nzg3OTQxNWQ3OGI4ODMzNjBmZTkxYmRiNzQ1MTFhMjczNDFiNDhjMzlmZmJmOTYxYjFlNzg2Nzk0MmU0NWNhNTg5MTk0NDViNThiMDcwY2Y0ZWE3ZWMzM2VhMDM0NWNhMGVlOTE1MTQyYzI4OGM5MDYxYzQzZjQyMTU2MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYXRpby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmF0aW8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ODQzMjk0NTllY2I2NTk2ZmRiOTVlMzM0YzMxYjY4M2ZmNDU1YjNlODhmOWZkY2E0NzM1NmU0OGRkNjY5NmU5MWY0MzdkZWVkMWEyNmEwNmUwN2ZkODg1ZDk0Mjc5NGE5NDczZTlmYTc1ODdiZmJjMzgyNmU1MTJkMDYxN2YxOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MTk2NjIxMTgxN2MwMzNhZDY1NjNmNDRhMTFmYWEzM2E1YTgxN2QwZDM0MWM1NWI1ZTA2ZWJiNTk1ZWI4MmIxOWFlOGVmYmYxYjBjYTlkYzgyZDE5NGFjMTMwYjk1YjMyYzhmYmU3MzYwMjYzZmYzZTRjYTk2OTYwMzJjMmM2NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFuc2llbnROb3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MGY2NGFkM2RkNjhiM2FkNGFhZjcxYmViOTA1YWE3MTk2MzYwYzc0NTk1YjZkZjRiNjRlOTdmMWE4OTE4NzkzYmRiNjI4ZWYzNzZhZWVkYTI5MWViMTI4MDg4OGI4Mjc4YjQwMWM2YWUxODZiYzBlZDY1NzkyZjI2Y2I0MzY1NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQwNDdmNTgzMjQ3MDFhOWIyMjJjNzk4OGI4NzQ3MDA0YjE3ZThjMjY1YTY3ZmVjNTQwYWFmNTU4ZjEwNTMxNDQ5MWEzMzMzNDM5ODdmNTk0NjAzMzU4MGI1MjAxZTJkY2EwNjc1YmY1NzliMDcwMzhiZmZmYjcyYWZmNjcwMmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVybmFsIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9oZWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NhY2hlLW1hcCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYWNoZS1tYXAtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1ldGEtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWV0YS1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2FsbGJhY2suanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NhbGxiYWNrLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjBlZDI2ZDM4NmM0ZTY2Y2I2ZTNiOTA3MTVjOTdhZTZkMGRhNmVjMzMyZjM2ODQ4OWU2MzUwYjY5Mzc3YzBiZGE2MGUwMTBjNjQxYzFkZjc4YmJmMWZhZThkYmMxZTM5MmRhNzMyZmJhM2MzYTdiMzZmOGI1ZDYxMjYzY2U3MTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2xpLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jbGktdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMzIyODFkZmIyYzg0MTRmNTE2ODhhM2RmZDk2MWM2MjdlODk3YzlkN2VmMDQ1Y2M2ZDNjZTQ1NzEwYmQwNzFjYjhlNTZlZDVjZDljMDNjYjgwNzc2NDllOTUzNzQ5OWViYzg5ZGRmNTY3ZjE2NDQ1NGVjNmVmNGUxZmYwMzA1ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb25maWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbmZpZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYwYjEwYjdhNWFmMjQxYWEwYWUyZDZjYzkxYjBjYTBmZDFkMmJlNWYzZWI2ZjRiY2NhNDY5NmZiOTQ5ZWEwMGUwMzljYzMwMDAxM2E2NDU1ZGNkNTg1MmExMTcwZjUyZjM4MjA3NjE3ZGJiMTMyZjc0Mzg4NDBmOTdmOGY1ZTFmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlYnVnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWJ1Zy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyZGYzNDgxOWJlYjhmZjcyMmM3OGFmMWI3OTFlZjgwOTFlNTgzMDg5YWFiNzQ2YWY0OWZlZGE4MDRkOGRjNmUyZWUyMGQ1OGMyNmFmMjYyNjcxNGNkYzJlYzUzMTBhNjQxMDg3YzYyODUyOTA5YjUzYWU0OWIxMGNkMTRmNTU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vycm9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTQyMjRiNTlmOGQ2NWU3YWQyMzM1MzAzNjg0YjFhODFmNTMwYWQ3NTM4YjUxM2QzYjA0YTE1ZjhkZGZkZDM2MWE5NzdhNTdkZThiMjcxNjllMmU3MjQ5OTU3OTY4N2MyODJkNTNhMzFlN2EzZTg1NTNhMzZkMWRkNTBkMmE0YzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDJhZDQ3YzY2MzI1YTZjNTAwMjk4MDExMjg5ZjIzMjE3MjVjNmY2NmM0ZmVmZTc5YzY4NmY4NWY3Y2I2NTYzMmMyNTI0NDVhNDIxZGM1OWNhZjUyNzI0YWQyYjE3NDk1MWNjZDFlZWNjNzcwZTNlNmJhYzY5ZmYxOWY0MmUxNTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvanMtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2pzLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWNhMjU0MDBjZTcyY2E4MTA5MDQ5YzM4Y2Q5NzRhODI4MjQwMDE4NzkwNzc4MjZkYWRkMmRkYzZlYTM0ZTZhMDVkNjc4NzhlZmVhYjRmZGNiNDc2NjI4NzU2ZjRiMjk4ZGVkODBiOGE0OTgzZDU2NTIwOGFjODQwNTY1NWY0OTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5TWlycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlNaXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NzJjZGVmODIzMDRjYTRlYTY0MDZmZjM0YmExZTczZmE3NDcyNzAwOWZiYjBkMDdmMDMwZDFkNmVjN2RjMzcyNjg1NzBiMTU3N2JiZTVjY2RiOGI4ZDc4MGM3NjZjMmE1YjBlYmQ2Nzg5MzhmMDUyZjMzNTZkNmExN2QxN2VhMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWYyMjBhMWM5ZDhiYjkwMjk0NmQyOTRkM2JjNzhmMWNhZmVhNmU3N2Y3OWNjMDY3MDM3OTM4MWUxODk2YjRkMTYwNzA5YzVkYzBlMjhjNjllYjdmYmRjY2U4NmQyMGQ4N2Y0MjNhNzQyNzg4YzdmNGE1YjEwMjc3NGMzMDM1NzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC9pbmFjY2Vzc2libGUtdmFsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsL2luYWNjZXNzaWJsZS12YWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNzBkNjhkYTZiZjc2OWJmOTBhODQyNGI4MjRjYThmMWMxYWExZjQ2MDQwZjY0NTZiZDQ3NTgxNjgyNzM2YjQ1OTZiMTViZjg2MzEyMGJmODI4YWM5N2FmOWExYTNmZjU3OWI3MWYwZWE5ZDQxYWZjNzExNmUxYzJlY2I5YTQ4MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsL3B1cmUtZGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC9wdXJlLWRhdGEuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNDBhMzlmZWUyZmRmZDZiZTI1OTczMzk5YWJjNjY5ZjZjMTkwZTc2N2RiMTdiNjQzMWZiY2NkNzM3Y2RhYzkyZWZhZjliZTA0NjQ2Mzc2NjM0MTNlMTYzM2FiYWI0YTI1M2U5NmNmYTU4ODIwYmNhN2U4NWQ1MWNkZWZlYzhlYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZTVmMDNmMzVmMjlkZThhZTIzZjljYWUzMzJhZjI4OWU2Nzg0M2Q0Y2M5YzMzMTYzYzM4MzNhZjEzYzFiNzdmNTRjYmU1ZjRmNmEwZjMzMjg3N2IyMGM3MTMwZjgzZDRhZWZiNmYxZjBhMGM0OTU0MGQyYjkzOWFmNTQwYzAwYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXRob2QtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldGhvZC10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0MmZjNjI0ZDg5ODA1NmZkNmE0NTZmYmE2MGYwNDNhYWRkZTk0YTBmYzkzNmVkN2ZhYzc2Y2E3YWFiZTA2YzY2ODBkOTgwYzc1NDE2ZWI5ZDc0MDhkM2EyMGFhNGM3M2QxN2Y0MDI2YjhhNmMyN2FkOTlkNDc1OTRiNTcyMmY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ldHJpY3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldHJpY3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NjdlZjNhYWFlYTczNTJmNGIyM2UyNmQxMjA5OGNmNTNmN2JlMDVlOTczMWE5Mzk2NDM4NmM1OTZlMjJjMDJhYmM1OThlZDFkNDJlNDQxYzY0YmIxZDEwN2Y5ZDQwNTk2OWFiNWE1YmI2YzhkZjA1NDgyMDZiMTQ0ZDUyMjI1YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uYXR1cmFsLXNvcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25hdHVyYWwtc29ydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiMTRlMTMwYjdhNDcxNWI4MTkyNzZiYmQ1ZTM4NjkzYmEzMDc2MDg1OGU2OGMwZjM1OGZjZTkwMjU5Y2Y2NjEzZWVmOWE4Nzg4MjQ3OGFjNGE0MmE4M2FkNzY2NDc1ZDFmNTc2MDI0ODBmYzhlYWNlZDI1M2RlNWIzMDRiYjBhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Nlcy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2VzLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzBjNzllZGIyZGQxODdhMzUxYTI5OTNlZjhhOWE1OWZmZDUzNWEyZDM2Yjk2M2U3ZjNmZWRkYmQwZmJjMDhmOTlkZTc5MjEyYTE3Y2I1ZGFmYTFiMzZlNmMyMmQwZjJlNjQ5MDQyYzE0YjcyYWU3OTBmNmZhNDVmMGYyZGJjYjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGVzdGluZy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGVzdGluZy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhmNDVhZjdkNDdlN2JlNTk0ZmIyNDBlYzliYWQ5ZTFjODk1MTAzYTc5YzRmNjE1NmY1NjNiOTQ2NzI2M2RmZTdkNzBhNjczYjFjMjFkNzgyMTEzMzA0NTk0NDllYTEyMmQ1N2E1MDJiOWYzZDczMmM2ZGQ2ZmY0OTI5NWJlMTM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RtcERpci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG1wRGlyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2Y1NWMxNWY3ZmFmZDZmYWVjOTJkMDNmMzdjZjI0NjM3MzdjZTQxZGM5YTA3M2U2NGE4NWMwZTk5OTVlNmYwYjA0ZjBkMmRiMjI3NjU0NGRhMTQwY2MzYzYzNTk4MDk5NjQ0N2Y4ODI0NTM3NTNlMWQ4MGE2YTE2MGZhYWZjOGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUNoZWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlQ2hlY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ZjNiYzdkMjQwODAyMzNjNTE3OTZjNWQwOTQ3NmMyOWNlNzIxYzdmYjIxNjE1ZWJlOTMyM2I3YmFkOTVjMTA5MzI0NGRhYzI2MDViOGYxYmQ4YmU3ZmUxMDI1N2VmNGJiZmM3MjdkMzQ0MDBiNjI2NWM3YjI0M2QwYmQwNjIyZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWJiNGYyNmQ2NDM1MWJhNjZhYTMyNzhkNTA2MDkwMWFjOWJjMDZhYmQ5YjUwMmE1NmMyYmNlODMxNTg3YWFhZjk4OWFiYzkwN2RhYzAzOTZmNTUwMDU2ODUwYjVkNTAxMzMyMTA0NGMzZTkxMzIyYWFjNGRlMGZhNGQ1M2FjMGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3VwZ3JhZGUtYXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTUyOGVmMDQ1NWNlMzc3M2I2NTA3OTc0ZDY0ZTQzMzRmOTYxNDhjOWYxMTM3NDkzYWMyOTRlMWYwYzg0YzQ5OTQ4NjIzZmEwNzNmNjdjZDI5Mjg2OThiNTcyYzgzNDViZDA0ODFlNDNiNmZhMmRmYzBiNGJjOGUwMWE1YTkyYjYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL25vdGlmaWVyIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdGVzdGluZy11dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTExYzBlZGEwZTZiYzQzMjEwOWVlNjUwMTJhNjU4ZWY5ZjEzNTgyZjkxNmY4OWIzZmNlYTM3MzYzMzIwYmI1ZTk2YWQ0MjRmODEyZmU2NjBkNDA1ZmFiZjA3YTM3YjEzYjY0MTA4MGE5ZmYzMzQ2OWJmMDkwMmM1NzhkNjQwMDEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODI3ZGVkYTQxZjRlZmZkNDFkMmM5Y2ViYjdlZjkxNDcxNmU4MDM5MjUwYTNmYzY0ZTMyYWZkYTY1ZmNkMmViMTUzYmMyZWY4NzQ2NWY4OTBkMzFhOWY5NDBjMGQ0MDA3ZGQ4ODU2ODZkNWZjMjViYzBjY2U3MWQxZTJmNzBlZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGFhY2ViMTdjN2I0YmYwMDEzMDI4MmU5YWM0Nzk0YWJiNWQ1MTk1MjI2NzMzYjc4NmI2ZmRmNjA1MDU1MGRkYTFhZWQyM2Q2ZTE2MzBlMzAwZjNkODU3OGFhZDkzZmEzZDg2N2Y0OTAwODBhN2VmZWIyNDdmMjZhOGMzMzMwNTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVibGlzaC1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1Ymxpc2gta2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTMwMTgwNGRmYzRjMzUwNjg2NmY4MDkzM2ZmM2ZmYTZkNzQzZTNjZTA1MmRiY2MzNzk0N2Y2NGRjNjc5NGVjN2Y1ODM3MmFhNzk3OWI2MDlkNzY2MWJjYWYyOWNkOTljMTYzY2Q5ZDU4M2I0MDRlMjQ3ZjU2NWIwZTE4ZGIxNDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZWQtbm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNWRiMGQxNTkzNzA0MTg4YmM2NzllZDRkNTIxNmVmYTIzODhiODczYWRhYWJlM2U2MzU0YWIzNTVjYzg0N2Y2NDQ1ZDk4YTVlMDhhNzU2ZjNlOThjMmQyMTQ3Mzg5NjgzZWQ1MTEyNDNiYzAxZjg5YTU1YmY0YzA1YmExY2RlNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXN1Yi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzdWIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YjI3OGU0NTE2OTE0NTVjY2ExYmJjOWE4M2IzZDM3ODVhODQyYmZjYWNjMDUwMzk3OWEwNDRlM2Q1YzYxYzZkYzA5ZDNhMDE4N2ZmOTUxOTJiNDBhNDg3MmY5OGMxYTgxYzc3NDkzNWFkMTJkMzc0ZWFkMmZjOThhZDkwYWYyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1NGFmMTdkZTBjMDFiY2RmMTM2YWViNjA2MTIyZjU4YzlkNjM0ZmVmMTM1N2Q2ZGY4Y2RkY2QwNTI3Zjc3ZTk1MTBlN2RiMmU3YjE0OGMyNzJhOWEyMTk2ZGFkNjBmYmZiMTM5YzMyZTFiYzkwN2RiYmIyN2E3ZDM4MTNhMDlmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMjc5MjYyYjRjNzljNzBjNDgyOGYxOWIwOWY0NWZjYWFkYWM1ODFkNmExZDU0MDUwZGVlMTEyNjI0YjYwNWI5NGE3MmZlNjViOGQxNDYxZmIwYTViN2Q3NDUyOGE1NDlmMDA3ZDg0MjZiZjM1OTM3NThlYzNmMmRiYTRjMTkyYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90b3BpYy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG9waWMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZTg3ZDJlMTI0Njk1NGU1YzQxNDRlNThkYzc2NmU1NjAwMTliN2M3MTA0YWEzNzIxNDgyNGEyZDhjYWYwODA3YjBiZWE0NzU4ZDU4YWViNTc1ZmM3ZmZjYWFiNjE4MjFjOGVlNjA1ODEwZjY0ZTZlOWJhMzYxMTE4YTYyNWVkZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ0b29scy90ZXN0U3VwcG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZWQ4NDEyYzkyZWJhODA0ZDY5NzE0YmIyNWQ0OTE2MWI2MWQzMjk3YWZiMjg1MGE5MGViNzQ1NTg3NzM2MTQ4ZGFlNDA2ZDI2NmZhZjU2NTYyNTRlY2NhNzZmNTQxMTRhZTk4YTljZWE4NzhjMjNlNjAyZWM2YWRjOTdkNGM4MSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NtYXJ0LXdhbGxldCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cC9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3R5cGVHdWFyZHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy91cGdyYWRlLWFwaS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92b3ciOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92b3ctdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC90ZXN0SmlnSGVscGVycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3Rlc3RKaWdIZWxwZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy90eXBlR3VhcmRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbnZpdGF0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW52aXRhdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjN2JjOWYzYWZjMzA5NDc4YjQyZjkwOTE2NjMwZjAzNmZlN2U2NzQ3NTVhYTgzMmE3NDZjZDRmOTk0MmVlMWNiZmU4MGU2ZWQ2MTVlNWQ2YjgyMWViNmY1ZTkwYWMwOTNhMWU0NjU5MjUyNTQ2MDQwNGUwYjg5MTJhYjZiMjhhOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9vZmZlcldhdGNoZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL29mZmVyV2F0Y2hlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcwNTdiOWMwNWVkNjRjZjcwZmE4MDgyOWZkNGNiNjVjZmI3YTJkNDJkZTZhYjQxNzBlOTBkYTg5OTY1Y2ZjYzViZDY0NDQ1OTgzYjgyYjZlZTg0YWRhZjIyNWRjODFkYmRlMjRhYTZiN2Y1NGY0OGQzMTQ4NjNkNzNkNGIxYTFhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL29mZmVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvb2ZmZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzRhOGYzMTIyNjY0OTU2NmQ3N2YyNzNlNmY2NWYxMGIxNjQzZTgzNmVkODlmMDI2OGZmOTYzOTBhOWViNzA2MjgyZjE4N2VjZjUxYzUwMDhkMjk2ZTUxNGRlMzdmOGIwZTYwYzZiYzY2MWUzNDU2ZmE2ODJjN2IzNWU5ZWFhNTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc21hcnRXYWxsZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NtYXJ0V2FsbGV0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2U4N2UyYWZlMDNiZmE2ZGUxMDE5YzdjNjc5ZTM1ZDMyZDc2NmE3ZGFjMmJiZjJkZGQ4NTI4NDQzYjgzN2I1NTE3Yjk1NmMxZjE0MDZkYTkzYzIyNWY3NDE4YmJlYzJkZmYzOTUzNzc1YTI4Zjg5NjY0YTBhZTZhZDA5ODMxMWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlkNGRiYjc2Nzc3ZTFhZDZkZjg1N2VlMTNlYTVhNGNlMzI1OTA0ODQ2NjZjOTJjMDJiYzk1OTMyMWE3NzZkODc0NzdmZDU4ZGE2YWI1NzMzZGQxY2Y4Y2VmNjc0OTJiMDMzMGM2ZTJlOTZiYzMzOWZlMGNhOWJmNDIyYjMxOTljIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0MzIxNzU0YTQ5NTcxM2NkZmRmYTBmMDhmNGUwNmY1MDYwMjU1ODViN2Q2ODViNTBhMWJjMzQ4YjExZWUwNzAwMGFhMWRkYjM4YTQ4NmM2ZmM3ZTZkNjUwZTE2Y2I4Y2UwMDE0MTlhMzRhMjJhMzUxZTMyYTQ4MDY2NDdkYmE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3dhbGxldEZhY3RvcnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dhbGxldEZhY3RvcnkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNGIyNjNiYTU2NTVjMjRkMzcwZmZlMTk3Mzc5MTJjMjMzNWFlNDA0OWE0M2RlMDI2YzhkM2U1MzA3Y2VlNDU3ZjA2MGYzNzlkNTVjZTRhYmQzYjQ2Nzk2Y2ZhZTA5MjlmZGRkYzdkZDFmNDVhMjY2MzVjODM3ZDUzM2RhMTA3NyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zdG9yZS12MC45LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvc3RvcmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTU4Yzc5NmE2N2Q3OTQyODc5ZmQ3MmNiZmQ4MDliOGU2MDEyNjFmNWU4NDI2ZDBkMDMzM2NiZDAzNDk1YWNmZDJkODFmOTQ2YzA5Y2QyNzBiNmM2YWFmOWRlZGY5NzljNGViOGYyY2I1NDNkNzI0N2RiOWJkYjIzYjQxMTI2YjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRjMDNkNWE4MGY3MzlkNGVhZjZmMjY4NDUwMTZhMjQyMGQ2MmQyNGRhNzcyOWI4MDlkNzAyNGZiNjhkMTQ4NDQ5ZTViMTVlNzgwMmU4NDZiZTU5NWU2MGNkOTUxNDc4MzM2ODY0ZGFjNmRiM2QyMjJkNzEzMjcwY2JhYTcwZWMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRjN2UzYjI5NzE5NGEwMDUxMTNhMWE2M2Y1ODZjNjMxN2FlMjQ0YjA2ZDQ5OWI3NWRiZjEzOTFiYTg1NjE3Y2RlMjIzZTg3NWFhNDUxMmRmYTRjMmM0ZGM0NDEzZTI1YTk2ODdjMGRkNTUxNzE2N2RhMzg0ODQzZmUyMTRhNTc5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTMxNGM0ZWE0MjQ4MGI1MGE0OTgxZGM4YzZiNDg5MjNkMDg5OTU0ODU1YzczZjZhMzhjOGE0ZDYzYjVkZDUyOWEyNjhkZDgzN2RkMGFlMTc1OTljY2VjMTA4M2YyMDI5ZTA4NzIzMmJkMzJkNzZmNzI3MjI5YzIyYjgxMzgzZTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZWU5OWZkYWQxNWRhYTk0YmQzMTg1MTMyNjliNzkyZWFmYWVjYTcwZTY0NDg1NzlhMjQ2ZjNjMzU1ZDBiZTAwMjVmZjI5MGQ3NmNkOGRkZmQzYzMxYTI0YmZjMzdmN2VlNWEzYzg4ZDU3ZGJhYTUyZjFmNjc1NjBhMzM0MzEwNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzI0ZjQ5ZjJmNDA0MzQzNGI4Mzc5OTZkNDU2OGEyYTYwNjUzZTZlM2IxNTE1NWMwYWY4MmIxM2Q0MjBiMjA1NzllOTFjZTAyZTIyZjE0MGE0ZDUyNTk4NDdjMTllNzI4YjNmZjI0ZThhMGRiZDc3YWM3YzdiZDQ0MTc2M2ViYTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIzMGRlOGNlOTM5Y2UyMDBkMGMxMDYxNDZkYmYxOWUzZmNkOGFlYWExYWVkZDNiMTNlZDAzOTc4MmU5OWY2N2ZlMGFiZDI2ZmM0MWFjMjM4MTEyOTE3MjYzNGQ5MGE0ZjY1NGZkMTgwNThlMzNhN2IyMDU3ZWQyMDNlNjVjM2RiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjdjZmVkYzIyY2U5NDgyOGM0ZThkOTA3YWI3ZDQwZTE4MjJiZWVmODU1OWUzMTZiYzA4ODNlMDZiZDgzYWJlMGUxZTJjZDc1YTI3YTI4MDU4N2ExMjEwZTFkMWIyNmJlZDc1NDlhNWQyZjU3ZDBhNmNhZDVlZTlhZDBkNWI2ZGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdGltZS12MC4zLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdGltZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMGJjNGIyMWEyOGMzYTViNzZmNDdmYWRhNGVjMTc2MWUxMTU5YzQxZTFmZWJiZjA5NWVhZWQ2MTE4ZTE3MzZlNTk0NjAzYzE4ZWYwMjRhYzU2ZjZhNWFiM2YzY2YwODZjNWY1YjU0NGVkZTEwMDMwMWZiMzU4MjljNTFhYjI3ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90aW1lTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGltZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NzA1YTQ4YTkzMjc2Y2IyMzE2ZTNjNmI4MGZjMWJkNDM5ZjZmZWM1NzZiNTJhODQ1ZGM5ODhiNmUyYmU5NGExZWRlOTIyNmM2YTIyYzZmYjg4MDg3YWZkMWEyMzVhYzgwYWNiYzJhMTlkMjlhZTk5MTgyZmQxZDhjZWIwNjhjZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzYxYjA2MDI0YzJkZDMyZjdjZTFjODRjM2ZlYzNjZmI1N2FmOGQyOTJmMjFlN2I4ZjI0MDE1MzcxYzE3ZjIzMWMxYWUyZDRkMTdhMGQzNDg2NmExYzZmODA3MzI4Y2VmYWYyODlhYWU5Y2FiNWJiMWFjMGJlNjI0MmI5M2I5MTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdC1kYXRhIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTY5YmIxNTcyODI0OTk2ZThjYzY5N2NlYmFiNTRhMjBhY2MxOWNiZWFkMGZiZWEwNTM4ZTY0NjE2MzJiZjI5MTdkY2E0ZTc0MzlhZGE0YzJkOGI2M2YwMWU3OTJiYTc0MDU5NzU5N2RjMzdlN2MzNmE0MmJhN2U3NjRlOTU1YzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDcyZmUzYTY4Mzg4M2U4NWNjNGRkM2I4NmE4YjVmYzFmMmJhMWY2NzdlYjgwMzMxOTkwZmQ1NDUwNTZmOGYxYTMxYmQ0ZTY5MzU4ZWJhMTNjZTkwZDFhMmM1Y2MxYzMyZmY5NTkwZDI5MGY0Y2Q4NzQ1OThlODdkMDI3OTczOTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODM0NGYxZGFkOGYyYTY1MDUzZDdhZWVhMGI5NmNlYzBmZmQwMmI5OWE2MWFjNzIxNzUwYmZiY2ZjYWNjNGNiY2NkMGNjZGFlY2Q4MzQ4NDM1YzNhZjcxY2UzODZjNjgwYTMwYzM0MjhmNzRiYTE1ZjMxMDk3Nzc2MjY2NDhjNTMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdm93LXYwLjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy92b3ciLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92b3ctdjAuMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdm93LXYwLjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9qcy11dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2pzLXV0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdXBncmFkZS1hcGkuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhYmU0NTkyNmI3MTFjMzZkMDhlZjczM2RiYTg0ODk3NDIyZmQ1Yzg4MzllN2Y0OWViNzQxZTgyY2JiMGEwODk3N2JlY2QzZGZlZGE0MmNhYjBmMWYwNzJlMjNhM2Q0ODA0YjQ2MDYxZGU4NThmZDQ5NzVjOWM2MTVmYjI4MDlkMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNDYwMjc2Njg3NzIwMmViYTNlNGExMjdhMTVhOTMzNDE0NDgzNjQ5NTUyNzNhYzY5MGIxM2Q2NTY2MTVkY2YyZTliMDE2MjU4YTk2MWQ4ZmE5ZTRlZGM0NjIyYWE2YjA2ZTYyZTY1ZTgzYWRlYThlNjU5MWQzYzVhNGEwMWE4NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWMyYzk3NmMwODE1YWNjNzEyMTNlZDQ1OGMyMGYwZTFlMWZiZWY5ZmNhMTExODUzZjUxMjBhMWUyNWVjNjMxOTJlNjc0MmI4YmQ0ZWZiMWRiNGE0ZDEyODRhMTg3ZGY3OTcwMzhhNmU2MmIzZWU0ZWE5Y2E3ZTExNjAzOGZmZWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVqZWN0aW9uLXRyYWNrZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlamVjdGlvbi10cmFja2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWEzOTJhNDYyZDRlM2Y4NTZkMmMzYmNhMWY3MTg1NDU2MGVlNDkzOWRjN2I0MjZlNTFiZDc0NTYyMzQxZDU3NzRmOGYzYzE2Nzg5MTc0N2M1MGU1YTgyNWZmY2NmNTQzYmY0NmM2NTYxZThkZTU0MzgzMjI3ZjI5ZDg0NmJiYTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmV0cnlhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZXRyeWFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NWZmMzk2NGI2NGRmYTRjOTliMmNlMTc3OTQ0M2Q4ZDA3YTA1NWVhYmVhMzExMjdmNTJmNTk5MjE3NGNhM2JmNTQ2MmJhM2Y3ODhjODYyOGY2MWU5YTFjMzJlYWE5NmFjN2NlNjUxZmFhMjU0YTA3YmEyMjRjYzEyOTcyYTZlYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYWRhN2JkOTcxMzIzZTY2ZGNkMDkyYWU3MzEwZTExNDFjOWFhZTMxNmI5MDc0MWFlYzkzM2Q3ZjQzZDAwNjU3NjBkYzU3Y2MyMmEzYTdmN2Q4ZGQ2MDNlNjAzNzExNTdkMGM5MWVkMzIyOTZjYzYzNThhMmI1MDQxOWJjZDU4NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2Zjk1MmRmNmFkZTNhNzFkNThjOWMwZTk2MTY0YWExZjk0OGI4ODYyNzQ1N2YxNDZiY2RhZmIzNjM1ODE2OGZmOGQ0YWNjNDU1OWE0M2ZhNTE4NmFjNmI0NDgxNTU2MjRhMDFmOGI5MTdlM2NkZDkzZGYzN2M2OGNjMjRiNzcwNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92b3ctdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Zvdy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI3NWYwM2RjNzE2NDgwODAwYWZiMzA2YzdlYmIxNzRhOTRkZWQ5NTMzYTdhYWY3MmQ1ZGY4MjAyNDRmNGQ1NzhkNDE5MDRkZWEwNTJmNzdhZGJhMmYyZjRlOGQxNjc1ODZjNjE2MmNkYzZiMjNhYjk1N2I0NDFiZTNkNjllNzRkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Zvdy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdm93LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2E2NjYyMWUyMzY4NWU0OGE4NDAyZjYzOTQwNDYxYTAyNTc3MWM3YmJjNmQ1OGM1YjBhNWFhNmM1NWJlZTI5Y2IzZDEyMGMxNjYwMTFkZDQ0NWMwNjBjNTlhZWQ1MGI2ZDcxZmYzOTViZDZlODJmOTJjMjg1YTE5MWY1ZjQ4ODYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvd2F0Y2gtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dhdGNoLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjY2YjgxMmY1YzdhNzMzOTM0N2Y3YjkyMWY1OWZlYzA2ZjQzMTM4ZWI4MjA0Mzc2NDBkZDk4YjMyMjAwZmJhZWNjMGVhYTZlMTNhYTIzMzQ1MTdmODIxNDMwMDJhNDM1MTA5NDdjY2RkNjIzNTc1MGVlOTk3MDJlNWIzMTI3OTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvd2F0Y2guanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dhdGNoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTNmMTY3ZTFiOWFiY2I0YmIxYTYwODVhYWExMTQzZWQxMWEyZGI4YjE4ZGJlOTU5NGEyNThiNThiNDI4NDViNGUyMzM3OGZmYjI2NWQ2ZGUxNTBmNzI1N2RhOTI1MmMwODI3ZDAxNzZlY2FjODdhMmZjYWE0Y2YwY2U3ZDY3YTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvd2hlbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvd2hlbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdkZmNkZjhmNmE1YTMzMDAxNjNjMmJiZDU0NWMzOTRhN2FjMjBkMGE2M2I2NTIyZDUxZDBmODRjYjVmOWMxMTU5MmY3MGQ4OGIxMDBkYmFjYjRlZmE3OGI1ZWYwYzQ1YzczNmIzNzg4ZWRiOTg1ZjhlZTZmOGVhNTEwNjA0NjA3IgogICAgICAgIH0sCiAgICAgICAgIi4vdmF0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInZhdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFiZjg3ZGZmNDI4YmZkODZlNWY2MDdjODQzZDFkNDJiZDUwMDlhNzBkMTc3YWE5MTM0ZWFiNzBmZjZiM2M3NzJjNzU2YzdmMWI1ZDlmY2QxMWY1YWMxZjJmN2U1ZmI5MzQ2Y2RhMTNiZDkxMzU5MGE4MDU1YTU3Nzg2NjkwYWY2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9iYXNlLXpvbmUvem9uZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vem9uZS1oZWxwZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9yYXRpby5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAvc3JjL3NhZmVNYXRoLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvc2FmZU1hdGguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNTdjNTY2MzZlYjFlNzUxMzBhODFiZDAzZTFjN2ViMWFlZTcwMmZhMTMyZGVhZjEzMzlhZmQ1NGQyYzQwNTBiYjQyMmNjNDMxN2M3ZjQ2ZDU2ZTBhNzdhMTRmNjE4MTQxMmQxYzZmMmY3MmVhZGVhMTViMWM0OGFhYzJjMTQ2YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ1NGM5NTFhZmRhNzY5ZmZmMGNkYzI1MzI4ZThkMzc1M2EzYmYzNjRlOThlNjRhMDAwMGEyYjhlMWVlOWQwOTQ5MzM1ZDVkNGM0NzQwMmU4M2I2ZjQ1ZmNlZmJiOWEwZTY4YjdkMzY3NzZiNTcyNzlmMjIxMDNmY2U2OTllZjA0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9ib25kaW5nQ3VydmVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY3MjNkNWM2ODY3NTgyODI5MzkzMTRjODE5ZGM1OGNhZTQ1MGM2MWM0ODljNThkMTNmNGE4NmE3MzA0YjE5NWQ1ZGUyMDE0Yjc2ZTRmN2FlOWViMmJlMzYxOTJiZmU1OWZiZDg5MjYyZjk5NWJlNjA1NGMxZGY0ZTczZmZlNWIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk1ZjkyMDBmNzEwZjc5NzIxMjllNzc3MzRjNTVmZjk4MzI5YWY1ZGZlNzEzMDQyODk4NzJiOGVlYmU5NDQ5Nzc0ODE5ZDdkNzIxMDU2ZTA4N2U1MTkzMGNjMjYxOTMwY2RkZWUzZDVmYTRlM2VjMjAxZWNjMjBmZThhMzZhM2FkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzhhOGI0YjZlNWFmNjgyYTUyZGE4NWM1OTFiM2MyYzVmMjI5YTljNDRmNGFhNGI0OTVjZThmMjZiMzdlZTIyMmY3YWY0ZDhlY2RmN2RjYTFlYzMzMDYwOTFkNjU4MDExZTlmZGEyZDUyZTQyYTllMmZiZWMzOTE5MjMzMThlZWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3ByZXBhcmUtb3duYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3ByZXBhcmUtb3duYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFhYjQ0YzcwYzlkMzcxN2QyZWIwNzM0MTRkMThhZGViNDhlYjkzNzAxNDlmY2ViMmJiNzJmODY0Mzc2MDY0ODExNzY1YmNhYWI0ZTcwODkxZWY2OGMyZDI0NTBjMTAwZjYyZjJkYzc2YTAyMWQ0MTU5OWJkMTUzOTAyMmJlM2ZkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTY4NTZhYjdhMmUyMDdiYjcxOGM5Mzc2ZDdiZDIzMDg5N2VhNTQyOWM1NDBlMzYwMWM0ZTY5Y2FmYmM3N2I5OThlMTE0MDhlNWI3NmYyNTEzMjIxYTE5YWUyMzdmZmRlZjliMDJhMmZiYzBkMzUxODZmNDBjM2NiNTFlZjdlMDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWQyMzBkMDFiZjE0YThjZmEzNTYwOTdlZjU5MzY2OTMzZjdmYjBmMTJmMTMwNGMyN2ZjMmU3MDg4ODA0ZTdhYTI2ZWJjNGQwY2NlYzMwNjBmZDMzMjgxOTliNTgwNzIxZGY3NzU4ZTI5OWRiMmUxZDdhNGM3N2VmYWI1ODMzMzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3Y2RjNTk4YjMwNzUxNmZhMDM4MmI1NTFiNjI4NzM3YzVkZTcxYWFjNGUzMjMxZTc4Y2FhZmI0NDhjYjM3ZGVkNzQ5ZTlhMDUzMWI4NThjZTQzYzAwOWZlNDE3Mjg5YjU3MGRiNDM1YmYxNzk0NzFhMzAyZmU0NTA3ZDM5YjY0ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODRiYWZlMGVjN2YyZWQ0MmEzYTdlODk5MDUwMjQ4MzAxYWE0YWQxN2NlMDU0ZDdkZjQ2ZWJhZWM0MzMxMzg2ZGY3NWE3MGI3YzVmMTc5NWZkMDhkODQ5MTZkMGU1NjA5Nzc5N2U4MjM2MmQ5YmU0NjY5M2JiZDU3NjBmNmEwZTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0aXN0aWNzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmYyOTY1MzM3MzE2NDdjYjM5MzNhYmE5M2QyMWY2MDQwZTM1MGY1NTYyOTAwNGU3M2NmYWY2YzQ2ZTlhZTcyY2EzNDFhMDNlYzZlYWY2ZWE4MDZlNjE4OGU1MDBlNzQyMDkzNzY2ZjMxOWJmYjY1NDc3NzRjZjJiYzhiZjFkYzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3Rlc3RKaWdIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvdGVzdEppZ0hlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMjE1YWQzNGUyNjI0MjExY2U5YzNkNzdiMzJiZDE1OTQ0ODFiYzlmZmYxYzVhMDEwNjY5ZGNhMzhiYTg5NzY4YTg2OWFhZDBhYmE2ZDhlNWQ3NGIxZTQ4NmQ1MWZkNWVkZWFmOTIxNGUzNjQzNjRiZjUwOGU5N2RjMjk3ZjY0MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWQxY2U0OTgzMzkxYTg5YmYxOTgzZTg1Y2Q5NzVlMmMyODVjZmEwZWI0ZmVlMmQ2MzAzNGNlZjk5YWEzOWZhZjc5ZTVjOWRlM2E5YjkxMDZkNDg1ZjVlM2VkMTdhY2EyYjZkOGQ2ZWJiN2ViYWUzYmJiZWZkMGNkODU5MjlhYTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODc5Yjg1MGFmOGFiZjI2ZjVmODkwMDhlMDVmZmQ0MGRmNzEyYjBkZTI1M2UwYTM4NDcxYjA3YjY1NDQ5ZjMxZmRmNzczMjYwYzIzMWZiNjdkYWMwYmVhNGUwY2Q2YTNlNjI4YTFjYTZkMmM2NjUxMDZjMWM2ZjFlM2JjMDQ5NmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1MDYwOWM3ZjhjNTc4NjY4MzhhZTBjNDIwNWUzNzdlNzM2MTI3OTNjMTU4MmYyZjg3MDQyMWJjZjczYTBlYWQxOTcwNjY0YzNlMzQ4MWQ2YjQwNDQ2MTVkNzYwMTM4OWViNWIzNmU3MTkxNjJjODYyNjEyMDg2MzcwY2U2MmY1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvbmUtdjAuMi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvbmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYmFzZS16b25lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJkdXJhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjIwOGRlZjhkZjFjYmUxNDE4NjY5ZGVkZjgwYmRmNTk1MzU4ZjUzNjZkMTE4OGFjMDRmZTRhMmNiOWM1M2NhODg0ZDg1MjE1YzkwZjFiODdmOTQ5YmIwNDhhNzk2ZWU1YjZmZGExM2Q1MWEyNTllMjU3NDQ2NDgxOWQ2MjJjZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZHVyYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxMzAxNTJlZjQxZTAzNTAwNTRkNTA2OWE1ZjQzN2UxZjJhMTQzZmI2ZjhkZTZhY2I0N2YwOTRkMTc5M2IxZDNjM2RiMDcxMDA4ODhkZjc1NTliNGRiN2MzN2U3NjNmYjk4OGI5MzRlZTE4YmYwNDJiNmNjYTAyOTNkMjk3ZDM3IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jYWNoZS1tYXAtdjEuMS4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9jYWNoZS1tYXAiLAogICAgICAibGFiZWwiOiAiQGVuZG8vY2FjaGUtbWFwLXYxLjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jYWNoZS1tYXAtdjEuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNDlhZWY0ZjU4MWU4MTAyZjk4Y2E0OWFlNDJlZTNiMWI1YWM3YjIxMDU3ZDNiMTdmMDliZjA4ODNkMGMxNWJhMTM1ZDQzY2MzMDMzNTM3ZDYyNzc1NGFiZmVkMTNlNWU5NTY1NjAxNTJjMzhiNTk1ODU1ZDg3MWU3NzRhMTEyNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jYWNoZW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2FjaGVtYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNDIyM2U3YjNhMzZkZjM5YzVjZWM3MjBjOTRjMzc0YmVkNzViNDE1MmExNDAyNmE2OTVjZWY2YmRhZjM4ZGQyNjYyMTUzN2U4MDQzZjgzNGZmOTA3MjE2ODA1ZjQ4NWNiZWFiYjQyYTg4ZTM5NDQxZGQxNGZmZmZmMGQzOTcyMCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY29tbW9uLXYxLjIuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2NvbW1vbiIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXBwbHktbGFiZWxpbmctZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OTc0OWNkMzc4NTg4N2NkZWU2ZmM2ZGI4MGZlYjlmY2VmNzFmNTJkZjM1YjMyNzRhOWM3NGJiMjhlZTM2YzgzMGU1ZTc5MjRhMTJlOTczZjNmYTRiNmIyNjBiNWFkOWQ1MTQzZGU4ZjgzZWVmYjE5YTBhMjhlMzEzYjdkNDBiNyIKICAgICAgICB9LAogICAgICAgICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZnJvbS11bmlxdWUtZW50cmllcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1ZjJlNTU2NWNhNDFjOGIyZjFhMGIyMWY3MzM1NzJiYjBlNmY5NzU1MDNmN2MyNmQ3YzE4MTc1Y2E1OTZiMTliYmJlMjgxMzM0MDdiYjc2M2Y4MGY0NDg1YzA2M2EwMjRlZTVjZmQ5ZTA4MTY5ZDc1NjBkYzQ4OTljNjdhYjVlIgogICAgICAgIH0sCiAgICAgICAgIi4vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpZGVudC1jaGVja2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzk5MDQwMjhmMWM1NjExNmE0NjczNWM3NTRlNTZiZjM5MWY1OGEyZmEyZDMwYjUxNTdhOGQ5YzlkNTg1MTcyM2Q2NzFmYmY1MjI3ZGMyY2JmM2MxYmI1NzY0NDdhY2YwZDRkOTA5YWVlYjFmODFhYzI0OTI3OGE1NjYwZmJmMmIiCiAgICAgICAgfSwKICAgICAgICAiLi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibGlzdC1kaWZmZXJlbmNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzc3YzBlZmE5OWYyOGFjNzdmNGMwOTQ5Yzg0NDgzOWIxNmVhYjIzNmNiOTE5ZThlYTQ4YjY0OWM0OGQ3OTE4YmVkZGNkMGMyY2Q4YWE0MDE3ODI1NGM0YzYwMWRiZmVhMTY3OWFmODFlMjY2MmE3OWI2YzEzMDk4NDY5NjQyYmIiCiAgICAgICAgfSwKICAgICAgICAiLi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm1ha2UtYXJyYXktaXRlcmF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTllZTNhZTk5MmFhYTg4OGJiZTQxYjMzMDJiMjA0ZDFmZGYzNjAwZmNkZTdkODZlNDRmOTRiZmE1MzQxNDIzNDk4OGIyOTI0OWYyN2E2NDY4OTliM2VmYTljMWFiYTFjYWI5NDAzMzg5YTZiOWY0NTg5ODk0YWYyODA0OWU5OCIKICAgICAgICB9LAogICAgICAgICIuL21ha2UtaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibWFrZS1pdGVyYXRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUwOTJkZDgxOGU4ZTBjYmM2ZWExYjZhZjBjMjFkZjVhMmU4NmVkMTg5NmUxZTdiNzEyYTc5YmRiMTA4NGJlMDY5ODlkYjFiYmI5ODRlYTk0NDM1NWI5MWZiNjY0ZTQxYTE2N2QzM2FiNTBjYTFlYTAyODE4ZmQ5MjRmNzE1ZTMzIgogICAgICAgIH0sCiAgICAgICAgIi4vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2RmNTkyY2FjNzFjODVjMzFlYjk3NWM5MjE3NjZmMGZjMWFjMDI1MTExMjhjOWFmMzVmMjE1NTgzZjY5NDhhODU4Yjc5YjhmZmVjMzFkNGU5ODgwYTM1ZWY5YmFiN2IyYzJlMDZiMTM4YTA2MzJiMTE4ZjU4OGYxMTg3MjNjM2MiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWV0YS1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAib2JqZWN0LW1ldGEtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTc4MDNlOTA4NWYxNmNhMDFiY2FmNTUwNmI0ZTU1YjllYjE0Zjc3ZmQ5YTMwNzU5YTI5ODgyMmNiYzQ4ZjEyNTU5OTNiYTYxZmRmMjExM2JhMTk5YzEwYzBmNTM0ODMxODFjN2I3YWEzZWNmOGUxN2IxZjNmODBhYTUzMDdkNWUiCiAgICAgICAgfSwKICAgICAgICAiLi90aHJvdy1sYWJlbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInRocm93LWxhYmVsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkN2ExMDU1OGM2NTZhOThiNWY5ZDAzODRjNzlmOTRkZjk4MjExODBkMDBlOWMyNjk3N2IwMWY5YWJiNjhjNTE5NmJkZTUxYzMwZjEyNjE1ZmRjOTU3YTUwODA1NzU5MzNkMDkzYjI3ZmUzOTVkMjAwMTIwZTM0YWIzZDg5YmQwMiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZW52LW9wdGlvbnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjYTc2ZWQ3YzZiNjU2NzFmNzBiMjY0NmY2ODk0MzU3MjRkOGI5OTMwYTVmZjI5ZDFmYjMyN2VkOTZmZDQxNDQ2OTUyNTg5NjJkYWZiOTgyODYyYTJlZmMxYjAzZDBhZDk2YjMzYzJjYWU1YmViZmEzNzI2ODg2YTA2ZjY2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwYzgzMTM5MTY3ZmI1MjQ2NjgwY2YzYjYwODlhZTZmZTIyY2UyYWQ4MTY4NWM2M2ZkYzYzZWI2OWM2NTIyOTgxNGE3ZjhiZDViYWJhMTYwYzI2NWJkYjQ1OTUyYTMxNTM5MWRjNTM3YmUzMDM5NTY1ZWE3ZjAxYzg4OTZkZGJjZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vycm9ycyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzBkN2ZmMTdiM2QyMmI1ZTNjZDkyOWNhYjJiZmExYTUxYzc3MTIzNzAyMDU2ZmRjNjY0ZTc3ZmQ2MDgxNTMzMzYzMDYwNzA5ODA3ZDk5MTRhYTBlZDhjYThlYTgyNDlmMDFjNTgxNDVhNDJkMjdiZGFmN2MzZDcxMWQ4ZDMxODIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OTI0OWFhNzJhYmUwNWExMjAxMmQ5M2ZlNTI1ZTBkZmZlNDM5ZTc3NmViY2ZlYjE5YzIyMWFkZDY3OWJhMmQ4Y2ZlMGMxNTE3ZmUyN2Y4MzBlMWFkYTk2OTA1YWE2YmE4NjE0MGM1ZDkwYjI5YzllNTZiNGEzNGQ2MmQ0ODlmYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbG9jYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xvY2FsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjhmODMyNzVmYzc1ZjE4MTA4ZmFlNDg2MDdkYTBiZDM5ZjI1YTgwZDFjMjU5MjNkMzY2MmU2MmRiNGZmZWEyMDBlOGI1YWQ4NTk3MzZhYTFmNGExYmZjZjEwZjU2MTY3NTgzMjUxZjlmMThmMGQ5YmVkMTlkMjc1MmUwMzZiZTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEwMmVjM2RjZGM2MTczNDlhZjlmMmUyNWNhZGUwOWM4ZGUyOGEyYTEwYmIzNmE5ZjMzZTFhNzg0ZThkMWJkNzRhZGU4YTAyMjhjNzJiMGU1NTEwZWJkZThhYWZmZTg3NjZmN2RlMjk3MThkMWQ3NThlNTNlZTE2MDFlZTZkZjIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1OGIzMTU5MDU5NGQ5ZTc1NjRjOWQ2MTU1NGU1NjcwZTM1MDA1ZTJhZGYyMGMxNDA1MzUzNDI0ZTAwOWRlMTc0NjIyN2UxMmNmZWIwNzU5YzgxODM5MTBjZDJhYzEwZjgyMDFhZTBiYjdlMGIzODQ4ZmU2NzI3NjBiNjNhZGE0ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZDgyMzEwOTlkYzM1NTMwMTg1YjNlNjM2Mjk2M2NjOWUyMjg1YzQ0NDg3NWM5OTdkNTA3YWExMzEzYTg2OWY3ZTU1Yzk2Y2U3ZDYxZjE4MTg2MWIxNjhiMjY3MTVkY2FkODcwODYxMTcxZTI2M2I5OGQzZmU1MzY3NzM4NTQxMSIKICAgICAgICB9LAogICAgICAgICIuL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDYwNzEyMzhiMjVkMzA3NjZmNDQ3M2IzNjA3NWRiMDUwMDRhMzA5NWI3YmE2YWRkMDQ0ZDk4NjY1YzdlMGMzYzMwOWQwNGQ0MzU4YWFkOGIwNWRkOGZjZjAwZjdkZjI5NjE1NWM1ZjgyOWIyZjhiZjM4ZGRiZWZiMTBkNTgzNDkiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V4by12MS41LjEyIjogewogICAgICAibmFtZSI6ICJAZW5kby9leG8iLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzk0MTQ3M2MzMDViZTU3ZTc3ODMxYjg0NmI1ZGQ3MmYwNWIwM2U5NzcwNjk4NDE3NGFjZDFmM2ExM2ZmOGNjYTQ2YzJkNTEwMGYzNWZjYTdkOGYwNzE0YTVkYmQ5M2RkMDliN2U2ZGI2ZGI0YzYwODkzOTljMjQ0ZWM0NmNjYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLW1ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLW1ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ0NDc0ZjcxZjY3Yzc3ODNjNzdiYWUyNjM5ZGE5NjQwMWNhYjdmYmRmNmU1MDYwNzI2MTI1OTA2NzE2NjA5ZTdmODcwZjkyMWMyMmZhOGMzNDliZGJkYjRiODQzM2QxODhlMmVhZjk3ZjllZjIwNDI5MDU0MjJiNTA3YWFkN2RmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjllZTliYWMyZmE2M2U4M2Q1ZWU3Yjk2ZDFjZjkwNmQ5Y2EyZjJmNWE4MmJjYTg0ZmZjNjM2Y2JjMDk4NTJmMDJiMmJiOWU4YzVkOTJlNTg1MjI3MjEzNTZhN2ZkY2VkNWRjZGUwNDgxNWQ0ZjM4MjVmMmFjM2NiNTgzMjQ4OTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZ2V0LWludGVyZmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM2YmFjY2ViYjNiNmNmNGU1NjRjMjA2YTI1ZDlmMzg3MWM2NWRlNmY3Mjc0NjhmNGU3ZDBiNGUxMDEyZGFhMzc2Y2E4ZTkzNjA1MGM1YTJiYjlkNDhhYTI4YWMxMWFmMWMyMGY3NmZjZWFiNDAxNWUwZWZlZjI4MjgxNzUzNmUxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9mYXItdjEuMS4xNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZmFyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YWJjZTViMDU4NDYwMWFiNTUwNjk5MDQyZDE2ZTY2ZDA3NGMyNTViMDQxOTM2ZDJiMDc4NzMyYTY0OTI3YzM1MTVhM2Q0Zjk1MGVlOTYwOTllYTA0ZWQxZGMxNmU0ZjRhODhhZWIwZDgxMWI0ZWViNGQ5N2E0OTJkZjUwNGQzYiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MS44LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ODg0MzBmY2I3ODZiNTYxY2YwM2VjZjY1OWRhODgwZmM4YzRhNmJlMjFlYzZhMjU2ZmQ4ODQzYzkyYmM2NmMxZjEwZjk4MzcxY2M4NWMzNjcwZWE3Y2NmNzQ0MDBhYjExMmU0ZDEwYmNjMzliNjVjZTA1YjQ4NzUyYTI4ZDJjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OGQ0MDAxMzJlMWUzNWMxYTlmMjYzMDFkMDg4MThiMmRkMjBiZTZhODllODc0OTM3YjNiYzkxZDc2YjkwODZhMTAzYzNiN2JiYWIyYjUzMjU3NjVhMDEyODViYWQyY2Q2MjM5Y2IzMDk5ZDM5ODM3ZjM3NDZjZmI3YTU0OTJhMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZjOGI0MjY5N2RiZWUwMjMyOTk0MjQ5ZWJiMDlkMmE3ZDI5ZDNjODc5YTFhMzljMDYyOGMwNzIwZGQyYWU1YjU4YTE1N2Y0NjIxMWY5NTM5ZjE2ZGMyYzYxMjU5YmJiYWM1ZjMwNDIwMjYyMmQ3ZmFkNzU3MDhkYjAwNDlhZjc3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0NGEyOTY1M2RkMTI1MjRiYjc4MWVjNmU3OTRlZDBmNTU0ZTIxYjgxYzNlOTdiMzliNmVjNWIzOTk3ZGRhYWMwNWFlNWM3Njc3Y2IzYmYzMDM0Yzg3NmU5MWIwOGVmMjE2MTlkNTU1YmUxZWJkZWUwMzA2Y2FkNzRkYTU3NGQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ4NmFlOWYzZmZmOWVjMDhlMDRjMTMyNjBiOGE3MzY3MGQ4ZmNmNTdlNmJlZTk3NDRjNjI3MmQxYTA2MDcwN2NlMzRmZTRkNWQ0OTkwNzY0ZWY0ZmYxNGM5OTIzMzc2NWI1Nzc1NjQ0MTM4YmNlMTMyNTYwNzhlY2ZhZmMxNzMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUyMjg5MWU0YzA2NDMxYjU3ODQxMGQzNzZjMjllZTE3NTYzODlkOWU2NzI1MTU5MDJjZmFhMDdmY2FlOGRiMjQ2ZjRmNDQwZGRmMDU5Yjc5ZjRlYjYyZjFjNzU3NzdmZGQ1YmZhOGZjY2Q1YWFmNDE4MTY3NDJlZGE3NjNjYjcwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ODBjYjVmMDY3Y2UyMmE3MTMzNDAyZDI3MjBiNzNmNDE4M2E1NzgxZjIyOGRhYzIwYTZhNDM1NDg4NzJlZWQ1YjNjMjRlMGZiNTM4ZTNhYTJkMzgzOTFmZWI4Y2VkODQ2MDQwYzg3NmE4MmZjYzY4YTc0ZDNhNzQ1OTZiNTc1ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI3MDUyOWViNDFlZTQ4ODQwMTI3YmMyZGQ3YWI3ZjhhMjI0NGRlM2YxZmEzMzRlNGY1OGVlYTQyMWNjMzA1ZjU0MmYyZTdhM2ExNzc4NmM4N2ZjOTA0MzAxN2U3ZDdjNjM3NWRhNGU1MTRjMTY2MGJiODMwMzAwZWU2ZDM4YTFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjUuMS4zIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ4NzBiMTFlMGQ5NTg0NjkxNTZlYjA3MTFjZjFhMGE4YThkZjQwNzk3YjIyMjVmMTRiNmI0YWU3NmM5OTg1YzI3NDIyNDA2YjA3OTYxMDk0MjM0NjAzMzk2YjBiNWNhYThhYmE3NmE5MmNkZTZiZTQyZDg1YjE4NmY4NDdjMDBmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaWRlbnQtY2hlY2tlci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ZTI0NGQ5NDA4Y2VkYjVmMDhkMDJiMTFlYmMzZDkyMDUzNDUyMDZkYThhMmUwOGQ2ZTFiNmFmNTBlYzk4ZmEwNGQwMmE3YzA4NTFjOWVlMDUyYzFlN2YyZGMwODZmNDlkNThmODBjZmNjNGJkOTZhMjkzOGQ4MWQ0ZDkyYWMyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ieXRlQXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J5dGVBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVmN2FkZjk0ZGQxYjE2OWIwMzcwYjk0YWFjNGNiOWM4NmE0MDhhY2ZhMjA0YTY5ZWY2NGYxNGM0NmVkMDQyZjg0ODAzYzM5YjRkODE1NTc5MTBjMWQ2ZTkzZDMwNGEyMjE0OTZiZDcwZWY4YWI4OGIzZTdiZDFjOWU5NGE0YmU1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmM0ZjFjNjZjY2RjZjEwMjVkNTVlMjQxZDU1OTlkM2E4YTk4YjAwMjZhYjEyZmFjYTU0YTAxNWM0MTgxZmQzNmUxZjJkZWE2NDg4OWJiNmQ5NzFiZmZiMmM1MDZiNzkwMjgyZjViNzRkZWU2ZjZjNDI1MDc2Y2RhYTUzZmVjMmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE2YjQ2MDEyY2I4MGY1MWRmNmQ2ZDYyMDAzMmUzNTk3MWJkYTNiOTUxMDUyYjgwMmQ3YTU1MzczYmMwYTY1ZWRmODFjN2IyZGRjMzc5OTI3ZjEyZWViYWYxZGM0YzkwYmQ3NGU0MTQ5NmM0OWZiZTNlMzhmNDQ5YjMwMTMwZTIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDcyOTcyNGUxMDNkMzE3YTE2NmI2Mzg0ZWFiZmUwYTQxZGY3MjJlZTg4ZTA4ZmNiMDJlYTE3M2ZkMTY3NmNjN2VjNDU3NzM1ZTdiZjAyYzk1MjQwYTY1ZGM5NWI5MTIxZDU0YTIwNzFkNDhhYWVhYmJmNGQ0NDNhZWE1MWY1OGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGQyMmNiZGY5OWQ0NTIxZDJlMTdiYjlkNWMxY2ZlMGQ1OWU3NTRiMTVkMWE4NTlhOGFiOWJlMTJlMWNmYzIzMzAwNDgzOGNkMzY5OWVhNDA3NmY3MmU5ZjI4NGNkOWFiY2Q5NjZiN2FkODJmMDg3ZDNjYWMyOGQ2YjEzMmZhMWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YTVkZjA2NmQ4MDI2NjVjYmNmYzgxMDcwZmNkYWJmZDEzYzczMDlhYTU0OTRlNThlNWFjOWQyMDNjNjAxYzdkZTVmMTAyYTRjYzY3YTJjMzQwZjcwMGI2ZDRjY2RhZjAxOWE0YTJjY2M5Y2ZhMWZkODc0ZDI1MmM4YjQ3YTFlOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMjIwMGFjNTkwYzZkZmIxYzEzMmFiODQ1Y2RkNDNhMzYwMjBmMDgyZDdiMWM5Yjc0YzFjYjNmNWFiNDVhYzVhMTQ1NWMwNmU5ODQ5YTNmZDRlNjIyMDE0YTI5OTQxM2M1NzU3YWMwNjIwYTdiYjM4ZDM3OWFjNzg3MjIxZDMxOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2NkNTJiMDg0YzIyYWExOTcxZWUwNGZiZWFkMjg1ZDdhYjQzYzgwNmZhNTNkZTliMmJkYzg4OGU3NTc2ODg1NDc0NWU1YTcwMTdkYzQ0NDNmM2FhMzg0NzhjZDNmYjNjMWFkYjMxOWRkMzgxN2YyMTNiOWJlNzI3MmNhMDI3N2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2U1ZWUyMmY5NTE3MDk1Yzk4NmI0NGRlOTdlMzc3YWVkZTUxZjZiNjI1ZDk5MGNjODQxZjEyOTBlNTc5MTJmOGMxYTE0YmU0YzBjNmFkYmIzZDk2NjIwZmZmZmUxYTJhODc3MjhhZjZkZDgwNzhlNGIzOTg5ODAyZTg1OTg0YjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWE4MjQzZGFkNzU5NGYzMzEzYWNkMzI4MzQwZjY3NmMzY2JiODU4ZmZiNWI2ZmQ0OTQ0ZWI3YzQ2MjkyZmY2MjU0NjY5ZmJlNTc3NTEzNjEzMjc3MzYxYmY1Njg4OWYwMTQ1MGQ1OGFlMjUyMDdkMzc2M2E5ODhhODZjYTBlMmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOThhODIwMmY5MWM0N2ZmYThhZmE4MzAxMTZiODAxYTRjMGIzMmFiYzk4NjE0MjZmNDNiOWQyYWY5ODM0MjAzODAyODFmN2ZhYWE0ZGZmM2RjMTcwYjljZjA0OTkxMTUzODE4YjRhZDhhYjBjZDkwZDdmYTRmMjNlOGNiOGE1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhNzBmMjEzZGMyMjUxMWZmMzVlYTQ0OGU0MGQyYTFmMjgxMzE4NjgwNTBjMzFlZDM0MmY3NjUyYzE5MjE0YWI3Njg0YWZkYWI3YTAwZGFmNDcxMDk4ZTEyOTNkNjY1MWJlODg1NjJhMGQxYjk0MWU3ODk4ZDk1Mzc1OGY3MmZmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0cmluZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RyaW5nLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2FiOTI2MDhlNTE0YWUwNzI0N2I0NTdhMjg2YjU1OTFjYmFiNDJhYTdiNGEzMDk2NmJjYjU4Nzc4Mjk2MGU3MzU4MTg0NWY0Njk4NDRkZWU0NmRjNzFiZTk5MzFhZDliZjU3Mzk3MTcwNjVhYzMyNjdiOTViZjdkMzJiYWI2ZWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZDJmMWY4YzQ4NjcxZDY5NGEzOTM3Y2I3MDU4NzA2ZmM5M2JkNjYxNmZhOTY2Y2NjYzQ1MmFhYzM5NGU5Y2UwMjJmY2M0ODAzNGIzNzQ2NTk5NzQyNDI5MTk3MDIxZjVmYThhYmI1M2U5YzBmOTdkYWYyNmY4Zjg5MGM3ZDhhZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE1ODNkZWQxODA4MTUzOWY0MWE4MTE5NzE1N2NjMDVhZThkYzFiYWU5NWMyYTY3ODc2OGE4MmFjZTExODk1NDI3MjMxYTM2ZTliMmFhYTc5YWRiZTVlZDU4YzNlYzU4MDI2YjJlN2ZmNTg1NjY2MDYxNzhmYjg5MWJlYjU3NWE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjE4ZTNiYmQxZjZhMGQyMzBiMDQyMGVlMTI2NmY2N2YxY2I1M2ExYTI2YmMxZjE0OTY0ZDZhZWQ0MTk5OTZhMmFjYmU0NDVlMDgyZmFhNzM0YWZkODc2MjE5MWU5MjVlMmQxZDU4MTUyNDFjODI5MGU1YmQxOWI3YzllN2MyOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9wYXR0ZXJucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2lkZW50LWNoZWNrZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjOWI3YWJhMzI1YjNhOTQwOGJiOTc3M2QyYjgyMzQ4ZTBlYzVjOGE4ZWZkZDQ3ZmNjY2U1MWQ0YzUyYWJmMmZkNTAyMGZkYWI5ZWFmMGQwZDA1MjhiNzkxNzBiZjAzZmMyOTA2YzMyNjJjY2QwMmIxMWVmYTMyZWUyMjM3YzczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YmJhM2FkMzUyYmM1ZDQzOWYwN2YyOThhNGI5YTkyNmYxZDBiYzUzMzdhYWI4OGU4NjA5ZDVjNDY1MTYyNTE2NWUxNDdiNDc5N2IxMTc1NGI5YWUxMDQyYjZiZTA4OTdjMTc4YTlkNmZiM2RmYTEzN2E4OTZiOWIzYjgyMzVjMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDc5OGEwNzA0OWRlOWU4NzE2MmJhNTMyYjIzMDA3YWFhMTc4MmNlMjlhODc5NzQ5MmE0MzgwMzg0MjQ3YjhhYzQ5Y2YxZGVhMmFkMzA1NDY1NDIwNjk3ZjIzZWVhNDVmNjQ3YTlkMjJlZDQyYTJmYTAwOTkwODI4NWM1NjkyMmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYmM0Y2Y4YzQxMzVlMWQyZTE4NzYyZGU4YjY3YWFjMzFjOTZlM2FhMzFjYzRhYjRkNjExOTg3ZTM3ZGY4NjhjMmJkOTJkMGNjNzNiYjQ3NzRiZGIzMWNiNmJhYjExYmFhYTg4MjZjYzIxZThjYTcxY2ZjN2Y5NDU3NjExMDI1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMxN2Y4M2Y1M2Y5MTJhYTkzZThkZWQ4ZTk3NjZjZGMzYTI2NzE3M2VlZDM1ZDUxZjA1NDgyYWM1ZDc2MTAyYzZjZDQwMzVmZTk5OWNiOGY1MDNiY2FkMjg4NTJiYzdiNDA4MTQ4YTM5N2ZmNzRmOTI1YjI5YzM4NTk1Y2E4MGQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZDFjZWQ1ZjEzNzU0Y2NmZjQ5ZGMwZjgxMGM4ZTZkNTI3MjdiZjJjNGVjNzdhOGRkOWE1ZmY1Nzc0OTVjNGFmY2Y0ZGEyYjhhZjQzNmM4NDMzNmFmOTlhNzFjMWNjYjc0OTBmNmJhMjk3ZWMxOTVmM2YzN2NjNzgwMWVhZGY2YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRlMDk1ZjdjNDU4NTcyYjUxMGZhMzM2MDNjMjA3M2QzMTI5MTUyZGYzZjc0ZDNlNjI3YjM5MzE5MTlmNjY5NGE1NmZlYjg0OTc5ZjhhZTk1NDBkZDQ2MmMwNjg0YjZlNWJiODliYmQwYTg3ZGVmMjJlYTkzNzUzZGVmNzkzNGEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjM0MWQ4ZjU2NWRkNmFhMDMwODJhMzZlMTI1YWM5OGM1MGNkZWE5YzMyM2E2MzNkYThjYzQyZTZiY2U5MGY0ZDAwNjA3ZDQ1MTY0OTQxMTBlMWJmZWRhNGNmM2IyMjFlMDNiM2VlY2Y0Njk2ZWNhOWRiYTZkNmU5OGEyMjRkOGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUzNWE2ZDBiMzBhYzc4ZWVjMzgyN2FhMGY5MTllOTZlOTJmNTNkMTZhNzUzOWZiYTY4MmY3MzllMTZkZjFjZjNiNzIwODZmZDY3NTQyZjc5MDAyYmI3NzZiNmEwZjQ4OTg3ZjRjMDk0NWU1YzZkMzllYzA5Y2E2MTk3ODMzZWU1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTgzOWY5MzM2NmY2OGYwOGQzZTU5NjFiOTQ1MTg1YzA5NDEwMWI3YjczMDdiNWRmZjdmMzQ1ODg4ODY5NDQ4ZDE3MjA2ZDYxODg5NzQ1ODBhMTc4OWQ3NGE3Yzg0OWRmZTc2NWU0M2U0NDU1MzM2YWVkMTM3YjhiMGNmOWQ0NGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmRiMzI0MDAzNGM5MWFmMWMwYjRkNTljZTVjMDljZDhmYjIyM2ZjNTFiMTU3MDEyZWVmZTJkMzMyYmRmN2E0MzkyMDU0NmZlNTcxMzJmMGM1MTM2MzJhOTA5NTNmZjM3MTAwNDI5NDk2YjdiMWMwYzA5YzU3NzQ1ZTMzZjdhZmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc3ZTM1MmZkYzVmY2EzNzdiNDAxYWMxNGEwMzQ2OGUxNDZlMzU3MmEwMDkxNGFmMjAyOTMxZTU4ZmZiOWUxYTQzMjQ2MDZmYmJkMWYyMTRkM2Y1NzY4MTk1ZGNkY2M5NGI3MjFlMTBmZWFmZGEzMGEzNzg1OGUyZjM0MTQ3N2MxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmJhYzQ3NjAxNTY5MzIxOTNiMTBlMWU1MWJkNWE4MTVhM2E3MTEwODEwN2I1ZWNlMzJkNThkZjJkMTQ4MjZmMGJmODVhZTc4ODE5YzYzNzQ3OTc2NzQwNDg4YmZhYzg0ODVjYjBmMmE0ZDk3NzVlNmEyNWJmM2ZlYjMxYzQxNjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzExNzg2YTBhNWNhODA5Y2NhYzFmMTk4MDdhM2I2MTBjNDExMzAxODE3OTZhZWQyZTM3ZGNiZTFjZDhlNDU3OGJkMjA1NTEyYTVmYzlmYjMxMGY0ZmNkNTk0NWQ5NjJlZjI0OTNjMzEyMzQxNTdhOTM0YzVkNWFjMzQ1YmU3YTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3N0cmVhbS12MS4yLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9zdHJlYW0iLAogICAgICAibGFiZWwiOiAiQGVuZG8vc3RyZWFtLXYxLjIuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vc3RyZWFtLXYxLjIuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxMDFkZjE2MDk4Yjc4YTZhMzFjYzM2YWQwNzZmOTNmZTI1ZDk0NjE2MWQ3NjM1Yjg5ODU0NmU2YzBmZjlkOTg4ZmM5NzE4ZTlkNDhlYmY3YjNlZGQ4OWU0ZjI3MzRiODhjMDk0ZDgxNzg4ZjA1NDdjOTNmYThhYTM3Yzk3MWI0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJqZXNzaWUuanMtdjAuMy40IjogewogICAgICAibmFtZSI6ICJqZXNzaWUuanMiLAogICAgICAibGFiZWwiOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJqZXNzaWUuanMtdjAuMy40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwYWYxMDk5NzI5MDFlZWMzZTdkOWMwMWRhZTI2YWVkNjc5ZmYxMGM2YjhjMmVhYjlmN2I4NTAyYTI3ZDkxNWY0ZmMwZDg4Y2ZmMjVmMTViNjk4NWY0ZTFjZTJiZDQ1M2I3ODMxMGJmNmMzYzZhMjU4MzNjNTFiMDcwNjViMDMyOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDdkZTZjYmI1MWUxNmEyZGQ1MjBmN2U1NjYwYWRmYTNkMzZiOWQyMGVlYmE3Y2QzZDAzNmEwZDViZmQ2ZDE0YWQ4NWY1NjM5MDBmMTZjNmEwN2JjNTcyZmY4NDM2YzNmZDFhZmRjNzU2NzcyMzcwOTgzNzQzZTZkMjRkNzQ3YzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjU3ZThjYTlmNTA0MDNlMGQ0Njk2MmZjODQ1Mzk1OGVmZGM1MzAzNWFkODliYjBmNDZjZjEyNjM2N2Q3NjkyOWU5YjNiZTEzZWY5NWM0NTI3NmZjYjg0NjA3OWE2NDE1ZDczYmQzNTM5MWZhNjYwZGYxNjIwNzliYTcxOWIyZGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhmZDUyZWYzMDJjMWYxNGM2MjBmZGRkNDM3MjdkODIzMjQwM2I5YmQzNTYxZTFmMTIzZGNlOWQ0ZTlhMTNiNTVhMmQxZWU0YWQ4MDcwMmYyNTExMTllOWQ0OTJhOGM3YTM0NWZlNTcxYTQ3OWQzOTFlMmI3ODFmZmIxMzhjMDA2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL21ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFrZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYThkM2M1ZGM3ZDQyYmE3MmZmYzZmZWIyZDk5MTMxYTc5M2MzNDE5MmM1OTE3ODMzMDllMGRhOTFkMTAyOTIxZDhlZDUwNmQ5Nzk1Y2YzYmVmYzZhNzkzZmM2YWIxODAzMWZmMmJiYWRkYmRiNDc2NGM2ZjQ5ZmY4ZTkwM2JiZTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjIyY2QyMzBkYzIxZjZhOTE3NDI3NDVjNThkZjU5MjgwNmFkZThmMTNiODdmMjkwZjA4Njg5YmNjY2M0ZTYxNDc0NGNkZjQzZjhkOWYzZWU2YTFjNTZkOTEwODMxZTM5N2I2NjZiY2I4MDk4YTExMjYyMDAyNTM4NDBmZTY1MDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc0NmI2YWJiY2VhNzBiNTEyMGEwNTQyNjM5YTk4NWQ4OThhMjVmMjVhMjM5NDBlY2MwZmEyNmU2ZWZjOGQ2NTJhNWRiOWFlNWE3NWVjMjc4Zjc5YzQ0ZDg4MDBkOTdhN2JkZWViZmU2NTczM2IzYWI2NjRiYjIzNTNjNDY1NWVlIgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAMYBI+I0BAACNAQAAIAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9oZWFwLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2hlYXAuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9oZWFwLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2hlYXAuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAATMwWR8wsAAPMLAAAkAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9oZWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9leG8iLCJAYWdvcmljL3N0b3JlIiwiLi9tYWtlLW9uY2UuanMiLCIuL2tleXMuanMiLCIuL3dhdGNoLXByb21pc2UuanMiXSwiZXhwb3J0cyI6WyJtYWtlSGVhcFpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXIsaXNQYXNzYWJsZSxtYWtlRXhvLGRlZmluZUV4b0NsYXNzLGRlZmluZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJNYXBTdG9yZSxtYWtlU2NhbGFyU2V0U3RvcmUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxtYWtlU2NhbGFyV2Vha1NldFN0b3JlLG1ha2VPbmNlS2l0LGtleXMsd2F0Y2hQcm9taXNlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVcIixbJGjNj19hID0+IChpc1Bhc3NhYmxlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXhvXCIsIFtbXCJtYWtlRXhvXCIsWyRozY9fYSA9PiAobWFrZUV4byA9ICRozY9fYSldXSxbXCJkZWZpbmVFeG9DbGFzc1wiLFskaM2PX2EgPT4gKGRlZmluZUV4b0NsYXNzID0gJGjNj19hKV1dLFtcImRlZmluZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAoZGVmaW5lRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhclNldFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyV2Vha1NldFN0b3JlID0gJGjNj19hKV1dXV0sW1wiLi9tYWtlLW9uY2UuanNcIiwgW1tcIm1ha2VPbmNlS2l0XCIsWyRozY9fYSA9PiAobWFrZU9uY2VLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL2tleXMuanNcIiwgW1tcImFnb3JpY1ZhdERhdGFLZXlzXCIsWyRozY9fYSA9PiAoa2V5cyA9ICRozY9fYSldXV1dLFtcIi4vd2F0Y2gtcHJvbWlzZS5qc1wiLCBbW1wid2F0Y2hQcm9taXNlXCIsWyRozY9fYSA9PiAod2F0Y2hQcm9taXNlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7U3RvcmVzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQHR5cGUge1N0b3Jlc31cbiAqL1xuY29uc3QgZGV0YWNoZWRIZWFwU3RvcmVzID0gRmFyKCdoZWFwU3RvcmVzJywge1xuICBkZXRhY2hlZDogKCkgPT4gZGV0YWNoZWRIZWFwU3RvcmVzLFxuICBpc1N0b3JhYmxlOiBpc1Bhc3NhYmxlLFxuXG4gIHNldFN0b3JlOiBtYWtlU2NhbGFyU2V0U3RvcmUsXG4gIG1hcFN0b3JlOiBtYWtlU2NhbGFyTWFwU3RvcmUsXG4gIHdlYWtNYXBTdG9yZTogbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxcbiAgd2Vha1NldFN0b3JlOiBtYWtlU2NhbGFyV2Vha1NldFN0b3JlLFxufSk7XG5cbi8qKlxuICogQ3JlYXRlIGEgaGVhcCAoaW4tbWVtb3J5KSB6b25lIHRoYXQgdXNlcyB0aGUgZGVmYXVsdCBleG8gYW5kIHN0b3JlIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VMYWJlbF1cbiAqIEByZXR1cm5zIHtab25lfVxuICovXG4gICAgICAgY29uc3QgbWFrZUhlYXBab25lID0gKGJhc2VMYWJlbCA9ICdoZWFwWm9uZScpID0+IHtcbiAgY29uc3QgeyBtYWtlT25jZSwgd3JhcFByb3ZpZGVyIH0gPSBtYWtlT25jZUtpdChiYXNlTGFiZWwsIGRldGFjaGVkSGVhcFN0b3Jlcyk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEBwYXJhbSB7YW55fSBfb3B0aW9uc1xuICovXG4gIGNvbnN0IG1ha2VTdWJab25lID0gKGxhYmVsLCBfb3B0aW9ucykgPT5cbiAgICBtYWtlSGVhcFpvbmUoYCR7YmFzZUxhYmVsfS4ke2xhYmVsfWApO1xuXG4gIHJldHVybiBGYXIoJ2hlYXBab25lJywge1xuICAgIGV4bzogd3JhcFByb3ZpZGVyKG1ha2VFeG8sIGtleXMuZXhvKSxcbiAgICBleG9DbGFzczogd3JhcFByb3ZpZGVyKGRlZmluZUV4b0NsYXNzLCBrZXlzLmV4b0NsYXNzKSxcbiAgICBleG9DbGFzc0tpdDogd3JhcFByb3ZpZGVyKGRlZmluZUV4b0NsYXNzS2l0LCBrZXlzLmV4b0NsYXNzS2l0KSxcbiAgICBzdWJab25lOiB3cmFwUHJvdmlkZXIobWFrZVN1YlpvbmUpLFxuXG4gICAgbWFrZU9uY2UsXG4gICAgd2F0Y2hQcm9taXNlLFxuICAgIGRldGFjaGVkOiBkZXRhY2hlZEhlYXBTdG9yZXMuZGV0YWNoZWQsXG4gICAgaXNTdG9yYWJsZTogZGV0YWNoZWRIZWFwU3RvcmVzLmlzU3RvcmFibGUsXG5cbiAgICBtYXBTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy5tYXBTdG9yZSksXG4gICAgc2V0U3RvcmU6IHdyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMuc2V0U3RvcmUpLFxuICAgIHdlYWtNYXBTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy53ZWFrTWFwU3RvcmUpLFxuICAgIHdlYWtTZXRTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy53ZWFrU2V0U3RvcmUpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VIZWFwWm9uZShtYWtlSGVhcFpvbmUpO1xuaGFyZGVuKG1ha2VIZWFwWm9uZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSGVhcFpvbmUiOlsibWFrZUhlYXBab25lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABVusfp5AgAAeQIAACUAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vZXhwb3J0cy5qcyIsIi4vbWFrZS1vbmNlLmpzIiwiLi9rZXlzLmpzIiwiLi9pcy1wYXNzYWJsZS5qcyIsIi4vd2F0Y2gtcHJvbWlzZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyIsIi4vaXMtcGFzc2FibGUuanMiLCIuL2tleXMuanMiLCIuL21ha2Utb25jZS5qcyIsIi4vd2F0Y2gtcHJvbWlzZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2V4cG9ydHMuanNcIiwgW11dLFtcIi4vbWFrZS1vbmNlLmpzXCIsIFtdXSxbXCIuL2tleXMuanNcIiwgW11dLFtcIi4vaXMtcGFzc2FibGUuanNcIiwgW11dLFtcIi4vd2F0Y2gtcHJvbWlzZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAtTNWRIQMAACEDAAArAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pcy1wYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiaXNQYXNzYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHJlYWxJc1Bhc3NhYmxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiaXNQYXNzYWJsZVwiLFskaM2PX2EgPT4gKHJlYWxJc1Bhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBJbXBvcnQgYGlzUGFzc2FibGVgIGRpcmVjdGx5IGZyb20gYEBlbmRvL3Bhc3Mtc3R5bGVgXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtzcGVjaW1lbiBpcyBQYXNzYWJsZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGUgPSBzcGVjaW1lbiA9PiByZWFsSXNQYXNzYWJsZShzcGVjaW1lbik7JGjNj19vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlIjpbImlzUGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbBWnPyIEAAAiBAAAJAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMva2V5cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYWdvcmljVmF0RGF0YUtleXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXlNYWtlcnN9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgKi9cbmNvbnN0IGtpbmQgPSBsYWJlbCA9PiBgJHtsYWJlbH1fa2luZEhhbmRsZWA7XG5cbi8qKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgKi9cbmNvbnN0IHNpbmdsZXRvbiA9IGxhYmVsID0+IGAke2xhYmVsfV9zaW5nbGV0b25gO1xuXG4vKipcbiAqIEtleU1ha2VycyBjb21wYXRpYmxlIHdpdGggYEBhZ29yaWMvdmF0LWRhdGFgLlxuICpcbiAqIEB0eXBlIHtLZXlNYWtlcnN9XG4gKi9cbiAgICAgICBjb25zdCBhZ29yaWNWYXREYXRhS2V5cyA9IHtcbiAgZXhvQ2xhc3M6IGxhYmVsID0+IGhhcmRlbihba2luZChsYWJlbCldKSxcbiAgZXhvQ2xhc3NLaXQ6IGxhYmVsID0+IGhhcmRlbihba2luZChsYWJlbCldKSxcbiAgZXhvOiBsYWJlbCA9PiBoYXJkZW4oW2tpbmQobGFiZWwpLCBzaW5nbGV0b24obGFiZWwpXSksXG4gIHN0b3JlOiBsYWJlbCA9PiBoYXJkZW4oW2xhYmVsXSksXG4gIHpvbmU6IGxhYmVsID0+IGhhcmRlbihbbGFiZWxdKSxcbn07JGjNj19vbmNlLmFnb3JpY1ZhdERhdGFLZXlzKGFnb3JpY1ZhdERhdGFLZXlzKTtcbmhhcmRlbihhZ29yaWNWYXREYXRhS2V5cyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhZ29yaWNWYXREYXRhS2V5cyI6WyJhZ29yaWNWYXREYXRhS2V5cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpG42q+g4AAPoOAAApAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9tYWtlLW9uY2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZU9uY2VLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAaW1wb3J0IHtTdG9yZXN9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7TWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqL1xuXG4vKiogQHBhcmFtIHtzdHJpbmd9IGxhYmVsICovXG5jb25zdCBkZWZhdWx0TGFiZWxUb0tleXMgPSBsYWJlbCA9PiBoYXJkZW4oW2xhYmVsXSk7XG5oYXJkZW4oZGVmYXVsdExhYmVsVG9LZXlzKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVidWdOYW1lIE9ubHkgdXNlZCBpbnRlcm5hbGx5IGZvciBkaWFnbm9zdGljcywgbm90IGF2YWlsYWJsZSB0byB1c2VyIGNvZGVcbiAqIEBwYXJhbSB7U3RvcmVzfSBzdG9yZXNcbiAqIEBwYXJhbSB7TWFwU3RvcmU8c3RyaW5nLCBhbnk+fSBbYmFja2luZ1N0b3JlXVxuICovXG4gICAgICAgY29uc3QgbWFrZU9uY2VLaXQgPSAoZGVidWdOYW1lLCBzdG9yZXMsIGJhY2tpbmdTdG9yZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAvKiBXZSBuZWVkIGEgZGV0YWNoZWQgc2V0U3RvcmUgc28gdGhhdCBpdCBpc24ndCBwZXJzaXN0ZWQgYXMgcGFydCBvZiB0aGUgem9uZS4qL1xuICAvKiBUaGF0IHdheSwgb3VyIHVzZWRLZXlzIGFyZSBvbmx5IHRyYWNrZWQgZm9yIHRoZSBjdXJyZW50IGluY2FybmF0aW9uLCB3aGljaCovXG4gIC8qIGlzIHdoYXQgd2Ugd2FudC4gIFVzaW5nIGBkZWJ1Z05hbWVgIGluIHRoZSBsYWJlbCBpcyBnb29kIGZvciBkaWFnbm9zdGljcywqL1xuICAvKiBhbmQgc2luY2UgaXQgaXMgb25seSBmb3IgYSBkZXRhY2hlZCBzdG9yZSwgaXQgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIHRvIHRoZSovXG4gIC8qIGJhY2tpbmcgc3RvcmUuKi9cbiAgY29uc3QgdXNlZEtleXMgPSBzdG9yZXMuZGV0YWNoZWQoKS5zZXRTdG9yZShgJHtkZWJ1Z05hbWV9IHVzZWQga2V5c2ApO1xuXG4gIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICovXG4gIGNvbnN0IGFzc2VydE9ubHlPbmNlID0ga2V5ID0+IHtcbiAgICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCBGYWlsYGtleSAke2tleX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgIXVzZWRLZXlzLmhhcyhrZXkpIHx8XG4gICAgICBGYWlsYGtleSAke2tleX0gaGFzIGFscmVhZHkgYmVlbiB1c2VkIGluIHRoaXMgem9uZSBhbmQgaW5jYXJuYXRpb25gO1xuXG4gICAgLyogTWFyayB0aGlzIGtleSBhcyB1c2VkLiAgV2UgbWFrZSBubyBhdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBpbnZhbGlkIG1ha2VycyovXG4gICAgLyogb3IgYmFja2luZ1N0b3Jlcy4qL1xuICAgIHVzZWRLZXlzLmFkZChrZXkpO1xuICB9O1xuXG4gIC8qKlxuICogRW5zdXJlIHRoZSB3cmFwcGVkIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIG9uY2UgcGVyIGluY2FybmF0aW9uLiAgSXQgaXNcbiAqIGV4cGVjdGVkIHRvIHVwZGF0ZSB0aGUgYmFja2luZyBzdG9yZSBkaXJlY3RseS5cbiAqXG4gKiBAdGVtcGxhdGUgeyhrZXk6IHN0cmluZywgLi4ucmVzdDogYW55W10pID0+IGFueX0gVFxuICogQHBhcmFtIHtUfSBwcm92aWRlclxuICogQHBhcmFtIHsobGFiZWw6IHN0cmluZykgPT4gc3RyaW5nW119IFtsYWJlbFRvS2V5c11cbiAqIEByZXR1cm5zIHtUfVxuICovXG4gIGNvbnN0IHdyYXBQcm92aWRlciA9IChwcm92aWRlciwgbGFiZWxUb0tleXMgPSBkZWZhdWx0TGFiZWxUb0tleXMpID0+IHtcbiAgICAvKiogQHR5cGUgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBSZXR1cm5UeXBlPFQ+fSAqL1xuICAgIGNvbnN0IHdyYXBwZXIgPSAobGFiZWwsIC4uLnJlc3QpID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGxhYmVsVG9LZXlzKGxhYmVsKSkge1xuICAgICAgICBhc3NlcnRPbmx5T25jZShrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3ZpZGVyKGxhYmVsLCAuLi5yZXN0KTtcbiAgICB9O1xuICAgIHJldHVybiAvKiogQHR5cGUge1R9ICovICh3cmFwcGVyKTtcbiAgfTtcblxuICAvKipcbiAqIFRoZSBiZXN0IHdheSB0byB1bmRlcnN0YW5kIHRoZSBwdXJwb3NlIG9mIGBtYWtlT25jZWAgaXMgdG8gZmlyc3QgdW5kZXJzdGFuZFxuICogd2hhdCBgbWFrZU9uY2VgIGRvZXMgb24gYSBkdXJhYmxlIHpvbmUuIFVzZWQgY29ycmVjdGx5LCBgbWFrZU9uY2VgIHNob3VsZCBvbmx5XG4gKiBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlIG9uIGFueSB6b25lLGtleSBwYWlyIGR1cmluZyBhbnkgdmF0IGluY2FybmF0aW9uLlxuICogR2l2ZW4gdGhhdCBjb25zdHJhaW50LCBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgdmFsdWUgYm91bmQgdG8gdGhhdFxuICogem9uZSxrZXkgcGFpciwgaXQgbXVzdCBoYXZlIGJlZW4gbGVmdCB0aGVyZSBieSBhIHByZXZpb3VzIGluY2FybmF0aW9uIGFuZFxuICogYG1ha2VPbmNlYCB3aWxsIHNpbXBseSByZXR1cm4gaXQuIElmIG5vdCwgdGhlbiBgbWFrZXIoa2V5KWAgaXMgY2FsbGVkIHRvXG4gKiBkZXRlcm1pbmUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhhdCBzbG90LCB3aGljaCB3aWxsIG5vcm1hbGx5IGJlIHByZXNlcnZlZFxuICogYnkgc2ltaWxhciBjYWxscyB0byBgbWFrZU9uY2VgIGluIGZ1dHVyZSBpbmNhcm5hdGlvbnMgLS0tIHRob3VnaCB0aGF0IHdpbGwgYmVcbiAqIHVwIHRvIHRoZW0uXG4gKlxuICogQWxzbyBlbnN1cmVzIHRoZSBtYWtlciByZXR1cm5zIGEgc3RvcmFibGUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHN0cmluZyBuYW1lIG9mIHRoZSBab25lIHNsb3QgdG8gcHJvdmlkZS5cbiAqIEBwYXJhbSB7KGtleTogc3RyaW5nKSA9PiBWfSBtYWtlciBDYWxsZWQgdG8gY3JlYXRlIGEgZnJlc2ggdmFsdWUgdG8gZmlsbCBhbiBlbXB0eSBzbG90LlxuICogQHJldHVybnMge1Z9IFRoZSB2YWx1ZSBvZiB0aGUga2V5J3Mgc2xvdC5cbiAqL1xuICBjb25zdCBtYWtlT25jZSA9IChrZXksIG1ha2VyKSA9PiB7XG4gICAgYXNzZXJ0T25seU9uY2Uoa2V5KTtcbiAgICBpZiAoYmFja2luZ1N0b3JlICYmIGJhY2tpbmdTdG9yZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGJhY2tpbmdTdG9yZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBtYWtlcihrZXkpO1xuICAgIHN0b3Jlcy5pc1N0b3JhYmxlKHZhbHVlKSB8fFxuICAgICAgRmFpbGBtYWtlciByZXR1cm4gdmFsdWUgJHt2YWx1ZX0gaXMgbm90IHN0b3JhYmxlYDtcbiAgICBiYWNraW5nU3RvcmUgJiYgYmFja2luZ1N0b3JlLmluaXQoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyBtYWtlT25jZSwgd3JhcFByb3ZpZGVyIH0pO1xufTskaM2PX29uY2UubWFrZU9uY2VLaXQobWFrZU9uY2VLaXQpO1xuaGFyZGVuKG1ha2VPbmNlS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VPbmNlS2l0IjpbIm1ha2VPbmNlS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAIBO5SAGgAAgBoAADIAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3ByZXBhcmUtYXR0ZW51YXRvci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyIsIkBlbmRvL3BhdHRlcm5zIiwiLi9oZWFwLmpzIl0sImV4cG9ydHMiOlsiYXR0ZW51YXRlT25lIiwicHJlcGFyZUF0dGVudWF0b3JNYWtlciIsIndyYXBwZXJNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLGZyb21VbmlxdWVFbnRyaWVzLE0sbWFrZUhlYXBab25lOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzXCIsIFtbXCJmcm9tVW5pcXVlRW50cmllc1wiLFskaM2PX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiLi9oZWFwLmpzXCIsIFtbXCJtYWtlSGVhcFpvbmVcIixbJGjNj19hID0+IChtYWtlSGVhcFpvbmUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01ldGhvZEd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKi9cblxuLyogVGhpcyBhdHRlbnVhdG9yIGltcGxlbWVudGF0aW9uIGlzIGp1c3QgYSBzaW1wbGlmaWNhdGlvbiBvZiB0aGUqL1xuLyogcmV2b2NhYmxlIGtpdCBpbXBsZW1lbnRhdGlvbiBpbiBwcmVwYXJlLXJldm9jYWJsZS5qcy4gVGhlIHJldm9jYWJsZSBraXQqL1xuLyogcHJvdmlkZXMgYm90aCBhdHRlbnVhdGlvbiBhbmQgcmV2b2NhdGlvbiwgc2luY2Ugd2UgY2FuIGhhdmUgYm90aCBmb3IgdGhlKi9cbi8qIHByaWNlIG9mIGp1c3Qgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uLiBCdXQgaWYgeW91IGRvbid0IG5lZWQgcmV2b2NhdGlvbiwqL1xuLyogdGhlIHJldm9jYWJsZSBraXQgaGFzIG1vcmUgQVBJIGNvbXBsZXhpdHkgdGhhbiB5b3UgbmVlZC4qL1xuLyoqL1xuLyogV2UgY291bGQgaGF2ZSBidWlsdCBgcHJlcGFyZUF0dGVudWF0b3JNYWtlcmAgYXMgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kKi9cbi8qIGBwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXRgLiBCdXQgdGhlbiB3ZSdkIGhhdmUgdGhlIHdlaXJkIGFydGlmYWN0IHRoYXQgdGhlKi9cbi8qIGBleHRyYU1ldGhvZHNgIHdvdWxkIHNlZSBhIGB7IHN0YXRlLCBmYWNldHM6IHsgcmV2b2NhYmxlLCByZXZva2VyIH19YCBjb250ZXh0Ki9cbi8qIHJhdGhlciB0aGFuIGEgYHsgc3RhdGUsIHNlbGYgfWAgY29udGV4dC4gU28gaW5zdGVhZCwgd2UgY29waWVkIGFuZCBlZGl0ZWQgaXQqL1xuLyogZG93bi4gUGxlYXNlIGNvLW1haW50YWluIHRoZXNlIHR3byBtb2R1bGVzLiovXG5cbi8qIEJlY2F1c2UgdGhlIGF0dGVudWF0b3IganVzdCB1c2VzIGFuIGV4byBjbGFzcyByYXRoZXIgdGhhbiBhIGNsYXNzIGtpdCwqL1xuLyogaXQgY2Fubm90IHN1cHBvcnQgdGhlIHByaXZpbGVnZSBzZXBhcmF0aW9uIG9mIGEgZGlzdGluY3QgcmV2b2tlciBmYWNldC4qL1xuLyogQnV0IGl0IGNhbiBzdGlsbCBzdXBwb3J0IGBzZWxmUmV2b2tlYCBhcyBhIHNlcGFyYXRlIGBleHRyYU1ldGhvZGAsIGFzIHNob3duKi9cbi8qIGluIGEgdGVzdGNhc2UgYXQgYHByZXBhcmUtYXR0ZW51YXRvci50ZXN0LmpzYCovXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHdyYXBwZXJLaW5kTmFtZVxuICogQHBhcmFtIHtQcm9wZXJ0eUtleVtdfSB1TWV0aG9kTmFtZXNcbiAqIEBwYXJhbSB7UmVjb3JkPFByb3BlcnR5S2V5LCAoLi4uYXJnczogYW55W10pID0+IGFueT59IFtleHRyYU1ldGhvZHNdXG4gKi9cbiAgICAgICBjb25zdCB3cmFwcGVyTWV0aG9kcyA9IChcbiAgd3JhcHBlcktpbmROYW1lLFxuICB1TWV0aG9kTmFtZXMsXG4gIGV4dHJhTWV0aG9kcyA9IHt9LFxuKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmZyb21VbmlxdWVFbnRyaWVzKFxuICAgICAgdU1ldGhvZE5hbWVzLm1hcChuYW1lID0+IFtcbiAgICAgICAgbmFtZSxcbiAgICAgICAge1xuICAgICAgICAgIC8qIFVzZSBjb25jaXNlIG1ldGhvZCBzeW50YXggZm9yIGV4byBtZXRob2RzKi9cbiAgICAgICAgICBbbmFtZV0oLi4uYXJncykge1xuICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3JtYWwgZXhvLXRoaXMgdHlwaW5nIGNvbmZ1c2lvbiovXG4gICAgICAgICAgICBjb25zdCB7IHVuZGVybHlpbmcgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgICAgICAgIC8qIEJlY2F1c2UgYXR0ZW51YXRvcnMgc3RpbGwgc3VwcG9ydCBzb21lb25lIGFkZGluZyBgc2VsZlJldm9rZWAqL1xuICAgICAgICAgICAgLyogYXMgYW4gYGV4dHJhTWV0aG9kYCwgdGhpcyB0ZXN0IGlzIHN0aWxsIHVzZWZ1bC4gU2VlIHRoZSovXG4gICAgICAgICAgICAvKiB0ZXN0Y2FzZSBpbiBgcHJlcGFyZS1hdHRlbnVhdG9yLnRlc3QuanNgLiovXG4gICAgICAgICAgICB1bmRlcmx5aW5nICE9PSB1bmRlZmluZWQgfHwgRmFpbGAke3Eod3JhcHBlcktpbmROYW1lKX0gcmV2b2tlZGA7XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlcmx5aW5nW25hbWVdKC4uLmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIHVzaW5nIHBvc3NpYmxlIHN5bWJvbCBhcyBpbmRleCB0eXBlKi9cbiAgICAgICAgfVtuYW1lXSxcbiAgICAgIF0pLFxuICAgICksXG4gICAgLi4uZXh0cmFNZXRob2RzLFxuICB9KTskaM2PX29uY2Uud3JhcHBlck1ldGhvZHMod3JhcHBlck1ldGhvZHMpO1xuaGFyZGVuKHdyYXBwZXJNZXRob2RzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQGNhbGxiYWNrIE1ha2VBdHRlbnVhdG9yXG4gKiBAcGFyYW0ge1V9IHVuZGVybHlpbmdcbiAqIEByZXR1cm5zIHtQYXJ0aWFsPFU+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF0dGVudWF0b3JUaGlzXG4gKiBAcHJvcGVydHkge1BhcnRpYWw8VT59IHNlbGZcbiAqIEBwcm9wZXJ0eSB7eyB1bmRlcmx5aW5nOiBVIH19IHN0YXRlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gQXR0ZW51YXRvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdUludGVyZmFjZU5hbWVdXG4gKiAgIFRoZSBgaW50ZXJmYWNlTmFtZWAgb2YgdGhlIHVuZGVybHlpbmcgaW50ZXJmYWNlIGd1YXJkLlxuICogICBEZWZhdWx0cyB0byB0aGUgYHVLaW5kTmFtZWAuXG4gKiBAcHJvcGVydHkge1JlY29yZDxcbiAqICAgUHJvcGVydHlLZXksXG4gKiAgIE1ldGhvZEd1YXJkXG4gKiA+fSBbZXh0cmFNZXRob2RHdWFyZHNdXG4gKiBGb3IgZ3VhcmRpbmcgdGhlIGBleHRyYU1ldGhvZHNgLCBpZiB5b3UgaW5jbHVkZSB0aGVtIGJlbG93LiBUaGVzZSBhcHBlYXJcbiAqIG9ubHkgb24gdGhlIHN5bnRoZXNpemVkIGludGVyZmFjZSBndWFyZCBmb3IgdGhlIGF0dGVudWF0b3IsIGFuZFxuICogZG8gbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gYW55IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPFxuICogICBQcm9wZXJ0eUtleSxcbiAqICAgKHRoaXM6IEF0dGVudWF0b3JUaGlzPFU+LCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4gKiA+fSBbZXh0cmFNZXRob2RzXVxuICogRXh0cmEgbWV0aG9kcyBhZGRpbmcgYmVoYXZpb3Igb25seSB0byB0aGUgYXR0ZW51YXRvciwgYW5kXG4gKiBkbyBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBhbnkgbWV0aG9kcyBvZiB0aGUgdW5kZXJseWluZy5cbiAqL1xuXG4vKipcbiAqIE1ha2UgYW4gZXhvIGNsYXNzIGZvciB3cmFwcGluZyBhbiB1bmRlcmx5aW5nIGV4byBjbGFzcyxcbiAqIHdoZXJlIHRoZSB3cmFwcGVyIGlzIGFuIGF0dGVudWF0b3Igb2YgdGhlIHVuZGVybHlpbmcuXG4gKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEBwYXJhbSB7Wm9uZX0gem9uZVxuICogQHBhcmFtIHtzdHJpbmd9IHVLaW5kTmFtZVxuICogICBUaGUgYGtpbmROYW1lYCBvZiB0aGUgdW5kZXJseWluZyBleG8gY2xhc3NcbiAqIEBwYXJhbSB7KGtleW9mIFUpW119IHVNZXRob2ROYW1lc1xuICogICBUaGUgbWV0aG9kIG5hbWVzIG9mIHRoZSB1bmRlcmx5aW5nIGV4byBjbGFzcyB0aGF0IHNob3VsZCBiZSByZXByZXNlbnRlZFxuICogICBieSB0cmFuc3BhcmVudGx5LWZvcndhcmRpbmcgbWV0aG9kcyBvZiB0aGUgYXR0ZW51YXRvci5cbiAqIEBwYXJhbSB7QXR0ZW51YXRvck9wdGlvbnM8VT59IFtvcHRpb25zXVxuICogQHJldHVybnMge01ha2VBdHRlbnVhdG9yfVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUF0dGVudWF0b3JNYWtlciA9IChcbiAgem9uZSxcbiAgdUtpbmROYW1lLFxuICB1TWV0aG9kTmFtZXMsXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBjb25zdCB7XG4gICAgdUludGVyZmFjZU5hbWUgPSB1S2luZE5hbWUsXG4gICAgZXh0cmFNZXRob2RHdWFyZHMgPSB7fSxcbiAgICBleHRyYU1ldGhvZHMgPSB7fSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IEF0dGVudWF0b3JJID0gTS5pbnRlcmZhY2UoXG4gICAgYCR7dUludGVyZmFjZU5hbWV9X2F0dGVudWF0b3JgLFxuICAgIGV4dHJhTWV0aG9kR3VhcmRzLFxuICAgIHsgZGVmYXVsdEd1YXJkczogJ3JhdycgfSxcbiAgKTtcblxuICBjb25zdCBhdHRlbnVhdG9yS2luZE5hbWUgPSBgJHt1S2luZE5hbWV9X2F0dGVudWF0b3JgO1xuXG4gIHJldHVybiB6b25lLmV4b0NsYXNzKFxuICAgIGF0dGVudWF0b3JLaW5kTmFtZSxcbiAgICBBdHRlbnVhdG9ySSxcbiAgICB1bmRlcmx5aW5nID0+ICh7IHVuZGVybHlpbmcgfSksXG4gICAgd3JhcHBlck1ldGhvZHMoYXR0ZW51YXRvcktpbmROYW1lLCB1TWV0aG9kTmFtZXMsIGV4dHJhTWV0aG9kcyksXG4gICAge1xuICAgICAgc3RhdGVTaGFwZTogeyB1bmRlcmx5aW5nOiBNLm9wdChNLnJlbW90YWJsZSgndW5kZXJseWluZycpKSB9LFxuICAgIH0sXG4gICk7XG59OyRozY9fb25jZS5wcmVwYXJlQXR0ZW51YXRvck1ha2VyKHByZXBhcmVBdHRlbnVhdG9yTWFrZXIpO1xuaGFyZGVuKHByZXBhcmVBdHRlbnVhdG9yTWFrZXIpO1xuXG4vKiBjZi4gaHR0cHM6Ly9lbmRvanMuZ2l0aHViLmlvL2VuZG8vZnVuY3Rpb25zL19lbmRvX3Bhc3Nfc3R5bGUuUmVtb3RhYmxlLmh0bWwqL1xuY29uc3QgUmVtb3RhYmxlUHJlZml4UkUgPSAvXihBbGxlZ2VkOiB8RGVidWdOYW1lOiApLztcblxuLyoqXG4gKiBBIGNvbnZlbmllbmNlIGFib3ZlIGBwcmVwYXJlQXR0ZW51YXRvck1ha2VyYCBmb3IgZG9pbmcgYSBzaW5nbGV0b25cbiAqIGVwaGVtZXJhbCBhdHRlbnVhdG9yLCBpLmUuLCBhIG5ldyBhdHRlbnVhdG9yIGluc3RhbmNlIChhbmQgaGlkZGVuIGNsYXNzKVxuICogdGhhdCBpcyBhbGxvY2F0ZWQgaW4gdGhlIGhlYXAgem9uZSwgYW5kIHRoZXJlZm9yZSBlcGhlbWVyYWwuIFRoZSB1bmRlcmx5aW5nXG4gKiBjYW4gYmUgZHVyYWJsZSBvciBub3QsIHdpdGggbm8gY29uZmxpY3Qgd2l0aCB0aGUgYXR0ZW51YXRvciBiZWluZ1xuICogZXBoZW1lcmFsLiBUaGUgcHJpY2Ugb2YgdGhpcyBjb252ZW5pZW5jZSBpcyB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgaGlkZGVuXG4gKiBjbGFzcyBhbmQgd3JhcHBlciBtZXRob2RzIHBlciBgYXR0ZW51YXRlT25lYCBjYWxsLCBpLmUuLCBwZXIgYXR0ZW51YXRvclxuICogaW5zdGFuY2UuXG4gKlxuICogQHRlbXBsYXRlIHthbnl9IFVcbiAqIEBwYXJhbSB7VX0gdW5kZXJseWluZ1xuICogQHBhcmFtIHsoa2V5b2YgVSlbXX0gdU1ldGhvZE5hbWVzXG4gKiBAcGFyYW0ge0F0dGVudWF0b3JPcHRpb25zPFU+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXJ0aWFsPFU+fVxuICovXG4gICAgICAgY29uc3QgYXR0ZW51YXRlT25lID0gKHVuZGVybHlpbmcsIHVNZXRob2ROYW1lcywgb3B0aW9ucyA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBoZWFwWm9uZSA9IG1ha2VIZWFwWm9uZSgpO1xuICBjb25zdCB1S2luZE5hbWUgPSAodW5kZXJseWluZ1tTeW1ib2wudG9TdHJpbmdUYWddIHx8ICdVbmRlcmx5aW5nJykucmVwbGFjZShcbiAgICBSZW1vdGFibGVQcmVmaXhSRSxcbiAgICAnJyxcbiAgKTtcbiAgY29uc3QgbWFrZUF0dGVudWF0b3IgPSBwcmVwYXJlQXR0ZW51YXRvck1ha2VyKFxuICAgIGhlYXBab25lLFxuICAgIHVLaW5kTmFtZSxcbiAgICB1TWV0aG9kTmFtZXMsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgcmV0dXJuIG1ha2VBdHRlbnVhdG9yKHVuZGVybHlpbmcpO1xufTskaM2PX29uY2UuYXR0ZW51YXRlT25lKGF0dGVudWF0ZU9uZSk7XG5oYXJkZW4oYXR0ZW51YXRlT25lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndyYXBwZXJNZXRob2RzIjpbIndyYXBwZXJNZXRob2RzIl0sInByZXBhcmVBdHRlbnVhdG9yTWFrZXIiOlsicHJlcGFyZUF0dGVudWF0b3JNYWtlciJdLCJhdHRlbnVhdGVPbmUiOlsiYXR0ZW51YXRlT25lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB3bPYhyFAAAchQAADEAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIiwiLi9wcmVwYXJlLWF0dGVudWF0b3IuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNLHdyYXBwZXJNZXRob2RzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiLi9wcmVwYXJlLWF0dGVudWF0b3IuanNcIiwgW1tcIndyYXBwZXJNZXRob2RzXCIsWyRozY9fYSA9PiAod3JhcHBlck1ldGhvZHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qKlxuICogQGltcG9ydCB7QW1wbGlmeX0gZnJvbSAnQGVuZG8vZXhvJztcbiAqIEBpbXBvcnQge01ldGhvZEd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKi9cblxuLyogVGhpcyByZXZvY2FibGUga2l0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGZvciBib3RoIGF0dGVudWF0aW9uIGFuZCovXG4vKiByZXZvY2F0aW9uLCBzaW5jZSBib3RoIGNhbiBiZSBwcm92aWRlZCBhdCB0aGUgY29zdCBvZiBvbmUgbGV2ZWwgb2YqL1xuLyogaW5kaXJlY3Rpb24uIEJ1dCBpZiB5b3UganVzdCBuZWVkIGF0dGVudWF0aW9uIHdpdGhvdXQgcmV2b2NhdGlvbiwgYmV0dGVyIHRvKi9cbi8qIHVzZSB0aGUgYXR0ZW51YXRvciBpbXBsZW1lbnRhdGlvbiBpbiBwcmVwYXJlLWF0dGVudWF0b3IuanMuKi9cbi8qIFBsZWFzZSBjby1tYWludGFpbiB0aGVzZSB0d28gbW9kdWxlcy4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAY2FsbGJhY2sgTWFrZVJldm9jYWJsZVxuICogQHBhcmFtIHtVfSB1bmRlcmx5aW5nXG4gKiBAcmV0dXJucyB7UGFydGlhbDxVPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAY2FsbGJhY2sgTWFrZVJldm9jYWJsZUtpdFxuICogQHBhcmFtIHtVfSB1bmRlcmx5aW5nXG4gKiBAcmV0dXJucyB7UmV2b2NhYmxlS2l0PFU+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJldm9jYWJsZU1ha2VyS2l0XG4gKiBAcHJvcGVydHkgeyhyZXZvY2FibGU6IFUpID0+IGJvb2xlYW59IHJldm9rZVxuICogQHByb3BlcnR5IHtNYWtlUmV2b2NhYmxlPFU+fSBtYWtlUmV2b2NhYmxlXG4gKiAgIEZvcndhcmRzIHRvIHRoZSB1bmRlcmx5aW5nIGV4byBvYmplY3QsIHVudGlsIHJldm9rZWRcbiAqIEBwcm9wZXJ0eSB7TWFrZVJldm9jYWJsZUtpdDxVPn0gbWFrZVJldm9jYWJsZUtpdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmV2b2tlckZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IHJldm9rZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJldm9jYWJsZUtpdFxuICogQHByb3BlcnR5IHtSZXZva2VyRmFjZXR9IHJldm9rZXJcbiAqIEBwcm9wZXJ0eSB7UGFydGlhbDxVPn0gcmV2b2NhYmxlXG4gKiAgIEZvcndhcmRzIHRvIHRoZSB1bmRlcmx5aW5nIGV4byBvYmplY3QsIHVudGlsIHJldm9rZWRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZXZvY2FibGVLaXRUaGlzXG4gKiBAcHJvcGVydHkge1Jldm9jYWJsZUtpdDxVPn0gZmFjZXRzXG4gKiBAcHJvcGVydHkge3sgdW5kZXJseWluZzogVSB9fSBzdGF0ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJldm9jYWJsZUtpdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdUludGVyZmFjZU5hbWVdXG4gKiAgIFRoZSBgaW50ZXJmYWNlTmFtZWAgb2YgdGhlIHVuZGVybHlpbmcgaW50ZXJmYWNlIGd1YXJkLlxuICogICBEZWZhdWx0cyB0byB0aGUgYHVLaW5kTmFtZWAuXG4gKiBAcHJvcGVydHkge1JlY29yZDxcbiAqICAgUHJvcGVydHlLZXksXG4gKiAgIE1ldGhvZEd1YXJkXG4gKiA+fSBbZXh0cmFNZXRob2RHdWFyZHNdXG4gKiBGb3IgZ3VhcmRpbmcgdGhlIGBleHRyYU1ldGhvZHNgLCBpZiB5b3UgaW5jbHVkZSB0aGVtIGJlbG93LiBUaGVzZSBhcHBlYXJcbiAqIG9ubHkgb24gdGhlIHN5bnRoZXNpemVkIGludGVyZmFjZSBndWFyZCBmb3IgdGhlIHJldm9jYWJsZSBjYXJldGFrZXIsIGFuZFxuICogZG8gbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gYW55IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPFxuICogICBQcm9wZXJ0eUtleSxcbiAqICAgKHRoaXM6IFJldm9jYWJsZUtpdFRoaXM8VT4sIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAqID59IFtleHRyYU1ldGhvZHNdXG4gKiBFeHRyYSBtZXRob2RzIGFkZGluZyBiZWhhdmlvciBvbmx5IHRvIHRoZSByZXZvY2FibGUgY2FyZXRha2VyLCBhbmRcbiAqIGRvIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGFueSBtZXRob2RzIG9mIHRoZSB1bmRlcmx5aW5nLlxuICovXG5cbi8qKlxuICogTWFrZSBhbiBleG8gY2xhc3Mga2l0IGZvciB3cmFwcGluZyBhbiB1bmRlcmx5aW5nIGV4byBjbGFzcyxcbiAqIHdoZXJlIHRoZSB3cmFwcGVyIGlzIGEgcmV2b2NhYmxlIGZvcndhcmRlci5cbiAqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQHBhcmFtIHtab25lfSB6b25lXG4gKiBAcGFyYW0ge3N0cmluZ30gdUtpbmROYW1lXG4gKiAgIFRoZSBga2luZE5hbWVgIG9mIHRoZSB1bmRlcmx5aW5nIGV4byBjbGFzc1xuICogQHBhcmFtIHtQcm9wZXJ0eUtleVtdfSB1TWV0aG9kTmFtZXNcbiAqICAgVGhlIG1ldGhvZCBuYW1lcyBvZiB0aGUgdW5kZXJseWluZyBleG8gY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVwcmVzZW50ZWRcbiAqICAgYnkgdHJhbnNwYXJlbnRseS1mb3J3YXJkaW5nIG1ldGhvZHMgb2YgdGhlIHJldm9jYWJsZSBjYXJldGFrZXIuXG4gKiBAcGFyYW0ge1Jldm9jYWJsZUtpdE9wdGlvbnM8VT59IFtvcHRpb25zXVxuICogQHJldHVybnMge1Jldm9jYWJsZU1ha2VyS2l0PFU+fVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0ID0gKFxuICB6b25lLFxuICB1S2luZE5hbWUsXG4gIHVNZXRob2ROYW1lcyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICB1SW50ZXJmYWNlTmFtZSA9IHVLaW5kTmFtZSxcbiAgICBleHRyYU1ldGhvZEd1YXJkcyA9IHt9LFxuICAgIGV4dHJhTWV0aG9kcyA9IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgUmV2b2NhYmxlSUtpdCA9IGhhcmRlbih7XG4gICAgcmV2b2tlcjogTS5pbnRlcmZhY2UoYCR7dUludGVyZmFjZU5hbWV9X3Jldm9rZXJgLCB7XG4gICAgICByZXZva2U6IE0uY2FsbCgpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICAgIH0pLFxuICAgIHJldm9jYWJsZTogTS5pbnRlcmZhY2UoYCR7dUludGVyZmFjZU5hbWV9X3Jldm9jYWJsZWAsIGV4dHJhTWV0aG9kR3VhcmRzLCB7XG4gICAgICBkZWZhdWx0R3VhcmRzOiAncmF3JyxcbiAgICB9KSxcbiAgfSk7XG5cbiAgY29uc3QgcmV2b2NhYmxlS2luZE5hbWUgPSBgJHt1S2luZE5hbWV9X2NhcmV0YWtlcmA7XG5cbiAgLyoqIEB0eXBlIHtBbXBsaWZ5PGFueT59ICovXG4gIGxldCBhbXBsaWZpZXI7XG5cbiAgY29uc3QgbWFrZVJldm9jYWJsZUtpdCA9IHpvbmUuZXhvQ2xhc3NLaXQoXG4gICAgcmV2b2NhYmxlS2luZE5hbWUsXG4gICAgUmV2b2NhYmxlSUtpdCxcbiAgICB1bmRlcmx5aW5nID0+ICh7IHVuZGVybHlpbmcgfSksXG4gICAge1xuICAgICAgcmV2b2tlcjoge1xuICAgICAgICByZXZva2UoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBpZiAoc3RhdGUudW5kZXJseWluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLnVuZGVybHlpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmV2b2NhYmxlOiB3cmFwcGVyTWV0aG9kcyhyZXZvY2FibGVLaW5kTmFtZSwgdU1ldGhvZE5hbWVzLCBleHRyYU1ldGhvZHMpLFxuICAgIH0sXG4gICAge1xuICAgICAgc3RhdGVTaGFwZTogeyB1bmRlcmx5aW5nOiBNLm9wdChNLnJlbW90YWJsZSgndW5kZXJseWluZycpKSB9LFxuICAgICAgcmVjZWl2ZUFtcGxpZmllcjogYW1wID0+IHtcbiAgICAgICAgYW1wbGlmaWVyID0gYW1wO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIC8qKlxuICogQHR5cGUge01ha2VSZXZvY2FibGV9XG4gKi9cbiAgY29uc3QgbWFrZVJldm9jYWJsZSA9IHVuZGVybHlpbmcgPT4gbWFrZVJldm9jYWJsZUtpdCh1bmRlcmx5aW5nKS5yZXZvY2FibGU7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1V9IHJldm9jYWJsZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgcmV2b2tlID0gcmV2b2NhYmxlID0+IHtcbiAgICAvKiogQHR5cGUge1Jldm9jYWJsZUtpdDxVPn0gKi9cbiAgICBjb25zdCBmYWNldHMgPSBhbXBsaWZpZXIocmV2b2NhYmxlKTtcbiAgICBpZiAoZmFjZXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhY2V0cy5yZXZva2VyLnJldm9rZSgpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHJldm9rZSxcbiAgICBtYWtlUmV2b2NhYmxlLFxuICAgIC8qKiBAdHlwZSB7TWFrZVJldm9jYWJsZUtpdH0gKi9cbiAgICBtYWtlUmV2b2NhYmxlS2l0LFxuICB9KTtcbn07JGjNj19vbmNlLnByZXBhcmVSZXZvY2FibGVNYWtlcktpdChwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQpO1xuaGFyZGVuKHByZXBhcmVSZXZvY2FibGVNYWtlcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQiOlsicHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGC/2hirDQAAqw0AAC0AAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3dhdGNoLXByb21pc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGF0dGVybnMiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiLCJQcm9taXNlV2F0Y2hlckhhbmRsZXIiLCJQcm9taXNlV2F0Y2hlckkiLCJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTSxFOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIEEgUHJvbWlzZVdhdGNoZXIgbWV0aG9kIGd1YXJkIGNhbGxhYmxlIHdpdGggb3IgbW9yZSBhcmd1bWVudHMsIHJldHVybmluZyB2b2lkLlxuICovXG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJIYW5kbGVyID0gTS5jYWxsKE0ucmF3KCkpLnJlc3QoTS5yYXcoKSkucmV0dXJucygpO1xuXG4vKipcbiAqIEEgUHJvbWlzZVdhdGNoZXIgaW50ZXJmYWNlIHRoYXQgaGFzIGJvdGggb25GdWxmaWxsZWQgYW5kIG9uUmVqZWN0ZWQgaGFuZGxlcnMuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJIYW5kbGVyKFByb21pc2VXYXRjaGVySGFuZGxlcik7XG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJJID0gTS5pbnRlcmZhY2UoJ1Byb21pc2VXYXRjaGVyJywge1xuICBvbkZ1bGZpbGxlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxuICBvblJlamVjdGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXIsXG59KTtcblxuLyoqXG4gKiBBIFByb21pc2VXYXRjaGVyIGludGVyZmFjZSB0aGF0IGhhcyBvbmx5IGFuIG9uRnVsZmlsbGVkIGhhbmRsZXIuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJJKFByb21pc2VXYXRjaGVySSk7XG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJID0gTS5pbnRlcmZhY2UoJ1Byb21pc2VXYXRjaGVyRnVsZmlsbGVkJywge1xuICBvbkZ1bGZpbGxlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxufSk7XG5cbi8qKlxuICogQSBQcm9taXNlV2F0Y2hlciBpbnRlcmZhY2UgdGhhdCBoYXMgb25seSBhbiBvblJlamVjdGVkIGhhbmRsZXIuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJKFByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSk7XG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkgPSBNLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXJSZWplY3RlZCcsIHtcbiAgb25SZWplY3RlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxufSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJvbWlzZVdhdGNoZXJcbiAqIEBwcm9wZXJ0eSB7KGZ1bGZpbG1lbnQ6IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZH0gW29uRnVsZmlsbGVkXVxuICogQHByb3BlcnR5IHsocmVhc29uOiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWR9IFtvblJlamVjdGVkXVxuICovXG5cbi8qKlxuICogQWRhcHQgYSBwcm9taXNlIHdhdGNoZXIgbWV0aG9kIHRvIEUud2hlbi5cbiAqIEBwYXJhbSB7UmVjb3JkPFByb3BlcnR5S2V5LCAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duPn0gdGhhdFxuICogQHBhcmFtIHtQcm9wZXJ0eUtleX0gcHJvcFxuICogQHBhcmFtIHt1bmtub3duW119IHBvc3RBcmdzXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkoUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkpO1xuY29uc3QgY2FsbE1lTWF5YmUgPSAodGhhdCwgcHJvcCwgcG9zdEFyZ3MpID0+IHtcbiAgY29uc3QgZm4gPSB0aGF0W3Byb3BdO1xuICBpZiAoIWZuKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBhc3NlcnQudHlwZW9mKGZuLCAnZnVuY3Rpb24nKTtcbiAgLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZyB2YWx1ZSBvciByZWFzb25cbiAqL1xuICBjb25zdCB3cmFwcGVkID0gYXJnID0+IHtcbiAgICAvKiBEb24ndCByZXR1cm4gYSB2YWx1ZSwgdG8gcHJldmVudCBFLndoZW4gZnJvbSBzdWJzY3JpYmluZyB0byBhIHJlc3VsdGluZyovXG4gICAgLyogcHJvbWlzZS4qL1xuICAgIGFwcGx5KGZuLCB0aGF0LCBbYXJnLCAuLi5wb3N0QXJnc10pO1xuICB9O1xuICByZXR1cm4gd3JhcHBlZDtcbn07XG5cbi8qKlxuICogU2hpbSB0aGUgcHJvbWlzZSB3YXRjaGVyIGJlaGF2aW91ciB3aGVuIFZhdERhdGEud2F0Y2hQcm9taXNlIGlzIG5vdCBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtQcm9taXNlPGFueT59IHBcbiAqIEBwYXJhbSB7UHJvbWlzZVdhdGNoZXJ9IHdhdGNoZXJcbiAqIEBwYXJhbSB7Li4udW5rbm93bn0gd2F0Y2hlckFyZ3NcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gICAgICAgY29uc3Qgd2F0Y2hQcm9taXNlID0gKHAsIHdhdGNoZXIsIC4uLndhdGNoZXJBcmdzKSA9PiB7XG4gIFByb21pc2UucmVzb2x2ZShwKSA9PT0gcCB8fCBGYWlsYHdhdGNoUHJvbWlzZSBvbmx5IHdhdGNoZXMgcHJvbWlzZXNgO1xuICBjb25zdCBvbkZ1bGZpbGxlZCA9IGNhbGxNZU1heWJlKHdhdGNoZXIsICdvbkZ1bGZpbGxlZCcsIHdhdGNoZXJBcmdzKTtcbiAgY29uc3Qgb25SZWplY3RlZCA9IGNhbGxNZU1heWJlKHdhdGNoZXIsICdvblJlamVjdGVkJywgd2F0Y2hlckFyZ3MpO1xuICBvbkZ1bGZpbGxlZCB8fFxuICAgIG9uUmVqZWN0ZWQgfHxcbiAgICBGYWlsYHByb21pc2Ugd2F0Y2hlciBtdXN0IGltcGxlbWVudCBhdCBsZWFzdCBvbmUgaGFuZGxlciBtZXRob2RgO1xuICB2b2lkIEUud2hlbihwLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG59OyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTtcbmhhcmRlbih3YXRjaFByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHJvbWlzZVdhdGNoZXJIYW5kbGVyIjpbIlByb21pc2VXYXRjaGVySGFuZGxlciJdLCJQcm9taXNlV2F0Y2hlckkiOlsiUHJvbWlzZVdhdGNoZXJJIl0sIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSI6WyJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiXSwiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiOlsiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABsJLBqFgIAABYCAAAoAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3pvbmUtaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcmVwYXJlLXJldm9jYWJsZS5qcyIsIi4vc3JjL3ByZXBhcmUtYXR0ZW51YXRvci5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL3ByZXBhcmUtYXR0ZW51YXRvci5qcyIsIi4vc3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9wcmVwYXJlLWF0dGVudWF0b3IuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4YOdgOc8AADnPAAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbCxwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVtb3RhYmxlID0gJGjNj19hKV1dLFtcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1wiLCBbW1wibmF0TWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChuYXRNYXRoSGVscGVycyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcInNldE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoc2V0TWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoY29weVNldE1hdGhIZWxwZXJzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlCYWdNYXRoSGVscGVyc1wiLFskaM2PX2EgPT4gKGNvcHlCYWdNYXRoSGVscGVycyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDb3B5QmFnLCBDb3B5U2V0fSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtBbW91bnQsIEFtb3VudFZhbHVlLCBBc3NldFZhbHVlRm9yS2luZCwgQnJhbmQsIENvcHlCYWdBbW91bnQsIENvcHlTZXRBbW91bnQsIE1hdGhIZWxwZXJzLCBOYXRBbW91bnQsIE5hdFZhbHVlLCBTZXRBbW91bnQsIFNldFZhbHVlfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKiBOQjogQXNzZXRLaW5kIGlzIGJvdGggYSBjb25zdGFudCBmb3IgZW51bWVyYXRlZCB2YWx1ZXMgYW5kIGEgdHlwZSBmb3IgdGhvc2UgdmFsdWVzLiovXG4vKipcbiAqIENvbnN0YW50cyBmb3IgdGhlIGtpbmRzIG9mIGFzc2V0cyB3ZSBzdXBwb3J0LlxuICpcbiAqIEBlbnVtIHsodHlwZW9mIEFzc2V0S2luZClba2V5b2YgdHlwZW9mIEFzc2V0S2luZF19XG4gKi9cbiAgICAgICBjb25zdCBBc3NldEtpbmQgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBOQVQ6ICduYXQnLFxuICBTRVQ6ICdzZXQnLFxuICBDT1BZX1NFVDogJ2NvcHlTZXQnLFxuICBDT1BZX0JBRzogJ2NvcHlCYWcnLFxufSk7JGjNj19vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuaGFyZGVuKEFzc2V0S2luZCk7XG5jb25zdCBhc3NldEtpbmROYW1lcyA9IGhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyoqIEBwYXJhbSB7QXNzZXRLaW5kfSBhbGxlZ2VkQUsgKi9cbiAgICAgICBjb25zdCBhc3NlcnRBc3NldEtpbmQgPSBhbGxlZ2VkQUsgPT4ge1xuICBhc3NldEtpbmROYW1lcy5pbmNsdWRlcyhhbGxlZ2VkQUspIHx8XG4gICAgRmFpbGBUaGUgYXNzZXRLaW5kICR7YWxsZWdlZEFLfSBtdXN0IGJlIG9uZSBvZiAke3EoYXNzZXRLaW5kTmFtZXMpfWA7XG59OyRozY9fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKipcbiAqIEFtb3VudHMgZGVzY3JpYmUgZGlnaXRhbCBhc3NldHMuIEZyb20gYW4gYW1vdW50LCB5b3UgY2FuIGxlYXJuIHRoZSBicmFuZCBvZlxuICogZGlnaXRhbCBhc3NldCBhcyB3ZWxsIGFzIFwiaG93IG11Y2hcIiBvciBcImhvdyBtYW55XCIuIEFtb3VudHMgaGF2ZSB0d28gcGFydHM6IGFcbiAqIGJyYW5kIChsb29zZWx5IHNwZWFraW5nLCB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0KSBhbmQgdGhlIHZhbHVlICh0aGUgYW5zd2VyXG4gKiB0byBcImhvdyBtdWNoXCIpLiBGb3IgZXhhbXBsZSwgaW4gdGhlIHBocmFzZSBcIjUgYnVja3NcIiwgXCJidWNrc1wiIHRha2VzIHRoZSByb2xlXG4gKiBvZiB0aGUgYnJhbmQgYW5kIHRoZSB2YWx1ZSBpcyA1LiBBbW91bnRzIGNhbiBkZXNjcmliZSBmdW5naWJsZSBhbmRcbiAqIG5vbi1mdW5naWJsZSBkaWdpdGFsIGFzc2V0cy4gQW1vdW50cyBhcmUgcGFzcy1ieS1jb3B5IGFuZCBjYW4gYmUgbWFkZSBieSBhbmRcbiAqIHNlbnQgdG8gYW55b25lLlxuICpcbiAqIFRoZSBpc3N1ZXIgaXMgdGhlIGF1dGhvcml0YXRpdmUgc291cmNlIG9mIHRoZSBhbW91bnQgaW4gcGF5bWVudHMgYW5kIHB1cnNlcy5cbiAqIFRoZSBpc3N1ZXIgbXVzdCBiZSBhYmxlIHRvIGRvIHRoaW5ncyBzdWNoIGFzIGFkZCBkaWdpdGFsIGFzc2V0cyB0byBhIHB1cnNlXG4gKiBhbmQgd2l0aGRyYXcgZGlnaXRhbCBhc3NldHMgZnJvbSBhIHB1cnNlLiBUbyBkbyBzbywgaXQgbXVzdCBrbm93IGhvdyB0byBhZGRcbiAqIGFuZCBzdWJ0cmFjdCBkaWdpdGFsIGFzc2V0cy4gUmF0aGVyIHRoYW4gaGFyZC1jb2RpbmcgYSBwYXJ0aWN1bGFyIHNvbHV0aW9uLFxuICogd2UgY2hvc2UgdG8gcGFyYW1ldGVyaXplIHRoZSBpc3N1ZXIgd2l0aCBhIGNvbGxlY3Rpb24gb2YgcG9seW1vcnBoaWNcbiAqIGZ1bmN0aW9ucywgd2hpY2ggd2UgY2FsbCBgQW1vdW50TWF0aGAuIFRoZXNlIG1hdGggZnVuY3Rpb25zIGluY2x1ZGUgY29uY2VwdHNcbiAqIGxpa2UgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBhbmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvLlxuICpcbiAqIFdlIGFsc28gd2FudCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gY29uZnVzaW9uIGFzIHRvIHdoYXQga2luZCBvZiBhc3NldCB3ZVxuICogYXJlIHVzaW5nLiBUaHVzLCBBbW91bnRNYXRoIGluY2x1ZGVzIGNoZWNrcyBvZiB0aGUgYGJyYW5kYCwgdGhlIHVuaXF1ZVxuICogaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldC4gSWYgdGhlIHdyb25nIGJyYW5kIGlzIHVzZWQgaW5cbiAqIEFtb3VudE1hdGgsIGFuIGVycm9yIGlzIHRocm93biBhbmQgdGhlIG9wZXJhdGlvbiBkb2VzIG5vdCBzdWNjZWVkLlxuICpcbiAqIEFtb3VudE1hdGggdXNlcyBtYXRoSGVscGVycyB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLCBidXQgdGhlbiBhZGRzIHRoZSBicmFuZFxuICogdG8gdGhlIHJlc3VsdC4gVGhlIGZ1bmN0aW9uIGB2YWx1ZWAgZ2V0cyB0aGUgdmFsdWUgZnJvbSB0aGUgYW1vdW50IGJ5XG4gKiByZW1vdmluZyB0aGUgYnJhbmQgKGFtb3VudCAtPiB2YWx1ZSksIGFuZCB0aGUgZnVuY3Rpb24gYG1ha2VgIGFkZHMgdGhlIGJyYW5kXG4gKiB0byBwcm9kdWNlIGFuIGFtb3VudCAodmFsdWUgLT4gYW1vdW50KS4gVGhlIGZ1bmN0aW9uIGBjb2VyY2VgIHRha2VzIGFuIGFtb3VudFxuICogYW5kIGNoZWNrcyBpdCwgcmV0dXJuaW5nIGFuIGFtb3VudCAoYW1vdW50IC0+IGFtb3VudCkuXG4gKlxuICogRWFjaCBpc3N1ZXIgb2YgZGlnaXRhbCBhc3NldHMgaGFzIGFuIGFzc29jaWF0ZWQgYnJhbmQgaW4gYSBvbmUtdG8tb25lXG4gKiBtYXBwaW5nLiBJbiB1bnRydXN0ZWQgY29udGV4dHMsIHN1Y2ggYXMgaW4gYW5hbHl6aW5nIHBheW1lbnRzIGFuZCBhbW91bnRzLCB3ZVxuICogY2FuIGdldCB0aGUgYnJhbmQgYW5kIGZpbmQgdGhlIGlzc3VlciB3aGljaCBtYXRjaGVzIHRoZSBicmFuZC4gVGhlIGlzc3VlciBhbmRcbiAqIHRoZSBicmFuZCBtdXR1YWxseSB2YWxpZGF0ZSBlYWNoIG90aGVyLlxuICovXG5cbmNvbnN0IGhlbHBlcnMgPSB7XG4gIG5hdDogbmF0TWF0aEhlbHBlcnMsXG4gIHNldDogc2V0TWF0aEhlbHBlcnMsXG4gIGNvcHlTZXQ6IGNvcHlTZXRNYXRoSGVscGVycyxcbiAgY29weUJhZzogY29weUJhZ01hdGhIZWxwZXJzLFxufTtcblxuLyoqIEB0eXBlIHsodmFsdWU6IHVua25vd24pID0+ICduYXQnIHwgJ3NldCcgfCAnY29weVNldCcgfCAnY29weUJhZyd9IH0gKi9cbmNvbnN0IGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kID0gdmFsdWUgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWx1ZSk7XG4gIGlmIChwYXNzU3R5bGUgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuICduYXQnO1xuICB9XG4gIGlmIChwYXNzU3R5bGUgPT09ICdjb3B5QXJyYXknKSB7XG4gICAgcmV0dXJuICdzZXQnO1xuICB9XG4gIGlmIChtYXRjaGVzKHZhbHVlLCBNLnNldCgpKSkge1xuICAgIHJldHVybiAnY29weVNldCc7XG4gIH1cbiAgaWYgKG1hdGNoZXModmFsdWUsIE0uYmFnKCkpKSB7XG4gICAgcmV0dXJuICdjb3B5QmFnJztcbiAgfVxuICAvKiBUT0RPIFRoaXMgaXNuJ3QgcXVpdGUgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UsIGluIGNhc2UgdmFsdWVQYXNzU3R5bGUqL1xuICAvKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbiAgLyogb2JqZWN0IGl0IGlzLiovXG4gIC8qIEFsc28sIHRoaXMga2luZCBvZiBtYW51YWwgbGlzdGluZyBpcyBhIG1haW50ZW5hbmNlIGhhemFyZCB3ZSovXG4gIC8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cbiAgdGhyb3cgRmFpbGB2YWx1ZSAke3ZhbHVlfSBtdXN0IGJlIGEgYmlnaW50LCBjb3B5U2V0LCBjb3B5QmFnLCBvciBhbiBhcnJheSwgbm90ICR7cShcbiAgICBwYXNzU3R5bGUsXG4gICl9YDtcbn07XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHZhbHVlIGlzIGEgdmFsaWQgQW1vdW50TWF0aCBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaGVscGVycy5cbiAqXG4gKiBNYWRlIGF2YWlsYWJsZSBvbmx5IGZvciB0ZXN0aW5nLCBidXQgaXQgaXMgaGFybWxlc3MgZm9yIG90aGVyIHVzZXMuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHBhcmFtIHtWfSB2YWx1ZVxuICogQHJldHVybnMge01hdGhIZWxwZXJzPFY+fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0VmFsdWVHZXRIZWxwZXJzID0gdmFsdWUgPT5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgaGVscGVyc1thc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSldO1xuXG4vKipcbiAqIEB0eXBlIHsoYWxsZWdlZEJyYW5kOiBCcmFuZDxhbnk+LCBicmFuZD86IEJyYW5kPGFueT4pID0+IHZvaWR9XG4gKi8kaM2PX29uY2UuYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFzc2VydFZhbHVlR2V0SGVscGVycyk7XG5jb25zdCBvcHRpb25hbEJyYW5kQ2hlY2sgPSAoYWxsZWdlZEJyYW5kLCBicmFuZCkgPT4ge1xuICBpZiAoYnJhbmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgYWxsZWdlZEJyYW5kID09PSBicmFuZCB8fFxuICAgICAgRmFpbGBhbW91bnQncyBicmFuZCAke3EoYWxsZWdlZEJyYW5kKX0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBicmFuZCAke3EoXG4gICAgICAgIGJyYW5kLFxuICAgICAgKX1gO1xuICB9XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+IHwgdW5kZWZpbmVkfSBicmFuZFxuICogQHJldHVybnMge01hdGhIZWxwZXJzPGFueT59XG4gKi9cbmNvbnN0IGNoZWNrTFJBbmRHZXRIZWxwZXJzID0gKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICBhc3NlcnRSZWNvcmQobGVmdEFtb3VudCwgJ2xlZnRBbW91bnQnKTtcbiAgYXNzZXJ0UmVjb3JkKHJpZ2h0QW1vdW50LCAncmlnaHRBbW91bnQnKTtcbiAgY29uc3QgeyB2YWx1ZTogbGVmdFZhbHVlLCBicmFuZDogbGVmdEJyYW5kIH0gPSBsZWZ0QW1vdW50O1xuICBjb25zdCB7IHZhbHVlOiByaWdodFZhbHVlLCBicmFuZDogcmlnaHRCcmFuZCB9ID0gcmlnaHRBbW91bnQ7XG4gIGFzc2VydFJlbW90YWJsZShsZWZ0QnJhbmQsICdsZWZ0QnJhbmQnKTtcbiAgYXNzZXJ0UmVtb3RhYmxlKHJpZ2h0QnJhbmQsICdyaWdodEJyYW5kJyk7XG4gIG9wdGlvbmFsQnJhbmRDaGVjayhsZWZ0QnJhbmQsIGJyYW5kKTtcbiAgb3B0aW9uYWxCcmFuZENoZWNrKHJpZ2h0QnJhbmQsIGJyYW5kKTtcbiAgbGVmdEJyYW5kID09PSByaWdodEJyYW5kIHx8XG4gICAgRmFpbGBCcmFuZHMgaW4gbGVmdCAke3EobGVmdEJyYW5kKX0gYW5kIHJpZ2h0ICR7cShcbiAgICAgIHJpZ2h0QnJhbmQsXG4gICAgKX0gc2hvdWxkIG1hdGNoIGJ1dCBkbyBub3RgO1xuICBjb25zdCBsZWZ0SGVscGVycyA9IGFzc2VydFZhbHVlR2V0SGVscGVycyhsZWZ0VmFsdWUpO1xuICBjb25zdCByaWdodEhlbHBlcnMgPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnMocmlnaHRWYWx1ZSk7XG4gIGxlZnRIZWxwZXJzID09PSByaWdodEhlbHBlcnMgfHxcbiAgICBGYWlsYFRoZSBsZWZ0ICR7bGVmdEFtb3VudH0gYW5kIHJpZ2h0IGFtb3VudCAke3JpZ2h0QW1vdW50fSBoYWQgZGlmZmVyZW50IGFzc2V0S2luZHNgO1xuICByZXR1cm4gbGVmdEhlbHBlcnM7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge01hdGhIZWxwZXJzPEFzc2V0VmFsdWVGb3JLaW5kPEs+Pn0gaFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHJldHVybnMge1tBc3NldFZhbHVlRm9yS2luZDxLPiwgQXNzZXRWYWx1ZUZvcktpbmQ8Sz5dfVxuICovXG5jb25zdCBjb2VyY2VMUiA9IChoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkgPT4ge1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGFyYml0cmFyeSBzdWJ0eXBlKi9cbiAgcmV0dXJuIFtoLmRvQ29lcmNlKGxlZnRBbW91bnQudmFsdWUpLCBoLmRvQ29lcmNlKHJpZ2h0QW1vdW50LnZhbHVlKV07XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJpZ2h0QW1vdW50LlxuICogVGhlIG5vdGlvbiBvZiBcImdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1wiIGRlcGVuZHMgb24gdGhlIGtpbmQgb2YgYW1vdW50LCBhc1xuICogZGVmaW5lZCBieSB0aGUgTWF0aEhlbHBlcnMuIEZvciBleGFtcGxlLCB3aGV0aGVyIHJlY3RhbmdsZSBBIGlzIGdyZWF0ZXIgdGhhblxuICogcmVjdGFuZ2xlIEIgZGVwZW5kcyBvbiB3aGV0aGVyIHJlY3RhbmdsZSBBIGluY2x1ZGVzIHJlY3RhbmdsZSBCIGFzIGRlZmluZWQgYnlcbiAqIHRoZSBsb2dpYyBpbiBNYXRoSGVscGVycy5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzR1RFID0gKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgcmV0dXJuIGguZG9Jc0dURSguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xufTtcblxuLyoqXG4gKiBMb2dpYyBmb3IgbWFuaXB1bGF0aW5nIGFtb3VudHMuXG4gKlxuICogQW1vdW50cyBhcmUgdGhlIGNhbm9uaWNhbCBkZXNjcmlwdGlvbiBvZiB0cmFkYWJsZSBnb29kcy4gVGhleSBhcmUgbWFuaXB1bGF0ZWRcbiAqIGJ5IGlzc3VlcnMgYW5kIG1pbnRzLCBhbmQgcmVwcmVzZW50IHRoZSBnb29kcyBhbmQgY3VycmVuY3kgY2FycmllZCBieSBwdXJzZXNcbiAqIGFuZCBwYXltZW50cy4gVGhleSBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgdGhpbmdzIGxpa2UgY3VycmVuY3ksIHN0b2NrLCBhbmRcbiAqIHRoZSBhYnN0cmFjdCByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgZXhjaGFuZ2UuXG4gKi9cbiAgICAgICBjb25zdCBBbW91bnRNYXRoID0ge1xuICAvKiBUT0RPIHVzZSBvdmVybG9hZGluZyB0byBoYW5kbGUgd2hlbiBCcmFuZCBoYXMgYW4gQXNzZXRLaW5kIGFuZCB3aGVuIGl0IGRvZXNuJ3QuKi9cbiAgLyogYSBBbW91bnRGb3JWYWx1ZSB1dGlsaXR5IGNvdWxkIGhlbHAgRFJZIHRob3NlIGNhc2VzLiovXG4gIC8qKlxuICogTWFrZSBhbiBhbW91bnQgZnJvbSBhIHZhbHVlIGJ5IGFkZGluZyB0aGUgYnJhbmQuXG4gKlxuICogRG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlIEJyYW5kJ3MgQXNzZXRLaW5kIG1hdGNoZXMgdGhlIHZhbHVlJ3MuXG4gKlxuICogQHRlbXBsYXRlIHtCcmFuZDxhbnk+fSBCXG4gKiBAdGVtcGxhdGUge05hdFZhbHVlIHwgQ29weVNldCB8IENvcHlCYWcgfCBTZXRWYWx1ZX0gVlxuICogQHBhcmFtIHtCfSBicmFuZFxuICogQHBhcmFtIHtWfSBhbGxlZ2VkVmFsdWVcbiAqIEByZXR1cm5zIHtCIGV4dGVuZHMgQnJhbmQ8J25hdCc+XG4gKiAgICAgPyBOYXRBbW91bnRcbiAqICAgICA6IFYgZXh0ZW5kcyBOYXRWYWx1ZVxuICogICAgICAgPyBOYXRBbW91bnRcbiAqICAgICAgIDogViBleHRlbmRzIENvcHlTZXRcbiAqICAgICAgICAgPyBDb3B5U2V0QW1vdW50PFZbJ3BheWxvYWQnXVswXT5cbiAqICAgICAgICAgOiBWIGV4dGVuZHMgQ29weUJhZ1xuICogICAgICAgICAgID8gQ29weUJhZ0Ftb3VudDxWWydwYXlsb2FkJ11bMF1bMF0+XG4gKiAgICAgICAgICAgOiBWIGV4dGVuZHMgU2V0VmFsdWVcbiAqICAgICAgICAgICAgID8gU2V0QW1vdW50PFZbMF0+XG4gKiAgICAgICAgICAgICA6IG5ldmVyfVxuICovXG4gIG1ha2U6IChicmFuZCwgYWxsZWdlZFZhbHVlKSA9PiB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBjb25zdCBoID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFsbGVnZWRWYWx1ZSk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvQ29lcmNlKGFsbGVnZWRWYWx1ZSk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKipcbiAqIE1ha2Ugc3VyZSB0aGlzIGFtb3VudCBpcyB2YWxpZCBlbm91Z2gsIGFuZCByZXR1cm4gYSBjb3JyZXNwb25kaW5nIHZhbGlkXG4gKiBhbW91bnQgaWYgc28uXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge0F9IGFsbGVnZWRBbW91bnRcbiAqIEByZXR1cm5zIHtBfVxuICovXG4gIGNvZXJjZTogKGJyYW5kLCBhbGxlZ2VkQW1vdW50KSA9PiB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBhc3NlcnRSZWNvcmQoYWxsZWdlZEFtb3VudCwgJ2Ftb3VudCcpO1xuICAgIGNvbnN0IHsgYnJhbmQ6IGFsbGVnZWRCcmFuZCwgdmFsdWU6IGFsbGVnZWRWYWx1ZSB9ID0gYWxsZWdlZEFtb3VudDtcbiAgICBicmFuZCA9PT0gYWxsZWdlZEJyYW5kIHx8XG4gICAgICBGYWlsYFRoZSBicmFuZCBpbiB0aGUgYWxsZWdlZEFtb3VudCAke2FsbGVnZWRBbW91bnR9IGluICdjb2VyY2UnIGRpZG4ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIGJyYW5kICR7YnJhbmR9LmA7XG4gICAgLyogV2lsbCB0aHJvdyBvbiBpbmFwcHJvcHJpYXRlIHZhbHVlKi9cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIHJldHVybiBBbW91bnRNYXRoLm1ha2UoYnJhbmQsIGFsbGVnZWRWYWx1ZSk7XG4gIH0sXG4gIC8qKlxuICogRXh0cmFjdCBhbmQgcmV0dXJuIHRoZSB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7QX0gYW1vdW50XG4gKiBAcmV0dXJucyB7QVsndmFsdWUnXX1cbiAqL1xuICBnZXRWYWx1ZTogKGJyYW5kLCBhbW91bnQpID0+IEFtb3VudE1hdGguY29lcmNlKGJyYW5kLCBhbW91bnQpLnZhbHVlLFxuICAvKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQuIFRoaXMgaXMgdGhlIGlkZW50aXR5XG4gKiBlbGVtZW50IGZvciBNYXRoSGVscGVycy5hZGQgYW5kIE1hdEhlbHBlcnMuc3VidHJhY3QuXG4gKlxuICogQHR5cGUge3tcbiAqICAgKGJyYW5kOiBCcmFuZCk6IEFtb3VudDwnbmF0Jz47XG4gKiAgIDxLIGV4dGVuZHMgQXNzZXRLaW5kPihicmFuZDogQnJhbmQ8Sz4sIGFzc2V0S2luZDogSyk6IEFtb3VudDxLPjtcbiAqIH19XG4gKi9cbiAgbWFrZUVtcHR5OiAoYnJhbmQsIGFzc2V0S2luZCA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICgnbmF0JykpID0+IHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuICAgIGNvbnN0IHZhbHVlID0gaGVscGVyc1thc3NldEtpbmRdLmRvTWFrZUVtcHR5KCk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggbmFycm93aW5nIGZyb20gZnVuY3Rpb24gb3ZlcmxvYWQqL1xuICAgIHJldHVybiBoYXJkZW4oeyBicmFuZCwgdmFsdWUgfSk7XG4gIH0sXG4gIC8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudCwgdXNpbmcgYW5vdGhlciBhbW91bnQgYXMgdGhlXG4gKiB0ZW1wbGF0ZSBmb3IgdGhlIGJyYW5kIGFuZCBhc3NldEtpbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QX0gYW1vdW50XG4gKiBAcmV0dXJucyB7QX1cbiAqL1xuICBtYWtlRW1wdHlGcm9tQW1vdW50OiBhbW91bnQgPT4ge1xuICAgIGFzc2VydFJlY29yZChhbW91bnQsICdhbW91bnQnKTtcbiAgICBjb25zdCB7IGJyYW5kLCB2YWx1ZSB9ID0gYW1vdW50O1xuICAgIGNvbnN0IGFzc2V0S2luZCA9IGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGRpZmZlcmVudCBzdWJ0eXBlKi9cbiAgICByZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG4gIH0sXG4gIC8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIEFtb3VudCBpcyBlbXB0eS4gT3RoZXJ3aXNlIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGlzRW1wdHk6IChhbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgYXNzZXJ0UmVjb3JkKGFtb3VudCwgJ2Ftb3VudCcpO1xuICAgIGNvbnN0IHsgYnJhbmQ6IGFsbGVnZWRCcmFuZCwgdmFsdWUgfSA9IGFtb3VudDtcbiAgICBhc3NlcnRSZW1vdGFibGUoYWxsZWdlZEJyYW5kLCAnYnJhbmQnKTtcbiAgICBvcHRpb25hbEJyYW5kQ2hlY2soYWxsZWdlZEJyYW5kLCBicmFuZCk7XG4gICAgY29uc3QgaCA9IGFzc2VydFZhbHVlR2V0SGVscGVycyh2YWx1ZSk7XG4gICAgcmV0dXJuIGguZG9Jc0VtcHR5KGguZG9Db2VyY2UodmFsdWUpKTtcbiAgfSxcbiAgaXNHVEUsXG4gIC8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGVxdWFscyB0aGUgcmlnaHRBbW91bnQuIFdlIGFzc3VtZSB0aGF0IGlmXG4gKiBpc0dURSBpcyB0cnVlIGluIGJvdGggZGlyZWN0aW9ucywgaXNFcXVhbCBpcyBhbHNvIHRydWVcbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtBfSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0F9IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kfSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBpc0VxdWFsOiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgcmV0dXJuIGguZG9Jc0VxdWFsKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gIH0sXG4gIC8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgdW5pb24gb2YgYm90aCBsZWZ0QW1vdW50IGFuZCByaWdodEFtb3VudC5cbiAqXG4gKiBGb3IgZnVuZ2libGUgYW1vdW50IHRoaXMgbWVhbnMgYWRkaW5nIHRoZSB2YWx1ZXMuIEZvciBvdGhlciBraW5kcyBvZlxuICogYW1vdW50LCBpdCB1c3VhbGx5IG1lYW5zIGluY2x1ZGluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gYm90aCBsZWZ0IGFuZFxuICogcmlnaHQuXG4gKlxuICogQHR5cGUge3tcbiAqICAgPEEgZXh0ZW5kcyBDb3B5QmFnLCBCIGV4dGVuZHMgQ29weUJhZz4oXG4gKiAgICAgbGVmdEFtb3VudDogQ29weUJhZ0Ftb3VudDxBPixcbiAqICAgICByaWdodEFtb3VudDogQ29weUJhZ0Ftb3VudDxCPixcbiAqICAgICBicmFuZD86IEJyYW5kLFxuICogICApOiBDb3B5QmFnQW1vdW50PEEgfCBCPjtcbiAqICAgPEEgZXh0ZW5kcyBBbW91bnQ+KGxlZnRBbW91bnQ6IEEsIHJpZ2h0QW1vdW50OiBBLCBicmFuZD86IEJyYW5kKTogQTtcbiAqIH19XG4gKi9cbiAgYWRkOiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvQWRkKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gICAgcmV0dXJuIGhhcmRlbih7IGJyYW5kOiBsZWZ0QW1vdW50LmJyYW5kLCB2YWx1ZSB9KTtcbiAgfSxcbiAgLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSBsZWZ0QW1vdW50IG1pbnVzIHRoZSByaWdodEFtb3VudCAoaS5lLlxuICogZXZlcnl0aGluZyBpbiB0aGUgbGVmdEFtb3VudCB0aGF0IGlzIG5vdCBpbiB0aGUgcmlnaHRBbW91bnQpLiBJZiBsZWZ0QW1vdW50XG4gKiBkb2Vzbid0IGluY2x1ZGUgcmlnaHRBbW91bnQgKHN1YnRyYWN0aW9uIHJlc3VsdHMgaW4gYSBuZWdhdGl2ZSksIHRocm93IGFuXG4gKiBlcnJvci4gQmVjYXVzZSB0aGUgbGVmdCBhbW91bnQgbXVzdCBpbmNsdWRlIHRoZSByaWdodCBhbW91bnQsIHRoaXMgaXMgTk9UXG4gKiBlcXVpdmFsZW50IHRvIHNldCBzdWJ0cmFjdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gTFxuICogQHRlbXBsYXRlIHtBbW91bnR9IFJcbiAqIEBwYXJhbSB7TH0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtSfSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge0wgZXh0ZW5kcyBSID8gTCA6IG5ldmVyfVxuICovXG4gIHN1YnRyYWN0OiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvU3VidHJhY3QoLi4uY29lcmNlTFIoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpKTtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGRpZmZlcmVudCBzdWJ0eXBlKi9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQ6IGxlZnRBbW91bnQuYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKipcbiAqIFJldHVybnMgdGhlIG1pbiB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtBfSB4XG4gKiBAcGFyYW0ge0F9IHlcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtBfVxuICovXG4gIG1pbjogKHgsIHksIGJyYW5kID0gdW5kZWZpbmVkKSA9PlxuICAgIGlzR1RFKHgsIHksIGJyYW5kKVxuICAgICAgPyB5XG4gICAgICA6IGlzR1RFKHksIHgsIGJyYW5kKVxuICAgICAgICA/IHhcbiAgICAgICAgOiBGYWlsYCR7eH0gYW5kICR7eX0gYXJlIGluY29tcGFyYWJsZWAsXG4gIC8qKlxuICogUmV0dXJucyB0aGUgbWF4IHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBBXG4gKiBAcGFyYW0ge0F9IHhcbiAqIEBwYXJhbSB7QX0geVxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge0F9XG4gKi9cbiAgbWF4OiAoeCwgeSwgYnJhbmQgPSB1bmRlZmluZWQpID0+XG4gICAgaXNHVEUoeCwgeSwgYnJhbmQpXG4gICAgICA/IHhcbiAgICAgIDogaXNHVEUoeSwgeClcbiAgICAgICAgPyB5XG4gICAgICAgIDogRmFpbGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgLFxufTskaM2PX29uY2UuQW1vdW50TWF0aChBbW91bnRNYXRoKTtcbmhhcmRlbihBbW91bnRNYXRoKTtcblxuLyoqIEBwYXJhbSB7QW1vdW50fSBhbW91bnQgKi9cbiAgICAgICBjb25zdCBnZXRBc3NldEtpbmQgPSBhbW91bnQgPT4ge1xuICBhc3NlcnRSZWNvcmQoYW1vdW50LCAnYW1vdW50Jyk7XG4gIGNvbnN0IHsgdmFsdWUgfSA9IGFtb3VudDtcbiAgcmV0dXJuIGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbn07JGjNj19vbmNlLmdldEFzc2V0S2luZChnZXRBc3NldEtpbmQpO1xuaGFyZGVuKGdldEFzc2V0S2luZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJBc3NldEtpbmQiOlsiQXNzZXRLaW5kIl0sImFzc2VydEFzc2V0S2luZCI6WyJhc3NlcnRBc3NldEtpbmQiXSwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIjpbImFzc2VydFZhbHVlR2V0SGVscGVycyJdLCJBbW91bnRNYXRoIjpbIkFtb3VudE1hdGgiXSwiZ2V0QXNzZXRLaW5kIjpbImdldEFzc2V0S2luZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABf6b1eegUAAHoFAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyJdLCJleHBvcnRzIjpbIm1ha2VBbW91bnRTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEFtb3VudE1hdGg7JGjNj19pbXBvcnRzKFtbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV1dKTtcblxuLyoqIEBpbXBvcnQge0Ftb3VudCwgQXNzZXRLaW5kfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbW91bnRTdG9yZVxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IGdldEFtb3VudFxuICogQHByb3BlcnR5IHsoZGVsdGE6IEFtb3VudDxLPikgPT4gdm9pZH0gaW5jcmVtZW50XG4gKiBAcHJvcGVydHkgeyhkZWx0YTogQW1vdW50PEs+KSA9PiBib29sZWFufSBkZWNyZW1lbnRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge29iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtBbW91bnRTdG9yZTxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VBbW91bnRTdG9yZSA9IChzdGF0ZSwga2V5KSA9PiB7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGdldEFtb3VudDogKCkgPT4gc3RhdGVba2V5XSxcbiAgICBpbmNyZW1lbnQ6IGRlbHRhID0+IHtcbiAgICAgIHN0YXRlW2tleV0gPSBBbW91bnRNYXRoLmFkZChzdGF0ZVtrZXldLCBkZWx0YSk7XG4gICAgfSxcbiAgICBkZWNyZW1lbnQ6IGRlbHRhID0+IHtcbiAgICAgIGlmIChBbW91bnRNYXRoLmlzR1RFKHN0YXRlW2tleV0sIGRlbHRhKSkge1xuICAgICAgICBzdGF0ZVtrZXldID0gQW1vdW50TWF0aC5zdWJ0cmFjdChzdGF0ZVtrZXldLCBkZWx0YSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUFtb3VudFN0b3JlKG1ha2VBbW91bnRTdG9yZSk7XG5oYXJkZW4obWFrZUFtb3VudFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBbW91bnRTdG9yZSI6WyJtYWtlQW1vdW50U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQ7172XQGAAB0BgAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9kaXNwbGF5SW5mby5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiY29lcmNlRGlzcGxheUluZm8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG11c3RNYXRjaCxEaXNwbGF5SW5mb1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRGlzcGxheUluZm9TaGFwZVwiLFskaM2PX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge0FkZGl0aW9uYWxEaXNwbGF5SW5mbywgQXNzZXRLaW5kLCBEaXNwbGF5SW5mb30gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuLyoqXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gYWxsZWdlZERpc3BsYXlJbmZvXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcmV0dXJucyB7RGlzcGxheUluZm99XG4gKi9cbiAgICAgICBjb25zdCBjb2VyY2VEaXNwbGF5SW5mbyA9IChhbGxlZ2VkRGlzcGxheUluZm8sIGFzc2V0S2luZCkgPT4ge1xuICBtdXN0TWF0Y2goYWxsZWdlZERpc3BsYXlJbmZvLCBEaXNwbGF5SW5mb1NoYXBlLCAnZGlzcGxheUluZm8nKTtcblxuICBpZiAoYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZCA9PT0gYXNzZXRLaW5kIHx8XG4gICAgICBGYWlsYGRpc3BsYXlJbmZvLmFzc2V0S2luZCB3YXMgcHJlc2VudCAoJHthbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kfSkgYW5kIGRpZCBub3QgbWF0Y2ggdGhlIGFzc2V0S2luZCBhcmd1bWVudCAoJHthc3NldEtpbmR9KWA7XG4gIH1cbiAgY29uc3QgZGlzcGxheUluZm8gPSBoYXJkZW4oeyAuLi5hbGxlZ2VkRGlzcGxheUluZm8sIGFzc2V0S2luZCB9KTtcblxuICBpZiAoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTnVtYmVyLmlzU2FmZUludGVnZXIoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcykgfHxcbiAgICAgIEZhaWxgZGVjaW1hbFBsYWNlcyAke2Rpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXN9IGlzIG5vdCBhIHNhZmUgaW50ZWdlcmA7XG4gIH1cblxuICByZXR1cm4gZGlzcGxheUluZm87XG59OyRozY9fb25jZS5jb2VyY2VEaXNwbGF5SW5mbyhjb2VyY2VEaXNwbGF5SW5mbyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb2VyY2VEaXNwbGF5SW5mbyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADzX00DTQIAAE0CAAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2Ftb3VudE1hdGguanNcIiwgW11dLFtcIi4vaXNzdWVyS2l0LmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vdHlwZXMtaW5kZXguanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAaD6Qc8c8AADHPAAAJQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pc3N1ZXJLaXQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3pvbmUvZHVyYWJsZS5qcyIsIi4vYW1vdW50TWF0aC5qcyIsIi4vZGlzcGxheUluZm8uanMiLCIuL3BheW1lbnRMZWRnZXIuanMiXSwiZXhwb3J0cyI6WyJoYXNJc3N1ZXIiLCJtYWtlRHVyYWJsZUlzc3VlcktpdCIsIm1ha2VJc3N1ZXJLaXQiLCJwcmVwYXJlSXNzdWVyS2l0IiwidXBncmFkZUlzc3VlcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydCxGYWlsLGFzc2VydFBhdHRlcm4sbWFrZVNjYWxhckJpZ01hcFN0b3JlLG1ha2VEdXJhYmxlWm9uZSxBc3NldEtpbmQsYXNzZXJ0QXNzZXRLaW5kLGNvZXJjZURpc3BsYXlJbmZvLHByZXBhcmVQYXltZW50TGVkZ2VyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIixbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzXCIsIFtbXCJtYWtlRHVyYWJsZVpvbmVcIixbJGjNj19hID0+IChtYWtlRHVyYWJsZVpvbmUgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFzc2V0S2luZFwiLFskaM2PX2EgPT4gKEFzc2V0S2luZCA9ICRozY9fYSldXSxbXCJhc3NlcnRBc3NldEtpbmRcIixbJGjNj19hID0+IChhc3NlcnRBc3NldEtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL2Rpc3BsYXlJbmZvLmpzXCIsIFtbXCJjb2VyY2VEaXNwbGF5SW5mb1wiLFskaM2PX2EgPT4gKGNvZXJjZURpc3BsYXlJbmZvID0gJGjNj19hKV1dXV0sW1wiLi9wYXltZW50TGVkZ2VyLmpzXCIsIFtbXCJwcmVwYXJlUGF5bWVudExlZGdlclwiLFskaM2PX2EgPT4gKHByZXBhcmVQYXltZW50TGVkZ2VyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXksIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge1NodXRkb3duV2l0aEZhaWx1cmV9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JztcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJztcbiAqIEBpbXBvcnQge0FkZGl0aW9uYWxEaXNwbGF5SW5mbywgUmVjb3ZlcnlTZXRzT3B0aW9uLCBJc3N1ZXJLaXQsIFBheW1lbnRMZWRnZXJ9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kXG4gKiBAcHJvcGVydHkge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKi9cblxuLyoqXG4gKiBVc2VkIF9vbmx5XyBpbnRlcm5hbGx5LCB0byBtYWtlIGEgbmV3IGlzc3VlcktpdCBvciB0byByZXZpdmUgYW4gb2xkIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmQ8Sz59IGlzc3VlclJlY29yZFxuICogQHBhcmFtIHtab25lfSBpc3N1ZXJab25lXG4gKiBAcGFyYW0ge1JlY292ZXJ5U2V0c09wdGlvbn0gcmVjb3ZlcnlTZXRzU3RhdGUgT21pdHRlZCBmcm9tIGlzc3VlclJlY29yZFxuICogICBiZWNhdXNlIGl0IHdhcyBhZGRlZCBpbiBhbiB1cGdyYWRlLlxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0IHNldHVwSXNzdWVyS2l0ID0gKFxuICB7IG5hbWUsIGFzc2V0S2luZCwgZGlzcGxheUluZm8sIGVsZW1lbnRTaGFwZSB9LFxuICBpc3N1ZXJab25lLFxuICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5cbiAgLyogQWRkIGFzc2V0S2luZCB0byBkaXNwbGF5SW5mbywgb3Igb3ZlcnJpZGUgaWYgcHJlc2VudCovXG4gIGNvbnN0IGNsZWFuRGlzcGxheUluZm8gPSBjb2VyY2VEaXNwbGF5SW5mbyhkaXNwbGF5SW5mbywgYXNzZXRLaW5kKTtcbiAgaWYgKG9wdFNodXRkb3duV2l0aEZhaWx1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwgJ2Z1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAoZWxlbWVudFNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gIH1cblxuICAvKiBBdHRlbnVhdGUgdGhlIHBvd2VyZnVsIGF1dGhvcml0eSB0byBtaW50IGFuZCBjaGFuZ2UgYmFsYW5jZXMqL1xuICAvKiogQHR5cGUge1BheW1lbnRMZWRnZXI8Sz59ICovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSovXG4gIGNvbnN0IHsgaXNzdWVyLCBtaW50LCBicmFuZCwgbWludFJlY292ZXJ5UHVyc2UgfSA9IHByZXBhcmVQYXltZW50TGVkZ2VyKFxuICAgIGlzc3VlclpvbmUsXG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgY2xlYW5EaXNwbGF5SW5mbyxcbiAgICBlbGVtZW50U2hhcGUsXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBicmFuZCxcbiAgICBpc3N1ZXIsXG4gICAgbWludCxcbiAgICBtaW50UmVjb3ZlcnlQdXJzZSxcbiAgICBkaXNwbGF5SW5mbzogY2xlYW5EaXNwbGF5SW5mbyxcbiAgfSk7XG59O1xuaGFyZGVuKHNldHVwSXNzdWVyS2l0KTtcblxuLyoqIFRoZSBrZXkgYXQgd2hpY2ggdGhlIGlzc3VlciByZWNvcmQgaXMgc3RvcmVkLiAqL1xuY29uc3QgSU5TVEFOQ0VfS0VZID0gJ2lzc3Vlcic7XG4vKipcbiAqIFRoZSBrZXkgYXQgd2hpY2ggdGhlIGlzc3VlcktpdCdzIGBSZWNvdmVyeVNldHNPcHRpb25gIHN0YXRlIGlzIHN0b3JlZC5cbiAqIEludHJvZHVjZWQgYnkgYW4gdXBncmFkZSwgc28gbWF5IGJlIGFic2VudCBvbiBhIHByZWRlY2Vzc29yIGluY2FybmF0aW9uLiBTZWVcbiAqIGBSZWNvdmVyeVNldHNPcHRpb25gIGZvciBkZWZhdWx0aW5nIGJlaGF2aW9yLlxuICovXG5jb25zdCBSRUNPVkVSWV9TRVRTX1NUQVRFID0gJ3JlY292ZXJ5U2V0c1N0YXRlJztcblxuLyoqXG4gKiBVc2VkIF9vbmx5XyB0byB1cGdyYWRlIGEgcHJlZGVjZXNzb3IgaXNzdWVyS2l0LiBVc2UgYG1ha2VEdXJhYmxlSXNzdWVyS2l0YCB0b1xuICogbWFrZSBhIG5ldyBvbmUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7UmVjb3ZlcnlTZXRzT3B0aW9ufSBbcmVjb3ZlcnlTZXRzT3B0aW9uXSBBZGRlZCBpbiB1cGdyYWRlLCBzbyBsYXN0XG4gKiAgIGFuZCBvcHRpb25hbC4gU2VlIGBSZWNvdmVyeVNldHNPcHRpb25gIGZvciBkZWZhdWx0aW5nIGJlaGF2aW9yLlxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IHVwZ3JhZGVJc3N1ZXJLaXQgPSAoXG4gIGlzc3VlckJhZ2dhZ2UsXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBpc3N1ZXJSZWNvcmQgPSBpc3N1ZXJCYWdnYWdlLmdldChJTlNUQU5DRV9LRVkpO1xuICBjb25zdCBpc3N1ZXJab25lID0gbWFrZUR1cmFibGVab25lKGlzc3VlckJhZ2dhZ2UpO1xuICBjb25zdCBvbGRSZWNvdmVyeVNldHNTdGF0ZSA9IGlzc3VlckJhZ2dhZ2UuaGFzKFJFQ09WRVJZX1NFVFNfU1RBVEUpXG4gICAgPyBpc3N1ZXJCYWdnYWdlLmdldChSRUNPVkVSWV9TRVRTX1NUQVRFKVxuICAgIDogJ2hhc1JlY292ZXJ5U2V0cyc7XG4gIGlmIChcbiAgICBvbGRSZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJyAmJlxuICAgIHJlY292ZXJ5U2V0c09wdGlvbiA9PT0gJ2hhc1JlY292ZXJ5U2V0cydcbiAgKSB7XG4gICAgRmFpbGBDYW5ub3QgKHlldD8pIHVwZ3JhZGUgZnJvbSAnbm9SZWNvdmVyeVNldHMnIHRvICdoYXNSZWNvdmVyeVNldHMnYDtcbiAgfVxuICAvKiBFeHRhbnQgc2V0cyBhcmUgbm90IGN1cnJlbnRseSBkZWxldGVkLiBJZiB0aGUgbmV3IG9wdGlvbiBpcyovXG4gIC8qICdub1JlY292ZXJ5U2V0cycsIHRoZXkgd29uJ3QgYmUgdXNlZCBidXQgZXh0YW50IG9uZXMgd2lsbCByZW1haW4uIEZ1dHVyZSovXG4gIC8qIHVwZ3JhZGVzIG1heSBtYWtlIGl0IHBvc3NpYmxlIHRvIGRlbGV0ZSBlbGVtZW50cyBmcm9tIHRoZW0uKi9cbiAgY29uc3QgcmVjb3ZlcnlTZXRzU3RhdGUgPSByZWNvdmVyeVNldHNPcHRpb24gfHwgb2xkUmVjb3ZlcnlTZXRzU3RhdGU7XG4gIHJldHVybiBzZXR1cElzc3VlcktpdChcbiAgICBpc3N1ZXJSZWNvcmQsXG4gICAgaXNzdWVyWm9uZSxcbiAgICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICApO1xufTskaM2PX29uY2UudXBncmFkZUlzc3VlcktpdCh1cGdyYWRlSXNzdWVyS2l0KTtcbmhhcmRlbih1cGdyYWRlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBEb2VzIGJhZ2dhZ2UgYWxyZWFkeSBoYXZlIGFuIGlzc3VlcktpdD9cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuICAgICAgIGNvbnN0IGhhc0lzc3VlciA9IGJhZ2dhZ2UgPT4gYmFnZ2FnZS5oYXMoSU5TVEFOQ0VfS0VZKTtcblxuLyoqXG4gKiBgZWxlbWVudFNoYXBlYCwgbWF5IG9ubHkgYmUgcHJlc2VudCBmb3IgY29sbGVjdGlvbi1zdHlsZSBhbW91bnRzLiBJZiBwcmVzZW50LFxuICogaXQgaXMgYSBgUGF0dGVybmAgdGhhdCBldmVyeSBlbGVtZW50IG9mIHRoaXMgaXNzdWVyS2l0cydzIGFtb3VudHMgbXVzdFxuICogc2F0aXNmeS4gRm9yIGV4YW1wbGUsIHRoZSBab2UgSW52aXRhdGlvbiBpc3N1ZXJLaXQgdXNlcyBhbiBlbGVtZW50U2hhcGVcbiAqIGRlc2NyaWJpbmcgdGhlIGludml0YXRpb24gZGV0YWlscyBmb3IgYW4gaW5kaXZpZHVhbCBpbnZpdGF0aW9uLiBBbiBpbnZpdGF0aW9uXG4gKiBwdXJzZSBvciBwYXltZW50IGhhcyBhbiBhbW91bnQgdGhhdCBjYW4gb25seSBiZSBhIHNldCBvZiB0aGVzZS4gKFRob3VnaFxuICogdHlwaWNhbGx5LCB0aGUgYW1vdW50IG9mIGFuIGludml0YXRpb24gcGF5bWVudCBpcyBhIHNpbmdsZXRvbiBzZXQuIFN1Y2ggYVxuICogcGF5bWVudCBpcyBvZnRlbiByZWZlcnJlZCB0byBpbiB0aGUgc2luZ3VsYXIgYXMgXCJhbiBpbnZpdGF0aW9uXCIuKVxuICpcbiAqIGByZWNvdmVyeVNldHNPcHRpb25gIGFkZGVkIGluIHVwZ3JhZGUuIE5vdGUgdGhhdCBgSXNzdWVyT3B0aW9uc1JlY29yZGAgaXNcbiAqIG5ldmVyIHN0b3JlZCwgc28gd2UgbmV2ZXIgbmVlZCB0byB3b3JyeSBhYm91dCBpbmhlcml0aW5nIG9uZSBmcm9tIGFcbiAqIHByZWRlY2Vzc29yIHByZWRhdGluZyB0aGUgaW50cm9kdWN0aW9uIG9mIHJlY292ZXJ5IHNldHMuIFNlZVxuICogYFJlY292ZXJ5U2V0c09wdGlvbmAgZm9yIGRlZmF1bHRpbmcgYmVoYXZpb3IuXG4gKlxuICogQHR5cGVkZWYge1BhcnRpYWw8e1xuICogICBlbGVtZW50U2hhcGU6IFBhdHRlcm47XG4gKiAgIHJlY292ZXJ5U2V0c09wdGlvbjogUmVjb3ZlcnlTZXRzT3B0aW9uO1xuICogfT59IElzc3Vlck9wdGlvbnNSZWNvcmRcbiAqL1xuXG4vKipcbiAqIFVzZWQgX29ubHlfIHRvIG1ha2UgYSBfbmV3XyBkdXJhYmxlIGlzc3VlciwgaS5lLiwgdGhlIGluaXRpYWwgaW5jYXJuYXRpb24gb2ZcbiAqIHRoYXQgaXNzdWVyLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXRcbiAqICAgZGVzY3JpcHRpb25zLiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiAgIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLiBGb3JcbiAqICAgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0IGl0IGlzXG4gKiAgIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmcgdG8gdGhhdCBpc3N1ZXJcbiAqICAgYW5kIGJyYW5kLlxuICpcbiAqICAgVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnMgZnJvbSB0aGVcbiAqICAgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGUgZGVmYXVsdCwgaXMgdXNlZCBmb3JcbiAqICAgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm9dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi8kaM2PX29uY2UuaGFzSXNzdWVyKGhhc0lzc3Vlcik7XG4gICAgICAgY29uc3QgbWFrZUR1cmFibGVJc3N1ZXJLaXQgPSAoXG4gIGlzc3VlckJhZ2dhZ2UsXG4gIG5hbWUsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG4gIGFzc2V0S2luZCA9IEFzc2V0S2luZC5OQVQsXG4gIGRpc3BsYXlJbmZvID0gaGFyZGVuKHt9KSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbiAgeyBlbGVtZW50U2hhcGUgPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgaXNzdWVyRGF0YSA9IGhhcmRlbih7XG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgZGlzcGxheUluZm8sXG4gICAgZWxlbWVudFNoYXBlLFxuICB9KTtcbiAgaXNzdWVyQmFnZ2FnZS5pbml0KElOU1RBTkNFX0tFWSwgaXNzdWVyRGF0YSk7XG4gIGNvbnN0IGlzc3VlclpvbmUgPSBtYWtlRHVyYWJsZVpvbmUoaXNzdWVyQmFnZ2FnZSk7XG4gIGNvbnN0IHJlY292ZXJ5U2V0c1N0YXRlID0gcmVjb3ZlcnlTZXRzT3B0aW9uIHx8ICdoYXNSZWNvdmVyeVNldHMnO1xuICBpc3N1ZXJCYWdnYWdlLmluaXQoUkVDT1ZFUllfU0VUU19TVEFURSwgcmVjb3ZlcnlTZXRzU3RhdGUpO1xuICByZXR1cm4gc2V0dXBJc3N1ZXJLaXQoXG4gICAgaXNzdWVyRGF0YSxcbiAgICBpc3N1ZXJab25lLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICk7XG59OyRozY9fb25jZS5tYWtlRHVyYWJsZUlzc3VlcktpdChtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIFVzZWQgdG8gZWl0aGVyIHJldml2ZSBhIHByZWRlY2Vzc29yIGlzc3VlcktpdCwgb3IgdG8gbWFrZSBhIG5ldyBkdXJhYmxlIG9uZVxuICogaWYgaXQgaXMgYWJzZW50LCBhbmQgdG8gcGxhY2UgaXQgaW4gYmFnZ2FnZSBmb3IgdGhlIG5leHQgc3VjY2Vzc29yLlxuICpcbiAqIEB0ZW1wbGF0ZSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gT1xuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEsgVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldFxuICogICBkZXNjcmlwdGlvbnMuIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqICAgYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuIEZvclxuICogICBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXQgaXQgaXNcbiAqICAgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZyB0byB0aGF0IGlzc3VlclxuICogICBhbmQgYnJhbmQuXG4gKlxuICogICBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVycyBmcm9tIHRoZVxuICogICBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZSBkZWZhdWx0LCBpcyB1c2VkIGZvclxuICogICBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mb11cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge099IFtvcHRpb25zXVxuICogQHJldHVybnMge09bJ2VsZW1lbnRTaGFwZSddIGV4dGVuZHMgVHlwZWRQYXR0ZXJuPGluZmVyIFQgZXh0ZW5kcyBLZXk+XG4gKiAgICAgPyBJc3N1ZXJLaXQ8SywgVD5cbiAqICAgICA6IElzc3VlcktpdDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVJc3N1ZXJLaXQgPSAoXG4gIGlzc3VlckJhZ2dhZ2UsXG4gIG5hbWUsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG4gIGFzc2V0S2luZCA9IEFzc2V0S2luZC5OQVQsXG4gIGRpc3BsYXlJbmZvID0gaGFyZGVuKHt9KSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBoYXZlIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgSXNzdWVyT3B0aW9uc1JlY29yZCovXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBpZiAoaGFzSXNzdWVyKGlzc3VlckJhZ2dhZ2UpKSB7XG4gICAgY29uc3QgeyBlbGVtZW50U2hhcGU6IF8gPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID1cbiAgICAgIG9wdGlvbnM7XG4gICAgY29uc3QgaXNzdWVyS2l0ID0gdXBncmFkZUlzc3VlcktpdChcbiAgICAgIGlzc3VlckJhZ2dhZ2UsXG4gICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICAgICAgcmVjb3ZlcnlTZXRzT3B0aW9uLFxuICAgICk7XG5cbiAgICAvKiBUT0RPIGNoZWNrIGNvbnNpc3RlbmN5IHdpdGggbmFtZSwgYXNzZXRLaW5kLCBkaXNwbGF5SW5mbywgZWxlbWVudFNoYXBlLiovXG4gICAgLyogQ29uc2lzdGVuY3kgZWl0aGVyIG1lYW5zIHRoYXQgdGhlc2UgYXJlIHRoZSBzYW1lLCBvciB0aGF0IHRoZXkgZGlmZmVyKi9cbiAgICAvKiBpbiBhIGRpcmVjdGlvbiB3ZSBhcmUgcHJlcGFyZWQgdG8gdXBncmFkZS4gTm90ZSB0aGF0IGl0IGlzIHRoZSovXG4gICAgLyogcmVzcG9uc2liaWxpdHkgb2YgYHVwZ3JhZGVJc3N1ZXJLaXRgIHRvIGNoZWNrIGNvbnNpc3RlbmN5IG9mKi9cbiAgICAvKiBgcmVjb3ZlcnlTZXRzT3B0aW9uYCwgc28gY29udGludWUgdG8gbm90IGRvIHRoYXQgaGVyZS4qL1xuXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBUeXBlIHBhcmFtZXRlciBjb25mdXNpb24uKi9cbiAgICByZXR1cm4gaXNzdWVyS2l0O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGlzc3VlcktpdCA9IG1ha2VEdXJhYmxlSXNzdWVyS2l0KFxuICAgICAgaXNzdWVyQmFnZ2FnZSxcbiAgICAgIG5hbWUsXG4gICAgICBhc3NldEtpbmQsXG4gICAgICBkaXNwbGF5SW5mbyxcbiAgICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IHRvIHRoZSB0eXBlIHBhcmFtZXRlciovXG4gICAgcmV0dXJuIGlzc3VlcktpdDtcbiAgfVxufTskaM2PX29uY2UucHJlcGFyZUlzc3VlcktpdChwcmVwYXJlSXNzdWVyS2l0KTtcbmhhcmRlbihwcmVwYXJlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBVc2VkIF9vbmx5XyB0byBtYWtlIGEgbmV3IGlzc3VlcktpdCB0aGF0IGlzIGVmZmVjdGl2ZWx5IG5vbi1kdXJhYmxlLiBUaGlzIGlzXG4gKiBjdXJyZW50bHkgZG9uZSBieSBtYWtpbmcgYSBkdXJhYmxlIG9uZSBpbiBhIGJhZ2dhZ2Ugbm90IHJlYWNoYWJsZSBmcm9tXG4gKiBhbnl3aGVyZS4gVE9ETyBPbmNlIHJlYnVpbHQgb24gem9uZXMsIHRoaXMgc2hvdWxkIGluc3RlYWQganVzdCBidWlsZCBvbiB0aGVcbiAqIHZpcnR1YWwgem9uZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzcxMTZcbiAqXG4gKiBDdXJyZW50bHkgdXNlZCBmb3IgdGVzdGluZyBvbmx5LiBTaG91bGQgcHJvYmFibHkgY29udGludWUgdG8gYmUgdXNlZCBmb3JcbiAqIHRlc3Rpbmcgb25seS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9J25hdCddXG4gKiBAdGVtcGxhdGUge0lzc3Vlck9wdGlvbnNSZWNvcmR9IFtPPXt9XVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldFxuICogICBkZXNjcmlwdGlvbnMuIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqICAgYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuIEZvclxuICogICBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXQgaXQgaXNcbiAqICAgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZyB0byB0aGF0IGlzc3VlclxuICogICBhbmQgYnJhbmQuXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmRdIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljXG4gKiAgIG1hdGhIZWxwZXJzIGZyb20gdGhlIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlXG4gKiAgIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm9dIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb25cbiAqICAgdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtPfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtPWydlbGVtZW50U2hhcGUnXSBleHRlbmRzIFR5cGVkUGF0dGVybjxpbmZlciBUIGV4dGVuZHMgS2V5PlxuICogICAgID8gSXNzdWVyS2l0PEssIFQ+XG4gKiAgICAgOiBJc3N1ZXJLaXQ8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlSXNzdWVyS2l0ID0gKFxuICBuYW1lLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIEsgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuICBhc3NldEtpbmQgPSBBc3NldEtpbmQuTkFULFxuICBkaXNwbGF5SW5mbyA9IGhhcmRlbih7fSksXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgTyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlKi9cbiAgeyBlbGVtZW50U2hhcGUgPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIG1ha2VEdXJhYmxlSXNzdWVyS2l0KFxuICAgIG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZHJvcHBlZCBpc3N1ZXIga2l0JywgeyBkdXJhYmxlOiB0cnVlIH0pLFxuICAgIG5hbWUsXG4gICAgYXNzZXRLaW5kLFxuICAgIGRpc3BsYXlJbmZvLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICAgeyBlbGVtZW50U2hhcGUsIHJlY292ZXJ5U2V0c09wdGlvbiB9LFxuICApOyRozY9fb25jZS5tYWtlSXNzdWVyS2l0KG1ha2VJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VJc3N1ZXJLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidXBncmFkZUlzc3VlcktpdCI6WyJ1cGdyYWRlSXNzdWVyS2l0Il0sImhhc0lzc3VlciI6WyJoYXNJc3N1ZXIiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwicHJlcGFyZUlzc3VlcktpdCI6WyJwcmVwYXJlSXNzdWVyS2l0Il0sIm1ha2VJc3N1ZXJLaXQiOlsibWFrZUlzc3VlcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABU59wlEwYAABMGAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQga2V5RVEsbWFrZUNvcHlCYWcsbXVzdE1hdGNoLE0sZ2V0Q29weUJhZ0VudHJpZXMsYmFnSXNTdXBlcmJhZyxiYWdVbmlvbixiYWdEaXNqb2ludFN1YnRyYWN0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJtYWtlQ29weUJhZ1wiLFskaM2PX2EgPT4gKG1ha2VDb3B5QmFnID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlCYWdFbnRyaWVzID0gJGjNj19hKV1dLFtcImJhZ0lzU3VwZXJiYWdcIixbJGjNj19hID0+IChiYWdJc1N1cGVyYmFnID0gJGjNj19hKV1dLFtcImJhZ1VuaW9uXCIsWyRozY9fYSA9PiAoYmFnVW5pb24gPSAkaM2PX2EpXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLFskaM2PX2EgPT4gKGJhZ0Rpc2pvaW50U3VidHJhY3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtNYXRoSGVscGVyc30gZnJvbSAnLi4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtDb3B5QmFnfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKi9cblxuLyoqIEB0eXBlIHtDb3B5QmFnfSAqL1xuY29uc3QgZW1wdHkgPSBtYWtlQ29weUJhZyhbXSk7XG5cbi8qKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weUJhZz59ICovXG4gICAgICAgY29uc3QgY29weUJhZ01hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IGJhZyA9PiB7XG4gICAgbXVzdE1hdGNoKGJhZywgTS5iYWcoKSwgJ2JhZyBvZiBhbW91bnQnKTtcbiAgICByZXR1cm4gYmFnO1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogYmFnID0+IGdldENvcHlCYWdFbnRyaWVzKGJhZykubGVuZ3RoID09PSAwLFxuICBkb0lzR1RFOiBiYWdJc1N1cGVyYmFnLFxuICBkb0lzRXF1YWw6IGtleUVRLFxuICBkb0FkZDogYmFnVW5pb24sXG4gIGRvU3VidHJhY3Q6IGJhZ0Rpc2pvaW50U3VidHJhY3QsXG59KTskaM2PX29uY2UuY29weUJhZ01hdGhIZWxwZXJzKGNvcHlCYWdNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5QmFnTWF0aEhlbHBlcnMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFod70kmBgAAJgYAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBrZXlFUSxtYWtlQ29weVNldCxtdXN0TWF0Y2gsTSxnZXRDb3B5U2V0S2V5cyxzZXRJc1N1cGVyc2V0LHNldERpc2pvaW50VW5pb24sc2V0RGlzam9pbnRTdWJ0cmFjdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlTZXRcIixbJGjNj19hID0+IChtYWtlQ29weVNldCA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIixbJGjNj19hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRozY9fYSldXSxbXCJzZXRJc1N1cGVyc2V0XCIsWyRozY9fYSA9PiAoc2V0SXNTdXBlcnNldCA9ICRozY9fYSldXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsWyRozY9fYSA9PiAoc2V0RGlzam9pbnRVbmlvbiA9ICRozY9fYSldXSxbXCJzZXREaXNqb2ludFN1YnRyYWN0XCIsWyRozY9fYSA9PiAoc2V0RGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01hdGhIZWxwZXJzfSBmcm9tICcuLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge0NvcHlTZXR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJ1xuICovXG5cbi8qKiBAdHlwZSB7Q29weVNldH0gKi9cbmNvbnN0IGVtcHR5ID0gbWFrZUNvcHlTZXQoW10pO1xuXG4vKiogQHR5cGUge01hdGhIZWxwZXJzPENvcHlTZXQ+fSAqL1xuICAgICAgIGNvbnN0IGNvcHlTZXRNYXRoSGVscGVycyA9IGhhcmRlbih7XG4gIGRvQ29lcmNlOiBzZXQgPT4ge1xuICAgIG11c3RNYXRjaChzZXQsIE0uc2V0KCksICdzZXQgb2YgYW1vdW50Jyk7XG4gICAgcmV0dXJuIHNldDtcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IHNldCA9PiBnZXRDb3B5U2V0S2V5cyhzZXQpLmxlbmd0aCA9PT0gMCxcbiAgZG9Jc0dURTogc2V0SXNTdXBlcnNldCxcbiAgZG9Jc0VxdWFsOiBrZXlFUSxcbiAgZG9BZGQ6IHNldERpc2pvaW50VW5pb24sXG4gIGRvU3VidHJhY3Q6IHNldERpc2pvaW50U3VidHJhY3QsXG59KTskaM2PX29uY2UuY29weVNldE1hdGhIZWxwZXJzKGNvcHlTZXRNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5U2V0TWF0aEhlbHBlcnMiOlsiY29weVNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABnzLX7PBgAAzwYAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsibmF0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLE5hdCxpc05hdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXSxbXCJpc05hdFwiLFskaM2PX2EgPT4gKGlzTmF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqIEBpbXBvcnQge01hdGhIZWxwZXJzLCBOYXRWYWx1ZX0gZnJvbSAnLi4vdHlwZXMuanMnICovXG5cbmNvbnN0IGVtcHR5ID0gMG47XG5cbi8qKlxuICogRnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdXNlIHRoZSBuYXRNYXRoSGVscGVycyB0byBtYW5hZ2UgYmFsYW5jZXMgLSB0aGVcbiAqIG9wZXJhdGlvbnMgYXJlIG1lcmVseSBhcml0aG1ldGljIG9uIG5hdHVyYWwsIG5vbi1uZWdhdGl2ZSBudW1iZXJzLlxuICpcbiAqIE5hdHVyYWwgbnVtYmVycyBhcmUgdXNlZCBmb3IgZnVuZ2libGUgZXJpZ2h0cyBzdWNoIGFzIG1vbmV5IGJlY2F1c2Ugcm91bmRpbmdcbiAqIGlzc3VlcyBtYWtlIGZsb2F0cyBwcm9ibGVtYXRpYy4gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGJlIGRvbmUgd2l0aCB0aGVcbiAqIHNtYWxsZXN0IHdob2xlIHVuaXQgc3VjaCB0aGF0IHRoZSBgbmF0TWF0aEhlbHBlcnNgIG5ldmVyIGRlYWxzIHdpdGhcbiAqIGZyYWN0aW9uYWwgcGFydHMuXG4gKlxuICogQHR5cGUge01hdGhIZWxwZXJzPE5hdFZhbHVlPn1cbiAqL1xuICAgICAgIGNvbnN0IG5hdE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IG5hdCA9PiB7XG4gICAgLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuICAgIGFzc2VydC50eXBlb2YobmF0LCAnYmlnaW50Jyk7XG4gICAgaXNOYXQobmF0KSB8fCBGYWlsYHZhbHVlICR7bmF0fSBtdXN0IGJlIGEgbmF0dXJhbCBudW1iZXJgO1xuICAgIHJldHVybiBOYXQobmF0KTtcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IG5hdCA9PiBuYXQgPT09IGVtcHR5LFxuICBkb0lzR1RFOiAobGVmdCwgcmlnaHQpID0+IGxlZnQgPj0gcmlnaHQsXG4gIGRvSXNFcXVhbDogKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ID09PSByaWdodCxcbiAgLyogQmlnSW50cyBkb24ndCBvYnNlcnZhYmx5IG92ZXJmbG93Ki9cbiAgZG9BZGQ6IChsZWZ0LCByaWdodCkgPT4gbGVmdCArIHJpZ2h0LFxuICBkb1N1YnRyYWN0OiAobGVmdCwgcmlnaHQpID0+IE5hdChsZWZ0IC0gcmlnaHQpLFxufSk7JGjNj19vbmNlLm5hdE1hdGhIZWxwZXJzKG5hdE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD3cNf/9BwAA/QcAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJzZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGFzc2VydEtleSxlbGVtZW50c0lzU3VwZXJzZXQsZWxlbWVudHNEaXNqb2ludFVuaW9uLGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCxjb2VyY2VUb0VsZW1lbnRzLGVsZW1lbnRzQ29tcGFyZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsWyRozY9fYSA9PiAoZWxlbWVudHNJc1N1cGVyc2V0ID0gJGjNj19hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLFskaM2PX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRVbmlvbiA9ICRozY9fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIixbJGjNj19hID0+IChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QgPSAkaM2PX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLFskaM2PX2EgPT4gKGNvZXJjZVRvRWxlbWVudHMgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsWyRozY9fYSA9PiAoZWxlbWVudHNDb21wYXJlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7TWF0aEhlbHBlcnMsIFNldFZhbHVlfSBmcm9tICcuLi90eXBlcy5qcycgKi9cblxuLyogT3BlcmF0aW9ucyBmb3IgYXJyYXlzIHdpdGggdW5pcXVlIG9iamVjdHMgaWRlbnRpZnlpbmcgYW5kIHByb3ZpZGluZyovXG4vKiBpbmZvcm1hdGlvbiBhYm91dCBkaWdpdGFsIGFzc2V0cy4gVXNlZCBmb3IgWm9lIGludml0ZXMuKi9cbi8qKiBAdHlwZSB7U2V0VmFsdWV9ICovXG5jb25zdCBlbXB0eSA9IGhhcmRlbihbXSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZSBhcnJheS1iYXNlZCBTZXRNYXRoIHdpdGggQ29weVNldC1iYXNlZCBDb3B5U2V0TWF0aFxuICogQHR5cGUge01hdGhIZWxwZXJzPFNldFZhbHVlPn1cbiAqL1xuICAgICAgIGNvbnN0IHNldE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IGxpc3QgPT4ge1xuICAgIGxpc3QgPSBjb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuICAgIC8qIEFzc2VydCB0aGF0IGxpc3QgY29udGFpbnMgb25seSovXG4gICAgLyogKiBwYXNzLWJ5LWNvcHkgcHJpbWl0aXZlcywqL1xuICAgIC8qICogcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnMgY29udGFpbmluZyBrZXlzLCovXG4gICAgLyogKiByZW1vdGFibGVzLiovXG4gICAgYXNzZXJ0S2V5KGxpc3QpO1xuICAgIHJldHVybiBsaXN0O1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogbGlzdCA9PiBwYXNzU3R5bGVPZihsaXN0KSA9PT0gJ2NvcHlBcnJheScgJiYgbGlzdC5sZW5ndGggPT09IDAsXG4gIGRvSXNHVEU6IGVsZW1lbnRzSXNTdXBlcnNldCxcbiAgZG9Jc0VxdWFsOiAoeCwgeSkgPT4gZWxlbWVudHNDb21wYXJlKHgsIHkpID09PSAwLFxuICBkb0FkZDogZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuICBkb1N1YnRyYWN0OiBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QsXG59KTskaM2PX29uY2Uuc2V0TWF0aEhlbHBlcnMoc2V0TWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0TWF0aEhlbHBlcnMiOlsic2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMnLESlgFAABYBQAAIwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpbml0RW1wdHk7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIixbJGjNj19hID0+IChpbml0RW1wdHkgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtBc3NldEtpbmQsIEJyYW5kLCBQYXltZW50fSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy96b25lJztcbiAqIEBpbXBvcnQge0ludGVyZmFjZUd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKi9cblxuLyogVE9ETyBUeXBlIEludGVyZmFjZUd1YXJkIGJldHRlciB0aGFuIEludGVyZmFjZUd1YXJkPGFueT4qL1xuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtab25lfSBpc3N1ZXJab25lXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQ8YW55Pn0gUGF5bWVudElcbiAqIEByZXR1cm5zIHsoKSA9PiBQYXltZW50PEssIGFueT59XG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUGF5bWVudEtpbmQgPSAoaXNzdWVyWm9uZSwgbmFtZSwgYnJhbmQsIFBheW1lbnRJKSA9PiB7XG4gIGNvbnN0IG1ha2VQYXltZW50ID0gaXNzdWVyWm9uZS5leG9DbGFzcyhcbiAgICBgJHtuYW1lfSBwYXltZW50YCxcbiAgICBQYXltZW50SSxcbiAgICBpbml0RW1wdHksXG4gICAge1xuICAgICAgZ2V0QWxsZWdlZEJyYW5kKCkge1xuICAgICAgICByZXR1cm4gYnJhbmQ7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgW3RhZ10gZm9yIHRhZ2dlZCB0eXBlIG5vdCBkZWZpbmVkIGluIHJ1bnRpbWUqL1xuICByZXR1cm4gbWFrZVBheW1lbnQ7XG59OyRozY9fb25jZS5wcmVwYXJlUGF5bWVudEtpbmQocHJlcGFyZVBheW1lbnRLaW5kKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudEtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRLaW5kIjpbInByZXBhcmVQYXltZW50S2luZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADYJ0h2vjYAAL42AAApAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9wYXR0ZXJucyIsIi4vYW1vdW50TWF0aC5qcyIsIi4vcGF5bWVudC5qcyIsIi4vcHVyc2UuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudExlZGdlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbCxhbm5vdGF0ZUVycm9yLFgsaXNQcm9taXNlLG11c3RNYXRjaCxNLGtleUVRLEFtb3VudE1hdGgscHJlcGFyZVBheW1lbnRLaW5kLHByZXBhcmVQdXJzZUtpbmQsQnJhbmRJLG1ha2VJc3N1ZXJJbnRlcmZhY2VzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiLi9wYXltZW50LmpzXCIsIFtbXCJwcmVwYXJlUGF5bWVudEtpbmRcIixbJGjNj19hID0+IChwcmVwYXJlUGF5bWVudEtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL3B1cnNlLmpzXCIsIFtbXCJwcmVwYXJlUHVyc2VLaW5kXCIsWyRozY9fYSA9PiAocHJlcGFyZVB1cnNlS2luZCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQnJhbmRJXCIsWyRozY9fYSA9PiAoQnJhbmRJID0gJGjNj19hKV1dLFtcIm1ha2VJc3N1ZXJJbnRlcmZhY2VzXCIsWyRozY9fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXksIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtTaHV0ZG93bldpdGhGYWlsdXJlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LXZhdCc7XG4gKiBAaW1wb3J0IHtBbW91bnRTdG9yZX0gZnJvbSAnLi9hbW91bnRTdG9yZS5qcyc7XG4gKiBAaW1wb3J0IHtBbW91bnQsIEFzc2V0S2luZCwgRGlzcGxheUluZm8sIFBheW1lbnRMZWRnZXIsIFBheW1lbnQsIEJyYW5kLCBSZWNvdmVyeVNldHNPcHRpb24sIFB1cnNlLCBJc3N1ZXIsIE1pbnR9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7V2Vha01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqIEBpbXBvcnQge1NldFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHBhcmFtIHtLfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKiBAcmV0dXJucyB7VHlwZWRQYXR0ZXJuPEFtb3VudDxLPj59XG4gKi9cbmNvbnN0IGFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZSA9IChicmFuZCwgYXNzZXRLaW5kLCBlbGVtZW50U2hhcGUpID0+IHtcbiAgbGV0IHZhbHVlU2hhcGU7XG4gIHN3aXRjaCAoYXNzZXRLaW5kKSB7XG4gICAgY2FzZSAnbmF0Jzoge1xuICAgICAgdmFsdWVTaGFwZSA9IE0ubmF0KCk7XG4gICAgICBlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYEZ1bmdpYmxlIGFzc2V0cyBjYW5ub3QgaGF2ZSBhbiBlbGVtZW50U2hhcGU6ICR7cShlbGVtZW50U2hhcGUpfWA7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnc2V0Jzoge1xuICAgICAgaWYgKGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLmFycmF5T2YoTS5rZXkoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5hcnJheU9mKE0uYW5kKE0ua2V5KCksIGVsZW1lbnRTaGFwZSkpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICBpZiAoZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uc2V0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5zZXRPZihlbGVtZW50U2hhcGUpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICBpZiAoZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYmFnKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5iYWdPZihlbGVtZW50U2hhcGUpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIEZhaWxgdW5leHBlY3RlZCBhc3NldCBraW5kICR7cShhc3NldEtpbmQpfWA7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYW1vdW50U2hhcGUgPSBoYXJkZW4oe1xuICAgIGJyYW5kLCAvKiBtYXRjaGVzIG9ubHkgdGhpcyBleGFjdCBicmFuZCovXG4gICAgdmFsdWU6IHZhbHVlU2hhcGUsXG4gIH0pO1xuICByZXR1cm4gYW1vdW50U2hhcGU7XG59O1xuXG4vKipcbiAqIE1ha2UgdGhlIHBheW1lbnRMZWRnZXIsIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBiYWxhbmNlcyBvZiBwYXltZW50cy4gQWxsXG4gKiBtaW50aW5nIGFuZCB0cmFuc2ZlciBhdXRob3JpdHkgb3JpZ2luYXRlcyBoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge1pvbmV9IGlzc3VlclpvbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IGFzc2V0S2luZFxuICogQHBhcmFtIHtEaXNwbGF5SW5mbzxLPn0gZGlzcGxheUluZm9cbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKiBAcGFyYW0ge1JlY292ZXJ5U2V0c09wdGlvbn0gcmVjb3ZlcnlTZXRzU3RhdGVcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdXG4gKiBAcmV0dXJucyB7UGF5bWVudExlZGdlcjxLPn1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVQYXltZW50TGVkZ2VyID0gKFxuICBpc3N1ZXJab25lLFxuICBuYW1lLFxuICBhc3NldEtpbmQsXG4gIGRpc3BsYXlJbmZvLFxuICBlbGVtZW50U2hhcGUsXG4gIHJlY292ZXJ5U2V0c1N0YXRlLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIC8qKiBAdHlwZSB7QnJhbmQ8Sz59ICovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIGNhbGxXaGVuKi9cbiAgY29uc3QgYnJhbmQgPSBpc3N1ZXJab25lLmV4byhgJHtuYW1lfSBicmFuZGAsIEJyYW5kSSwge1xuICAgIGlzTXlJc3N1ZXIoYWxsZWdlZElzc3Vlcikge1xuICAgICAgLyogQnJhbmRJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBhbGxlZ2VkSXNzdWVyYCBpcyBhIFJlbW90YWJsZSovXG4gICAgICByZXR1cm4gYWxsZWdlZElzc3VlciA9PT0gaXNzdWVyO1xuICAgIH0sXG4gICAgZ2V0QWxsZWdlZE5hbWUoKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIC8qIEdpdmUgaW5mb3JtYXRpb24gdG8gVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC4qL1xuICAgIGdldERpc3BsYXlJbmZvKCkge1xuICAgICAgcmV0dXJuIGRpc3BsYXlJbmZvO1xuICAgIH0sXG4gICAgZ2V0QW1vdW50U2hhcGUoKSB7XG4gICAgICByZXR1cm4gYW1vdW50U2hhcGU7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgYW1vdW50U2hhcGUgPSBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG4gICAgYnJhbmQsXG4gICAgYXNzZXRLaW5kLFxuICAgIGVsZW1lbnRTaGFwZSxcbiAgKTtcblxuICBjb25zdCB7IElzc3VlckksIE1pbnRJLCBQYXltZW50SSwgUHVyc2VJS2l0IH0gPSBtYWtlSXNzdWVySW50ZXJmYWNlcyhcbiAgICBicmFuZCxcbiAgICBhc3NldEtpbmQsXG4gICAgYW1vdW50U2hhcGUsXG4gICk7XG5cbiAgY29uc3QgbWFrZVBheW1lbnQgPSBwcmVwYXJlUGF5bWVudEtpbmQoaXNzdWVyWm9uZSwgbmFtZSwgYnJhbmQsIFBheW1lbnRJKTtcblxuICAvKiogQHR5cGUge1NodXRkb3duV2l0aEZhaWx1cmV9ICovXG4gIGNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUgPSByZWFzb24gPT4ge1xuICAgIC8qIFRPRE8gVGhpcyBzaG91bGQgYWxzbyBkZXN0cm95IGxlZGdlciBzdGF0ZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzQqL1xuICAgIGlmIChvcHRTaHV0ZG93bldpdGhGYWlsdXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUocmVhc29uKTtcbiAgICAgIH0gY2F0Y2ggKGVyckluU2h1dGRvd24pIHtcbiAgICAgICAgYW5ub3RhdGVFcnJvcihlcnJJblNodXRkb3duLCBYYENhdXNlZCBieTogJHtyZWFzb259YCk7XG4gICAgICAgIHRocm93IGVyckluU2h1dGRvd247XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IHJlYXNvbjtcbiAgfTtcblxuICAvKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBBbW91bnQ+fSAqL1xuICBjb25zdCBwYXltZW50TGVkZ2VyID0gaXNzdWVyWm9uZS53ZWFrTWFwU3RvcmUoJ3BheW1lbnRMZWRnZXInLCB7XG4gICAgdmFsdWVTaGFwZTogYW1vdW50U2hhcGUsXG4gIH0pO1xuXG4gIC8qKlxuICogQSAobm9uLWVtcHR5KSB3aXRoZHJhd24gbGl2ZSBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjb3Zlcnkgc2V0IG9mXG4gKiB0aGUgcHVyc2UgaXQgd2FzIHdpdGhkcmF3biBmcm9tLiBMZXQncyBjYWxsIHRoZXNlIFwicmVjb3ZlcmFibGVcIiBwYXltZW50cy5cbiAqIEFsbCByZWNvdmVyYWJsZSBwYXltZW50cyBhcmUgbGl2ZSwgYnV0IG5vdCBhbGwgbGl2ZSBwYXltZW50cyBhcmVcbiAqIHJlY292ZXJhYmxlLiBXZSBkbyB0aGUgYm9va2tlZXBpbmcgZm9yIHBheW1lbnQgcmVjb3Zlcnkgd2l0aCB0aGlzIHdlYWttYXBcbiAqIGZyb20gcmVjb3ZlcmFibGUgcGF5bWVudHMgdG8gdGhlIHJlY292ZXJ5IHNldCB0aGV5IGFyZSBpbi4gQSBidW5jaCBvZlxuICogaW50ZXJlc3RpbmcgaW52YXJpYW50cyBoZXJlOlxuICpcbiAqIC0gRXZlcnkgcGF5bWVudCB0aGF0IGlzIGEga2V5IGluIHRoZSBvdXRlciBgcGF5bWVudFJlY292ZXJ5U2V0c2Agd2Vha01hcCBpc1xuICogICBhbHNvIGluIHRoZSByZWNvdmVyeSBzZXQgaW5kZXhlZCBieSB0aGF0IHBheW1lbnQuXG4gKiAtIEltcGxpZWQgYnkgdGhlIGFib3ZlIGJ1dCB3b3J0aCBzdGF0aW5nOiB0aGUgcGF5bWVudCBpcyBvbmx5IGluIGF0IG1vc3Qgb25lXG4gKiAgIHJlY292ZXJ5IHNldC5cbiAqIC0gQSByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBzdWNoIHBheW1lbnRzLlxuICogLSBFdmVyeSBwdXJzZSBpcyBhc3NvY2lhdGVkIHdpdGggZXhhY3RseSBvbmUgcmVjb3Zlcnkgc2V0IHVuaXF1ZSB0byBpdC5cbiAqIC0gQSBwdXJzZSdzIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tIHRoYXQgcHVyc2UgYW5kXG4gKiAgIG5vdCB5ZXQgY29uc3VtZWQuXG4gKlxuICogSWYgYHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnYCwgdGhlbiBub3RoaW5nIHNob3VsZCBldmVyIGJlXG4gKiBhZGRlZCB0byB0aGlzIFdlYWtTdG9yZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcFN0b3JlPFBheW1lbnQsIFNldFN0b3JlPFBheW1lbnQ+Pn1cbiAqL1xuICBjb25zdCBwYXltZW50UmVjb3ZlcnlTZXRzID0gaXNzdWVyWm9uZS53ZWFrTWFwU3RvcmUoJ3BheW1lbnRSZWNvdmVyeVNldHMnKTtcblxuICAvKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgaW5pdFBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5IGNhbGwgdG8gYHBheW1lbnRMZWRnZXIuaW5pdGAuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSBbb3B0UmVjb3ZlcnlTZXRdXG4gKi9cbiAgY29uc3QgaW5pdFBheW1lbnQgPSAocGF5bWVudCwgYW1vdW50LCBvcHRSZWNvdmVyeVNldCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGlmIChyZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJykge1xuICAgICAgb3B0UmVjb3ZlcnlTZXQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYHdoZW4gcmVjb3ZlclNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJywgb3B0UmVjb3ZlcnlTZXQgbXVzdCBiZSBlbXB0eWA7XG4gICAgfVxuICAgIGlmIChvcHRSZWNvdmVyeVNldCAhPT0gdW5kZWZpbmVkICYmICFBbW91bnRNYXRoLmlzRW1wdHkoYW1vdW50KSkge1xuICAgICAgb3B0UmVjb3ZlcnlTZXQuYWRkKHBheW1lbnQpO1xuICAgICAgcGF5bWVudFJlY292ZXJ5U2V0cy5pbml0KHBheW1lbnQsIG9wdFJlY292ZXJ5U2V0KTtcbiAgICB9XG4gICAgcGF5bWVudExlZGdlci5pbml0KHBheW1lbnQsIGFtb3VudCk7XG4gIH07XG5cbiAgLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGRlbGV0ZVBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5IGNhbGwgdG8gYHBheW1lbnRMZWRnZXIuZGVsZXRlYC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqL1xuICBjb25zdCBkZWxldGVQYXltZW50ID0gcGF5bWVudCA9PiB7XG4gICAgcGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG4gICAgaWYgKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKSB7XG4gICAgICBjb25zdCByZWNvdmVyeVNldCA9IHBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xuICAgICAgcGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG4gICAgICByZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBAdHlwZSB7KGFsbGVnZWRBbW91bnQ6IEFtb3VudCkgPT4gQW1vdW50fSAqL1xuICBjb25zdCBjb2VyY2UgPSBhbGxlZ2VkQW1vdW50ID0+IEFtb3VudE1hdGguY29lcmNlKGJyYW5kLCBhbGxlZ2VkQW1vdW50KTtcbiAgLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBib29sZWFufSAqL1xuXG4gIC8qKlxuICogTWV0aG9kcyBsaWtlIGRlcG9zaXQoKSBoYXZlIGFuIG9wdGlvbmFsIHNlY29uZCBwYXJhbWV0ZXIgYG9wdEFtb3VudFNoYXBlYFxuICogd2hpY2gsIGlmIHByZXNlbnQsIGlzIHN1cHBvc2VkIHRvIG1hdGNoIHRoZSBiYWxhbmNlIG9mIHRoZSBwYXltZW50LiBUaGlzXG4gKiBoZWxwZXIgZnVuY3Rpb24gZG9lcyB0aGF0IGNoZWNrLlxuICpcbiAqIE5vdGU6IGBvcHRBbW91bnRTaGFwZWAgaXMgdXNlci1zdXBwbGllZCB3aXRoIG5vIHByZXZpb3VzIHZhbGlkYXRpb24uXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IHBheW1lbnRCYWxhbmNlXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gIGNvbnN0IGFzc2VydEFtb3VudENvbnNpc3RlbnQgPSAocGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlKSA9PiB7XG4gICAgaWYgKG9wdEFtb3VudFNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChwYXltZW50QmFsYW5jZSwgb3B0QW1vdW50U2hhcGUsICdhbW91bnQnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gIGNvbnN0IGFzc2VydExpdmVQYXltZW50ID0gcGF5bWVudCA9PiB7XG4gICAgcGF5bWVudExlZGdlci5oYXMocGF5bWVudCkgfHxcbiAgICAgIEZhaWxgJHtwYXltZW50fSB3YXMgbm90IGEgbGl2ZSBwYXltZW50IGZvciBicmFuZCAke3EoXG4gICAgICAgIGJyYW5kLFxuICAgICAgKX0uIEl0IGNvdWxkIGJlIGEgdXNlZC11cCBwYXltZW50LCBhIHBheW1lbnQgZm9yIGFub3RoZXIgYnJhbmQsIG9yIGl0IG1pZ2h0IG5vdCBiZSBhIHBheW1lbnQgYXQgYWxsLmA7XG4gIH07XG5cbiAgLyoqXG4gKiBVc2VkIGJ5IHRoZSBwdXJzZSBjb2RlIHRvIGltcGxlbWVudCBwdXJzZS5kZXBvc2l0XG4gKlxuICogQHBhcmFtIHtBbW91bnRTdG9yZX0gYmFsYW5jZVN0b3JlXG4gKiBAcGFyYW0ge1BheW1lbnR9IHNyY1BheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuICBjb25zdCBkZXBvc2l0SW50ZXJuYWwgPSAoXG4gICAgYmFsYW5jZVN0b3JlLFxuICAgIHNyY1BheW1lbnQsXG4gICAgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgICFpc1Byb21pc2Uoc3JjUGF5bWVudCkgfHxcbiAgICAgIGFzc2VydC5mYWlsKFxuICAgICAgICBgZGVwb3NpdCBkb2VzIG5vdCBhY2NlcHQgcHJvbWlzZXMgYXMgZmlyc3QgYXJndW1lbnQuIEluc3RlYWQgb2YgcGFzc2luZyB0aGUgcHJvbWlzZSAoZGVwb3NpdChwYXltZW50UHJvbWlzZSkpLCBjb25zaWRlciB1bndyYXBwaW5nIHRoZSBwcm9taXNlIGZpcnN0OiBFLndoZW4ocGF5bWVudFByb21pc2UsIChhY3R1YWxQYXltZW50ID0+IGRlcG9zaXQoYWN0dWFsUGF5bWVudCkpYCxcbiAgICAgICAgVHlwZUVycm9yLFxuICAgICAgKTtcbiAgICBhc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbiAgICBjb25zdCBzcmNQYXltZW50QmFsYW5jZSA9IHBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuICAgIGFzc2VydEFtb3VudENvbnNpc3RlbnQoc3JjUGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlKTtcbiAgICB0cnkge1xuICAgICAgLyogQ09NTUlUIFBPSU5UKi9cbiAgICAgIC8qIE1vdmUgdGhlIGFzc2V0cyBpbiBgc3JjUGF5bWVudGAgaW50byB0aGlzIHB1cnNlLCB1c2luZyB1cCB0aGUqL1xuICAgICAgLyogc291cmNlIHBheW1lbnQsIHN1Y2ggdGhhdCB0b3RhbCBhc3NldHMgYXJlIGNvbnNlcnZlZC4qL1xuICAgICAgZGVsZXRlUGF5bWVudChzcmNQYXltZW50KTtcbiAgICAgIGJhbGFuY2VTdG9yZS5pbmNyZW1lbnQoc3JjUGF5bWVudEJhbGFuY2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gIH07XG5cbiAgLyoqXG4gKiBVc2VkIGJ5IHRoZSBwdXJzZSBjb2RlIHRvIGltcGxlbWVudCBwdXJzZS53aXRoZHJhd1xuICpcbiAqIEBwYXJhbSB7QW1vdW50U3RvcmV9IGJhbGFuY2VTdG9yZVxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAtIHRoZSBhbW91bnQgdG8gYmUgd2l0aGRyYXduXG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSBbcmVjb3ZlcnlTZXRdXG4gKiBAcmV0dXJucyB7UGF5bWVudH1cbiAqL1xuICBjb25zdCB3aXRoZHJhd0ludGVybmFsID0gKGJhbGFuY2VTdG9yZSwgYW1vdW50LCByZWNvdmVyeVNldCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFtb3VudCA9IGNvZXJjZShhbW91bnQpO1xuICAgIGNvbnN0IHBheW1lbnQgPSBtYWtlUGF5bWVudCgpO1xuICAgIC8qIENPTU1JVCBQT0lOVCBNb3ZlIHRoZSB3aXRoZHJhd24gYXNzZXRzIGZyb20gdGhpcyBwdXJzZSBpbnRvKi9cbiAgICAvKiBwYXltZW50LiBUb3RhbCBhc3NldHMgbXVzdCByZW1haW4gY29uc2VydmVkLiovXG4gICAgYmFsYW5jZVN0b3JlLmRlY3JlbWVudChhbW91bnQpIHx8XG4gICAgICBGYWlsYFdpdGhkcmF3YWwgb2YgJHthbW91bnR9IGZhaWxlZCBiZWNhdXNlIHRoZSBwdXJzZSBvbmx5IGNvbnRhaW5lZCAke2JhbGFuY2VTdG9yZS5nZXRBbW91bnQoKX1gO1xuICAgIHRyeSB7XG4gICAgICBpbml0UGF5bWVudChwYXltZW50LCBhbW91bnQsIHJlY292ZXJ5U2V0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIHBheW1lbnQ7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsoKSA9PiBQdXJzZTxLPn0gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggYW1vdW50IGtpbmRzKi9cbiAgY29uc3QgbWFrZUVtcHR5UHVyc2UgPSBwcmVwYXJlUHVyc2VLaW5kKFxuICAgIGlzc3VlclpvbmUsXG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgYnJhbmQsXG4gICAgUHVyc2VJS2l0LFxuICAgIGhhcmRlbih7XG4gICAgICBkZXBvc2l0SW50ZXJuYWwsXG4gICAgICB3aXRoZHJhd0ludGVybmFsLFxuICAgIH0pLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIHBheW1lbnRSZWNvdmVyeVNldHMsXG4gICk7XG5cbiAgLyoqIEB0eXBlIHtJc3N1ZXI8Sz59ICovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIGNhbGxXaGVuKi9cbiAgY29uc3QgaXNzdWVyID0gaXNzdWVyWm9uZS5leG8oYCR7bmFtZX0gaXNzdWVyYCwgSXNzdWVySSwge1xuICAgIGdldEJyYW5kKCkge1xuICAgICAgcmV0dXJuIGJyYW5kO1xuICAgIH0sXG4gICAgZ2V0QWxsZWdlZE5hbWUoKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIGdldEFzc2V0S2luZCgpIHtcbiAgICAgIHJldHVybiBhc3NldEtpbmQ7XG4gICAgfSxcbiAgICBnZXREaXNwbGF5SW5mbygpIHtcbiAgICAgIHJldHVybiBkaXNwbGF5SW5mbztcbiAgICB9LFxuICAgIG1ha2VFbXB0eVB1cnNlKCkge1xuICAgICAgcmV0dXJuIG1ha2VFbXB0eVB1cnNlKCk7XG4gICAgfSxcbiAgICAvKiogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW4gKi9cbiAgICBpc0xpdmUocGF5bWVudCkge1xuICAgICAgLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuICAgICAgcmV0dXJuIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpO1xuICAgIH0sXG4gICAgLyoqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudCBhd2FpdGVkIGJ5IGNhbGxXaGVuICovXG4gICAgZ2V0QW1vdW50T2YocGF5bWVudCkge1xuICAgICAgLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuICAgICAgYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG4gICAgICByZXR1cm4gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudCBhd2FpdGVkIGJ5IGNhbGxXaGVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IG9wdEFtb3VudFNoYXBlXG4gKi9cbiAgICBidXJuKHBheW1lbnQsIG9wdEFtb3VudFNoYXBlID0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG4gICAgICBhc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbiAgICAgIGNvbnN0IHBheW1lbnRCYWxhbmNlID0gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gICAgICBhc3NlcnRBbW91bnRDb25zaXN0ZW50KHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSk7XG4gICAgICB0cnkge1xuICAgICAgICAvKiBDT01NSVQgUE9JTlQuKi9cbiAgICAgICAgZGVsZXRlUGF5bWVudChwYXltZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXltZW50QmFsYW5jZTtcbiAgICB9LFxuICB9KTtcblxuICAvKipcbiAqIFByb3ZpZGVzIGZvciB0aGUgcmVjb3Zlcnkgb2YgbmV3bHkgbWludGVkIGJ1dCBub3QteWV0LWRlcG9zaXRlZCBwYXltZW50cy5cbiAqXG4gKiBCZWNhdXNlIHRoZSBgbWludFJlY292ZXJ5UHVyc2VgIGlzIHBsYWNlZCBpbiBiYWdnYWdlLCBldmVuIGlmIHRoZSBjYWxsZXIgb2ZcbiAqIGBtYWtlSXNzdWVyS2l0YCBkcm9wcyBpdCBvbiB0aGUgZmxvb3IsIGl0IGNhbiBzdGlsbCBiZSByZWNvdmVyZWQgaW4gYW5cbiAqIGVtZXJnZW5jeSB1cGdyYWRlLlxuICovXG4gIGNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlID0gLyoqIEB0eXBlIHtQdXJzZTxLPn0gKi8gKFxuICAgIGlzc3VlclpvbmUubWFrZU9uY2UoJ21pbnRSZWNvdmVyeVB1cnNlJywgKCkgPT4gbWFrZUVtcHR5UHVyc2UoKSlcbiAgKTtcblxuICAvKiogQHR5cGUge01pbnQ8Sz59ICovXG4gIGNvbnN0IG1pbnQgPSBpc3N1ZXJab25lLmV4byhgJHtuYW1lfSBtaW50YCwgTWludEksIHtcbiAgICBnZXRJc3N1ZXIoKSB7XG4gICAgICByZXR1cm4gaXNzdWVyO1xuICAgIH0sXG4gICAgbWludFBheW1lbnQobmV3QW1vdW50KSB7XG4gICAgICBuZXdBbW91bnQgPSBjb2VyY2UobmV3QW1vdW50KTtcbiAgICAgIG11c3RNYXRjaChuZXdBbW91bnQsIGFtb3VudFNoYXBlLCAnbWludGVkIGFtb3VudCcpO1xuICAgICAgLyogYHJhd1BheW1lbnRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHJlY292ZXJ5IHNldCwgYW5kKi9cbiAgICAgIC8qIHNvIG11c3Qgbm90IGVzY2FwZS4qL1xuICAgICAgY29uc3QgcmF3UGF5bWVudCA9IG1ha2VQYXltZW50KCk7XG4gICAgICBpbml0UGF5bWVudChyYXdQYXltZW50LCBuZXdBbW91bnQsIHVuZGVmaW5lZCk7XG5cbiAgICAgIGNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlQmVmb3JlID0gbWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xuICAgICAgbWludFJlY292ZXJ5UHVyc2UuZGVwb3NpdChyYXdQYXltZW50LCBuZXdBbW91bnQpO1xuICAgICAgY29uc3QgcGF5bWVudCA9IG1pbnRSZWNvdmVyeVB1cnNlLndpdGhkcmF3KG5ld0Ftb3VudCk7XG4gICAgICBjb25zdCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyID0gbWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xuICAgICAgYXNzZXJ0KGtleUVRKG1pbnRSZWNvdmVyeVB1cnNlQmVmb3JlLCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyKSk7XG4gICAgICByZXR1cm4gcGF5bWVudDtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBpc3N1ZXJLaXQgPSBoYXJkZW4oeyBpc3N1ZXIsIG1pbnQsIGJyYW5kLCBtaW50UmVjb3ZlcnlQdXJzZSB9KTtcbiAgcmV0dXJuIGlzc3VlcktpdDtcbn07JGjNj19vbmNlLnByZXBhcmVQYXltZW50TGVkZ2VyKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudExlZGdlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUGF5bWVudExlZGdlciI6WyJwcmVwYXJlUGF5bWVudExlZGdlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+IJ6JlxwAAJccAAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3B1cnNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwiLi9hbW91bnRTdG9yZS5qcyJdLCJleHBvcnRzIjpbInByZXBhcmVQdXJzZUtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLE0sbWFrZUNvcHlTZXQsQW1vdW50TWF0aCxtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQsbWFrZUFtb3VudFN0b3JlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiLi90cmFuc2llbnROb3RpZmllci5qc1wiLCBbW1wibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0XCIsWyRozY9fYSA9PiAobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRTdG9yZS5qc1wiLCBbW1wibWFrZUFtb3VudFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZUFtb3VudFN0b3JlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0Fzc2V0S2luZCwgUmVjb3ZlcnlTZXRzT3B0aW9uLCBCcmFuZCwgUGF5bWVudH0gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvem9uZSc7XG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VHdWFyZH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7V2Vha01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqIEBpbXBvcnQge1NldFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqL1xuXG5jb25zdCBFTVBUWV9DT1BZX1NFVCA9IG1ha2VDb3B5U2V0KFtdKTtcblxuLyogVE9ETyBUeXBlIEludGVyZmFjZUd1YXJkIGJldHRlciB0aGFuIEludGVyZmFjZUd1YXJkPGFueT4qL1xuLyoqXG4gKiBAcGFyYW0ge1pvbmV9IGlzc3VlclpvbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHBhcmFtIHt7XG4gKiAgIHB1cnNlOiBJbnRlcmZhY2VHdWFyZDxhbnk+O1xuICogICBkZXBvc2l0RmFjZXQ6IEludGVyZmFjZUd1YXJkPGFueT47XG4gKiB9fSBQdXJzZUlLaXRcbiAqIEBwYXJhbSB7e1xuICogICBkZXBvc2l0SW50ZXJuYWw6IGFueTtcbiAqICAgd2l0aGRyYXdJbnRlcm5hbDogYW55O1xuICogfX0gcHVyc2VNZXRob2RzXG4gKiBAcGFyYW0ge1JlY292ZXJ5U2V0c09wdGlvbn0gcmVjb3ZlcnlTZXRzU3RhdGVcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPFBheW1lbnQsIFNldFN0b3JlPFBheW1lbnQ+Pn0gcGF5bWVudFJlY292ZXJ5U2V0c1xuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVB1cnNlS2luZCA9IChcbiAgaXNzdWVyWm9uZSxcbiAgbmFtZSxcbiAgYXNzZXRLaW5kLFxuICBicmFuZCxcbiAgUHVyc2VJS2l0LFxuICBwdXJzZU1ldGhvZHMsXG4gIHJlY292ZXJ5U2V0c1N0YXRlLFxuICBwYXltZW50UmVjb3ZlcnlTZXRzLFxuKSA9PiB7XG4gIGNvbnN0IGFtb3VudFNoYXBlID0gYnJhbmQuZ2V0QW1vdW50U2hhcGUoKTtcblxuICAvKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbiAgLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG4gIC8qIFRPRE8gcHJvcGFnYXRlIHpvbmlmeWluZyB0byBub3RpZmllcnMsIG1heWJlPyovXG4gIGNvbnN0IHsgcHJvdmlkZU5vdGlmaWVyLCB1cGRhdGU6IHVwZGF0ZUJhbGFuY2UgfSA9IG1ha2VUcmFuc2llbnROb3RpZmllcktpdCgpO1xuXG4gIC8qKlxuICogSWYgYHJlY292ZXJ5U2V0c1N0YXRlID09PSAnaGFzUmVjb3ZlcnlTZXRzJ2AgKHRoZSBub3JtYWwgc3RhdGUpLCB0aGVuIGp1c3RcbiAqIHJldHVybiBgc3RhdGUucmVjb3ZlcnlTZXRgLlxuICpcbiAqIElmIGByZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJ2AsIHJldHVybiBgdW5kZWZpbmVkYC4gQ2FsbGVyc1xuICogbXVzdCBiZSBhd2FyZSB0aGF0IHRoZSBgdW5kZWZpbmVkYCByZXR1cm4gaGFwcGVucyBpZmYgYHJlY292ZXJ5U2V0c1N0YXRlXG4gKiA9PT0gJ25vUmVjb3ZlcnlTZXRzJ2AsIGFuZCB0byBhdm9pZCBzdG9yaW5nIG9yIHJldHJpZXZpbmcgYW55dGhpbmcgZnJvbSB0aGVcbiAqIGFjdHVhbCByZWNvdmVyeSBzZXQuXG4gKlxuICogQHBhcmFtIHt7IHJlY292ZXJ5U2V0OiBTZXRTdG9yZTxQYXltZW50PiB9fSBzdGF0ZVxuICogQHJldHVybnMge1NldFN0b3JlPFBheW1lbnQ+IHwgdW5kZWZpbmVkfVxuICovXG4gIGNvbnN0IG1heWJlUmVjb3ZlcnlTZXQgPSBzdGF0ZSA9PiB7XG4gICAgY29uc3QgeyByZWNvdmVyeVNldCB9ID0gc3RhdGU7XG4gICAgaWYgKHJlY292ZXJ5U2V0c1N0YXRlID09PSAnaGFzUmVjb3ZlcnlTZXRzJykge1xuICAgICAgcmV0dXJuIHJlY292ZXJ5U2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJyB8fFxuICAgICAgICBGYWlsYHJlY292ZXJTZXRzU3RhdGUgbXVzdCBiZSBub1JlY292ZXJ5U2V0cyBpZiBpdCBpc24ndCBoYXNSZWNvdmVyU2V0c2A7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBwYXltZW50UmVjb3ZlcnlTZXRzIG11c3QgYWx3YXlzIGJlIGRlZmluZWRgO1xuICAgICAgcmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpID09PSAwIHx8XG4gICAgICAgIEZhaWxgV2l0aCBub1JlY292ZXJ5U2V0cywgcmVjb3ZlcnlTZXQgbXVzdCBiZSBlbXB0eWA7XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qIC0gVGhpcyBraW5kIGlzIGEgcGFpciBvZiBwdXJzZSBhbmQgZGVwb3NpdEZhY2V0IHRoYXQgaGF2ZSBhIDE6MSovXG4gIC8qIGNvcnJlc3BvbmRlbmNlLiovXG4gIC8qIC0gVGhleSBhcmUgdmlydHVhbGl6ZWQgdG9nZXRoZXIgdG8gc2hhcmUgYSBzaW5nbGUgc3RhdGUgcmVjb3JkLiovXG4gIC8qIC0gQW4gYWx0ZXJuYXRpdmUgZGVzaWduIGNvbnNpZGVyZWQgd2FzIHRvIGhhdmUgdGhpcyByZXR1cm4gYSBQdXJzZSBhbG9uZSovXG4gIC8qIHRoYXQgY3JlYXRlZCBkZXBvc2l0RmFjZXQgYXMgbmVlZGVkLiBCdXQgdGhpcyBhcHByb2FjaCBlbnN1cmVzIGEgY29uc3RhbnQqL1xuICAvKiBpZGVudGl0eSBmb3IgdGhlIGZhY2V0IGFuZCBleGVyY2lzZXMgdGhlIG11bHRpLWZhY2V0ZWQgb2JqZWN0IHN0eWxlLiovXG4gIGNvbnN0IHsgZGVwb3NpdEludGVybmFsLCB3aXRoZHJhd0ludGVybmFsIH0gPSBwdXJzZU1ldGhvZHM7XG4gIGNvbnN0IG1ha2VQdXJzZUtpdCA9IGlzc3VlclpvbmUuZXhvQ2xhc3NLaXQoXG4gICAgYCR7bmFtZX0gUHVyc2VgLFxuICAgIFB1cnNlSUtpdCxcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50QmFsYW5jZSA9IEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLCBhc3NldEtpbmQpO1xuXG4gICAgICAvKiogQHR5cGUge1NldFN0b3JlPFBheW1lbnQ+fSAqL1xuICAgICAgY29uc3QgcmVjb3ZlcnlTZXQgPSBpc3N1ZXJab25lLmRldGFjaGVkKCkuc2V0U3RvcmUoJ3JlY292ZXJ5IHNldCcpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJyZW50QmFsYW5jZSxcbiAgICAgICAgcmVjb3ZlcnlTZXQsXG4gICAgICB9O1xuICAgIH0sXG4gICAge1xuICAgICAgcHVyc2U6IHtcbiAgICAgICAgZGVwb3NpdChzcmNQYXltZW50LCBvcHRBbW91bnRTaGFwZSA9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4gICAgICAgICAgLyogU2VlIHRoZSBjb21tZW50cyBvbiBQdXJzZUkuZGVwb3NpdCBpbiB0eXBlR3VhcmRzLmpzKi9cbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgcHVyc2UgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2VTdG9yZSA9IG1ha2VBbW91bnRTdG9yZShzdGF0ZSwgJ2N1cnJlbnRCYWxhbmNlJyk7XG4gICAgICAgICAgLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIGRlcG9zaXQuKi9cbiAgICAgICAgICBjb25zdCBzcmNQYXltZW50QmFsYW5jZSA9IGRlcG9zaXRJbnRlcm5hbChcbiAgICAgICAgICAgIGJhbGFuY2VTdG9yZSxcbiAgICAgICAgICAgIHNyY1BheW1lbnQsXG4gICAgICAgICAgICBvcHRBbW91bnRTaGFwZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZUJhbGFuY2UocHVyc2UsIGJhbGFuY2VTdG9yZS5nZXRBbW91bnQoKSk7XG4gICAgICAgICAgcmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuICAgICAgICB9LFxuICAgICAgICB3aXRoZHJhdyhhbW91bnQpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgcHVyc2UgfSA9IHRoaXMuZmFjZXRzO1xuXG4gICAgICAgICAgY29uc3Qgb3B0UmVjb3ZlcnlTZXQgPSBtYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbiAgICAgICAgICBjb25zdCBiYWxhbmNlU3RvcmUgPSBtYWtlQW1vdW50U3RvcmUoc3RhdGUsICdjdXJyZW50QmFsYW5jZScpO1xuICAgICAgICAgIC8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiB3aXRoZHJhdy4qL1xuICAgICAgICAgIGNvbnN0IHBheW1lbnQgPSB3aXRoZHJhd0ludGVybmFsKFxuICAgICAgICAgICAgYmFsYW5jZVN0b3JlLFxuICAgICAgICAgICAgYW1vdW50LFxuICAgICAgICAgICAgb3B0UmVjb3ZlcnlTZXQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVCYWxhbmNlKHB1cnNlLCBiYWxhbmNlU3RvcmUuZ2V0QW1vdW50KCkpO1xuICAgICAgICAgIHJldHVybiBwYXltZW50O1xuICAgICAgICB9LFxuICAgICAgICBnZXRDdXJyZW50QW1vdW50KCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgYmFsYW5jZVN0b3JlID0gbWFrZUFtb3VudFN0b3JlKHN0YXRlLCAnY3VycmVudEJhbGFuY2UnKTtcbiAgICAgICAgICByZXR1cm4gYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRDdXJyZW50QW1vdW50Tm90aWZpZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3ZpZGVOb3RpZmllcih0aGlzLmZhY2V0cy5wdXJzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEFsbGVnZWRCcmFuZCgpIHtcbiAgICAgICAgICByZXR1cm4gYnJhbmQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0RGVwb3NpdEZhY2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5kZXBvc2l0RmFjZXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0UmVjb3ZlcnlTZXQoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBvcHRSZWNvdmVyeVNldCA9IG1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuICAgICAgICAgIGlmIChvcHRSZWNvdmVyeVNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFlfQ09QWV9TRVQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvcHRSZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuICAgICAgICB9LFxuICAgICAgICByZWNvdmVyQWxsKCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBsZXQgYW1vdW50ID0gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG4gICAgICAgICAgY29uc3Qgb3B0UmVjb3ZlcnlTZXQgPSBtYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbiAgICAgICAgICBpZiAob3B0UmVjb3ZlcnlTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudDsgLyogZW1wdHkgYXQgdGhpcyB0aW1lKi9cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBwYXltZW50IG9mIG9wdFJlY292ZXJ5U2V0LmtleXMoKSkge1xuICAgICAgICAgICAgLyogVGhpcyBkb2VzIGNhdXNlIGRlbGV0aW9ucyBmcm9tIHRoZSBzZXQgd2hpbGUgaXRlcmF0aW5nLCovXG4gICAgICAgICAgICAvKiBidXQgdGhpcyBzcGVjaWFsIGNhc2UgaXMgYWxsb3dlZC4qL1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBmYWNldHMucHVyc2UuZGVwb3NpdChwYXltZW50KTtcbiAgICAgICAgICAgIGFtb3VudCA9IEFtb3VudE1hdGguYWRkKGFtb3VudCwgZGVsdGEsIGJyYW5kKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3B0UmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpID09PSAwIHx8XG4gICAgICAgICAgICBGYWlsYGludGVybmFsOiBSZW1haW5pbmcgdW5yZWNvdmVyZWQgcGF5bWVudHM6ICR7ZmFjZXRzLnB1cnNlLmdldFJlY292ZXJ5U2V0KCl9YDtcbiAgICAgICAgICByZXR1cm4gYW1vdW50O1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRlcG9zaXRGYWNldDoge1xuICAgICAgICByZWNlaXZlKC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzdGF0ZVNoYXBlOiB7XG4gICAgICAgIGN1cnJlbnRCYWxhbmNlOiBhbW91bnRTaGFwZSxcbiAgICAgICAgcmVjb3ZlcnlTZXQ6IE0ucmVtb3RhYmxlKCdyZWNvdmVyeVNldCcpLFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuICByZXR1cm4gKCkgPT4gbWFrZVB1cnNlS2l0KCkucHVyc2U7XG59OyRozY9fb25jZS5wcmVwYXJlUHVyc2VLaW5kKHByZXBhcmVQdXJzZUtpbmQpO1xuaGFyZGVuKHByZXBhcmVQdXJzZUtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVB1cnNlS2luZCI6WyJwcmVwYXJlUHVyc2VLaW5kIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAL6roXInPQAAJz0AACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcmF0aW8uanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL25hdCIsIi4vYW1vdW50TWF0aC5qcyIsIi4vc2FmZU1hdGguanMiXSwiZXhwb3J0cyI6WyJhZGRSYXRpb3MiLCJhc3NlcnRJc1JhdGlvIiwiYXNzZXJ0UGFyc2FibGVOdW1iZXIiLCJjZWlsRGl2aWRlQnkiLCJjZWlsTXVsdGlwbHlCeSIsImRpdmlkZUJ5IiwiZmxvb3JEaXZpZGVCeSIsImZsb29yTXVsdGlwbHlCeSIsImludmVydFJhdGlvIiwibWFrZVJhdGlvIiwibWFrZVJhdGlvRnJvbUFtb3VudHMiLCJtdWx0aXBseUJ5IiwibXVsdGlwbHlSYXRpb3MiLCJvbmVNaW51cyIsInBhcnNlUmF0aW8iLCJxdWFudGl6ZSIsInJhdGlvR1RFIiwicmF0aW9Ub051bWJlciIsInJhdGlvc1NhbWUiLCJzdWJ0cmFjdFJhdGlvcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbCxhc3NlcnRSZWNvcmQsaXNOYXQsQW1vdW50TWF0aCxuYXRTYWZlTWF0aDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcImlzTmF0XCIsWyRozY9fYSA9PiAoaXNOYXQgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiLi9zYWZlTWF0aC5qc1wiLCBbW1wibmF0U2FmZU1hdGhcIixbJGjNj19hID0+IChuYXRTYWZlTWF0aCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0Ftb3VudCwgQnJhbmQsIElzc3VlciwgUGF5bWVudCwgUHVyc2V9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKi9cblxuY29uc3QgeyBtdWx0aXBseSwgZmxvb3JEaXZpZGUsIGNlaWxEaXZpZGUsIGJhbmtlcnNEaXZpZGUsIGFkZCwgc3VidHJhY3QgfSA9XG4gIG5hdFNhZmVNYXRoO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhdGlvXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IG51bWVyYXRvclxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBkZW5vbWluYXRvclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNjYWxlQW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fVxuICovXG5cbi8qIG1ha2UgYSBSYXRpbywgd2hpY2ggcmVwcmVzZW50cyBhIGZyYWN0aW9uLiBJdCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQuKi9cbi8qKi9cbi8qIFRoZSBuYXR1cmFsIHN5bnRheCBmb3IgdGhlIG1vc3QgY29tbW9uIG9wZXJhdGlvbnMgd2Ugd2FudCB0byBzdXBwb3J0Ki9cbi8qIGFyZSBBbW91bnQgKiBSYXRpbyBhbmQgQW1vdW50IC8gUmF0aW8uIFNpbmNlIHRoZSBvcGVyYXRpb25zIHdhbnQgdG8gYWRoZXJlIHRvKi9cbi8qIHRoZSByYXRpbyByYXRoZXIgdGhhbiB0aGUgYW1vdW50LCB3ZSBzZXR0bGVkIG9uIGEgY2FsbGluZyBjb252ZW50aW9uIG9mKi9cbi8qIFtjZWlsfGZsb29yXU11bHRpcGx5QnkoQW1vdW50LCBSYXRpbykgYW5kIFtjZWlsfGZsb29yXURpdmlkZUJ5KEFtb3VudCwgUmF0aW8pKi9cbi8qKi9cbi8qIFRoZSBtb3N0IGNvbW1vbiBraW5kIG9mIFJhdGlvIGNhbiBiZSBhcHBsaWVkIHRvIEFtb3VudHMgb2YgYSBwYXJ0aWN1bGFyKi9cbi8qIGJyYW5kLCBhbmQgcHJvZHVjZXMgcmVzdWx0cyBvZiB0aGUgc2FtZSBicmFuZC4gVGhpcyByZXByZXNlbnRzIGEgbXVsdGlwbGllciovXG4vKiB0aGF0IGlzIG9ubHkgYXBwbGljYWJsZSB0byB0aGF0IGJyYW5kLiBUaGUgbGVzcyBjb21tb24ga2luZCBvZiBSYXRpbyBjYW4gYmUqL1xuLyogYXBwbGllZCB0byBvbmUgcGFydGljdWxhciBicmFuZCBvZiBhbW91bnRzLCBhbmQgcHJvZHVjZXMgcmVzdWx0cyBvZiBhbm90aGVyKi9cbi8qIHBhcnRpY3VsYXIgYnJhbmQuIFRoaXMgcmVwcmVzZW50cyBzb21lIGtpbmQgb2YgZXhjaGFuZ2UgcmF0ZS4gVGhlKi9cbi8qIGJyYW5kLWNoZWNraW5nIGhlbHBzIHVzIGVuc3VyZSB0aGF0IG5vcm1hbCBSYXRpb3MgYXJlbid0IGFwcGxpZWQgdG8gYW1vdW50cyovXG4vKiBvZiB0aGUgd3JvbmcgYnJhbmQsIGFuZCB0aGF0IGV4Y2hhbmdlIHJhdGVzIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGFwcHJvcHJpYXRlKi9cbi8qIGRpcmVjdGlvbi4qL1xuLyoqL1xuLyogU2luY2UgdGhlIHJhdGlvcyBhcmUgcmVwcmVzZW50ZWQgYnkgYSBudW1lcmF0b3IgYW5kIGEgZGVub21pbmF0b3IsIGV2ZXJ5Ki9cbi8qIG11bHRpcGxpY2F0aW9uIG9yIGRpdmlzaW9uIG9wZXJhdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGFtb3VudCBlbmRzIHdpdGggYSovXG4vKiBkaXZpc2lvbiBvZiB0aGUgdW5kZXJseWluZyBiaWdpbnRzLCBhbmQgaW50ZWdlciBkaXZpc2lvbiByZXF1aXJlcyBhIG1vZGUqL1xuLyogb2YgW3JvdW5kaW5nIHRvIGludGVnZXJdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JvdW5kaW5nI1JvdW5kaW5nX3RvX2ludGVnZXIpLiovXG4vKiBCZWNhdXNlIGBSYXRpb2Agb25seSB3b3JrIHdpdGggTmF0dXJhbCBudW1iZXJzLCBqdXN0IHRocmVlIG1vZGVzIHN1ZmZpY2U6Ki9cbi8qIC0gZmxvb3Igcm91bmRzIGRvd24qL1xuLyogLSBjZWlsIHJvdW5kcyB1cCovXG4vKiAtIGRlZmF1bHQgKHdpdGhvdXQgcHJlZml4KSBtaW5pbWl6ZXMgYmlhcyBieSByb3VuZGluZyBoYWxmIHRvIGV2ZW4qL1xuXG5jb25zdCBQRVJDRU5UID0gMTAwbjtcblxuY29uc3QgcmF0aW9Qcm9wZXJ0eU5hbWVzID0gWydudW1lcmF0b3InLCAnZGVub21pbmF0b3InXTtcblxuICAgICAgIGNvbnN0IGFzc2VydElzUmF0aW8gPSByYXRpbyA9PiB7XG4gIGFzc2VydFJlY29yZChyYXRpbywgJ3JhdGlvJyk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyYXRpbyk7XG4gIGtleXMubGVuZ3RoID09PSAyIHx8IEZhaWxgUmF0aW8gJHtyYXRpb30gbXVzdCBiZSBhIHJlY29yZCB3aXRoIDIgZmllbGRzLmA7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBrZXlzKSB7XG4gICAgcmF0aW9Qcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKG5hbWUpIHx8XG4gICAgICBGYWlsYFBhcmFtZXRlciBtdXN0IGJlIGEgUmF0aW8gcmVjb3JkLCBidXQgJHtyYXRpb30gaGFzICR7cShuYW1lKX1gO1xuICB9XG4gIGNvbnN0IG51bWVyYXRvclZhbHVlID0gcmF0aW8ubnVtZXJhdG9yLnZhbHVlO1xuICBjb25zdCBkZW5vbWluYXRvclZhbHVlID0gcmF0aW8uZGVub21pbmF0b3IudmFsdWU7XG4gIGlzTmF0KG51bWVyYXRvclZhbHVlKSB8fFxuICAgIEZhaWxgVGhlIG51bWVyYXRvciB2YWx1ZSBtdXN0IGJlIGEgTmF0VmFsdWUsIG5vdCAke251bWVyYXRvclZhbHVlfWA7XG4gIGlzTmF0KGRlbm9taW5hdG9yVmFsdWUpIHx8XG4gICAgRmFpbGBUaGUgZGVub21pbmF0b3IgdmFsdWUgbXVzdCBiZSBhIE5hdFZhbHVlLCBub3QgJHtkZW5vbWluYXRvclZhbHVlfWA7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7YmlnaW50fSBudW1lcmF0b3JcbiAqIEBwYXJhbSB7QnJhbmR9IG51bWVyYXRvckJyYW5kXG4gKiBAcGFyYW0ge2JpZ2ludH0gW2Rlbm9taW5hdG9yXSBUaGUgZGVmYXVsdCBkZW5vbWluYXRvciBpcyAxMDBcbiAqIEBwYXJhbSB7QnJhbmR9IFtkZW5vbWluYXRvckJyYW5kXSBUaGUgZGVmYXVsdCBpcyB0byByZXVzZSB0aGUgbnVtZXJhdG9yQnJhbmRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRozY9fb25jZS5hc3NlcnRJc1JhdGlvKGFzc2VydElzUmF0aW8pO1xuICAgICAgIGNvbnN0IG1ha2VSYXRpbyA9IChcbiAgbnVtZXJhdG9yLFxuICBudW1lcmF0b3JCcmFuZCxcbiAgZGVub21pbmF0b3IgPSBQRVJDRU5ULFxuICBkZW5vbWluYXRvckJyYW5kID0gbnVtZXJhdG9yQnJhbmQsXG4pID0+IHtcbiAgZGVub21pbmF0b3IgPiAwbiB8fFxuICAgIEZhaWxgTm8gaW5maW5pdGUgcmF0aW9zISBEZW5vbWluYXRvciB3YXMgMCAke3EoZGVub21pbmF0b3JCcmFuZCl9YDtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBudW1lcmF0b3I6IEFtb3VudE1hdGgubWFrZShudW1lcmF0b3JCcmFuZCwgbnVtZXJhdG9yKSxcbiAgICBkZW5vbWluYXRvcjogQW1vdW50TWF0aC5tYWtlKGRlbm9taW5hdG9yQnJhbmQsIGRlbm9taW5hdG9yKSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50fSBudW1lcmF0b3JBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBkZW5vbWluYXRvckFtb3VudFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjNj19vbmNlLm1ha2VSYXRpbyhtYWtlUmF0aW8pO1xuICAgICAgIGNvbnN0IG1ha2VSYXRpb0Zyb21BbW91bnRzID0gKG51bWVyYXRvckFtb3VudCwgZGVub21pbmF0b3JBbW91bnQpID0+IHtcbiAgQW1vdW50TWF0aC5jb2VyY2UobnVtZXJhdG9yQW1vdW50LmJyYW5kLCBudW1lcmF0b3JBbW91bnQpO1xuICBBbW91bnRNYXRoLmNvZXJjZShkZW5vbWluYXRvckFtb3VudC5icmFuZCwgZGVub21pbmF0b3JBbW91bnQpO1xuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgdmFsdWUgY2FuIGJlIGFueSBBbW91bnRWYWx1ZSBidXQgbWFrZVJhdGlvKCkgc3VwcG9ydHMgb25seSBiaWdpbnQqL1xuICAgIG51bWVyYXRvckFtb3VudC52YWx1ZSxcbiAgICBudW1lcmF0b3JBbW91bnQuYnJhbmQsXG4gICAgZGVub21pbmF0b3JBbW91bnQudmFsdWUsXG4gICAgZGVub21pbmF0b3JBbW91bnQuYnJhbmQsXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50XG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHBhcmFtIHthbnl9IGRpdmlkZU9wXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqLyRozY9fb25jZS5tYWtlUmF0aW9Gcm9tQW1vdW50cyhtYWtlUmF0aW9Gcm9tQW1vdW50cyk7XG5jb25zdCBtdWx0aXBseUhlbHBlciA9IChhbW91bnQsIHJhdGlvLCBkaXZpZGVPcCkgPT4ge1xuICBBbW91bnRNYXRoLmNvZXJjZShhbW91bnQuYnJhbmQsIGFtb3VudCk7XG4gIGFzc2VydElzUmF0aW8ocmF0aW8pO1xuICBhbW91bnQuYnJhbmQgPT09IHJhdGlvLmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBhbW91bnQncyBicmFuZCAke3EoYW1vdW50LmJyYW5kKX0gbXVzdCBtYXRjaCByYXRpbydzIGRlbm9taW5hdG9yICR7cShcbiAgICAgIHJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuICAgICl9YDtcblxuICByZXR1cm4gLyoqIEB0eXBlIHtBbW91bnQ8J25hdCc+fSAqLyAoXG4gICAgQW1vdW50TWF0aC5tYWtlKFxuICAgICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuICAgICAgZGl2aWRlT3AoXG4gICAgICAgIG11bHRpcGx5KGFtb3VudC52YWx1ZSwgcmF0aW8ubnVtZXJhdG9yLnZhbHVlKSxcbiAgICAgICAgcmF0aW8uZGVub21pbmF0b3IudmFsdWUsXG4gICAgICApLFxuICAgIClcbiAgKTtcbn07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovXG4gICAgICAgY29uc3QgZmxvb3JNdWx0aXBseUJ5ID0gKGFtb3VudCwgcmF0aW8pID0+IHtcbiAgcmV0dXJuIG11bHRpcGx5SGVscGVyKGFtb3VudCwgcmF0aW8sIGZsb29yRGl2aWRlKTtcbn07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovJGjNj19vbmNlLmZsb29yTXVsdGlwbHlCeShmbG9vck11bHRpcGx5QnkpO1xuICAgICAgIGNvbnN0IGNlaWxNdWx0aXBseUJ5ID0gKGFtb3VudCwgcmF0aW8pID0+IHtcbiAgcmV0dXJuIG11bHRpcGx5SGVscGVyKGFtb3VudCwgcmF0aW8sIGNlaWxEaXZpZGUpO1xufTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi8kaM2PX29uY2UuY2VpbE11bHRpcGx5QnkoY2VpbE11bHRpcGx5QnkpO1xuICAgICAgIGNvbnN0IG11bHRpcGx5QnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LCByYXRpbywgYmFua2Vyc0RpdmlkZSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50XG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHBhcmFtIHthbnl9IGRpdmlkZU9wXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqLyRozY9fb25jZS5tdWx0aXBseUJ5KG11bHRpcGx5QnkpO1xuY29uc3QgZGl2aWRlSGVscGVyID0gKGFtb3VudCwgcmF0aW8sIGRpdmlkZU9wKSA9PiB7XG4gIEFtb3VudE1hdGguY29lcmNlKGFtb3VudC5icmFuZCwgYW1vdW50KTtcbiAgYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG4gIGFtb3VudC5icmFuZCA9PT0gcmF0aW8ubnVtZXJhdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBhbW91bnQncyBicmFuZCAke3EoYW1vdW50LmJyYW5kKX0gbXVzdCBtYXRjaCByYXRpbydzIG51bWVyYXRvciAke3EoXG4gICAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICAgKX1gO1xuXG4gIHJldHVybiAvKiogQHR5cGUge0Ftb3VudDwnbmF0Jz59ICovIChcbiAgICBBbW91bnRNYXRoLm1ha2UoXG4gICAgICByYXRpby5kZW5vbWluYXRvci5icmFuZCxcbiAgICAgIGRpdmlkZU9wKFxuICAgICAgICBtdWx0aXBseShhbW91bnQudmFsdWUsIHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlKSxcbiAgICAgICAgcmF0aW8ubnVtZXJhdG9yLnZhbHVlLFxuICAgICAgKSxcbiAgICApXG4gICk7XG59O1xuXG4vKipcbiAqIERpdmlkZSB0aGUgYW1vdW50IGJ5IHRoZSByYXRpbywgdHJ1bmNhdGluZyB0aGUgcmVtYWluZGVyLlxuICpcbiAqIEB0eXBlIHtTY2FsZUFtb3VudH1cbiAqL1xuICAgICAgIGNvbnN0IGZsb29yRGl2aWRlQnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCwgcmF0aW8sIGZsb29yRGl2aWRlKTtcbn07XG5cbi8qKlxuICogRGl2aWRlIHRoZSBhbW91bnQgYnkgdGhlIHJhdGlvLCByb3VuZGluZyB1cCB0aGUgcmVtYWluZGVyLlxuICpcbiAqIEB0eXBlIHtTY2FsZUFtb3VudH1cbiAqLyRozY9fb25jZS5mbG9vckRpdmlkZUJ5KGZsb29yRGl2aWRlQnkpO1xuICAgICAgIGNvbnN0IGNlaWxEaXZpZGVCeSA9IChhbW91bnQsIHJhdGlvKSA9PiB7XG4gIHJldHVybiBkaXZpZGVIZWxwZXIoYW1vdW50LCByYXRpbywgY2VpbERpdmlkZSk7XG59O1xuXG4vKipcbiAqIERpdmlkZSB0aGUgYW1vdW50IGJ5IHRoZSByYXRpbywgcm91bmRpbmcgdG8gbmVhcmVzdCB3aXRoIHRpZXMgdG8gZXZlbiAoYWthXG4gKiBCYW5rZXIncyBSb3VuZGluZykgYXMgaW4gSUVFRSA3NTQgZGVmYXVsdCByb3VuZGluZy5cbiAqXG4gKiBAdHlwZSB7U2NhbGVBbW91bnR9XG4gKi8kaM2PX29uY2UuY2VpbERpdmlkZUJ5KGNlaWxEaXZpZGVCeSk7XG4gICAgICAgY29uc3QgZGl2aWRlQnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCwgcmF0aW8sIGJhbmtlcnNEaXZpZGUpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHJldHVybnMge1JhdGlvfVxuICovJGjNj19vbmNlLmRpdmlkZUJ5KGRpdmlkZUJ5KTtcbiAgICAgICBjb25zdCBpbnZlcnRSYXRpbyA9IHJhdGlvID0+IHtcbiAgYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5cbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICByYXRpby5kZW5vbWluYXRvci52YWx1ZSxcbiAgICByYXRpby5kZW5vbWluYXRvci5icmFuZCxcbiAgICByYXRpby5udW1lcmF0b3IudmFsdWUsXG4gICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjNj19vbmNlLmludmVydFJhdGlvKGludmVydFJhdGlvKTtcbiAgICAgICBjb25zdCBhZGRSYXRpb3MgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG4gIGFzc2VydElzUmF0aW8obGVmdCk7XG4gIGxlZnQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5udW1lcmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYG51bWVyYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG4gIGxlZnQuZGVub21pbmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBkZW5vbWluYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG5cbiAgLyogU2ltcGxpZnlpbmcgdGhlIGV4cHJlc3Npb246Ki9cbiAgLyogKGFuZCArIGJuZCkgLyB5IGQqKjIqL1xuICAvKiAoYSArIGIpIG5kIC8geSBkKioyKi9cbiAgLyogKChhICsgYikgbiAvIHkgZCkgKiAoZCAvIGQpKi9cbiAgLyogKGEgKyBiKSBuIC8geWQqL1xuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIGFkZChcbiAgICAgIG11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksIC8qIGEgbmQqL1xuICAgICAgbXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSwgcmlnaHQubnVtZXJhdG9yLnZhbHVlKSAgLyogYiBuZCovXG4gICAgKSwgLyogKGEgKyBiKSBuZCovXG4gICAgbGVmdC5udW1lcmF0b3IuYnJhbmQsXG4gICAgbXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSwgcmlnaHQuZGVub21pbmF0b3IudmFsdWUpLCAvKiB5IGQqKjIqL1xuICAgIGxlZnQuZGVub21pbmF0b3IuYnJhbmQsXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaM2PX29uY2UuYWRkUmF0aW9zKGFkZFJhdGlvcyk7XG4gICAgICAgY29uc3Qgc3VidHJhY3RSYXRpb3MgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG4gIGFzc2VydElzUmF0aW8obGVmdCk7XG4gIGxlZnQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5udW1lcmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYG51bWVyYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG4gIGxlZnQuZGVub21pbmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBkZW5vbWluYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG5cbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBzdWJ0cmFjdChcbiAgICAgIG11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksIC8qIGEgbmQqL1xuICAgICAgbXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSwgcmlnaHQubnVtZXJhdG9yLnZhbHVlKSAgLyogYiBuZCovXG4gICAgKSwgLyogKGEgLSBiKSBuZCovXG4gICAgbGVmdC5udW1lcmF0b3IuYnJhbmQsXG4gICAgbXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSwgcmlnaHQuZGVub21pbmF0b3IudmFsdWUpLCAvKiB5IGQqKjIqL1xuICAgIGxlZnQuZGVub21pbmF0b3IuYnJhbmQsXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaM2PX29uY2Uuc3VidHJhY3RSYXRpb3Moc3VidHJhY3RSYXRpb3MpO1xuICAgICAgIGNvbnN0IG11bHRpcGx5UmF0aW9zID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGFzc2VydElzUmF0aW8ocmlnaHQpO1xuICBhc3NlcnRJc1JhdGlvKGxlZnQpO1xuXG4gIGNvbnN0IGdldFJlbWFpbmluZ0JyYW5kcyA9ICgpID0+IHtcbiAgICAvKiBQcmVmZXIgcmVzdWx0cyB0aGF0IGhhdmUgdGhlIHNhbWUgYnJhbmQgYXMgdGhlIGxlZnQgb3BlcmFuZC4qL1xuICAgIGlmIChyaWdodC5udW1lcmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kKSB7XG4gICAgICByZXR1cm4gW2xlZnQubnVtZXJhdG9yLmJyYW5kLCBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiAgICB9XG4gICAgaWYgKHJpZ2h0Lm51bWVyYXRvci5icmFuZCA9PT0gbGVmdC5kZW5vbWluYXRvci5icmFuZCkge1xuICAgICAgcmV0dXJuIFtsZWZ0Lm51bWVyYXRvci5icmFuZCwgcmlnaHQuZGVub21pbmF0b3IuYnJhbmRdO1xuICAgIH1cbiAgICBpZiAobGVmdC5udW1lcmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kKSB7XG4gICAgICByZXR1cm4gW3JpZ2h0Lm51bWVyYXRvci5icmFuZCwgbGVmdC5kZW5vbWluYXRvci5icmFuZF07XG4gICAgfVxuICAgIGlmIChsZWZ0Lm51bWVyYXRvci5icmFuZCA9PT0gbGVmdC5kZW5vbWluYXRvci5icmFuZCkge1xuICAgICAgcmV0dXJuIFtyaWdodC5udW1lcmF0b3IuYnJhbmQsIHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiAgICB9XG4gICAgdGhyb3cgRmFpbGBhdCBsZWFzdCBvbmUgYnJhbmQgbXVzdCBjYW5jZWwgb3V0OiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcbiAgfTtcblxuICBjb25zdCBbbnVtZXJhdG9yQnJhbmQsIGRlbm9taW5hdG9yQnJhbmRdID0gZ2V0UmVtYWluaW5nQnJhbmRzKCk7XG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgbXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUsIHJpZ2h0Lm51bWVyYXRvci52YWx1ZSksXG4gICAgbnVtZXJhdG9yQnJhbmQsXG4gICAgbXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSwgcmlnaHQuZGVub21pbmF0b3IudmFsdWUpLFxuICAgIGRlbm9taW5hdG9yQnJhbmQsXG4gICk7XG59O1xuXG4vKipcbiAqIElmIHJhdGlvIGlzIGJldHdlZW4gMCBhbmQgMSwgc3VidHJhY3QgZnJvbSAxLlxuICpcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaM2PX29uY2UubXVsdGlwbHlSYXRpb3MobXVsdGlwbHlSYXRpb3MpO1xuICAgICAgIGNvbnN0IG9uZU1pbnVzID0gcmF0aW8gPT4ge1xuICBhc3NlcnRJc1JhdGlvKHJhdGlvKTtcbiAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kID09PSByYXRpby5kZW5vbWluYXRvci5icmFuZCB8fFxuICAgIEZhaWxgb25lTWludXMgb25seSBzdXBwb3J0cyByYXRpb3Mgd2l0aCBhIHNpbmdsZSBicmFuZCwgYnV0ICR7cmF0aW8ubnVtZXJhdG9yLmJyYW5kfSBkb2Vzbid0IG1hdGNoICR7cmF0aW8uZGVub21pbmF0b3IuYnJhbmR9YDtcbiAgcmF0aW8ubnVtZXJhdG9yLnZhbHVlIDw9IHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlIHx8XG4gICAgRmFpbGBQYXJhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTogJHtyYXRpby5udW1lcmF0b3IudmFsdWV9LyR7cmF0aW8uZGVub21pbmF0b3IudmFsdWV9YDtcbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBzdWJ0cmFjdChyYXRpby5kZW5vbWluYXRvci52YWx1ZSwgcmF0aW8ubnVtZXJhdG9yLnZhbHVlKSxcbiAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICAgcmF0aW8uZGVub21pbmF0b3IudmFsdWUsXG4gICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaM2PX29uY2Uub25lTWludXMob25lTWludXMpO1xuICAgICAgIGNvbnN0IHJhdGlvR1RFID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGlmIChsZWZ0Lm51bWVyYXRvci5icmFuZCA9PT0gcmlnaHQubnVtZXJhdG9yLmJyYW5kKSB7XG4gICAgbGVmdC5kZW5vbWluYXRvci5icmFuZCA9PT0gcmlnaHQuZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgICAgIEZhaWxgbnVtZXJhdG9yIGJyYW5kcyBtYXRjaCwgYnV0IGRlbm9taW5hdG9yIGJyYW5kcyBkb24ndDogJHtxKGxlZnQpfSAke3EoXG4gICAgICAgIHJpZ2h0LFxuICAgICAgKX1gO1xuICB9IGVsc2UgaWYgKGxlZnQubnVtZXJhdG9yLmJyYW5kID09PSBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kKSB7XG4gICAgcmlnaHQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5kZW5vbWluYXRvci5icmFuZCB8fFxuICAgICAgRmFpbGBsZWZ0aGFuZCBicmFuZHMgbWF0Y2gsIGJ1dCByaWdodGhhbmQgYnJhbmRzIGRvbid0OiAke3EobGVmdCl9ICR7cShcbiAgICAgICAgcmlnaHQsXG4gICAgICApfWA7XG4gIH1cbiAgcmV0dXJuIG5hdFNhZmVNYXRoLmlzR1RFKFxuICAgIG11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksXG4gICAgbXVsdGlwbHkocmlnaHQubnVtZXJhdG9yLnZhbHVlLCBsZWZ0LmRlbm9taW5hdG9yLnZhbHVlKSxcbiAgKTtcbn07XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJhdGlvcyBhcmUgdGhlIHNhbWUgdmFsdWVzIChlcXVhbCBvciBlcXVpdmFsYW50IG1heSByZXR1cm5cbiAqIGZhbHNlKVxuICpcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRozY9fb25jZS5yYXRpb0dURShyYXRpb0dURSk7XG4gICAgICAgY29uc3QgcmF0aW9zU2FtZSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gKFxuICAgIEFtb3VudE1hdGguaXNFcXVhbChsZWZ0Lm51bWVyYXRvciwgcmlnaHQubnVtZXJhdG9yKSAmJlxuICAgIEFtb3VudE1hdGguaXNFcXVhbChsZWZ0LmRlbm9taW5hdG9yLCByaWdodC5kZW5vbWluYXRvcilcbiAgKTtcbn07XG5cbi8qKlxuICogTWFrZSBhIG5ldyByYXRpbyB3aXRoIGEgc21hbGxlciBkZW5vbWluYXRvciB0aGF0IGFwcHJveGltYXRlcyB0aGUgcmF0aW8uIElmXG4gKiB0aGUgcHJvcG9zZWQgZGVub21pbmF0b3IgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb25lLCByZXR1cm4gdGhlXG4gKiBvcmlnaW5hbC5cbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHBhcmFtIHtiaWdpbnR9IG5ld0RlblxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjNj19vbmNlLnJhdGlvc1NhbWUocmF0aW9zU2FtZSk7XG4gICAgICAgY29uc3QgcXVhbnRpemUgPSAocmF0aW8sIG5ld0RlbikgPT4ge1xuICBjb25zdCBvbGREZW4gPSByYXRpby5kZW5vbWluYXRvci52YWx1ZTtcbiAgY29uc3Qgb2xkTnVtID0gcmF0aW8ubnVtZXJhdG9yLnZhbHVlO1xuICBpZiAobmV3RGVuID4gb2xkRGVuKSB7XG4gICAgcmV0dXJuIHJhdGlvO1xuICB9XG5cbiAgY29uc3QgbmV3TnVtID1cbiAgICBuZXdEZW4gPT09IG9sZERlbiA/IG9sZE51bSA6IGJhbmtlcnNEaXZpZGUob2xkTnVtICogbmV3RGVuLCBvbGREZW4pO1xuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIG5ld051bSxcbiAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICAgbmV3RGVuLFxuICAgIHJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuICApO1xufTskaM2PX29uY2UucXVhbnRpemUocXVhbnRpemUpO1xuXG5jb25zdCBOVU1FUklDX1JFID0gL14oXFxkXFxkKikoPzpcXC4oXFxkKikpPyQvO1xuLyoqIEB0eXBlZGVmIHtiaWdpbnQgfCBudW1iZXIgfCBzdHJpbmd9IFBhcnNhYmxlTnVtYmVyICovXG5cbi8qKlxuICogQ3JlYXRlIGEgcmF0aW8gZnJvbSBhIGdpdmVuIG51bWVyaWMgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQYXJzYWJsZU51bWJlcn0gbnVtZXJpY1xuICogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IG51bWVyYXRvckJyYW5kXG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gW2Rlbm9taW5hdG9yQnJhbmRdXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi9cbiAgICAgICBjb25zdCBwYXJzZVJhdGlvID0gKFxuICBudW1lcmljLFxuICBudW1lcmF0b3JCcmFuZCxcbiAgZGVub21pbmF0b3JCcmFuZCA9IG51bWVyYXRvckJyYW5kLFxuKSA9PiB7XG4gIGNvbnN0IG1hdGNoID0gYCR7bnVtZXJpY31gLm1hdGNoKE5VTUVSSUNfUkUpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgRmFpbGBJbnZhbGlkIG51bWVyaWMgZGF0YTogJHtudW1lcmljfWA7XG4gIH1cblxuICBjb25zdCBbXywgd2hvbGUsIHBhcnQgPSAnJ10gPSBtYXRjaDtcbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBCaWdJbnQoYCR7d2hvbGV9JHtwYXJ0fWApLFxuICAgIG51bWVyYXRvckJyYW5kLFxuICAgIDEwbiAqKiBCaWdJbnQocGFydC5sZW5ndGgpLFxuICAgIGRlbm9taW5hdG9yQnJhbmQsXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIFBhcnNhYmxlTnVtYmVyfVxuICovJGjNj19vbmNlLnBhcnNlUmF0aW8ocGFyc2VSYXRpbyk7XG4gICAgICAgY29uc3QgYXNzZXJ0UGFyc2FibGVOdW1iZXIgPSBzcGVjaW1lbiA9PiB7XG4gIGNvbnN0IG1hdGNoID0gYCR7c3BlY2ltZW59YC5tYXRjaChOVU1FUklDX1JFKTtcbiAgbWF0Y2ggfHwgRmFpbGBJbnZhbGlkIG51bWVyaWMgZGF0YTogJHtzcGVjaW1lbn1gO1xufTtcblxuLyoqXG4gKiBSYXRpb3MgbWlnaHQgYmUgZ3JlYXRlciBvciBsZXNzIHRoYW4gb25lLlxuICpcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovJGjNj19vbmNlLmFzc2VydFBhcnNhYmxlTnVtYmVyKGFzc2VydFBhcnNhYmxlTnVtYmVyKTtcbiAgICAgICBjb25zdCByYXRpb1RvTnVtYmVyID0gcmF0aW8gPT4ge1xuICBjb25zdCBuID0gTnVtYmVyKHJhdGlvLm51bWVyYXRvci52YWx1ZSk7XG4gIGNvbnN0IGQgPSBOdW1iZXIocmF0aW8uZGVub21pbmF0b3IudmFsdWUpO1xuICByZXR1cm4gbiAvIGQ7XG59OyRozY9fb25jZS5yYXRpb1RvTnVtYmVyKHJhdGlvVG9OdW1iZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SXNSYXRpbyI6WyJhc3NlcnRJc1JhdGlvIl0sIm1ha2VSYXRpbyI6WyJtYWtlUmF0aW8iXSwibWFrZVJhdGlvRnJvbUFtb3VudHMiOlsibWFrZVJhdGlvRnJvbUFtb3VudHMiXSwiZmxvb3JNdWx0aXBseUJ5IjpbImZsb29yTXVsdGlwbHlCeSJdLCJjZWlsTXVsdGlwbHlCeSI6WyJjZWlsTXVsdGlwbHlCeSJdLCJtdWx0aXBseUJ5IjpbIm11bHRpcGx5QnkiXSwiZmxvb3JEaXZpZGVCeSI6WyJmbG9vckRpdmlkZUJ5Il0sImNlaWxEaXZpZGVCeSI6WyJjZWlsRGl2aWRlQnkiXSwiZGl2aWRlQnkiOlsiZGl2aWRlQnkiXSwiaW52ZXJ0UmF0aW8iOlsiaW52ZXJ0UmF0aW8iXSwiYWRkUmF0aW9zIjpbImFkZFJhdGlvcyJdLCJzdWJ0cmFjdFJhdGlvcyI6WyJzdWJ0cmFjdFJhdGlvcyJdLCJtdWx0aXBseVJhdGlvcyI6WyJtdWx0aXBseVJhdGlvcyJdLCJvbmVNaW51cyI6WyJvbmVNaW51cyJdLCJyYXRpb0dURSI6WyJyYXRpb0dURSJdLCJyYXRpb3NTYW1lIjpbInJhdGlvc1NhbWUiXSwicXVhbnRpemUiOlsicXVhbnRpemUiXSwicGFyc2VSYXRpbyI6WyJwYXJzZVJhdGlvIl0sImFzc2VydFBhcnNhYmxlTnVtYmVyIjpbImFzc2VydFBhcnNhYmxlTnVtYmVyIl0sInJhdGlvVG9OdW1iZXIiOlsicmF0aW9Ub051bWJlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABwLxbligcAAIoHAAAkAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3NhZmVNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm5hdFNhZmVNYXRoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTmF0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKiogQHR5cGVkZWYgeyh4OiBudW1iZXIgfCBiaWdpbnQsIHk6IG51bWJlciB8IGJpZ2ludCkgPT4gYmlnaW50fSBOYXRPcCAqL1xuXG4vKipcbiAqIFRoZXNlIG9wZXJhdGlvbnMgc2hvdWxkIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW9ucyB3aXRoIHRoZSB2YWx1ZXMgb2YgYmFzaWNcbiAqIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiBuYXRTYWZlTWF0aCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGRpcmVjdGx5LCBhbmQgc28gaXQgbmVlZHMgdG8gdmFsaWRhdGUgdGhlXG4gKiBpbnB1dHMsIGFzIHdlbGwgYXMgdGhlIG91dHB1dHMgd2hlbiBuZWNlc3NhcnkuXG4gKi9cbiAgICAgICBjb25zdCBuYXRTYWZlTWF0aCA9IGhhcmRlbih7XG4gIC8qKiBAdHlwZSB7TmF0T3B9ICovXG4gIC8qIEJpZ0ludHMgZG9uJ3Qgb2JzZXJ2YWJseSBvdmVyZmxvdyovXG4gIGFkZDogKHgsIHkpID0+IE5hdCh4KSArIE5hdCh5KSxcbiAgLyoqIEB0eXBlIHtOYXRPcH0gKi9cbiAgc3VidHJhY3Q6ICh4LCB5KSA9PiBOYXQoTmF0KHgpIC0gTmF0KHkpKSxcbiAgLyoqIEB0eXBlIHtOYXRPcH0gKi9cbiAgbXVsdGlwbHk6ICh4LCB5KSA9PiBOYXQoeCkgKiBOYXQoeSksXG4gIC8qKiBAdHlwZSB7TmF0T3B9ICovXG4gIGZsb29yRGl2aWRlOiAoeCwgeSkgPT4gTmF0KHgpIC8gTmF0KHkpLFxuICAvKiogQHR5cGUge05hdE9wfSAqL1xuICBjZWlsRGl2aWRlOiAoeCwgeSkgPT4ge1xuICAgIHkgPSBOYXQoeSk7XG4gICAgcmV0dXJuIE5hdChOYXQoeCkgKyB5IC0gMW4pIC8geTtcbiAgfSxcbiAgLyoqXG4gKiBEaXZpZGUgdXNpbmcgaGFsZi10by1ldmVuIChha2EgQmFua2VyJ3MgUm91bmRpbmcpIGFzIGluIElFRUUgNzc0IGRlZmF1bHRcbiAqIHJvdW5kaW5nXG4gKlxuICogQHR5cGUge05hdE9wfVxuICovXG4gIGJhbmtlcnNEaXZpZGU6IChhLCBiKSA9PiB7XG4gICAgYSA9IE5hdChhKTtcbiAgICBiID0gTmF0KGIpO1xuXG4gICAgY29uc3QgZGl2ID0gYSAvIGI7XG4gICAgY29uc3QgcmVtID0gYSAlIGI7XG4gICAgLyogaWYgcmVtYWluZGVyID4gaGFsZiBkaXZpc29yLCBzaG91bGQgaGF2ZSByb3VuZGVkIHVwIGluc3RlYWQgb2YgZG93biwgc28gYWRkIDEqL1xuICAgIGlmIChyZW0gKiAybiA+IGIpIHtcbiAgICAgIHJldHVybiBkaXYgKyAxbjtcbiAgICB9IGVsc2UgaWYgKHJlbSAqIDJuID09PSBiKSB7XG4gICAgICAvKiBBZGQgMSBpZiByZXN1bHQgaXMgb2RkIHRvIGdldCBhbiBldmVuIHJldHVybiB2YWx1ZSovXG4gICAgICBpZiAoZGl2ICUgMm4gPT09IDFuKSByZXR1cm4gZGl2ICsgMW47XG4gICAgfVxuICAgIHJldHVybiBkaXY7XG4gIH0sXG4gIC8qKiBAdHlwZSB7KHg6IG51bWJlciB8IGJpZ2ludCwgeTogbnVtYmVyIHwgYmlnaW50KSA9PiBib29sZWFufSAqL1xuICBpc0dURTogKHgsIHkpID0+IE5hdCh4KSA+PSBOYXQoeSksXG59KTskaM2PX29uY2UubmF0U2FmZU1hdGgobmF0U2FmZU1hdGgpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0U2FmZU1hdGgiOlsibmF0U2FmZU1hdGgiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYOSsWxkHAAAZBwAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvbm90aWZpZXIiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLHByb3ZpZGVMYXp5LG1ha2VOb3RpZmllcktpdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIixbJGjNj19hID0+IChwcm92aWRlTGF6eSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllcktpdFwiLFskaM2PX2EgPT4gKG1ha2VOb3RpZmllcktpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQdXJzZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtOb3RpZmllclJlY29yZH0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtXZWFrTWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICovXG5cbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG4gICAgICAgY29uc3QgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gKCkgPT4ge1xuICAvKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQdXJzZSwgTm90aWZpZXJSZWNvcmQ8YW55Pj59ICovXG4gIGNvbnN0IHRyYW5zaWVudE5vdGlmZXJLaXRzID0gbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShcbiAgICAndHJhbnNpZW50Tm90aWZlcktpdHMnLFxuICApO1xuXG4gIGNvbnN0IHByb3ZpZGVOb3RpZmllcktpdCA9IGtleSA9PlxuICAgIHByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLCBrZXksICgpID0+XG4gICAgICBtYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSksXG4gICAgKTtcblxuICBjb25zdCBwcm92aWRlTm90aWZpZXIgPSBrZXkgPT4gcHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG4gIGNvbnN0IHVwZGF0ZSA9IChrZXksIG5ld1ZhbHVlKSA9PiB7XG4gICAgaWYgKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKSB7XG4gICAgICBjb25zdCB7IHVwZGF0ZXIgfSA9IHRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xuICAgICAgdXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7IHByb3ZpZGVOb3RpZmllciwgdXBkYXRlIH07XG59OyRozY9fb25jZS5tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbmhhcmRlbihtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADl+t+rQC0AAEAtAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJBbW91bnRQYXR0ZXJuU2hhcGUiLCJBbW91bnRTaGFwZSIsIkFzc2V0S2luZFNoYXBlIiwiQnJhbmRJIiwiQnJhbmRTaGFwZSIsIkRlcG9zaXRGYWNldFNoYXBlIiwiRGlzcGxheUluZm9TaGFwZSIsIklzc3VlcktpdFNoYXBlIiwiSXNzdWVyU2hhcGUiLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiLCJNaW50U2hhcGUiLCJOb3RpZmllclNoYXBlIiwiUGF5bWVudFNoYXBlIiwiUHVyc2VTaGFwZSIsIlJhdGlvU2hhcGUiLCJpc0NvcHlCYWdWYWx1ZSIsImlzQ29weVNldFZhbHVlIiwiaXNOYXRWYWx1ZSIsImlzU2V0VmFsdWUiLCJtYWtlSXNzdWVySW50ZXJmYWNlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sbWF0Y2hlcyxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBpbXBvcnQge0Ftb3VudFZhbHVlLCBSYXRpb30gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCdcbiAqIEBpbXBvcnQge0NvcHlCYWcsIENvcHlTZXQsIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge05hdFZhbHVlLCBTZXRWYWx1ZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuICAgICAgIGNvbnN0IEJyYW5kU2hhcGUgPSBNLnJlbW90YWJsZSgnQnJhbmQnKTskaM2PX29uY2UuQnJhbmRTaGFwZShCcmFuZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdJc3N1ZXInKTskaM2PX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuICAgICAgIGNvbnN0IFBheW1lbnRTaGFwZSA9IE0ucmVtb3RhYmxlKCdQYXltZW50Jyk7JGjNj19vbmNlLlBheW1lbnRTaGFwZShQYXltZW50U2hhcGUpO1xuICAgICAgIGNvbnN0IFB1cnNlU2hhcGUgPSBNLnJlbW90YWJsZSgnUHVyc2UnKTskaM2PX29uY2UuUHVyc2VTaGFwZShQdXJzZVNoYXBlKTtcbiAgICAgICBjb25zdCBEZXBvc2l0RmFjZXRTaGFwZSA9IE0ucmVtb3RhYmxlKCdEZXBvc2l0RmFjZXQnKTskaM2PX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuICAgICAgIGNvbnN0IE5vdGlmaWVyU2hhcGUgPSBNLnJlbW90YWJsZSgnTm90aWZpZXInKTskaM2PX29uY2UuTm90aWZpZXJTaGFwZShOb3RpZmllclNoYXBlKTtcbiAgICAgICBjb25zdCBNaW50U2hhcGUgPSBNLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBOYXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzIGFcbiAqIG5vbi1uZWdhdGl2ZSBiaWdpbnQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGF0IG1hbnkgdW5pdHMgb2YgdGhlIGZ1bmdpYmxlIGFzc2V0XG4gKiByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudC4gVGhlIGJyYW5kIG9mIHRoYXQgYW1vdW50IHNob3VsZCBpbmRlZWQgcmVwcmVzZW50XG4gKiBhIGtpbmQgb2YgYXNzZXQgY29uc2lzdGluZyBvZiBhIGNvdW50YWJsZSBzZXQgb2YgZnVuZ2libGUgdW5pdHMuXG4gKi8kaM2PX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlID0gTS5uYXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weVNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weVNldCwgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhvc2Uga2V5cywgd2hlcmUgZWFjaCBrZXlcbiAqIHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIG5vbi1mdW5naWJsZSBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsIGZyb20gdGhlXG4gKiBub24tZnVuZ2libGUgYXNzZXQgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIGFtb3VudFxuICogaXRzZWxmIHJlcHJlc2VudHMgdGhlIHNldCBvZiB0aGVzZSBpdGVtcywgYXMgb3Bwb3NlZCB0byBhbnkgb2YgdGhlIG90aGVyXG4gKiBpdGVtcyBmcm9tIHRoZSBzYW1lIGFzc2V0IGNsYXNzLlxuICpcbiAqIElmIGEgZ2l2ZW4gdmFsdWUgY2xhc3MgcmVwcmVzZW50cyBjb25jZXJ0IHRpY2tldHMsIGl0IHNlZW1zIGJpemFycmUgdGhhdCB3ZVxuICogY2FuIGZvcm0gYW1vdW50cyBvZiBhbnkga2V5LiBUaGUgaGFyZCBjb25zdHJhaW50IGlzIHRoYXQgdGhlIGNvZGUgdGhhdCBob2xkc1xuICogdGhlIG1pbnQgZm9yIHRoYXQgYXNzZXQgY2xhc3MtLS10aGUgb25lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGJyYW5kLCBvbmx5XG4gKiBtaW50cyB0aGUgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSByZWFsIHVuaXRzIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieVxuICogaXQuIEFueW9uZSBlbHNlIGNhbiBwdXQgdG9nZXRoZXIgYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXlcbiAqIFwid2FudFwiIHNvbWUgaXRlbXMgdGhhdCB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmVcbiAqIHNhdGlzZmllZC4gXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlTZXRWYWx1ZVNoYXBlID0gTS5zZXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgU2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdCBpcyBhXG4gKiBDb3B5QXJyYXkgb2YgcGFzc2FibGUgS2V5cy4gVGhpcyByZXByZXNlbnRhdGlvbiBpcyBkZXByZWNhdGVkLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogICBDb3B5U2V0VmFsdWVzLlxuICovXG5jb25zdCBTZXRWYWx1ZVNoYXBlID0gTS5hcnJheU9mKE0ua2V5KCkpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5QmFnVmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QmFnLCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIGJhZyAobXVsdGlzZXQpIG9mIHRob3NlIGtleXMsIHdoZXJlIGVhY2hcbiAqIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBzZW1pLWZ1bmdpYmxlIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCxcbiAqIGZyb20gdGhlIHNlbWktZnVuZ2libGUgYXNzZXQgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlXG4gKiBudW1iZXIgb2YgdGltZXMgdGhhdCBrZXkgYXBwZWFycyBpbiB0aGUgYmFnIGlzIHRoZSBudW1iZXIgb2YgZnVuZ2libGUgdW5pdHNcbiAqIG9mIHRoYXQga2V5LiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzIHRoZSBiYWcgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWRcbiAqIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXMgZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlIHRoYXQgd2VcbiAqIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0IHRoZSBjb2RlIHRoYXQgaG9sZHNcbiAqIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBicmFuZCwgb25seVxuICogbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0cyBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnlcbiAqIGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5XG4gKiBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXQgd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlXG4gKiBzYXRpc2ZpZWQuIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5QmFnVmFsdWVTaGFwZSA9IE0uYmFnKCk7XG5cbmNvbnN0IEFtb3VudFZhbHVlU2hhcGUgPSBNLm9yKFxuICBOYXRWYWx1ZVNoYXBlLFxuICBDb3B5U2V0VmFsdWVTaGFwZSxcbiAgU2V0VmFsdWVTaGFwZSxcbiAgQ29weUJhZ1ZhbHVlU2hhcGUsXG4pO1xuXG4gICAgICAgY29uc3QgQW1vdW50U2hhcGUgPSB7IGJyYW5kOiBCcmFuZFNoYXBlLCB2YWx1ZTogQW1vdW50VmFsdWVTaGFwZSB9OyRozY9fb25jZS5BbW91bnRTaGFwZShBbW91bnRTaGFwZSk7XG5oYXJkZW4oQW1vdW50U2hhcGUpO1xuXG4vKipcbiAqIFRvIGJlIHVzZWQgdG8gZ3VhcmQgYW4gYW1vdW50IHBhdHRlcm4gYXJndW1lbnQsIGkuZS4sIGFuIGFyZ3VtZW50IHdoaWNoIGlzIGFcbiAqIHBhdHRlcm4gdGhhdCBjYW4gYmUgdXNlZCB0byB0ZXN0IGFtb3VudHMuIFNpbmNlIGFtb3VudHMgYXJlIGtleXMsIGFueXdoZXJlIGFuXG4gKiBhbW91bnQgcGF0dGVybiBpcyBleHBlY3RlZCwgYW4gYW1vdW50IGNhbiBiZSBwcm92aWRlZCBhbmQgd2lsbCBtYXRjaCBvbmx5XG4gKiB0aGF0IGNvbmNyZXRlIGFtb3VudCwgaS5lLiwgYW1vdW50cyB0aGF0IGFyZSBga2V5RVFgIHRvIHRoYXQgYW1vdW50LlxuICpcbiAqIFRoZSBgQW1vdW50U2hhcGVgIGd1YXJkIGFib3ZlIGlzIGFuIGFtb3VudCBwYXR0ZXJuLiBCdXQgbm90IGFsbCBhbW91bnRcbiAqIHBhdHRlcm5zIGFyZSBsaWtlIGBBbW91bnRTaGFwZWAuIEZvciBleGFtcGxlLCBgTS5hbnkoKWAgaXMgYSB2YWxpZCBhbW91bnRcbiAqIHBhdHRlcm4gdGhhdCB3aWxsIGFkbWl0IGFueSBhbW91bnQsIGJ1dCBpcyBkb2VzIG5vdCByZXNlbWJsZSB0aGVcbiAqIGBBbW91bnRTaGFwZWAgcGF0dGVybiBhYm92ZS5cbiAqL1xuICAgICAgIGNvbnN0IEFtb3VudFBhdHRlcm5TaGFwZSA9IE0ucGF0dGVybigpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxSYXRpbz59ICovJGjNj19vbmNlLkFtb3VudFBhdHRlcm5TaGFwZShBbW91bnRQYXR0ZXJuU2hhcGUpO1xuICAgICAgIGNvbnN0IFJhdGlvU2hhcGUgPSB7IG51bWVyYXRvcjogQW1vdW50U2hhcGUsIGRlbm9taW5hdG9yOiBBbW91bnRTaGFwZSB9OyRozY9fb25jZS5SYXRpb1NoYXBlKFJhdGlvU2hhcGUpO1xuaGFyZGVuKFJhdGlvU2hhcGUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIE5hdCBiaWdpbnQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBOYXRWYWx1ZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzTmF0VmFsdWUgPSB2YWx1ZSA9PiBtYXRjaGVzKHZhbHVlLCBOYXRWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNOYXRWYWx1ZShpc05hdFZhbHVlKTtcbmhhcmRlbihpc05hdFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5U2V0XG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5U2V0fVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5U2V0VmFsdWUgPSB2YWx1ZSA9PiBtYXRjaGVzKHZhbHVlLCBDb3B5U2V0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzQ29weVNldFZhbHVlKGlzQ29weVNldFZhbHVlKTtcbmhhcmRlbihpc0NvcHlTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgcGFzcyBieSBjb3B5IGFycmF5IHN0cnVjdHVyZS4gRG9lcyBub3QgY2hlY2sgZm9yXG4gKiBkdXBsaWNhdGVzLiBUbyBjaGVjayBmb3IgZHVwbGljYXRlcywgdXNlIHNldE1hdGhIZWxwZXJzLmNvZXJjZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqICAgQ29weVNldFZhbHVlcy5cbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgU2V0VmFsdWV9XG4gKi9cbiAgICAgICBjb25zdCBpc1NldFZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgU2V0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzU2V0VmFsdWUoaXNTZXRWYWx1ZSk7XG5oYXJkZW4oaXNTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgQ29weUJhZ1xuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgQ29weUJhZ31cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weUJhZ1ZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgQ29weUJhZ1ZhbHVlU2hhcGUpOyRozY9fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vKiBPbmUgR09PR09MdGggc2hvdWxkIGJlIGVub3VnaCBkZWNpbWFsIHBsYWNlcyBmb3IgYW55Ym9keS4qL1xuICAgICAgIGNvbnN0IE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyA9IDEwMDskaM2PX29uY2UuTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyk7XG5cbiAgICAgICBjb25zdCBBc3NldEtpbmRTaGFwZSA9IE0ub3IoJ25hdCcsICdzZXQnLCAnY29weVNldCcsICdjb3B5QmFnJyk7JGjNj19vbmNlLkFzc2V0S2luZFNoYXBlKEFzc2V0S2luZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IERpc3BsYXlJbmZvU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7fSxcbiAge1xuICAgIGRlY2ltYWxQbGFjZXM6IE0uYW5kKFxuICAgICAgTS5ndGUoLU1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyksXG4gICAgICBNLmx0ZShNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuICAgICksXG4gICAgYXNzZXRLaW5kOiBBc3NldEtpbmRTaGFwZSxcbiAgfSxcbiAge1xuICAgIC8qIEluY2x1ZGluZyB0aGlzIGVtcHR5IGByZXN0YCBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyKi9cbiAgICAvKiBwcm9wZXJ0aWVzIGJleW9uZCB0aG9zZSBpbiB0aGUgYGJhc2VgIHJlY29yZC4qL1xuICB9LFxuKTskaM2PX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtcblxuICAgICAgIGNvbnN0IElzc3VlcktpdFNoYXBlID0ge1xuICBicmFuZDogQnJhbmRTaGFwZSxcbiAgbWludDogTWludFNoYXBlLFxuICBtaW50UmVjb3ZlcnlQdXJzZTogUHVyc2VTaGFwZSxcbiAgaXNzdWVyOiBJc3N1ZXJTaGFwZSxcbiAgZGlzcGxheUluZm86IERpc3BsYXlJbmZvU2hhcGUsXG59OyRozY9fb25jZS5Jc3N1ZXJLaXRTaGFwZShJc3N1ZXJLaXRTaGFwZSk7XG5oYXJkZW4oSXNzdWVyS2l0U2hhcGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgICAgICBjb25zdCBCcmFuZEkgPSBNLmludGVyZmFjZSgnQnJhbmQnLCB7XG4gIGlzTXlJc3N1ZXI6IE0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICBnZXRBbGxlZ2VkTmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0RGlzcGxheUluZm86IE0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG4gIGdldEFtb3VudFNoYXBlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKSxcbn0pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2JyYW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthc3NldEtpbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Ftb3VudFNoYXBlXVxuICovJGjNj19vbmNlLkJyYW5kSShCcmFuZEkpO1xuICAgICAgIGNvbnN0IG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gKFxuICBicmFuZFNoYXBlID0gQnJhbmRTaGFwZSxcbiAgYXNzZXRLaW5kU2hhcGUgPSBBc3NldEtpbmRTaGFwZSxcbiAgYW1vdW50U2hhcGUgPSBBbW91bnRTaGFwZSxcbikgPT4ge1xuICBjb25zdCBJc3N1ZXJJID0gTS5pbnRlcmZhY2UoJ0lzc3VlcicsIHtcbiAgICBnZXRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbiAgICBnZXRBbGxlZ2VkTmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgICBnZXRBc3NldEtpbmQ6IE0uY2FsbCgpLnJldHVybnMoYXNzZXRLaW5kU2hhcGUpLFxuICAgIGdldERpc3BsYXlJbmZvOiBNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxuICAgIG1ha2VFbXB0eVB1cnNlOiBNLmNhbGwoKS5yZXR1cm5zKFB1cnNlU2hhcGUpLFxuXG4gICAgaXNMaXZlOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gICAgZ2V0QW1vdW50T2Y6IE0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgICBidXJuOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSlcbiAgICAgIC5vcHRpb25hbChBbW91bnRQYXR0ZXJuU2hhcGUpXG4gICAgICAucmV0dXJucyhhbW91bnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IE1pbnRJID0gTS5pbnRlcmZhY2UoJ01pbnQnLCB7XG4gICAgZ2V0SXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgICBtaW50UGF5bWVudDogTS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IFBheW1lbnRJID0gTS5pbnRlcmZhY2UoJ1BheW1lbnQnLCB7XG4gICAgZ2V0QWxsZWdlZEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBQdXJzZUkgPSBNLmludGVyZmFjZSgnUHVyc2UnLCB7XG4gICAgZ2V0QWxsZWdlZEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICAgIGdldEN1cnJlbnRBbW91bnQ6IE0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICAgIGdldEN1cnJlbnRBbW91bnROb3RpZmllcjogTS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbiAgICAvKiBQdXJzZUkgZG9lcyAqbm90KiBkZWxheSBgZGVwb3NpdGAgdW50aWwgYHNyY1BheW1lbnRgIGlzIGZ1bGZ1bGxlZC4qL1xuICAgIC8qIFJhdGhlciwgdGhlIHNlbWFudGljcyBvZiBgZGVwb3NpdGAgcmVxdWlyZSBpdCB0byBwcm92aWRlIGl0cyovXG4gICAgLyogY2FsbGVycyB3aXRoIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGBkZXBvc2l0YCBtZXNzYWdlcyBhcmUqL1xuICAgIC8qIHByb2Nlc3NlZCB3aXRob3V0IGZ1cnRoZXIgZGVsYXkgaW4gdGhlIG9yZGVyIHRoZXkgYXJyaXZlLiovXG4gICAgLyogUHVyc2VJIHRoZXJlZm9yZSByZXF1aXJlcyB0aGF0IHRoZSBgc3JjUGF5bWVudGAgYXJndW1lbnQgYWxyZWFkeSovXG4gICAgLyogYmUgYSByZW1vdGFibGUsIG5vdCBhIHByb21pc2UuKi9cbiAgICAvKiBQdXJzZUkgb25seSBjYWxscyB0aGlzIHJhdyBtZXRob2QgYWZ0ZXIgdmFsaWRhdGluZyB0aGF0Ki9cbiAgICAvKiBgc3JjUGF5bWVudGAgaXMgYSByZW1vdGFibGUsIGxlYXZpbmcgaXQqL1xuICAgIC8qIHRvIHRoaXMgcmF3IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgcmVtb3RhYmxlIGlzIGFjdHVhbGx5Ki9cbiAgICAvKiBhIGxpdmUgcGF5bWVudCBvZiB0aGUgY29ycmVjdCBicmFuZCB3aXRoIHN1ZmZpY2llbnQgZnVuZHMuKi9cbiAgICBkZXBvc2l0OiBNLmNhbGwoUGF5bWVudFNoYXBlKVxuICAgICAgLm9wdGlvbmFsKEFtb3VudFBhdHRlcm5TaGFwZSlcbiAgICAgIC5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgICBnZXREZXBvc2l0RmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoRGVwb3NpdEZhY2V0U2hhcGUpLFxuICAgIHdpdGhkcmF3OiBNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbiAgICBnZXRSZWNvdmVyeVNldDogTS5jYWxsKCkucmV0dXJucyhNLnNldE9mKFBheW1lbnRTaGFwZSkpLFxuICAgIHJlY292ZXJBbGw6IE0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBEZXBvc2l0RmFjZXRJID0gTS5pbnRlcmZhY2UoJ0RlcG9zaXRGYWNldCcsIHtcbiAgICByZWNlaXZlOiBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoUHVyc2VJKS5tZXRob2RHdWFyZHMuZGVwb3NpdCxcbiAgfSk7XG5cbiAgY29uc3QgUHVyc2VJS2l0ID0ge1xuICAgIHB1cnNlOiBQdXJzZUksXG4gICAgZGVwb3NpdEZhY2V0OiBEZXBvc2l0RmFjZXRJLFxuICB9O1xuICBoYXJkZW4oUHVyc2VJS2l0KTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBJc3N1ZXJJLFxuICAgIE1pbnRJLFxuICAgIFBheW1lbnRJLFxuICAgIFB1cnNlSUtpdCxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlSXNzdWVySW50ZXJmYWNlcyhtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG5oYXJkZW4obWFrZUlzc3VlckludGVyZmFjZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJhbmRTaGFwZSI6WyJCcmFuZFNoYXBlIl0sIklzc3VlclNoYXBlIjpbIklzc3VlclNoYXBlIl0sIlBheW1lbnRTaGFwZSI6WyJQYXltZW50U2hhcGUiXSwiUHVyc2VTaGFwZSI6WyJQdXJzZVNoYXBlIl0sIkRlcG9zaXRGYWNldFNoYXBlIjpbIkRlcG9zaXRGYWNldFNoYXBlIl0sIk5vdGlmaWVyU2hhcGUiOlsiTm90aWZpZXJTaGFwZSJdLCJNaW50U2hhcGUiOlsiTWludFNoYXBlIl0sIkFtb3VudFNoYXBlIjpbIkFtb3VudFNoYXBlIl0sIkFtb3VudFBhdHRlcm5TaGFwZSI6WyJBbW91bnRQYXR0ZXJuU2hhcGUiXSwiUmF0aW9TaGFwZSI6WyJSYXRpb1NoYXBlIl0sImlzTmF0VmFsdWUiOlsiaXNOYXRWYWx1ZSJdLCJpc0NvcHlTZXRWYWx1ZSI6WyJpc0NvcHlTZXRWYWx1ZSJdLCJpc1NldFZhbHVlIjpbImlzU2V0VmFsdWUiXSwiaXNDb3B5QmFnVmFsdWUiOlsiaXNDb3B5QmFnVmFsdWUiXSwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIjpbIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyJdLCJBc3NldEtpbmRTaGFwZSI6WyJBc3NldEtpbmRTaGFwZSJdLCJEaXNwbGF5SW5mb1NoYXBlIjpbIkRpc3BsYXlJbmZvU2hhcGUiXSwiSXNzdWVyS2l0U2hhcGUiOlsiSXNzdWVyS2l0U2hhcGUiXSwiQnJhbmRJIjpbIkJyYW5kSSJdLCJtYWtlSXNzdWVySW50ZXJmYWNlcyI6WyJtYWtlSXNzdWVySW50ZXJmYWNlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAUYC9zZLAAA2SwAACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2FsbGJhY2suanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiY2FsbEUiLCJjYWxsU3luYyIsImlzQ2FsbGJhY2siLCJtYWtlRnVuY3Rpb25DYWxsYmFjayIsIm1ha2VNZXRob2RDYWxsYmFjayIsIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayIsIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siLCJwcmVwYXJlQXR0ZW51YXRvciIsInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbWFrZUVycm9yLHEsRSxpc1ByaW1pdGl2ZSxpc1Bhc3NhYmxlU3ltYm9sLGdldEludGVyZmFjZU1ldGhvZEtleXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChpc1Bhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldEludGVyZmFjZU1ldGhvZEtleXNcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VNZXRob2RLZXlzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2ZhcidcbiAqIEBpbXBvcnQge01ldGhvZHN9IGZyb20gJ0BlbmRvL2V4byc7XG4gKiBAaW1wb3J0IHtGYXJhYmxlfSBmcm9tICdAZW5kby9leG8nO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge01ldGhvZEd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKi9cbi8qKiBAaW1wb3J0IHtDYWxsYmFjaywgU3luY0NhbGxiYWNrfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IHsgb3duS2V5czogcmF3T3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IG93bktleXMgPVxuICAvKiogQHR5cGUgezxUIGV4dGVuZHMgUHJvcGVydHlLZXk+KG9iajogeyBbSyBpbiBUXT86IHVua25vd24gfSkgPT4gVFtdfSAqLyAoXG4gICAgcmF3T3duS2V5c1xuICApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gVFxuICogQHR5cGVkZWYgeyhcbiAqICAgLi4uYXJnczogUGFyYW1ldGVyczxSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlQXR0ZW51YXRvcj4+XG4gKiApID0+IEZhcmFibGU8VD59IE1ha2VBdHRlbnVhdG9yXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGtleVxuICogQHJldHVybnMge2tleSBpcyBQcm9wZXJ0eUtleX0gRklYTUU6IHNob3VsZCBiZSBqdXN0IGBQcm9wZXJ0eUtleWAgYnV0IFRTXG4gKiAgIGNvbXBsYWlucyBpdCBjYW4ndCBiZSB1c2VkIGFzIGFuIGluZGV4IHR5cGUuXG4gKi9cbmNvbnN0IGlzUHJvcGVydHlLZXkgPSBrZXkgPT4ge1xuICBzd2l0Y2ggKHR5cGVvZiBrZXkpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogU3luY2hyb25vdXNseSBjYWxsIGEgY2FsbGJhY2suXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHBhcmFtIHtTeW5jQ2FsbGJhY2s8ST59IGNhbGxiYWNrXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPEk+fVxuICovXG4gICAgICAgY29uc3QgY2FsbFN5bmMgPSAoY2FsbGJhY2ssIC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kIH0gPSBjYWxsYmFjaztcbiAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0YXJnZXQoLi4uYm91bmQsIC4uLmFyZ3MpO1xuICB9XG4gIHJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oLi4uYm91bmQsIC4uLmFyZ3MpO1xufTskaM2PX29uY2UuY2FsbFN5bmMoY2FsbFN5bmMpO1xuaGFyZGVuKGNhbGxTeW5jKTtcblxuLyoqXG4gKiBFdmVudHVhbCBzZW5kIHRvIGEgY2FsbGJhY2suXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHBhcmFtIHtDYWxsYmFjazxJPn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPEk+Pj59XG4gKi9cbiAgICAgICBjb25zdCBjYWxsRSA9IChjYWxsYmFjaywgLi4uYXJncykgPT4ge1xuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIEUodGFyZ2V0KSguLi5ib3VuZCwgLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIEUodGFyZ2V0KVttZXRob2ROYW1lXSguLi5ib3VuZCwgLi4uYXJncyk7XG59OyRozY9fb25jZS5jYWxsRShjYWxsRSk7XG5oYXJkZW4oY2FsbEUpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPn0gW1Q9SV1cbiAqIEB0ZW1wbGF0ZSB7YW55W119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sgPSAodGFyZ2V0LCAuLi5ib3VuZCkgPT4ge1xuICB0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nIHx8XG4gICAgRmFpbGBzeW5jIGZ1bmN0aW9uIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGEgZnVuY3Rpb246ICR7dGFyZ2V0fWA7XG4gIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgY29uc3QgY2IgPSBoYXJkZW4oeyB0YXJnZXQsIGJvdW5kLCBpc1N5bmM6IHRydWUgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge1N5bmNDYWxsYmFjazxJPn0gKi8gKGNiKTtcbn07JGjNj19vbmNlLm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayhtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIHBvdGVudGlhbGx5IGZhciBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge0VSZWY8KC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPj59IFtUPUVSZWY8ST5dXG4gKiBAdGVtcGxhdGUge2FueVtdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7Q2FsbGJhY2s8ST59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRnVuY3Rpb25DYWxsYmFjayA9ICh0YXJnZXQsIC4uLmJvdW5kKSA9PiB7XG4gICFpc1ByaW1pdGl2ZSh0YXJnZXQpIHx8XG4gICAgRmFpbGBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uIHByZXNlbmNlOiAke3RhcmdldH1gO1xuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBib3VuZCB9KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7Q2FsbGJhY2s8ST59ICovIChjYik7XG59OyRozY9fb25jZS5tYWtlRnVuY3Rpb25DYWxsYmFjayhtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZUZ1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIG1ldGhvZC5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge3tcbiAqICAgW3ggaW4gUF06ICguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST47XG4gKiB9fSBbVD17IFt4IGluIFBdOiBJIH1dXG4gKiBAdGVtcGxhdGUge2FueVtdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3luY01ldGhvZENhbGxiYWNrID0gKHRhcmdldCwgbWV0aG9kTmFtZSwgLi4uYm91bmQpID0+IHtcbiAgIWlzUHJpbWl0aXZlKHRhcmdldCkgfHxcbiAgICBGYWlsYHN5bmMgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbiAgdHlwZW9mIG1ldGhvZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKSB8fFxuICAgIEZhaWxgbWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBwYXNzYWJsZSBzeW1ib2w6ICR7bWV0aG9kTmFtZX1gO1xuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCwgaXNTeW5jOiB0cnVlIH0pO1xuICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovIChjYik7XG59OyRozY9fb25jZS5tYWtlU3luY01ldGhvZENhbGxiYWNrKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgbWV0aG9kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IFBcbiAqIEB0ZW1wbGF0ZSB7RVJlZjx7XG4gKiAgIFt4IGluIFBdOiAoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+O1xuICogfT59IFtUPUVSZWY8eyBbeCBpbiBQXTogSSB9Pl1cbiAqIEB0ZW1wbGF0ZSB7YW55W119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UH0gbWV0aG9kTmFtZVxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge0NhbGxiYWNrPEk+fVxuICovXG4gICAgICAgY29uc3QgbWFrZU1ldGhvZENhbGxiYWNrID0gKHRhcmdldCwgbWV0aG9kTmFtZSwgLi4uYm91bmQpID0+IHtcbiAgIWlzUHJpbWl0aXZlKHRhcmdldCkgfHxcbiAgICBGYWlsYG1ldGhvZCBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3Q6ICR7dGFyZ2V0fWA7XG4gIHR5cGVvZiBtZXRob2ROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgIGlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkgfHxcbiAgICBGYWlsYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge0NhbGxiYWNrPEk+fSAqLyAoY2IpO1xufTskaM2PX29uY2UubWFrZU1ldGhvZENhbGxiYWNrKG1ha2VNZXRob2RDYWxsYmFjayk7XG5oYXJkZW4obWFrZU1ldGhvZENhbGxiYWNrKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtjYWxsYmFjayBpcyBDYWxsYmFjazxhbnk+fVxuICovXG4gICAgICAgY29uc3QgaXNDYWxsYmFjayA9IGNhbGxiYWNrID0+IHtcbiAgaWYgKGlzUHJpbWl0aXZlKGNhbGxiYWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICByZXR1cm4gKFxuICAgICFpc1ByaW1pdGl2ZSh0YXJnZXQpICYmXG4gICAgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdHlwZW9mIG1ldGhvZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICBpc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpKSAmJlxuICAgIEFycmF5LmlzQXJyYXkoYm91bmQpXG4gICk7XG59OyRozY9fb25jZS5pc0NhbGxiYWNrKGlzQ2FsbGJhY2spO1xuaGFyZGVuKGlzQ2FsbGJhY2spO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciBjbGFzcyB3aG9zZSBtZXRob2RzIGNhbiBiZSByZWRpcmVjdGVkIHZpYSBjYWxsYmFja3MuXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gTVxuICogQHBhcmFtIHtab25lfSB6b25lIFRoZSB6b25lIGluIHdoaWNoIHRvIGFsbG9jYXRlIGF0dGVudWF0b3JzLlxuICogQHBhcmFtIHtNW119IG1ldGhvZE5hbWVzIE1ldGhvZHMgdG8gZm9yd2FyZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkPHtcbiAqICAgW0sgaW4gTV06IE1ldGhvZEd1YXJkO1xuICogfT59IFtvcHRzLmludGVyZmFjZUd1YXJkXVxuICogICBBbiBpbnRlcmZhY2UgZ3VhcmQgZm9yIHRoZSBuZXcgYXR0ZW51YXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy50YWddIEEgdGFnIGZvciB0aGUgbmV3IGF0dGVudWF0b3IgZXhvQ2xhc3MuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlQXR0ZW51YXRvciA9IChcbiAgem9uZSxcbiAgbWV0aG9kTmFtZXMsXG4gIHsgaW50ZXJmYWNlR3VhcmQsIHRhZyA9ICdBdHRlbnVhdG9yJyB9ID0ge30sXG4pID0+IHtcbiAgLyoqXG4gKiBAdHlwZWRlZiB7KHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pID0+IGFueX0gTWV0aG9kXG4gKlxuICogQHR5cGVkZWYge3sgW0sgaW4gTV0/OiBDYWxsYmFjazxhbnk+IHwgbnVsbCB9fSBPdmVycmlkZXNcbiAqXG4gKiBAdHlwZWRlZiB7eyBbSyBpbiBNXTogKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pID0+IGFueSB9fSBNZXRob2RzXG4gKi9cbiAgY29uc3QgbWV0aG9kcyA9IC8qKiBAdHlwZSB7TWV0aG9kc30gKi8gKFxuICAgIGZyb21FbnRyaWVzKFxuICAgICAgbWV0aG9kTmFtZXMubWFwKGtleSA9PiB7XG4gICAgICAgIC8qIE9ubHkgYWxsb3cgdGhlIGBQcm9wZXJ0eUtleWAgdHlwZSBmb3IgdGhlIHRhcmdldCBtZXRob2Qga2V5LiovXG4gICAgICAgIGlmICghaXNQcm9wZXJ0eUtleShrZXkpKSB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBrZXkgJHtxKGtleSl9IGlzIG5vdCBhIFByb3BlcnR5S2V5YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG0gPSAvKiogQHR5cGUge01ldGhvZHN9ICovICh7XG4gICAgICAgICAgLyogRXhwbGljaXRseSB1c2UgY29uY2lzZSBtZXRob2Qgc3ludGF4IHRvIHByZXNlcnZlIGB0aGlzYCBidXQgcHJldmVudCovXG4gICAgICAgICAgLyogY29uc3RydWN0b3IgYmVoYXZpb3IuKi9cbiAgICAgICAgICAvKiogQHR5cGUge01ldGhvZH0gKi9cbiAgICAgICAgICBba2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICAvKiBTdXBwb3J0IGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jIGNhbGxiYWNrcy4qL1xuICAgICAgICAgICAgY29uc3QgY2IgPSB0aGlzLnN0YXRlLmNic1trZXldO1xuICAgICAgICAgICAgaWYgKCFjYikge1xuICAgICAgICAgICAgICBjb25zdCBlcnIgPSBtYWtlRXJyb3IoYHVuaW1wbGVtZW50ZWQgJHtxKHRhZyl9IG1ldGhvZCAke3Eoa2V5KX1gKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUuaXNTeW5jKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNiLmlzU3luYykge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbFN5bmMoY2IsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNhbGxFKGNiLCAuLi5hcmdzKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KVtrZXldO1xuICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtrZXksIG1dKTtcbiAgICAgIH0pLFxuICAgIClcbiAgKTtcblxuICAvKipcbiAqIENyZWF0ZSBhbiBleG8gb2JqZWN0IHdob3NlIGJlaGF2aW9yIGlzIGNvbXBvc2VkIGZyb20gYSBkZWZhdWx0IHRhcmdldFxuICogYW5kL29yIGluZGl2aWR1YWwgbWV0aG9kIG92ZXJyaWRlIGNhbGxiYWNrcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHt1bmtub3dufSBbb3B0cy50YXJnZXRdIFRoZSB0YXJnZXQgZm9yIGFueSBtZXRob2RzIHRoYXQgd2VyZW4ndFxuICogICBzcGVjaWZpZWQgaW4gYG9wdHMub3ZlcnJpZGVzYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaXNTeW5jPWZhbHNlXSBXaGV0aGVyIHRoZSB0YXJnZXQgc2hvdWxkIGJlIHRyZWF0ZWRcbiAqICAgYXMgc3luY2hyb25vdXNseSBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge092ZXJyaWRlc30gW29wdHMub3ZlcnJpZGVzXSBTZXQgaW5kaXZpZHVhbCBjYWxsYmFja3MgZm9yIG1ldGhvZHNcbiAqICAgKHdob3NlIG5hbWVzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgYHByZXBhcmVBdHRlbnVhdG9yYCBvclxuICogICBgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yYCBjYWxsKS4gTnVsbGlzaCBvdmVycmlkZXMgbWVhbiB0byB0aHJvdy5cbiAqL1xuICBjb25zdCBtYWtlQXR0ZW51YXRvciA9IHpvbmUuZXhvQ2xhc3MoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIC8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7YW55fSBbb3B0cy50YXJnZXRdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmlzU3luY11cbiAqIEBwYXJhbSB7T3ZlcnJpZGVzfSBbb3B0cy5vdmVycmlkZXNdXG4gKi9cbiAgICAoe1xuICAgICAgdGFyZ2V0ID0gbnVsbCxcbiAgICAgIGlzU3luYyA9IGZhbHNlLFxuICAgICAgb3ZlcnJpZGVzID0gLyoqIEB0eXBlIHtPdmVycmlkZXN9ICovICh7fSksXG4gICAgfSkgPT4ge1xuICAgICAgY29uc3QgY2JzID0gLyoqIEB0eXBlIHtPdmVycmlkZXN9ICovICh7fSk7XG5cbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBTZXQobWV0aG9kTmFtZXMpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Ygb3duS2V5cyhvdmVycmlkZXMpKSB7XG4gICAgICAgIHJlbWFpbmluZy5oYXMoa2V5KSB8fFxuICAgICAgICAgIEZhaWxgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIG5vdCBhbGxvd2VkIGJ5IG1ldGhvZE5hbWVzYDtcblxuICAgICAgICByZW1haW5pbmcuZGVsZXRlKGtleSk7XG4gICAgICAgIGNvbnN0IGNiID0gb3ZlcnJpZGVzW2tleV07XG4gICAgICAgIGNiID09IG51bGwgfHxcbiAgICAgICAgICBpc0NhbGxiYWNrKGNiKSB8fFxuICAgICAgICAgIEZhaWxgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIGlzIG5vdCBhIGNhbGxiYWNrOyBnb3QgJHtjYn1gO1xuICAgICAgICBjYnNba2V5XSA9IGNiO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVtYWluaW5nKSB7XG4gICAgICAgIGlmIChpc1N5bmMpIHtcbiAgICAgICAgICBjYnNba2V5XSA9IG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2sodGFyZ2V0LCBrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNic1trZXldID0gbWFrZU1ldGhvZENhbGxiYWNrKHRhcmdldCwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGhhcmRlbih7IGNicywgaXNTeW5jIH0pO1xuICAgIH0sXG4gICAgLyoqIEB0eXBlIHtNZXRob2RzfSAqLyAobWV0aG9kcyksXG4gICk7XG4gIHJldHVybiBtYWtlQXR0ZW51YXRvcjtcbn07JGjNj19vbmNlLnByZXBhcmVBdHRlbnVhdG9yKHByZXBhcmVBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlQXR0ZW51YXRvcik7XG5cbi8qKlxuICogUHJlcGFyZSBhbiBhdHRlbnVhdG9yIHdob3NlIG1ldGhvZE5hbWVzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGludGVyZmFjZUd1YXJkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7SW50ZXJmYWNlR3VhcmR9IEdcbiAqIEBwYXJhbSB7Wm9uZX0gem9uZVxuICogQHBhcmFtIHtHfSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLnRhZ11cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciA9ICh6b25lLCBpbnRlcmZhY2VHdWFyZCwgb3B0cyA9IHt9KSA9PiB7XG4gIGNvbnN0IG1ldGhvZE5hbWVzID0gZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyhpbnRlcmZhY2VHdWFyZCk7XG4gIGNvbnN0IG1ha2VBdHRlbnVhdG9yID0gcHJlcGFyZUF0dGVudWF0b3Ioem9uZSwgbWV0aG9kTmFtZXMsIHtcbiAgICAuLi5vcHRzLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICB9KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7TWFrZUF0dGVudWF0b3I8YW55Pn0gKi8gKG1ha2VBdHRlbnVhdG9yKTtcbn07JGjNj19vbmNlLnByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xuaGFyZGVuKHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYWxsU3luYyI6WyJjYWxsU3luYyJdLCJjYWxsRSI6WyJjYWxsRSJdLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siOlsibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VGdW5jdGlvbkNhbGxiYWNrIjpbIm1ha2VGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siOlsibWFrZVN5bmNNZXRob2RDYWxsYmFjayJdLCJtYWtlTWV0aG9kQ2FsbGJhY2siOlsibWFrZU1ldGhvZENhbGxiYWNrIl0sImlzQ2FsbGJhY2siOlsiaXNDYWxsYmFjayJdLCJwcmVwYXJlQXR0ZW51YXRvciI6WyJwcmVwYXJlQXR0ZW51YXRvciJdLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiOlsicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKM2T6b1BAAA9QQAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2xpLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJ0b0NMSU9wdGlvbnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nLWtleWVkIG9iamVjdCBpbnRvIGFuIGFycmF5IG9mIENMSSBvcHRpb25zLCB1c2luZyBlYWNoIGtleSBhc1xuICogdGhlIG5hbWUgb2YgYSBHTlUtc3R5bGUgbG9uZyBvcHRpb24gYC0tJHtrZXl9YCwgaWdub3JpbmcgZWFjaCBrZXkgd2l0aCBhblxuICogdW5kZWZpbmVkIHZhbHVlIGFuZCBjb252ZXJ0aW5nIGJvb2xlYW4gdmFsdWVzIGludG8gbm8tYXJndW1lbnQgYC0tJHtrZXl9YCBvclxuICogYC0tbm8tJHtrZXl9YCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5kZWZpbmVkIHwgYm9vbGVhbiB8IHN0cmluZyB8IHN0cmluZ1tdPn0gcmVjb3JkIC1cbiAqICAgZS5nLiB7IGNvbG9yOiAnYmx1ZScgfVxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIGUuZy4gWyctLWNvbG9yJywgJ2JsdWUnXVxuICovXG4gICAgICAgY29uc3QgdG9DTElPcHRpb25zID0gcmVjb3JkID0+XG4gIE9iamVjdC5lbnRyaWVzKHJlY29yZCkuZmxhdE1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiBbYC0tJHtrZXl9YF07XG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkgcmV0dXJuIFtgLS1uby0ke2tleX1gXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8qIFJlcHJlc2VudCBhcyBhIHJlcGVhdGVkIG9wdGlvbi4qL1xuICAgICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAodiA9PiBbYC0tJHtrZXl9YCwgdl0pO1xuICAgIH1cbiAgICByZXR1cm4gW2AtLSR7a2V5fWAsIHZhbHVlXTtcbiAgfSk7JGjNj19vbmNlLnRvQ0xJT3B0aW9ucyh0b0NMSU9wdGlvbnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidG9DTElPcHRpb25zIjpbInRvQ0xJT3B0aW9ucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABtDXgVygwAAMoMAAAlAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NvbmZpZy5qc3siaW1wb3J0cyI6WyIuL2tleU1pcnJvci5qcyJdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQiLCJWQmFua0FjY291bnQiLCJXYWxsZXROYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQga2V5TWlycm9yOyRozY9faW1wb3J0cyhbW1wiLi9rZXlNaXJyb3IuanNcIiwgW1tcImtleU1pcnJvclwiLFskaM2PX2EgPT4gKGtleU1pcnJvciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGZpbGVcbiAqXG4gKiAgIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiAgIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAgYW5kIG91ciBsYXggcGFja2FnZVxuICogICBkZXBlbmRlbmN5IGdyYXBoLCBzb21ldGltZXMgcmF0aW9uYWwgcGxhY2VtZW50cyBjYXVzZSB0eXBlIHJlc29sdXRpb25cbiAqICAgZXJyb3JzLlxuICpcbiAqICAgU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZVxuICogICBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIENsdXN0ZXJOYW1lIHNwZWNpZmllcyBhIGNvbGxlY3Rpb24gb2YgbmV0d29ya3MuIFRoZSBzcGVjaWZpYyBuZXR3b3Jrc1xuICogYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBuYW1lIG1heSB2YXJ5IGZyb20gY29udGV4dCB0byBjb250ZXh0LCBhbmQgbWF5XG4gKiBhbHNvIG92ZXJsYXAgKGUuZy4gYSBcImxvY2FsXCIgY2x1c3RlciBtYXkgY29ubmVjdCB0byB0aGUgc2FtZSByZW1vdGUgbmV0d29ya3NcbiAqIGFzIGEgXCJ0ZXN0bmV0XCIgY2x1c3RlciksIGJ1dCB0aGlzIHR5cGUgbmV2ZXJ0aGVsZXNzIHN1cHBvcnRzIGNyb3NzLXBhY2thZ2VcbiAqIGNvb3JkaW5hdGlvbiB3aGVyZSB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBzdGF0aWMgbGFiZWxzIGFyZSBzdWJqZWN0IHRvXG4gKiBjaG9pY2Ugb2YgY2x1c3Rlci4gU29tZSBleGFtcGxlczpcbiAqXG4gKiAtIHRoZSBjaGFpbiBJRCBmb3IgYSBzdGF0aWMgbGFiZWwgbGlrZSBcIkFnb3JpY1wiIG9yIFwiRXRoZXJldW1cIlxuICogLSB0aGUgY3J5cHRvZ3JhcGhpYyBoYXNoIGZvciBhIHN0YXRpYyBsYWJlbCBsaWtlIFwiQkxEXCIgb3IgXCJVU0RDXCJcbiAqIC0gdGhlIFVSTCBmb3IgYSBzZXJ2aWNlIGxpa2UgXCJBZ29yaWMgUlBDXCIgb3IgXCJBeGVsYXJcIiBvciBcIlNwZWN0cnVtXCJcbiAqXG4gKiBcIm1haW5uZXRcIiBzaG91bGQgYWx3YXlzIGluY2x1ZGUgdGhlIEFnb3JpYyBuZXR3b3JrIGRlc2NyaWJlZCBieVxuICogaHR0cHM6Ly9tYWluLmFnb3JpYy5uZXQvbmV0d29yay1jb25maWcgcmF0aGVyIHRoYW4gc29tZSBvdGhlciBhbHRlcm5hdGl2ZS5cbiAqXG4gKiBYWFggVGhpcyBhY3R1YWxseSBiZWxvbmdzIHNvbWV3aGVyZSBlbHNlLCBwb3NzaWJseSB3aXRoIHJlZmFjdG9yaW5nLlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMTIxODUjZGlzY3Vzc2lvbl9yMjUwMDEyMzIyNlxuICpcbiAqIEB0eXBlZGVmIHsnbG9jYWwnIHwgJ3Rlc3RuZXQnIHwgJ21haW5uZXQnfSBDbHVzdGVyTmFtZVxuICovXG5cbi8qKlxuICogRXZlbnQgc291cmNlIGlkcyB1c2VkIGJ5IHRoZSBicmlkZ2UgZGV2aWNlLlxuICpcbiAqIEBlbnVtIHsodHlwZW9mIEJyaWRnZUlkKVtrZXlvZiB0eXBlb2YgQnJpZGdlSWRdfVxuICovXG4gICAgICAgY29uc3QgQnJpZGdlSWQgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBCQU5LOiAnYmFuaycsXG4gIENPUkU6ICdjb3JlJyxcbiAgRElCQzogJ2RpYmMnLFxuICBTVE9SQUdFOiAnc3RvcmFnZScsXG4gIFBST1ZJU0lPTjogJ3Byb3Zpc2lvbicsXG4gIFBST1ZJU0lPTl9TTUFSVF9XQUxMRVQ6ICdwcm92aXNpb25XYWxsZXQnLFxuICBWTE9DQUxDSEFJTjogJ3Zsb2NhbGNoYWluJyxcbiAgVlRSQU5TRkVSOiAndnRyYW5zZmVyJyxcbiAgV0FMTEVUOiAnd2FsbGV0Jyxcbn0pOyRozY9fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5oYXJkZW4oQnJpZGdlSWQpO1xuXG4vKiogQHNhdGlzZmllcyB7UmVjb3JkPHN0cmluZywgQnJpZGdlSWQ+fSAqL1xuICAgICAgIGNvbnN0IENvc21vc0luaXRLZXlUb0JyaWRnZUlkID0ge1xuICB2YmFua1BvcnQ6ICdiYW5rJyxcbiAgdmliY1BvcnQ6ICdkaWJjJyxcbn07JGjNj19vbmNlLkNvc21vc0luaXRLZXlUb0JyaWRnZUlkKENvc21vc0luaXRLZXlUb0JyaWRnZUlkKTtcbmhhcmRlbihDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCk7XG5cbiAgICAgICBjb25zdCBXYWxsZXROYW1lID0ga2V5TWlycm9yKHtcbiAgZGVwb3NpdEZhY2V0OiBudWxsLFxufSk7JGjNj19vbmNlLldhbGxldE5hbWUoV2FsbGV0TmFtZSk7XG5oYXJkZW4oV2FsbGV0TmFtZSk7XG5cbi8qIGRlZmluZWQgaW4gZ29sYW5nL2Nvc21vcy94L3ZiYW5rKi9cbiAgICAgICBjb25zdCBWQmFua0FjY291bnQgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICByZXNlcnZlOiB7XG4gICAgbW9kdWxlOiAndmJhbmsvcmVzZXJ2ZScsXG4gICAgYWRkcmVzczogJ2Fnb3JpYzFhZTBsbXR6bGdyY25sYTl4amtwYWFycTVkNWRmZXo2M2gzbnVjbCcsXG4gIH0sXG4gIHByb3Zpc2lvbjoge1xuICAgIG1vZHVsZTogJ3ZiYW5rL3Byb3Zpc2lvbicsXG4gICAgYWRkcmVzczogJ2Fnb3JpYzFtZWd6eXRnNjVjeXJnenM2ZnZ6eGdyY3F2d3dsN3VncHQ2MjM0NicsXG4gIH0sXG59KTskaM2PX29uY2UuVkJhbmtBY2NvdW50KFZCYW5rQWNjb3VudCk7XG5oYXJkZW4oVkJhbmtBY2NvdW50KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyaWRnZUlkIjpbIkJyaWRnZUlkIl0sIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIjpbIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIl0sIldhbGxldE5hbWUiOlsiV2FsbGV0TmFtZSJdLCJWQmFua0FjY291bnQiOlsiVkJhbmtBY2NvdW50Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI29pgGuCAAArggAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvZGVidWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VUcmFjZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQGplc3NpZS1jaGVjayovXG5cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzExODQ0Ki9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzExODQ1Ki9cbmxldCBkZWJ1Z0luc3RhbmNlID0gMTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8ICd2ZXJib3NlJ30gZW5hYmxlXG4gKi9cbiAgICAgICBjb25zdCBtYWtlVHJhY2VyID0gKGxhYmVsLCBlbmFibGUgPSB0cnVlKSA9PiB7XG4gIGNvbnN0IHN1YiA9IChzdWJMYWJlbCwgc3ViRW5hYmxlID0gZW5hYmxlKSA9PlxuICAgIG1ha2VUcmFjZXIoYCR7bGFiZWx9LiR7c3ViTGFiZWx9YCwgc3ViRW5hYmxlKTtcbiAgY29uc3Qga2V5ID0gYC0tLS0tICR7bGFiZWx9LCR7ZGVidWdJbnN0YW5jZX0gYDtcbiAgZGVidWdJbnN0YW5jZSArPSAxO1xuICAvKiB0aGUgY2FzZXMgYmVsb3cgZGVmaW5lIGEgbmFtZWQgdmFyaWFibGUgdG8gcHJvdmlkZSBiZXR0ZXIgZGVidWcgaW5mbyovXG4gIHN3aXRjaCAoZW5hYmxlKSB7XG4gICAgY2FzZSBmYWxzZToge1xuICAgICAgY29uc3QgbG9nRGlzYWJsZWQgPSAoLi4uX2FyZ3MpID0+IHt9O1xuICAgICAgcmV0dXJuIGhhcmRlbihPYmplY3QuYXNzaWduKGxvZ0Rpc2FibGVkLCB7IHN1YiB9KSk7XG4gICAgfVxuICAgIGNhc2UgJ3ZlcmJvc2UnOiB7XG4gICAgICBjb25zdCBpbmZvVGljayA9IChvcHRMb2csIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgLyogWFhYIFNuaWZmIHRlc3RzIHN1Y2ggYXMgdGhpcyBhcmUgaW5oZXJlbnRseSB1bnJlbGlhYmxlIGFuZCBzbWVsbCBiYWQuKi9cbiAgICAgICAgLyogRXZlbiBhc2lkZSBmcm9tIHRoZSBzZWN1cml0eSBoYXphcmQgb2YqL1xuICAgICAgICAvKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzExODQ1Ki9cbiAgICAgICAgLyogYW4gb2JqZWN0IGludGVuZGVkIGFzIGEgbm9ybWFsIGxvZ2dpbmcgYXJndW1lbnQgbWF5IGFjY2lkZW50YWxseSovXG4gICAgICAgIC8qIHBhc3MgdGhpcyBzbmlmZiB0ZXN0LCBjYXVzaW5nIGNvbmZ1c2lvbi4qL1xuICAgICAgICBpZiAodHlwZW9mIG9wdExvZz8ubG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgLi4uYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgb3B0TG9nLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBoYXJkZW4oT2JqZWN0LmFzc2lnbihpbmZvVGljaywgeyBzdWIgfSkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBkZWJ1Z1RpY2sgPSAob3B0TG9nLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgIC8qIEFub3RoZXIgdW5yZWxpYWJsZSBzbmlmZiB0ZXN0IGxpa2UgdGhlIG9uZSBhYm92ZSovXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0TG9nPy5sb2cgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvcHRMb2cubG9nKGtleSwgLi4uYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgb3B0TG9nLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBoYXJkZW4oT2JqZWN0LmFzc2lnbihkZWJ1Z1RpY2ssIHsgc3ViIH0pKTtcbiAgICB9XG4gIH1cbn07JGjNj19vbmNlLm1ha2VUcmFjZXIobWFrZVRyYWNlcik7XG5oYXJkZW4obWFrZVRyYWNlcik7XG5cbi8qKlxuICogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VUcmFjZXI+fSBUcmFjZUxvZ2dlclxuICovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhY2VyIjpbIm1ha2VUcmFjZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsZPVjl4DAABeAwAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9lcnJvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiTm9uTnVsbGlzaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuICAgICAgIGNvbnN0IE5vbk51bGxpc2ggPSAodmFsLCBvcHREZXRhaWxzID0gYHVuZXhwZWN0ZWQgJHtxKHZhbCl9YCkgPT4ge1xuICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAvKiBUaGlzIGAhPSBudWxsYCBpZGlvbSBjaGVja3MgdGhhdCBgdmFsYCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuKi9cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIGFzc2VydC5mYWlsKG9wdERldGFpbHMpO1xufTskaM2PX29uY2UuTm9uTnVsbGlzaChOb25OdWxsaXNoKTtcbmhhcmRlbihOb25OdWxsaXNoKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Ik5vbk51bGxpc2giOlsiTm9uTnVsbGlzaCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABoHOwa/gQAAP4EAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY2xpLXV0aWxzLmpzIiwiLi9jb25maWcuanMiLCIuL2RlYnVnLmpzIiwiLi9lcnJvcnMuanMiLCIuL2pzLXV0aWxzLmpzIiwiLi9rZXlNaXJyb3IuanMiLCIuL21hcnNoYWwvcHVyZS1kYXRhLmpzIiwiLi9tZXRob2QtdG9vbHMuanMiLCIuL21ldHJpY3MuanMiLCIuL25hdHVyYWwtc29ydC5qcyIsIi4vc2VzLXV0aWxzLmpzIiwiLi90bXBEaXIuanMiLCIuL3R5cGVDaGVjay5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOlsiLi9jbGktdXRpbHMuanMiLCIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL2Vycm9ycy5qcyIsIi4vanMtdXRpbHMuanMiLCIuL2tleU1pcnJvci5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi9tZXRyaWNzLmpzIiwiLi9uYXR1cmFsLXNvcnQuanMiLCIuL3Nlcy11dGlscy5qcyIsIi4vdG1wRGlyLmpzIiwiLi90eXBlQ2hlY2suanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vY2xpLXV0aWxzLmpzXCIsIFtdXSxbXCIuL2NvbmZpZy5qc1wiLCBbXV0sW1wiLi9kZWJ1Zy5qc1wiLCBbXV0sW1wiLi9lcnJvcnMuanNcIiwgW11dLFtcIi4vanMtdXRpbHMuanNcIiwgW11dLFtcIi4va2V5TWlycm9yLmpzXCIsIFtdXSxbXCIuL21hcnNoYWwvcHVyZS1kYXRhLmpzXCIsIFtdXSxbXCIuL21ldGhvZC10b29scy5qc1wiLCBbXV0sW1wiLi9tZXRyaWNzLmpzXCIsIFtdXSxbXCIuL25hdHVyYWwtc29ydC5qc1wiLCBbXV0sW1wiLi9zZXMtdXRpbHMuanNcIiwgW11dLFtcIi4vdG1wRGlyLmpzXCIsIFtdXSxbXCIuL3R5cGVDaGVjay5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9tYXJzaGFsL3B1cmUtZGF0YS5qcyI6W1sicHVyZURhdGFNYXJzaGFsbGVyIiwicHVyZURhdGFNYXJzaGFsbGVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACq1a+NpiUAAKYlAAAnAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2pzLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJUUlVFIiwiZGVlcENvcHlKc29uYWJsZSIsImRlZXBNYXBPYmplY3QiLCJkZWZpbmVOYW1lIiwiZnJvbVR5cGVkRW50cmllcyIsImxvZ0xldmVscyIsIm1ha2VNZWFzdXJlU2Vjb25kcyIsIm9iamVjdE1hcE11dGFibGUiLCJwYXJ0aWFsTWFwIiwicHJvdmlkZUxhenlNYXAiLCJ0eXBlZEVudHJpZXMiLCJ0eXBlZE1hcCIsInVucHJlZml4ZWRQcm9wZXJ0aWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG4vKiBAamVzc2llLWNoZWNrKi9cbi8qKlxuICogQGZpbGUgUHVyZSBKYXZhU2NyaXB0IHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBidXQgbm90XG4gKiAgIGRlcGVuZGVudCB1cG9uIGEgaGFyZGVuZWQgZW52aXJvbm1lbnQuXG4gKi9cblxuY29uc3QgeyBkZWZpbmVQcm9wZXJ0eSB9ID0gT2JqZWN0O1xuXG4vKiogRm9yIG92ZXJyaWRpbmcgVHlwZVNjcmlwdCBpbmZlcnJpbmcgdGhlIHR5cGUgb2YgYHRydWVgIGFzIGJvb2xlYW4uICovXG4gICAgICAgY29uc3QgVFJVRSA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh0cnVlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7PE8gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gKiAgIG9iajogTyxcbiAqICkgPT4gRXhjbHVkZTxcbiAqICAgeyBbSyBpbiBrZXlvZiBPXTogSyBleHRlbmRzIHN0cmluZyA/IFtLLCBPW0tdXSA6IG5ldmVyIH1ba2V5b2YgT10sXG4gKiAgIHVuZGVmaW5lZFxuICogPltdfSBUeXBlZEVudHJpZXNcbiAqLyRozY9fb25jZS5UUlVFKFRSVUUpO1xuICAgICAgIGNvbnN0IHR5cGVkRW50cmllcyA9IC8qKiBAdHlwZSB7VHlwZWRFbnRyaWVzfSAqLyAoT2JqZWN0LmVudHJpZXMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8XG4gKiAgIGNvbnN0IEVudHJpZXMgZXh0ZW5kcyBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtQcm9wZXJ0eUtleSwgdW5rbm93bl0+LFxuICogPihcbiAqICAgZW50cmllczogRW50cmllcyxcbiAqICkgPT4geyBbRW50cnkgaW4gRW50cmllc1tudW1iZXJdIGFzIEVudHJ5WzBdXTogRW50cnlbMV0gfX0gRnJvbVR5cGVkRW50cmllc1xuICovJGjNj19vbmNlLnR5cGVkRW50cmllcyh0eXBlZEVudHJpZXMpO1xuICAgICAgIGNvbnN0IGZyb21UeXBlZEVudHJpZXMgPSAvKiogQHR5cGUge0Zyb21UeXBlZEVudHJpZXN9ICovIChcbiAgT2JqZWN0LmZyb21FbnRyaWVzXG4pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8QSBleHRlbmRzIHVua25vd25bXSwgVj4oXG4gKiAgIGFycjogQSxcbiAqICAgbWFwcGVyOiA8SyBleHRlbmRzIG51bWJlcj4oZWw6IEFbS10sIGlkeDogSywgYXJyOiBBKSA9PiBWLFxuICogKSA9PiBWW119IFR5cGVkTWFwXG4gKi8kaM2PX29uY2UuZnJvbVR5cGVkRW50cmllcyhmcm9tVHlwZWRFbnRyaWVzKTtcbiAgICAgICBjb25zdCB0eXBlZE1hcCA9IC8qKiBAdHlwZSB7VHlwZWRNYXB9ICovIChcbiAgRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUubWFwKVxuKTskaM2PX29uY2UudHlwZWRNYXAodHlwZWRNYXApO1xuXG4gICAgICAgY29uc3QgbG9nTGV2ZWxzID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtcbiAgJ2RlYnVnJyxcbiAgJ2xvZycsXG4gICdpbmZvJyxcbiAgJ3dhcm4nLFxuICAnZXJyb3InLFxuXSk7JGjNj19vbmNlLmxvZ0xldmVscyhsb2dMZXZlbHMpO1xuT2JqZWN0LmZyZWV6ZShsb2dMZXZlbHMpO1xuXG4vKiogQHR5cGVkZWYgeyh0eXBlb2YgbG9nTGV2ZWxzKVtrZXlvZiBsb2dMZXZlbHMgJiBudW1iZXJdfSBMb2dMZXZlbCAqL1xuXG4vKiogQHR5cGVkZWYge1BpY2s8Q29uc29sZSwgTG9nTGV2ZWw+fSBMaW1pdGVkQ29uc29sZSAqL1xuXG4vKipcbiAqIERlZXAtY29weSBhIHZhbHVlIGJ5IHJvdW5kLXRyaXBwaW5nIGl0IHRocm91Z2ggSlNPTiAod2hpY2ggZHJvcHNcbiAqIGZ1bmN0aW9uL3N5bWJvbC91bmRlZmluZWQgdmFsdWVzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vbi1lbnVtZXJhYmxlXG4gKiBhbmQvb3Igc3ltYm9sLWtleWVkLCBhbmQgcmVqZWN0cyBiaWdpbnQgdmFsdWVzKS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZVxuICogQHJldHVybnMge1R9XG4gKi9cbiAgICAgICBjb25zdCBkZWVwQ29weUpzb25hYmxlID0gdmFsdWUgPT4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPn0gT1xuICogQHRlbXBsYXRlIHtzdHJpbmcgJiBrZXlvZiBPfSBLXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHtPW0tdfSB2YWx1ZVxuICogQHBhcmFtIHtLIHwgdW5kZWZpbmVkfSBuYW1lXG4gKiBAcGFyYW0ge08gfCB1bmRlZmluZWR9IGNvbnRhaW5lclxuICogQHBhcmFtIHsodmFsdWU6IE9bS10sIG5hbWU6IHN0cmluZywgcmVjb3JkOiBPKSA9PiBPW0tdIHwgTX0gbWFwcGVyXG4gKiBAcmV0dXJucyB7T1tLXSB8IE0gfCB7IFtLMiBpbiBrZXlvZiBPW0tdXTogT1tLXVtLMl0gfCBNIH19XG4gKi8kaM2PX29uY2UuZGVlcENvcHlKc29uYWJsZShkZWVwQ29weUpzb25hYmxlKTtcbmNvbnN0IGRlZXBNYXBPYmplY3RJbnRlcm5hbCA9ICh2YWx1ZSwgbmFtZSwgY29udGFpbmVyLCBtYXBwZXIpID0+IHtcbiAgaWYgKGNvbnRhaW5lciAmJiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBtYXBwZWQgPSBtYXBwZXIodmFsdWUsIG5hbWUsIGNvbnRhaW5lcik7XG4gICAgaWYgKG1hcHBlZCAhPT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgbGV0IHdhc01hcHBlZCA9IGZhbHNlO1xuICBjb25zdCB2YWx1ZU9iaiA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSk7XG4gIC8qKlxuICogQHR5cGUgezxUIGV4dGVuZHMgdHlwZW9mIHZhbHVlLCBLMiBleHRlbmRzIHN0cmluZyAmIGtleW9mIFQ+KFxuICogICBlbnRyeTogW0syLCBUW0syXV0sXG4gKiApID0+IFtLMiwgVFtLMl0gfCBNXX1cbiAqL1xuICBjb25zdCBtYXBFbnRyeSA9IChbaW5uZXJOYW1lLCBpbm5lclZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IG1hcHBlZElubmVyVmFsdWUgPSBkZWVwTWFwT2JqZWN0SW50ZXJuYWwoXG4gICAgICBpbm5lclZhbHVlLFxuICAgICAgaW5uZXJOYW1lLFxuICAgICAgdmFsdWVPYmosXG4gICAgICBtYXBwZXIsXG4gICAgKTtcbiAgICB3YXNNYXBwZWQgfHw9IG1hcHBlZElubmVyVmFsdWUgIT09IGlubmVyVmFsdWU7XG4gICAgcmV0dXJuIFtpbm5lck5hbWUsIC8qKiBAdHlwZSB7YW55fSAqLyAobWFwcGVkSW5uZXJWYWx1ZSldO1xuICB9O1xuICBjb25zdCBtYXBwZWRFbnRyaWVzID0gdHlwZWRFbnRyaWVzKHZhbHVlT2JqKS5tYXAobWFwRW50cnkpO1xuXG4gIGlmICghd2FzTWFwcGVkKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3QgbWFwcGVkT2JqID0gZnJvbVR5cGVkRW50cmllcyhtYXBwZWRFbnRyaWVzKTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAobWFwcGVkT2JqKTtcbn07XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgdHJhdmVyc2VzIGEgcmVjb3JkIG9iamVjdCBzdHJ1Y3R1cmUsIGNhbGxpbmcgYSBtYXBwZXIgZnVuY3Rpb25cbiAqIGZvciBlYWNoIGVudW1lcmFibGUgc3RyaW5nLWtleWVkIHByb3BlcnR5IGFuZCByZXR1cm5pbmcgYSByZWNvcmQgY29tcG9zZWQgb2ZcbiAqIHRoZSByZXN1bHRzLiBJZiBub25lIG9mIHRoZSB2YWx1ZXMgYXJlIGNoYW5nZWQsIHRoZSBvcmlnaW5hbCBvYmplY3QgaXNcbiAqIHJldHVybmVkLCBtYWludGFpbmluZyBpdHMgaWRlbnRpdHkuXG4gKlxuICogV2hlbiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgYW4gb2JqZWN0LCBpdCBpcyBzZW50IHRvIHRoZSBtYXBwZXIgbGlrZSBhbnkgb3RoZXJcbiAqIHZhbHVlLCBhbmQgdGhlbiByZWN1cnNpdmVseSB0cmF2ZXJzZWQgdW5sZXNzIHJlcGxhY2VkIHdpdGggYSBkaXN0aW5jdCB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBPXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHtPfSBvYmpcbiAqIEBwYXJhbSB7PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgSyBleHRlbmRzIHN0cmluZyAmIGtleW9mIFQ+KFxuICogICB2YWx1ZTogVFtLXSxcbiAqICAgbmFtZTogSyxcbiAqICAgcmVjb3JkOiBULFxuICogKSA9PiBUW0tdIHwgTX0gbWFwcGVyXG4gKiBAcmV0dXJucyB7TyB8IHsgW0sgaW4ga2V5b2YgT106IEsgZXh0ZW5kcyBzdHJpbmcgPyBPW0tdIHwgTSA6IG5ldmVyIH19XG4gKi9cbiAgICAgICBjb25zdCBkZWVwTWFwT2JqZWN0ID0gKG9iaiwgbWFwcGVyKSA9PlxuICAvKiogQHR5cGUge2FueX0gKi8gKGRlZXBNYXBPYmplY3RJbnRlcm5hbChvYmosIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBtYXBwZXIpKTtcblxuLyoqXG4gKiBFeHBsaWNpdGx5IHNldCBhIGZ1bmN0aW9uJ3MgbmFtZSwgc3VwcG9ydGluZyB1c2Ugb2YgYXJyb3cgZnVuY3Rpb25zIGZvciB3aGljaFxuICogc291cmNlIHRleHQgZG9lc24ndCBpbmNsdWRlIGEgbmFtZSBhbmQgbm8gaW5pdGlhbCBuYW1lIGlzIHNldCBieVxuICogTmFtZWRFdmFsdWF0aW9uXG4gKiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi9tdWx0aXBhZ2Uvc3ludGF4LWRpcmVjdGVkLW9wZXJhdGlvbnMuaHRtbCNzZWMtcnVudGltZS1zZW1hbnRpY3MtbmFtZWRldmFsdWF0aW9uXG4gKlxuICogYG5hbWVgIGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgZm9yIGJldHRlciByZWFkYWJpbGl0eSBhdCBjYWxsIHNpdGVzIChlLmcuLFxuICogYHJldHVybiBkZWZpbmVOYW1lKCdmb28nLCAoKSA9PiB7IC4uLiB9KWApLlxuICpcbiAqIEB0ZW1wbGF0ZSB7RnVuY3Rpb259IEZcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Z9IGZuXG4gKiBAcmV0dXJucyB7Rn1cbiAqLyRozY9fb25jZS5kZWVwTWFwT2JqZWN0KGRlZXBNYXBPYmplY3QpO1xuICAgICAgIGNvbnN0IGRlZmluZU5hbWUgPSAobmFtZSwgZm4pID0+XG4gIGRlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHsgdmFsdWU6IG5hbWUgfSk7XG5cbi8qKlxuICogQnkgYW5hbG9neSB3aXRoIGhvdyBgQXJyYXkucHJvdG90eXBlLm1hcGAgd2lsbCBtYXAgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5XG4gKiB0byB0cmFuc2Zvcm1lZCBlbGVtZW50cyBvZiBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSwgYG9iamVjdE1hcE11dGFibGVgXG4gKiB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgZW51bWVyYWJsZSBzdHJpbmcta2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVW5saWtlIGVuZG8ncyBgb2JqZWN0TWFwYCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbm9uLWhhcmRlbmVkIG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBPXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHtPfSBvYmpcbiAqIEBwYXJhbSB7PEsgZXh0ZW5kcyBrZXlvZiBPPih2YWx1ZTogT1tLXSwga2V5OiBLKSA9PiBNfSBtYXBwZXJcbiAqIEByZXR1cm5zIHt7IFtLIGluIGtleW9mIE9dOiBLIGV4dGVuZHMgc3RyaW5nID8gTSA6IG5ldmVyIH19XG4gKi8kaM2PX29uY2UuZGVmaW5lTmFtZShkZWZpbmVOYW1lKTtcbiAgICAgICBjb25zdCBvYmplY3RNYXBNdXRhYmxlID0gKG9iaiwgbWFwcGVyKSA9PiB7XG4gIGNvbnN0IG9sZEVudHJpZXMgPSB0eXBlZEVudHJpZXMob2JqKTtcbiAgLyoqIEB0eXBlIHs8SyBleHRlbmRzIGtleW9mIE8+KGVudHJ5OiBbSywgT1tLXV0pID0+IFtLLCBNXX0gKi9cbiAgY29uc3QgbWFwRW50cnkgPSAoW2ssIHZdKSA9PiBbaywgbWFwcGVyKHYsIGspXTtcbiAgY29uc3QgbmV3RW50cmllcyA9IHR5cGVkTWFwKG9sZEVudHJpZXMsIG1hcEVudHJ5KTtcbiAgY29uc3QgbmV3T2JqID0gZnJvbVR5cGVkRW50cmllcyhuZXdFbnRyaWVzKTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAobmV3T2JqKTtcbn07XG5cbi8qKlxuICogTWFwIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheSB0byBuZXcgdmFsdWVzLCBza2lwcGluZyBlbGVtZW50cyBmb3Igd2hpY2ggdGhlXG4gKiBtYXBwaW5nIHJlc3VsdHMgaW4gZWl0aGVyIGB1bmRlZmluZWRgIG9yIGBmYWxzZWAuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAcGFyYW0ge1RbXX0gYXJyXG4gKiBAcGFyYW0geyh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyOiBUW10pID0+IFUgfCB1bmRlZmluZWQgfCBmYWxzZX0gbWFwT3JEcm9wXG4gKiBAcmV0dXJucyB7VVtdfVxuICovJGjNj19vbmNlLm9iamVjdE1hcE11dGFibGUob2JqZWN0TWFwTXV0YWJsZSk7XG4gICAgICAgY29uc3QgcGFydGlhbE1hcCA9IChhcnIsIG1hcE9yRHJvcCkgPT5cbiAgYXJyLnJlZHVjZSgocmVzdWx0cywgZWwsIGksIGFyckFyZykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IG1hcE9yRHJvcChlbCwgaSwgYXJyQXJnKTtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9LCAvKiogQHR5cGUge1VbXX0gKi8gKFtdKSk7XG5cbi8qKlxuICogUmV0dXJuIHRoZSB2YWx1ZSBmcm9tIGBtYXBgIGFzc29jaWF0ZWQgd2l0aCBga2V5YC4gSWYgdGhlcmUgaXMgbm90IHlldCBzdWNoIGFcbiAqIHZhbHVlLCBnZXQgb25lIGZyb20gYG1ha2VWYWx1ZShrZXkpYCBhbmQgdXBkYXRlIGBtYXBgIGJlZm9yZSByZXR1cm5pbmcgdGhlXG4gKiBuZXcgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1tLXSBleHRlbmRzIFtXZWFrS2V5XSA/IFdlYWtNYXA8SywgVj4gOiBNYXA8SywgVj59IG1hcFxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqLyRozY9fb25jZS5wYXJ0aWFsTWFwKHBhcnRpYWxNYXApO1xuICAgICAgIGNvbnN0IHByb3ZpZGVMYXp5TWFwID0gKG1hcCwga2V5LCBtYWtlVmFsdWUpID0+IHtcbiAgY29uc3QgZm91bmQgPSBtYXAuZ2V0KGtleSk7XG4gIGlmIChmb3VuZCAhPT0gdW5kZWZpbmVkIHx8IG1hcC5oYXMoa2V5KSkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1Z9ICovIChmb3VuZCk7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBtYWtlVmFsdWUoa2V5KTtcbiAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB1c2VzIGEgbWlsbGlzZWNvbmQtYmFzZWQgY3VycmVudC10aW1lIGNhcGFiaWxpdHlcbiAqIChzdWNoIGFzIGBwZXJmb3JtYW5jZS5ub3dgKSB0byBtZWFzdXJlIGV4ZWN1dGlvbiBkdXJhdGlvbiBvZiBhbiBhc3luY1xuICogZnVuY3Rpb24gYW5kIHJlcG9ydCB0aGUgcmVzdWx0IGluIHNlY29uZHMgdG8gbWF0Y2ggb3VyIHRlbGVtZXRyeSBzdGFuZGFyZC5cbiAqXG4gKiBAcGFyYW0geygpID0+IG51bWJlcn0gY3VycmVudFRpbWVNaWxsaXNlY1xuICovJGjNj19vbmNlLnByb3ZpZGVMYXp5TWFwKHByb3ZpZGVMYXp5TWFwKTtcbiAgICAgICBjb25zdCBtYWtlTWVhc3VyZVNlY29uZHMgPSBjdXJyZW50VGltZU1pbGxpc2VjID0+IHtcbiAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBmblxuICogQHJldHVybnMge1Byb21pc2U8eyByZXN1bHQ6IFQ7IGR1cmF0aW9uOiBudW1iZXIgfT59XG4gKi9cbiAgY29uc3QgbWVhc3VyZVNlY29uZHMgPSBhc3luYyBmbiA9PiB7XG4gICAgY29uc3QgdDAgPSBjdXJyZW50VGltZU1pbGxpc2VjKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oKTtcbiAgICBjb25zdCBkdXJhdGlvbk1pbGxpc2VjID0gY3VycmVudFRpbWVNaWxsaXNlYygpIC0gdDA7XG4gICAgcmV0dXJuIHsgcmVzdWx0LCBkdXJhdGlvbjogZHVyYXRpb25NaWxsaXNlYyAvIDEwMDAgfTtcbiAgfTtcbiAgcmV0dXJuIG1lYXN1cmVTZWNvbmRzO1xufTtcblxuLyoqXG4gKiBGaW5kIGFsbCBvZiBhbiBvYmplY3QncyBwcm9wZXJ0aWVzIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBwcmVmaXgsIGFuZFxuICogcmV0dXJuIGEgbmV3IG9iamVjdCBjb25zaXN0aW5nIG9mIHRob3NlIHByb3BlcnRpZXMgd2l0aG91dCB0aGF0IHByZWZpeC5cbiAqIFVzZWZ1bCBmb3IgZmlsdGVyaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxldmFudCB0byBhIHBhcnRpY3VsYXIgcHVycG9zZS5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gUFxuICogQHRlbXBsYXRlIHtzdHJpbmd9IEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1JlY29yZDxgJHtQfSR7S31gLCBWPn0gb2JqXG4gKiBAcGFyYW0ge1B9IHByZWZpeFxuICovJGjNj19vbmNlLm1ha2VNZWFzdXJlU2Vjb25kcyhtYWtlTWVhc3VyZVNlY29uZHMpO1xuICAgICAgIGNvbnN0IHVucHJlZml4ZWRQcm9wZXJ0aWVzID0gKG9iaiwgcHJlZml4KSA9PlxuICAvKiogQHR5cGUge1JlY29yZDxLLCBWPn0gKi8gKFxuICAgIGZyb21UeXBlZEVudHJpZXMoXG4gICAgICB0eXBlZEVudHJpZXMob2JqKVxuICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4ga2V5LnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpLCB2YWx1ZV0pLFxuICAgIClcbiAgKTskaM2PX29uY2UudW5wcmVmaXhlZFByb3BlcnRpZXModW5wcmVmaXhlZFByb3BlcnRpZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVFJVRSI6WyJUUlVFIl0sInR5cGVkRW50cmllcyI6WyJ0eXBlZEVudHJpZXMiXSwiZnJvbVR5cGVkRW50cmllcyI6WyJmcm9tVHlwZWRFbnRyaWVzIl0sInR5cGVkTWFwIjpbInR5cGVkTWFwIl0sImxvZ0xldmVscyI6WyJsb2dMZXZlbHMiXSwiZGVlcENvcHlKc29uYWJsZSI6WyJkZWVwQ29weUpzb25hYmxlIl0sImRlZXBNYXBPYmplY3QiOlsiZGVlcE1hcE9iamVjdCJdLCJkZWZpbmVOYW1lIjpbImRlZmluZU5hbWUiXSwib2JqZWN0TWFwTXV0YWJsZSI6WyJvYmplY3RNYXBNdXRhYmxlIl0sInBhcnRpYWxNYXAiOlsicGFydGlhbE1hcCJdLCJwcm92aWRlTGF6eU1hcCI6WyJwcm92aWRlTGF6eU1hcCJdLCJtYWtlTWVhc3VyZVNlY29uZHMiOlsibWFrZU1lYXN1cmVTZWNvbmRzIl0sInVucHJlZml4ZWRQcm9wZXJ0aWVzIjpbInVucHJlZml4ZWRQcm9wZXJ0aWVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACL1UtWsBwAArAcAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMva2V5TWlycm9yLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJrZXlNaXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cblxuY29uc3QgeyBmcmVlemUsIGVudHJpZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ICYgUmVjb3JkPEV4Y2x1ZGU8UHJvcGVydHlLZXksIHN0cmluZz4sIG5ldmVyPn0gSW5pdFxuICogQHR5cGVkZWYge3sgcmVhZG9ubHkgW0sgaW4ga2V5b2YgSW5pdF06IEsgfX0gS2V5TWlycm9yUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBNaXJyb3IgdGhlIGtleXMgb2YgYW4gb2JqZWN0IHRvIHN0cmluZyB2YWx1ZXMgdGhhdCBtYXRjaCB0aGUga2V5IG5hbWVzLiBUaGlzXG4gKiB3b3JrcyB3ZWxsIHRvIGRlZmluZSBhIFR5cGVTY3JpcHQgZW51bSB0eXBlIGNvbXBhdGlibGUgd2l0aCBlcmFzYWJsZSBzeW50YXg6XG4gKlxuICogICAgYEBlbnVtIHsodHlwZW9mIE15RW51bSlba2V5b2YgdHlwZW9mIE15RW51bV19YFxuICpcbiAqIFRoZSBwcm92aWRlZCByZWNvcmQgbXVzdCBvbmx5IG1hcCBwcm9wZXJ0eSBuYW1lcyB0byBlaXRoZXIgYG51bGxgIG9yIHRoZVxuICogcHJvcGVydHkgbmFtZSBpdHNlbGYuIFRoZSByZXR1cm5lZCBvYmplY3QgaGFzIGlkZW50aWNhbCBrZXlzIHdob3NlIHZhbHVlcyBhcmVcbiAqIHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUga2V5LlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gJiBSZWNvcmQ8RXhjbHVkZTxQcm9wZXJ0eUtleSwgc3RyaW5nPiwgbmV2ZXI+fSBJbml0XG4gKiBAcGFyYW0ge0luaXQgJiB7IHJlYWRvbmx5IFtLIGluIGtleW9mIEluaXRdOiBJbml0W0tdIGV4dGVuZHMgbnVsbCA/IG51bGwgOiBLIH19IHJlY29yZFxuICogQHJldHVybnMge0tleU1pcnJvclJlc3VsdDxJbml0Pn1cbiAqL1xuICAgICAgIGNvbnN0IGtleU1pcnJvciA9IHJlY29yZCA9PiB7XG4gIGlmIChyZWNvcmQgPT09IG51bGwgfHwgdHlwZW9mIHJlY29yZCAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2tleU1pcnJvciBleHBlY3RzIGEgcmVjb3JkIG9mIHN0cmluZyBrZXlzLicpO1xuICB9XG5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBtaXJyb3JlZCA9IHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFJlY29yZCBjb25mdXNlZCBieSBudWxsIHByb3RvdHlwZSovXG4gICAgX19wcm90b19fOiBudWxsLFxuICB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKHJlY29yZCkpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IGtleSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKFxuICAgICAgICBgVmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiIG11c3QgYmUgbnVsbCBvciB0aGUga2V5IHN0cmluZzsgZ290ICR7U3RyaW5nKHZhbHVlKX0uYCxcbiAgICAgICk7XG4gICAgfVxuICAgIG1pcnJvcmVkW2tleV0gPSBrZXk7XG4gIH1cbiAgcmV0dXJuIC8qKiBAdHlwZSB7S2V5TWlycm9yUmVzdWx0PEluaXQ+fSAqLyAoZnJlZXplKG1pcnJvcmVkKSk7XG59OyRozY9fb25jZS5rZXlNaXJyb3Ioa2V5TWlycm9yKTtcblxuZnJlZXplKGtleU1pcnJvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJrZXlNaXJyb3IiOlsia2V5TWlycm9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKVsHvRVLQAAVS0AAC8AAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbGliLWNoYWluU3RvcmFnZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wYXR0ZXJucyIsIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanMiLCIuL2NhbGxiYWNrLmpzIl0sImV4cG9ydHMiOlsiU3RyZWFtQ2VsbFNoYXBlIiwiYXNzZXJ0UGF0aFNlZ21lbnQiLCJpc1N0cmVhbUNlbGwiLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCIsIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCIsInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxFLEZhcixNLG1ha2VIZWFwWm9uZSxjYjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanNcIiwgW1tcIm1ha2VIZWFwWm9uZVwiLFskaM2PX2EgPT4gKG1ha2VIZWFwWm9uZSA9ICRozY9fYSldXV1dLFtcIi4vY2FsbGJhY2suanNcIiwgW1tcIipcIixbJGjNj19hID0+IChjYiA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VDaGFpblN0b3JhZ2VSb290LCduYW1lJyx7dmFsdWU6XCJtYWtlQ2hhaW5TdG9yYWdlUm9vdFwifSk7JGjNj19vbmNlLm1ha2VDaGFpblN0b3JhZ2VSb290KG1ha2VDaGFpblN0b3JhZ2VSb290KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVN0b3JhZ2VOb2RlQ2hpbGQsJ25hbWUnLHt2YWx1ZTpcIm1ha2VTdG9yYWdlTm9kZUNoaWxkXCJ9KTskaM2PX29uY2UubWFrZVN0b3JhZ2VOb2RlQ2hpbGQobWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtNYXJzaGFsLCBQYXNzYWJsZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKiBAaW1wb3J0IHtSZW1vdGUsIEVSZW1vdGUsIFR5cGVkUGF0dGVybn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtFTWFyc2hhbGxlcn0gZnJvbSAnLi9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKiBAaW1wb3J0IHtDYWxsYmFja30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqIEB0eXBlZGVmIHtNYXJzaGFsPHVua25vd24+fSBNYXJzaGFsbGVyICovXG4vKiogQHR5cGVkZWYge1BpY2s8TWFyc2hhbGxlciwgJ2Zyb21DYXBEYXRhJz59IFVuc2VyaWFsaXplciAqL1xuXG4vKipcbiAqIERlZmluZWQgYnkgdnN0b3JhZ2VTdG9yZUtleSBpbiB2c3RvcmFnZS5nb1xuICpcbiAqIEB0eXBlZGVmIFZTdG9yYWdlS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVTdWJrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhUHJlZml4Qnl0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9EYXRhVmFsdWVdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIFN0cmVhbUNlbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBibG9ja0hlaWdodCBjb3JyZXNwb25kaW5nIHdpdGggdGhlIHdyaXRlIG9mIGB2YWx1ZXNgXG4gKiAgIChkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbmF0dXJhbCBudW1iZXIpXG4gKiBAcHJvcGVydHkge1RbXX0gdmFsdWVzXG4gKi9cblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48U3RyZWFtQ2VsbD59ICovXG4gICAgICAgY29uc3QgU3RyZWFtQ2VsbFNoYXBlID0gaGFyZGVuKHtcbiAgYmxvY2tIZWlnaHQ6IE0uc3RyaW5nKCksXG4gIHZhbHVlczogTS5hcnJheSgpLFxufSk7XG5cbi8qKlxuICogVGhpcyByZXByZXNlbnRzIGEgbm9kZSBpbiBhbiBJQVZMIHRyZWUuXG4gKlxuICogVGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB4L3ZzdG9yYWdlLCBhbiBBZ29yaWMgZXh0ZW5zaW9uIG9mIHRoZSBDb3Ntb3NcbiAqIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhc1xuICogICBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoXG4gKiAgIHN1YlBhdGg6IHN0cmluZyxcbiAqICAgb3B0aW9ucz86IHsgc2VxdWVuY2U/OiBib29sZWFuIH0sXG4gKiApID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi8kaM2PX29uY2UuU3RyZWFtQ2VsbFNoYXBlKFN0cmVhbUNlbGxTaGFwZSk7XG5cbmNvbnN0IENoYWluU3RvcmFnZU5vZGVJID0gTS5pbnRlcmZhY2UoJ1N0b3JhZ2VOb2RlJywge1xuICBzZXRWYWx1ZTogTS5jYWxsV2hlbihNLnN0cmluZygpKS5yZXR1cm5zKCksXG4gIGdldFBhdGg6IE0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG4gIGdldFN0b3JlS2V5OiBNLmNhbGxXaGVuKCkucmV0dXJucyhNLnJlY29yZCgpKSxcbiAgbWFrZUNoaWxkTm9kZTogTS5jYWxsKE0uc3RyaW5nKCkpXG4gICAgLm9wdGlvbmFsKE0uc3BsaXRSZWNvcmQoe30sIHsgc2VxdWVuY2U6IE0uYm9vbGVhbigpIH0sIHt9KSlcbiAgICAucmV0dXJucyhNLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKSksXG59KTtcblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGVyZmVjdCBoZXVyaXN0aWMgdG8gbmF2aWdhdGUgdGhlIG1pZ3JhdGlvbiBmcm9tIHZhbHVlIGNlbGxzIHRvXG4gKiBzdHJlYW0gY2VsbHMuIEF0IHRpbWUgb2Ygd3JpdGluZywgbm8gbGVnYWN5IGNlbGxzIGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgYVxuICogc3RyZWFtIGNlbGwsIGFuZCB3ZSBkbyBub3QgaW50ZW5kIHRvIGNyZWF0ZSBhbnkgbW9yZSBsZWdhY3kgdmFsdWUgY2VsbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IGNlbGxcbiAqIEByZXR1cm5zIHtjZWxsIGlzIFN0cmVhbUNlbGx9XG4gKi9cbiAgICAgICBjb25zdCBpc1N0cmVhbUNlbGwgPSBjZWxsID0+XG4gIGNlbGwgJiZcbiAgdHlwZW9mIGNlbGwgPT09ICdvYmplY3QnICYmXG4gIEFycmF5LmlzQXJyYXkoY2VsbC52YWx1ZXMpICYmXG4gIHR5cGVvZiBjZWxsLmJsb2NrSGVpZ2h0ID09PSAnc3RyaW5nJyAmJlxuICAvXjAkfF5bMS05XVswLTldKiQvLnRlc3QoY2VsbC5ibG9ja0hlaWdodCk7JGjNj19vbmNlLmlzU3RyZWFtQ2VsbChpc1N0cmVhbUNlbGwpO1xuaGFyZGVuKGlzU3RyZWFtQ2VsbCk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlXG4gKiAgIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGVcbiAqICAgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKiBUT0RPOiBGb3JtYWxpemUgc2VnbWVudCBjb25zdHJhaW50cy4qL1xuLyogTXVzdCBiZSBub25lbXB0eSBhbmQgZGlzYWxsb3cgKHVuZXNjYXBlZCkgYC5gLCBhbmQgZm9yIHNpbXBsaWNpdHkqL1xuLyogKGFuZCBmdXR1cmUgcG9zc2liaWxpdHkgb2YgZS5nLiBlc2NhcGluZykgd2UgY3VycmVudGx5IGxpbWl0IHRvKi9cbi8qIEFTQ0lJIGFscGhhbnVtZXJpYyBwbHVzIHVuZGVyc2NvcmUgYW5kIGRhc2guKi9cbi8qIFNob3VsZCByZW1haW4gY29uc2lzdGVudCB3aXRoIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS90eXBlcy9wYXRoX2tleXMuZ28qL1xuY29uc3QgcGF0aFNlZ21lbnRQYXR0ZXJuID0gL15bYS16QS1aMC05Xy1dezEsMTAwfSQvO1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcpID0+IHZvaWR9ICovXG4gICAgICAgY29uc3QgYXNzZXJ0UGF0aFNlZ21lbnQgPSBuYW1lID0+IHtcbiAgcGF0aFNlZ21lbnRQYXR0ZXJuLnRlc3QobmFtZSkgfHxcbiAgICBGYWlsYFBhdGggc2VnbWVudCBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgMSB0byAxMDAgY2hhcmFjdGVycyBsaW1pdGVkIHRvIEFTQ0lJIGFscGhhbnVtZXJpY3MsIHVuZGVyc2NvcmVzLCBhbmQvb3IgZGFzaGVzOiAke25hbWV9YDtcbn07JGjNj19vbmNlLmFzc2VydFBhdGhTZWdtZW50KGFzc2VydFBhdGhTZWdtZW50KTtcbmhhcmRlbihhc3NlcnRQYXRoU2VnbWVudCk7XG5cbi8qKlxuICogTXVzdCBtYXRjaCB0aGUgc3dpdGNoIGluIHZzdG9yYWdlLmdvIHVzaW5nIGB2c3RvcmFnZU1lc3NhZ2VgIHR5cGVcbiAqXG4gKiBAdHlwZWRlZiB7J2dldCdcbiAqICAgfCAnZ2V0U3RvcmVLZXknXG4gKiAgIHwgJ2hhcydcbiAqICAgfCAnY2hpbGRyZW4nXG4gKiAgIHwgJ2VudHJpZXMnXG4gKiAgIHwgJ3ZhbHVlcydcbiAqICAgfCAnc2l6ZSd9IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kXG4gKlxuICpcbiAqIEB0eXBlZGVmIHsnc2V0JyB8ICdzZXRXaXRob3V0Tm90aWZ5JyB8ICdhcHBlbmQnfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2RcbiAqXG4gKlxuICogQHR5cGVkZWYge1N0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kXG4gKiAgIHwgU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlTWV0aG9kfSBTdG9yYWdlTWVzc2FnZU1ldGhvZFxuICpcbiAqXG4gKiBAdHlwZWRlZiB7W3BhdGg6IHN0cmluZ119IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlQXJnc1xuICpcbiAqIEB0eXBlZGVmIHtbcGF0aDogc3RyaW5nLCB2YWx1ZT86IHN0cmluZyB8IG51bGxdfSBTdG9yYWdlRW50cnlcbiAqXG4gKiBAdHlwZWRlZiB7U3RvcmFnZUVudHJ5W119IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZUFyZ3NcbiAqXG4gKiBAdHlwZWRlZiB7e1xuICogICAgICAgbWV0aG9kOiBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZDtcbiAqICAgICAgIGFyZ3M6IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlQXJncztcbiAqICAgICB9XG4gKiAgIHwge1xuICogICAgICAgbWV0aG9kOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2Q7XG4gKiAgICAgICBhcmdzOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VBcmdzO1xuICogICAgIH19IFN0b3JhZ2VNZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1pvbmV9IHpvbmVcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlID0gem9uZSA9PiB7XG4gIC8qKlxuICogQ3JlYXRlIGEgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgc3RvcmFnZSBpbnRlcmZhY2UgYW5kIHBhdGguXG4gKlxuICogQHBhcmFtIHtDYWxsYmFjazwobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueT59IG1lc3NlbmdlciBhIGNhbGxiYWNrXG4gKiAgIGZvciBzZW5kaW5nIGEgc3RvcmFnZU1lc3NhZ2Ugb2JqZWN0IHRvIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9uIChjZi5cbiAqICAgZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VxdWVuY2VdIHNldCB2YWx1ZXMgd2l0aCBgYXBwZW5kYCBtZXNzYWdlc1xuICogICByYXRoZXIgdGhhbiBgc2V0YCBtZXNzYWdlcyBzbyB0aGUgYmFja2luZyBpbXBsZW1lbnRhdGlvbiBlbXBsb3lzIGFcbiAqICAgd3JhcHBpbmcgc3RydWN0dXJlIHRoYXQgcHJlc2VydmVzIGVhY2ggdmFsdWUgc2V0IHdpdGhpbiBhIHNpbmdsZSBibG9jay5cbiAqICAgQ2hpbGQgbm9kZXMgZGVmYXVsdCB0byBpbmhlcml0aW5nIHRoaXMgb3B0aW9uIGZyb20gdGhlaXIgcGFyZW50LlxuICogQHJldHVybnMge1N0b3JhZ2VOb2RlfVxuICovXG4gIGNvbnN0IG1ha2VDaGFpblN0b3JhZ2VOb2RlID0gem9uZS5leG9DbGFzcyhcbiAgICAnQ2hhaW5TdG9yYWdlTm9kZScsXG4gICAgQ2hhaW5TdG9yYWdlTm9kZUksXG4gICAgLyoqXG4gKiBAcGFyYW0ge0NhbGxiYWNrPChtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55Pn0gbWVzc2VuZ2VyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW5jZV1cbiAqL1xuICAgIChtZXNzZW5nZXIsIHBhdGgsIHsgc2VxdWVuY2UgPSBmYWxzZSB9ID0ge30pID0+IHtcbiAgICAgIGFzc2VydC50eXBlb2YocGF0aCwgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0LnR5cGVvZihzZXF1ZW5jZSwgJ2Jvb2xlYW4nKTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBwYXRoLCBtZXNzZW5nZXIsIHNlcXVlbmNlIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgZ2V0UGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucGF0aDtcbiAgICAgIH0sXG4gICAgICAvKipcbiAqIEBkZXByZWNhdGVkIHVzZSBnZXRQYXRoXG4gKiBAdHlwZSB7KCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleT59XG4gKi9cbiAgICAgIGFzeW5jIGdldFN0b3JlS2V5KCkge1xuICAgICAgICBjb25zdCB7IHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgcmV0dXJuIGNiLmNhbGxFKG1lc3Nlbmdlciwge1xuICAgICAgICAgIG1ldGhvZDogJ2dldFN0b3JlS2V5JyxcbiAgICAgICAgICBhcmdzOiBbcGF0aF0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICogQHR5cGUgeyhcbiAqICAgbmFtZTogc3RyaW5nLFxuICogICBjaGlsZE5vZGVPcHRpb25zPzogeyBzZXF1ZW5jZT86IGJvb2xlYW4gfSxcbiAqICkgPT4gU3RvcmFnZU5vZGV9XG4gKi9cbiAgICAgIG1ha2VDaGlsZE5vZGUobmFtZSwgY2hpbGROb2RlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc2VxdWVuY2UsIHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgYXNzZXJ0UGF0aFNlZ21lbnQobmFtZSk7XG4gICAgICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IHNlcXVlbmNlLCAuLi5jaGlsZE5vZGVPcHRpb25zIH07XG4gICAgICAgIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZShcbiAgICAgICAgICBtZXNzZW5nZXIsXG4gICAgICAgICAgYCR7cGF0aH0uJHtuYW1lfWAsXG4gICAgICAgICAgbWVyZ2VkT3B0aW9ucyxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICAvKiogQHR5cGUgeyh2YWx1ZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSAqL1xuICAgICAgYXN5bmMgc2V0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBzZXF1ZW5jZSwgcGF0aCwgbWVzc2VuZ2VyIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBhc3NlcnQudHlwZW9mKHZhbHVlLCAnc3RyaW5nJyk7XG4gICAgICAgIC8qKiBAdHlwZSB7U3RvcmFnZUVudHJ5fSAqL1xuICAgICAgICBsZXQgZW50cnk7XG4gICAgICAgIGlmICghc2VxdWVuY2UgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgZW50cnkgPSBbcGF0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW50cnkgPSBbcGF0aCwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNiLmNhbGxFKG1lc3Nlbmdlciwge1xuICAgICAgICAgIG1ldGhvZDogc2VxdWVuY2UgPyAnYXBwZW5kJyA6ICdzZXQnLFxuICAgICAgICAgIGFyZ3M6IFtlbnRyeV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLyogUG9zc2libGUgZXh0ZW5zaW9uczoqL1xuICAgICAgLyogKiBnZXRWYWx1ZSgpKi9cbiAgICAgIC8qICogZ2V0Q2hpbGROYW1lcygpIGFuZC9vciBtYWtlQ2hpbGROb2RlcygpKi9cbiAgICAgIC8qICogZ2V0TmFtZSgpKi9cbiAgICAgIC8qICogcmVjdXJzaXZlIGRlbGV0ZSovXG4gICAgICAvKiAqIGJhdGNoIG9wZXJhdGlvbnMqL1xuICAgICAgLyogKiBsb2NhbCBidWZmZXJpbmcgKHdpdGggZW5kLW9mLWJsb2NrIGNvbW1pdCkqL1xuICAgIH0sXG4gICk7XG4gIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZTtcbn07JGjNj19vbmNlLnByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKTtcblxuY29uc3QgbWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlID0gcHJlcGFyZUNoYWluU3RvcmFnZU5vZGUobWFrZUhlYXBab25lKCkpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGhlYXAtYmFzZWQgcm9vdCBzdG9yYWdlIG5vZGUgZm9yIGEgZ2l2ZW4gYmFja2luZyBmdW5jdGlvbiBhbmQgcm9vdFxuICogcGF0aC5cbiAqXG4gKiBAcGFyYW0geyhtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55fSBoYW5kbGVTdG9yYWdlTWVzc2FnZSBhIGZ1bmN0aW9uIGZvclxuICogICBzZW5kaW5nIGEgc3RvcmFnZU1lc3NhZ2Ugb2JqZWN0IHRvIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9uIChjZi5cbiAqICAgZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoXG4gKiBAcGFyYW0ge29iamVjdH0gW3Jvb3RPcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbcm9vdE9wdGlvbnMuc2VxdWVuY2VdIGVtcGxveSBhIHdyYXBwaW5nIHN0cnVjdHVyZSB0aGF0XG4gKiAgIHByZXNlcnZlcyBlYWNoIHZhbHVlIHNldCB3aXRoaW4gYSBzaW5nbGUgYmxvY2ssIGFuZCBkZWZhdWx0IGNoaWxkIG5vZGVzIHRvXG4gKiAgIGRvIHRoZSBzYW1lXG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbiAgaGFuZGxlU3RvcmFnZU1lc3NhZ2UsXG4gIHJvb3RQYXRoLFxuICByb290T3B0aW9ucyA9IHt9LFxuKSB7XG4gIGNvbnN0IG1lc3NlbmdlciA9IGNiLm1ha2VGdW5jdGlvbkNhbGxiYWNrKGhhbmRsZVN0b3JhZ2VNZXNzYWdlKTtcblxuICAvKiBVc2UgdGhlIGhlYXBab25lIGRpcmVjdGx5LiovXG4gIGNvbnN0IHJvb3ROb2RlID0gbWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlKG1lc3Nlbmdlciwgcm9vdFBhdGgsIHJvb3RPcHRpb25zKTtcbiAgcmV0dXJuIHJvb3ROb2RlO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHtTdG9yYWdlTm9kZX0gYW4gb2JqZWN0IHRoYXQgY29uZmlybXMgdG8gU3RvcmFnZU5vZGUgQVBJIGJ1dCBkb2VzXG4gKiAgIG5vdCBzdG9yZSBhbnl3aGVyZS5cbiAqL1xuY29uc3QgbWFrZU51bGxTdG9yYWdlTm9kZSA9ICgpID0+IHtcbiAgLyogWFhYIHJlLXVzZSBcIkNoYWluU3RvcmFnZVwiIG1ldGhvZHMgYWJvdmUgd2hpY2ggZG9uJ3QgYWN0dWFsbHkgZGVwZW5kIG9uIGNoYWlucyovXG4gIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbiAgICBGYXIoJ051bGxNZXNzZW5nZXInLCAoKSA9PiBudWxsKSxcbiAgICAnbnVsbCcsXG4gICk7XG59O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciByZXR1cm5pbmcgYSBzdG9yYWdlIG5vZGUgYXQgb3IgdW5kZXIgaXRzIGlucHV0LFxuICogZmFsbGluZyBiYWNrIHRvIGFuIGluZXJ0IG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0IGludGVyZmFjZSAoYnV0IGluY29tcGxldGVcbiAqIGJlaGF2aW9yKSB3aGVuIHRoYXQgaXMgdW5hdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtFUmVmPFJlbW90ZTxTdG9yYWdlTm9kZT4gfCBudWxsPn0gc3RvcmFnZU5vZGVSZWZcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGlsZE5hbWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlbW90ZTxTdG9yYWdlTm9kZT4+fVxuICovXG4gICAgICAgYXN5bmMgZnVuY3Rpb24gbWFrZVN0b3JhZ2VOb2RlQ2hpbGQoc3RvcmFnZU5vZGVSZWYsIGNoaWxkTmFtZSkge1xuICBjb25zdCBleGlzdGluZ1N0b3JhZ2VOb2RlID0gYXdhaXQgc3RvcmFnZU5vZGVSZWY7XG4gIGNvbnN0IHN0b3JhZ2VOb2RlID0gZXhpc3RpbmdTdG9yYWdlTm9kZSB8fCBtYWtlTnVsbFN0b3JhZ2VOb2RlKCk7XG4gIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkTmFtZSk7XG59XG5oYXJkZW4obWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG4vKiBUT0RPIGZpbmQgYSBiZXR0ZXIgbW9kdWxlIGZvciB0aGlzKi9cbi8qKlxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHsodmFsdWU6IFBhc3NhYmxlKSA9PiBQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICByZXR1cm4gYXN5bmMgdmFsdWUgPT4ge1xuICAgIGNvbnN0IG1hcnNoYWxsZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KG1hcnNoYWxsZWQpO1xuICAgIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkKTtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTdHJlYW1DZWxsU2hhcGUiOlsiU3RyZWFtQ2VsbFNoYXBlIl0sImlzU3RyZWFtQ2VsbCI6WyJpc1N0cmVhbUNlbGwiXSwiYXNzZXJ0UGF0aFNlZ21lbnQiOlsiYXNzZXJ0UGF0aFNlZ21lbnQiXSwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiOlsicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwibWFrZUNoYWluU3RvcmFnZVJvb3QiOlsibWFrZUNoYWluU3RvcmFnZVJvb3QiXSwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiOlsibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiXSwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSI6WyJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACNFcvqnAwAApwMAADcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC9pbmFjY2Vzc2libGUtdmFsLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VJbmFjY2Vzc2libGVWYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7XG5cblxuY29uc3QgaWZhY2VBbGxlZ2VkUHJlZml4ID0gJ0FsbGVnZWQ6ICc7XG5jb25zdCBpZmFjZUluYWNjZXNzaWJsZVByZWZpeCA9ICdTRVZFUkVEOiAnO1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gaWZhY2VcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlSW5hY2Nlc3NpYmxlVmFsID0gaWZhY2UgPT4ge1xuICBpZiAodHlwZW9mIGlmYWNlID09PSAnc3RyaW5nJyAmJiBpZmFjZS5zdGFydHNXaXRoKGlmYWNlQWxsZWdlZFByZWZpeCkpIHtcbiAgICBpZmFjZSA9IGlmYWNlLnNsaWNlKGlmYWNlQWxsZWdlZFByZWZpeC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBGYXIoYCR7aWZhY2VJbmFjY2Vzc2libGVQcmVmaXh9JHtpZmFjZX1gLCB7fSk7XG59OyRozY9fb25jZS5tYWtlSW5hY2Nlc3NpYmxlVmFsKG1ha2VJbmFjY2Vzc2libGVWYWwpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUluYWNjZXNzaWJsZVZhbCI6WyJtYWtlSW5hY2Nlc3NpYmxlVmFsIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKSDz56xAwAAsQMAADAAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC9wdXJlLWRhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbInB1cmVEYXRhTWFyc2hhbGxlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NhcERhdGF9IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICovXG5cbi8qKiBAcGFyYW0ge0NhcERhdGE8dW5rbm93bj59IGNhcCAqL1xuY29uc3QgcmVqZWN0T0NhcCA9IGNhcCA9PiBGYWlsYCR7Y2FwfSBpcyBub3QgcHVyZSBkYXRhYDtcbiAgICAgICBjb25zdCBwdXJlRGF0YU1hcnNoYWxsZXIgPSBtYWtlTWFyc2hhbChyZWplY3RPQ2FwLCByZWplY3RPQ2FwLCB7XG4gIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnLFxufSk7JGjNj19vbmNlLnB1cmVEYXRhTWFyc2hhbGxlcihwdXJlRGF0YU1hcnNoYWxsZXIpO1xuaGFyZGVuKHB1cmVEYXRhTWFyc2hhbGxlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwdXJlRGF0YU1hcnNoYWxsZXIiOlsicHVyZURhdGFNYXJzaGFsbGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANZdM97lPAAA5TwAADYAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vY2FjaGUtbWFwIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL2ZhciIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiLi9pbmFjY2Vzc2libGUtdmFsLmpzIl0sImV4cG9ydHMiOlsid3JhcFJlbW90ZU1hcnNoYWxsZXIiLCJ3cmFwUmVtb3RlTWFyc2hhbGxlckRpcmVjdFNlbmQiLCJ3cmFwUmVtb3RlTWFyc2hhbGxlclNlbmRTbG90c09ubHkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlQ2FjaGVNYXBLaXQsRmFpbCxxLEUsRmFyLFBBU1NfU1RZTEUsbWFrZU1hcnNoYWwsbWFrZUluYWNjZXNzaWJsZVZhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2NhY2hlLW1hcFwiLCBbW1wibWFrZUNhY2hlTWFwS2l0XCIsWyRozY9fYSA9PiAobWFrZUNhY2hlTWFwS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXSxbXCIuL2luYWNjZXNzaWJsZS12YWwuanNcIiwgW1tcIm1ha2VJbmFjY2Vzc2libGVWYWxcIixbJGjNj19hID0+IChtYWtlSW5hY2Nlc3NpYmxlVmFsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1dlYWtNYXBBUEl9IGZyb20gJ0BlbmRvL2NhY2hlLW1hcCc7XG4gKiBAaW1wb3J0IHtFT25seX0gZnJvbSAnQGVuZG8vZXZlbnR1YWwtc2VuZCc7XG4gKiBAaW1wb3J0IHtQYXNzU3R5bGVkLCBTaW1wbGlmeX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtDYXBEYXRhLCBQYXNzYWJsZSwgTWFyc2hhbCwgTWFrZU1hcnNoYWxPcHRpb25zfSBmcm9tICdAZW5kby9tYXJzaGFsJztcbiAqIEBpbXBvcnQge0VSZW1vdGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEEgTWFyc2hhbGxlciB3aGljaCBtZXRob2RzIG1heSBiZSBhc3luYy4gVXNlIHRoaXMgdHlwZSB0byBpbmRpY2F0ZSBhY2NlcHRpbmdcbiAqIGVpdGhlciBhIHN5bmMgb3IgYXN5bmMgbWFyc2hhbGxlciwgdXN1YWxseSB0aHJvdWdoIGBFYCBldmVudHVhbC1zZW5kcy5cbiAqXG4gKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIHtTaW1wbGlmeTxFT25seTxNYXJzaGFsPFNsb3Q+Pj59IEVNYXJzaGFsbGVyXG4gKi9cblxuLyoqIEB0eXBlZGVmIHsnUmVtb3RhYmxlJyB8IGBBbGxlZ2VkOiAke3N0cmluZ31gfSBJbnRlcmZhY2VTcGVjICovXG5cbi8qKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl0gKi9cbmNsYXNzIFNsb3RXcmFwcGVyIHtcbiAgLyoqIEB0eXBlIHtTbG90fSAqL1xuICAjc2xvdDtcblxuICAvKiogQHR5cGUge0ludGVyZmFjZVNwZWN9ICovXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddID0gJ0FsbGVnZWQ6IFNsb3RXcmFwcGVyJztcblxuICAvKipcbiAqIEBwYXJhbSB7U2xvdH0gc2xvdFxuICogQHBhcmFtIHtzdHJpbmd9IFtpZmFjZV1cbiAqL1xuICBjb25zdHJ1Y3RvcihzbG90LCBpZmFjZSkge1xuICAgIGlmIChpZmFjZSA9PSBudWxsIHx8IGlmYWNlID09PSAnUmVtb3RhYmxlJykge1xuICAgICAgaWZhY2UgPSAnUmVtb3RhYmxlJztcbiAgICB9IGVsc2UgaWYgKCFpZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKSkge1xuICAgICAgaWZhY2UgPSBgQWxsZWdlZDogJHtpZmFjZX1gO1xuICAgIH1cbiAgICB0aGlzLiNzbG90ID0gc2xvdDtcbiAgICB0aGlzW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAvKiogQHR5cGUge0ludGVyZmFjZVNwZWN9ICovIChpZmFjZSk7XG4gIH1cblxuICAvKipcbiAqIEB0ZW1wbGF0ZSBbU2xvdD11bmtub3duXVxuICogQHBhcmFtIHtTbG90V3JhcHBlcjxTbG90Pn0gd3JhcHBlclxuICogQHJldHVybnMge1Nsb3R9XG4gKi9cbiAgc3RhdGljIGdldFNsb3Qod3JhcHBlcikge1xuICAgIHJldHVybiB3cmFwcGVyLiNzbG90O1xuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhTbG90V3JhcHBlci5wcm90b3R5cGUsIHtcbiAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAncmVtb3RhYmxlJyB9LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogeyB2YWx1ZTogJ0FsbGVnZWQ6IFNsb3RXcmFwcGVyJyB9LFxufSk7XG5SZWZsZWN0LmRlbGV0ZVByb3BlcnR5KFNsb3RXcmFwcGVyLnByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJyk7XG5oYXJkZW4oU2xvdFdyYXBwZXIpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbU2xvdD11bmtub3duXVxuICogQHR5cGVkZWYge1Nsb3RXcmFwcGVyPFNsb3Q+ICYgUGFzc1N0eWxlZDwncmVtb3RhYmxlJywgSW50ZXJmYWNlU3BlYz59IFJlbW90YWJsZVNsb3RXcmFwcGVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7U2xvdH0gc2xvdFxuICogQHBhcmFtIHtzdHJpbmd9IFtpZmFjZV1cbiAqL1xuY29uc3Qgc2xvdFRvV3JhcHBlciA9IChzbG90LCBpZmFjZSkgPT5cbiAgLyoqIEB0eXBlIHtSZW1vdGFibGVTbG90V3JhcHBlcjxTbG90Pn0gKi8gKFxuICAgIGhhcmRlbihuZXcgU2xvdFdyYXBwZXIoc2xvdCwgaWZhY2UpKVxuICApO1xuXG5jb25zdCB3cmFwcGVyVG9TbG90ID0gU2xvdFdyYXBwZXIuZ2V0U2xvdDtcblxuY29uc3QgY2FwYWNpdHlPZkRlZmF1bHRDYWNoZSA9IDUwO1xuXG4vKiBUT0RPKGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMTIxMTEpKi9cbi8qIENoZWNrIGNvc3Qgb2YgdXNpbmcgdmlydHVhbC1hd2FyZSBXZWFrTWFwIGluIGxpdmVzbG90cyovXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtib29sZWFufSBbd2Vha0tleV1cbiAqL1xuY29uc3QgbWFrZURlZmF1bHRDYWNoZU1hcCA9IHdlYWtLZXkgPT5cbiAgLyoqIEB0eXBlIHtXZWFrTWFwQVBJPEssIFY+fSAqLyAoXG4gICAgbWFrZUNhY2hlTWFwS2l0KGNhcGFjaXR5T2ZEZWZhdWx0Q2FjaGUsIHtcbiAgICAgIG1ha2VNYXA6IHdlYWtLZXkgPyBXZWFrTWFwIDogTWFwLFxuICAgIH0pLmNhY2hlXG4gICk7XG5cbi8qKlxuICogV3JhcHMgYSBtYXJzaGFsbGVyLCBlaXRoZXIgc3luYyBvciBhc3luYywgbG9jYWwgb3IgcmVtb3RlLCBpbnRvIGEgbG9jYWwgYXN5bmNcbiAqIG1hcnNoYWxsZXIgd2hpY2ggb25seSBzZW5kcyBzbG90cyBmb3IgcmVzb2x1dGlvbiB0byB0aGUgd3JhcHBlZCBtYXJzaGFsbGVyLlxuICogT3B0aW9uYWxseSBhbmQgYnkgZGVmYXVsdCwgY2FjaGVzIHRoZSByZXNvbHV0aW9uIG9mIHNsb3RzLlxuICpcbiAqIEFzc3VtZXMgdGhhdCBhIG51bGwtaXNoIHNsb3QgdmFsdWUgaXMgYSBzZXZlcmVkIHByZXNlbmNlIHRoYXQgY2FuIGJlIHJlc29sdmVkXG4gKiBsb2NhbGx5LiBCeSBkZWZhdWx0IGlmIGEgcHJlc2VuY2UgaXMgbWFwcGVkIHRvIGEgbnVsbC1pc2ggc2xvdCBieSB0aGUgd3JhcHBlZFxuICogbWFyc2hhbGxlciwgdGhhdCBtYXBwaW5nIGlzIG5vdCBjYWNoZWQsIGFsbG93aW5nIHRoZSB3cmFwcGVkIG1hcnNoYWxsZXIgdG9cbiAqIGNyZWF0ZSBhIG1hcHBpbmcgaW4gdGhlIGZ1dHVyZS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlbW90ZTxQaWNrPEVNYXJzaGFsbGVyPFNsb3Q+LCAnZnJvbUNhcERhdGEnIHwgJ3RvQ2FwRGF0YSc+Pn0gbWFyc2hhbGxlclxuICogQHBhcmFtIHtNYWtlTWFyc2hhbE9wdGlvbnN9IFttYXJzaGFsT3B0aW9uc11cbiAqIEBwYXJhbSB7b2JqZWN0fSBbY2FjaGVzXVxuICogQHBhcmFtIHtXZWFrTWFwQVBJPG9iamVjdCwgU2xvdD4gfCBudWxsfSBbY2FjaGVzLnZhbFRvU2xvdF1cbiAqIEBwYXJhbSB7V2Vha01hcEFQSTxTbG90LCBvYmplY3Q+IHwgbnVsbH0gW2NhY2hlcy5zbG90VG9WYWxdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjYWNoZXMuY2FjaGVTZXZlcmVkVmFsXVxuICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEZhcjxFTWFyc2hhbGxlcjxTbG90Pj4+fVxuICovXG4gICAgICAgY29uc3Qgd3JhcFJlbW90ZU1hcnNoYWxsZXJTZW5kU2xvdHNPbmx5ID0gKFxuICBtYXJzaGFsbGVyLFxuICB7XG4gICAgc2VyaWFsaXplQm9keUZvcm1hdCA9ICdzbWFsbGNhcHMnLFxuICAgIGVycm9yVGFnZ2luZyA9ICdvZmYnLCAvKiBEaXNhYmxlIGVycm9yIHRhZ2dpbmcgYnkgZGVmYXVsdCovXG4gICAgLi4ub3RoZXJNYXJzaGFsT3B0aW9uc1xuICB9ID0ge30sXG4gIHtcbiAgICB2YWxUb1Nsb3QgPSBtYWtlRGVmYXVsdENhY2hlTWFwKHRydWUpLFxuICAgIHNsb3RUb1ZhbCA9IG1ha2VEZWZhdWx0Q2FjaGVNYXAoZmFsc2UpLFxuICAgIGNhY2hlU2V2ZXJlZFZhbCA9IGZhbHNlLFxuICB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgbWFyc2hhbE9wdGlvbnMgPSBoYXJkZW4oe1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQsXG4gICAgZXJyb3JUYWdnaW5nLFxuICAgIC4uLm90aGVyTWFyc2hhbE9wdGlvbnMsXG4gIH0pO1xuICAvKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyB3cmFwcGVkIG1hcnNoYWxsZXIgaW50ZXJuYWxseSB1c2VzIDIgbWFyc2hhbGxlcnMqL1xuICAvKiB0byB0cmFuc2Zvcm0gdGhlIENhcERhdGEgaW50byBhIFBhc3NhYmxlIHN0cnVjdHVyZSBhbmQgdmljZS12ZXJzYToqL1xuICAvKiAtIEEgY2FwIHBhc3MtdGhyb3VnaCBtYXJzaGFsbGVyIHdoaWNoIHBsYWNlcyBjYXBhYmlsaXRpZXMgYXMtaXMgaW4gdGhlIHNsb3RzLiovXG4gIC8qIFdoZW4gdW5zZXJpYWxpemluZyBDYXBEYXRhIHdpdGggbnVsbC1pc2ggc2xvdHMsIGEgc2V2ZXJlZCBwcmVzZW5jZSBpcyBjcmVhdGVkLiovXG4gIC8qIFRoaXMgcGFzcy10aHJvdWdoIG1hcnNoYWxsZXIgaXMgdXNlZCB0byBsb2NhbGx5IHByb2Nlc3MgdGhlIHN0cnVjdHVyZSwgYW5kKi9cbiAgLyogc2VwYXJhdGUgY2FwYWJpbGl0aWVzIGludG8gYSBzbG90cyBhcnJheSBmb3IgcG90ZW50aWFsIHJlc29sdXRpb24gYnkgdGhlKi9cbiAgLyogd3JhcHBlZCBtYXJzaGFsbGVyLiovXG4gIC8qIC0gQSBcIlNsb3RXcmFwcGVyXCIgbWFyc2hhbGxlciB1c2VkIHRvIHdyYXAgaW50byByZW1vdGFibGVzIHRoZSBzbG90cyBvZiB0aGUqL1xuICAvKiB3cmFwcGVkIG1hcnNoYWxsZXIuIFdoZW4gdW5zZXJpYWxpemluZyBDYXBEYXRhLCBpdCBpcyB1c2VkIHRvIHJlY3JlYXRlKi9cbiAgLyogQ2FwRGF0YSBvZiBhIHNpbXBsZSBhcnJheSBvZiBub24tc2V2ZXJlZCBjYXBhYmlsaXRpZXMgZm9yIHJlc29sdXRpb24gYnkqL1xuICAvKiB0aGUgd3JhcHBlZCBtYXJzaGFsbGVyLiBXaGVuIHNlcmlhbGl6aW5nIHRvIENhcERhdGEsIGl0IGFsbG93cyBleHRyYWN0aW5nKi9cbiAgLyogdGhlIHNsb3RzIGZyb20gdGhlIGNhcGFiaWxpdGllcyBhcnJheSBzZXJpYWxpemVkIGJ5IHRoZSB3cmFwcGVkIG1hcnNoYWxsZXIuKi9cblxuICAvKiogQHR5cGUge01hcnNoYWw8b2JqZWN0IHwgbnVsbD59ICovXG4gIGNvbnN0IHBhc3NUaHJvdWdoTWFyc2hhbGxlciA9IG1ha2VNYXJzaGFsKFxuICAgIHVuZGVmaW5lZCxcbiAgICAoc2xvdCwgaWZhY2UpID0+IHNsb3QgPz8gbWFrZUluYWNjZXNzaWJsZVZhbChpZmFjZSksXG4gICAgbWFyc2hhbE9wdGlvbnMsXG4gICk7XG5cbiAgLyoqIEB0eXBlIHtNYXA8U2xvdCwgUmVtb3RhYmxlU2xvdFdyYXBwZXI8Tm9uTnVsbGFibGU8U2xvdD4+Pn0gKi9cbiAgY29uc3QgY3VycmVudFNsb3RUb1dyYXBwZXIgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3QgY29udmVydFdyYXBwZXJUb1Nsb3QgPSAvKiogQHR5cGUge3R5cGVvZiB3cmFwcGVyVG9TbG90PFNsb3Q+fSAqLyAoXG4gICAgd3JhcHBlclRvU2xvdFxuICApO1xuICAvKipcbiAqIEBwYXJhbSB7U2xvdH0gc2xvdFxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IFtpZmFjZV1cbiAqL1xuICBjb25zdCBjb252ZXJ0U2xvdFRvV3JhcHBlciA9IChzbG90LCBpZmFjZSkgPT4ge1xuICAgIGlmIChzbG90ID09IG51bGwpIHtcbiAgICAgIC8qIFRoZSB3cmFwcGVkIG1hcnNoYWxsZXIgbWF5IHNlbmQgdXMgQ2FwRGF0YSB3aXRoIGEgbnVsbCBzbG90LiBUaGVzZSBhcmUgbm90Ki9cbiAgICAgIC8qIG1lYW50IHRvIGJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCB3aXRoIGVhY2ggb3RoZXIsIHNvIGJ5cGFzcyBtYXBwaW5nLiovXG4gICAgICByZXR1cm4gc2xvdFRvV3JhcHBlcihzbG90LCBpZmFjZSk7XG4gICAgfVxuICAgIGxldCB3cmFwcGVyID0gY3VycmVudFNsb3RUb1dyYXBwZXIuZ2V0KHNsb3QpO1xuICAgIGlmICghd3JhcHBlcikge1xuICAgICAgd3JhcHBlciA9IHNsb3RUb1dyYXBwZXIoc2xvdCwgaWZhY2UpO1xuICAgICAgY3VycmVudFNsb3RUb1dyYXBwZXIuc2V0KHNsb3QsIHdyYXBwZXIpO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwcGVyO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7UGljazxNYXJzaGFsPFNsb3Q+LCAndG9DYXBEYXRhJyB8ICdmcm9tQ2FwRGF0YSc+fSAqL1xuICBjb25zdCBzbG90V3JhcHBlck1hcnNoYWxsZXIgPSBtYWtlTWFyc2hhbChcbiAgICBjb252ZXJ0V3JhcHBlclRvU2xvdCxcbiAgICBjb252ZXJ0U2xvdFRvV3JhcHBlcixcbiAgICBtYXJzaGFsT3B0aW9ucyxcbiAgKTtcblxuICAvKipcbiAqIFJlc29sdmVzIGFuIGFycmF5IG9mIHdyYXBwZWQgbWFyc2hhbGxlcidzIHNsb3RzIHRvIGFuIGFycmF5IG9mXG4gKiBjYXBhYmlsaXRpZXMuXG4gKlxuICogVGhpcyBpcyB1c2VkIGJ5IGBmcm9tQ2FwRGF0YWAgdG8gbWFwIHNsb3RzIGJlZm9yZSB1c2luZyB0aGUgcGFzcy10aHJvdWdoXG4gKiBtYXJzaGFsbGVyIHRvIHJlY3JlYXRlIHRoZSBwYXNzYWJsZSBkYXRhLlxuICpcbiAqIEBwYXJhbSB7U2xvdFtdfSBzbG90c1xuICogQHBhcmFtIHsoaW5kZXg6IG51bWJlcikgPT4gUmVtb3RhYmxlU2xvdFdyYXBwZXI8Tm9uTnVsbGFibGU8U2xvdD4+fSBnZXRXcmFwcGVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTwob2JqZWN0IHwgbnVsbClbXT59XG4gKi9cbiAgY29uc3QgbWFwU2xvdHNUb0NhcHMgPSBhc3luYyAoc2xvdHMsIGdldFdyYXBwZXIpID0+IHtcbiAgICBsZXQgaGFzUmVtb3RlQ2FwID0gZmFsc2U7XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IHNsb3RzO1xuICAgIC8qKiBAdHlwZSB7KFJlbW90YWJsZVNsb3RXcmFwcGVyPE5vbk51bGxhYmxlPFNsb3Q+PiB8IG51bGwgfCB1bmRlZmluZWQpW119ICovXG4gICAgY29uc3Qgc2xvdFdyYXBwZXJNYXBwZWRTbG90cyA9IEFycmF5LmZyb20oeyBsZW5ndGggfSk7XG4gICAgLyoqIEB0eXBlIHsob2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZClbXX0gKi9cbiAgICBjb25zdCBsb2NhbGx5UmVzb2x2ZWRDYXBTbG90cyA9IEFycmF5LmZyb20oeyBsZW5ndGggfSk7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgc2xvdF0gb2Ygc2xvdHMuZW50cmllcygpKSB7XG4gICAgICBpZiAoc2xvdCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBudWxsU2xvdCA9IC8qKiBAdHlwZSB7bnVsbH0gKi8gKHNsb3QpO1xuICAgICAgICBzbG90V3JhcHBlck1hcHBlZFNsb3RzW2luZGV4XSA9IG51bGxTbG90O1xuICAgICAgICBsb2NhbGx5UmVzb2x2ZWRDYXBTbG90c1tpbmRleF0gPSBudWxsU2xvdDtcbiAgICAgIH0gZWxzZSBpZiAoc2xvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGNhY2hlZENhcCA9IHNsb3RUb1ZhbD8uZ2V0KHNsb3QpO1xuICAgICAgICBpZiAoY2FjaGVkQ2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YWxUb1Nsb3Q/LnNldChjYWNoZWRDYXAsIHNsb3QpO1xuICAgICAgICAgIGxvY2FsbHlSZXNvbHZlZENhcFNsb3RzW2luZGV4XSA9IGNhY2hlZENhcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYXNSZW1vdGVDYXAgPSB0cnVlO1xuICAgICAgICAgIHNsb3RXcmFwcGVyTWFwcGVkU2xvdHNbaW5kZXhdID0gZ2V0V3JhcHBlcihpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBudWxsO1xuICAgIGlmIChoYXNSZW1vdGVDYXApIHtcbiAgICAgIGhhcmRlbihzbG90V3JhcHBlck1hcHBlZFNsb3RzKTtcbiAgICAgIGNvbnN0IHNsb3RzT25seUNhcERhdGEgPSBzbG90V3JhcHBlck1hcnNoYWxsZXIudG9DYXBEYXRhKFxuICAgICAgICBzbG90V3JhcHBlck1hcHBlZFNsb3RzLFxuICAgICAgKTtcblxuICAgICAgLyoqIEB0eXBlIHsob2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZClbXX0gKi9cbiAgICAgIGNvbnN0IHJlbW90ZWx5UmVzb2x2ZWRDYXBTbG90cyA9XG4gICAgICAgIGF3YWl0IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoc2xvdHNPbmx5Q2FwRGF0YSk7XG5cbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCB2YWxdIG9mIHJlbW90ZWx5UmVzb2x2ZWRDYXBTbG90cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzW2luZGV4XTtcbiAgICAgICAgICBzbG90VG9WYWw/LnNldChzbG90LCB2YWwpO1xuICAgICAgICAgIHZhbFRvU2xvdD8uc2V0KHZhbCwgc2xvdCk7XG4gICAgICAgICAgbG9jYWxseVJlc29sdmVkQ2FwU2xvdHNbaW5kZXhdID0gdmFsO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2FsbHlSZXNvbHZlZENhcFNsb3RzW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzW2luZGV4XTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyBVbnJlc29sdmVkIGxvY2FsIHNsb3QgaW4gd3JhcHBlZCBtYXJzaGFsbGVyJywge1xuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBzbG90LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhcmRlbihsb2NhbGx5UmVzb2x2ZWRDYXBTbG90cyk7XG4gIH07XG5cbiAgLyoqXG4gKiBSZXNvbHZlcyBhbiBhcnJheSBvZiBjYXBhYmlsaXRpZXMgaW50byBhbiBhcnJheSBvZiBzbG90cyBvZiB0aGUgd3JhcHBlZFxuICogbWFyc2hhbGxlci5cbiAqXG4gKiBUaGlzIGlzIHVzZWQgYnkgYHRvQ2FwRGF0YWAgdG8gbWFwIHNsb3RzIGFmdGVyIHRoZSBwYXNzLXRocm91Z2ggbWFyc2hhbGxlclxuICogaGFzIHNlcmlhbGl6ZWQgdGhlIHBhc3NhYmxlIGRhdGEuXG4gKlxuICogQHBhcmFtIHtvYmplY3RbXX0gY2Fwc1xuICogQHJldHVybnMge1Byb21pc2U8U2xvdFtdPn1cbiAqL1xuICBjb25zdCBtYXBDYXBzVG9TbG90cyA9IGFzeW5jIGNhcHMgPT4ge1xuICAgIGlmIChjYXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNhcHM7XG4gICAgfVxuICAgIGxldCBoYXNSZW1vdGVDYXAgPSBmYWxzZTtcbiAgICBjb25zdCB7IGxlbmd0aCB9ID0gY2FwcztcbiAgICAvKiogQHR5cGUgeyhTbG90IHwgbnVsbCB8IHVuZGVmaW5lZClbXX0gKi9cbiAgICBjb25zdCBsb2NhbGx5UmVzb2x2ZWRTbG90cyA9IEFycmF5LmZyb20oeyBsZW5ndGggfSk7XG4gICAgLyoqIEB0eXBlIHsob2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZClbXX0gKi9cbiAgICBjb25zdCByZW1vdGVDYXBzVG9SZXNvbHZlID0gQXJyYXkuZnJvbSh7IGxlbmd0aCB9KTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBjYXBdIG9mIGNhcHMuZW50cmllcygpKSB7XG4gICAgICBpZiAoY2FwID09PSBudWxsKSB7XG4gICAgICAgIC8qIFdlIHNob3VsZG4ndCBnZXQgbnVsbCBjYXBzIGhlcmUsIGJ1dCB3ZSBtaXJyb3IgaGFuZGxlIHRoZW0gYW55d2F5Ki9cbiAgICAgICAgY29uc3QgbnVsbENhcCA9IC8qKiBAdHlwZSB7bnVsbH0gKi8gKGNhcCk7XG4gICAgICAgIHJlbW90ZUNhcHNUb1Jlc29sdmVbaW5kZXhdID0gbnVsbENhcDtcbiAgICAgICAgbG9jYWxseVJlc29sdmVkU2xvdHNbaW5kZXhdID0gbnVsbENhcDtcbiAgICAgIH0gZWxzZSBpZiAoY2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgY2FjaGVkU2xvdCA9IHZhbFRvU2xvdD8uZ2V0KGNhcCk7XG4gICAgICAgIGlmIChjYWNoZWRTbG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoY2FjaGVkU2xvdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2xvdFRvVmFsPy5zZXQoY2FjaGVkU2xvdCwgY2FwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9jYWxseVJlc29sdmVkU2xvdHNbaW5kZXhdID0gY2FjaGVkU2xvdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYXNSZW1vdGVDYXAgPSB0cnVlO1xuICAgICAgICAgIHJlbW90ZUNhcHNUb1Jlc29sdmVbaW5kZXhdID0gY2FwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgbnVsbDtcbiAgICBpZiAoaGFzUmVtb3RlQ2FwKSB7XG4gICAgICBjb25zdCByZW1vdGVseVJlc29sdmVkU2xvdHNDYXBEYXRhID1cbiAgICAgICAgYXdhaXQgRShtYXJzaGFsbGVyKS50b0NhcERhdGEocmVtb3RlQ2Fwc1RvUmVzb2x2ZSk7XG4gICAgICB0cnkge1xuICAgICAgICAvKiogQHR5cGUgeyhSZW1vdGFibGVTbG90V3JhcHBlcjxTbG90PiB8IG51bGwgfCB1bmRlZmluZWQpW119ICovXG4gICAgICAgIGNvbnN0IHNsb3RXcmFwcGVyTWFwcGVkU2xvdHMgPSBzbG90V3JhcHBlck1hcnNoYWxsZXIuZnJvbUNhcERhdGEoXG4gICAgICAgICAgcmVtb3RlbHlSZXNvbHZlZFNsb3RzQ2FwRGF0YSxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHNsb3RXcmFwcGVyXSBvZiBzbG90V3JhcHBlck1hcHBlZFNsb3RzLmVudHJpZXMoKSkge1xuICAgICAgICAgIGlmIChzbG90V3JhcHBlciAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzbG90ID0gY29udmVydFdyYXBwZXJUb1Nsb3Qoc2xvdFdyYXBwZXIpO1xuICAgICAgICAgICAgY29uc3QgdmFsID0gY2Fwc1tpbmRleF07XG4gICAgICAgICAgICBsb2NhbGx5UmVzb2x2ZWRTbG90c1tpbmRleF0gPSBzbG90O1xuICAgICAgICAgICAgaWYgKHNsb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBzbG90VG9WYWw/LnNldChzbG90LCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNsb3QgIT0gbnVsbCB8fCBjYWNoZVNldmVyZWRWYWwpIHtcbiAgICAgICAgICAgICAgdmFsVG9TbG90Py5zZXQodmFsLCBzbG90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsbHlSZXNvbHZlZFNsb3RzW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjYXAgPSBjYXBzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybign4pqg77iPIFVucmVzb2x2ZWQgbG9jYWwgc2xvdCBpbiB3cmFwcGVkIG1hcnNoYWxsZXInLCB7XG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICBjYXAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgc2xvdFdyYXBwZXJNYXJzaGFsbGVyLCBjbGVhciBpdHMgc3RhdGUqL1xuICAgICAgICBjdXJyZW50U2xvdFRvV3JhcHBlci5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEFsbCBzbG90cyBzaG91bGQgaGF2ZSBiZWVuIHJlc29sdmVkIGJ5IG5vdyAob3Igd2FybmVkIGFib3V0KSovXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7U2xvdFtdfSAqLyAoaGFyZGVuKGxvY2FsbHlSZXNvbHZlZFNsb3RzKSk7XG4gIH07XG5cbiAgLyoqXG4gKiBVbmZvcnR1bmF0ZWx5IENhcERhdGEgb25seSBjb250YWlucyBpZmFjZSBpbmZvcm1hdGlvbiBmb3Igc2xvdHRlZFxuICogY2FwYWJpbGl0aWVzIG5lc3RlZCBpbnNpZGUgdGhlIGJvZHksIHdoaWNoIG1lYW5zIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGVcbiAqIGJvZHkgdG8gZXh0cmFjdCBpdC4gTWF5YmUgaW4gdGhlIGZ1dHVyZSBDYXBEYXRhIGNvdWxkIGJlIGV4dGVuZGVkIHRvIGNhcnJ5XG4gKiB0aGlzIHNlcGFyYXRlbHkuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzI5OTFcbiAqXG4gKiBTaW5jZSB0aGlzIGhlbHBlciBpcyB1c2VkIGludGVybmFsbHkgdG8gdWx0aW1hdGVseSBwcm92aWRlIFNsb3RXcmFwcGVyXG4gKiBvYmplY3RzIHRvIHRoZSBjb3JyZXNwb25kaW5nIG1hcnNoYWxsZXIsIGFuZCB0aGF0IHdlIHVzZSB0aGUgc2FtZVxuICogbWFyc2hhbGxlciB0byBleHRyYWN0IHRoZSBpZmFjZSBpbmZvcm1hdGlvbiwgZGlyZWN0bHkgcmV0dXJuIHRoZSBmdWxsXG4gKiBTbG90V3JhcHBlciBvYmplY3QgaW5zdGVhZCBvZiBqdXN0IHRoZSBpZmFjZS5cbiAqXG4gKiBAcGFyYW0ge0NhcERhdGE8U2xvdD59IGRhdGFcbiAqL1xuICBjb25zdCBtYWtlSWZhY2VFeHRyYWN0b3IgPSBkYXRhID0+IHtcbiAgICBjb25zdCB7IHNsb3RzIH0gPSBkYXRhO1xuICAgIC8qKiBAcGFyYW0ge251bWJlcn0gaW5kZXggKi9cbiAgICBjb25zdCBnZXRXcmFwcGVyID0gaW5kZXggPT4ge1xuICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzW2luZGV4XTtcbiAgICAgIGxldCB3cmFwcGVyID0gY3VycmVudFNsb3RUb1dyYXBwZXIuZ2V0KHNsb3QpO1xuICAgICAgaWYgKCF3cmFwcGVyKSB7XG4gICAgICAgIHZvaWQgc2xvdFdyYXBwZXJNYXJzaGFsbGVyLmZyb21DYXBEYXRhKGRhdGEpO1xuICAgICAgfVxuICAgICAgd3JhcHBlciA9IGN1cnJlbnRTbG90VG9XcmFwcGVyLmdldChzbG90KTtcbiAgICAgIGlmICghd3JhcHBlcikge1xuICAgICAgICB0aHJvdyBGYWlsYE1hcnNoYWxsZXIgZGlkbid0IGNyZWF0ZSB3cmFwcGVyIGZvciBzbG90ICR7cShzbG90KX0gKGluZGV4PSR7cShpbmRleCl9KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGdldFdyYXBwZXI7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPENhcERhdGE8U2xvdD4+fVxuICovXG4gIGNvbnN0IHRvQ2FwRGF0YSA9IGFzeW5jIHZhbCA9PiB7XG4gICAgY29uc3QgY2FwRGF0YSA9IHBhc3NUaHJvdWdoTWFyc2hhbGxlci50b0NhcERhdGEodmFsKTtcbiAgICBjb25zdCBtYXBwZWRTbG90cyA9IGF3YWl0IG1hcENhcHNUb1Nsb3RzKGNhcERhdGEuc2xvdHMpO1xuICAgIHJldHVybiBoYXJkZW4oeyAuLi5jYXBEYXRhLCBzbG90czogbWFwcGVkU2xvdHMgfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0NhcERhdGE8U2xvdD59IGRhdGFcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBhc3NhYmxlPn1cbiAqL1xuICBjb25zdCBmcm9tQ2FwRGF0YSA9IGFzeW5jIGRhdGEgPT4ge1xuICAgIGNvbnN0IGdldFdyYXBwZXIgPSBtYWtlSWZhY2VFeHRyYWN0b3IoZGF0YSk7XG4gICAgYXdhaXQgbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWFwcGVkU2xvdHMgPSBhd2FpdCBtYXBTbG90c1RvQ2FwcyhkYXRhLnNsb3RzLCBnZXRXcmFwcGVyKTtcbiAgICAgIHJldHVybiBwYXNzVGhyb3VnaE1hcnNoYWxsZXIuZnJvbUNhcERhdGEoeyAuLi5kYXRhLCBzbG90czogbWFwcGVkU2xvdHMgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN1cnJlbnRTbG90VG9XcmFwcGVyLmNsZWFyKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGYXIoJ3dyYXBwZWQgcmVtb3RlIG1hcnNoYWxsZXInLCB7XG4gICAgdG9DYXBEYXRhLFxuICAgIGZyb21DYXBEYXRhLFxuXG4gICAgLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki9cbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHRvQ2FwRGF0YSAqL1xuICAgIHNlcmlhbGl6ZTogdG9DYXBEYXRhLFxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUNhcERhdGEgKi9cbiAgICB1bnNlcmlhbGl6ZTogZnJvbUNhcERhdGEsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlbW90ZTxQaWNrPEVNYXJzaGFsbGVyPFNsb3Q+LCAnZnJvbUNhcERhdGEnIHwgJ3RvQ2FwRGF0YSc+Pn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1JldHVyblR5cGU8dHlwZW9mIEZhcjxFTWFyc2hhbGxlcjxTbG90Pj4+fVxuICovJGjNj19vbmNlLndyYXBSZW1vdGVNYXJzaGFsbGVyU2VuZFNsb3RzT25seSh3cmFwUmVtb3RlTWFyc2hhbGxlclNlbmRTbG90c09ubHkpO1xuICAgICAgIGNvbnN0IHdyYXBSZW1vdGVNYXJzaGFsbGVyRGlyZWN0U2VuZCA9IG1hcnNoYWxsZXIgPT4ge1xuICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge1Byb21pc2U8Q2FwRGF0YTxTbG90Pj59XG4gKi9cbiAgY29uc3QgdG9DYXBEYXRhID0gdmFsID0+IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbCk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0NhcERhdGE8U2xvdD59IGRhdGFcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBhc3NhYmxlPn1cbiAqL1xuICBjb25zdCBmcm9tQ2FwRGF0YSA9IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKTtcblxuICByZXR1cm4gRmFyKCd3cmFwcGVkIHJlbW90ZSBtYXJzaGFsbGVyJywge1xuICAgIHRvQ2FwRGF0YSxcbiAgICBmcm9tQ2FwRGF0YSxcblxuICAgIC8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSovXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB0b0NhcERhdGEgKi9cbiAgICBzZXJpYWxpemU6IHRvQ2FwRGF0YSxcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIGZyb21DYXBEYXRhICovXG4gICAgdW5zZXJpYWxpemU6IGZyb21DYXBEYXRhLFxuICB9KTtcbn07JGjNj19vbmNlLndyYXBSZW1vdGVNYXJzaGFsbGVyRGlyZWN0U2VuZCh3cmFwUmVtb3RlTWFyc2hhbGxlckRpcmVjdFNlbmQpO1xuXG4gICAgICAgY29uc3Qgd3JhcFJlbW90ZU1hcnNoYWxsZXIgPSB3cmFwUmVtb3RlTWFyc2hhbGxlclNlbmRTbG90c09ubHk7JGjNj19vbmNlLndyYXBSZW1vdGVNYXJzaGFsbGVyKHdyYXBSZW1vdGVNYXJzaGFsbGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndyYXBSZW1vdGVNYXJzaGFsbGVyU2VuZFNsb3RzT25seSI6WyJ3cmFwUmVtb3RlTWFyc2hhbGxlclNlbmRTbG90c09ubHkiXSwid3JhcFJlbW90ZU1hcnNoYWxsZXJEaXJlY3RTZW5kIjpbIndyYXBSZW1vdGVNYXJzaGFsbGVyRGlyZWN0U2VuZCJdLCJ3cmFwUmVtb3RlTWFyc2hhbGxlciI6WyJ3cmFwUmVtb3RlTWFyc2hhbGxlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAr7RBF8Q0AAPENAAArAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldGhvZC10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIl0sImV4cG9ydHMiOlsiYmluZEFsbE1ldGhvZHMiLCJnZXRNZXRob2ROYW1lcyIsImdldFN0cmluZ01ldGhvZE5hbWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcmVhbEdldE1ldGhvZE5hbWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChyZWFsR2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qKlxuICogQGZpbGUgbWV0aG9kLXRvb2xzIHVzZSBkeW5hbWljIHByb3BlcnR5IGxvb2t1cCwgd2hpY2ggaXMgbm90XG4gKiAgIEplc3NpZS1jb21wYXRpYmxlXG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCB0aGUgYGdldE1ldGhvZE5hbWVzYCBpbiBgQGVuZG8vZXZlbnR1YWwtc2VuZGBcbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGdldE1ldGhvZE5hbWVzYCBmcm9tIGBAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzYCBpbnN0ZWFkLlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gS1xuICogQHBhcmFtIHtSZWNvcmQ8SywgYW55Pn0gdmFsXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG4gICAgICAgY29uc3QgZ2V0TWV0aG9kTmFtZXMgPSB2YWwgPT5cbiAgLyoqIEB0eXBlIHtLW119ICovIChyZWFsR2V0TWV0aG9kTmFtZXModmFsKSk7JGjNj19vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBgZ2V0TWV0aG9kTmFtZXNgIGNvbnRhaW5pbmcgb25seSBzdHJpbmcgbmFtZXMsIHdpdGhvdXQgc3ltYm9sc1xuICpcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IEtcbiAqIEBwYXJhbSB7UmVjb3JkPEssIGFueT59IHZhbFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG4gICAgICAgY29uc3QgZ2V0U3RyaW5nTWV0aG9kTmFtZXMgPSB2YWwgPT5cbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKFxuICAgIHJlYWxHZXRNZXRob2ROYW1lcyh2YWwpLmZpbHRlcihuYW1lID0+IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJylcbiAgKTtcblxuLyoqXG4gKiBUT0RPIFRoaXMgZnVuY3Rpb24gZXhpc3RzIG9ubHkgdG8gZWFzZSB0aGVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU5NzAgdHJhbnNpdGlvbiwgZnJvbSBhbGwgbWV0aG9kc1xuICogYmVpbmcgb3duIHByb3BlcnRpZXMgdG8gbWV0aG9kcyBiZWluZyBpbmhlcml0ZWQgZnJvbSBhIGNvbW1vbiBwcm90b3R5cGUuIFRoaXNcbiAqIHRyYW5zaXRpb24gYnJlYWtzIHR3byBwYXR0ZXJucyB1c2VkIGluIHByaW9yIGNvZGU6IGF1dG9iaW5kaW5nLCBhbmRcbiAqIGVudW1lcmF0aW5nIG1ldGhvZHMgYnkgZW51bWVyYXRpbmcgb3duIHByb3BlcnRpZXMuIEZvciBib3RoLCB0aGUgcHJlZmVycmVkXG4gKiByZXBhaXJzIGFyZVxuICpcbiAqIC0gYXV0b2JpbmRpbmc6IFJlcGxhY2UsIGZvciBleGFtcGxlLCBgZm9vKG9iai5tZXRob2QpYCB3aXRoIGBmb28oYXJnID0+XG4gKiAgIGBvYmoubWV0aG9kKGFyZykpYC4gSU9XLCBzdG9wIHJlbHlpbmcgb24gZXhwcmVzc2lvbnMgbGlrZSBgb2JqLm1ldGhvZGB0b1xuICogICBleHRyYWN0IGEgbWV0aG9kIHN0aWxsIGJvdW5kIHRvIHRoZSBzdGF0ZSBvZmBvYmpgIGJlY2F1c2UsIGZvciB2aXJ0dWFsIGFuZFxuICogICBkdXJhYmxlIG9iamVjdHMsIHRoZXkgbm8gbG9uZ2VyIHdpbGwgYWZ0ZXIgIzU5NzAuXG4gKiAtIG1ldGhvZCBlbnVtZXJhdGlvbjogUmVwbGFjZSwgZm9yIGV4YW1wbGUgYFJlZmxlY3Qub3duS2V5cyhvYmopYCB3aXRoXG4gKiAgIGBnZXRNZXRob2ROYW1lcyhvYmopYC5cbiAqXG4gKiBPbmNlIGFsbCBwcm9ibGVtYXRpYyBjYXNlcyBoYXZlIGJlZW4gY29udmVydGVkIGluIHRoaXMgbWFubmVyLCB0aGlzXG4gKiBgYmluZEFsbE1ldGhvZHNgIGhhY2sgY2FuIGFuZCBUT0RPIHNob3VsZCBiZSBkZWxldGVkLiBIb3dldmVyLCB3ZSBjdXJyZW50bHlcbiAqIGhhdmUgbm8gcmVsaWFibGUgc3RhdGljIHdheSB0byB0cmFjayBkb3duIGFuZCBmaXggYWxsIGF1dG9iaW5kaW5nIHNpdGVzLiBGb3JcbiAqIHRob3NlIG9iamVjdHMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBmdWxseSByZXBhaXJlZCBieSB0aGUgYWJvdmUgdHdvXG4gKiB0ZWNobmlxdWVzLCBgYmluZEFsbE1ldGhvZHNgIGNyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgYWN0cyBtdWNoIGxpa2UgdGhlXG4gKiBwcmUtIzU5NzAgb2JqZWN0cywgd2l0aCBhbGwgdGhlaXIgbWV0aG9kcyBhcyBpbnN0YW5jZS1ib3VuZCBvd24gcHJvcGVydGllcy5cbiAqIEl0IGRvZXMgdGhpcyBieSBtYWtpbmcgYSBuZXcgb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgb2JqYCB3aGVyZSB0aGUgbmV3XG4gKiBvYmplY3QgaGFzIGJvdW5kIG93biBtZXRob2RzIG92ZXJyaWRkaW5nIGFsbCB0aGUgbWV0aG9kcyBpdCB3b3VsZCBoYXZlXG4gKiBpbmhlcml0ZWQgZnJvbSBgb2JqYC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgYW55Pn0gVFxuICogQHBhcmFtIHtUfSBvYmpcbiAqIEByZXR1cm5zIHtUfVxuICovJGjNj19vbmNlLmdldFN0cmluZ01ldGhvZE5hbWVzKGdldFN0cmluZ01ldGhvZE5hbWVzKTtcbiAgICAgICBjb25zdCBiaW5kQWxsTWV0aG9kcyA9IG9iaiA9PlxuICBoYXJkZW4oXG4gICAgY3JlYXRlKFxuICAgICAgb2JqLFxuICAgICAgZnJvbUVudHJpZXMoXG4gICAgICAgIHJlYWxHZXRNZXRob2ROYW1lcyhvYmopLm1hcChuYW1lID0+IFtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAoLyoqIEB0eXBlIHt1bmtub3duW119ICovIC4uLmFyZ3MpID0+XG4gICAgICAgICAgICAgIGFwcGx5KG9ialtuYW1lXSwgb2JqLCBhcmdzKSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICksXG4gICk7JGjNj19vbmNlLmJpbmRBbGxNZXRob2RzKGJpbmRBbGxNZXRob2RzKTtcbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJnZXRTdHJpbmdNZXRob2ROYW1lcyI6WyJnZXRTdHJpbmdNZXRob2ROYW1lcyJdLCJiaW5kQWxsTWV0aG9kcyI6WyJiaW5kQWxsTWV0aG9kcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACQ/SB4oEIAAKBCAAAmAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldHJpY3MuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MiLCJISVNUT0dSQU1fTUVUUklDUyIsIktFUk5FTF9TVEFUU19NRVRSSUNTIiwiS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTIiwiS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTIiwiUXVldWVNZXRyaWNBc3BlY3QiLCJtYWtlUXVldWVNZXRyaWNzIiwibWFrZVF1ZXVlTWV0cmljc01ldGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLGlzTmF0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiaXNOYXRcIixbJGjNj19hID0+IChpc05hdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtNZXRlciBhcyBPVGVsTWV0ZXIsIE1ldHJpY0F0dHJpYnV0ZXN9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG4gKiBAaW1wb3J0IHtUb3RhbE1hcH0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKi9cblxuY29uc3QgSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyA9IFtcbiAgNSxcbiAgMTAsXG4gIDI1LFxuICA1MCxcbiAgMTAwLFxuICAyNTAsXG4gIDUwMCxcbiAgMTAwMCxcbiAgMjUwMCxcbiAgNTAwMCxcbiAgMTAwMDAsXG4gIEluZmluaXR5LFxuXTtcbmNvbnN0IEhJU1RPR1JBTV9TRUNPTkRTX0xBVEVOQ1lfQk9VTkRBUklFUyA9XG4gIEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMubWFwKG1zID0+IG1zIC8gMTAwMCk7XG5cbi8qIFRPRE86IFZhbGlkYXRlIHRoZXNlIGJvdW5kYXJpZXMuIFdlJ3JlIG5vdCBnb2luZyB0byBoYXZlIDVtcyBibG9ja3MsIGJ1dCovXG4vKiB3ZSBwcm9iYWJseSBjYXJlIGFib3V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMTAgdnMuIDMwIHNlY29uZHMuKi9cbiAgICAgICBjb25zdCBISVNUT0dSQU1fTUVUUklDUyA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIHN3aW5nc2V0X2NyYW5rX3Byb2Nlc3NpbmdfdGltZToge1xuICAgIGRlc2NyaXB0aW9uOiAnUHJvY2Vzc2luZyB0aW1lIHBlciBjcmFuayAobXMpJyxcbiAgICB1bml0OiAnbXMnLFxuICAgIGJvdW5kYXJpZXM6IEFycmF5Lm9mKDEsIDExLCAyMSwgMzEsIDQxLCA1MSwgNjEsIDcxLCA4MSwgOTEsIEluZmluaXR5KSxcbiAgfSxcbiAgc3dpbmdzZXRfYmxvY2tfcHJvY2Vzc2luZ19zZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdQcm9jZXNzaW5nIHRpbWUgcGVyIGJsb2NrJyxcbiAgICB1bml0OiAncycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX1NFQ09ORFNfTEFURU5DWV9CT1VOREFSSUVTLFxuICB9LFxuICBzd2luZ3NldF92YXRfc3RhcnR1cDoge1xuICAgIGRlc2NyaXB0aW9uOiAnVmF0IHN0YXJ0dXAgdGltZSAobXMpJyxcbiAgICB1bml0OiAnbXMnLFxuICAgIGJvdW5kYXJpZXM6IEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG4gIHN3aW5nc2V0X3ZhdF9kZWxpdmVyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnVmF0IGRlbGl2ZXJ5IHRpbWUgKG1zKScsXG4gICAgdW5pdDogJ21zJyxcbiAgICBib3VuZGFyaWVzOiBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTLFxuICB9LFxuICBzd2luZ3NldF9tZXRlcl91c2FnZToge1xuICAgIGRlc2NyaXB0aW9uOiAnVmF0IG1ldGVyIHVzYWdlJyxcbiAgICB1bml0OiAnbXMnLFxuICAgIGJvdW5kYXJpZXM6IEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG59KTskaM2PX29uY2UuSElTVE9HUkFNX01FVFJJQ1MoSElTVE9HUkFNX01FVFJJQ1MpO1xuXG5jb25zdCBibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MgPSB7XG4gIC8qIERpc2FibGVkIGJlY2F1c2UgaW1wb3J0aW5nIGZyb20gQG9wZW50ZWxlbWV0cnkvYXBpIGJyZWFrcyBrZXJuZWwgYnVuZGxpbmcuKi9cbiAgLyogVGhhbmtmdWxseSwgaXQncyB0aGUgZGVmYXVsdCBhbnl3YXk6Ki9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL29wZW4tdGVsZW1ldHJ5L29wZW50ZWxlbWV0cnktanMvYmxvYi9mNGRkMmExMDYyZjk4MGNkMzQ0Y2ZiMTcyYTUxNWQwMDExNWRmNTcwL2FwaS9zcmMvbWV0cmljcy9NZXRyaWMudHMjTDUzLUw1NyovXG4gIC8qIHZhbHVlVHlwZTogVmFsdWVUeXBlLkRPVUJMRSwqL1xuICB1bml0OiAncycsXG4gIGFkdmljZToge1xuICAgIGV4cGxpY2l0QnVja2V0Qm91bmRhcmllczogW1xuICAgICAgMC4xLCAwLjIsIDAuMywgMC40LCAwLjUsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDEwLCAxNSwgMzAsXG4gICAgXSxcbiAgfSxcbn07XG4gICAgICAgY29uc3QgQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBzd2luZ3NldFJ1blNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Blci1ibG9jayB0aW1lIHNwZW50IGV4ZWN1dGluZyBTd2luZ1NldCcsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBzd2luZ3NldENoYWluU2F2ZVNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Blci1ibG9jayB0aW1lIHNwZW50IHByb3BhZ2F0aW5nIFN3aW5nU2V0IHN0YXRlIGludG8gY29zbW9zJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIHN3aW5nc2V0Q29tbWl0U2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1Blci1ibG9jayB0aW1lIHNwZW50IGNvbW1pdHRpbmcgU3dpbmdTZXQgc3RhdGUgdG8gaG9zdCBzdG9yYWdlJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGNvc21vc0NvbW1pdFNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Blci1ibG9jayB0aW1lIHNwZW50IGNvbW1pdHRpbmcgY29zbW9zIHN0YXRlJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGZ1bGxDb21taXRTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgY29tbWl0dGluZyBzdGF0ZSwgaW5jbHVzaXZlIG9mIENPTU1JVF9CTE9DSyBwcm9jZXNzaW5nIHBsdXMgdGltZSBzcGVudCBbb3V0c2lkZSBvZiBjb3NtaWMtc3dpbmdzZXRdIGJlZm9yZSBhbmQgYWZ0ZXIgaXQnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgaW50ZXJCbG9ja1NlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWUgc3BlbnQgaWRsZSBiZXR3ZWVuIGJsb2NrcycsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBhZnRlckNvbW1pdEhhbmdvdmVyU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1Blci1ibG9jayB0aW1lIHNwZW50IHdhaXRpbmcgZm9yIHByZXZpb3VzLWJsb2NrIGFmdGVyQ29tbWl0IHdvcmsnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgYmxvY2tMYWdTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaGUgZGVsYXkgb2YgZWFjaCBibG9jayBmcm9tIGl0cyBleHBlY3RlZCBiZWdpbiB0aW1lJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gICAgLyogQWRkIGJ1Y2tldHMgZm9yIGV4Y2Vzc2l2ZWx5IGxvbmcgZGVsYXlzLiovXG4gICAgYWR2aWNlOiB7XG4gICAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MuYWR2aWNlLFxuICAgICAgZXhwbGljaXRCdWNrZXRCb3VuZGFyaWVzOiAvKiogQHR5cGUge251bWJlcltdfSAqLyAoW1xuICAgICAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MuYWR2aWNlLmV4cGxpY2l0QnVja2V0Qm91bmRhcmllcyxcbiAgICAgICAgLi4uWzYwLCAxMjAsIDE4MCwgMjQwLCAzMDAsIDYwMCwgMzYwMF0sXG4gICAgICBdKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbi8qKiBAZW51bSB7KHR5cGVvZiBRdWV1ZU1ldHJpY0FzcGVjdClba2V5b2YgdHlwZW9mIFF1ZXVlTWV0cmljQXNwZWN0XX0gKi8kaM2PX29uY2UuQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MoQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MpO1xuICAgICAgIGNvbnN0IFF1ZXVlTWV0cmljQXNwZWN0ID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgTGVuZ3RoOiAnbGVuZ3RoJyxcbiAgSW5jcmVtZW50Q291bnQ6ICdpbmNyZW1lbnRzJyxcbiAgRGVjcmVtZW50Q291bnQ6ICdkZWNyZW1lbnRzJyxcbn0pO1xuXG4vKipcbiAqIFF1ZXVlIG1ldHJpY3MgY29tZSBpbiB7bGVuZ3RoLGFkZCxyZW1vdmV9IHRyaXBsZXMgc2hhcmluZyBhIGNvbW1vbiBwcmVmaXguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVQcmVmaXhcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjUHJlZml4XG4gKiBAcmV0dXJucyB7UmVjb3JkPFxuICogICBRdWV1ZU1ldHJpY0FzcGVjdCxcbiAqICAgeyBuYW1lOiBzdHJpbmc7IG9wdGlvbnM6IE1ldHJpY0F0dHJpYnV0ZXMgfVxuICogPn1cbiAqLyRozY9fb25jZS5RdWV1ZU1ldHJpY0FzcGVjdChRdWV1ZU1ldHJpY0FzcGVjdCk7XG4gICAgICAgY29uc3QgbWFrZVF1ZXVlTWV0cmljc01ldGEgPSAobmFtZVByZWZpeCwgZGVzY1ByZWZpeCkgPT4ge1xuICAvKiogQHR5cGUge1tRdWV1ZU1ldHJpY0FzcGVjdCwgc3RyaW5nLCBzdHJpbmddW119ICovXG4gIGNvbnN0IG1ldHJpY3NNZXRhID0gW1xuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5MZW5ndGgsICdsZW5ndGgnLCAnbGVuZ3RoJ10sXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0LkluY3JlbWVudENvdW50LCAnYWRkJywgJ2luY3JlbWVudHMnXSxcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuRGVjcmVtZW50Q291bnQsICdyZW1vdmUnLCAnZGVjcmVtZW50cyddLFxuICBdO1xuICBjb25zdCBlbnRyaWVzID0gbWV0cmljc01ldGEubWFwKChbYXNwZWN0LCBuYW1lU3VmZml4LCBkZXNjU3VmZml4XSkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSBgJHtuYW1lUHJlZml4fV8ke25hbWVTdWZmaXh9YDtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGAke2Rlc2NQcmVmaXh9ICR7ZGVzY1N1ZmZpeH1gO1xuICAgIC8qIEZ1dHVyZSBPcGVuVGVsZW1ldHJ5IFNES3Mgc2hvdWxkIGFsc28gc3VwcG9ydCBjcmVhdGluZyBJbnN0cnVtZW50cyB3aXRoKi9cbiAgICAvKiBhdHRyaWJ1dGUga2V5cyAoc3VjaCBhcyB0aGUgXCJxdWV1ZVwiIGF0dHJpYnV0ZSBmb3IqL1xuICAgIC8qIFwiY29zbWljX3N3aW5nc2V0X2luYm91bmRfcXVldWVfe2xlbmd0aCxhZGQscmVtb3ZlfVwiIG1lYXN1cmVtZW50cyk6Ki9cbiAgICAvKiBodHRwczovL29wZW50ZWxlbWV0cnkuaW8vZG9jcy9zcGVjcy9vdGVsL21ldHJpY3MvYXBpLyNpbnN0cnVtZW50LWFkdmlzb3J5LXBhcmFtZXRlci1hdHRyaWJ1dGVzKi9cbiAgICAvKiBBdCB0aGF0IHRpbWUsIGEgbmV3IGZpZWxkIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyByZWNvcmQuKi9cbiAgICByZXR1cm4gW2FzcGVjdCwgeyBuYW1lLCBvcHRpb25zOiB7IGRlc2NyaXB0aW9uIH0gfV07XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gUXVldWVOYW1lXG4gKiBAdHlwZWRlZiBRdWV1ZU1ldHJpY3NcbiAqIEBwcm9wZXJ0eSB7KGxlbmd0aHM6IFJlY29yZDxRdWV1ZU5hbWUsIG51bWJlcj4pID0+IHZvaWR9IGluaXRMZW5ndGhzIG11c3QgYmVcbiAqICAgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgZnVuY3Rpb25cbiAqIEBwcm9wZXJ0eSB7KGxlbmd0aHM6IFJlY29yZDxRdWV1ZU5hbWUsIG51bWJlcj4pID0+IHZvaWR9IHVwZGF0ZUxlbmd0aHNcbiAqIEBwcm9wZXJ0eSB7KHF1ZXVlOiBRdWV1ZU5hbWUsIGRlbHRhPzogbnVtYmVyKSA9PiB2b2lkfSBpbmNMZW5ndGggZm9yIGFcbiAqICAgbm9uLW5lZ2F0aXZlIGRlbHRhXG4gKiBAcHJvcGVydHkgeyhxdWV1ZTogUXVldWVOYW1lLCBkZWx0YT86IG51bWJlcikgPT4gdm9pZH0gZGVjTGVuZ3RoIGZvciBhXG4gKiAgIG5vbi1uZWdhdGl2ZSBkZWx0YVxuICovXG5cbi8qKlxuICogQ3JlYXRlIHtsZW5ndGgsYWRkLHJlbW92ZX0gSW5zdHJ1bWVudHMgZm9yIGEgcXVldWUgYW5kIHJldHVybiBmdW5jdGlvbnMgZm9yXG4gKiBjb25zaXN0ZW50bHkgaW5pdGlhbGl6aW5nIGFuZCB1cGRhdGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBRdWV1ZU5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWdcbiAqIEBwYXJhbSB7T1RlbE1ldGVyfSBjb25maWcub3RlbE1ldGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnLm5hbWVQcmVmaXhcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWcuZGVzY1ByZWZpeFxuICogQHBhcmFtIHtQaWNrPENvbnNvbGUsICd3YXJuJz59IFtjb25maWcuY29uc29sZV1cbiAqIEByZXR1cm5zIHtRdWV1ZU1ldHJpY3M8UXVldWVOYW1lPn1cbiAqLyRozY9fb25jZS5tYWtlUXVldWVNZXRyaWNzTWV0YShtYWtlUXVldWVNZXRyaWNzTWV0YSk7XG4gICAgICAgY29uc3QgbWFrZVF1ZXVlTWV0cmljcyA9ICh7XG4gIG90ZWxNZXRlcixcbiAgbmFtZVByZWZpeCxcbiAgZGVzY1ByZWZpeCxcbiAgY29uc29sZSxcbn0pID0+IHtcbiAgY29uc3Qge1xuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5MZW5ndGhdOiBsZW5ndGhNZXRhLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5JbmNyZW1lbnRDb3VudF06IHVwTWV0YSxcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuRGVjcmVtZW50Q291bnRdOiBkb3duTWV0YSxcbiAgfSA9IG1ha2VRdWV1ZU1ldHJpY3NNZXRhKG5hbWVQcmVmaXgsIGRlc2NQcmVmaXgpO1xuICAvKiBUT0RPOiBXaGVuIGl0J3MgZGVlbWVkIHNhZmUgdG8gY2hhbmdlIHJlcG9ydGVkIG1ldHJpY3MsIG1ha2UgdXBDb3VudGVyIGFuZCovXG4gIC8qIGRvd25Db3VudGVyIHN5bmNocm9ub3VzIChhbmQgZHJvcCBgaW5jcmVtZW50c2AgYW5kIGBkZWNyZW1lbnRzYCBtYXBzKS4qL1xuICAvKiBXZSBjYW4ndCBkbyBzbyB1bnRpbCB0aGVuIGJlY2F1c2UgaXQgd2lsbCBhZGQgYSBcIl90b3RhbFwiIHN1ZmZpeCB0byB0aGUqL1xuICAvKiBQcm9tZXRoZXVzIGV4cG9ydCBtZXRyaWMgbmFtZSwgZGl2ZXJnaW5nIGZyb20gYG1ha2VJbmJvdW5kUXVldWVNZXRyaWNzYCBpbiovXG4gIC8qIHBhY2thZ2VzL2Nvc21pYy1zd2luZ3NldC9zcmMva2VybmVsLXN0YXRzLmpzLiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWpzL2Jsb2IvbWFpbi9kb2MvdXBncmFkZS10by0yLngubWQjLW90aGVyLWNoYW5nZXMqL1xuICBjb25zdCBsZW5ndGhDb3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZVVwRG93bkNvdW50ZXIoXG4gICAgbGVuZ3RoTWV0YS5uYW1lLFxuICAgIGxlbmd0aE1ldGEub3B0aW9ucyxcbiAgKTtcbiAgLyogY29uc3QgdXBDb3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZUNvdW50ZXIodXBNZXRhLm5hbWUsIHVwTWV0YS5vcHRpb25zKTsqL1xuICAvKiBjb25zdCBkb3duQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVDb3VudGVyKGRvd25NZXRhLm5hbWUsIGRvd25NZXRhLm9wdGlvbnMpOyovXG4gIGNvbnN0IHVwQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVPYnNlcnZhYmxlQ291bnRlcihcbiAgICB1cE1ldGEubmFtZSxcbiAgICB1cE1ldGEub3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZG93bkNvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlT2JzZXJ2YWJsZUNvdW50ZXIoXG4gICAgZG93bk1ldGEubmFtZSxcbiAgICBkb3duTWV0YS5vcHRpb25zLFxuICApO1xuICBjb25zdCBpbmNyZW1lbnRzID0gLyoqIEB0eXBlIHtUb3RhbE1hcDxzdHJpbmcsIG51bWJlcj59ICovIChuZXcgTWFwKCkpO1xuICBjb25zdCBkZWNyZW1lbnRzID0gLyoqIEB0eXBlIHtUb3RhbE1hcDxzdHJpbmcsIG51bWJlcj59ICovIChuZXcgTWFwKCkpO1xuICB1cENvdW50ZXIuYWRkQ2FsbGJhY2sob2JzZXJ2ZXIgPT4ge1xuICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgdmFsdWVdIG9mIGluY3JlbWVudHMuZW50cmllcygpKSB7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHZhbHVlLCB7IHF1ZXVlOiBxdWV1ZU5hbWUgfSk7XG4gICAgfVxuICB9KTtcbiAgZG93bkNvdW50ZXIuYWRkQ2FsbGJhY2sob2JzZXJ2ZXIgPT4ge1xuICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgdmFsdWVdIG9mIGRlY3JlbWVudHMuZW50cmllcygpKSB7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHZhbHVlLCB7IHF1ZXVlOiBxdWV1ZU5hbWUgfSk7XG4gICAgfVxuICB9KTtcblxuICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgY29uc3QgbGVuZ3RocyA9IC8qKiBAdHlwZSB7VG90YWxNYXA8c3RyaW5nLCBudW1iZXI+fSAqLyAobmV3IE1hcCgpKTtcbiAgY29uc3QgbnVkZ2UgPSAocXVldWVOYW1lLCBkZWx0YSwgaW5pdCA9IGZhbHNlKSA9PiB7XG4gICAgaWYgKCFsZW5ndGhzLmhhcyhxdWV1ZU5hbWUpKSB7XG4gICAgICBpZiAoIWluaXQpIGNvbnNvbGU/Lndhcm4oJ1Vua25vd24gcXVldWUnLCBxdWV1ZU5hbWUpO1xuICAgICAgbGVuZ3Rocy5zZXQocXVldWVOYW1lLCAwKTtcbiAgICAgIGluY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgMCk7XG4gICAgICBkZWNyZW1lbnRzLnNldChxdWV1ZU5hbWUsIDApO1xuICAgIH1cbiAgICBjb25zdCBvbGRMZW5ndGggPSBsZW5ndGhzLmdldChxdWV1ZU5hbWUpO1xuICAgIGxlbmd0aHMuc2V0KHF1ZXVlTmFtZSwgb2xkTGVuZ3RoICsgZGVsdGEpO1xuICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB7IHF1ZXVlOiBxdWV1ZU5hbWUgfTtcbiAgICBsZW5ndGhDb3VudGVyLmFkZChkZWx0YSwgZGltZW5zaW9ucyk7XG4gICAgaWYgKGluaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGRlbHRhID4gMCkge1xuICAgICAgLyogVE9ETyBwZXIgYWJvdmU6IHVwQ291bnRlci5hZGQoZGVsdGEsIGRpbWVuc2lvbnMpOyovXG4gICAgICBpbmNyZW1lbnRzLnNldChxdWV1ZU5hbWUsIChpbmNyZW1lbnRzLmdldChxdWV1ZU5hbWUpIHx8IDApICsgZGVsdGEpO1xuICAgIH0gZWxzZSBpZiAoZGVsdGEgPCAwKSB7XG4gICAgICAvKiBUT0RPIHBlciBhYm92ZTogZG93bkNvdW50ZXIuYWRkKC1kZWx0YSwgZGltZW5zaW9ucyk7Ki9cbiAgICAgIGRlY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgKGRlY3JlbWVudHMuZ2V0KHF1ZXVlTmFtZSkgfHwgMCkgLSBkZWx0YSk7XG4gICAgfVxuICAgIHJlYWR5ID0gdHJ1ZTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBpbml0TGVuZ3RoczogaW5pdGlhbExlbmd0aHMgPT4ge1xuICAgICAgIXJlYWR5IHx8XG4gICAgICAgIGNvbnNvbGU/Lndhcm4oXG4gICAgICAgICAgYFVuZXhwZWN0ZWQgcmVwZWF0IHF1ZXVlIGxlbmd0aCBpbml0aWFsaXphdGlvbiBmcm9tICR7cShsZW5ndGhzKX0gdG8gJHtxKGluaXRpYWxMZW5ndGhzKX1gXG4gICAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IFtxdWV1ZU5hbWUsIG5ld0xlbmd0aF0gb2YgT2JqZWN0LmVudHJpZXMoaW5pdGlhbExlbmd0aHMpKSB7XG4gICAgICAgIGlmICghaXNOYXQobmV3TGVuZ3RoKSkge1xuICAgICAgICAgIGNvbnNvbGU/Lndhcm4oYEludmFsaWQgbGVuZ3RoIGZvciBxdWV1ZSAke3EocXVldWVOYW1lKX06YCwgbmV3TGVuZ3RoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBudWRnZShxdWV1ZU5hbWUsIG5ld0xlbmd0aCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGVMZW5ndGhzOiBuZXdMZW5ndGhzID0+IHtcbiAgICAgIHJlYWR5IHx8IGNvbnNvbGU/Lndhcm4oJ01pc3NpbmcgaW5pdGlhbCBxdWV1ZSBsZW5ndGhzJyk7XG4gICAgICBmb3IgKGNvbnN0IFtxdWV1ZU5hbWUsIG5ld0xlbmd0aF0gb2YgT2JqZWN0LmVudHJpZXMobmV3TGVuZ3RocykpIHtcbiAgICAgICAgaWYgKCFpc05hdChuZXdMZW5ndGgpKSB7XG4gICAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBsZW5ndGggZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBuZXdMZW5ndGgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgbmV3TGVuZ3RoIC0gKGxlbmd0aHMuZ2V0KHF1ZXVlTmFtZSkgfHwgMCkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaW5jTGVuZ3RoOiAocXVldWVOYW1lLCBkZWx0YSA9IDEpID0+IHtcbiAgICAgIGlmICghaXNOYXQoZGVsdGEpKSB7XG4gICAgICAgIGNvbnNvbGU/Lndhcm4oYEludmFsaWQgaW5jcmVtZW50IGZvciBxdWV1ZSAke3EocXVldWVOYW1lKX06YCwgZGVsdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBudWRnZShxdWV1ZU5hbWUsIGRlbHRhKTtcbiAgICB9LFxuICAgIGRlY0xlbmd0aDogKHF1ZXVlTmFtZSwgZGVsdGEgPSAxKSA9PiB7XG4gICAgICBpZiAoIWlzTmF0KGRlbHRhKSkge1xuICAgICAgICBjb25zb2xlPy53YXJuKGBJbnZhbGlkIGRlY3JlbWVudCBmb3IgcXVldWUgJHtxKHF1ZXVlTmFtZSl9OmAsIGRlbHRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbnVkZ2UocXVldWVOYW1lLCAtZGVsdGEpO1xuICAgIH0sXG4gIH0pO1xufTtcblxuLyogQWxsIHRoZSBrZXJuZWwgbWV0cmljcyB3ZSBhcmUgcHJlcGFyZWQgZm9yLiovXG4vKiogQGVudW0geyh0eXBlb2YgTWV0cmljVHlwZSlba2V5b2YgdHlwZW9mIE1ldHJpY1R5cGVdfSBNZXRyaWNUeXBlICovJGjNj19vbmNlLm1ha2VRdWV1ZU1ldHJpY3MobWFrZVF1ZXVlTWV0cmljcyk7XG5jb25zdCBNZXRyaWNUeXBlID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgQ291bnRlcjogJ2NvdW50ZXInLFxuICBHYXVnZTogJ2dhdWdlJyxcbn0pO1xuLyoqXG4gKiBAdHlwZWRlZiBLZXJuZWxNZXRyaWNNZXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30ga2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHt7IGRpbWVuc2lvbjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH19IFtzdWJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnNlbnN1c11cbiAqIEBwcm9wZXJ0eSB7TWV0cmljVHlwZX0gbWV0cmljVHlwZVxuICovXG4vKiogQHR5cGUge09taXQ8S2VybmVsTWV0cmljTWV0YSwgJ21ldHJpY1R5cGUnPltdfSAqL1xuICAgICAgIGNvbnN0IEtFUk5FTF9TVEFUU19TVU1fTUVUUklDUyA9IFtcbiAge1xuICAgIGtleTogJ3N5c2NhbGxzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfYWxsX3N5c2NhbGxfdG90YWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsU2VuZCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdzZW5kJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IG1lc3NhZ2Ugc2VuZCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbENhbGxOb3cnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnY2FsbE5vdycgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBzeW5jaHJvbm91cyBkZXZpY2Uga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxTdWJzY3JpYmUnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnc3Vic2NyaWJlJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHByb21pc2Ugc3Vic2NyaXB0aW9uIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsUmVzb2x2ZScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdyZXNvbHZlJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHByb21pc2UgcmVzb2x1dGlvbiBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbEV4aXQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnZXhpdCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgZXhpdCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFZhdHN0b3JlR2V0JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3ZhdHN0b3JlR2V0JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdHN0b3JlIGdldCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFZhdHN0b3JlU2V0JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3ZhdHN0b3JlU2V0JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdHN0b3JlIHNldCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFZhdHN0b3JlR2V0TmV4dEtleScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICd2YXRzdG9yZUdldE5leHQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgZ2V0TmV4dEtleSBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFZhdHN0b3JlRGVsZXRlJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3ZhdHN0b3JlRGVsZXRlJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdHN0b3JlIGRlbGV0ZSBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbERyb3BJbXBvcnRzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ2Ryb3BJbXBvcnRzJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IGRyb3AgaW1wb3J0cyBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hlcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2Rpc3BhdGNoX3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hEZWxpdmVyJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZGlzcGF0Y2hfZGVsaXZlcl90b3RhbCcsXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0IG1lc3NhZ2UgZGVsaXZlcmllcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkaXNwYXRjaE5vdGlmeScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2Rpc3BhdGNoX25vdGlmeV90b3RhbCcsXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0IHByb21pc2Ugbm90aWZpY2F0aW9ucycsXG4gIH0sXG5dO1xuXG4vKiogQHR5cGUge09taXQ8S2VybmVsTWV0cmljTWV0YSwgJ21ldHJpY1R5cGUnPltdfSAqLyRozY9fb25jZS5LRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MoS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTKTtcbiAgICAgICBjb25zdCBLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MgPSBbXG4gIHtcbiAgICBrZXk6ICdrZXJuZWxPYmplY3RzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfa2VybmVsX29iamVjdHMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZlIGtlcm5lbCBvYmplY3RzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2tlcm5lbERldmljZXMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9rZXJuZWxfZGV2aWNlcycsXG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmUga2VybmVsIGRldmljZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna2VybmVsUHJvbWlzZXMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9rZXJuZWxfcHJvbWlzZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZlIGtlcm5lbCBwcm9taXNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrcFVucmVzb2x2ZWQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF91bnJlc29sdmVkX2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdVbnJlc29sdmVkIGtlcm5lbCBwcm9taXNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrcEZ1bGZpbGxlZCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2Z1bGZpbGxlZF9rZXJuZWxfcHJvbWlzZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnRnVsZmlsbGVkIGtlcm5lbCBwcm9taXNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrcFJlamVjdGVkJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfcmVqZWN0ZWRfa2VybmVsX3Byb21pc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ1JlamVjdGVkIGtlcm5lbCBwcm9taXNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdydW5RdWV1ZUxlbmd0aCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3J1bl9xdWV1ZV9sZW5ndGgnLFxuICAgIGNvbnNlbnN1czogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ0xlbmd0aCBvZiB0aGUga2VybmVsIHJ1biBxdWV1ZScsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdhY2NlcHRhbmNlUXVldWVMZW5ndGgnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9hY2NlcHRhbmNlX3F1ZXVlX2xlbmd0aCcsXG4gICAgY29uc2Vuc3VzOiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOiAnTGVuZ3RoIG9mIHRoZSBrZXJuZWwgYWNjZXB0YW5jZSBxdWV1ZScsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdwcm9taXNlUXVldWVzTGVuZ3RoJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfcHJvbWlzZV9xdWV1ZXNfbGVuZ3RoJyxcbiAgICBjb25zZW5zdXM6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdDb21iaW5lZCBsZW5ndGggb2YgYWxsIGtlcm5lbCBwcm9taXNlIHF1ZXVlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjbGlzdEVudHJpZXMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9jbGlzdF9lbnRyaWVzJyxcbiAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiBlbnRyaWVzIGluIHRoZSBrZXJuZWwgYy1saXN0JyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3ZhdHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF92YXRzJyxcbiAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiBhY3RpdmUgdmF0cycsXG4gIH0sXG5dOyRozY9fb25jZS5LRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MoS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTKTtcblxuY29uc3QgeyBDb3VudGVyLCBHYXVnZSB9ID0gTWV0cmljVHlwZTtcbi8qKiBAdHlwZSB7S2VybmVsTWV0cmljTWV0YVtdfSAqL1xuICAgICAgIGNvbnN0IEtFUk5FTF9TVEFUU19NRVRSSUNTID0gaGFyZGVuKFtcbiAgLi4uS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTLm1hcChtID0+ICh7IC4uLm0sIG1ldHJpY1R5cGU6IENvdW50ZXIgfSkpLFxuICAuLi5LRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MubWFwKG0gPT4gKHsgLi4ubSwgbWV0cmljVHlwZTogR2F1Z2UgfSkpLFxuXSk7XG5cbi8qIEVuc3VyZSBrZXJuZWwgc3RhdHMga2V5IHVuaXF1ZW5lc3MuKi8kaM2PX29uY2UuS0VSTkVMX1NUQVRTX01FVFJJQ1MoS0VSTkVMX1NUQVRTX01FVFJJQ1MpO1xuY29uc3Qga2VybmVsU3RhdHNLZXlzID0gbmV3IE1hcCgpO1xuZm9yIChjb25zdCB7IGtleSB9IG9mIEtFUk5FTF9TVEFUU19NRVRSSUNTKSB7XG4gIGtlcm5lbFN0YXRzS2V5cy5zZXQoa2V5LCAoa2VybmVsU3RhdHNLZXlzLmdldChrZXkpIHx8IDApICsgMSk7XG59XG5jb25zdCBkdXBsaWNhdGVLZXJuZWxTdGF0c0tleXMgPSBbLi4ua2VybmVsU3RhdHNLZXlzLmVudHJpZXMoKV0uZmxhdE1hcChcbiAgKFtrZXksIHZhbHVlXSkgPT4gKHZhbHVlID4gMSA/IFtrZXldIDogW10pLFxuKTtcbmlmIChkdXBsaWNhdGVLZXJuZWxTdGF0c0tleXMubGVuZ3RoID4gMCkge1xuICBjb25zdCBtc2cgPSBgRHVwbGljYXRlIGtlcm5lbCBzdGF0cyBrZXlzICR7SlNPTi5zdHJpbmdpZnkoZHVwbGljYXRlS2VybmVsU3RhdHNLZXlzKX1gO1xuICB0aHJvdyBFcnJvcihtc2cpO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiSElTVE9HUkFNX01FVFJJQ1MiOlsiSElTVE9HUkFNX01FVFJJQ1MiXSwiQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MiOlsiQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MiXSwiUXVldWVNZXRyaWNBc3BlY3QiOlsiUXVldWVNZXRyaWNBc3BlY3QiXSwibWFrZVF1ZXVlTWV0cmljc01ldGEiOlsibWFrZVF1ZXVlTWV0cmljc01ldGEiXSwibWFrZVF1ZXVlTWV0cmljcyI6WyJtYWtlUXVldWVNZXRyaWNzIl0sIktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyI6WyJLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MiXSwiS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTIjpbIktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyJdLCJLRVJORUxfU1RBVFNfTUVUUklDUyI6WyJLRVJORUxfU1RBVFNfTUVUUklDUyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACKuVrytg4AALYOAAArAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL25hdHVyYWwtc29ydC5qc3siaW1wb3J0cyI6WyIuL2pzLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibmF0dXJhbENvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwcm92aWRlTGF6eU1hcDskaM2PX2ltcG9ydHMoW1tcIi4vanMtdXRpbHMuanNcIiwgW1tcInByb3ZpZGVMYXp5TWFwXCIsWyRozY9fYSA9PiAocHJvdmlkZUxhenlNYXAgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBhXG4gKiBAcGFyYW0ge3N0cmluZ30gYlxuICogQHJldHVybnMgey0xIHwgMCB8IDF9XG4gKi9cbmNvbnN0IGNvbXBhcmVOYXRzID0gKGEsIGIpID0+IHtcbiAgLyogRGVmYXVsdCB0byBJRUVFIDc1NCBudW1iZXIgYXJpdGhtZXRpYyBmb3Igc3BlZWQsIGJ1dCBmYWxsIGJhY2sgb24gYmlnaW50Ki9cbiAgLyogYXJpdGhtZXRpYyB0byByZXNvbHZlIHRpZXMgYmVjYXVzZSBiaWcgbnVtYmVycyBjYW4gbG9zZSByZXNvbHV0aW9uKi9cbiAgLyogKHNvbWV0aW1lcyBldmVuIGJlY29taW5nIGluZmluaXRlKSBhbmQgdGhlbiB1bHRpbWF0ZWx5IG9uIGxlbmd0aCB0byByZXNvbHZlKi9cbiAgLyogdGllcyBieSBhc2NlbmRpbmcgY291bnQgb2YgbGVhZGluZyB6ZXJvcy4qL1xuICBjb25zdCBkaWZmID0gK2EgLSArYjtcbiAgY29uc3QgZmluaXRlRGlmZiA9XG4gICAgKE51bWJlci5pc0Zpbml0ZShkaWZmKSAmJiBkaWZmKSB8fFxuICAgIChhID09PSBiID8gMCA6IE51bWJlcihCaWdJbnQoYSkgLSBCaWdJbnQoYikpIHx8IGEubGVuZ3RoIC0gYi5sZW5ndGgpO1xuXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgdGhpcyBjYWxsIHJlYWxseSBkb2VzIHJldHVybiAtMSB8IDAgfCAxKi9cbiAgcmV0dXJuIE1hdGguc2lnbihmaW5pdGVEaWZmKTtcbn07XG5cbi8qIFRPRE86IGNvbXBhcmVCeUNvZGVQb2ludHMqL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMjAwOCovXG5cbmNvbnN0IGNvbXBhcmVTdHJpbmdzID0gKGEsIGIpID0+IChhID4gYiA/IDEgOiBhIDwgYiA/IC0xIDogMCk7XG5cbmNvbnN0IHJDYXB0dXJlRGlnaXRzID0gLyhbMC05XSspLztcblxuLyoqXG4gKiBTcGxpdHRpbmcgYnkgcmVndWxhciBleHByZXNzaW9uIGNhbiBiZSBleHBlbnNpdmU7IHdlIGRvbid0IHdhbnQgdG8gcmVwZWF0XG4gKiB0aGF0IGZvciBldmVyeSBjb21wYXJpc29uIGFnYWluc3QgdGhlIHNhbWUgc3RyaW5nLlxuICpcbiAqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmdbXT59XG4gKi9cbmNvbnN0IHBhcnRzQ2FjaGUgPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogUGVyZm9ybSBhIG11bHRpLWxldmVsIG5hdHVyYWwtc29ydCBjb21wYXJpc29uLCBmaW5kaW5nIHRoZSBkZWNpbWFsIGRpZ2l0XG4gKiBzZXF1ZW5jZXMgaW4gZWFjaCBvcGVyYW5kIGFuZCBjb21wYXJpbmcgZmlyc3QgYnkgZWFjaCAoW3Bvc3NpYmx5IGVtcHR5XVxuICogc3RyaW5nIHByZWZpeCwgaW50ZWdlcikgcGFpciBpbiB0dXJuLCB3aXRoIGEgZmluYWwgY29tcGFyaXNpb24gYnkgc3RyaW5nXG4gKiBzdWZmaXggYXMgbmVjZXNzYXJ5IChlLmcuLCBzb3J0aW5nICdrbzQyJyBiZWZvcmUgJ2tvMTAwJyBhcyBbJ2tvJywgNDJdIHZzLlxuICogWydrbycsIDEwMF0gYW5kICdwYXJlbnQxLmNoaWxkOCcgYmVmb3JlICdwYXJlbnQxLmNoaWxkMTAnIGFzIFsncGFyZW50JywgMSxcbiAqICdjaGlsZCcsIDhdIHZzLiBbJ3BhcmVudCcsIDEsICdjaGlsZCcsIDEwXSkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuICAgICAgIGNvbnN0IG5hdHVyYWxDb21wYXJlID0gKGEsIGIpID0+IHtcbiAgLyogV2Ugd2FudCB0byBtYWludGFpbiBhIGNhY2hlIG9ubHkgZm9yIHRoZSBkdXJhdGlvbiBvZiBlYWNoIGNhbGwgdG8qL1xuICAvKiBhcnJheS5zb3J0LCBhbmQgbGV2ZXJhZ2UgdGhlIHN5bmNocm9ub3VzIG5hdHVyZSBvZiB0aGF0IG1ldGhvZCBpbiB0aGUgZmlyc3QqL1xuICAvKiBpbnZvY2F0aW9uIG9mIGVhY2ggdHVybiAoaW5kaWNhdGVkIGJ5IGFuIGVtcHR5IGNhY2hlKSB0byBzY2hlZHVsZSBjYWNoZSovXG4gIC8qIGNsZWFyaW5nIGluIHRoZSAqbmV4dCogdHVybi4qL1xuICBpZiAoIXBhcnRzQ2FjaGUuc2l6ZSkgdm9pZCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHBhcnRzQ2FjaGUuY2xlYXIoKSk7XG5cbiAgY29uc3QgYVBhcnRzID0gcHJvdmlkZUxhenlNYXAocGFydHNDYWNoZSwgYSwgKCkgPT4gYS5zcGxpdChyQ2FwdHVyZURpZ2l0cykpO1xuICBjb25zdCBiUGFydHMgPSBwcm92aWRlTGF6eU1hcChwYXJ0c0NhY2hlLCBiLCAoKSA9PiBiLnNwbGl0KHJDYXB0dXJlRGlnaXRzKSk7XG5cbiAgLyogQW4gZXZlbiBpbmRleCBjb3JyZXNwb25kcyB3aXRoIGEgc3RyaW5nIHBhcnQ7IGFuIG9kZCBvbmUgd2l0aCBhIGRpZ2l0IHBhcnQuKi9cbiAgbGV0IGkgPSAwO1xuICBmb3IgKDsgaSArIDEgPCBhUGFydHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBpZiAoaSArIDEgPCBiUGFydHMubGVuZ3RoKSB7XG4gICAgICAvKiBCb3RoIGBhYCBhbmQgYGJgIGhhdmUgYSBkaWdpdCBwYXJ0IGhlcmUsIGJ1dCB3ZSBjb21wYXJlIHRoZSBwcmVjZWRpbmcqL1xuICAgICAgLyogc3RyaW5nIHBhcnQgZmlyc3QgaW4gY2FzZSB0aG9zZSBhcmUgdW5lcXVhbC4qL1xuICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgY29tcGFyZVN0cmluZ3MoYVBhcnRzW2ldLCBiUGFydHNbaV0pIHx8XG4gICAgICAgIGNvbXBhcmVOYXRzKGFQYXJ0c1tpICsgMV0sIGJQYXJ0c1tpICsgMV0pO1xuICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogQWZ0ZXIgYSAocG9zc2libHkgZW1wdHkpIGNvbW1vbiBwcmVmaXgsIGBhYCBoYXMgZGlnaXRzIHdoZXJlIGBiYCBkb2VzKi9cbiAgICAgIC8qIG5vdCwgc28gd2UgdXNlIHN0cmluZyBjb21wYXJpc29uIG9mIGAke2FTdHJpbmd9JHthRGlnaXRzfWAgdnMuKi9cbiAgICAgIC8qIGAke2JTdHJpbmd9YC4qL1xuICAgICAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKGAke2FQYXJ0c1tpXX0ke2FQYXJ0c1tpICsgMV19YCwgYlBhcnRzW2ldKTtcbiAgICB9XG4gIH1cbiAgaWYgKGJQYXJ0cy5sZW5ndGggPiBhUGFydHMubGVuZ3RoKSB7XG4gICAgLyogYGJgIGhhcyBkaWdpdHMgd2hlcmUgYGFgIGRvZXMgbm90LiovXG4gICAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKGFQYXJ0c1tpXSwgYCR7YlBhcnRzW2ldfSR7YlBhcnRzW2kgKyAxXX1gKTtcbiAgfVxuICAvKiBJZiBgYWAgYW5kIGBiYCBkaWZmZXIsIGl0J3Mgb25seSBpbiB0aGUgZmluYWwgc3RyaW5nIHN1ZmZpeC4qL1xuICByZXR1cm4gY29tcGFyZVN0cmluZ3MoYVBhcnRzW2ldLCBiUGFydHNbaV0pO1xufTskaM2PX29uY2UubmF0dXJhbENvbXBhcmUobmF0dXJhbENvbXBhcmUpO1xuaGFyZGVuKG5hdHVyYWxDb21wYXJlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdHVyYWxDb21wYXJlIjpbIm5hdHVyYWxDb21wYXJlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE/EJZdqSAAAakgAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvc2VzLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyIsIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vc3RyZWFtIiwiamVzc2llLmpzIiwiLi9qcy11dGlscy5qcyJdLCJleHBvcnRzIjpbIlByb21pc2VBbGxPckVycm9ycyIsImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiLCJhbGxWYWx1ZXMiLCJhc3NlcnRBbGxEZWZpbmVkIiwiYXR0ZW51YXRlIiwiZGVlcGx5RnVsZmlsbGVkT2JqZWN0IiwiZm9yZXZlciIsImZyb21VbmlxdWVFbnRyaWVzIiwibWFrZUxpbWl0ZWRDb25zb2xlIiwib2JqZWN0TWFwIiwib2JqZWN0TWV0YU1hcCIsInN0cmlwUHJlZml4Iiwic3luY2hyb25pemVkVGVlIiwidGhyb3dFcnJvckNvZGUiLCJ0cnlKc29uUGFyc2UiLCJ0cnlOb3ciLCJ1bnRpbFRydWUiLCJ3aGlsZVRydWUiLCJ3aXRoRGVmZXJyZWRDbGVhbnVwIiwiemlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgb2JqZWN0TWFwLG9iamVjdE1ldGFNYXAsZnJvbVVuaXF1ZUVudHJpZXMscSxiLEZhaWwsbWFrZUVycm9yLGFubm90YXRlRXJyb3IsWCxkZWVwbHlGdWxmaWxsZWQsaXNQcmltaXRpdmUsbWFrZVByb21pc2VLaXQsbWFrZVF1ZXVlLGFzeW5jR2VuZXJhdGUsbG9nTGV2ZWxzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSksJGjNj19saXZlW1wib2JqZWN0TWFwXCJdXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1ldGEtbWFwLmpzXCIsIFtbXCJvYmplY3RNZXRhTWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWV0YU1hcCA9ICRozY9fYSksJGjNj19saXZlW1wib2JqZWN0TWV0YU1hcFwiXV1dXV0sW1wiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanNcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpLCRozY9fbGl2ZVtcImZyb21VbmlxdWVFbnRyaWVzXCJdXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImJcIixbJGjNj19hID0+IChiID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLFskaM2PX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRozY9fYSldXSxbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9zdHJlYW1cIiwgW1tcIm1ha2VRdWV1ZVwiLFskaM2PX2EgPT4gKG1ha2VRdWV1ZSA9ICRozY9fYSldXV1dLFtcImplc3NpZS5qc1wiLCBbW1wiYXN5bmNHZW5lcmF0ZVwiLFskaM2PX2EgPT4gKGFzeW5jR2VuZXJhdGUgPSAkaM2PX2EpXV1dXSxbXCIuL2pzLXV0aWxzLmpzXCIsIFtbXCJsb2dMZXZlbHNcIixbJGjNj19hID0+IChsb2dMZXZlbHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGZyb21FbnRyaWVzLCBrZXlzLCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLyoqIEBwYXJhbSB7KGxldmVsOiBzdHJpbmcpID0+ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWR9IG1ha2VMb2dnZXIgKi9cbiAgICAgICBjb25zdCBtYWtlTGltaXRlZENvbnNvbGUgPSBtYWtlTG9nZ2VyID0+IHtcbiAgY29uc3QgbGltaXRlZENvbnNvbGUgPSAvKiogQHR5cGUge2FueX0gKi8gKFxuICAgIGZyb21FbnRyaWVzKGxvZ0xldmVscy5tYXAobGV2ZWwgPT4gW2xldmVsLCBtYWtlTG9nZ2VyKGxldmVsKV0pKVxuICApO1xuICByZXR1cm4gLyoqIEB0eXBlIHtMaW1pdGVkQ29uc29sZX0gKi8gKGhhcmRlbihsaW1pdGVkQ29uc29sZSkpO1xufTskaM2PX29uY2UubWFrZUxpbWl0ZWRDb25zb2xlKG1ha2VMaW1pdGVkQ29uc29sZSk7XG5oYXJkZW4obWFrZUxpbWl0ZWRDb25zb2xlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3sgW0tleVR5cGUgaW4ga2V5b2YgVF06IFRbS2V5VHlwZV0gfSAmIHt9fSBTaW1wbGlmeSBmbGF0dGVuIHRoZVxuICogICB0eXBlIG91dHB1dCB0byBpbXByb3ZlIHR5cGUgaGludHMgc2hvd24gaW4gZWRpdG9yc1xuICogICBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3NpbXBsaWZ5LmQudHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ2FsbGFibGUgPyBUW0tdIDogRGVlcGx5QXdhaXRlZDxUW0tdPjtcbiAqIH19IERlZXBseUF3YWl0ZWRPYmplY3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzIFByb21pc2VMaWtlPGFueT5cbiAqICAgICA/IEF3YWl0ZWQ8VD5cbiAqICAgICA6IFQgZXh0ZW5kcyBSZW1vdGFibGVCcmFuZDxhbnksIGFueT4gfCBSZW1vdGFibGVPYmplY3RcbiAqICAgICAgID8gVFxuICogICAgICAgOiBUIGV4dGVuZHMge31cbiAqICAgICAgICAgPyBTaW1wbGlmeTxEZWVwbHlBd2FpdGVkT2JqZWN0PFQ+PlxuICogICAgICAgICA6IEF3YWl0ZWQ8VD59IERlZXBseUF3YWl0ZWRcbiAqL1xuXG4vKipcbiAqIEEgbW9yZSBjb25zdHJhaW5lZCB2ZXJzaW9uIG9mIHtkZWVwbHlGdWxmaWxsZWR9IGZvciB0eXBlIHNhZmV0eSB1bnRpbFxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xMjU3IFVzZWZ1bCBpbiBzdGFydGluZyBjb250cmFjdHMgdGhhdFxuICogbmVlZCBhbGwgdGVybXMgdG8gYmUgZnVsZmlsbGVkIGluIG9yZGVyIHRvIGJlIGR1cmFibGUuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMge30+KHVuZnVsZmlsbGVkVGVybXM6IFQpID0+IFByb21pc2U8RGVlcGx5QXdhaXRlZDxUPj59XG4gKi9cbiAgICAgICBjb25zdCBkZWVwbHlGdWxmaWxsZWRPYmplY3QgPSBhc3luYyBvYmogPT4ge1xuICAhaXNQcmltaXRpdmUob2JqKSB8fCBGYWlsYHBhcmFtIG11c3QgYmUgYW4gb2JqZWN0YDtcbiAgcmV0dXJuIGRlZXBseUZ1bGZpbGxlZChvYmopO1xufTtcblxuLyoqXG4gKiBUb2xlcmF0ZSBhYnNlbmNlIG9mIEFnZ3JlZ2F0ZUVycm9yIGluIGUuZy4geHNuYXAuXG4gKlxuICogQHR5cGUgeyhlcnJvcnM6IEVycm9yW10sIG1lc3NhZ2U/OiBzdHJpbmcsIG9wdGlvbnM/OiBvYmplY3QpID0+IEVycm9yfVxuICovJGjNj19vbmNlLmRlZXBseUZ1bGZpbGxlZE9iamVjdChkZWVwbHlGdWxmaWxsZWRPYmplY3QpO1xuY29uc3QgbWFrZUFnZ3JlZ2F0ZUVycm9yID1cbiAgdHlwZW9mIEFnZ3JlZ2F0ZUVycm9yID09PSAnZnVuY3Rpb24nXG4gICAgPyAoZXJyb3JzLCBtZXNzYWdlLCBvcHRpb25zKSA9PiBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgOiAoZXJyb3JzLCBtZXNzYWdlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBtYWtlRXJyb3IobWVzc2FnZSA/PyAnbXVsdGlwbGUgZXJyb3JzJywgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICBlcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuLyoqXG4gKiBBc3NlcnQgdGhhdCBhIHN0cmluZyBoYXMgYSBwcmVmaXgsIGFuZCByZXR1cm4gdGhlIHBhcnQgdGhhdCBmb2xsb3dzIGl0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCBzdHJpcFByZWZpeCA9IChwcmVmaXgsIHN0cikgPT4ge1xuICBzdHIuc3RhcnRzV2l0aChwcmVmaXgpIHx8IEZhaWxgJHtzdHJ9IGlzIG1pc3NpbmcgcHJlZml4ICR7cShwcmVmaXgpfWA7XG4gIHJldHVybiBzdHIuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG59O1xuXG4vKipcbiAqIFRocm93IGFuIGVycm9yIHdpdGggYW4gb3duIFwiY29kZVwiIGRhdGEgcHJvcGVydHksIHN1cHBvcnRpbmcgaWRlbnRpZmljYXRpb25cbiAqIHdpdGhvdXQgcGFyc2luZyBgbWVzc2FnZWAuIE5vdGUgdGhhdCBzdWNoIGVycm9ycyBhcmUgbm90IFBhc3NhYmxlIGFuZCB0aHVzXG4gKiBjYW5ub3QgYXBwZWFyIGluc2lkZSBhIFBhc3NhYmxlIHN0cnVjdHVyZSwgYW5kIGV2ZW4gYXQgdG9wIGxldmVsIHRoZSBcImNvZGVcIlxuICogcHJvcGVydHkgd2lsbCBiZSBzaWxlbnRseSBkcm9wcGVkIGJ5IG1hcnNoYWxsaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBDb2RlXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8dHlwZW9mIG1ha2VFcnJvcj5bMF19IGRldGFpbHNcbiAqIEBwYXJhbSB7Q29kZX0gY29kZVxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPHR5cGVvZiBtYWtlRXJyb3I+WzJdICYge1xuICogICBjb25zdHJ1Y3Rvcj86IFBhcmFtZXRlcnM8dHlwZW9mIG1ha2VFcnJvcj5bMV07XG4gKiB9fSBbb3B0c11cbiAqLyRozY9fb25jZS5zdHJpcFByZWZpeChzdHJpcFByZWZpeCk7XG4gICAgICAgY29uc3QgdGhyb3dFcnJvckNvZGUgPSAoZGV0YWlscywgY29kZSwgb3B0cykgPT4ge1xuICBjb25zdCBlcnIgPSBtYWtlRXJyb3IoZGV0YWlscywgb3B0cz8uY29uc3RydWN0b3IsIHtcbiAgICAuLi5vcHRzLFxuICAgIHNhbml0aXplOiBmYWxzZSxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnIsICdjb2RlJywgeyB2YWx1ZTogY29kZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgaGFyZGVuKGVycik7XG4gIHRocm93IGVycjtcbn07XG5cbi8qKlxuICogU3luY2hyb251c2x5IGludm9rZSBhIGZ1bmN0aW9uIHdpdGggdGhlIG9wcG9ydHVuaXR5IHRvIGhhbmRsZSBhbnkgZXJyb3JcbiAqIHNpbWlsYXJseSB0byBhIFByb21pc2UgYGNhdGNoYCBjYWxsYmFjayAoZS5nLiwgc3Vic3RpdHV0aW5nIGEgbm9uLWVycm9yXG4gKiByZXR1cm5lZCB2YWx1ZSBvciB0aHJvd2luZyBhIHBvc3NpYmx5LW5ldyBlcnJvcikuIFRoaXMgaXMgdXNlZnVsIGZvciAoYW1vbmdcbiAqIG90aGVyIHRoaW5ncykgcmVwbGFjaW5nIGdlbmVyaWMgZXJyb3IgbWVzc2FnZXMgd2l0aCBzcGVjaWZpYyBvbmVzIChhcyBpblxuICoge0BzZWUgdHJ5SnNvblBhcnNlfSkuXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gRlxuICogQHRlbXBsYXRlIFtVPVJldHVyblR5cGU8Rj5dXG4gKiBAcGFyYW0ge0Z9IGZuIHRvIGludm9rZVxuICogQHBhcmFtIHsoZXJyOiBFcnJvcikgPT4gVX0gdHJhbnNmb3JtRXJyb3IgY2FsbGJhY2sgdG8gcmVjZWl2ZSBhbnkgZXJyb3IgZnJvbVxuICogICBpbnZva2luZyBgZm5gIGFuZCBlaXRoZXIgcmV0dXJuIGEgc3Vic3RpdHV0ZSB2YWx1ZSBvciB0aHJvdyBhIHBvdGVudGlhbGx5XG4gKiAgIG5ldyBlcnJvclxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEY+fSBhcmdzIGZvciBgZm5gXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTxGPiB8IFV9XG4gKi8kaM2PX29uY2UudGhyb3dFcnJvckNvZGUodGhyb3dFcnJvckNvZGUpO1xuICAgICAgIGNvbnN0IHRyeU5vdyA9IChmbiwgdHJhbnNmb3JtRXJyb3IsIC4uLmFyZ3MpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtRXJyb3IoZXJyKTtcbiAgICB9IGNhdGNoIChuZXdFcnIpIHtcbiAgICAgIC8qIFRyeSB0byBhc3NvY2lhdGUgYGVycmAgd2l0aCBgbmV3RXJyYC4qL1xuICAgICAgaWYgKCFuZXdFcnIuY2F1c2UpIHtcbiAgICAgICAgY29uc3QgZGVzYyA9IHtcbiAgICAgICAgICB2YWx1ZTogZXJyLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFSZWZsZWN0LmRlZmluZVByb3BlcnR5KG5ld0VyciwgJ2NhdXNlJywgZGVzYykpIHtcbiAgICAgICAgICBhc3NlcnQubm90ZShuZXdFcnIsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3RXJyO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBQYXJzZSBKU09OIHRleHQsIG9yIGhhbmRsZSBhbiBlcnJvciBieSBlLmcuIHN1YnN0aXR1dGluZyBhIGRlZmF1bHQgdmFsdWUgb3JcbiAqIHJlcGxhY2luZyBpdCB3aXRoIG9uZSBiZWFyaW5nIGEgbm9uLWdlbmVyaWMgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ganNvblRleHRcbiAqIEBwYXJhbSB7c3RyaW5nIHwgKChlcnI6IEVycm9yKSA9PiB1bmtub3duKX0gb25FcnJvciBhbiBlcnJvciBtZXNzYWdlIG9yXG4gKiAgIGNhbGxiYWNrXG4gKi8kaM2PX29uY2UudHJ5Tm93KHRyeU5vdyk7XG4gICAgICAgY29uc3QgdHJ5SnNvblBhcnNlID0gKGpzb25UZXh0LCBvbkVycm9yKSA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybUVycm9yID1cbiAgICB0eXBlb2Ygb25FcnJvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBvbkVycm9yXG4gICAgICA6IGVyciA9PiBGYWlsKFtgJHtvbkVycm9yfTogJHtlcnIubWVzc2FnZX0gZm9yIGlucHV0IGAsICcnXSwganNvblRleHQpO1xuICByZXR1cm4gdHJ5Tm93KCgpID0+IHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGpzb25UZXh0O1xuICAgIHR5cGUgPT09ICdzdHJpbmcnIHx8IEZhaWxgSW5wdXQgbXVzdCBiZSBhIHN0cmluZywgbm90ICR7Yih0eXBlKX1gO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25UZXh0KTtcbiAgfSwgdHJhbnNmb3JtRXJyb3IpO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtyZWFkb25seSAoVCB8IFByb21pc2VMaWtlPFQ+KVtdfSBpdGVtc1xuICogQHJldHVybnMge1Byb21pc2U8VFtdPn1cbiAqLyRozY9fb25jZS50cnlKc29uUGFyc2UodHJ5SnNvblBhcnNlKTtcbiAgICAgICBjb25zdCBQcm9taXNlQWxsT3JFcnJvcnMgPSBhc3luYyBpdGVtcyA9PiB7XG4gIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoaXRlbXMpLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgY29uc3QgZXJyb3JzID0gLyoqIEB0eXBlIHtQcm9taXNlUmVqZWN0ZWRSZXN1bHRbXX0gKi8gKFxuICAgICAgcmVzdWx0cy5maWx0ZXIoKHsgc3RhdHVzIH0pID0+IHN0YXR1cyA9PT0gJ3JlamVjdGVkJylcbiAgICApLm1hcChyZXN1bHQgPT4gcmVzdWx0LnJlYXNvbik7XG4gICAgaWYgKCFlcnJvcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtQcm9taXNlRnVsZmlsbGVkUmVzdWx0PFQ+W119ICovIChyZXN1bHRzKS5tYXAoXG4gICAgICAgIHJlc3VsdCA9PiByZXN1bHQudmFsdWUsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhyb3cgZXJyb3JzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBtYWtlQWdncmVnYXRlRXJyb3IoZXJyb3JzKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSB0cmllclxuICogQHBhcmFtIHsoZXJyb3I/OiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+fSBmaW5hbGl6ZXJcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHRyaWVyPn1cbiAqLyRozY9fb25jZS5Qcm9taXNlQWxsT3JFcnJvcnMoUHJvbWlzZUFsbE9yRXJyb3JzKTtcbiAgICAgICBjb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5ID0gYXN5bmMgKHRyaWVyLCBmaW5hbGl6ZXIpID0+XG4gIHRyaWVyKCkudGhlbihcbiAgICBhc3luYyByZXN1bHQgPT4gZmluYWxpemVyKCkudGhlbigoKSA9PiByZXN1bHQpLFxuICAgIGFzeW5jIHRyeUVycm9yID0+XG4gICAgICBmaW5hbGl6ZXIodHJ5RXJyb3IpXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgICgpID0+IHRyeUVycm9yLFxuICAgICAgICAgIGZpbmFsaXplRXJyb3IgPT4gbWFrZUFnZ3JlZ2F0ZUVycm9yKFt0cnlFcnJvciwgZmluYWxpemVFcnJvcl0pLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSksXG4gICk7XG5cbi8qKlxuICogUnVuIGEgZnVuY3Rpb24gd2l0aCB0aGUgYWJpbGl0eSB0byBkZWZlciBsYXN0LWluLWZpcnN0LW91dCBjbGVhbnVwIGNhbGxiYWNrcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoXG4gKiAgIGFkZENsZWFudXA6IChmbjogKGVycj86IHVua25vd24pID0+IFByb21pc2U8dm9pZD4pID0+IHZvaWQsXG4gKiApID0+IFByb21pc2U8VD59IGZuXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTxmbj59XG4gKi8kaM2PX29uY2UuYWdncmVnYXRlVHJ5RmluYWxseShhZ2dyZWdhdGVUcnlGaW5hbGx5KTtcbiAgICAgICBjb25zdCB3aXRoRGVmZXJyZWRDbGVhbnVwID0gYXN5bmMgZm4gPT4ge1xuICAvKiogQHR5cGUgeygoZXJyPzogdW5rbm93bikgPT4gdW5rbm93bilbXX0gKi9cbiAgY29uc3QgY2xlYW51cHNMSUZPID0gW107XG4gIC8qKiBAdHlwZSB7KGNsZWFudXA6IChlcnI/OiB1bmtub3duKSA9PiB1bmtub3duKSA9PiB2b2lkfSAqL1xuICBjb25zdCBhZGRDbGVhbnVwID0gY2xlYW51cCA9PiB7XG4gICAgY2xlYW51cHNMSUZPLnVuc2hpZnQoY2xlYW51cCk7XG4gIH07XG4gIC8qKiBAdHlwZSB7KGVycj86IHVua25vd24pID0+IFByb21pc2U8dm9pZD59ICovXG4gIGNvbnN0IGZpbmFsaXplciA9IGFzeW5jIGVyciA9PiB7XG4gICAgLyogUnVuIGVhY2ggY2xlYW51cCBpbiBpdHMgb3duIGlzb2xhdGVkIHN0YWNrLiovXG4gICAgY29uc3QgY2xlYW51cFJlc3VsdHMgPSBjbGVhbnVwc0xJRk8ubWFwKGFzeW5jIGNsZWFudXAgPT4ge1xuICAgICAgYXdhaXQgbnVsbDtcbiAgICAgIHJldHVybiBjbGVhbnVwKGVycik7XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZUFsbE9yRXJyb3JzKGNsZWFudXBSZXN1bHRzKTtcbiAgfTtcbiAgcmV0dXJuIGFnZ3JlZ2F0ZVRyeUZpbmFsbHkoKCkgPT4gZm4oYWRkQ2xlYW51cCksIGZpbmFsaXplcik7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFRcbiAqIEB0eXBlZGVmIHt7IFtQIGluIGtleW9mIFRdOiBFeGNsdWRlPFRbUF0sIHVuZGVmaW5lZD4gfX0gQWxsRGVmaW5lZFxuICovXG5cbi8qKlxuICogQ29uY2lzZSB3YXkgdG8gY2hlY2sgdmFsdWVzIGFyZSBhdmFpbGFibGUgZnJvbSBvYmplY3QgbGl0ZXJhbCBzaG9ydGhhbmQuXG4gKiBUaHJvd3MgZXJyb3IgbWVzc2FnZSB0byBzcGVjaWZ5IHRoZSBtaXNzaW5nIHZhbHVlcy5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKSA9PiBhc3NlcnRzIG9iaiBpcyBBbGxEZWZpbmVkPFQ+fVxuICogQHRocm93cyBpZiBhbnkgdmFsdWUgaW4gdGhlIG9iamVjdCBlbnRyaWVzIGlzIG5vdCBkZWZpbmVkXG4gKi8kaM2PX29uY2Uud2l0aERlZmVycmVkQ2xlYW51cCh3aXRoRGVmZXJyZWRDbGVhbnVwKTtcbiAgICAgICBjb25zdCBhc3NlcnRBbGxEZWZpbmVkID0gb2JqID0+IHtcbiAgY29uc3QgbWlzc2luZyA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWlzc2luZy5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICBGYWlsYG1pc3NpbmcgJHtxKG1pc3NpbmcpfWA7XG4gIH1cbn07XG5cbi8qKlxuICogQXR0ZW51YXRlIGBzcGVjaW1lbmAgdG8gb25seSBwcm9wZXJ0aWVzIGFsbG93ZWQgYnkgYHBlcm1pdGAuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UGVybWl0PFQ+fSBQXG4gKiBAcGFyYW0ge1R9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1B9IHBlcm1pdFxuICogQHBhcmFtIHs8VSwgU3ViUCBleHRlbmRzIFBlcm1pdDxVPj4oYXR0ZW51YXRpb246IFUsIHBlcm1pdDogU3ViUCkgPT4gVX0gW3RyYW5zZm9ybV1cbiAqICAgdXNlZCB0byByZXBsYWNlIHRoZSByZXN1bHRzIG9mIHJlY3Vyc2l2ZSBwaWNrcyAoYnV0IG5vdCBibGFua2V0IHBlcm1pdHMpXG4gKiBAcmV0dXJucyB7QXR0ZW51YXRlZDxULCBQPn1cbiAqLyRozY9fb25jZS5hc3NlcnRBbGxEZWZpbmVkKGFzc2VydEFsbERlZmluZWQpO1xuICAgICAgIGNvbnN0IGF0dGVudWF0ZSA9IChzcGVjaW1lbiwgcGVybWl0LCB0cmFuc2Zvcm0gPSB4ID0+IHgpID0+IHtcbiAgLyogRmFzdC1wYXRoIGZvciBubyBhdHRlbnVhdGlvbi4qL1xuICBpZiAocGVybWl0ID09PSB0cnVlIHx8IHR5cGVvZiBwZXJtaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7QXR0ZW51YXRlZDxULCBQPn0gKi8gKHNwZWNpbWVuKTtcbiAgfVxuXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IHBhdGggPSBbXTtcbiAgLyoqXG4gKiBAdGVtcGxhdGUgU3ViVFxuICogQHRlbXBsYXRlIHtFeGNsdWRlPFBlcm1pdDxTdWJUPiwgUHJpbWl0aXZlPn0gU3ViUFxuICogQHR5cGUgeyhzcGVjaW1lbjogU3ViVCwgcGVybWl0OiBTdWJQKSA9PiBBdHRlbnVhdGVkPFN1YlQsIFN1YlA+fVxuICovXG4gIGNvbnN0IGV4dHJhY3QgPSAoc3ViU3BlY2ltZW4sIHN1YlBlcm1pdCkgPT4ge1xuICAgIGlmIChzdWJQZXJtaXQgPT09IG51bGwgfHwgdHlwZW9mIHN1YlBlcm1pdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IHBhdGgubGVuZ3RoID09PSAwXG4gICAgICAgID8gRmFpbGBpbnZhbGlkIHBlcm1pdDogJHtxKHBlcm1pdCl9YFxuICAgICAgICA6IEZhaWxgaW52YWxpZCBwZXJtaXQgYXQgcGF0aCAke3EocGF0aCl9OiAke3Eoc3ViUGVybWl0KX1gO1xuICAgIH0gZWxzZSBpZiAoc3ViU3BlY2ltZW4gPT09IG51bGwgfHwgdHlwZW9mIHN1YlNwZWNpbWVuICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgcGF0aC5sZW5ndGggPT09IDBcbiAgICAgICAgPyBGYWlsYHNwZWNpbWVuIG11c3QgYmUgYW4gb2JqZWN0IGZvciBwZXJtaXQgJHtxKHBlcm1pdCl9YFxuICAgICAgICA6IEZhaWxgc3BlY2ltZW4gYXQgcGF0aCAke3EocGF0aCl9IG11c3QgYmUgYW4gb2JqZWN0IGZvciBwZXJtaXQgJHtxKHN1YlBlcm1pdCl9YDtcbiAgICB9XG4gICAgY29uc3QgcGlja3MgPSBPYmplY3QuZW50cmllcyhzdWJQZXJtaXQpLm1hcCgoW3N1YktleSwgZGVlcFBlcm1pdF0pID0+IHtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihzdWJTcGVjaW1lbiwgc3ViS2V5KSkge1xuICAgICAgICB0aHJvdyBGYWlsYHNwZWNpbWVuIGlzIG1pc3NpbmcgcGF0aCAke3EocGF0aC5jb25jYXQoc3ViS2V5KSl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlZXBTcGVjaW1lbiA9IFJlZmxlY3QuZ2V0KHN1YlNwZWNpbWVuLCBzdWJLZXkpO1xuICAgICAgaWYgKGRlZXBQZXJtaXQgPT09IHRydWUgfHwgdHlwZW9mIGRlZXBQZXJtaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBbc3ViS2V5LCBkZWVwU3BlY2ltZW5dO1xuICAgICAgfVxuICAgICAgcGF0aC5wdXNoKHN1YktleSk7XG4gICAgICBjb25zdCBleHRyYWN0ZWQgPSBleHRyYWN0KC8qKiBAdHlwZSB7YW55fSAqLyAoZGVlcFNwZWNpbWVuKSwgZGVlcFBlcm1pdCk7XG4gICAgICBjb25zdCBlbnRyeSA9IFtzdWJLZXksIGV4dHJhY3RlZF07XG4gICAgICBwYXRoLnBvcCgpO1xuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xuICAgIHJldHVybiB0cmFuc2Zvcm0oT2JqZWN0LmZyb21FbnRyaWVzKHBpY2tzKSwgc3ViUGVybWl0KTtcbiAgfTtcblxuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICByZXR1cm4gZXh0cmFjdChzcGVjaW1lbiwgcGVybWl0KTtcbn07XG5cbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8dW5kZWZpbmVkLCBuZXZlcj59ICovJGjNj19vbmNlLmF0dGVudWF0ZShhdHRlbnVhdGUpO1xuY29uc3Qgbm90RG9uZSA9IGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuXG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PG5ldmVyLCB2b2lkPn0gKi9cbmNvbnN0IGFsd2F5c0RvbmUgPSBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuXG4gICAgICAgY29uc3QgZm9yZXZlciA9IGFzeW5jR2VuZXJhdGUoKCkgPT4gbm90RG9uZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVH0gcHJvZHVjZSBUaGUgdmFsdWUgb2YgYGF3YWl0IHByb2R1Y2UoKWAgaXMgdXNlZCBmb3IgaXRzXG4gKiAgIHRydXRoaW5lc3MgdnMgZmFsc2luZXNzLiBJT1csIGl0IGlzIGNvZXJjZWQgdG8gYSBib29sZWFuIHNvIHRoZSBjYWxsZXIgbmVlZFxuICogICBub3QgYm90aGVyIGRvaW5nIHRoaXMgdGhlbXNlbHZlcy5cbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPEF3YWl0ZWQ8VD4+fVxuICovJGjNj19vbmNlLmZvcmV2ZXIoZm9yZXZlcik7XG4gICAgICAgY29uc3Qgd2hpbGVUcnVlID0gcHJvZHVjZSA9PlxuICBhc3luY0dlbmVyYXRlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHByb2R1Y2UoKTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gYWx3YXlzRG9uZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuICB9KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUfSBwcm9kdWNlIFRoZSB2YWx1ZSBvZiBgYXdhaXQgcHJvZHVjZSgpYCBpcyB1c2VkIGZvciBpdHNcbiAqICAgdHJ1dGhpbmVzcyB2cyBmYWxzaW5lc3MuIElPVywgaXQgaXMgY29lcmNlZCB0byBhIGJvb2xlYW4gc28gdGhlIGNhbGxlciBuZWVkXG4gKiAgIG5vdCBib3RoZXIgZG9pbmcgdGhpcyB0aGVtc2VsdmVzLlxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8QXdhaXRlZDxUPj59XG4gKi8kaM2PX29uY2Uud2hpbGVUcnVlKHdoaWxlVHJ1ZSk7XG4gICAgICAgY29uc3QgdW50aWxUcnVlID0gcHJvZHVjZSA9PlxuICBhc3luY0dlbmVyYXRlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHByb2R1Y2UoKTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBkb25lOiB0cnVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG4gIH0pO1xuXG4vKiogQHR5cGUgezxYLCBZPih4czogWFtdLCB5czogWVtdKSA9PiBbWCwgWV1bXX0gKi8kaM2PX29uY2UudW50aWxUcnVlKHVudGlsVHJ1ZSk7XG4gICAgICAgY29uc3QgemlwID0gKHhzLCB5cykgPT4gaGFyZGVuKHhzLm1hcCgoeCwgaSkgPT4gW3gsIHlzWytpXV0pKTtcblxuLyoqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBFUmVmPGFueT4+PihcbiAqICAgb2JqOiBULFxuICogKSA9PiBQcm9taXNlPHsgW0sgaW4ga2V5b2YgVF06IEF3YWl0ZWQ8VFtLXT4gfT59XG4gKi8kaM2PX29uY2UuemlwKHppcCk7XG4gICAgICAgY29uc3QgYWxsVmFsdWVzID0gYXN5bmMgb2JqID0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBQcm9taXNlLmFsbCh2YWx1ZXMob2JqKSk7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIHJldHVybiBoYXJkZW4oZnJvbUVudHJpZXMoemlwKGtleXMob2JqKSwgcmVzb2x2ZWQpKSk7XG59O1xuXG4vKipcbiAqIEEgdGVlIGltcGxlbWVudGF0aW9uIHdoZXJlIGFsbCByZWFkZXJzIGFyZSBzeW5jaHJvbml6ZWQgd2l0aCBlYWNoIG90aGVyLiBUaGV5XG4gKiBhbGwgY29uc3VtZSB0aGUgc291cmNlIHN0cmVhbSBpbiBsb2Nrc3RlcCwgYW5kIGFueSBvbmUgcmV0dXJuaW5nIG9yIHRocm93aW5nXG4gKiBlYXJseSB3aWxsIGFmZmVjdCB0aGUgb3RoZXJzLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtBc3luY0l0ZXJhdG9yPFQsIHZvaWQsIHZvaWQ+fSBzb3VyY2VTdHJlYW1cbiAqIEBwYXJhbSB7bnVtYmVyfSByZWFkZXJDb3VudFxuICovJGjNj19vbmNlLmFsbFZhbHVlcyhhbGxWYWx1ZXMpO1xuICAgICAgIGNvbnN0IHN5bmNocm9uaXplZFRlZSA9IChzb3VyY2VTdHJlYW0sIHJlYWRlckNvdW50KSA9PiB7XG4gIC8qKiBAdHlwZSB7SXRlcmF0b3JSZXR1cm5SZXN1bHQ8dm9pZD4gfCB1bmRlZmluZWR9ICovXG4gIGxldCBkb25lUmVzdWx0O1xuXG4gIC8qKlxuICogQHR5cGVkZWYge0l0ZXJhdG9yUmVzdWx0PFxuICogICAodmFsdWU6IFByb21pc2VMaWtlPEl0ZXJhdG9yUmVzdWx0PFQ+PikgPT4gdm9pZFxuICogPn0gUXVldWVQYXlsb2FkXG4gKi9cbiAgLyoqIEB0eXBlIHtBc3luY1F1ZXVlPFF1ZXVlUGF5bG9hZD5bXX0gKi9cbiAgY29uc3QgcXVldWVzID0gW107XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBjb25zdCBwdWxsTmV4dCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChxdWV1ZXMubWFwKHF1ZXVlID0+IHF1ZXVlLmdldCgpKSk7XG4gICAgY29uc3QgcmVqZWN0aW9ucyA9IFtdO1xuICAgIC8qKiBAdHlwZSB7QXJyYXk8KHZhbHVlOiBQcm9taXNlTGlrZTxJdGVyYXRvclJlc3VsdDxUPj4pID0+IHZvaWQ+fSAqL1xuICAgIGNvbnN0IHJlc29sdmVycyA9IFtdO1xuICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBzZXR0bGVkUmVzdWx0IG9mIHJlcXVlc3RzKSB7XG4gICAgICBpZiAoc2V0dGxlZFJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgcmVqZWN0aW9ucy5wdXNoKHNldHRsZWRSZXN1bHQucmVhc29uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbmUgfHw9ICEhc2V0dGxlZFJlc3VsdC52YWx1ZS5kb25lO1xuICAgICAgICByZXNvbHZlcnMucHVzaChzZXR0bGVkUmVzdWx0LnZhbHVlLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqIEB0eXBlIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+Pn0gKi9cbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChkb25lUmVzdWx0KSB7XG4gICAgICByZXN1bHQgPSBQcm9taXNlLnJlc29sdmUoZG9uZVJlc3VsdCk7XG4gICAgfSBlbHNlIGlmIChyZWplY3Rpb25zLmxlbmd0aCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBtYWtlRXJyb3IoWGBUZWVkIHN0cmVhbSB0aHJld2ApO1xuICAgICAgYW5ub3RhdGVFcnJvcihlcnJvciwgWGBUZWVkIHJlamVjdGlvbnM6ICR7cmVqZWN0aW9uc31gKTtcbiAgICAgIHJlc3VsdCA9XG4gICAgICAgIHNvdXJjZVN0cmVhbS50aHJvdz8uKGVycm9yKSB8fFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoc291cmNlU3RyZWFtLnJldHVybj8uKCkpLnRoZW4oKCkgPT5cbiAgICAgICAgICBQcm9taXNlLnJlamVjdChlcnJvciksXG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmIChkb25lKSB7XG4gICAgICByZXN1bHQgPVxuICAgICAgICBzb3VyY2VTdHJlYW0ucmV0dXJuPy4oKSB8fFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBzb3VyY2VTdHJlYW0ubmV4dCgpO1xuICAgIH1cbiAgICByZXN1bHQudGhlbihcbiAgICAgIHIgPT4ge1xuICAgICAgICBpZiAoci5kb25lKSB7XG4gICAgICAgICAgZG9uZVJlc3VsdCA9IHI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGRvbmVSZXN1bHQgPSB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHJlc29sdmUgb2YgcmVzb2x2ZXJzKSB7XG4gICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiBwdWxsTmV4dCgpO1xuICB9O1xuXG4gIGNvbnN0IHJlYWRlcnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiByZWFkZXJDb3VudCB9KS5tYXAoKCkgPT4ge1xuICAgIC8qKiBAdHlwZSB7QXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+fSAqL1xuICAgIGNvbnN0IHF1ZXVlID0gbWFrZVF1ZXVlKCk7XG4gICAgcXVldWVzLnB1c2gocXVldWUpO1xuXG4gICAgLyoqIEB0eXBlIHtBc3luY0dlbmVyYXRvcjxULCB2b2lkLCB2b2lkPn0gKi9cbiAgICBjb25zdCByZWFkZXIgPSBoYXJkZW4oe1xuICAgICAgYXN5bmMgbmV4dCgpIHtcbiAgICAgICAgLyoqXG4gKiBAdHlwZSB7UHJvbWlzZUtpdDxJdGVyYXRvclJlc3VsdDxUPj59XG4gKi9cbiAgICAgICAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgICBxdWV1ZS5wdXQoeyB2YWx1ZTogcmVzb2x2ZSwgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHJldHVybigpIHtcbiAgICAgICAgLyoqXG4gKiBAdHlwZSB7UHJvbWlzZUtpdDxJdGVyYXRvclJlc3VsdDxUPj59XG4gKi9cbiAgICAgICAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgICBxdWV1ZS5wdXQoeyB2YWx1ZTogcmVzb2x2ZSwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgdGhyb3cocmVhc29uKSB7XG4gICAgICAgIGNvbnN0IHJlamVjdGlvbiA9IFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIHF1ZXVlLnB1dChyZWplY3Rpb24pO1xuICAgICAgICByZXR1cm4gcmVqZWN0aW9uO1xuICAgICAgfSxcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRlcjtcbiAgICAgIH0sXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbiAgICAgIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcbiAgICAgICAgYXdhaXQgcmVhZGVyLnJldHVybigpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVhZGVyO1xuICB9KTtcblxuICB2b2lkIHB1bGxOZXh0KCk7XG4gIHJldHVybiByZWFkZXJzO1xufTskaM2PX29uY2Uuc3luY2hyb25pemVkVGVlKHN5bmNocm9uaXplZFRlZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJvYmplY3RNYXAiOlsib2JqZWN0TWFwIixmYWxzZV0sIm9iamVjdE1ldGFNYXAiOlsib2JqZWN0TWV0YU1hcCIsZmFsc2VdLCJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyIsZmFsc2VdfSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMaW1pdGVkQ29uc29sZSI6WyJtYWtlTGltaXRlZENvbnNvbGUiXSwiZGVlcGx5RnVsZmlsbGVkT2JqZWN0IjpbImRlZXBseUZ1bGZpbGxlZE9iamVjdCJdLCJzdHJpcFByZWZpeCI6WyJzdHJpcFByZWZpeCJdLCJ0aHJvd0Vycm9yQ29kZSI6WyJ0aHJvd0Vycm9yQ29kZSJdLCJ0cnlOb3ciOlsidHJ5Tm93Il0sInRyeUpzb25QYXJzZSI6WyJ0cnlKc29uUGFyc2UiXSwiUHJvbWlzZUFsbE9yRXJyb3JzIjpbIlByb21pc2VBbGxPckVycm9ycyJdLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IjpbImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiXSwid2l0aERlZmVycmVkQ2xlYW51cCI6WyJ3aXRoRGVmZXJyZWRDbGVhbnVwIl0sImFzc2VydEFsbERlZmluZWQiOlsiYXNzZXJ0QWxsRGVmaW5lZCJdLCJhdHRlbnVhdGUiOlsiYXR0ZW51YXRlIl0sImZvcmV2ZXIiOlsiZm9yZXZlciJdLCJ3aGlsZVRydWUiOlsid2hpbGVUcnVlIl0sInVudGlsVHJ1ZSI6WyJ1bnRpbFRydWUiXSwiemlwIjpbInppcCJdLCJhbGxWYWx1ZXMiOlsiYWxsVmFsdWVzIl0sInN5bmNocm9uaXplZFRlZSI6WyJzeW5jaHJvbml6ZWRUZWUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0d4N0JESAACREgAALAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90ZXN0aW5nLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJldmVudExvb3BJdGVyYXRpb24iLCJpbnNwZWN0TWFwU3RvcmUiLCJ0ZXN0SW50ZXJydXB0ZWRTdGVwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuLyoqXG4gKiBAZmlsZSBub3RlIHRoaXMgY2Fubm90IGJlIGNhbGxlZCB0ZXN0LXV0aWxzLmpzIGR1ZSB0b1xuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzc1MDNcbiAqL1xuLyogZ2xvYmFsIHNldEltbWVkaWF0ZSAqL1xuLyoqXG4gKiBAaW1wb3J0IHtNYXBTdG9yZX0gZnJvbSAnQGFnb3JpYy9zdG9yZSc7XG4gKiBAaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0IGFzIEF2YVR9IGZyb20gJ2F2YSc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9ldmVudHVhbC1zZW5kJztcbiAqL1xuXG4vKipcbiAqIEEgd29ya2Fyb3VuZCBmb3Igc29tZSBpc3N1ZXMgd2l0aCBmYWtlIHRpbWUgaW4gdGVzdHMuXG4gKlxuICogTGluZXMgb2YgdGVzdCBjb2RlIGNhbiBkZXBlbmQgb24gYXN5bmMgcHJvbWlzZXMgb3V0c2lkZSB0aGUgdGVzdCByZXNvbHZpbmdcbiAqIGJlZm9yZSB0aGV5IHJ1bi4gQXdhaXRpbmcgdGhpcyBmdW5jdGlvbiByZXN1bHQgZW5zdXJlcyB0aGF0IGFsbCBwcm9taXNlcyB0aGF0XG4gKiBjYW4gZG8gcmVzb2x2ZS4gTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBtZWFuIGFsbCBvdXRzdGFuZGluZyBwcm9taXNlcy5cbiAqL1xuICAgICAgIGNvbnN0IGV2ZW50TG9vcEl0ZXJhdGlvbiA9IGFzeW5jICgpID0+XG4gIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0SW1tZWRpYXRlKHJlc29sdmUpKTskaM2PX29uY2UuZXZlbnRMb29wSXRlcmF0aW9uKGV2ZW50TG9vcEl0ZXJhdGlvbik7XG5oYXJkZW4oZXZlbnRMb29wSXRlcmF0aW9uKTtcblxuLyoqIEB0eXBlIHsodmFsdWU6IGFueSkgPT4gc3RyaW5nfSAqL1xuY29uc3Qgc3RyaW5nT3JUYWcgPSB2YWx1ZSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ107XG4gIH1cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59O1xuLyoqXG4gKiBAcGFyYW0ge01hcFN0b3JlfSBzdG9yZVxuICogQHJldHVybnMge29iamVjdH0gdHJlZSBvZiB0aGUgY29udGVudHMgb2YgdGhlIHN0b3JlXG4gKi9cbiAgICAgICBjb25zdCBpbnNwZWN0TWFwU3RvcmUgPSBzdG9yZSA9PiB7XG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovXG4gIGNvbnN0IG9iaiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBzdG9yZS5rZXlzKCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHN0b3JlLmdldChrZXkpO1xuICAgIGNvbnN0IGhhc0tleXMgPVxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPSBudWxsICYmICdrZXlzJyBpbiB2YWx1ZTtcbiAgICBjb25zdCBpbmRleCA9IHN0cmluZ09yVGFnKGtleSk7XG4gICAgaWYgKGhhc0tleXMgJiYgJ2dldCcgaW4gdmFsdWUpIHtcbiAgICAgIG9ialtpbmRleF0gPSBpbnNwZWN0TWFwU3RvcmUodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoaGFzS2V5cykge1xuICAgICAgb2JqW2luZGV4XSA9IEFycmF5LmZyb20odmFsdWUua2V5cygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2luZGV4XSA9XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmIFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZVxuICAgICAgICAgID8gdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXVxuICAgICAgICAgIDogdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59OyRozY9fb25jZS5pbnNwZWN0TWFwU3RvcmUoaW5zcGVjdE1hcFN0b3JlKTtcbmhhcmRlbihpbnNwZWN0TWFwU3RvcmUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbSW5wdXQ9YW55XVxuICogQHR5cGVkZWYge3JlYWRvbmx5IFtcbiAqICAgc3RlcE5hbWU6IHN0cmluZyxcbiAqICAgZm46IChpbnB1dDogUGFydGlhbDxJbnB1dD4sIGxhYmVsOiBzdHJpbmcpID0+IFBhcnRpYWw8SW5wdXQ+IHwgUHJvbWlzZUxpa2U8UGFydGlhbDxJbnB1dD4+LFxuICogXX0gVGVzdFN0ZXBcbiAqL1xuXG4vKipcbiAqIEZvciBlYWNoIHN0ZXAsIHJ1biB0byBqdXN0IGJlZm9yZSB0aGF0IHBvaW50IGFuZCBwYXVzZSBmb3IgY29udGludWF0aW9uIGFmdGVyXG4gKiBpbnRlcnJ1cHQuXG4gKlxuICogQHRlbXBsYXRlIFtJbnB1dD1hbnldXG4gKiBAdGVtcGxhdGUgW0NvbnRleHQ9dW5rbm93bl1cbiAqIEBwYXJhbSB7QXZhVDxDb250ZXh0Pn0gdFxuICogQHBhcmFtIHtyZWFkb25seSBUZXN0U3RlcDxJbnB1dD5bXX0gYWxsU3RlcHNcbiAqIEBwYXJhbSB7KHQ6IEF2YVQ8Q29udGV4dD4pID0+IEVSZWY8dm9pZD59IFtkb0ludGVycnVwdF1cbiAqL1xuICAgICAgIGNvbnN0IHRlc3RJbnRlcnJ1cHRlZFN0ZXBzID0gYXN5bmMgKHQsIGFsbFN0ZXBzLCBkb0ludGVycnVwdCkgPT4ge1xuICAvKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGxhYmVsOiBzdHJpbmc7XG4gKiAgIGFjY3VtOiBQYXJ0aWFsPElucHV0PjtcbiAqIH19IFJ1blN0YXRlXG4gKi9cblxuICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHBhcmFtIHtyZWFkb25seSBUZXN0U3RlcDxJbnB1dD5bXX0gc3RlcHNcbiAqIEBwYXJhbSB7UnVuU3RhdGV9IFtydW5TdGF0ZV1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFJ1blN0YXRlPn1cbiAqL1xuICBjb25zdCBydW5TdGVwcyA9IGFzeW5jIChsYWJlbCwgc3RlcHMsIHJ1blN0YXRlID0geyBsYWJlbCwgYWNjdW06IHt9IH0pID0+IHtcbiAgICBhd2FpdCBudWxsO1xuICAgIGxldCBhY2N1bSA9IHJ1blN0YXRlLmFjY3VtO1xuICAgIGNvbnN0IHJ1bkxhYmVsID0gcnVuU3RhdGUubGFiZWw7XG4gICAgZm9yIChjb25zdCBbc3RlcE5hbWUsIGZuXSBvZiBzdGVwcykge1xuICAgICAgYXdhaXQgdC5ub3RUaHJvd3NBc3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGFjY3VtID0gYXdhaXQgZm4oYWNjdW0sIHJ1bkxhYmVsKTtcbiAgICAgIH0sIGAke2xhYmVsfSAke3N0ZXBOYW1lfSBtdXN0IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseWApO1xuICAgIH1cbiAgICByZXR1cm4geyBsYWJlbDogcnVuTGFiZWwsIGFjY3VtIH07XG4gIH07XG5cbiAgLyogU2FuaXR5IGNoZWNrKi9cbiAgYXdhaXQgcnVuU3RlcHMoJ3ByZS1pbnRlcnJ1cHQnLCBhbGxTdGVwcyk7XG4gIGlmICghZG9JbnRlcnJ1cHQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAqIEB0eXBlIHt7XG4gKiAgIHJ1blN0YXRlOiBSdW5TdGF0ZTtcbiAqICAgcmVtYWluaW5nU3RlcHM6IHJlYWRvbmx5IFRlc3RTdGVwPElucHV0PltdO1xuICogfVtdfVxuICovXG4gIGNvbnN0IHBhdXNlZFJ1bnMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxTdGVwcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IFtiZWZvcmVTdGVwTmFtZV0gPSBhbGxTdGVwc1tpXTtcbiAgICBjb25zdCBydW5TdGF0ZSA9IGF3YWl0IHJ1blN0ZXBzKFxuICAgICAgYHByZS0ke2JlZm9yZVN0ZXBOYW1lfWAsXG4gICAgICBhbGxTdGVwcy5zbGljZSgwLCBpKSxcbiAgICAgIHsgbGFiZWw6IGBwYXVzZS1iZWZvcmUtJHtiZWZvcmVTdGVwTmFtZX1gLCBhY2N1bToge30gfSxcbiAgICApO1xuICAgIHBhdXNlZFJ1bnMucHVzaCh7IHJ1blN0YXRlLCByZW1haW5pbmdTdGVwczogYWxsU3RlcHMuc2xpY2UoaSkgfSk7XG4gIH1cblxuICAvKiBSdW4gdGhlIHVzZXIgY29kZSB0aGF0IGludGVycnVwdHMgdGhlIHN0ZXBzLiovXG4gIGF3YWl0IGRvSW50ZXJydXB0KHQpO1xuXG4gIC8qIFZlcmlmeSBhIGNvbXBsZXRlIHJ1biBwb3N0LWludGVycnVwdC4qL1xuICBhd2FpdCBydW5TdGVwcygncG9zdC1pbnRlcnJ1cHQnLCBhbGxTdGVwcyk7XG5cbiAgLyogVmVyaWZ5IGNvbXBsZXRpb24gb2YgZWFjaCBwYXVzZWQgc3RlcC4qL1xuICBmb3IgKGNvbnN0IHsgcnVuU3RhdGUsIHJlbWFpbmluZ1N0ZXBzIH0gb2YgcGF1c2VkUnVucykge1xuICAgIGNvbnN0IFtiZWZvcmVTdGVwTmFtZV0gPSByZW1haW5pbmdTdGVwc1swXTtcbiAgICBhd2FpdCBydW5TdGVwcyhgcmVzdW1lZC0ke2JlZm9yZVN0ZXBOYW1lfWAsIHJlbWFpbmluZ1N0ZXBzLCBydW5TdGF0ZSk7XG4gIH1cbn07JGjNj19vbmNlLnRlc3RJbnRlcnJ1cHRlZFN0ZXBzKHRlc3RJbnRlcnJ1cHRlZFN0ZXBzKTtcbmhhcmRlbih0ZXN0SW50ZXJydXB0ZWRTdGVwcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJldmVudExvb3BJdGVyYXRpb24iOlsiZXZlbnRMb29wSXRlcmF0aW9uIl0sImluc3BlY3RNYXBTdG9yZSI6WyJpbnNwZWN0TWFwU3RvcmUiXSwidGVzdEludGVycnVwdGVkU3RlcHMiOlsidGVzdEludGVycnVwdGVkU3RlcHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2ojbK9YDAADWAwAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90bXBEaXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VUZW1wRGlyRmFjdG9yeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKipcbiAqIENyZWF0ZSBhIGB0bXBEaXJgIGZ1bmN0aW9uIHRoYXQgc3luY2hyb25vdXNseSBjcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeVxuICogYW5kIGEgZnVuY3Rpb24gZm9yIGRlbGV0aW5nIGl0IGFsb25nIHdpdGggYW55IGFkZGVkIGNvbnRlbnRzLlxuICpcbiAqIEBwYXJhbSB7UGljazxJTVBPUlQoJ3RtcCcpLCAnZGlyU3luYyc+fSB0bXBcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VUZW1wRGlyRmFjdG9yeSA9IHRtcCA9PiB7XG4gIC8qKiBAdHlwZSB7KHByZWZpeD86IHN0cmluZykgPT4gW2Rpck5hbWU6IHN0cmluZywgY2xlYW51cDogKCkgPT4gdm9pZF19ICovXG4gIGNvbnN0IHRtcERpciA9IHByZWZpeCA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCByZW1vdmVDYWxsYmFjayB9ID0gdG1wLmRpclN5bmMoe1xuICAgICAgcHJlZml4LFxuICAgICAgdW5zYWZlQ2xlYW51cDogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gW25hbWUsIHJlbW92ZUNhbGxiYWNrXTtcbiAgfTtcbiAgcmV0dXJuIHRtcERpcjtcbn07JGjNj19vbmNlLm1ha2VUZW1wRGlyRmFjdG9yeShtYWtlVGVtcERpckZhY3RvcnkpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRlbXBEaXJGYWN0b3J5IjpbIm1ha2VUZW1wRGlyRmFjdG9yeSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABOYqeWoQQAAKEEAAAoAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVDaGVjay5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImNhc3QiLCJtdXN0TWF0Y2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCB0eXBlbGVzc011c3RNYXRjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+ICh0eXBlbGVzc011c3RNYXRjaCA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAaW1wb3J0IHtNdXN0TWF0Y2gsIFBhdHRlcm5UeXBlLCBUeXBlZFBhdHRlcm59IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKiBAdHlwZSB7TXVzdE1hdGNofSAqL1xuICAgICAgIGNvbnN0IG11c3RNYXRjaCA9IHR5cGVsZXNzTXVzdE1hdGNoO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBNXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1R5cGVkUGF0dGVybjxNPn0gcGF0dFxuICogQHJldHVybnMge019XG4gKi8kaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7XG4gICAgICAgY29uc3QgY2FzdCA9IChzcGVjaW1lbiwgcGF0dCkgPT4ge1xuICAvKiBtdXN0TWF0Y2ggdGhyb3dzIGlmIHRoZXkgZG9uJ3QsIHdoaWNoIG1lYW5zIHRoYXQgYGNhc3RgIGFsc28gbmFycm93cyB0aGUqL1xuICAvKiB0eXBlIGJ1dCBhIGZ1bmN0aW9uIGNhbid0IGJvdGggbmFycm93IGFuZCByZXR1cm4gYSB0eXBlLiBUaGF0IGlzIGJ5IGRlc2lnbjoqL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzM0NjM2I2lzc3VlY29tbWVudC01NDUwMjU5MTYqL1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIHBhdHQpO1xuICByZXR1cm4gc3BlY2ltZW47XG59OyRozY9fb25jZS5jYXN0KGNhc3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJjYXN0IjpbImNhc3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAq3x1xKMFAACjBQAAKQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiQnJpZGdlQmlnSW50U2hhcGUiLCJTdG9yYWdlTm9kZVNoYXBlIiwiVW5ndWFyZGVkSGVscGVySSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE07JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuICAgICAgIGNvbnN0IFN0b3JhZ2VOb2RlU2hhcGUgPSBNLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKTtcblxuLyoqIFRvIGJlIHVzZWQgb25seSBmb3IgJ2hlbHBlcicgZmFjZXRzIHdoZXJlIHRoZSBjYWxscyBhcmUgZnJvbSB0cnVzdGVkIGNvZGUuICovJGjNj19vbmNlLlN0b3JhZ2VOb2RlU2hhcGUoU3RvcmFnZU5vZGVTaGFwZSk7XG4gICAgICAgY29uc3QgVW5ndWFyZGVkSGVscGVySSA9IE0uaW50ZXJmYWNlKFxuICAnaGVscGVyJyxcbiAge30sXG4gIC8qIG5vdCBleHBvc2VkIHNvIHVzaW5nIGBkZWZhdWx0R3VhcmRzYCBpcyBmaW5lLiovXG4gIHsgZGVmYXVsdEd1YXJkczogJ3Bhc3NhYmxlJyB9LFxuKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7bnVtYmVyIHwgYCR7YmlnaW50fWB9IEJyaWRnZUJpZ0ludCBFbnN1cmUgdGhhdCBjYWxsZWVzIHBhc3NlZCBhXG4gKiAgIGJyaWRnZSBtZXNzYWdlIHRoYXQgd2FzIHNlcmlhbGlzZWQgZnJvbSBhIEdvbGFuZyBpbnQ2NCBvciB1aW50NjQgYWNjZXB0XG4gKiAgIGVpdGhlciBhIEpTIG51bWJlciBvciBhIHN0cmluZ2lmaWVkIEpTIGJpZ2ludC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtUeXBlZFBhdHRlcm48QnJpZGdlQmlnSW50Pn1cbiAqLyRozY9fb25jZS5Vbmd1YXJkZWRIZWxwZXJJKFVuZ3VhcmRlZEhlbHBlckkpO1xuICAgICAgIGNvbnN0IEJyaWRnZUJpZ0ludFNoYXBlID0gTS5vcihNLm51bWJlcigpLCBNLnN0cmluZygpKTskaM2PX29uY2UuQnJpZGdlQmlnSW50U2hhcGUoQnJpZGdlQmlnSW50U2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiU3RvcmFnZU5vZGVTaGFwZSI6WyJTdG9yYWdlTm9kZVNoYXBlIl0sIlVuZ3VhcmRlZEhlbHBlckkiOlsiVW5ndWFyZGVkSGVscGVySSJdLCJCcmlkZ2VCaWdJbnRTaGFwZSI6WyJCcmlkZ2VCaWdJbnRTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANeHGT1wDAAAcAwAACoAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXBncmFkZS1hcGkuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlIiwiaXNBYmFuZG9uZWRFcnJvciIsImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNLG1hdGNoZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGlzRnJvemVuIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIHVzZSBhcyB0aGUgcmVqZWN0aW9uIHJlYXNvbiBvZiBwcm9taXNlcyBhYmFuZG9uZWQgYnlcbiAqIHVwZ3JhZGUuXG4gKlxuICogQHR5cGVkZWYge3tcbiAqICAgbmFtZTogJ3ZhdFVwZ3JhZGVkJztcbiAqICAgdXBncmFkZU1lc3NhZ2U6IHN0cmluZztcbiAqICAgaW5jYXJuYXRpb25OdW1iZXI6IG51bWJlcjtcbiAqIH19IFVwZ3JhZGVEaXNjb25uZWN0aW9uXG4gKi9cblxuICAgICAgIGNvbnN0IFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUgPSBoYXJkZW4oe1xuICBuYW1lOiAndmF0VXBncmFkZWQnLFxuICB1cGdyYWRlTWVzc2FnZTogTS5zdHJpbmcoKSxcbiAgaW5jYXJuYXRpb25OdW1iZXI6IE0ubnVtYmVyKCksXG59KTtcblxuLyoqXG4gKiBNYWtlcyBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgdXNlIGFzIHRoZSByZWplY3Rpb24gcmVhc29uIG9mIHByb21pc2VzXG4gKiBhYmFuZG9uZWQgYnkgdXBncmFkZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXBncmFkZU1lc3NhZ2VcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b0luY2FybmF0aW9uTnVtYmVyXG4gKiBAcmV0dXJucyB7VXBncmFkZURpc2Nvbm5lY3Rpb259XG4gKi8kaM2PX29uY2UuVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZShVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24gPSAodXBncmFkZU1lc3NhZ2UsIHRvSW5jYXJuYXRpb25OdW1iZXIpID0+XG4gIGhhcmRlbih7XG4gICAgbmFtZTogJ3ZhdFVwZ3JhZGVkJyxcbiAgICB1cGdyYWRlTWVzc2FnZSxcbiAgICBpbmNhcm5hdGlvbk51bWJlcjogdG9JbmNhcm5hdGlvbk51bWJlcixcbiAgfSk7JGjNj19vbmNlLm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbihtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuaGFyZGVuKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHJlYXNvbiBJZiBgcmVhc29uYCBpcyBub3QgZnJvemVuLCBpdCBjYW5ub3QgYmUgYW5cbiAqICAgVXBncmFkZURpc2Nvbm5lY3Rpb24sIHNvIHJldHVybnMgZmFsc2Ugd2l0aG91dCBldmVuIGNoZWNraW5nIGFnYWluc3QgdGhlXG4gKiAgIHNoYXBlLlxuICogQHJldHVybnMge3JlYXNvbiBpcyBVcGdyYWRlRGlzY29ubmVjdGlvbn1cbiAqL1xuICAgICAgIGNvbnN0IGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSByZWFzb24gPT5cbiAgcmVhc29uICE9IG51bGwgJiYgLyogZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXEqL1xuICBpc0Zyb3plbihyZWFzb24pICYmXG4gIG1hdGNoZXMocmVhc29uLCBVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKTskaM2PX29uY2UuaXNVcGdyYWRlRGlzY29ubmVjdGlvbihpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKTtcbmhhcmRlbihpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgYSByZWFzb24gaXMgYSAndmF0IHRlcm1pbmF0ZWQnIGVycm9yIGdlbmVyYXRlZCB3aGVuIGFuIG9iamVjdFxuICogaXMgYWJhbmRvbmVkIGJ5IGEgdmF0IGR1cmluZyBhbiB1cGdyYWRlLlxuICpcbiAqIE5vcm1hbGx5IHdlIGRvIG5vdCB3YW50IHRvIHJlbHkgb24gdGhlIGBtZXNzYWdlYCBvZiBhbiBlcnJvciBvYmplY3QsIGJ1dCB0aGlzXG4gKiBpcyBhIHByYWdtYXRpYyBzb2x1dGlvbiB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB2YXQgdXBncmFkZSBlcnJvcnMuIEluIHRoZVxuICogZnV0dXJlIHdlJ2QgcHJlZmVyIGhhdmluZyBhbiBlcnJvciB3aXRoIGEgY2F1c2UgcmVmZXJlbmNpbmcgYSBkaXNjb25uZWN0aW9uXG4gKiBvYmplY3QgbGlrZSBmb3IgcHJvbWlzZSByZWplY3Rpb25zLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOTU4MlxuICpcbiAqIEBwYXJhbSB7YW55fSByZWFzb25cbiAqIEByZXR1cm5zIHtyZWFzb24gaXMgRXJyb3J9XG4gKi9cbiAgICAgICBjb25zdCBpc0FiYW5kb25lZEVycm9yID0gcmVhc29uID0+XG4gIHJlYXNvbiAhPSBudWxsICYmIC8qIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxKi9cbiAgaXNGcm96ZW4ocmVhc29uKSAmJlxuICBtYXRjaGVzKHJlYXNvbiwgTS5lcnJvcigpKSAmJlxuICAvKiBXZSdyZSBub3QgdXNpbmcgYSBjb25zdGFudCBoZXJlIHNpbmNlIHRoaXMgc3BlY2lhbCB2YWx1ZSBpcyBhbHJlYWR5Ki9cbiAgLyogc3ByaW5rbGVkIHRocm91Z2hvdXQgdGhlIFNESyovXG4gIHJlYXNvbi5tZXNzYWdlID09PSAndmF0IHRlcm1pbmF0ZWQnOyRozY9fb25jZS5pc0FiYW5kb25lZEVycm9yKGlzQWJhbmRvbmVkRXJyb3IpO1xuaGFyZGVuKGlzQWJhbmRvbmVkRXJyb3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSI6WyJVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlIl0sIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiI6WyJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiI6WyJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIl0sImlzQWJhbmRvbmVkRXJyb3IiOlsiaXNBYmFuZG9uZWRFcnJvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA/4UE8GRQAABkUAAAzAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxzdWJzY3JpYmVMYXRlc3Q7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0Jhc2VOb3RpZmllciwgSXRlcmF0aW9uT2JzZXJ2ZXIsIExhdGVzdFRvcGljfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBzdWJzY3JpYmVMYXRlc3RgIGZyb20gYEBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzYCBpbnN0ZWFkLlxuICpcbiAqIEFkYXB0b3IgZnJvbSBhIG5vdGlmaWVyUCB0byBhbiBhc3luYyBpdGVyYWJsZS5cbiAqIFRoZSBub3RpZmllclAgY2FuIGJlIGFueSBvYmplY3QgdGhhdCBoYXMgYW4gZXZlbnR1YWxseSBpbnZvY2FibGVcbiAqIGBnZXRVcGRhdGVTaW5jZWAgbWV0aG9kIHRoYXQgYmVoYXZlcyBhY2NvcmRpbmcgdG8gdGhlIG5vdGlmaWVyXG4gKiBzcGVjLiBUaGlzIGNhbiBiZSBhIG5vdGlmaWVyLCBhIHByb21pc2UgZm9yIGEgbG9jYWwgb3IgcmVtb3RlXG4gKiBub3RpZmllciwgb3IgYSBwcmVzZW5jZSBvZiBhIHJlbW90ZSBub3RpZmllci5cbiAqXG4gKiBJdCBpcyBhbHNvIHVzZWQgaW50ZXJuYWxseSBieSBub3RpZmllci5qcyBzbyB0aGF0IGEgbm90aWZpZXIgaXRzZWxmIGlzIGFuXG4gKiBhc3luYyBpdGVyYWJsZS5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYWJsZSBpcyBhbiBvYmplY3Qgd2l0aCBhIGBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClgIG1ldGhvZFxuICogdGhhdCByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhdG9yLiBUaGUgYXN5bmMgaXRlcmF0b3Igd2UgcmV0dXJuIGhlcmUgaGFzIG9ubHlcbiAqIGEgYG5leHQoKWAgbWV0aG9kLCB3aXRob3V0IHRoZSBvcHRpb25hbCBgcmV0dXJuYCBhbmQgYHRocm93YCBtZXRob2RzLiBUaGVcbiAqIG9taXR0ZWQgbWV0aG9kcywgaWYgcHJlc2VudCwgd291bGQgYmUgdXNlZCBieSB0aGUgZm9yL2F3YWl0L29mIGxvb3AgdG9cbiAqIGluZm9ybSB0aGUgaXRlcmF0b3Igb2YgZWFybHkgdGVybWluYXRpb24uIEJ1dCB0aGlzIGFkYXB0b3Igd291bGQgbm90IGRvXG4gKiBhbnl0aGluZyB1c2VmdWwgaW4gcmVhY3Rpb24gdG8gdGhpcyBub3RpZmljYXRpb24uXG4gKlxuICogQW4gYXN5bmMgaXRlcmF0b3IncyBgbmV4dCgpYCBtZXRob2QgcmV0dXJucyBhIHByb21pc2UgZm9yIGFuIGl0ZXJhdGlvblxuICogcmVzdWx0LiBBbiBpdGVyYXRpb24gcmVzdWx0IGlzIGEgcmVjb3JkIHdpdGggYHZhbHVlYCBhbmQgYGRvbmVgIHByb3BlcnRpZXMuXG4gKlxuICogVGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgb24gdGhlIG5vdGlmaWVyIHByb3RvY29sIGlzIHRvIGhhdmUgYSBsb3NzeVxuICogYWRhcHRvciwgd2hlcmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgY2FuIGJlIG1pc3NlZCBpbiBmYXZvciBvZiBtb3JlIHJlY2VudFxuICogcmVzdWx0cyB3aGljaCBhcmUgdGhlcmVmb3JlIGxlc3Mgc3RhbGUuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9kb2N1bWVudGF0aW9uL2Jsb2IvSEVBRC9tYWluL2d1aWRlcy9qcy1wcm9ncmFtbWluZy9ub3RpZmllcnMubWRcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEJhc2VOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyID0gc3Vic2NyaWJlTGF0ZXN0O1xuXG4vKipcbiAqIFRoaXMgYWR2YW5jZXMgYGFzeW5jSXRlcmF0b3JQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0b3JgIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmF0b3I8VD4+fSBhc3luY0l0ZXJhdG9yUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaM2PX29uY2UubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIpO1xuICAgICAgIGNvbnN0IG9ic2VydmVJdGVyYXRvciA9IChhc3luY0l0ZXJhdG9yUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChhY2ssIG9ic2VydmVyRXJyb3IpID0+IHtcbiAgICBjb25zdCByZWN1ciA9ICgpID0+IHtcbiAgICAgIEUud2hlbihcbiAgICAgICAgRShhc3luY0l0ZXJhdG9yUCkubmV4dCgpLFxuICAgICAgICAoeyB2YWx1ZSwgZG9uZSB9KSA9PiB7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIGl0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCAmJiBpdGVyYXRpb25PYnNlcnZlci5maW5pc2godmFsdWUpO1xuICAgICAgICAgICAgYWNrKHVuZGVmaW5lZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlICYmXG4gICAgICAgICAgICAgIGl0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbiAgICAgICAgICAgIHJlY3VyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWFzb24gPT4ge1xuICAgICAgICAgIGl0ZXJhdGlvbk9ic2VydmVyLmZhaWwgJiYgaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbChyZWFzb24pO1xuICAgICAgICAgIGFjayh1bmRlZmluZWQpO1xuICAgICAgICB9LFxuICAgICAgKS5jYXRjaChvYnNlcnZlckVycm9yKTtcbiAgICB9O1xuICAgIHJlY3VyKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBUaGlzIHJlYWRzIGZyb20gYGFzeW5jSXRlcmFibGVQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0aW9uYCBmZWF0dXJlIHRlc3RzIGZvciB0aG9zZSBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjNj19vbmNlLm9ic2VydmVJdGVyYXRvcihvYnNlcnZlSXRlcmF0b3IpO1xuICAgICAgIGNvbnN0IG9ic2VydmVJdGVyYXRpb24gPSAoYXN5bmNJdGVyYWJsZVAsIGl0ZXJhdGlvbk9ic2VydmVyKSA9PiB7XG4gIGNvbnN0IGl0ZXJhdG9yUCA9IEUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICByZXR1cm4gb2JzZXJ2ZUl0ZXJhdG9yKGl0ZXJhdG9yUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpO1xufTtcblxuLyoqXG4gKiBBcyB1cGRhdGVzIGNvbWUgaW4gZnJvbSB0aGUgcG9zc2libHkgcmVtb3RlIGBub3RpZmllclBgLCB1cGRhdGVcbiAqIHRoZSBsb2NhbCBgdXBkYXRlcmAuIFNpbmNlIHRoZSB1cGRhdGVzIGNvbWUgZnJvbSBhIG5vdGlmaWVyLCB0aGV5XG4gKiBhcmUgbG9zc3ksIGkuZS4sIG9uY2UgYSBtb3JlIHJlY2VudCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQsIGxlc3MgcmVjZW50XG4gKiBzdGF0ZXMgYXJlIGFzc3VtZWQgaXJyZWxldmFudCBhbmQgZHJvcHBlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRozY9fb25jZS5vYnNlcnZlSXRlcmF0aW9uKG9ic2VydmVJdGVyYXRpb24pO1xuICAgICAgIGNvbnN0IG9ic2VydmVOb3RpZmllciA9IChub3RpZmllclAsIGl0ZXJhdGlvbk9ic2VydmVyKSA9PlxuICBvYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmliZUxhdGVzdChub3RpZmllclApLCBpdGVyYXRpb25PYnNlcnZlcik7JGjNj19vbmNlLm9ic2VydmVOb3RpZmllcihvYnNlcnZlTm90aWZpZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciJdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iXSwib2JzZXJ2ZU5vdGlmaWVyIjpbIm9ic2VydmVOb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADCPu246wcAAOsHAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyIsIi4vbm90aWZpZXIuanMiLCIuL3N1YnNjcmliZXIuanMiLCIuL3RvcGljLmpzIiwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXJLaXQiLCJtYWtlTm90aWZpZXJLaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVJdGVyYXRvciIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInN1YnNjcmliZUxhdGVzdCIsInN1YnNjcmliZUxhdGVzdCIsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vcHVibGlzaC1raXQuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtdXSxbXCIuL25vdGlmaWVyLmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW11dLFtcIi4vdG9waWMuanNcIiwgW11dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW11dLFtcIi4vc3RvcmVzdWIuanNcIiwgW11dLFtcIi4vc3RvcmVkLW5vdGlmaWVyLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9wdWJsaXNoLWtpdC5qcyI6W1sibWFrZVB1Ymxpc2hLaXQiLCJtYWtlUHVibGlzaEtpdCJdLFsicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Il0sWyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIiwiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSJdLFsiSXRlcmFibGVFYWNoVG9waWNJIiwiSXRlcmFibGVFYWNoVG9waWNJIl0sWyJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIl0sWyJTdWJzY3JpYmVyU2hhcGUiLCJTdWJzY3JpYmVyU2hhcGUiXV0sIi4vc3Vic2NyaWJlLmpzIjpbWyJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlRWFjaCJdLFsic3Vic2NyaWJlTGF0ZXN0Iiwic3Vic2NyaWJlTGF0ZXN0Il1dLCIuL25vdGlmaWVyLmpzIjpbWyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXIiXSxbIm1ha2VOb3RpZmllcktpdCIsIm1ha2VOb3RpZmllcktpdCJdLFsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdLFsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdXSwiLi9zdWJzY3JpYmVyLmpzIjpbWyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbiJdLFsibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXV0sIi4vdG9waWMuanMiOltbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiLCJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl1dLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjpbWyJvYnNlcnZlTm90aWZpZXIiLCJvYnNlcnZlTm90aWZpZXIiXSxbIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVJdGVyYXRvciJdLFsib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRpb24iXSxbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALNJ/07FGwAAxRsAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvbm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydCxFLEZhcixtYWtlUHVibGlzaEtpdCxzdWJzY3JpYmVMYXRlc3Q7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChtYWtlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVMYXRlc3RcIixbJGjNj19hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1JlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtMYXRlc3RUb3BpYywgTm90aWZpZXIsIE5vdGlmaWVyUmVjb3JkLCBQdWJsaXNoS2l0LCBTdWJzY3JpYmVyLCBVcGRhdGVSZWNvcmR9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHNoYXJhYmxlSW50ZXJuYWxzUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZU5vdGlmaWVyID0gc2hhcmFibGVJbnRlcm5hbHNQID0+IHtcbiAgLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbiAgY29uc3Qgbm90aWZpZXIgPSBGYXIoJ25vdGlmaWVyJywge1xuICAgIC4uLnN1YnNjcmliZUxhdGVzdChzaGFyYWJsZUludGVybmFsc1ApLFxuICAgIGdldFVwZGF0ZVNpbmNlOiBhc3luYyB1cGRhdGVDb3VudCA9PlxuICAgICAgRShzaGFyYWJsZUludGVybmFsc1ApLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcblxuICAgIC8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIE5vdGlmaWVyIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBOb3RpZmllciB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlTm90aWZpZXJgIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogTm90aWZpZXIgYXQgdGhhdCBzaXRlLlxuICovXG4gICAgZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczogYXN5bmMgKCkgPT4gc2hhcmFibGVJbnRlcm5hbHNQLFxuICAgIC8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFVzZWQgb25seSBieSBgbWFrZUNhc3RpbmdTcGVjRnJvbVJlZmAuICBJbnN0ZWFkIHRoYXQgZnVuY3Rpb24gc2hvdWxkIHVzZVxuICogdGhlIGBTdG9yZWRGYWNldGAgQVBJLlxuICovXG4gICAgZ2V0U3RvcmVLZXk6ICgpID0+IGhhcmRlbih7IG5vdGlmaWVyIH0pLFxuICB9KTtcbiAgcmV0dXJuIG5vdGlmaWVyO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+IHwgUmVtb3RlPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaM2PX29uY2UubWFrZU5vdGlmaWVyKG1ha2VOb3RpZmllcik7XG4gICAgICAgY29uc3QgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIgPSBzdWJzY3JpYmVyID0+IHtcbiAgLyoqXG4gKiBAdHlwZSB7TGF0ZXN0VG9waWM8VD59XG4gKi9cbiAgY29uc3QgYmFzZU5vdGlmaWVyID0gaGFyZGVuKHtcbiAgICBnZXRVcGRhdGVTaW5jZTogKHVwZGF0ZUNvdW50ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgRShzdWJzY3JpYmVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG4gIGNvbnN0IG5vdGlmaWVyID0gRmFyKCdub3RpZmllcicsIHtcbiAgICAuLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbiAgICAuLi5iYXNlTm90aWZpZXIsXG4gIH0pO1xuICByZXR1cm4gbm90aWZpZXI7XG59OyRozY9fb25jZS5tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuXG4vKipcbiAqIFByb2R1Y2VzIGEgcGFpciBvZiBvYmplY3RzLCB3aGljaCBhbGxvdyBhIHNlcnZpY2UgdG8gcHJvZHVjZSBhIHN0cmVhbSBvZlxuICogdXBkYXRlIHByb21pc2VzLlxuICpcbiAqIFRoZSBpbml0aWFsIHN0YXRlIGFyZ3VtZW50IGhhcyB0byBiZSB0cnVseSBvcHRpb25hbCBldmVuIHRob3VnaCBpdCBjYW5cbiAqIGJlIGFueSBmaXJzdCBjbGFzcyB2YWx1ZSBpbmNsdWRpbmcgYHVuZGVmaW5lZGAuIFdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gKiBwcmVzZW5jZSB2cyB0aGUgYWJzZW5jZSBvZiBpdCwgd2hpY2ggd2UgY2Fubm90IGRvIHdpdGggdGhlIG9wdGlvbmFsIGFyZ3VtZW50XG4gKiBzeW50YXguIFJhdGhlciB3ZSB1c2UgdGhlIGFyaXR5IG9mIHRoZSBgaW5pdGlhbFN0YXRlQXJyYCBhcnJheS5cbiAqXG4gKiBJZiBubyBpbml0aWFsIHN0YXRlIGlzIHByb3ZpZGVkIHRvIGBtYWtlTm90aWZpZXJLaXRgLCB0aGVuIGl0IHN0YXJ0cyB3aXRob3V0XG4gKiBhbiBpbml0aWFsIHN0YXRlLiBJdHMgaW5pdGlhbCBzdGF0ZSB3aWxsIGluc3RlYWQgYmUgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdFxuICogdXBkYXRlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tdIHwgW1RdfSBpbml0aWFsU3RhdGVBcnIgdGhlIGZpcnN0IHN0YXRlIHRvIGJlIHJldHVybmVkICh0eXBlZCBhcyByZXN0IGFycmF5IHRvIHBlcm1pdCBgdW5kZWZpbmVkYClcbiAqIEByZXR1cm5zIHtOb3RpZmllclJlY29yZDxUPn0gdGhlIG5vdGlmaWVyIGFuZCB1cGRhdGVyXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXJLaXQgPSAoLi4uaW5pdGlhbFN0YXRlQXJyKSA9PiB7XG4gIC8qKiBAdHlwZSB7UHVibGlzaEtpdDxUPn0gKi9cbiAgY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VQdWJsaXNoS2l0KCk7XG5cbiAgY29uc3Qgbm90aWZpZXIgPSBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihzdWJzY3JpYmVyKTtcblxuICBjb25zdCB1cGRhdGVyID0gRmFyKCd1cGRhdGVyJywge1xuICAgIHVwZGF0ZVN0YXRlOiBzdGF0ZSA9PiBwdWJsaXNoZXIucHVibGlzaChzdGF0ZSksXG4gICAgZmluaXNoOiBjb21wbGV0aW9uID0+IHB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG4gICAgZmFpbDogcmVhc29uID0+IHB1Ymxpc2hlci5mYWlsKHJlYXNvbiksXG4gIH0pO1xuXG4gIGFzc2VydChpbml0aWFsU3RhdGVBcnIubGVuZ3RoIDw9IDEsICd0b28gbWFueSBhcmd1bWVudHMnKTtcbiAgaWYgKGluaXRpYWxTdGF0ZUFyci5sZW5ndGggPT09IDEpIHtcbiAgICB1cGRhdGVyLnVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZUFyclswXSk7XG4gIH1cblxuICAvKiBub3RpZmllciBmYWNldCBpcyBzZXBhcmF0ZSBzbyBpdCBjYW4gYmUgaGFuZGVkIG91dCB3aGlsZSB1cGRhdGVyKi9cbiAgLyogaXMgdGlnaHRseSBoZWxkKi9cbiAgcmV0dXJuIGhhcmRlbih7IG5vdGlmaWVyLCB1cGRhdGVyIH0pO1xufTtcblxuLyoqXG4gKiBBZGFwdG9yIGZyb20gYXN5bmMgaXRlcmFibGUgdG8gbm90aWZpZXIuXG4gKlxuICogQGRlcHJlY2F0ZWQgVGhlIHJlc3VsdGluZyBub3RpZmllciBpcyBsb3NzbGVzcywgd2hpY2ggaXMgbm90IGRlc2lyYWJsZS5cbiAqIFByZWZlciBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciwgYW5kIHJlZmVyIHRvXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzU0MTMgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81Njk1IGZvciBjb250ZXh0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaM2PX29uY2UubWFrZU5vdGlmaWVyS2l0KG1ha2VOb3RpZmllcktpdCk7XG4gICAgICAgY29uc3QgbWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUgPSBhc3luY0l0ZXJhYmxlUCA9PiB7XG4gIGNvbnN0IGl0ZXJhdG9yUCA9IEUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG4gIC8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbiAgbGV0IG9wdE5leHRQcm9taXNlO1xuICBsZXQgY3VycmVudFVwZGF0ZUNvdW50ID0gMG47XG4gIC8qKiBAdHlwZSB7RVJlZjxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbiAgbGV0IGN1cnJlbnRSZXNwb25zZTtcbiAgbGV0IGZpbmFsID0gZmFsc2U7XG5cbiAgLyoqXG4gKiBAdHlwZSB7TGF0ZXN0VG9waWM8VD59XG4gKi9cbiAgY29uc3QgYmFzZU5vdGlmaWVyID0gRmFyKCdiYXNlTm90aWZpZXInLCB7XG4gICAgZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQgPSAtMW4pIHtcbiAgICAgIGlmICh1cGRhdGVDb3VudCA8IGN1cnJlbnRVcGRhdGVDb3VudCkge1xuICAgICAgICBpZiAoY3VycmVudFJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHVwZGF0ZUNvdW50ICE9PSBjdXJyZW50VXBkYXRlQ291bnQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgJ2dldFVwZGF0ZVNpbmNlIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvKiBSZXR1cm4gYSBmaW5hbCByZXNwb25zZSBpZiB3ZSBoYXZlIG9uZSwgb3RoZXJ3aXNlIGEgcHJvbWlzZSBmb3IgdGhlIG5leHQgc3RhdGUuKi9cbiAgICAgIGlmIChmaW5hbCkge1xuICAgICAgICBhc3NlcnQoY3VycmVudFJlc3BvbnNlICE9PSB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBpZiAoIW9wdE5leHRQcm9taXNlKSB7XG4gICAgICAgIGNvbnN0IG5leHRJdGVyUmVzdWx0UCA9IEUoaXRlcmF0b3JQKS5uZXh0KCk7XG4gICAgICAgIG9wdE5leHRQcm9taXNlID0gRS53aGVuKFxuICAgICAgICAgIG5leHRJdGVyUmVzdWx0UCxcbiAgICAgICAgICAoeyBkb25lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQoIWZpbmFsKTtcbiAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgIGZpbmFsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRVcGRhdGVDb3VudCArPSAxbjtcbiAgICAgICAgICAgIGN1cnJlbnRSZXNwb25zZSA9IGhhcmRlbih7XG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICB1cGRhdGVDb3VudDogZG9uZSA/IHVuZGVmaW5lZCA6IGN1cnJlbnRVcGRhdGVDb3VudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3B0TmV4dFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgX3JlYXNvbiA9PiB7XG4gICAgICAgICAgICBmaW5hbCA9IHRydWU7XG4gICAgICAgICAgICBjdXJyZW50UmVzcG9uc2UgPVxuICAgICAgICAgICAgICAvKiogQHR5cGUge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pn0gKi9cbiAgICAgICAgICAgICAgKG5leHRJdGVyUmVzdWx0UCk7XG4gICAgICAgICAgICBvcHROZXh0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHROZXh0UHJvbWlzZTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuICBjb25zdCBub3RpZmllciA9IEZhcignbm90aWZpZXInLCB7XG4gICAgLyogRG9uJ3QgbGVhayB0aGUgb3JpZ2luYWwgYXN5bmNJdGVyYWJsZVAgc2luY2UgaXQgbWF5IGJlIHJlbW90ZSBhbmQgd2UgYWxzbyovXG4gICAgLyogd2FudCB0aGUgc2FtZSBzZW1hbnRpY3MgZm9yIHRoaXMgZXhwb3NlZCBpdGVyYWJsZSBhbmQgdGhlIGJhc2VOb3RpZmllci4qL1xuICAgIC4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuICAgIC4uLmJhc2VOb3RpZmllcixcbiAgfSk7XG4gIHJldHVybiBub3RpZmllcjtcbn07JGjNj19vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTm90aWZpZXIiOlsibWFrZU5vdGlmaWVyIl0sIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIjpbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl0sIm1ha2VOb3RpZmllcktpdCI6WyJtYWtlTm90aWZpZXJLaXQiXSwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiOlsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGyEXozNCAAAzQgAAKgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9wdWJsaXNoLWtpdC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3BhdHRlcm5zIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIlVwZGF0ZUNvdW50U2hhcGUiLCJtYWtlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInB1Ymxpc2hLaXRJS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEUsRmFyLG1ha2VQcm9taXNlS2l0LE0sZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkLGNhbkJlRHVyYWJsZSxwcmVwYXJlRXhvQ2xhc3NLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIixbJGjNj19hID0+IChjYW5CZUR1cmFibGUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSwgRHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHksIExhdGVzdFRvcGljLCBOb3RpZmllciwgTm90aWZpZXJSZWNvcmQsIFB1YmxpY2F0aW9uUmVjb3JkLCBQdWJsaXNoZXIsIFB1Ymxpc2hLaXQsIFN1YnNjcmliZXIsIFVwZGF0ZVJlY29yZH0gZnJvbSAnLi4vc3JjL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqL1xuXG5jb25zdCBzaW5rID0gKCkgPT4ge307XG5jb25zdCBtYWtlUXVpZXRSZWplY3Rpb24gPSByZWFzb24gPT4ge1xuICBjb25zdCByZWplY3Rpb24gPSBoYXJkZW4oUHJvbWlzZS5yZWplY3QocmVhc29uKSk7XG4gIHZvaWQgRS53aGVuKHJlamVjdGlvbiwgc2luaywgc2luayk7XG4gIHJldHVybiByZWplY3Rpb247XG59O1xuY29uc3QgdG9vRmFyUmVqZWN0aW9uID0gbWFrZVF1aWV0UmVqZWN0aW9uKFxuICBoYXJkZW4oRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgZW5kIG9mIGl0ZXJhdGlvbi4nKSksXG4pO1xuXG4gICAgICAgY29uc3QgUHVibGlzaGVySSA9IE0uaW50ZXJmYWNlKCdQdWJsaXNoZXInLCB7XG4gIHB1Ymxpc2g6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gIGZpbmlzaDogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbiAgZmFpbDogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbn0pO1xuXG4vKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBOb3RpZmllciBgZ2V0VXBkYXRlU2luY2VgLiovJGjNj19vbmNlLlB1Ymxpc2hlckkoUHVibGlzaGVySSk7XG4gICAgICAgY29uc3QgVXBkYXRlQ291bnRTaGFwZSA9IE0ub3IoTS5iaWdpbnQoKSwgTS5udW1iZXIoKSk7JGjNj19vbmNlLlVwZGF0ZUNvdW50U2hhcGUoVXBkYXRlQ291bnRTaGFwZSk7XG4gICAgICAgY29uc3QgU3Vic2NyaWJlckkgPSBNLmludGVyZmFjZSgnU3Vic2NyaWJlcicsIHtcbiAgc3Vic2NyaWJlQWZ0ZXI6IE0uY2FsbCgpLm9wdGlvbmFsKE0uYmlnaW50KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRVcGRhdGVTaW5jZTogTS5jYWxsKCkub3B0aW9uYWwoVXBkYXRlQ291bnRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG59KTskaM2PX29uY2UuU3Vic2NyaWJlckkoU3Vic2NyaWJlckkpO1xuICAgICAgIGNvbnN0IHB1Ymxpc2hLaXRJS2l0ID0gaGFyZGVuKHtcbiAgcHVibGlzaGVyOiBQdWJsaXNoZXJJLFxuICBzdWJzY3JpYmVyOiBTdWJzY3JpYmVySSxcbn0pOyRozY9fb25jZS5wdWJsaXNoS2l0SUtpdChwdWJsaXNoS2l0SUtpdCk7XG5cbiAgICAgICBjb25zdCBGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlID0gTS5pbnRlcmZhY2UoXG4gICdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicsXG4gIHtcbiAgICBmb3JrOiBNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06IE0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksIC8qIG9vcHM6IHJlY3Vyc2l2ZSB0eXBlKi9cbiAgICBuZXh0OiBNLmNhbGxXaGVuKCkucmV0dXJucyhNLmFueSgpKSxcbiAgfSxcbik7JGjNj19vbmNlLkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUoRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSk7XG5cbiAgICAgICBjb25zdCBJdGVyYWJsZUVhY2hUb3BpY0kgPSBNLmludGVyZmFjZSgnSXRlcmFibGVFYWNoVG9waWMnLCB7XG4gIHN1YnNjcmliZUFmdGVyOlxuICAgIGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChTdWJzY3JpYmVySSkubWV0aG9kR3VhcmRzLnN1YnNjcmliZUFmdGVyLFxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiBNLmNhbGwoKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicpLFxuICApLFxufSk7JGjNj19vbmNlLkl0ZXJhYmxlRWFjaFRvcGljSShJdGVyYWJsZUVhY2hUb3BpY0kpO1xuXG4gICAgICAgY29uc3QgSXRlcmFibGVMYXRlc3RUb3BpY0kgPSBNLmludGVyZmFjZSgnSXRlcmFibGVMYXRlc3RUb3BpYycsIHtcbiAgZ2V0VXBkYXRlU2luY2U6XG4gICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFN1YnNjcmliZXJJKS5tZXRob2RHdWFyZHMuZ2V0VXBkYXRlU2luY2UsXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06IE0uY2FsbCgpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyksXG4gICksXG59KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gQXJnXG4gKiBAdGVtcGxhdGUgUmV0XG4gKiBAcGFyYW0geyhhcmc6IEFyZykgPT4gUmV0fSBmblxuICogQHJldHVybnMgeyhhcmc6IEFyZykgPT4gUmV0fVxuICovJGjNj19vbmNlLkl0ZXJhYmxlTGF0ZXN0VG9waWNJKEl0ZXJhYmxlTGF0ZXN0VG9waWNJKTtcbmNvbnN0IHdlYWtNZW1vaXplVW5hcnkgPSBmbiA9PiB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbiAgcmV0dXJuIGFyZyA9PiB7XG4gICAgLyoqIEB0eXBlIHtvYmplY3R9ICovXG4gICAgY29uc3Qgb2FyZyA9IGFyZztcbiAgICBpZiAoY2FjaGUuaGFzKG9hcmcpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KG9hcmcpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmbihhcmcpO1xuICAgIGNhY2hlLnNldChvYXJnLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1B1YmxpY2F0aW9uUmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtVcGRhdGVSZWNvcmQ8VD59XG4gKi9cbmNvbnN0IG1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQgPSByZWNvcmQgPT4ge1xuICBjb25zdCB7XG4gICAgaGVhZDogeyB2YWx1ZSwgZG9uZSB9LFxuICAgIHB1Ymxpc2hDb3VudCxcbiAgfSA9IHJlY29yZDtcbiAgaWYgKGRvbmUpIHtcbiAgICAvKiBGaW5hbCByZXN1bHRzIGhhdmUgdW5kZWZpbmVkIHVwZGF0ZUNvdW50LiovXG4gICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCB1cGRhdGVDb3VudDogdW5kZWZpbmVkIH0pO1xuICB9XG4gIHJldHVybiBoYXJkZW4oeyB2YWx1ZSwgdXBkYXRlQ291bnQ6IHB1Ymxpc2hDb3VudCB9KTtcbn07XG5cbi8qKlxuICogTWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQdWJsaXNoS2l0PFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVB1Ymxpc2hLaXQgPSAoKSA9PiB7XG4gIC8qKiBAdHlwZSB7UHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59ICovXG4gIGxldCB0YWlsUDtcbiAgLyoqIEB0eXBlIHt1bmRlZmluZWQgfCAoKHZhbHVlOiBFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+PikgPT4gdm9pZCl9ICovXG4gIGxldCB0YWlsUjtcbiAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcblxuICBsZXQgY3VycmVudFB1Ymxpc2hDb3VudCA9IDBuO1xuICBsZXQgY3VycmVudFAgPSB0YWlsUDtcbiAgY29uc3QgYWR2YW5jZUN1cnJlbnQgPSAoZG9uZSwgdmFsdWUsIHJlamVjdGlvbikgPT4ge1xuICAgIGlmICh0YWlsUiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiAgICB9XG5cbiAgICBjdXJyZW50UHVibGlzaENvdW50ICs9IDFuO1xuICAgIGN1cnJlbnRQID0gdGFpbFA7XG4gICAgY29uc3QgcmVzb2x2ZUN1cnJlbnQgPSB0YWlsUjtcblxuICAgIGlmIChkb25lKSB7XG4gICAgICB0YWlsUCA9IHRvb0ZhclJlamVjdGlvbjtcbiAgICAgIHRhaWxSID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAoeyBwcm9taXNlOiB0YWlsUCwgcmVzb2x2ZTogdGFpbFIgfSA9IG1ha2VQcm9taXNlS2l0KCkpO1xuICAgIH1cblxuICAgIGlmIChyZWplY3Rpb24pIHtcbiAgICAgIHJlc29sdmVDdXJyZW50KHJlamVjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmVDdXJyZW50KFxuICAgICAgICBoYXJkZW4oe1xuICAgICAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmUgfSxcbiAgICAgICAgICBwdWJsaXNoQ291bnQ6IGN1cnJlbnRQdWJsaXNoQ291bnQsXG4gICAgICAgICAgdGFpbDogdGFpbFAsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkID0gd2Vha01lbW9pemVVbmFyeShcbiAgICBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkLFxuICApO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHtTdWJzY3JpYmVyPFQ+fVxuICovXG4gIGNvbnN0IHN1YnNjcmliZXIgPSBGYXIoJ1N1YnNjcmliZXInLCB7XG4gICAgc3Vic2NyaWJlQWZ0ZXI6IChwdWJsaXNoQ291bnQgPSAtMW4pID0+IHtcbiAgICAgIGFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCAnYmlnaW50Jyk7XG4gICAgICBpZiAocHVibGlzaENvdW50ID09PSBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgIHJldHVybiB0YWlsUDtcbiAgICAgIH0gZWxzZSBpZiAocHVibGlzaENvdW50IDwgY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudFA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAnc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0VXBkYXRlU2luY2U6IHVwZGF0ZUNvdW50ID0+IHtcbiAgICAgIGlmICh1cGRhdGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCkudGhlbihtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQpO1xuICAgICAgfVxuICAgICAgdXBkYXRlQ291bnQgPSBCaWdJbnQodXBkYXRlQ291bnQpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgc3Vic2NyaWJlclxuICAgICAgICAgIC8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4gICAgICAgICAgLyogYHVwZGF0ZUNvdW50ICsgMWAsIGV2ZW4gaWYgc2V2ZXJhbCB1cGRhdGVzIGFyZSBwdWJsaXNoZWQgaW4gdGhlKi9cbiAgICAgICAgICAvKiBzYW1lIGNyYW5rLi4uKi9cbiAgICAgICAgICAuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4gICAgICAgICAgLyogLi4uIHNvIHdlIHBvbGwgdGhlIGxhdGVzdCBwdWJsaXNoZWQgdXBkYXRlLCB3aXRob3V0IHdhaXRpbmcgZm9yIGFueSovXG4gICAgICAgICAgLyogZnVydGhlciBvbmVzLiovXG4gICAgICAgICAgLnRoZW4oKCkgPT4gc3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpKVxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogQHR5cGUge1B1Ymxpc2hlcjxUPn0gKi9cbiAgY29uc3QgcHVibGlzaGVyID0gRmFyKCdQdWJsaXNoZXInLCB7XG4gICAgcHVibGlzaDogdmFsdWUgPT4ge1xuICAgICAgYWR2YW5jZUN1cnJlbnQoZmFsc2UsIHZhbHVlKTtcbiAgICB9LFxuICAgIGZpbmlzaDogZmluYWxWYWx1ZSA9PiB7XG4gICAgICBhZHZhbmNlQ3VycmVudCh0cnVlLCBmaW5hbFZhbHVlKTtcbiAgICB9LFxuICAgIGZhaWw6IHJlYXNvbiA9PiB7XG4gICAgICBhZHZhbmNlQ3VycmVudCh0cnVlLCB1bmRlZmluZWQsIG1ha2VRdWlldFJlamVjdGlvbihyZWFzb24pKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGhhcmRlbih7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9KTtcbn07JGjNj19vbmNlLm1ha2VQdWJsaXNoS2l0KG1ha2VQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlUHVibGlzaEtpdCk7XG5cbmNvbnN0IER1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZSA9IGhhcmRlbih7XG4gIHZhbHVlRHVyYWJpbGl0eTogTS5hbnkoKSxcbiAgcHVibGlzaENvdW50OiBNLmFueSgpLFxuICBzdGF0dXM6IE0uYW55KCksXG4gIGhhc1ZhbHVlOiBNLmFueSgpLFxuICB2YWx1ZTogTS5hbnkoKSxcbn0pO1xuXG4vKiBUT0RPOiBNb3ZlIGR1cmFibGUgcHVibGlzaCBraXQgdG8gYSBuZXcgZmlsZT8qL1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHkgJiAnbWFuZGF0b3J5J30gW29wdGlvbnMudmFsdWVEdXJhYmlsaXR5XVxuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9XG4gKi9cbmNvbnN0IGluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7IHZhbHVlRHVyYWJpbGl0eSA9ICdtYW5kYXRvcnknIH0gPSBvcHRpb25zO1xuICBhc3NlcnQuZXF1YWwodmFsdWVEdXJhYmlsaXR5LCAnbWFuZGF0b3J5Jyk7XG4gIHJldHVybiB7XG4gICAgLyogY29uZmlndXJhdGlvbiovXG4gICAgdmFsdWVEdXJhYmlsaXR5LFxuXG4gICAgLyogbGlmZWN5Y2xlIHByb2dyZXNzKi9cbiAgICBwdWJsaXNoQ291bnQ6IDBuLFxuICAgIHN0YXR1czogJ2xpdmUnLCAvKiB8ICdmaW5pc2hlZCcgfCAnZmFpbGVkJyovXG5cbiAgICAvKiBwZXJzaXN0ZWQgcmVzdWx0IGRhdGEqL1xuICAgIC8qIE5vdGUgdGhhdCBpbiBhZGRpdGlvbiB0byBub24tdGVybWluYWwgdmFsdWVzIGZyb20gYHB1Ymxpc2hgLCovXG4gICAgLyogdmFsdWUgYWxzbyBob2xkcyB0aGUgdGVybWluYWwgdmFsdWUgZnJvbSBgZmluaXNoYCBvciBgZmFpbGAuKi9cbiAgICBoYXNWYWx1ZTogZmFsc2UsXG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgfTtcbn07XG5cbi8qIFdlIG5lZWQgdGhlIFdlYWtNYXAga2V5IGZvciBhIGtpdCB0byBiZSBhIHZyZWYtYmVhcmluZyBvYmplY3QqL1xuLyogaW4gaXRzIGNvaG9ydCwgYW5kIGhhdmUgYXJiaXRyYXJpbHkgY2hvc2VuIHRoZSBwdWJsaXNoZXIgZmFjZXQuKi9cbi8qKiBAdHlwZWRlZiB7UHVibGlzaGVyPCo+fSBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleSAqL1xuLyoqXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5fVxuICovXG5jb25zdCBnZXRFcGhlbWVyYWxLZXkgPSBmYWNldHMgPT4gZmFjZXRzLnB1Ymxpc2hlcjtcblxuLyoqXG4gKiBAdHlwZWRlZiBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGFcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTwqPiB8IHVuZGVmaW5lZH0gY3VycmVudFAgVGhlIGN1cnJlbnQtcmVzdWx0IHByb21pc2VcbiAqICAgKHVuZGVmaW5lZCB1bmxlc3MgcmVzb2x2ZWQgd2l0aCB1bnJlY292ZXJhYmxlIGVwaGVtZXJhbCBkYXRhKVxuICogQHByb3BlcnR5IHtQcm9taXNlPCo+fSB0YWlsUCBUaGUgbmV4dC1yZXN1bHQgcHJvbWlzZVxuICogQHByb3BlcnR5IHsoKHZhbHVlOiBhbnkpID0+IHZvaWQpIHwgdW5kZWZpbmVkfSB0YWlsUiBUaGUgbmV4dC1yZXN1bHQgcmVzb2x2ZXJcbiAqICAgKHVuZGVmaW5lZCB3aGVuIHRoZSBwdWJsaXNoIGtpdCBoYXMgdGVybWluYXRlZClcbiAqL1xuXG4vKiogQHR5cGUge1dlYWtNYXA8RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXksIER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YT59ICovXG5jb25zdCBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQtcmVzdWx0IHByb21pc2UgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZHVyYWJsZVxuICogcHVibGlzaCBraXQsIHJlY3JlYXRlZCB1bmxlc3Mgd2UgYWxyZWFkeSBoYXZlIG9uZSB3aXRoIHJldGFpbmVkXG4gKiBlcGhlbWVyYWwgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9IHN0YXRlXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHBhcmFtIHtQcm9taXNlPCo+fSB0YWlsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTwqPn1cbiAqL1xuY29uc3QgcHJvdmlkZUN1cnJlbnRQID0gKHN0YXRlLCBmYWNldHMsIHRhaWwpID0+IHtcbiAgY29uc3QgZXBoZW1lcmFsS2V5ID0gZ2V0RXBoZW1lcmFsS2V5KGZhY2V0cyk7XG4gIGNvbnN0IGZvdW5kRGF0YSA9IGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbiAgY29uc3QgY3VycmVudFAgPSBmb3VuZERhdGEgJiYgZm91bmREYXRhLmN1cnJlbnRQO1xuICBpZiAoY3VycmVudFApIHtcbiAgICByZXR1cm4gY3VycmVudFA7XG4gIH1cblxuICBjb25zdCB7IHB1Ymxpc2hDb3VudCwgc3RhdHVzLCBoYXNWYWx1ZSwgdmFsdWUgfSA9IHN0YXRlO1xuICBpZiAoIWhhc1ZhbHVlKSB7XG4gICAgYXNzZXJ0KHN0YXR1cyA9PT0gJ2xpdmUnKTtcbiAgICByZXR1cm4gdGFpbDtcbiAgfVxuICBpZiAoc3RhdHVzID09PSAnbGl2ZScgfHwgc3RhdHVzID09PSAnZmluaXNoZWQnKSB7XG4gICAgY29uc3QgY2VsbCA9IGhhcmRlbih7XG4gICAgICBoZWFkOiB7IHZhbHVlLCBkb25lOiBzdGF0dXMgIT09ICdsaXZlJyB9LFxuICAgICAgcHVibGlzaENvdW50LFxuICAgICAgdGFpbCxcbiAgICB9KTtcbiAgICByZXR1cm4gRS5yZXNvbHZlKGNlbGwpO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICByZXR1cm4gbWFrZVF1aWV0UmVqZWN0aW9uKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBGYWlsYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbmV4dC1yZXN1bHQgcHJvbWlzZSBhbmQgcmVzb2x2ZXIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW5cbiAqIGR1cmFibGUgcHVibGlzaCBraXQuXG4gKiBUaGVzZSBhcmUgbG9zdCBvbiB1cGdyYWRlIGJ1dCByZWNyZWF0ZWQgb24tZGVtYW5kLCBwcmVzZXJ2aW5nIHRoZVxuICogdmFsdWUgaW4gKGJ1dCBub3QgdGhlIGlkZW50aXR5IG9mKSB0aGUgY3VycmVudCB7IHZhbHVlLCBkb25lIH0gcmVzdWx0XG4gKiB3aGVuIHBvc3NpYmxlLCB3aGljaCBpcyBhbHdheXMgdGhlIGNhc2Ugd2hlbiB0aGF0IHZhbHVlIGlzIHRlcm1pbmFsXG4gKiAoaS5lLiwgZnJvbSBgZmluaXNoYCBvciBgZmFpbGApIG9yIHdoZW4gdGhlIGR1cmFibGUgcHVibGlzaCBraXQgaXNcbiAqIGNvbmZpZ3VyZWQgd2l0aCBgdmFsdWVEdXJhYmlsaXR5OiAnbWFuZGF0b3J5J2AuXG4gKlxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfSBzdGF0ZVxuICogQHBhcmFtIHtQdWJsaXNoS2l0PCo+fSBmYWNldHNcbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGF9XG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEgPSAoc3RhdGUsIGZhY2V0cykgPT4ge1xuICBjb25zdCBlcGhlbWVyYWxLZXkgPSBnZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbiAgY29uc3QgZm91bmREYXRhID0gZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLmdldChlcGhlbWVyYWxLZXkpO1xuICBpZiAoZm91bmREYXRhKSB7XG4gICAgcmV0dXJuIGZvdW5kRGF0YTtcbiAgfVxuXG4gIGNvbnN0IHsgc3RhdHVzIH0gPSBzdGF0ZTtcbiAgbGV0IHRhaWxQO1xuICBsZXQgdGFpbFI7XG4gIGlmIChzdGF0dXMgPT09ICdsaXZlJykge1xuICAgICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG4gICAgdm9pZCBFLndoZW4odGFpbFAsIHNpbmssIHNpbmspO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ2ZpbmlzaGVkJyB8fCBzdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgdGFpbFAgPSB0b29GYXJSZWplY3Rpb247XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuICB9XG4gIC8qIGN1cnJlbnRQIGlzIG5vdCBlcGhlbWVyYWwgd2hlbiByZXN0b3JpbmcgZnJvbSBwZXJzaXN0ZWQgc3RhdGUuKi9cbiAgY29uc3Qgb2JqID0gaGFyZGVuKHsgY3VycmVudFA6IHVuZGVmaW5lZCwgdGFpbFAsIHRhaWxSIH0pO1xuICBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KGVwaGVtZXJhbEtleSwgb2JqKTtcbiAgcmV0dXJuIG9iajtcbn07XG5cbi8qKlxuICogRXh0ZW5kcyB0aGUgc2VxdWVuY2Ugb2YgcmVzdWx0cy5cbiAqXG4gKiBAcGFyYW0ge3tzdGF0ZTogRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSwgZmFjZXRzOiBQdWJsaXNoS2l0PCo+fX0gY29udGV4dFxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGVbJ3N0YXR1cyddfSBbdGFyZ2V0U3RhdHVzXVxuICovXG5jb25zdCBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQgPSAoY29udGV4dCwgdmFsdWUsIHRhcmdldFN0YXR1cyA9ICdsaXZlJykgPT4ge1xuICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHsgdmFsdWVEdXJhYmlsaXR5LCBzdGF0dXMgfSA9IHN0YXRlO1xuICBpZiAoc3RhdHVzICE9PSAnbGl2ZScpIHtcbiAgICB0aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiAgfVxuICBjb25zdCBkb25lID0gdGFyZ2V0U3RhdHVzICE9PSAnbGl2ZSc7XG4gIGlmIChkb25lIHx8IHZhbHVlRHVyYWJpbGl0eSA9PT0gJ21hbmRhdG9yeScpIHtcbiAgICBjYW5CZUR1cmFibGUodmFsdWUpIHx8IEZhaWxgQ2Fubm90IGFjY2VwdCBub24tZHVyYWJsZSB2YWx1ZTogJHt2YWx1ZX1gO1xuICB9XG4gIGNvbnN0IHsgdGFpbFA6IG9sZFRhaWxQLCB0YWlsUjogcmVzb2x2ZU9sZFRhaWwgfSA9XG4gICAgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShzdGF0ZSwgZmFjZXRzKTtcbiAgYXNzZXJ0LnR5cGVvZihyZXNvbHZlT2xkVGFpbCwgJ2Z1bmN0aW9uJyk7XG5cbiAgY29uc3QgcHVibGlzaENvdW50ID0gc3RhdGUucHVibGlzaENvdW50ICsgMW47XG4gIHN0YXRlLnB1Ymxpc2hDb3VudCA9IHB1Ymxpc2hDb3VudDtcblxuICBsZXQgdGFpbFA7XG4gIGxldCB0YWlsUjtcbiAgaWYgKGRvbmUpIHtcbiAgICBzdGF0ZS5zdGF0dXMgPSB0YXJnZXRTdGF0dXM7XG4gICAgdGFpbFAgPSB0b29GYXJSZWplY3Rpb247XG4gICAgdGFpbFIgPSB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcbiAgICB2b2lkIEUud2hlbih0YWlsUCwgc2luaywgc2luayk7XG4gIH1cblxuICBsZXQgY3VycmVudFA7XG4gIGlmICh0YXJnZXRTdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgc3RhdGUuaGFzVmFsdWUgPSB0cnVlO1xuICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgY29uc3QgcmVqZWN0aW9uID0gbWFrZVF1aWV0UmVqZWN0aW9uKHZhbHVlKTtcbiAgICByZXNvbHZlT2xkVGFpbChyZWplY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIC8qIFBlcnNpc3QgYSB0ZXJtaW5hbCB2YWx1ZSwgb3IgYSBub24tdGVybWluYWwgdmFsdWUqL1xuICAgIC8qIGlmIGNvbmZpZ3VyZWQgYXMgJ21hbmRhdG9yeScgb3IgJ29wcG9ydHVuaXN0aWMnLiovXG4gICAgaWYgKGRvbmUgfHwgKHZhbHVlRHVyYWJpbGl0eSAhPT0gJ2lnbm9yZWQnICYmIGNhbkJlRHVyYWJsZSh2YWx1ZSkpKSB7XG4gICAgICBzdGF0ZS5oYXNWYWx1ZSA9IHRydWU7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5oYXNWYWx1ZSA9IGZhbHNlO1xuICAgICAgc3RhdGUudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAvKiBSZXRhaW4gYW55IHByb21pc2Ugd2l0aCBub24tZHVyYWJsZSByZXNvbHV0aW9uLiovXG4gICAgICBjdXJyZW50UCA9IG9sZFRhaWxQO1xuICAgIH1cblxuICAgIHJlc29sdmVPbGRUYWlsKFxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgaGVhZDogeyB2YWx1ZSwgZG9uZSB9LFxuICAgICAgICBwdWJsaXNoQ291bnQsXG4gICAgICAgIHRhaWw6IHRhaWxQLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoXG4gICAgZ2V0RXBoZW1lcmFsS2V5KGZhY2V0cyksXG4gICAgaGFyZGVuKHsgY3VycmVudFAsIHRhaWxQLCB0YWlsUiB9KSxcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEByZXR1cm5zIHs8VD4ob3B0aW9ucz86IFBhcmFtZXRlcnM8dHlwZW9mIGluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlPlswXSkgPT4gUHVibGlzaEtpdDxUPn1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCA9IChiYWdnYWdlLCBraW5kTmFtZSkgPT4ge1xuICAvKiBUT0RPOiBPbmNlIHdlIHVuaWZ5IHdpdGggbWFrZVB1Ymxpc2hLaXQsIHdlIHdpbGwgdXNlIGEgWm9uZS1jb21wYXRpYmxlIHdlYWsqL1xuICAvKiBtYXAgZm9yIG1lbW9pemF0aW9uLiovXG4gIGNvbnN0IG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCA9IG1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQ7XG5cbiAgcmV0dXJuIHByZXBhcmVFeG9DbGFzc0tpdChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIHB1Ymxpc2hLaXRJS2l0LFxuICAgIGluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlLFxuICAgIHtcbiAgICAgIC8qIFRoZSBwdWJsaXNoZXIgZmFjZXQgb2YgYSBkdXJhYmxlIHB1Ymxpc2gga2l0Ki9cbiAgICAgIC8qIGFjY2VwdHMgbmV3IHZhbHVlcy4qL1xuICAgICAgcHVibGlzaGVyOiB7XG4gICAgICAgIHB1Ymxpc2godmFsdWUpIHtcbiAgICAgICAgICBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcywgdmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBmaW5pc2goZmluYWxWYWx1ZSkge1xuICAgICAgICAgIGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLCBmaW5hbFZhbHVlLCAnZmluaXNoZWQnKTtcbiAgICAgICAgfSxcbiAgICAgICAgZmFpbChyZWFzb24pIHtcbiAgICAgICAgICBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcywgcmVhc29uLCAnZmFpbGVkJyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKiBUaGUgc3Vic2NyaWJlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuICAgICAgLyogcHJvcGFnYXRlcyB2YWx1ZXMuKi9cbiAgICAgIHN1YnNjcmliZXI6IHtcbiAgICAgICAgc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50ID0gLTFuKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgcHVibGlzaENvdW50OiBjdXJyZW50UHVibGlzaENvdW50IH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCB7IGN1cnJlbnRQLCB0YWlsUCB9ID0gcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgZmFjZXRzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHB1Ymxpc2hDb3VudCA9PT0gY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhaWxQO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHVibGlzaENvdW50IDwgY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQIHx8IHByb3ZpZGVDdXJyZW50UChzdGF0ZSwgZmFjZXRzLCB0YWlsUCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAnc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZmFjZXRzOiB7IHN1YnNjcmliZXIgfSxcbiAgICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgICBpZiAodXBkYXRlQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZUNvdW50ID0gQmlnSW50KHVwZGF0ZUNvdW50KTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgc3Vic2NyaWJlclxuICAgICAgICAgICAgICAvKiBgc3Vic2NyaWJlQWZ0ZXJgIG1heSByZXNvbHZlIHdpdGggdGhlIHVwZGF0ZSByZWNvcmQgbnVtYmVyZWQqL1xuICAgICAgICAgICAgICAvKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuICAgICAgICAgICAgICAvKiBzYW1lIGNyYW5rLi4uKi9cbiAgICAgICAgICAgICAgLnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuICAgICAgICAgICAgICAvKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbiAgICAgICAgICAgICAgLyogZnVydGhlciBvbmVzLiovXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN0YXRlU2hhcGU6IER1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZSxcbiAgICB9LFxuICApO1xufTskaM2PX29uY2UucHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5oYXJkZW4ocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcblxuICAgICAgIGNvbnN0IFN1YnNjcmliZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdTdWJzY3JpYmVyJyk7JGjNj19vbmNlLlN1YnNjcmliZXJTaGFwZShTdWJzY3JpYmVyU2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHVibGlzaGVySSI6WyJQdWJsaXNoZXJJIl0sIlVwZGF0ZUNvdW50U2hhcGUiOlsiVXBkYXRlQ291bnRTaGFwZSJdLCJTdWJzY3JpYmVySSI6WyJTdWJzY3JpYmVySSJdLCJwdWJsaXNoS2l0SUtpdCI6WyJwdWJsaXNoS2l0SUtpdCJdLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSwiSXRlcmFibGVFYWNoVG9waWNJIjpbIkl0ZXJhYmxlRWFjaFRvcGljSSJdLCJJdGVyYWJsZUxhdGVzdFRvcGljSSI6WyJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLCJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCJdLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiOlsicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Il0sIlN1YnNjcmliZXJTaGFwZSI6WyJTdWJzY3JpYmVyU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALEhEN6oMAACqDAAALgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZWQtbm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCJAZW5kby9mYXIiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIl0sImV4cG9ydHMiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLEUsRmFyLG9ic2VydmVOb3RpZmllcjskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIixbJGjNj19hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLFskaM2PX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLFskaM2PX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtCYXNlTm90aWZpZXIsIE5vdGlmaWVyfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0VSZW1vdGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7RU1hcnNoYWxsZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzJztcbiAqIEBpbXBvcnQge1N0b3JlZEZhY2V0LCBTdG9yYWdlTm9kZSwgVW5zZXJpYWxpemVyfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlQ2FwfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QmFzZU5vdGlmaWVyPFQ+ICYgT21pdDxTdG9yZWRGYWNldCwgJ2dldFN0b3JlS2V5Jz59IFN0b3JlZE5vdGlmaWVyXG4gKi9cblxuLyoqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgbm8gZnVydGhlciB3cml0ZXMgdG8gaXQgd2lsbFxuICogYmUgYXR0ZW1wdGVkIChidXQgcmVzdWx0cyB3aWxsIHJlbWFpbiBhdmFpbGFibGUgZnJvbSB0aGUgc3Vic2NyaWJlcikuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZE5vdGlmaWVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlQ2FwfSBUXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8VD4+fSBub3RpZmllclxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWROb3RpZmllcjxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWROb3RpZmllciA9IChub3RpZmllciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpID0+IHtcbiAgYXNzZXJ0QWxsRGVmaW5lZCh7IG5vdGlmaWVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciB9KTtcblxuICBjb25zdCBtYXJzaGFsbFRvU3RvcmFnZSA9IG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpO1xuXG4gIG9ic2VydmVOb3RpZmllcihub3RpZmllciwge1xuICAgIHVwZGF0ZVN0YXRlKHZhbHVlKSB7XG4gICAgICBtYXJzaGFsbFRvU3RvcmFnZSh2YWx1ZSkuY2F0Y2gocmVhc29uID0+XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byB1cGRhdGVTdGF0ZScsIHJlYXNvbiksXG4gICAgICApO1xuICAgIH0sXG4gICAgZmFpbChyZWFzb24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byBpdGVyYXRlJywgcmVhc29uKTtcbiAgICB9LFxuICB9KS5jYXRjaChyZWFzb24gPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGhhbHRlZCBpdGVyYXRpb24nLCByZWFzb24pO1xuICB9KTtcblxuICAvKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbiAgY29uc3QgdW5zZXJpYWxpemVyID0gRmFyKCd1bnNlcmlhbGl6ZXInLCB7XG4gICAgZnJvbUNhcERhdGE6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgICB1bnNlcmlhbGl6ZTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICB9KTtcblxuICAvKiogQHR5cGUge1N0b3JlZE5vdGlmaWVyPFQ+fSAqL1xuICBjb25zdCBzdG9yZWROb3RpZmllciA9IEZhcignU3RvcmVkTm90aWZpZXInLCB7XG4gICAgZ2V0VXBkYXRlU2luY2U6IHVwZGF0ZUNvdW50ID0+IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbiAgICBnZXRQYXRoOiAoKSA9PiBFKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG4gICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiB1bnNlcmlhbGl6ZXIsXG4gIH0pO1xuICByZXR1cm4gc3RvcmVkTm90aWZpZXI7XG59OyRozY9fb25jZS5tYWtlU3RvcmVkTm90aWZpZXIobWFrZVN0b3JlZE5vdGlmaWVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdG9yZWROb3RpZmllciI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAeuZOXiQmAAAkJgAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIiwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IiwibWFrZVN0b3JlZFN1YnNjcmliZXIiLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYXIsbWFrZU1hcnNoYWwsYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLG9ic2VydmVJdGVyYXRpb24sbWFrZVB1Ymxpc2hLaXQsbWFrZVN1YnNjcmlwdGlvbktpdCxzdWJzY3JpYmVFYWNoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLFskaM2PX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsWyRozY9fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRozY9fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVJdGVyYXRpb25cIixbJGjNj19hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjNj19hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChtYWtlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLFskaM2PX2EgPT4gKG1ha2VTdWJzY3JpcHRpb25LaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7SXRlcmF0aW9uT2JzZXJ2ZXIsIExhdGVzdFRvcGljLCBOb3RpZmllciwgTm90aWZpZXJSZWNvcmQsIFB1YmxpY2F0aW9uUmVjb3JkLCBQdWJsaXNoZXIsIFB1Ymxpc2hLaXQsIFN0b3JlZFB1Ymxpc2hLaXQsIFN0b3JlZFN1YnNjcmlwdGlvbiwgU3RvcmVkU3Vic2NyaWJlciwgU3Vic2NyaWJlciwgU3Vic2NyaXB0aW9uLCBVcGRhdGVSZWNvcmR9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtTdG9yYWdlTm9kZSwgVW5zZXJpYWxpemVyfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzJztcbiAqIEBpbXBvcnQge0VNYXJzaGFsbGVyfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZUNhcH0gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKi9cblxuLyoqXG4gKiBOQjogZG9lcyBub3QgeWV0IHN1cnZpdmUgdXBncmFkZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzY4OTNcbiAqXG4gKiBAYWxwaGFcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7KHY6IFQpID0+IHZvaWR9IGNvbnN1bWVWYWx1ZVxuICovXG4gICAgICAgY29uc3QgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkID0gYXN5bmMgKHN1YnNjcmliZXIsIGNvbnN1bWVWYWx1ZSkgPT4ge1xuICAvKiBXZSBvcGVuLWNvZGUgdGhlIGZvci1hd2FpdC1vZiBpbXBsZW1lbnRhdGlvbiByYXRoZXIgdGhhbiB1c2luZyB0aGF0IHN5bnRheCovXG4gIC8qIGRpcmVjdGx5IGJlY2F1c2Ugd2Ugd2FudCB0byBydW4gdGhlIGNvbnN1bWVyIG9uIHRoZSBkb25lIHZhbHVlIGFzIHdlbGwuKi9cbiAgY29uc3QgaXRlcmF0b3IgPSBzdWJzY3JpYmVFYWNoKHN1YnNjcmliZXIpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICBhd2FpdCBudWxsO1xuICB3aGlsZSAoIWZpbmlzaGVkKSB7XG4gICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgIGF3YWl0IGNvbnN1bWVWYWx1ZSh2YWx1ZSk7XG4gICAgZmluaXNoZWQgPSAhIWRvbmU7XG4gIH1cbn07XG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpYmVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlQ2FwfSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaWJlcjxUPn1cbiAqLyRozY9fb25jZS5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKTtcbiAgICAgICBjb25zdCBtYWtlU3RvcmVkU3Vic2NyaWJlciA9IChzdWJzY3JpYmVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBhc3NlcnRBbGxEZWZpbmVkKHsgc3Vic2NyaWJlciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIgfSk7XG5cbiAgY29uc3QgbWFyc2hhbGxUb1N0b3JhZ2UgPSBtYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKTtcblxuICAvKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbiAgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKHN1YnNjcmliZXIsIG1hcnNoYWxsVG9TdG9yYWdlKS5jYXRjaChlcnIgPT4ge1xuICAgIC8qIFRPRE86IEhvdyBzaG91bGQgd2UgaGFuZGxlIGFuZC9vciBzdXJmYWNlIHRoaXMgZmFpbHVyZT8qL1xuICAgIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU3NjYjZGlzY3Vzc2lvbl9yOTIyNDk4MDg4Ki9cbiAgICBjb25zb2xlLmVycm9yKCdTdG9yZWRTdWJzY3JpYmVyIGZhaWxlZCB0byBpdGVyYXRlJywgZXJyKTtcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG4gIGNvbnN0IHVuc2VyaWFsaXplciA9IEZhcigndW5zZXJpYWxpemVyJywge1xuICAgIGZyb21DYXBEYXRhOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gICAgdW5zZXJpYWxpemU6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSAqL1xuICBjb25zdCBzdG9yZXN1YiA9IEZhcignU3RvcmVkU3Vic2NyaWJlcicsIHtcbiAgICBzdWJzY3JpYmVBZnRlcjogcHVibGlzaENvdW50ID0+IHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcbiAgICBnZXRVcGRhdGVTaW5jZTogdXBkYXRlQ291bnQgPT4gc3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG4gICAgZ2V0UGF0aDogKCkgPT4gRShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuICAgIGdldFN0b3JlS2V5OiAoKSA9PiBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpLFxuICAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gdW5zZXJpYWxpemVyLFxuICB9KTtcbiAgcmV0dXJuIHN0b3Jlc3ViO1xufTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgbWFrZVN0b3JlZFN1YnNjcmliZXJcbiAqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgdGhlIGl0ZXJhdGlvbiB3aWxsIGJlIHRlcm1pbmF0ZWQuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpcHRpb25cbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT4gfCBudWxsfSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpcHRpb248VD59XG4gKi8kaM2PX29uY2UubWFrZVN0b3JlZFN1YnNjcmliZXIobWFrZVN0b3JlZFN1YnNjcmliZXIpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRTdWJzY3JpcHRpb24gPSAoXG4gIHN1YnNjcmlwdGlvbixcbiAgc3RvcmFnZU5vZGUsXG4gIG1hcnNoYWxsZXIgPSBtYWtlTWFyc2hhbCh1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuICAgIG1hcnNoYWxTYXZlRXJyb3I6ICgpID0+IHt9LFxuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnLFxuICB9KSxcbikgPT4ge1xuICAvKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbiAgY29uc3QgdW5zZXJpYWxpemVyID0gRmFyKCd1bnNlcmlhbGl6ZXInLCB7XG4gICAgZnJvbUNhcERhdGE6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgICB1bnNlcmlhbGl6ZTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICB9KTtcblxuICAvKiBBYm9ydCB0aGUgaXRlcmF0aW9uIG9uIHRoZSBuZXh0IG9ic2VydmF0aW9uIGlmIHRoZSBwdWJsaXNoZXIgZXZlciBmYWlscy4qL1xuICBsZXQgcHVibGlzaEZhaWxlZCA9IGZhbHNlO1xuICBsZXQgcHVibGlzaEV4Y2VwdGlvbjtcblxuICBjb25zdCBmYWlsID0gZXJyID0+IHtcbiAgICBwdWJsaXNoRmFpbGVkID0gdHJ1ZTtcbiAgICBwdWJsaXNoRXhjZXB0aW9uID0gZXJyO1xuICB9O1xuXG4gIC8qIE11c3QgKm5vdCogYmUgYW4gYXN5bmMgZnVuY3Rpb24sIGJlY2F1c2UgaXQgc29tZXRpbWVzIG11c3QgdGhyb3cgdG8gYWJvcnQqL1xuICAvKiB0aGUgaXRlcmF0aW9uLiovXG4gIGNvbnN0IHB1Ymxpc2hWYWx1ZSA9IG9iaiA9PiB7XG4gICAgYXNzZXJ0KHN0b3JhZ2VOb2RlKTtcbiAgICBpZiAocHVibGlzaEZhaWxlZCkge1xuICAgICAgLyogVG8gcHJvcGVybHkgYWJvcnQgdGhlIGl0ZXJhdGlvbiwgdGhpcyBtdXN0IGJlIGEgc3luY2hyb25vdXMgZXhjZXB0aW9uLiovXG4gICAgICB0aHJvdyBwdWJsaXNoRXhjZXB0aW9uO1xuICAgIH1cblxuICAgIC8qIFB1Ymxpc2ggdGhlIHZhbHVlLCBjYXB0dXJpbmcgYW55IGVycm9yLiovXG4gICAgRShtYXJzaGFsbGVyKVxuICAgICAgLnRvQ2FwRGF0YShvYmopXG4gICAgICAudGhlbihzZXJpYWxpemVkID0+IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xuICAgICAgICByZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoZW5jb2RlZCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGZhaWwpO1xuICB9O1xuXG4gIGlmIChzdG9yYWdlTm9kZSkge1xuICAgIC8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xuICAgIG9ic2VydmVJdGVyYXRpb24oc3Vic2NyaXB0aW9uLCB7XG4gICAgICB1cGRhdGVTdGF0ZTogcHVibGlzaFZhbHVlLFxuICAgICAgZmluaXNoOiBwdWJsaXNoVmFsdWUsXG4gICAgfSkuY2F0Y2goZmFpbCk7XG4gIH1cblxuICAvKiogQHR5cGUge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gKi9cbiAgY29uc3Qgc3RvcmVzdWIgPSBGYXIoJ1N0b3JlZFN1YnNjcmlwdGlvbicsIHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGdldFN0b3JlS2V5IHR5cGUgZG9lcyBub3QgaGF2ZSBgc3Vic2NyaXB0aW9uYCovXG4gICAgZ2V0U3RvcmVLZXk6IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc3RvcmFnZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IHN1YnNjcmlwdGlvbiB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0b3JlS2V5ID0gYXdhaXQgRShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyAuLi5zdG9yZUtleSwgc3Vic2NyaXB0aW9uIH0pO1xuICAgIH0sXG4gICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiB1bnNlcmlhbGl6ZXIsXG4gICAgZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6ICgpID0+XG4gICAgICBzdWJzY3JpcHRpb24uZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzdWJzY3JpcHRpb25bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCksXG4gICAgc3Vic2NyaWJlQWZ0ZXI6IHB1Ymxpc2hDb3VudCA9PiBzdWJzY3JpcHRpb24uc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcbiAgfSk7XG4gIHJldHVybiBzdG9yZXN1Yjtcbn07JGjNj19vbmNlLm1ha2VTdG9yZWRTdWJzY3JpcHRpb24obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0b3JlZFB1Ymxpc2hLaXRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRQdWJsaXNoZXJLaXRcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBwdWJsaXNoZXJcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGluY29tcGF0aWJsZSB3aXRoIGR1cmFiaWxpdHk7IGluc3RlYWQgaGFuZGxlIHZzdG9yYWdlIGVwaGVtZXJhbGx5IG9uIGEgZHVyYWJsZSBQdWJsaXNoS2l0XG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+IHwgbnVsbH0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gW21hcnNoYWxsZXJdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NoaWxkUGF0aF1cbiAqIEByZXR1cm5zIHtTdG9yZWRQdWJsaXNoZXJLaXQ8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3RvcmVkUHVibGlzaGVyS2l0ID0gKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyLCBjaGlsZFBhdGgpID0+IHtcbiAgY29uc3QgeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH0gPSBtYWtlU3Vic2NyaXB0aW9uS2l0KCk7XG5cbiAgaWYgKHN0b3JhZ2VOb2RlICYmIGNoaWxkUGF0aCkge1xuICAgIHN0b3JhZ2VOb2RlID0gRShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZFBhdGgpO1xuICB9XG5cbiAgLyogd3JhcCB0aGUgc3Vic2NyaXB0aW9uIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSwgcmVwZWF0aW5nIHRvIHRoaXMgYHN1YnNjcmliZXJgKi9cbiAgY29uc3Qgc3Vic2NyaWJlciA9IG1ha2VTdG9yZWRTdWJzY3JpcHRpb24oXG4gICAgc3Vic2NyaXB0aW9uLFxuICAgIHN0b3JhZ2VOb2RlLFxuICAgIG1hcnNoYWxsZXIsXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBwdWJsaXNoZXI6IHB1YmxpY2F0aW9uLFxuICAgIHN1YnNjcmliZXIsXG4gIH07XG59O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGluY29tcGF0aWJsZSB3aXRoIGR1cmFiaWxpdHk7IGluc3RlYWQgaGFuZGxlIHZzdG9yYWdlIGVwaGVtZXJhbGx5IG9uIGEgZHVyYWJsZSBQdWJsaXNoS2l0XG4gKlxuICogTGlrZSBtYWtlUHVibGlzaEtpdCB0aGlzIG1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIFdoYXQncyBkaWZmZXJlbnQgaXMgYHN1YnNjcmliZXJgIHRlZXMgcmVjb3Jkcywgd3JpdGluZyBvdXQgdG8gc3RvcmFnZU5vZGUuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hLaXQ8VD59XG4gKi8kaM2PX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hlcktpdChtYWtlU3RvcmVkUHVibGlzaGVyS2l0KTtcbiAgICAgICBjb25zdCBtYWtlU3RvcmVkUHVibGlzaEtpdCA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICByZXR1cm4ge1xuICAgIHB1Ymxpc2hlcixcbiAgICAvKiB3cmFwIHRoZSBzdWJzY3JpYmVyIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSovXG4gICAgc3Vic2NyaWJlcjogbWFrZVN0b3JlZFN1YnNjcmliZXIoc3Vic2NyaWJlciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpLFxuICB9O1xufTskaM2PX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hLaXQobWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCI6WyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiXSwibWFrZVN0b3JlZFN1YnNjcmliZXIiOlsibWFrZVN0b3JlZFN1YnNjcmliZXIiXSwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiI6WyJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCJdLCJtYWtlU3RvcmVkUHVibGlzaEtpdCI6WyJtYWtlU3RvcmVkUHVibGlzaEtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABkDr188ikAAPIpAAAoAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiXSwiZXhwb3J0cyI6WyJzdWJzY3JpYmUiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxGYWlsLGFubm90YXRlRXJyb3IsRSxGYXIsaXNQcmltaXRpdmUsaXNVcGdyYWRlRGlzY29ubmVjdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qc1wiLCBbW1wiaXNVcGdyYWRlRGlzY29ubmVjdGlvblwiLFskaM2PX2EgPT4gKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtJdGVyYXRpb25PYnNlcnZlciwgTGF0ZXN0VG9waWMsIE5vdGlmaWVyLCBOb3RpZmllclJlY29yZCwgUHVibGljYXRpb25SZWNvcmQsIFB1Ymxpc2hlciwgUHVibGlzaEtpdCwgU3RvcmVkUHVibGlzaEtpdCwgU3RvcmVkU3Vic2NyaXB0aW9uLCBTdG9yZWRTdWJzY3JpYmVyLCBTdWJzY3JpYmVyLCBTdWJzY3JpcHRpb24sIFVwZGF0ZVJlY29yZCwgRWFjaFRvcGljLCBGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcn0gZnJvbSAnLi4vc3JjL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCBzaW5rID0gKCkgPT4ge307XG5cbi8qKlxuICogQ2hlY2sgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgYSBmdW5jdGlvbiBmb3IgcmVqZWN0aW9uIGJ5IHZhdCB1cGdyYWRlLFxuICogYW5kIHJlZmV0Y2ggdXBvbiBlbmNvdW50ZXJpbmcgdGhhdCBjb25kaXRpb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gRVJlZjxUPn0gZ2V0dGVyXG4gKiBAcGFyYW0ge0VSZWY8VD5bXX0gW3NlZWRdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPn1cbiAqL1xuY29uc3QgcmVjb25uZWN0QXNOZWVkZWQgPSBhc3luYyAoZ2V0dGVyLCBzZWVkID0gW10pID0+IHtcbiAgbGV0IGRpc2Nvbm5lY3Rpb247XG4gIGxldCBsYXN0VmVyc2lvbiA9IC1JbmZpbml0eTtcbiAgLyogRW5kIHN5bmNocm9ub3VzIHByZWx1ZGUuKi9cbiAgYXdhaXQgbnVsbDtcbiAgZm9yIChsZXQgaSA9IDA7IDsgaSArPSAxKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdFAgPSBpIDwgc2VlZC5sZW5ndGggPyBzZWVkW2ldIDogZ2V0dGVyKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXN1bHRQO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKGVycikpIHtcbiAgICAgICAgaWYgKCFkaXNjb25uZWN0aW9uKSB7XG4gICAgICAgICAgZGlzY29ubmVjdGlvbiA9IGVycjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGluY2FybmF0aW9uTnVtYmVyOiB2ZXJzaW9uIH0gPSBlcnI7XG4gICAgICAgIGlmICh2ZXJzaW9uID4gbGFzdFZlcnNpb24pIHtcbiAgICAgICAgICAvKiBXZSBkb24ndCBleHBlY3QgYW5vdGhlciB1cGdyYWRlIGluIGJldHdlZW4gcmVjZWl2aW5nKi9cbiAgICAgICAgICAvKiBhIGRpc2Nvbm5lY3Rpb24gYW5kIHJlLXJlcXVlc3RpbmcgYW4gdXBkYXRlLCBidXQgbXVzdCovXG4gICAgICAgICAgLyogbmV2ZXJ0aGVsZXNzIGJlIHByZXBhcmVkIGZvciB0aGF0LiovXG4gICAgICAgICAgbGFzdFZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBpZiBgZXJyYCBpcyBhbiAoRXJyb3IpIG9iamVjdCwgd2UgY2FuIHRyeSB0byBhc3NvY2lhdGUgaXQgd2l0aCovXG4gICAgICAvKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlzY29ubmVjdGlvbiB0aGF0IHByb21wdGVkIHRoZSByZXF1ZXN0Ki9cbiAgICAgIC8qIGZvciB3aGljaCBpdCBpcyBhIHJlc3VsdC4qL1xuICAgICAgaWYgKCFpc1ByaW1pdGl2ZShlcnIpICYmIGRpc2Nvbm5lY3Rpb24gJiYgZGlzY29ubmVjdGlvbiAhPT0gZXJyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYW5ub3RhdGVFcnJvcihcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIFhgQXR0ZW1wdGluZyB0byByZWNvdmVyIGZyb20gZGlzY29ubmVjdGlvbjogJHtkaXNjb25uZWN0aW9ufWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICAgIC8qIG5vb3AqL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIG5lYXIgaXRlcmFibGUgdGhhdCBjb3JyZXNwb25kcyB0byBhIHBvdGVudGlhbGx5IGZhciBvbmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VD4+fSBpdFBcbiAqL1xuICAgICAgIGNvbnN0IHN1YnNjcmliZSA9IGl0UCA9PlxuICBGYXIoJ0FzeW5jSXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgaXQgPSBFKGl0UClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBzZWxmID0gRmFyKCdBc3luY0l0ZXJhYmxlSXRlcmF0b3InLCB7XG4gICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHNlbGYsXG4gICAgICAgIG5leHQ6IGFzeW5jICgpID0+IEUoaXQpLm5leHQoKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcbiAgfSk7XG5cbi8qKlxuICogQXN5bmNyb25vdXNseSBpdGVyYXRlcyBvdmVyIHRoZSBjb250ZW50cyBvZiBhIFB1YmxpY2F0aW9uUmVjb3JkIGNoYWluIGFzIHRoZXlcbiAqIGFwcGVhci4gIFRoaXMgaXRlcmF0aW9uIG11c3QgZHJvcCBwYXJ0cyBvZiBwdWJsaWNhdGlvbiByZWNvcmRzIHRoYXQgYXJlIG5vXG4gKiBsb25nZXIgbmVlZGVkIHNvIHRoZXkgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IG5leHRDZWxsUFxuICogICBQdWJsaWNhdGlvblJlY29yZCBjb3JyZXNwb25kaW5nIHdpdGggdGhlIGZpcnN0IGl0ZXJhdGlvbiByZXN1bHRcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUPn1cbiAqLyRozY9fb25jZS5zdWJzY3JpYmUoc3Vic2NyaWJlKTtcbmNvbnN0IG1ha2VFYWNoSXRlcmF0b3IgPSAodG9waWMsIG5leHRDZWxsUCkgPT4ge1xuICAvKiBUbyB1bmRlcnN0YW5kIHRoZSBpbXBsZW1lbnRhdGlvbiwgc3RhcnQgd2l0aCovXG4gIC8qIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwNDEyMjI1MC9odHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1zdHJhd21hbjpjb25jdXJyZW5jeSNpbmZpbml0ZV9xdWV1ZSovXG4gIGNvbnN0IHNlbGYgPSBGYXIoJ0VhY2hJdGVyYXRvcicsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgIG5leHQ6ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaGVhZDogcmVzdWx0UCxcbiAgICAgICAgcHVibGlzaENvdW50OiBwdWJsaXNoQ291bnRQLFxuICAgICAgICB0YWlsOiB0YWlsUCxcbiAgICAgIH0gPSBFLmdldChuZXh0Q2VsbFApO1xuXG4gICAgICAvKiBJZiB0YWlsUCBpcyBicm9rZW4gYnkgdXBncmFkZSwgd2Ugd2lsbCBuZWVkIHRvIHJlLXJlcXVlc3QgaXQqL1xuICAgICAgLyogZGlyZWN0bHkgZnJvbSBgdG9waWNgLiovXG4gICAgICBjb25zdCBnZXRTdWNjZXNzb3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHB1Ymxpc2hDb3VudCA9IGF3YWl0IHB1Ymxpc2hDb3VudFA7XG4gICAgICAgIGFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCAnYmlnaW50Jyk7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NvciA9IGF3YWl0IEUodG9waWMpLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCk7XG4gICAgICAgIGNvbnN0IG5ld1B1Ymxpc2hDb3VudCA9IHN1Y2Nlc3Nvci5wdWJsaXNoQ291bnQ7XG4gICAgICAgIGlmIChuZXdQdWJsaXNoQ291bnQgIT09IHB1Ymxpc2hDb3VudCArIDFuKSB7XG4gICAgICAgICAgRmFpbGBlYWNoSXRlcmF0b3IgYnJva2VuIGJ5IGdhcCBmcm9tIHB1Ymxpc2hDb3VudCAke3B1Ymxpc2hDb3VudH0gdG8gJHtuZXdQdWJsaXNoQ291bnR9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VjY2Vzc29yO1xuICAgICAgfTtcblxuICAgICAgLyogUmVwbGFjZSBuZXh0Q2VsbFAgb24gZXZlcnkgY2FsbCB0byBuZXh0KCkgc28gdGhpbmdzIHdvcmsgZXZlbiovXG4gICAgICAvKiB3aXRoIGFuIGVhZ2VyIGNvbnN1bWVyIHRoYXQgZG9lc24ndCB3YWl0IGZvciByZXN1bHRzIHRvIHNldHRsZS4qL1xuICAgICAgbmV4dENlbGxQID0gcmVjb25uZWN0QXNOZWVkZWQoZ2V0U3VjY2Vzc29yLCBbdGFpbFBdKTtcblxuICAgICAgLyogQXZvaWQgdW5oYW5kbGVkIHJlamVjdGlvbiB3YXJuaW5ncyBoZXJlIGlmIHRoZSBwcmV2aW91cyBjZWxsIHdhcyByZWplY3RlZCBvciovXG4gICAgICAvKiB0aGVyZSBpcyBubyBmdXJ0aGVyIHJlcXVlc3Qgb2YgdGhpcyBpdGVyYXRvci4qL1xuICAgICAgLyogYHRhaWxQYCBpcyBoYW5kbGVkIGluc2lkZSBgcmVjb25uZWN0QXNOZWVkZWRgIGFuZCBgcmVzdWx0UGAgaXMgdGhlIGNhbGxlcidzKi9cbiAgICAgIC8qIGNvbmNlcm4sIGxlYXZpbmcgb25seSBgcHVibGlzaENvdW50UGAgYW5kIHRoZSBuZXcgYG5leHRDZWxsUGAuKi9cbiAgICAgIHZvaWQgRS53aGVuKHB1Ymxpc2hDb3VudFAsIHNpbmssIHNpbmspO1xuICAgICAgdm9pZCBFLndoZW4obmV4dENlbGxQLCBzaW5rLCBzaW5rKTtcbiAgICAgIHJldHVybiByZXN1bHRQO1xuICAgIH0sXG4gICAgZm9yazogKCkgPT4gbWFrZUVhY2hJdGVyYXRvcih0b3BpYywgbmV4dENlbGxQKSxcbiAgfSk7XG4gIHJldHVybiBzZWxmO1xufTtcblxuLyoqXG4gKiBHaXZlbiBhIGxvY2FsIG9yIHJlbW90ZSBzdWJzY3JpYmVyLCByZXR1cm5zIGEgbG9jYWwgQXN5bmNJdGVyYWJsZSB3aGljaFxuICogcHJvdmlkZXMgXCJwcmVmaXggbG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwicHJlZml4IGxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgZXZlcnl0aGluZyBwdWJsaXNoZWQgYmVmb3JlXG4gKiB5b3UgYXNrIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBmb3IgYW4gaXRlcmF0b3IuIEJ1dCB0aGUgcmV0dXJuZWQgaXRlcmF0b3JcbiAqIHdpbGwgZW51bWVyYXRlIGVhY2ggdGhpbmcgcHVibGlzaGVkIGZyb20gdGhhdCBpdGVyYXRvcidzIHN0YXJ0aW5nIHBvaW50XG4gKiB1cCB0byBhIGRpc2Nvbm5lY3Rpb24gcmVzdWx0IGluZGljYXRpbmcgdXBncmFkZSBvZiB0aGUgcHJvZHVjZXJcbiAqICh3aGljaCBicmVha3MgdGhlIGdhcC1mcmVlIGd1YXJhbnRlZSBhbmQgdGhlcmVmb3JlIHRlcm1pbmF0ZXMgYW55IGFjdGl2ZVxuICogaXRlcmF0b3Igd2hpbGUgc3RpbGwgc3VwcG9ydGluZyBjcmVhdGlvbiBvZiBuZXcgaXRlcmF0b3JzKS5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqL1xuICAgICAgIGNvbnN0IHN1YnNjcmliZUVhY2ggPSB0b3BpYyA9PiB7XG4gIGNvbnN0IGl0ZXJhYmxlID0gRmFyKCdFYWNoSXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgZmlyc3RDZWxsUCA9IHJlY29ubmVjdEFzTmVlZGVkKCgpID0+IEUodG9waWMpLnN1YnNjcmliZUFmdGVyKCkpO1xuICAgICAgcmV0dXJuIG1ha2VFYWNoSXRlcmF0b3IodG9waWMsIGZpcnN0Q2VsbFApO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaXRlcmFibGU7XG59OyRozY9fb25jZS5zdWJzY3JpYmVFYWNoKHN1YnNjcmliZUVhY2gpO1xuaGFyZGVuKHN1YnNjcmliZUVhY2gpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICogQHBhcmFtIHtiaWdpbnR9IFtsb2NhbFVwZGF0ZUNvdW50XVxuICogQHBhcmFtIHtJdGVyYXRvclJldHVyblJlc3VsdDxUPn0gW3Rlcm1pbmFsUmVzdWx0XVxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovXG5jb25zdCBjbG9uZUxhdGVzdEl0ZXJhdG9yID0gKHRvcGljLCBsb2NhbFVwZGF0ZUNvdW50LCB0ZXJtaW5hbFJlc3VsdCkgPT4ge1xuICBsZXQgbXV0ZXggPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAvKipcbiAqIFJlcXVlc3QgdGhlIG5leHQgdXBkYXRlIHJlY29yZCBmcm9tIHRoZSB0b3BpYywgdXBkYXRpbmcgb3VyIGxvY2FsIHN0YXRlLFxuICogYW5kIGNvbnZlcnQgaXQgdG8gYW4gaXRlcmF0b3IgcmVzdWx0LlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFQ+Pn1cbiAqL1xuICBjb25zdCBtYXliZVJlcXVlc3ROZXh0UmVzdWx0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICh0ZXJtaW5hbFJlc3VsdCkge1xuICAgICAgLyogV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB0b3BpYywganVzdCBrZWVwIHJldHVybmluZyB0aGUgbGFzdCByZXN1bHQqL1xuICAgICAgLyogd2l0aG91dCBmdXJ0aGVyIHJlcXVlc3RzLiovXG4gICAgICByZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gICAgfVxuXG4gICAgLyogU2VuZCB0aGUgbmV4dCByZXF1ZXN0IG5vdywgc2tpcHBpbmcgcGFzdCBpbnRlcm1lZGlhdGUgdXBkYXRlcyovXG4gICAgLyogYW5kIHVwZ3JhZGUgZGlzY29ubmVjdGlvbnMuKi9cbiAgICBjb25zdCB7IHZhbHVlLCB1cGRhdGVDb3VudCB9ID0gYXdhaXQgcmVjb25uZWN0QXNOZWVkZWQoKCkgPT5cbiAgICAgIEUodG9waWMpLmdldFVwZGF0ZVNpbmNlKGxvY2FsVXBkYXRlQ291bnQpLFxuICAgICk7XG4gICAgLyogTWFrZSBzdXJlIHRoZSBuZXh0IHJlcXVlc3QgaXMgZm9yIGEgZnJlc2hlciB2YWx1ZS4qL1xuICAgIGxvY2FsVXBkYXRlQ291bnQgPSB1cGRhdGVDb3VudDtcblxuICAgIC8qIE1ha2UgYW4gSXRlcmF0b3JSZXN1bHQuKi9cbiAgICBpZiAodXBkYXRlQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGVybWluYWxSZXN1bHQgPSBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZSB9KTtcbiAgICAgIHJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZSB9KTtcbiAgfTtcblxuICBjb25zdCBzZWxmID0gRmFyKCdMYXRlc3RJdGVyYXRvcicsIHtcbiAgICBmb3JrOiAoKSA9PiBjbG9uZUxhdGVzdEl0ZXJhdG9yKHRvcGljLCBsb2NhbFVwZGF0ZUNvdW50LCB0ZXJtaW5hbFJlc3VsdCksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gc2VsZixcbiAgICBuZXh0OiBhc3luYyAoKSA9PiB7XG4gICAgICAvKiBJbiB0aGlzIGFkYXB0b3IsIG9uY2UgYG5leHQoKWAgaXMgY2FsbGVkIGFuZCByZXR1cm5zIGFuIHVucmVzb2x2ZWQqL1xuICAgICAgLyogcHJvbWlzZSwgZnVydGhlciBgbmV4dCgpYCBjYWxscyB3aWxsIGFsc28gcmV0dXJuIHVucmVzb2x2ZWQgcHJvbWlzZXMqL1xuICAgICAgLyogYnV0IGVhY2ggY2FsbCB3aWxsIG5vdCB0cmlnZ2VyIGFub3RoZXIgYHRvcGljYCByZXF1ZXN0IHVudGlsIHRoZSBwcmlvciovXG4gICAgICAvKiBvbmUgaGFzIHNldHRsZWQuKi9cbiAgICAgIC8qKi9cbiAgICAgIC8qIFRoaXMgbGluZWFyIHF1ZXVlaW5nIGJlaGF2aW9yIGlzIG9ubHkgbmVlZGVkIGZvciBjb2RlIHRoYXQgdXNlcyB0aGUqL1xuICAgICAgLyogYXN5bmMgaXRlcmF0b3IgcHJvdG9jb2wgZXhwbGljaXRseS4gV2hlbiB0aGlzIGFzeW5jIGl0ZXJhdG9yIGlzKi9cbiAgICAgIC8qIGNvbnN1bWVkIGJ5IGEgZm9yL2F3YWl0L29mIGxvb3AsIGBuZXh0KClgIHdpbGwgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlKi9cbiAgICAgIC8qIHByb21pc2UgZm9yIHRoZSBwcmV2aW91cyBpdGVyYXRpb24gcmVzdWx0IGhhcyBmdWxmaWxsZWQuIElmIGl0IGZ1bGZpbGxzKi9cbiAgICAgIC8qIHdpdGggYGRvbmU6IHRydWVgLCB0aGUgZm9yL2F3YWl0L29mIGxvb3Agd2lsbCBuZXZlciBjYWxsIGBuZXh0KClgKi9cbiAgICAgIC8qIGFnYWluLiovXG4gICAgICAvKiovXG4gICAgICAvKiBTZWUqL1xuICAgICAgLyogaHR0cHM6Ly8yYWxpdHkuY29tLzIwMTYvMTAvYXN5bmNocm9ub3VzLWl0ZXJhdGlvbi5odG1sI3F1ZXVpbmctbmV4dCgpLWludm9jYXRpb25zKi9cbiAgICAgIC8qIGZvciBhbiBleHBsaWNpdCB1c2UgdGhhdCBzZW5kcyBgbmV4dCgpYCB3aXRob3V0IHdhaXRpbmcuKi9cblxuICAgICAgaWYgKHRlcm1pbmFsUmVzdWx0KSB7XG4gICAgICAgIC8qIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdG9waWMsIGp1c3Qga2VlcCByZXR1cm5pbmcgdGhlIGxhc3QqL1xuICAgICAgICAvKiByZXN1bHQuKi9cbiAgICAgICAgcmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICAvKiBCRUdJTiBDUklUSUNBTCBTRUNUSU9OIC0gc3luY2hyb25vdXNseSBlbnF1ZXVlIGFuZCByZWFzc2lnbiBgbXV0ZXhgKi9cbiAgICAgIC8qKi9cbiAgICAgIC8qIFVzZSBgbXV0ZXhgIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgbm8gbW9yZSB0aGFuIGEgc2luZ2xlIHJlcXVlc3QgaW4qL1xuICAgICAgLyogZmxpZ2h0LiovXG4gICAgICBjb25zdCBuZXh0UmVzdWx0ID0gbXV0ZXgudGhlbihtYXliZVJlcXVlc3ROZXh0UmVzdWx0KTtcbiAgICAgIG11dGV4ID0gbmV4dFJlc3VsdC50aGVuKHNpbmssIHNpbmspO1xuICAgICAgLyogRU5EIENSSVRJQ0FMIFNFQ1RJT04qL1xuXG4gICAgICByZXR1cm4gbmV4dFJlc3VsdDtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHNlbGY7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovXG5jb25zdCBtYWtlTGF0ZXN0SXRlcmF0b3IgPSB0b3BpYyA9PiBjbG9uZUxhdGVzdEl0ZXJhdG9yKHRvcGljKTtcblxuLyoqXG4gKiBHaXZlbiBhIGxvY2FsIG9yIHJlbW90ZSBzdWJzY3JpYmVyLCByZXR1cm5zIGEgbG9jYWwgQXN5bmNJdGVyYWJsZSB3aGljaFxuICogcHJvdmlkZXMgXCJsb3NzeVwiIGl0ZXJhdGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0LlxuICogQnkgXCJsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGFueSBwdWJsaXNoZWQgc3RhdGUgaWYgYSBtb3JlXG4gKiByZWNlbnQgcHVibGlzaGVkIHN0YXRlIGNhbiBiZSByZXBvcnRlZCBpbnN0ZWFkLlxuICpcbiAqIElmIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdCBpcyB0ZXJtaW5hdGVkIGJ5IHVwZ3JhZGUgb2YgdGhlIHByb2R1Y2VyLFxuICogaXQgd2lsbCBiZSByZS1yZXF1ZXN0ZWQuIEFsbCBvdGhlciB0ZXJtaW5hbCB2YWx1ZXMgd2lsbCBiZSBsb3NzbGVzc2x5XG4gKiBwcm9wYWdhdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICovXG4gICAgICAgY29uc3Qgc3Vic2NyaWJlTGF0ZXN0ID0gdG9waWMgPT4ge1xuICBjb25zdCBpdGVyYWJsZSA9IEZhcignTGF0ZXN0SXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gbWFrZUxhdGVzdEl0ZXJhdG9yKHRvcGljKSxcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZTtcbn07JGjNj19vbmNlLnN1YnNjcmliZUxhdGVzdChzdWJzY3JpYmVMYXRlc3QpO1xuaGFyZGVuKHN1YnNjcmliZUxhdGVzdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdWJzY3JpYmUiOlsic3Vic2NyaWJlIl0sInN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFeqBJEpDQAAKQ0AACkAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlci5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N1YnNjcmliZS5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3RvcGljLmpzIl0sImV4cG9ydHMiOlsibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixzdWJzY3JpYmVFYWNoLG1ha2VQdWJsaXNoS2l0LG1ha2VQaW5uZWRIaXN0b3J5VG9waWM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRozY9fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3RvcGljLmpzXCIsIFtbXCJtYWtlUGlubmVkSGlzdG9yeVRvcGljXCIsWyRozY9fYSA9PiAobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VhY2hUb3BpYywgSXRlcmF0aW9uT2JzZXJ2ZXIsIExhdGVzdFRvcGljLCBOb3RpZmllciwgTm90aWZpZXJSZWNvcmQsIFN1YnNjcmlwdGlvblJlY29yZCwgUHVibGlzaGVyLCBQdWJsaXNoS2l0LCBTdG9yZWRQdWJsaXNoS2l0LCBTdG9yZWRTdWJzY3JpcHRpb24sIFN0b3JlZFN1YnNjcmliZXIsIFN1YnNjcmliZXIsIFN1YnNjcmlwdGlvbiwgVXBkYXRlUmVjb3JkfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICogQHJldHVybnMge1N1YnNjcmlwdGlvbjxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbiA9IHRvcGljID0+IHtcbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0gRmFyKCdTdWJzY3JpcHRpb24nLCB7XG4gICAgLi4uc3Vic2NyaWJlRWFjaCh0b3BpYyksXG4gICAgc3Vic2NyaWJlQWZ0ZXI6IGFzeW5jIHB1Ymxpc2hDb3VudCA9PiBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuXG4gICAgLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgU3Vic2NyaXB0aW9uIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBTdWJzY3JpcHRpb24gdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZVN1YnNjcmlwdGlvbmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBTdWJzY3JpcHRpb24gYXQgdGhhdCBzaXRlLlxuICovXG4gICAgZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6IGFzeW5jICgpID0+IHRvcGljLFxuXG4gICAgZ2V0U3RvcmVLZXk6ICgpID0+IGhhcmRlbih7IHN1YnNjcmlwdGlvbiB9KSxcbiAgfSk7XG4gIHJldHVybiBzdWJzY3JpcHRpb247XG59OyRozY9fb25jZS5tYWtlU3Vic2NyaXB0aW9uKG1ha2VTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb24pO1xuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgUHJvZHVjZXJzIHNob3VsZCB1c2VcbiAqIGBgYGpzXG4gKiBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcbiAqIGNvbnN0IHRvcGljID0gbWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhzdWJzY3JpYmVyKTtcbiAqIGBgYFxuICogaW5zdGVhZCwgd2hpY2ggbWFrZXMgaXQgY2xlYXJlciB0aGF0IGFsbCB0aGUgc3Vic2NyaWJlcidzIGhpc3RvcnkgaXNcbiAqIHJldGFpbmVkLCBwcmV2ZW50aW5nIEdDLiAgUG90ZW50aWFsbHkgcmVtb3RlIGNvbnN1bWVycyB1c2VcbiAqIGBgYGpzXG4gKiBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIHN1YnNjcmliZUVhY2godG9waWMpKSB7IC4uLiB9XG4gKiBgYGBcbiAqXG4gKiBNYWtlcyBhIGB7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfWAgZm9yIGRvaW5nIGxvc3NsZXNzIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1Yi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1N1YnNjcmlwdGlvblJlY29yZDxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbktpdCA9ICgpID0+IHtcbiAgY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VQdWJsaXNoS2l0KCk7XG5cbiAgLyogVGhlIHB1Ymxpc2gga2l0IHN1YnNjcmliZXIgaXMgcHJlZml4LWxvc3N5LCBzbyBtYWtpbmcgKnRoaXMqIHN1YnNjcmliZXIgY29tcGxldGVseSovXG4gIC8qIGxvc3NsZXNzIGZyb20gaW5pdGlhbGlzYXRpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgZm9ybWVyJ3MgaGlzdG9yeS4qL1xuXG4gIGNvbnN0IHBpbm5lZEhpc3RvcnlUb3BpYyA9IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG1ha2VTdWJzY3JpcHRpb24ocGlubmVkSGlzdG9yeVRvcGljKTtcblxuICAvKiogQHR5cGUge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSAqL1xuICBjb25zdCBwdWJsaWNhdGlvbiA9IEZhcigncHVibGljYXRpb24nLCB7XG4gICAgdXBkYXRlU3RhdGU6IG5vbkZpbmFsVmFsdWUgPT4gcHVibGlzaGVyLnB1Ymxpc2gobm9uRmluYWxWYWx1ZSksXG4gICAgZmluaXNoOiBjb21wbGV0aW9uID0+IHB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG4gICAgZmFpbDogcmVhc29uID0+IHB1Ymxpc2hlci5mYWlsKHJlYXNvbiksXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH0pO1xufTskaM2PX29uY2UubWFrZVN1YnNjcmlwdGlvbktpdChtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdWJzY3JpcHRpb24iOlsibWFrZVN1YnNjcmlwdGlvbiJdLCJtYWtlU3Vic2NyaXB0aW9uS2l0IjpbIm1ha2VTdWJzY3JpcHRpb25LaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAd+ZKRpUGAACVBgAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90b3BpYy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFYWNoVG9waWMsIExhdGVzdFRvcGljfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgQSBwaW5uZWQtaGlzdG9yeSB0b3BpYyBwcmVzZXJ2ZXMgYWxsIG9mIGl0cyBwdWJsaXNoZWQgdmFsdWVzIGluXG4gKiBtZW1vcnkuICBVc2UgYSBwcmVmaXgtbG9zc3kgbWFrZVB1Ymxpc2hLaXQgaW5zdGVhZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFYWNoVG9waWM8VD4gJiBMYXRlc3RUb3BpYzxUPn0gdG9waWMgbmVlZHMgdG8gYmUgbmVhciBpbiBvcmRlciB0b1xuICogcHJlc2VydmUgc3Vic2NyaXB0aW9uIHRpbWluZ3MuICBUT0RPOiBkcm9wIGBMYXRlc3RUb3BpYzxUPmAgcmVxdWlyZW1lbnRcbiAqIEByZXR1cm5zIHtFYWNoVG9waWM8VD4gJiBMYXRlc3RUb3BpYzxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMgPSB0b3BpYyA9PiB7XG4gIC8qIFN1Y2ggbG9zc2xlc3NuZXNzIGluaGliaXRzIEdDLCB3aGljaCBpcyB3aHkgd2UncmUgbW92aW5nIGF3YXkgZnJvbSBpdC4qL1xuXG4gIC8qIFdlIG5lZWQgdG8gdGFrZSBhbiBpbW1lZGlhdGUgc25hcHNob3Qgb2YgdGhlIHRvcGljJ3MgY3VycmVudCBzdGF0ZS4qL1xuICBjb25zdCBwaW5uZWRQdWJMaXN0ID0gdG9waWMuc3Vic2NyaWJlQWZ0ZXIoKTtcblxuICByZXR1cm4gRmFyKCdQaW5uZWRIaXN0b3J5VG9waWMnLCB7XG4gICAgc3Vic2NyaWJlQWZ0ZXI6IGFzeW5jIChwdWJsaXNoQ291bnQgPSAtMW4pID0+IHtcbiAgICAgIGlmIChwdWJsaXNoQ291bnQgPT09IC0xbikge1xuICAgICAgICByZXR1cm4gcGlubmVkUHViTGlzdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b3BpYy5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuICAgIH0sXG4gICAgZ2V0VXBkYXRlU2luY2U6IGFzeW5jICh1cGRhdGVDb3VudCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgLyogVE9ETzogQnVpbGQgdGhpcyBvdXQgb2YgRWFjaFRvcGljPFQ+LiovXG4gICAgICByZXR1cm4gdG9waWMuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhtYWtlUGlubmVkSGlzdG9yeVRvcGljKTtcbmhhcmRlbihtYWtlUGlubmVkSGlzdG9yeVRvcGljKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQaW5uZWRIaXN0b3J5VG9waWMiOlsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANxz0z1gBwAAYAcAAC0AAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi90b29scy90ZXN0U3VwcG9ydHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlRmFrZU1hcnNoYWxsZXIiLCJtYWtlRmFrZVN0b3JhZ2UiLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhcixtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qc1wiLCBbXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge0l0ZXJhdGlvbk9ic2VydmVyPHVua25vd24+fSBbcHVibGljYXRpb25dXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRmFrZVN0b3JhZ2UgPSAocGF0aCwgcHVibGljYXRpb24pID0+IHtcbiAgbGV0IHNldFZhbHVlQ2FsbHMgPSAwO1xuICBjb25zdCBmdWxsUGF0aCA9IGBwdWJsaXNoLiR7cGF0aH1gO1xuICBjb25zdCBzdG9yZUtleSA9IGhhcmRlbih7XG4gICAgc3RvcmVOYW1lOiAnc3dpbmdzZXQnLFxuICAgIHN0b3JlU3Via2V5OiBgc3dpbmdzZXQvZGF0YToke2Z1bGxQYXRofWAsXG4gICAgZGF0YVByZWZpeEJ5dGVzOiAnJyxcbiAgfSk7XG4gIC8qKiBAdHlwZSB7U3RvcmFnZU5vZGUgJiB7IGNvdW50U2V0VmFsdWVDYWxsczogKCkgPT4gbnVtYmVyfX0gKi9cbiAgY29uc3Qgc3RvcmFnZSA9IEZhcignU3RvcmFnZU5vZGUnLCB7XG4gICAgZ2V0UGF0aDogKCkgPT4gcGF0aCxcbiAgICBnZXRTdG9yZUtleTogYXN5bmMgKCkgPT4gc3RvcmVLZXksXG4gICAgc2V0VmFsdWU6IGFzeW5jIHZhbHVlID0+IHtcbiAgICAgIHNldFZhbHVlQ2FsbHMgKz0gMTtcbiAgICAgIGFzc2VydC50eXBlb2YodmFsdWUsICdzdHJpbmcnKTtcbiAgICAgIGlmIChwdWJsaWNhdGlvbikge1xuICAgICAgICBwdWJsaWNhdGlvbi51cGRhdGVTdGF0ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBtYWtlQ2hpbGROb2RlOiAoKSA9PiBzdG9yYWdlLFxuICAgIGNvdW50U2V0VmFsdWVDYWxsczogKCkgPT4gc2V0VmFsdWVDYWxscyxcbiAgfSk7XG4gIHJldHVybiBzdG9yYWdlO1xufTskaM2PX29uY2UubWFrZUZha2VTdG9yYWdlKG1ha2VGYWtlU3RvcmFnZSk7XG5oYXJkZW4obWFrZUZha2VTdG9yYWdlKTtcblxuICAgICAgIGNvbnN0IG1ha2VGYWtlTWFyc2hhbGxlciA9ICgpID0+XG4gIG1ha2VNYXJzaGFsKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG4gICAgbWFyc2hhbFNhdmVFcnJvcjogKCkgPT4ge30sXG4gIH0pOyRozY9fb25jZS5tYWtlRmFrZU1hcnNoYWxsZXIobWFrZUZha2VNYXJzaGFsbGVyKTtcbmhhcmRlbihtYWtlRmFrZU1hcnNoYWxsZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qcyI6W1siZXZlbnRMb29wSXRlcmF0aW9uIiwiZXZlbnRMb29wSXRlcmF0aW9uIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VGYWtlU3RvcmFnZSI6WyJtYWtlRmFrZVN0b3JhZ2UiXSwibWFrZUZha2VNYXJzaGFsbGVyIjpbIm1ha2VGYWtlTWFyc2hhbGxlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA1mrasbRwAAG0cAAAuAAAAQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS4zL3NyYy9pbnZpdGF0aW9ucy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlSW52aXRhdGlvbnNIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRNYXRoLG11c3RNYXRjaCxJbnZpdGF0aW9uU2hhcGUsRmFpbCxFLHNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJJbnZpdGF0aW9uU2hhcGVcIixbJGjNj19hID0+IChJbnZpdGF0aW9uU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wic2hhcGVcIixbJGjNj19hID0+IChzaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge09mZmVySWR9IGZyb20gJy4vb2ZmZXJzLmpzJztcbiAqIEBpbXBvcnQge0ludml0YXRpb24sIEludml0YXRpb25EZXRhaWxzLCBab2VTZXJ2aWNlfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtOYW1lSHVifSBmcm9tICdAYWdvcmljL3ZhdHMnO1xuICogQGltcG9ydCB7SW52aXRhdGlvbk1ha2Vyc30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtJbnN0YW5jZX0gZnJvbSAnQGFnb3JpYy96b2Uvc3JjL3pvZVNlcnZpY2UvdXRpbHMuanMnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICogQGltcG9ydCB7QnJhbmR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtQdXJzZX0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqL1xuXG4vKiBBIHNhZmV0eSBsaW1pdCovXG5jb25zdCBNQVhfUElQRV9MRU5HVEggPSAyO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBZ29yaWNDb250cmFjdEludml0YXRpb25TcGVjXG4gKiAgIHwgQ29udHJhY3RJbnZpdGF0aW9uU3BlY1xuICogICB8IFB1cnNlSW52aXRhdGlvblNwZWNcbiAqICAgfCBDb250aW51aW5nSW52aXRhdGlvblNwZWN9IEludml0YXRpb25TcGVjXG4gKiAgIFNwZWNpZnkgaG93IHRvIHByb2R1Y2UgYW4gaW52aXRhdGlvbi4gU2VlIGVhY2ggdHlwZSBpbiB0aGUgdW5pb24gZm9yIGRldGFpbHMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBzb3VyY2U6ICdhZ29yaWNDb250cmFjdCc7XG4gKiAgIGluc3RhbmNlUGF0aDogc3RyaW5nW107XG4gKiAgIGNhbGxQaXBlOiBbbWV0aG9kTmFtZTogc3RyaW5nLCBtZXRob2RBcmdzPzogYW55W11dW107XG4gKiB9fSBBZ29yaWNDb250cmFjdEludml0YXRpb25TcGVjXG4gKiAgIHNvdXJjZSBvZiBpbnZpdGF0aW9uIGlzIGEgY2hhaW4gb2YgY2FsbHMgc3RhcnRpbmcgd2l0aCBhbiBhZ29yaWNOYW1lXG4gKlxuICogICAtIHRoZSBzdGFydCBvZiB0aGUgcGlwZSBpcyBhIGxvb2t1cCBvZiBpbnN0YW5jZVBhdGggd2l0aGluIGFnb3JpY05hbWVzXG4gKiAgIC0gZWFjaCBlbnRyeSBpbiB0aGUgY2FsbFBpcGUgZXhlY3V0ZXMgYSBjYWxsIG9uIHRoZSBwcmVjZWRpbmcgcmVzdWx0XG4gKiAgIC0gdGhlIGVuZCBvZiB0aGUgcGlwZSBpcyBleHBlY3RlZCB0byByZXR1cm4gYW4gSW52aXRhdGlvblxuICpcbiAqXG4gKiBAdHlwZWRlZiB7e1xuICogICBzb3VyY2U6ICdjb250cmFjdCc7XG4gKiAgIGluc3RhbmNlOiBJbnN0YW5jZTxhbnk+O1xuICogICBwdWJsaWNJbnZpdGF0aW9uTWFrZXI6IHN0cmluZztcbiAqICAgaW52aXRhdGlvbkFyZ3M/OiBhbnlbXTtcbiAqIH19IENvbnRyYWN0SW52aXRhdGlvblNwZWNcbiAqICAgc291cmNlIGlzIGEgY29udHJhY3QgKGluIHdoaWNoIGNhc2UgdGhpcyB0YWtlcyBhbiBJbnN0YW5jZSB0byBsb29rIHVwIGluIHpvZSlcbiAqXG4gKiBAdHlwZWRlZiB7e1xuICogICBzb3VyY2U6ICdwdXJzZSc7XG4gKiAgIGluc3RhbmNlOiBJbnN0YW5jZTxhbnk+O1xuICogICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICogfX0gUHVyc2VJbnZpdGF0aW9uU3BlY1xuICogICB0aGUgaW52aXRhdGlvbiBpcyBhbHJlYWR5IGluIHlvdXIgWm9lIFwiaW52aXRhdGlvblwiIHB1cnNlIHNvIHdlIG5lZWQgdG8gcXVlcnlcbiAqICAgaXRcbiAqXG4gKiAgIC0gdXNlIHRoZSBmaW5kL3F1ZXJ5IGludml0YXRpb24gYnkga3ZzIHRoaW5nXG4gKlxuICpcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHNvdXJjZTogJ2NvbnRpbnVpbmcnO1xuICogICBwcmV2aW91c09mZmVyOiBPZmZlcklkO1xuICogICBpbnZpdGF0aW9uTWFrZXJOYW1lOiBzdHJpbmc7XG4gKiAgIGludml0YXRpb25BcmdzPzogYW55W107XG4gKiB9fSBDb250aW51aW5nSW52aXRhdGlvblNwZWNcbiAqICAgY29udGludWluZyBpbnZpdGF0aW9uIGluIHdoaWNoIHRoZSBvZmZlciByZXN1bHQgZnJvbSBhIHByZXZpb3VzIGludml0YXRpb25cbiAqICAgaGFkIGFuIGBpbnZpdGF0aW9uTWFrZXJzYCBwcm9wZXJ0eVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1BpY2s8SW52aXRhdGlvbkRldGFpbHMsICdkZXNjcmlwdGlvbicgfCAnaW5zdGFuY2UnPn0gSW52aXRhdGlvbnNQdXJzZVF1ZXJ5XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtFUmVmPE5hbWVIdWI+fSBhZ29yaWNOYW1lc1xuICogQHBhcmFtIHtCcmFuZDwnc2V0Jz59IGludml0YXRpb25CcmFuZFxuICogQHBhcmFtIHtQdXJzZTwnc2V0JywgSW52aXRhdGlvbkRldGFpbHM+fSBpbnZpdGF0aW9uc1B1cnNlXG4gKiBAcGFyYW0geyhmcm9tT2ZmZXJJZDogc3RyaW5nKSA9PiBJbnZpdGF0aW9uTWFrZXJzfSBnZXRJbnZpdGF0aW9uQ29udGludWF0aW9uXG4gKi9cbiAgICAgICBjb25zdCBtYWtlSW52aXRhdGlvbnNIZWxwZXIgPSAoXG4gIHpvZSxcbiAgYWdvcmljTmFtZXMsXG4gIGludml0YXRpb25CcmFuZCxcbiAgaW52aXRhdGlvbnNQdXJzZSxcbiAgZ2V0SW52aXRhdGlvbkNvbnRpbnVhdGlvbixcbikgPT4ge1xuICBjb25zdCBpbnZpdGF0aW9uR2V0dGVycyA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gICAgLyoqIEB0eXBlIHsoc3BlYzogQWdvcmljQ29udHJhY3RJbnZpdGF0aW9uU3BlYykgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gKi9cbiAgICBhc3luYyBhZ29yaWNDb250cmFjdChzcGVjKSB7XG4gICAgICBtdXN0TWF0Y2goc3BlYywgc2hhcGUuQWdvcmljQ29udHJhY3RJbnZpdGF0aW9uU3BlYyk7XG5cbiAgICAgIGNvbnN0IHsgaW5zdGFuY2VQYXRoLCBjYWxsUGlwZSB9ID0gc3BlYztcbiAgICAgIGluc3RhbmNlUGF0aC5sZW5ndGggPj0gMSB8fCBGYWlsYGluc3RhbmNlUGF0aCBwYXRoIGxpc3QgZW1weWA7XG4gICAgICBjYWxsUGlwZS5sZW5ndGggPD0gTUFYX1BJUEVfTEVOR1RIIHx8XG4gICAgICAgIEZhaWxgY2FsbFBpcGUgbG9uZ2VyIHRoYW4gTUFYX1BJUEVfTEVOR1RIPSR7TUFYX1BJUEVfTEVOR1RIfWA7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IEUoYWdvcmljTmFtZXMpLmxvb2t1cCgnaW5zdGFuY2UnLCAuLi5pbnN0YW5jZVBhdGgpO1xuICAgICAgbGV0IGVyZWYgPSBFKHpvZSkuZ2V0UHVibGljRmFjZXQoaW5zdGFuY2UpO1xuICAgICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgbWV0aG9kQXJncyA9IFtdXSBvZiBjYWxsUGlwZSkge1xuICAgICAgICBlcmVmID0gRShlcmVmKVttZXRob2ROYW1lXSguLi5tZXRob2RBcmdzKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW52aXRhdGlvbiA9IGF3YWl0IGVyZWY7XG4gICAgICBtdXN0TWF0Y2goaW52aXRhdGlvbiwgSW52aXRhdGlvblNoYXBlKTtcbiAgICAgIHJldHVybiBpbnZpdGF0aW9uO1xuICAgIH0sXG4gICAgLyoqIEB0eXBlIHsoc3BlYzogQ29udHJhY3RJbnZpdGF0aW9uU3BlYykgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gKi9cbiAgICBjb250cmFjdChzcGVjKSB7XG4gICAgICBtdXN0TWF0Y2goc3BlYywgc2hhcGUuQ29udHJhY3RJbnZpdGF0aW9uU3BlYyk7XG5cbiAgICAgIGNvbnN0IHsgaW5zdGFuY2UsIHB1YmxpY0ludml0YXRpb25NYWtlciwgaW52aXRhdGlvbkFyZ3MgPSBbXSB9ID0gc3BlYztcbiAgICAgIGNvbnN0IHBmID0gRSh6b2UpLmdldFB1YmxpY0ZhY2V0KGluc3RhbmNlKTtcbiAgICAgIHJldHVybiBFKHBmKVtwdWJsaWNJbnZpdGF0aW9uTWFrZXJdKC4uLmludml0YXRpb25BcmdzKTtcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7KHNwZWM6IFB1cnNlSW52aXRhdGlvblNwZWMpID0+IFByb21pc2U8SW52aXRhdGlvbj59ICovXG4gICAgYXN5bmMgcHVyc2Uoc3BlYykge1xuICAgICAgbXVzdE1hdGNoKHNwZWMsIHNoYXBlLlB1cnNlSW52aXRhdGlvblNwZWMpO1xuXG4gICAgICBjb25zdCB7IGluc3RhbmNlLCBkZXNjcmlwdGlvbiB9ID0gc3BlYztcbiAgICAgIChpbnN0YW5jZSAmJiBkZXNjcmlwdGlvbikgfHwgRmFpbGBtaXNzaW5nIGluc3RhbmNlIG9yIGRlc2NyaXB0aW9uYDtcbiAgICAgIGNvbnN0IHB1cnNlQW1vdW50ID0gYXdhaXQgRShpbnZpdGF0aW9uc1B1cnNlKS5nZXRDdXJyZW50QW1vdW50KCk7XG4gICAgICBjb25zdCBpbnZpdGF0aW9ucyA9IEFtb3VudE1hdGguZ2V0VmFsdWUoaW52aXRhdGlvbkJyYW5kLCBwdXJzZUFtb3VudCk7XG5cbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBpbnZpdGF0aW9ucy5maWx0ZXIoXG4gICAgICAgIGRldGFpbHMgPT5cbiAgICAgICAgICBkZXNjcmlwdGlvbiA9PT0gZGV0YWlscy5kZXNjcmlwdGlvbiAmJiBpbnN0YW5jZSA9PT0gZGV0YWlscy5pbnN0YW5jZSxcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLyogbG9vayB1cCBkaWFnbm9zdGljIGluZm8qL1xuICAgICAgICBjb25zdCBkQ291bnQgPSBpbnZpdGF0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgZGV0YWlscyA9PiBkZXNjcmlwdGlvbiA9PT0gZGV0YWlscy5kZXNjcmlwdGlvbixcbiAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGlDb3VudCA9IGludml0YXRpb25zLmZpbHRlcihcbiAgICAgICAgICBkZXRhaWxzID0+IGluc3RhbmNlID09PSBkZXRhaWxzLmluc3RhbmNlLFxuICAgICAgICApLmxlbmd0aDtcbiAgICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgYG5vIGludml0YXRpb24gbWF0Y2ggKCR7ZENvdW50fSBkZXNjcmlwdGlvbiBhbmQgJHtpQ291bnR9IGluc3RhbmNlKWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKG1hdGNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAvKiBUT0RPPyBhbGxvdyBmdXJ0aGVyIGRpc2FtYmlndWF0aW9uKi9cbiAgICAgICAgY29uc29sZS53YXJuKCdtdWx0aXBsZSBpbnZpdGF0aW9uIG1hdGNoZXMsIHBpY2tpbmcgdGhlIGZpcnN0Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlc1swXTtcblxuICAgICAgY29uc3QgdG9XaXRoRHJhdyA9IEFtb3VudE1hdGgubWFrZShpbnZpdGF0aW9uQnJhbmQsIGhhcmRlbihbbWF0Y2hdKSk7XG4gICAgICBjb25zb2xlLmxvZygnLi4uLiAnLCB7IHRvV2l0aERyYXcgfSk7XG5cbiAgICAgIHJldHVybiBFKGludml0YXRpb25zUHVyc2UpLndpdGhkcmF3KHRvV2l0aERyYXcpO1xuICAgIH0sXG4gICAgLyoqIEB0eXBlIHsoc3BlYzogQ29udGludWluZ0ludml0YXRpb25TcGVjKSA9PiBQcm9taXNlPEludml0YXRpb24+fSAqL1xuICAgIGNvbnRpbnVpbmcoc3BlYykge1xuICAgICAgbXVzdE1hdGNoKHNwZWMsIHNoYXBlLkNvbnRpbnVpbmdJbnZpdGF0aW9uU3BlYyk7XG5cbiAgICAgIGNvbnN0IHsgcHJldmlvdXNPZmZlciwgaW52aXRhdGlvbkFyZ3MgPSBbXSwgaW52aXRhdGlvbk1ha2VyTmFtZSB9ID0gc3BlYztcbiAgICAgIGNvbnN0IG1ha2VycyA9IGdldEludml0YXRpb25Db250aW51YXRpb24oU3RyaW5nKHByZXZpb3VzT2ZmZXIpKTtcbiAgICAgIGlmICghbWFrZXJzKSB7XG4gICAgICAgIEZhaWxgaW52YWxpZCB2YWx1ZSBzdG9yZWQgZm9yIHByZXZpb3VzIG9mZmVyICR7cHJldmlvdXNPZmZlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEUobWFrZXJzKVtpbnZpdGF0aW9uTWFrZXJOYW1lXSguLi5pbnZpdGF0aW9uQXJncyk7XG4gICAgfSxcbiAgfSk7XG4gIC8qKiBAdHlwZSB7KHNwZWM6IEludml0YXRpb25TcGVjKSA9PiBFUmVmPEludml0YXRpb24+fSAqL1xuICBjb25zdCBpbnZpdGF0aW9uRnJvbVNwZWMgPSBzcGVjID0+IHtcbiAgICBzd2l0Y2ggKHNwZWMuc291cmNlKSB7XG4gICAgICBjYXNlICdhZ29yaWNDb250cmFjdCc6XG4gICAgICAgIHJldHVybiBpbnZpdGF0aW9uR2V0dGVycy5hZ29yaWNDb250cmFjdChzcGVjKTtcbiAgICAgIGNhc2UgJ2NvbnRyYWN0JzpcbiAgICAgICAgcmV0dXJuIGludml0YXRpb25HZXR0ZXJzLmNvbnRyYWN0KHNwZWMpO1xuICAgICAgY2FzZSAncHVyc2UnOlxuICAgICAgICByZXR1cm4gaW52aXRhdGlvbkdldHRlcnMucHVyc2Uoc3BlYyk7XG4gICAgICBjYXNlICdjb250aW51aW5nJzpcbiAgICAgICAgcmV0dXJuIGludml0YXRpb25HZXR0ZXJzLmNvbnRpbnVpbmcoc3BlYyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBFcnJvcigndW5yZWNvZ25pemUgaW52aXRhdGlvbiBzb3VyY2UnKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBpbnZpdGF0aW9uRnJvbVNwZWM7XG59OyRozY9fb25jZS5tYWtlSW52aXRhdGlvbnNIZWxwZXIobWFrZUludml0YXRpb25zSGVscGVyKTtcbmhhcmRlbihtYWtlSW52aXRhdGlvbnNIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUludml0YXRpb25zSGVscGVyIjpbIm1ha2VJbnZpdGF0aW9uc0hlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABVb+fyFjoAABY6AAAvAAAAQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS4zL3NyYy9vZmZlcldhdGNoZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9lcnRwL3NyYy90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIi4vb2ZmZXJzLmpzIl0sImV4cG9ydHMiOlsibWFrZVdhdGNoT2ZmZXJPdXRjb21lcyIsInByZXBhcmVPZmZlcldhdGNoZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLHBhc3NTdHlsZU9mLGlzQWJhbmRvbmVkRXJyb3IsaXNVcGdyYWRlRGlzY29ubmVjdGlvbixwcmVwYXJlRXhvQ2xhc3NLaXQsd2F0Y2hQcm9taXNlLE0sUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUsU2VhdFNoYXBlLEFtb3VudFNoYXBlLGRlZXBseUZ1bGZpbGxlZE9iamVjdCxvYmplY3RNYXAsVU5QVUJMSVNIRURfUkVTVUxUOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanNcIiwgW1tcImlzQWJhbmRvbmVkRXJyb3JcIixbJGjNj19hID0+IChpc0FiYW5kb25lZEVycm9yID0gJGjNj19hKV1dLFtcImlzVXBncmFkZURpc2Nvbm5lY3Rpb25cIixbJGjNj19hID0+IChpc1VwZ3JhZGVEaXNjb25uZWN0aW9uID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dLFtcIndhdGNoUHJvbWlzZVwiLFskaM2PX2EgPT4gKHdhdGNoUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanNcIiwgW1tcIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV0sW1wiU2VhdFNoYXBlXCIsWyRozY9fYSA9PiAoU2VhdFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJBbW91bnRTaGFwZVwiLFskaM2PX2EgPT4gKEFtb3VudFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkT2JqZWN0XCIsWyRozY9fYSA9PiAoZGVlcGx5RnVsZmlsbGVkT2JqZWN0ID0gJGjNj19hKV1dLFtcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vb2ZmZXJzLmpzXCIsIFtbXCJVTlBVQkxJU0hFRF9SRVNVTFRcIixbJGjNj19hID0+IChVTlBVQkxJU0hFRF9SRVNVTFQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge09mZmVyU3BlY30gZnJvbSAnLi9vZmZlcnMuanMnO1xuICogQGltcG9ydCB7Q29udGludWluZ09mZmVyUmVzdWx0fSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge1Byb21pc2VXYXRjaGVyfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJztcbiAqIEBpbXBvcnQge1ZvdywgVm93VG9vbHN9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge1BheW1lbnRQS2V5d29yZFJlY29yZCwgUHJvcG9zYWwsIFVzZXJTZWF0LCBab2VTZXJ2aWNlfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtJbnZpdGF0aW9uTWFrZXJzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1B1YmxpY1N1YnNjcmliZXJzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1VwZ3JhZGVEaXNjb25uZWN0aW9ufSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyc7XG4gKiBAaW1wb3J0IHtQYXltZW50fSBmcm9tICdAYWdvcmljL2VydHAnO1xuICogQGltcG9ydCB7QW1vdW50fSBmcm9tICdAYWdvcmljL2VydHAnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHthbnl9IFRcbiAqIEB0eXBlZGVmIHtQcm9taXNlV2F0Y2hlcjxULCBbVXNlclNlYXRdPn0gT2ZmZXJQcm9taXNlV2F0Y2hlcjxULCBbVXNlclNlYXRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICByZXN1bHRXYXRjaGVyOiBPZmZlclByb21pc2VXYXRjaGVyPFBhc3NhYmxlPjtcbiAqICAgbnVtV2FudHNXYXRjaGVyOiBPZmZlclByb21pc2VXYXRjaGVyPG51bWJlcj47XG4gKiAgIHBheW1lbnRXYXRjaGVyOiBPZmZlclByb21pc2VXYXRjaGVyPFBheW1lbnRQS2V5d29yZFJlY29yZD47XG4gKiB9fSBPdXRjb21lV2F0Y2hlcnNcbiAqL1xuXG4vKipcbiAqIEFkb3B0ZWQgZnJvbSBgQGFnb3JpYy92b3cvdmF0LmpzYFxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcmVhc29uXG4gKiBAcGFyYW0ge3Vua25vd259IHByaW9yUmV0cnlWYWx1ZVxuICovXG5jb25zdCBpc1JldHJ5YWJsZVJlYXNvbiA9IChyZWFzb24sIHByaW9yUmV0cnlWYWx1ZSkgPT4ge1xuICBpZiAoXG4gICAgaXNVcGdyYWRlRGlzY29ubmVjdGlvbihyZWFzb24pICYmXG4gICAgKCFpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKHByaW9yUmV0cnlWYWx1ZSkgfHxcbiAgICAgIHJlYXNvbi5pbmNhcm5hdGlvbk51bWJlciA+IHByaW9yUmV0cnlWYWx1ZS5pbmNhcm5hdGlvbk51bWJlcilcbiAgKSB7XG4gICAgcmV0dXJuIHJlYXNvbjtcbiAgfVxuICAvKiBGb3IgYWJhbmRvbmVkIGVycm9ycyB0aGVyZSBpcyBubyB3YXkgdG8gZGlmZmVyZW50aWF0ZSBlcnJvcnMgZnJvbSovXG4gIC8qIGNvbnNlY3V0aXZlIHVwZ3JhZGVzKi9cbiAgaWYgKGlzQWJhbmRvbmVkRXJyb3IocmVhc29uKSAmJiAhaXNBYmFuZG9uZWRFcnJvcihwcmlvclJldHJ5VmFsdWUpKSB7XG4gICAgcmV0dXJuIHJlYXNvbjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqIEBwYXJhbSB7Vm93VG9vbHN9IHZvd1Rvb2xzICovXG5jb25zdCBtYWtlV2F0Y2hGb3JPZmZlclJlc3VsdCA9ICh7IHdhdGNoIH0pID0+IHtcbiAgLyoqXG4gKiBAcGFyYW0ge091dGNvbWVXYXRjaGVyc30gd2F0Y2hlcnNcbiAqIEBwYXJhbSB7VXNlclNlYXR9IHNlYXRcbiAqIEByZXR1cm5zIHtWb3c8dm9pZD59IFZvdyB0aGF0IHJlc29sdmVzIHdoZW4gb2ZmZXIgcmVzdWx0IGhhcyBiZWVuIHByb2Nlc3NlZFxuICogICBieSB0aGUgcmVzdWx0V2F0Y2hlclxuICovXG4gIGNvbnN0IHdhdGNoRm9yT2ZmZXJSZXN1bHQgPSAoeyByZXN1bHRXYXRjaGVyIH0sIHNlYXQpID0+IHtcbiAgICAvKiBPZmZlciByZXN1bHQgbWF5IGJlIGFueXRoaW5nLCBpbmNsdWRpbmcgYSBWb3csIHNvIHdhdGNoIGl0IGR1cmFibHkuKi9cbiAgICByZXR1cm4gd2F0Y2goRShzZWF0KS5nZXRPZmZlclJlc3VsdCgpLCByZXN1bHRXYXRjaGVyLCBzZWF0KTtcbiAgfTtcbiAgcmV0dXJuIHdhdGNoRm9yT2ZmZXJSZXN1bHQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T3V0Y29tZVdhdGNoZXJzfSB3YXRjaGVyc1xuICogQHBhcmFtIHtVc2VyU2VhdH0gc2VhdFxuICovXG5jb25zdCB3YXRjaEZvck51bVdhbnRzID0gKHsgbnVtV2FudHNXYXRjaGVyIH0sIHNlYXQpID0+IHtcbiAgY29uc3QgcCA9IEUoc2VhdCkubnVtV2FudHNTYXRpc2ZpZWQoKTtcbiAgd2F0Y2hQcm9taXNlKHAsIG51bVdhbnRzV2F0Y2hlciwgc2VhdCk7XG4gIHJldHVybiBwO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge091dGNvbWVXYXRjaGVyc30gd2F0Y2hlcnNcbiAqIEBwYXJhbSB7VXNlclNlYXR9IHNlYXRcbiAqL1xuY29uc3Qgd2F0Y2hGb3JQYXlvdXQgPSAoeyBwYXltZW50V2F0Y2hlciB9LCBzZWF0KSA9PiB7XG4gIGNvbnN0IHAgPSBFKHNlYXQpLmdldFBheW91dHMoKTtcbiAgd2F0Y2hQcm9taXNlKHAsIHBheW1lbnRXYXRjaGVyLCBzZWF0KTtcbiAgcmV0dXJuIHA7XG59O1xuXG4vKiogQHBhcmFtIHtWb3dUb29sc30gdm93VG9vbHMgKi9cbiAgICAgICBjb25zdCBtYWtlV2F0Y2hPZmZlck91dGNvbWVzID0gdm93VG9vbHMgPT4ge1xuICBjb25zdCB3YXRjaEZvck9mZmVyUmVzdWx0ID0gbWFrZVdhdGNoRm9yT2ZmZXJSZXN1bHQodm93VG9vbHMpO1xuICBjb25zdCB7IHdoZW4sIGFsbFZvd3MgfSA9IHZvd1Rvb2xzO1xuICAvKipcbiAqIEBwYXJhbSB7T3V0Y29tZVdhdGNoZXJzfSB3YXRjaGVyc1xuICogQHBhcmFtIHtVc2VyU2VhdH0gc2VhdFxuICovXG4gIGNvbnN0IHdhdGNoT2ZmZXJPdXRjb21lcyA9ICh3YXRjaGVycywgc2VhdCkgPT4ge1xuICAgIC8qIFVzZSBgd2hlbmAgdG8gZ2V0IGEgcHJvbWlzZSBmcm9tIHRoZSB2b3cuKi9cbiAgICAvKiBVbmxpa2UgYGFzUHJvbWlzZWAgdGhpcyBkb2Vzbid0IHdhcm4gaW4gY2FzZSBvZiBkaXNjb25uZWN0aW9ucywgd2hpY2ggaXMqL1xuICAgIC8qIGZpbmUgc2luY2Ugd2UgYWN0dWFsbHkgaGFuZGxlIHRoZSBvdXRjb21lIGR1cmFibHkgdGhyb3VnaCB0aGUgd2F0Y2hlcnMuKi9cbiAgICAvKiBPbmx5IHRoZSBgZXhlY3V0ZU9mZmVyYCBjYWxsZXIgcmVsaWVzIG9uIHRoZSBzZXR0bGVtZW50IG9mIHRoaXMgcHJvbWlzZSwqL1xuICAgIC8qIGFuZCBvbmx5IGluIHRlc3RzLiovXG4gICAgcmV0dXJuIHdoZW4oXG4gICAgICBhbGxWb3dzKFtcbiAgICAgICAgd2F0Y2hGb3JPZmZlclJlc3VsdCh3YXRjaGVycywgc2VhdCksXG4gICAgICAgIHdhdGNoRm9yTnVtV2FudHMod2F0Y2hlcnMsIHNlYXQpLFxuICAgICAgICB3YXRjaEZvclBheW91dCh3YXRjaGVycywgc2VhdCksXG4gICAgICBdKSxcbiAgICApO1xuICB9O1xuICByZXR1cm4gd2F0Y2hPZmZlck91dGNvbWVzO1xufTskaM2PX29uY2UubWFrZVdhdGNoT2ZmZXJPdXRjb21lcyhtYWtlV2F0Y2hPZmZlck91dGNvbWVzKTtcblxuY29uc3Qgb2ZmZXJXYXRjaGVyR3VhcmQgPSBoYXJkZW4oe1xuICBoZWxwZXI6IE0uaW50ZXJmYWNlKCdJbnN0YW5jZUFkbWluU3RvcmFnZScsIHtcbiAgICB1cGRhdGVTdGF0dXM6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gICAgb25OZXdDb250aW51aW5nT2ZmZXI6IE0uY2FsbChcbiAgICAgIE0ub3IoTS5udW1iZXIoKSwgTS5zdHJpbmcoKSksXG4gICAgICBBbW91bnRTaGFwZSxcbiAgICAgIE0uYW55KCksXG4gICAgKVxuICAgICAgLm9wdGlvbmFsKE0ucmVjb3JkKCkpXG4gICAgICAucmV0dXJucygpLFxuICAgIHB1Ymxpc2hSZXN1bHQ6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gICAgaGFuZGxlRXJyb3I6IE0uY2FsbChNLmVycm9yKCkpLnJldHVybnMoKSxcbiAgfSksXG4gIHBheW1lbnRXYXRjaGVyOiBNLmludGVyZmFjZSgncGF5bWVudFdhdGNoZXInLCB7XG4gICAgb25GdWxmaWxsZWQ6IE0uY2FsbChQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSwgU2VhdFNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5wcm9taXNlKCksXG4gICAgKSxcbiAgICBvblJlamVjdGVkOiBNLmNhbGwoTS5hbnkoKSwgU2VhdFNoYXBlKS5yZXR1cm5zKCksXG4gIH0pLFxuICByZXN1bHRXYXRjaGVyOiBNLmludGVyZmFjZSgncmVzdWx0V2F0Y2hlcicsIHtcbiAgICBvbkZ1bGZpbGxlZDogTS5jYWxsKE0uYW55KCksIFNlYXRTaGFwZSkucmV0dXJucygpLFxuICAgIG9uUmVqZWN0ZWQ6IE0uY2FsbChNLmFueSgpLCBTZWF0U2hhcGUpLnJldHVybnMoKSxcbiAgfSksXG4gIG51bVdhbnRzV2F0Y2hlcjogTS5pbnRlcmZhY2UoJ251bVdhbnRzV2F0Y2hlcicsIHtcbiAgICBvbkZ1bGZpbGxlZDogTS5jYWxsKE0ubnVtYmVyKCksIFNlYXRTaGFwZSkucmV0dXJucygpLFxuICAgIG9uUmVqZWN0ZWQ6IE0uY2FsbChNLmFueSgpLCBTZWF0U2hhcGUpLnJldHVybnMoKSxcbiAgfSksXG59KTtcblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7Vm93VG9vbHN9IHZvd1Rvb2xzXG4gKiBAcGFyYW0ge1pvbmV9IHpvbmVcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVPZmZlcldhdGNoZXIgPSAoYmFnZ2FnZSwgdm93VG9vbHMsIHpvbmUpID0+IHtcbiAgY29uc3Qgd2F0Y2hGb3JPZmZlclJlc3VsdCA9IG1ha2VXYXRjaEZvck9mZmVyUmVzdWx0KHZvd1Rvb2xzKTtcblxuICBjb25zdCBleHRyYVByb3BzID0gem9uZS53ZWFrTWFwU3RvcmUoJ29mZmVyV2F0Y2hlckV4dHJhUHJvcHMnKTtcbiAgLyoqXG4gKiBJbXBsZW1lbnQgcmV0cnkgbG9naWMgZm9yIG9mZmVyIHdhdGNoZXJzLiBUaGlzIHVzZXMgdGhlIHN0YXRlZnVsXG4gKiBgaXNSZXRyeWFibGVSZWFzb25gIHRvIGF2b2lkIGluZmluaXRlIHByb21pc2UgcmVqZWN0aW9uIGxvb3BzIHVwb24gcmVtb3RlXG4gKiB2YXQgdXBncmFkZS5cbiAqXG4gKiBAcGFyYW0ge3t9fSBmYWNldFxuICogQHBhcmFtIHt1bmtub3dufSByZWFzb25cbiAqIEByZXR1cm5zIHtyZWFzb24gaXMgVXBncmFkZURpc2Nvbm5lY3Rpb259IHJvdWdobHlcbiAqL1xuICBjb25zdCBuZWVkc1JldHJ5ID0gKGZhY2V0LCByZWFzb24pID0+IHtcbiAgICBjb25zdCBleGlzdHMgPSBleHRyYVByb3BzLmhhcyhmYWNldCk7XG4gICAgY29uc3QgZXh0cmEgPSBleGlzdHMgPyBleHRyYVByb3BzLmdldChmYWNldCkgOiBoYXJkZW4oe30pO1xuXG4gICAgY29uc3Qga2V5ID0gYHByaW9yUmV0cnlgO1xuICAgIGNvbnN0IHByaW9yUmV0cnlhYmxlID0gZXh0cmFba2V5XTtcbiAgICBjb25zdCByZXRyeWFibGUgPSBpc1JldHJ5YWJsZVJlYXNvbihyZWFzb24sIHByaW9yUmV0cnlhYmxlKTtcbiAgICBpZiAocmV0cnlhYmxlKSB7XG4gICAgICAvKiBJbnNlcnQgLyB1cGRhdGUgdGhlIG5ldyBzdGF0ZS4qL1xuICAgICAgZXh0cmFQcm9wc1tleGlzdHMgPyAnc2V0JyA6ICdpbml0J10oXG4gICAgICAgIGZhY2V0LFxuICAgICAgICBoYXJkZW4oe1xuICAgICAgICAgIC4uLmV4dHJhLFxuICAgICAgICAgIFtrZXldOiByZXRyeWFibGUsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGV4aXN0cykge1xuICAgICAgLyogRGVsZXRlL3NocmluayBleGlzdGluZyBzdGF0ZSB0byBjbGVhbiB1cCB1bm5lY2Vzc2FyeSBzdGF0ZS4qL1xuICAgICAgY29uc3QgeyBba2V5XTogX29taXQsIC4uLnJlc3QgfSA9IGV4dHJhO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBleHRyYVByb3BzLmRlbGV0ZShmYWNldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHRyYVByb3BzLnNldChmYWNldCwgaGFyZGVuKHJlc3QpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICEhcmV0cnlhYmxlO1xuICB9O1xuXG4gIHJldHVybiBwcmVwYXJlRXhvQ2xhc3NLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICAnT2ZmZXJXYXRjaGVyJyxcbiAgICBvZmZlcldhdGNoZXJHdWFyZCxcbiAgICAvKiBYWFggd2FsbGV0SGVscGVyIGlzIGBhbnlgIGJlY2F1c2UgdGhlIGhlbHBlciBmYWNldCBpcyB0b28gbmVzdGVkIHRvIGV4cG9ydCBpdHMgdHlwZSovXG4gICAgLyoqXG4gKiBAcGFyYW0ge2FueX0gd2FsbGV0SGVscGVyXG4gKiBAcGFyYW0ge3sgcmVjZWl2ZTogKHBheW1lbnQ6IFBheW1lbnQpID0+IFByb21pc2U8QW1vdW50PiB9fSBkZXBvc2l0XG4gKiBAcGFyYW0ge09mZmVyU3BlY30gb2ZmZXJTcGVjXG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xuICogQHBhcmFtIHtBbW91bnQ8J3NldCc+fSBpbnZpdGF0aW9uQW1vdW50XG4gKiBAcGFyYW0ge1VzZXJTZWF0fSBzZWF0UmVmXG4gKi9cbiAgICAod2FsbGV0SGVscGVyLCBkZXBvc2l0LCBvZmZlclNwZWMsIGFkZHJlc3MsIGludml0YXRpb25BbW91bnQsIHNlYXRSZWYpID0+ICh7XG4gICAgICB3YWxsZXRIZWxwZXIsXG4gICAgICBkZXBvc2l0LFxuICAgICAgc3RhdHVzOiBvZmZlclNwZWMsXG4gICAgICBhZGRyZXNzLFxuICAgICAgaW52aXRhdGlvbkFtb3VudCxcbiAgICAgIHNlYXRSZWYsXG4gICAgfSksXG4gICAge1xuICAgICAgaGVscGVyOiB7XG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gb2ZmZXJTdGF0dXNVcGRhdGVzXG4gKi9cbiAgICAgICAgdXBkYXRlU3RhdHVzKG9mZmVyU3RhdHVzVXBkYXRlcykge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgc3RhdGUuc3RhdHVzID0gaGFyZGVuKHsgLi4uc3RhdGUuc3RhdHVzLCAuLi5vZmZlclN0YXR1c1VwZGF0ZXMgfSk7XG5cbiAgICAgICAgICBzdGF0ZS53YWxsZXRIZWxwZXIudXBkYXRlU3RhdHVzKHN0YXRlLnN0YXR1cyk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG9mZmVySWRcbiAqIEBwYXJhbSB7QW1vdW50PCdzZXQnPn0gaW52aXRhdGlvbkFtb3VudFxuICogQHBhcmFtIHtJbnZpdGF0aW9uTWFrZXJzfSBpbnZpdGF0aW9uTWFrZXJzXG4gKiBAcGFyYW0ge1B1YmxpY1N1YnNjcmliZXJzfSBwdWJsaWNTdWJzY3JpYmVyc1xuICovXG4gICAgICAgIG9uTmV3Q29udGludWluZ09mZmVyKFxuICAgICAgICAgIG9mZmVySWQsXG4gICAgICAgICAgaW52aXRhdGlvbkFtb3VudCxcbiAgICAgICAgICBpbnZpdGF0aW9uTWFrZXJzLFxuICAgICAgICAgIHB1YmxpY1N1YnNjcmliZXJzLFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuXG4gICAgICAgICAgdm9pZCBzdGF0ZS53YWxsZXRIZWxwZXIuYWRkQ29udGludWluZ09mZmVyKFxuICAgICAgICAgICAgb2ZmZXJJZCxcbiAgICAgICAgICAgIGludml0YXRpb25BbW91bnQsXG4gICAgICAgICAgICBpbnZpdGF0aW9uTWFrZXJzLFxuICAgICAgICAgICAgcHVibGljU3Vic2NyaWJlcnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiogQHBhcmFtIHtQYXNzYWJsZSB8IENvbnRpbnVpbmdPZmZlclJlc3VsdH0gcmVzdWx0ICovXG4gICAgICAgIHB1Ymxpc2hSZXN1bHQocmVzdWx0KSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuXG4gICAgICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmVzdWx0KTtcbiAgICAgICAgICAvKiBzb21lZGF5IGNhbiB3ZSBnZXQgVFMgdG8gdHlwZSBuYXJyb3cgYmFzZWQgb24gdGhlIHBhc3NTdHlsZU9mIHJlc3VsdCBtYXRjaD8qL1xuICAgICAgICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICAgICAgICBjYXNlICdiaWdpbnQnOlxuICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICBjYXNlICdudWxsJzpcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICAgIGZhY2V0cy5oZWxwZXIudXBkYXRlU3RhdHVzKHsgcmVzdWx0IH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOlxuICAgICAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkIGJ5IHBhc3NTdHlsZSovXG4gICAgICAgICAgICAgIGlmICgnaW52aXRhdGlvbk1ha2VycycgaW4gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgLyogc2F2ZSBmb3IgY29udGludWluZyBpbnZpdGF0aW9uIG9mZmVyKi9cblxuICAgICAgICAgICAgICAgIHZvaWQgZmFjZXRzLmhlbHBlci5vbk5ld0NvbnRpbnVpbmdPZmZlcihcbiAgICAgICAgICAgICAgICAgIFN0cmluZyhzdGF0ZS5zdGF0dXMuaWQpLFxuICAgICAgICAgICAgICAgICAgc3RhdGUuaW52aXRhdGlvbkFtb3VudCxcbiAgICAgICAgICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQgYnkgcGFzc1N0eWxlKi9cbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5pbnZpdGF0aW9uTWFrZXJzLFxuICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1YmxpY1N1YnNjcmliZXJzLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZmFjZXRzLmhlbHBlci51cGRhdGVTdGF0dXMoeyByZXN1bHQ6IFVOUFVCTElTSEVEX1JFU1VMVCB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAvKiBkcm9wIHRoZSByZXN1bHQqL1xuICAgICAgICAgICAgICBmYWNldHMuaGVscGVyLnVwZGF0ZVN0YXR1cyh7IHJlc3VsdDogVU5QVUJMSVNIRURfUkVTVUxUIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gKiBDYWxsZWQgd2hlbiB0aGUgb2ZmZXIgcmVzdWx0IHByb21pc2UgcmVqZWN0cy4gVGhlIG90aGVyIHR3byB3YXRjaGVyc1xuICogYXJlIHdhaXRpbmcgZm9yIHBhcnRpY3VsYXIgdmFsdWVzIG91dCBvZiBab2UgYnV0IHRoZXkgc2V0dGxlIGF0IHRoZVxuICogc2FtZSB0aW1lIGFuZCBkb24ndCBuZWVkIHRoZWlyIG93biBlcnJvciBoYW5kbGluZy5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqL1xuICAgICAgICBoYW5kbGVFcnJvcihlcnIpIHtcbiAgICAgICAgICBjb25zdCB7IGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBmYWNldHMuaGVscGVyLnVwZGF0ZVN0YXR1cyh7IGVycm9yOiBlcnIudG9TdHJpbmcoKSB9KTtcbiAgICAgICAgICBjb25zdCB7IHNlYXRSZWYgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgdm9pZCBFLndoZW4oRShzZWF0UmVmKS5oYXNFeGl0ZWQoKSwgaGFzRXhpdGVkID0+IHtcbiAgICAgICAgICAgIGlmICghaGFzRXhpdGVkKSB7XG4gICAgICAgICAgICAgIHZvaWQgRShzZWF0UmVmKS50cnlFeGl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKiogQHR5cGUge091dGNvbWVXYXRjaGVyc1sncGF5bWVudFdhdGNoZXInXX0gKi9cbiAgICAgIHBheW1lbnRXYXRjaGVyOiB7XG4gICAgICAgIGFzeW5jIG9uRnVsZmlsbGVkKHBheW91dHMpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG5cbiAgICAgICAgICAvKiBUaGlzIHdpbGwgYmxvY2sgdW50aWwgYWxsIHBheW91dHMgc3VjY2VlZCwgYnV0IHVzZXIgd2lsbCBiZSB1cGRhdGVkKi9cbiAgICAgICAgICAvKiBzaW5jZSBlYWNoIHBheW91dCB3aWxsIHRyaWdnZXIgaXRzIGNvcnJlc3BvbmRpbmcgcHVyc2Ugbm90aWZpZXIuKi9cbiAgICAgICAgICBjb25zdCBhbW91bnRQS2V5d29yZFJlY29yZCA9IG9iamVjdE1hcChwYXlvdXRzLCBwYXltZW50UmVmID0+XG4gICAgICAgICAgICBFLndoZW4ocGF5bWVudFJlZiwgcGF5bWVudCA9PiBzdGF0ZS5kZXBvc2l0LnJlY2VpdmUocGF5bWVudCkpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgYW1vdW50cyA9IGF3YWl0IGRlZXBseUZ1bGZpbGxlZE9iamVjdChhbW91bnRQS2V5d29yZFJlY29yZCk7XG4gICAgICAgICAgZmFjZXRzLmhlbHBlci51cGRhdGVTdGF0dXMoeyBwYXlvdXRzOiBhbW91bnRzIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAqIElmIHByb21pc2UgZGlzY29ubmVjdGVkLCB3YXRjaCBhZ2Fpbi4gT3IgaWYgdGhlcmUncyBhbiBFcnJvciwgaGFuZGxlXG4gKiBpdC5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yIHwgVXBncmFkZURpc2Nvbm5lY3Rpb259IHJlYXNvblxuICogQHBhcmFtIHtVc2VyU2VhdH0gc2VhdFxuICovXG4gICAgICAgIG9uUmVqZWN0ZWQocmVhc29uLCBzZWF0KSB7XG4gICAgICAgICAgY29uc3QgeyBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgaWYgKG5lZWRzUmV0cnkoZmFjZXRzLnBheW1lbnRXYXRjaGVyLCByZWFzb24pKSB7XG4gICAgICAgICAgICB2b2lkIHdhdGNoRm9yUGF5b3V0KGZhY2V0cywgc2VhdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZhY2V0cy5oZWxwZXIuaGFuZGxlRXJyb3IocmVhc29uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKiogQHR5cGUge091dGNvbWVXYXRjaGVyc1sncmVzdWx0V2F0Y2hlciddfSAqL1xuICAgICAgcmVzdWx0V2F0Y2hlcjoge1xuICAgICAgICBvbkZ1bGZpbGxlZChyZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCB7IGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IHdhbGxldEhlbHBlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBjb25zdCB7IHNhdmVSZXN1bHQgfSA9IHRoaXMuc3RhdGUuc3RhdHVzO1xuICAgICAgICAgIGlmIChzYXZlUmVzdWx0KSB7XG4gICAgICAgICAgICAvKiBOb3RlOiByZXN1bHQgaXMgcGFzc2FibGUgYW5kIHN0b3JhYmxlIHNpbmNlIGl0IHdhcyByZWNlaXZlZCBmcm9tIGFub3RoZXIgdmF0Ki9cbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB3YWxsZXRIZWxwZXIuc2F2ZUVudHJ5KHNhdmVSZXN1bHQsIHJlc3VsdCk7XG4gICAgICAgICAgICBmYWNldHMuaGVscGVyLnVwZGF0ZVN0YXR1cyh7XG4gICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgcGFzc1N0eWxlOiBwYXNzU3R5bGVPZihyZXN1bHQpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZhY2V0cy5oZWxwZXIucHVibGlzaFJlc3VsdChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gKiBJZiBwcm9taXNlIGRpc2Nvbm5lY3RlZCwgd2F0Y2ggYWdhaW4uIE9yIGlmIHRoZXJlJ3MgYW4gRXJyb3IsIGhhbmRsZVxuICogaXQuXG4gKlxuICogQHBhcmFtIHtFcnJvciB8IFVwZ3JhZGVEaXNjb25uZWN0aW9ufSByZWFzb25cbiAqIEBwYXJhbSB7VXNlclNlYXR9IHNlYXRcbiAqL1xuICAgICAgICBvblJlamVjdGVkKHJlYXNvbiwgc2VhdCkge1xuICAgICAgICAgIGNvbnN0IHsgZmFjZXRzIH0gPSB0aGlzO1xuICAgICAgICAgIGlmIChuZWVkc1JldHJ5KGZhY2V0cy5yZXN1bHRXYXRjaGVyLCByZWFzb24pKSB7XG4gICAgICAgICAgICB2b2lkIHdhdGNoRm9yT2ZmZXJSZXN1bHQoZmFjZXRzLCBzZWF0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmFjZXRzLmhlbHBlci5oYW5kbGVFcnJvcihyZWFzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiB0aHJvdyBzbyB0aGUgdm93IHdhdGNoZXIgcHJvcGFnYXRlcyB0aGUgcmVqZWN0aW9uKi9cbiAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvKiogQHR5cGUge091dGNvbWVXYXRjaGVyc1snbnVtV2FudHNXYXRjaGVyJ119ICovXG4gICAgICBudW1XYW50c1dhdGNoZXI6IHtcbiAgICAgICAgb25GdWxmaWxsZWQobnVtU2F0aXNmaWVkKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWNldHMgfSA9IHRoaXM7XG5cbiAgICAgICAgICBmYWNldHMuaGVscGVyLnVwZGF0ZVN0YXR1cyh7IG51bVdhbnRzU2F0aXNmaWVkOiBudW1TYXRpc2ZpZWQgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICogSWYgcHJvbWlzZSBkaXNjb25uZWN0ZWQsIHdhdGNoIGFnYWluLlxuICpcbiAqIEVycm9ycyBhcmUgaGFuZGxlZCBieSB0aGUgcGF5bWVudFdhdGNoZXIgYmVjYXVzZSBudW1XYW50c1NhdGlzZmllZCgpXG4gKiBhbmQgZ2V0UGF5b3V0cygpIHNldHRsZSB0aGUgc2FtZSAodGhleSBhd2FpdCB0aGUgc2FtZSBwcm9taXNlIGFuZFxuICogdGhlbiBzeW5jaHJvbm91c2x5IHJldHVybiBhIGxvY2FsIHZhbHVlKS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yIHwgVXBncmFkZURpc2Nvbm5lY3Rpb259IHJlYXNvblxuICogQHBhcmFtIHtVc2VyU2VhdH0gc2VhdFxuICovXG4gICAgICAgIG9uUmVqZWN0ZWQocmVhc29uLCBzZWF0KSB7XG4gICAgICAgICAgY29uc3QgeyBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgaWYgKG5lZWRzUmV0cnkoZmFjZXRzLm51bVdhbnRzV2F0Y2hlciwgcmVhc29uKSkge1xuICAgICAgICAgICAgdm9pZCB3YXRjaEZvck51bVdhbnRzKGZhY2V0cywgc2VhdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZhY2V0cy5oZWxwZXIuaGFuZGxlRXJyb3IocmVhc29uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICApO1xufTskaM2PX29uY2UucHJlcGFyZU9mZmVyV2F0Y2hlcihwcmVwYXJlT2ZmZXJXYXRjaGVyKTtcbmhhcmRlbihwcmVwYXJlT2ZmZXJXYXRjaGVyKTtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlT2ZmZXJXYXRjaGVyPn0gTWFrZU9mZmVyV2F0Y2hlciAqL1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPE1ha2VPZmZlcldhdGNoZXI+fSBPZmZlcldhdGNoZXIgKi9cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXYXRjaE9mZmVyT3V0Y29tZXMiOlsibWFrZVdhdGNoT2ZmZXJPdXRjb21lcyJdLCJwcmVwYXJlT2ZmZXJXYXRjaGVyIjpbInByZXBhcmVPZmZlcldhdGNoZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA67cK5XcHAAB3BwAAKQAAAEBhZ29yaWMvc21hcnQtd2FsbGV0LXYwLjUuMy9zcmMvb2ZmZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJVTlBVQkxJU0hFRF9SRVNVTFQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyoqXG4gKiBAaW1wb3J0IHtBbW91bnRLZXl3b3JkUmVjb3JkLCBQcm9wb3NhbH0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7SW52aXRhdGlvblNwZWN9IGZyb20gJy4vaW52aXRhdGlvbnMuanMnO1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge251bWJlciB8IHN0cmluZ30gT2ZmZXJJZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmVzdWx0UGxhblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgYnkgd2hpY2ggdG8gc2F2ZSB0aGUgaXRlbVxuICogQHByb3BlcnR5IHtib29sZWFufSBbb3ZlcndyaXRlPWZhbHNlXSB3aGV0aGVyIHRvIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBpdGVtLlxuICogICBJZiBmYWxzZSBhbmQgdGhlcmUgaXMgYSBjb25mbGljdCwgdGhlIGNvbnRyYWN0IHdpbGwgYXV0b2dlbiBhIHNpbWlsYXJcbiAqICAgbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHRhcmdldE5hbWU6IHN0cmluZztcbiAqICAgbWV0aG9kOiBzdHJpbmc7XG4gKiAgIGFyZ3M6IFBhc3NhYmxlW107XG4gKiAgIHNhdmVSZXN1bHQ/OiBSZXN1bHRQbGFuO1xuICogICBpZD86IG51bWJlciB8IHN0cmluZztcbiAqIH19IEludm9rZUVudHJ5TWVzc2FnZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqICAgaWQ6IE9mZmVySWQ7XG4gKiAgIGludml0YXRpb25TcGVjOiBJbnZpdGF0aW9uU3BlYztcbiAqICAgcHJvcG9zYWw6IFByb3Bvc2FsO1xuICogICBvZmZlckFyZ3M/OiBhbnk7XG4gKiAgIHNhdmVSZXN1bHQ/OiBSZXN1bHRQbGFuO1xuICogfX0gT2ZmZXJTcGVjXG4gKiAgIElmIGBzYXZlUmVzdWx0YCBpcyBwcm92aWRlZCwgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2NhdGlvbiB3aWxsIGJlIHNhdmVkIHRvXG4gKiAgIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uIE90aGVyd2lzZSBpdCB3aWxsIGJlIHB1Ymxpc2hlZCBkaXJlY3RseSB0byB2c3RvcmFnZVxuICogICAob3IgJ1VOUFVCTElTSEVEJyBpZiBpdCBjYW5ub3QgYmUpLlxuICovXG5cbi8qKiBWYWx1ZSBmb3IgXCJyZXN1bHRcIiBmaWVsZCB3aGVuIHRoZSByZXN1bHQgY2FuJ3QgYmUgcHVibGlzaGVkICovXG4gICAgICAgY29uc3QgVU5QVUJMSVNIRURfUkVTVUxUID0gJ1VOUFVCTElTSEVEJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2ZmZXJTcGVjICYge1xuICogICBlcnJvcj86IHN0cmluZztcbiAqICAgbnVtV2FudHNTYXRpc2ZpZWQ/OiBudW1iZXI7XG4gKiAgIHJlc3VsdD86XG4gKiAgICAgfCB1bmtub3duXG4gKiAgICAgfCB0eXBlb2YgVU5QVUJMSVNIRURfUkVTVUxUXG4gKiAgICAgfCB7IG5hbWU6IHN0cmluZzsgcGFzc1N0eWxlOiBzdHJpbmcgfTtcbiAqICAgcGF5b3V0cz86IEFtb3VudEtleXdvcmRSZWNvcmQ7XG4gKiB9fSBPZmZlclN0YXR1c1xuICovJGjNj19vbmNlLlVOUFVCTElTSEVEX1JFU1VMVChVTlBVQkxJU0hFRF9SRVNVTFQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVU5QVUJMSVNIRURfUkVTVUxUIjpbIlVOUFVCTElTSEVEX1JFU1VMVCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACjn/Ior8UAAK/FAAAuAAAAQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS4zL3NyYy9zbWFydFdhbGxldC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9zdG9yZS9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiLCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvdm93IiwiQGFnb3JpYy96b25lL2R1cmFibGUuanMiLCIuL2ludml0YXRpb25zLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi91dGlscy5qcyIsIi4vb2ZmZXJXYXRjaGVyLmpzIl0sImV4cG9ydHMiOlsiQlJBTkRfVE9fUFVSU0VTX0tFWSIsIkVYSVNUSU5HX1dBTExFVF9NWV9TVE9SRVNfS0VZIiwicHJlcGFyZVNtYXJ0V2FsbGV0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEUscGFzc1N0eWxlT2YsQW1vdW50U2hhcGUsQnJhbmRTaGFwZSxEaXNwbGF5SW5mb1NoYXBlLElzc3VlclNoYXBlLFBheW1lbnRTaGFwZSxQdXJzZVNoYXBlLGRlZXBseUZ1bGZpbGxlZE9iamVjdCxtYWtlVHJhY2VyLG9iamVjdE1hcCxTdG9yYWdlTm9kZVNoYXBlLGlzVXBncmFkZURpc2Nvbm5lY3Rpb24sTSxtYXRjaGVzLG11c3RNYXRjaCxhcHBlbmRUb1N0b3JlZEFycmF5LHByb3ZpZGVMYXp5LG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLHByZXBhcmVFeG9DbGFzcyxwcmVwYXJlRXhvQ2xhc3NLaXQscHJvdmlkZSx3YXRjaFByb21pc2UscHJlcGFyZVJlY29yZGVyS2l0LFN1YnNjcmliZXJTaGFwZSxUb3BpY3NSZWNvcmRTaGFwZSxBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUsSW52aXRhdGlvbkVsZW1lbnRTaGFwZSxwcmVwYXJlVm93VG9vbHMsbWFrZUR1cmFibGVab25lLG1ha2VJbnZpdGF0aW9uc0hlbHBlcixzaGFwZSxvYmplY3RNYXBTdG9yYWdlUGF0aCxwcmVwYXJlT2ZmZXJXYXRjaGVyLG1ha2VXYXRjaE9mZmVyT3V0Y29tZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRTaGFwZVwiLFskaM2PX2EgPT4gKEFtb3VudFNoYXBlID0gJGjNj19hKV1dLFtcIkJyYW5kU2hhcGVcIixbJGjNj19hID0+IChCcmFuZFNoYXBlID0gJGjNj19hKV1dLFtcIkRpc3BsYXlJbmZvU2hhcGVcIixbJGjNj19hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjNj19hKV1dLFtcIklzc3VlclNoYXBlXCIsWyRozY9fYSA9PiAoSXNzdWVyU2hhcGUgPSAkaM2PX2EpXV0sW1wiUGF5bWVudFNoYXBlXCIsWyRozY9fYSA9PiAoUGF5bWVudFNoYXBlID0gJGjNj19hKV1dLFtcIlB1cnNlU2hhcGVcIixbJGjNj19hID0+IChQdXJzZVNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkT2JqZWN0XCIsWyRozY9fYSA9PiAoZGVlcGx5RnVsZmlsbGVkT2JqZWN0ID0gJGjNj19hKV1dLFtcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dLFtcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXSxbXCJTdG9yYWdlTm9kZVNoYXBlXCIsWyRozY9fYSA9PiAoU3RvcmFnZU5vZGVTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzXCIsIFtbXCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uXCIsWyRozY9fYSA9PiAoaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmUvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc1wiLCBbW1wiYXBwZW5kVG9TdG9yZWRBcnJheVwiLFskaM2PX2EgPT4gKGFwcGVuZFRvU3RvcmVkQXJyYXkgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUxhenlcIixbJGjNj19hID0+IChwcm92aWRlTGF6eSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dLFtcInByb3ZpZGVcIixbJGjNj19hID0+IChwcm92aWRlID0gJGjNj19hKV1dLFtcIndhdGNoUHJvbWlzZVwiLFskaM2PX2EgPT4gKHdhdGNoUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcInByZXBhcmVSZWNvcmRlcktpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVSZWNvcmRlcktpdCA9ICRozY9fYSldXSxbXCJTdWJzY3JpYmVyU2hhcGVcIixbJGjNj19hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaM2PX2EpXV0sW1wiVG9waWNzUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChUb3BpY3NSZWNvcmRTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV0sW1wiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSA9ICRozY9fYSldXSxbXCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlXCIsWyRozY9fYSA9PiAoSW52aXRhdGlvbkVsZW1lbnRTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdm93XCIsIFtbXCJwcmVwYXJlVm93VG9vbHNcIixbJGjNj19hID0+IChwcmVwYXJlVm93VG9vbHMgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvbmUvZHVyYWJsZS5qc1wiLCBbW1wibWFrZUR1cmFibGVab25lXCIsWyRozY9fYSA9PiAobWFrZUR1cmFibGVab25lID0gJGjNj19hKV1dXV0sW1wiLi9pbnZpdGF0aW9ucy5qc1wiLCBbW1wibWFrZUludml0YXRpb25zSGVscGVyXCIsWyRozY9fYSA9PiAobWFrZUludml0YXRpb25zSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJzaGFwZVwiLFskaM2PX2EgPT4gKHNoYXBlID0gJGjNj19hKV1dXV0sW1wiLi91dGlscy5qc1wiLCBbW1wib2JqZWN0TWFwU3RvcmFnZVBhdGhcIixbJGjNj19hID0+IChvYmplY3RNYXBTdG9yYWdlUGF0aCA9ICRozY9fYSldXV1dLFtcIi4vb2ZmZXJXYXRjaGVyLmpzXCIsIFtbXCJwcmVwYXJlT2ZmZXJXYXRjaGVyXCIsWyRozY9fYSA9PiAocHJlcGFyZU9mZmVyV2F0Y2hlciA9ICRozY9fYSldXSxbXCJtYWtlV2F0Y2hPZmZlck91dGNvbWVzXCIsWyRozY9fYSA9PiAobWFrZVdhdGNoT2ZmZXJPdXRjb21lcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVtb3RlLCBSZW1vdGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7RU1hcnNoYWxsZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzJztcbiAqIEBpbXBvcnQge0Ftb3VudCwgQnJhbmQsIElzc3VlciwgUGF5bWVudCwgUHVyc2V9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtXZWFrTWFwU3RvcmUsIE1hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJ1xuICogQGltcG9ydCB7Tm90aWZpZXJ9IGZyb20gJ0BhZ29yaWMvbm90aWZpZXInO1xuICogQGltcG9ydCB7SW52aXRhdGlvbkFtb3VudCwgSW52aXRhdGlvbkRldGFpbHMsIFBheW1lbnRQS2V5d29yZFJlY29yZCwgUHJvcG9zYWwsIFVzZXJTZWF0LCBTZXRUZXN0SmlnLCBJbnZpdGF0aW9uLCBBbW91bnRLZXl3b3JkUmVjb3JkLCBab2VTZXJ2aWNlfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtDb3B5UmVjb3JkfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0VSZXR1cm59IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtPZmZlcklkLCBPZmZlclN0YXR1cywgT2ZmZXJTcGVjLCBJbnZva2VFbnRyeU1lc3NhZ2UsIFJlc3VsdFBsYW59IGZyb20gJy4vb2ZmZXJzLmpzJztcbiAqIEBpbXBvcnQge01ha2VPZmZlcldhdGNoZXJ9IGZyb20gJy4vb2ZmZXJXYXRjaGVyLmpzJztcbiAqIEBpbXBvcnQge1BldG5hbWV9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7QmFua30gZnJvbSAnQGFnb3JpYy92YXRzL3NyYy92YXQtYmFuay5qcyc7XG4gKiBAaW1wb3J0IHtOYW1lSHVifSBmcm9tICdAYWdvcmljL3ZhdHMnO1xuICogQGltcG9ydCB7SW52aXRhdGlvbk1ha2Vyc30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtSZWNvcmRlcktpdH0gZnJvbSAnQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJztcbiAqIEBpbXBvcnQge1B1YmxpY1N1YnNjcmliZXJzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0NhcERhdGF9IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICogQGltcG9ydCB7RGlzcGxheUluZm99IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtTdG9yYWdlTm9kZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdTbXJ0V2x0Jyk7XG5cbi8qKlxuICogQGZpbGUgU21hcnQgd2FsbGV0IG1vZHVsZVxuICogQHNlZSB7QGxpbmsgLi4vUkVBRE1FLm1kfSB9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBsb2dnZXI6IHtcbiAqICAgICBpbmZvOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG4gKiAgICAgZXJyb3I6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbiAqICAgfTtcbiAqICAgbWFrZU9mZmVyV2F0Y2hlcjogTWFrZU9mZmVyV2F0Y2hlcjtcbiAqICAgaW52aXRhdGlvbkZyb21TcGVjOiBFUmVmPEludml0YXRpb24+O1xuICogfX0gRXhlY3V0b3JQb3dlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIG1ldGhvZDogJ2V4ZWN1dGVPZmZlcic7XG4gKiAgIG9mZmVyOiBPZmZlclNwZWM7XG4gKiB9fSBFeGVjdXRlT2ZmZXJBY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIG1ldGhvZDogJ3RyeUV4aXRPZmZlcic7XG4gKiAgIG9mZmVySWQ6IE9mZmVySWQ7XG4gKiB9fSBUcnlFeGl0T2ZmZXJBY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEludm9rZVN0b3JlRW50cnlBY3Rpb25cbiAqIEBwcm9wZXJ0eSB7J2ludm9rZUVudHJ5J30gbWV0aG9kIEJyaWRnZUFjdGlvbiBkaXNjcmltaW5hdG9yXG4gKiBAcHJvcGVydHkge0ludm9rZUVudHJ5TWVzc2FnZX0gbWVzc2FnZSBvYmplY3QgbWV0aG9kIGNhbGwgdG8gbWFrZVxuICovXG5cbi8qIERpc2NyaW1pbmF0ZWQgdW5pb24uIFBvc3NpYmxlIGZ1dHVyZSBtZXNzYWdlcyB0eXBlczoqL1xuLyogbWF5YmUgc3VnZ2VzdElzc3VlciBmb3IgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MTMyKi9cbi8qIHNldHRpbmcgcGV0bmFtZXMgYW5kIGFkZGluZyBicmFuZHMgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjEyNiovXG4vKiogQHR5cGVkZWYge0V4ZWN1dGVPZmZlckFjdGlvbiB8IFRyeUV4aXRPZmZlckFjdGlvbiB8IEludm9rZVN0b3JlRW50cnlBY3Rpb259IEJyaWRnZUFjdGlvbiAqL1xuXG4vKipcbiAqIFB1cnNlcyBpcyBhbiBhcnJheSB0byBzdXBwb3J0IGEgZnV0dXJlIHJlcXVpcmVtZW50IG9mIG11bHRpcGxlIHB1cnNlcyBwZXJcbiAqIGJyYW5kLlxuICpcbiAqIEVhY2ggbWFwIGlzIGVuY29kZWQgYXMgYW4gYXJyYXkgb2YgZW50cmllcyBiZWNhdXNlIGEgTWFwIGRvZXNuJ3Qgc2VyaWFsaXplXG4gKiBkaXJlY3RseS4gV2UgYWxzbyBjb25zaWRlcmVkIGhhdmluZyBhIHZzdG9yYWdlIGtleSBmb3IgZWFjaCBvZmZlciBidXQgZm9yIG5vd1xuICogYXJlIHN0aWNraW5nIHdpdGggdGhpcyBkZXNpZ24uXG4gKlxuICogQ29uc1xuICpcbiAqIC0gUmVzZXJpYWxpemVzIHByZXZpb3VzbHkgd3JpdHRlbiByZXN1bHRzIHdoZW4gYSBuZXcgcmVzdWx0IGlzIGFkZGVkXG4gKiAtIE9wdGltaXplcyByZWFkcyB0aG91Z2ggd3JpdGVzIGFyZSBvbi1jaGFpbiAofjEwMCBtYWNoaW5lcykgYW5kIHJlYWRzIGFyZVxuICogICBvZmYtY2hhaW4gKHRvIDEgbWFjaGluZSlcbiAqXG4gKiBQcm9zXG4gKlxuICogLSBSZWFkaW5nIGFsbCBvZmZlciByZXN1bHRzIGhhcHBlbnMgbXVjaCBtb3JlICg+MTAwKSBvZnRlbiB0aGFuIHN0b3JpbmcgYSBuZXdcbiAqICAgb2ZmZXIgcmVzdWx0XG4gKiAtIFJlc2VyaWFsaXphdGlvbiBhbmQgd3JpdGVzIGFyZSBwYWlkIGluIGV4ZWN1dGlvbiBnYXMsIHdoZXJlYXMgcmVhZHMgYXJlIG5vdFxuICpcbiAqIFRoaXMgZGVzaWduIHNob3VsZCBiZSByZXZpc2l0ZWQgaWYgZXZlciBiYXRjaCBxdWVyeWluZyBhY3Jvc3MgdnN0b3JhZ2Uga2V5c1xuICogYmVjb21lIGNoZWFwZXIgb3IgcmVhZHMgYmUgcGFpZC5cbiAqXG4gKiBAdHlwZWRlZiB7e1xuICogICBwdXJzZXM6IHsgYnJhbmQ6IEJyYW5kOyBiYWxhbmNlOiBBbW91bnQgfVtdO1xuICogICBvZmZlclRvVXNlZEludml0YXRpb246IFtvZmZlcklkOiBzdHJpbmcsIHVzZWRJbnZpdGF0aW9uOiBBbW91bnRdW107XG4gKiAgIG9mZmVyVG9QdWJsaWNTdWJzY3JpYmVyUGF0aHM6IFtcbiAqICAgICBvZmZlcklkOiBzdHJpbmcsXG4gKiAgICAgcHVibGljVG9waWNzOiB7IFtzdWJzY3JpYmVyTmFtZTogc3RyaW5nXTogc3RyaW5nIH0sXG4gKiAgIF1bXTtcbiAqICAgbGl2ZU9mZmVyczogW09mZmVySWQsIE9mZmVyU3RhdHVzXVtdO1xuICogfX0gQ3VycmVudFdhbGxldFJlY29yZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgdXBkYXRlZDogJ29mZmVyU3RhdHVzJzsgc3RhdHVzOiBPZmZlclN0YXR1cyB9XG4gKiAgIHwgeyB1cGRhdGVkOiAnYmFsYW5jZSc7IGN1cnJlbnRBbW91bnQ6IEFtb3VudCB9XG4gKiAgIHwgeyB1cGRhdGVkOiAnd2FsbGV0QWN0aW9uJzsgc3RhdHVzOiB7IGVycm9yOiBzdHJpbmcgfSB9XG4gKiAgIHwge1xuICogICAgICAgdXBkYXRlZDogJ2ludm9jYXRpb24nO1xuICogICAgICAgaWQ6IHN0cmluZyB8IG51bWJlcjtcbiAqICAgICAgIGVycm9yPzogc3RyaW5nO1xuICogICAgICAgcmVzdWx0PzogeyBuYW1lPzogc3RyaW5nOyBwYXNzU3R5bGU6IHN0cmluZyB9O1xuICogICAgIH19IFVwZGF0ZVJlY29yZFxuICogICBSZWNvcmQgb2YgYW4gdXBkYXRlIHRvIHRoZSBzdGF0ZSBvZiB0aGlzIHdhbGxldC5cbiAqXG4gKiAgIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgY29hbGVzY2luZyB1cGRhdGVzIGludG8gYSBjdXJyZW50IHN0YXRlLiBTZWVcbiAqICAgYGNvYWxlc2NlVXBkYXRlc2AgdXRpbGl0eS5cbiAqXG4gKiAgIFRoZSByZWFzb24gZm9yIHRoaXMgYnVyZGVuIG9uIHRoZSBjbGllbnQgaXMgdGhhdCBwdWJsaXNoaW5nIHRoZSBmdWxsIGhpc3RvcnlcbiAqICAgb2Ygb2ZmZXJzIHdpdGggZWFjaCBjaGFuZ2UgaXMgdW50ZW5hYmxlLlxuICpcbiAqICAgYGJhbGFuY2VgIHVwZGF0ZSBzdXBwb3J0cyBmb3J3YXJkLWNvbXBhdGliaWxpdHkgZm9yIG1vcmUgdGhhbiBvbmUgcHVyc2UgcGVyXG4gKiAgIGJyYW5kLiBBbiBhZGRpdGlvbmFsIGtleSB3aWxsIGJlIG5lZWRlZCB0byBkaXNhbWJpZ3VhdGUuIEZvciBub3cgdGhlIGJyYW5kXG4gKiAgIGluIHRoZSBhbW91bnQgc3VmZmljZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBicmFuZDogQnJhbmQ7XG4gKiAgIGRpc3BsYXlJbmZvOiBEaXNwbGF5SW5mbztcbiAqICAgaXNzdWVyOiBJc3N1ZXI7XG4gKiAgIHBldG5hbWU6IFBldG5hbWU7XG4gKiB9fSBCcmFuZERlc2NyaXB0b3JcbiAqICAgRm9yIHVzZSBieSBjbGllbnRzIHRvIGRlc2NyaWJlIGJyYW5kcyB0byB1c2Vycy4gSW5jbHVkZXMgYGRpc3BsYXlJbmZvYCB0b1xuICogICBzYXZlIGEgcmVtb3RlIGNhbGwuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBhZGRyZXNzOiBzdHJpbmc7XG4gKiAgIGJhbms6IEVSZWY8QmFuaz47XG4gKiAgIGN1cnJlbnRTdG9yYWdlTm9kZTogUmVtb3RlPFN0b3JhZ2VOb2RlPjtcbiAqICAgaW52aXRhdGlvblB1cnNlOiBQdXJzZTwnc2V0JywgSW52aXRhdGlvbkRldGFpbHM+O1xuICogICB3YWxsZXRTdG9yYWdlTm9kZTogUmVtb3RlPFN0b3JhZ2VOb2RlPjtcbiAqIH19IFVuaXF1ZVBhcmFtc1xuICpcbiAqXG4gKiBAdHlwZWRlZiB7UGljazxNYXBTdG9yZTxCcmFuZCwgQnJhbmREZXNjcmlwdG9yPiwgJ2hhcycgfCAnZ2V0JyB8ICd2YWx1ZXMnPn0gQnJhbmREZXNjcmlwdG9yUmVnaXN0cnlcbiAqXG4gKlxuICogQHR5cGVkZWYge3tcbiAqICAgYWdvcmljTmFtZXM6IEVSZWY8TmFtZUh1Yj47XG4gKiAgIHJlZ2lzdHJ5OiBCcmFuZERlc2NyaXB0b3JSZWdpc3RyeTtcbiAqICAgaW52aXRhdGlvbklzc3VlcjogSXNzdWVyPCdzZXQnPjtcbiAqICAgaW52aXRhdGlvbkJyYW5kOiBCcmFuZDwnc2V0Jz47XG4gKiAgIGludml0YXRpb25EaXNwbGF5SW5mbzogRGlzcGxheUluZm87XG4gKiAgIHB1YmxpY01hcnNoYWxsZXI6IEVSZW1vdGU8RU1hcnNoYWxsZXI+O1xuICogICB6b2U6IEVSZWY8Wm9lU2VydmljZT47XG4gKiB9fSBTaGFyZWRQYXJhbXNcbiAqXG4gKlxuICogQHR5cGVkZWYge0ltbXV0YWJsZVN0YXRlICYgTXV0YWJsZVN0YXRlfSBTdGF0ZSAtIGBicmFuZFB1cnNlc2AgaXMgcHJlY2lvdXNcbiAqICAgYW5kIGNsb3NlbHkgaGVsZC4gZGVmaW5lZCBhcyBsYXRlIGFzIHBvc3NpYmxlIHRvIHJlZHVjZSBpdHMgc2NvcGUuXG4gKlxuICogICAtIGBvZmZlclRvSW52aXRhdGlvbk1ha2Vyc2AgaXMgcHJlY2lvdXMgYW5kIGNsb3NlbHkgaGVsZC5cbiAqICAgLSBgb2ZmZXJUb1B1YmxpY1N1YnNjcmliZXJQYXRoc2AgaXMgcHJlY2lvdXMgYW5kIGNsb3NlbHkgaGVsZC5cbiAqICAgLSBgcHVyc2VCYWxhbmNlc2AgaXMgYSBjYWNoZSBvZiB3aGF0IHdlJ3ZlIHJlY2VpdmVkIGZyb20gcHVyc2VzLiBIZWxkIHNvIHdlIGNhblxuICogICAgICAgcHVibGlzaCBhbGwgYmFsYW5jZXMgb24gY2hhbmdlLlxuICpcbiAqXG4gKiBAdHlwZWRlZiB7UmVhZG9ubHk8XG4gKiAgIFVuaXF1ZVBhcmFtcyAmIHtcbiAqICAgICBwYXltZW50UXVldWVzOiBNYXBTdG9yZTxCcmFuZCwgUGF5bWVudFtdPjtcbiAqICAgICBvZmZlclRvSW52aXRhdGlvbk1ha2VyczogTWFwU3RvcmU8c3RyaW5nLCBJbnZpdGF0aW9uTWFrZXJzPjtcbiAqICAgICBvZmZlclRvUHVibGljU3Vic2NyaWJlclBhdGhzOiBNYXBTdG9yZTxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICogICAgIG9mZmVyVG9Vc2VkSW52aXRhdGlvbjogTWFwU3RvcmU8c3RyaW5nLCBBbW91bnQ8J3NldCc+PjtcbiAqICAgICBwdXJzZUJhbGFuY2VzOiBNYXBTdG9yZTxQdXJzZSwgQW1vdW50PjtcbiAqICAgICB1cGRhdGVSZWNvcmRlcktpdDogUmVjb3JkZXJLaXQ8VXBkYXRlUmVjb3JkPjtcbiAqICAgICBjdXJyZW50UmVjb3JkZXJLaXQ6IFJlY29yZGVyS2l0PEN1cnJlbnRXYWxsZXRSZWNvcmQ+O1xuICogICAgIGxpdmVPZmZlcnM6IE1hcFN0b3JlPE9mZmVySWQsIE9mZmVyU3RhdHVzPjtcbiAqICAgICBsaXZlT2ZmZXJTZWF0czogTWFwU3RvcmU8T2ZmZXJJZCwgVXNlclNlYXQ8dW5rbm93bj4+O1xuICogICAgIGxpdmVPZmZlclBheW1lbnRzOiBNYXBTdG9yZTxPZmZlcklkLCBNYXBTdG9yZTxCcmFuZCwgUGF5bWVudD4+O1xuICogICAgIG15U3RvcmU/OiBNYXBTdG9yZTxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICogICB9XG4gKiA+fSBJbW11dGFibGVTdGF0ZVxuICpcbiAqXG4gKiBAdHlwZWRlZiB7QnJhbmREZXNjcmlwdG9yICYgeyBwdXJzZTogUHVyc2UgfX0gUHVyc2VSZWNvcmRcbiAqXG4gKiBAdHlwZWRlZiB7e319IE11dGFibGVTdGF0ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU21hcnRXYWxsZXRUZXN0SmlnXG4gKiBAcHJvcGVydHkgeyhlbmFibGVkOiBib29sZWFuKSA9PiB2b2lkfSBzZXRXaXRoTXlTdG9yZVxuICovXG5cbi8qKlxuICogTmFtZUh1YiByZXZlcnNlLWxvb2t1cCwgZmluZGluZyAwIG9yIG1vcmUgbmFtZXMgZm9yIGEgdGFyZ2V0IHZhbHVlXG4gKlxuICogVE9ETzogY29uc2lkZXIgbW92aW5nIHRvIG5hbWVIdWIuanM/XG4gKlxuICogQHBhcmFtIHt1bmtub3dufSB0YXJnZXQgLSBwYXNzYWJsZSBLZXlcbiAqIEBwYXJhbSB7RVJlZjxOYW1lSHViPn0gbmFtZUh1YlxuICovXG5jb25zdCBuYW1lc09mID0gYXN5bmMgKHRhcmdldCwgbmFtZUh1YikgPT4ge1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgRShuYW1lSHViKS5lbnRyaWVzKCk7XG4gIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY2FuZGlkYXRlXSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKGNhbmRpZGF0ZSA9PT0gdGFyZ2V0KSB7XG4gICAgICByZXN1bHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXJkZW4ocmVzdWx0cyk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoYXQgYW4gaXNzdWVyIGFuZCBpdHMgYnJhbmQgYmVsb25nIHRvIGVhY2ggb3RoZXIuXG4gKlxuICogVE9ETzogbW92ZSB0byBFUlRQP1xuICpcbiAqIEBwYXJhbSB7SXNzdWVyfSBpc3N1ZXJcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gdHJ1ZSBpZmYgdGhlIHRoZSBicmFuZCBhbmQgaXNzdWVyIG1hdGNoXG4gKi9cbmNvbnN0IGNoZWNrTXV0dWFsID0gKGlzc3VlciwgYnJhbmQpID0+XG4gIFByb21pc2UuYWxsKFtcbiAgICBFKGlzc3VlcilcbiAgICAgIC5nZXRCcmFuZCgpXG4gICAgICAudGhlbihiID0+IGIgPT09IGJyYW5kKSxcbiAgICBFKGJyYW5kKS5pc015SXNzdWVyKGlzc3VlciksXG4gIF0pLnRoZW4oY2hlY2tzID0+IGNoZWNrcy5ldmVyeShCb29sZWFuKSk7XG5cbiAgICAgICBjb25zdCBFWElTVElOR19XQUxMRVRfTVlfU1RPUkVTX0tFWSA9ICdleGlzdGluZ1dhbGxldE15U3RvcmVzJzskaM2PX29uY2UuRVhJU1RJTkdfV0FMTEVUX01ZX1NUT1JFU19LRVkoRVhJU1RJTkdfV0FMTEVUX01ZX1NUT1JFU19LRVkpO1xuXG4gICAgICAgY29uc3QgQlJBTkRfVE9fUFVSU0VTX0tFWSA9ICdicmFuZFRvUHVyc2VzJzskaM2PX29uY2UuQlJBTkRfVE9fUFVSU0VTX0tFWShCUkFORF9UT19QVVJTRVNfS0VZKTtcblxuY29uc3QgZ2V0QnJhbmRUb1B1cnNlcyA9ICh3YWxsZXRQdXJzZXMsIGtleSkgPT4ge1xuICBjb25zdCBicmFuZFRvUHVyc2VzID0gcHJvdmlkZUxhenkod2FsbGV0UHVyc2VzLCBrZXksIF9rID0+IHtcbiAgICAvKiogQHR5cGUge01hcFN0b3JlPEJyYW5kLCBQdXJzZVJlY29yZFtdPn0gKi9cbiAgICBjb25zdCBzdG9yZSA9IG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgncHVyc2VzIGJ5IGJyYW5kJywge1xuICAgICAgZHVyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gc3RvcmU7XG4gIH0pO1xuICByZXR1cm4gYnJhbmRUb1B1cnNlcztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge1NoYXJlZFBhcmFtc30gc2hhcmVkXG4gKiBAcGFyYW0ge1NldFRlc3RKaWd9IFtzZXRUZXN0SmlnXVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVNtYXJ0V2FsbGV0ID0gKGJhZ2dhZ2UsIHNoYXJlZCwgc2V0VGVzdEppZykgPT4ge1xuICBjb25zdCB7IHJlZ2lzdHJ5OiBfciwgLi4ucGFzc2FibGVTaGFyZWQgfSA9IHNoYXJlZDtcbiAgbXVzdE1hdGNoKFxuICAgIGhhcmRlbihwYXNzYWJsZVNoYXJlZCksXG4gICAgaGFyZGVuKHtcbiAgICAgIGFnb3JpY05hbWVzOiBNLmVyZWYoTS5yZW1vdGFibGUoJ2Fnb3JpY05hbWVzJykpLFxuICAgICAgaW52aXRhdGlvbklzc3VlcjogSXNzdWVyU2hhcGUsXG4gICAgICBpbnZpdGF0aW9uQnJhbmQ6IEJyYW5kU2hhcGUsXG4gICAgICBpbnZpdGF0aW9uRGlzcGxheUluZm86IERpc3BsYXlJbmZvU2hhcGUsXG4gICAgICBwdWJsaWNNYXJzaGFsbGVyOiBNLnJlbW90YWJsZSgnTWFyc2hhbGxlcicpLFxuICAgICAgem9lOiBNLmVyZWYoTS5yZW1vdGFibGUoJ1pvZVNlcnZpY2UnKSksXG4gICAgfSksXG4gICk7XG4gIGNvbnN0IHpvbmUgPSBtYWtlRHVyYWJsZVpvbmUoYmFnZ2FnZSk7XG4gIGNvbnN0IG1ha2VSZWNvcmRlcktpdCA9IHByZXBhcmVSZWNvcmRlcktpdChiYWdnYWdlLCBzaGFyZWQucHVibGljTWFyc2hhbGxlcik7XG5cbiAgY29uc3Qgd2FsbGV0UHVyc2VzID0gcHJvdmlkZShiYWdnYWdlLCBCUkFORF9UT19QVVJTRVNfS0VZLCAoKSA9PiB7XG4gICAgdHJhY2UoJ21ha2UgcHVyc2VzIGJ5IHdhbGxldCBhbmQgc2F2ZSBpbiBiYWdnYWdlIGF0JywgQlJBTkRfVE9fUFVSU0VTX0tFWSk7XG4gICAgLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8dW5rbm93biwgTWFwU3RvcmU8QnJhbmQsIFB1cnNlUmVjb3JkW10+Pn0gKi9cbiAgICBjb25zdCBzdG9yZSA9IG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUoJ3B1cnNlcyBieSB3YWxsZXQnLCB7XG4gICAgICBkdXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBzdG9yZTtcbiAgfSk7XG5cbiAgY29uc3QgZXhpc3RpbmdXYWxsZXRNeVN0b3JlcyA9IHpvbmUud2Vha01hcFN0b3JlKCdteVN0b3JlIGJ5IHdhbGxldCcpO1xuXG4gIGxldCB3aXRoTXlTdG9yZSA9IHRydWU7XG5cbiAgc2V0VGVzdEppZz8uKFxuICAgICgpID0+XG4gICAgICAvKiogQHR5cGUge1NtYXJ0V2FsbGV0VGVzdEppZ30gKi8gKHtcbiAgICAgICAgc2V0V2l0aE15U3RvcmU6IHZhbHVlID0+IHtcbiAgICAgICAgICB3aXRoTXlTdG9yZSA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgKTtcblxuICBjb25zdCB2b3dUb29scyA9IHByZXBhcmVWb3dUb29scyh6b25lLnN1YlpvbmUoJ3ZvdycpKTtcblxuICBjb25zdCBtYWtlT2ZmZXJXYXRjaGVyID0gcHJlcGFyZU9mZmVyV2F0Y2hlcihiYWdnYWdlLCB2b3dUb29scywgem9uZSk7XG4gIGNvbnN0IHdhdGNoT2ZmZXJPdXRjb21lcyA9IG1ha2VXYXRjaE9mZmVyT3V0Y29tZXModm93VG9vbHMpO1xuXG4gIGNvbnN0IHVwZGF0ZVNoYXBlID0ge1xuICAgIHZhbHVlOiBBbW91bnRTaGFwZSxcbiAgICB1cGRhdGVDb3VudDogTS5iaWdpbnQoKSxcbiAgfTtcblxuICBjb25zdCBOb3RpZmllclNoYXBlID0gTS5yZW1vdGFibGUoKTtcbiAgY29uc3QgYW1vdW50V2F0Y2hlckd1YXJkID0gTS5pbnRlcmZhY2UoJ3BheW1lbnRXYXRjaGVyJywge1xuICAgIG9uRnVsZmlsbGVkOiBNLmNhbGwodXBkYXRlU2hhcGUsIE5vdGlmaWVyU2hhcGUpLnJldHVybnMoKSxcbiAgICBvblJlamVjdGVkOiBNLmNhbGwoTS5hbnkoKSwgTm90aWZpZXJTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIH0pO1xuXG4gIGNvbnN0IHByZXBhcmVBbW91bnRXYXRjaGVyID0gKCkgPT5cbiAgICBwcmVwYXJlRXhvQ2xhc3MoXG4gICAgICBiYWdnYWdlLFxuICAgICAgJ0Ftb3VudFdhdGNoZXInLFxuICAgICAgYW1vdW50V2F0Y2hlckd1YXJkLFxuICAgICAgLyoqXG4gKiBAcGFyYW0ge1B1cnNlfSBwdXJzZVxuICogQHBhcmFtIHtSZXR1cm5UeXBlPFxuICogICB0eXBlb2YgbWFrZVdhbGxldFdpdGhSZXNvbHZlZFN0b3JhZ2VOb2Rlc1xuICogPlsnaGVscGVyJ119IGhlbHBlclxuICovXG4gICAgICAocHVyc2UsIGhlbHBlcikgPT4gKHsgcHVyc2UsIGhlbHBlciB9KSxcbiAgICAgIHtcbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge3sgdmFsdWU6IEFtb3VudDsgdXBkYXRlQ291bnQ6IGJpZ2ludCB8IHVuZGVmaW5lZCB9fSB1cGRhdGVSZWNvcmRcbiAqIEBwYXJhbSB7Tm90aWZpZXI8QW1vdW50Pn0gbm90aWZpZXJcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gICAgICAgIG9uRnVsZmlsbGVkKHVwZGF0ZVJlY29yZCwgbm90aWZpZXIpIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciwgcHVyc2UgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgaGVscGVyLnVwZGF0ZUJhbGFuY2UocHVyc2UsIHVwZGF0ZVJlY29yZC52YWx1ZSk7XG4gICAgICAgICAgaGVscGVyLndhdGNoTmV4dEJhbGFuY2UoXG4gICAgICAgICAgICB0aGlzLnNlbGYsXG4gICAgICAgICAgICBub3RpZmllcixcbiAgICAgICAgICAgIHVwZGF0ZVJlY29yZC51cGRhdGVDb3VudCxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuICAgICAgICBvblJlamVjdGVkKGVycikge1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyLCBwdXJzZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBpZiAoaXNVcGdyYWRlRGlzY29ubmVjdGlvbihlcnIpKSB7XG4gICAgICAgICAgICByZXR1cm4gaGVscGVyLndhdGNoUHVyc2UocHVyc2UpOyAvKiByZXRyeSovXG4gICAgICAgICAgfVxuICAgICAgICAgIGhlbHBlci5sb2dXYWxsZXRFcnJvcihgZmFpbGVkIGFtb3VudCBvYnNlcnZlcmAsIGVycik7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gIGNvbnN0IG1ha2VBbW91bnRXYXRjaGVyID0gcHJlcGFyZUFtb3VudFdhdGNoZXIoKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cbiAgY29uc3QgY2xlYW5BbW91bnRGb3JQdWJsaXNoID0gYW1vdW50ID0+IHtcbiAgICBtdXN0TWF0Y2goYW1vdW50LCBBbW91bnRTaGFwZSk7XG4gICAgaWYgKFxuICAgICAgIW1hdGNoZXMoYW1vdW50LmJyYW5kLCBzaGFyZWQuaW52aXRhdGlvbkJyYW5kKSB8fFxuICAgICAgIW1hdGNoZXMoYW1vdW50LnZhbHVlLCBNLmFycmF5T2YoSW52aXRhdGlvbkVsZW1lbnRTaGFwZSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gYW1vdW50O1xuICAgIH1cblxuICAgIGNvbnN0IGludml0YXRpb25BbW91bnQgPSAvKiogQHR5cGUge0ludml0YXRpb25BbW91bnR9ICovIChhbW91bnQpO1xuICAgIGNvbnN0IGZpbHRlcmVkSW52aXRhdGlvblZhbHVlID0gaW52aXRhdGlvbkFtb3VudC52YWx1ZS5tYXAoXG4gICAgICAoeyBoYW5kbGU6IF8sIC4uLmZpbHRlcmVkSW52aXRhdGlvbkRldGFpbHMgfSkgPT5cbiAgICAgICAgZmlsdGVyZWRJbnZpdGF0aW9uRGV0YWlscyxcbiAgICApO1xuXG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICBicmFuZDogc2hhcmVkLmludml0YXRpb25CcmFuZCxcbiAgICAgIHZhbHVlOiBmaWx0ZXJlZEludml0YXRpb25WYWx1ZSxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7VW5pcXVlUGFyYW1zfSB1bmlxdWVcbiAqIEByZXR1cm5zIHtTdGF0ZX1cbiAqL1xuICBjb25zdCBpbml0U3RhdGUgPSB1bmlxdWUgPT4ge1xuICAgIC8qIFNvbWUgdmFsaWRhdGlvbiBvZiBpbnB1dHMuKi9cbiAgICBtdXN0TWF0Y2goXG4gICAgICB1bmlxdWUsXG4gICAgICBoYXJkZW4oe1xuICAgICAgICBhZGRyZXNzOiBNLnN0cmluZygpLFxuICAgICAgICBiYW5rOiBNLmVyZWYoTS5yZW1vdGFibGUoKSksXG4gICAgICAgIGludml0YXRpb25QdXJzZTogUHVyc2VTaGFwZSxcbiAgICAgICAgLyogU2hvdWxkIG5vdCBiZSBNLmVyZWYsIG1ha2VSZWNvcmRlZEtpdCBhc3N1bWVzIHJlc29sdmVkKi9cbiAgICAgICAgY3VycmVudFN0b3JhZ2VOb2RlOiBNLmVyZWYoU3RvcmFnZU5vZGVTaGFwZSksXG4gICAgICAgIHdhbGxldFN0b3JhZ2VOb2RlOiBNLmVyZWYoU3RvcmFnZU5vZGVTaGFwZSksXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgcHJlY2lvdXNTdGF0ZSA9IHtcbiAgICAgIC8qIFBheW1lbnRzIHRoYXQgY291bGRuJ3QgYmUgZGVwb3NpdGVkIHdoZW4gcmVjZWl2ZWQuKi9cbiAgICAgIC8qIE5COiB2dWxuZXJhYmxlIHRvIHVuY2FwcGVkIGdyb3d0aCBieSB1bnBlcm1pc3Npb25lZCBkZXBvc2l0cy4qL1xuICAgICAgcGF5bWVudFF1ZXVlczogbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdwYXltZW50cyBxdWV1ZXMnLCB7XG4gICAgICAgIGR1cmFibGU6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIC8qIEludml0YXRpb24gYW1vdW50cyB0byBzYXZlIGZvciBwZXJzaXN0ZW50IGxvb2t1cCovXG4gICAgICBvZmZlclRvVXNlZEludml0YXRpb246IG1ha2VTY2FsYXJCaWdNYXBTdG9yZShcbiAgICAgICAgJ2ludml0YXRpb24gYW1vdW50cyBieSBvZmZlcicsXG4gICAgICAgIHtcbiAgICAgICAgICBkdXJhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICAgIC8qIEludml0YXRpb24gbWFrZXJzIHlpZWxkZWQgYnkgb2ZmZXIgcmVzdWx0cyovXG4gICAgICBvZmZlclRvSW52aXRhdGlvbk1ha2VyczogbWFrZVNjYWxhckJpZ01hcFN0b3JlKFxuICAgICAgICAnaW52aXRhdGlvbiBtYWtlcnMgYnkgb2ZmZXInLFxuICAgICAgICB7XG4gICAgICAgICAgZHVyYWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgICAvKiBQdWJsaWMgc3Vic2NyaWJlcnMgeWllbGRlZCBieSBvZmZlciByZXN1bHRzKi9cbiAgICAgIG9mZmVyVG9QdWJsaWNTdWJzY3JpYmVyUGF0aHM6IG1ha2VTY2FsYXJCaWdNYXBTdG9yZShcbiAgICAgICAgJ3B1YmxpYyBzdWJzY3JpYmVycyBieSBvZmZlcicsXG4gICAgICAgIHtcbiAgICAgICAgICBkdXJhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICAgIC8qIE5COiBXYWxsZXRzIGJlZm9yZSB0aGlzIHN0YXRlIHByb3BlcnR5IHdhcyBhZGRlZCBhbHNvIHN1cHBvcnQgc2F2aW5nKi9cbiAgICAgIC8qIHJlc3VsdHMgb3IgaW52b2tpbmcgdGhlIHNhdmVkIGl0ZW1zLCBidXQgdGhyb3VnaCB0aGUgYWx0ZXJuYXRlKi9cbiAgICAgIC8qIEVYSVNUSU5HX1dBTExFVF9NWV9TVE9SRVNfS0VZIGJhZ2dhZ2UgbWFwLiovXG4gICAgICBteVN0b3JlOiB3aXRoTXlTdG9yZSA/IHpvbmUuZGV0YWNoZWQoKS5tYXBTdG9yZSgnbXkgaXRlbXMnKSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmRlcktpdDxVcGRhdGVSZWNvcmQ+fSAqL1xuICAgIGNvbnN0IHVwZGF0ZVJlY29yZGVyS2l0ID0gbWFrZVJlY29yZGVyS2l0KHVuaXF1ZS53YWxsZXRTdG9yYWdlTm9kZSk7XG4gICAgLyogTkI6IHN0YXRlIHNpemUgbXVzdCBub3QgZ3JvdyBtb25vdG9uaWNhbGx5Ki9cbiAgICAvKiBUaGlzIGlzIHRoZSBub2RlIHRoYXQgVUlzIHN1YnNjcmliZSB0byBmb3IgZXZlcnl0aGluZyB0aGV5IG5lZWQuKi9cbiAgICAvKiBlLmcuIGFnb3JpYyBmb2xsb3cgOnB1Ymxpc2hlZC53YWxsZXQuYWdvcmljMW5xeGc0cHllMzBuM3RyY3QwaGY3ZGNsY3dmeHo4YXU4NGhyM2h0Ki9cbiAgICAvKiogQHR5cGUge1JlY29yZGVyS2l0PEN1cnJlbnRXYWxsZXRSZWNvcmQ+fSAqL1xuICAgIGNvbnN0IGN1cnJlbnRSZWNvcmRlcktpdCA9IG1ha2VSZWNvcmRlcktpdCh1bmlxdWUuY3VycmVudFN0b3JhZ2VOb2RlKTtcblxuICAgIGNvbnN0IG5vbnByZWNpb3VzU3RhdGUgPSB7XG4gICAgICAvKiBXaGF0IHB1cnNlcyBoYXZlIHJlcG9ydGVkIG9uIGNvbnN0cnVjdGlvbiBhbmQgYnkgZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyIHVwZGF0ZXMuKi9cbiAgICAgIHB1cnNlQmFsYW5jZXM6IG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgncHVyc2UgYmFsYW5jZXMnLCB7IGR1cmFibGU6IHRydWUgfSksXG4gICAgICB1cGRhdGVSZWNvcmRlcktpdCxcbiAgICAgIGN1cnJlbnRSZWNvcmRlcktpdCxcbiAgICAgIGxpdmVPZmZlcnM6IG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnbGl2ZSBvZmZlcnMnLCB7IGR1cmFibGU6IHRydWUgfSksXG4gICAgICAvKiBLZWVwIHNlYXRzIHNlcGFyYXRlIGZyb20gdGhlIG9mZmVycyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcHVibGlzaCB0aGVzZS4qL1xuICAgICAgbGl2ZU9mZmVyU2VhdHM6IG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnbGl2ZSBvZmZlciBzZWF0cycsIHtcbiAgICAgICAgZHVyYWJsZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgbGl2ZU9mZmVyUGF5bWVudHM6IG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnbGl2ZSBvZmZlciBwYXltZW50cycsIHtcbiAgICAgICAgZHVyYWJsZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udW5pcXVlLFxuICAgICAgLi4ubm9ucHJlY2lvdXNTdGF0ZSxcbiAgICAgIC4uLnByZWNpb3VzU3RhdGUsXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBpbnZvY2F0aW9uUmVzdWx0U2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICAgIHt9LFxuICAgIHsgaWQ6IE0ub3IoTS5zdHJpbmcoKSwgTS5udW1iZXIoKSksIHNhdmVSZXN1bHQ6IHNoYXBlLlJlc3VsdFBsYW4gfSxcbiAgKTtcblxuICBjb25zdCBiZWhhdmlvckd1YXJkcyA9IHtcbiAgICBoZWxwZXI6IE0uaW50ZXJmYWNlKCdoZWxwZXJGYWNldEknLCB7XG4gICAgICBhc3NlcnRVbmlxdWVPZmZlcklkOiBNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucygpLFxuICAgICAgdXBkYXRlQmFsYW5jZTogTS5jYWxsKFB1cnNlU2hhcGUsIEFtb3VudFNoYXBlKS5vcHRpb25hbCgnaW5pdCcpLnJldHVybnMoKSxcbiAgICAgIGdldFB1cnNlSWZLbm93bkJyYW5kOiBNLmNhbGwoQnJhbmRTaGFwZSlcbiAgICAgICAgLm9wdGlvbmFsKE0uZXJlZihNLnJlbW90YWJsZSgpKSlcbiAgICAgICAgLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgICAgcHVibGlzaEN1cnJlbnRTdGF0ZTogTS5jYWxsKCkucmV0dXJucygpLFxuICAgICAgd2F0Y2hQdXJzZTogTS5jYWxsKE0uZXJlZihQdXJzZVNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICB3YXRjaE5leHRCYWxhbmNlOiBNLmNhbGwoTS5hbnkoKSwgTm90aWZpZXJTaGFwZSwgTS5iaWdpbnQoKSkucmV0dXJucygpLFxuICAgICAgdXBkYXRlU3RhdHVzOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICAgICAgYWRkQ29udGludWluZ09mZmVyOiBNLmNhbGwoXG4gICAgICAgIE0ub3IoTS5udW1iZXIoKSwgTS5zdHJpbmcoKSksXG4gICAgICAgIEFtb3VudFNoYXBlLFxuICAgICAgICBNLnJlbW90YWJsZSgnSW52aXRhdGlvbk1ha2VyJyksXG4gICAgICAgIE0ub3IoTS5yZWNvcmQoKSwgTS51bmRlZmluZWQoKSksXG4gICAgICApLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgICAgcHVyc2VGb3JCcmFuZDogTS5jYWxsKEJyYW5kU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgICAgbG9nV2FsbGV0SW5mbzogTS5jYWxsKCkucmVzdChNLmFycmF5T2YoTS5hbnkoKSkpLnJldHVybnMoKSxcbiAgICAgIGxvZ1dhbGxldEVycm9yOiBNLmNhbGwoKS5yZXN0KE0uYXJyYXlPZihNLmFueSgpKSkucmV0dXJucygpLFxuICAgICAgZ2V0TGl2ZU9mZmVyUGF5bWVudHM6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ21hcFN0b3JlJykpLFxuICAgICAgZ2V0TXlTdG9yZTogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnbXkgaXRlbXMgc3RvcmUnKSksXG4gICAgICBzYXZlRW50cnk6IE0uY2FsbChzaGFwZS5SZXN1bHRQbGFuLCBNLmFueSgpKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICAgICAgZmluZFVudXNlZE5hbWU6IE0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICAgIH0pLFxuXG4gICAgZGVwb3NpdDogTS5pbnRlcmZhY2UoJ2RlcG9zaXRGYWNldEknLCB7XG4gICAgICByZWNlaXZlOiBNLmNhbGxXaGVuKE0uYXdhaXQoTS5lcmVmKFBheW1lbnRTaGFwZSkpKS5yZXR1cm5zKEFtb3VudFNoYXBlKSxcbiAgICB9KSxcbiAgICBwYXltZW50czogTS5pbnRlcmZhY2UoJ3BheW1lbnRzIHN1cHBvcnQnLCB7XG4gICAgICB3aXRoZHJhd0dpdmU6IE0uY2FsbChcbiAgICAgICAgQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuICAgICAgICBNLm9yKE0ubnVtYmVyKCksIE0uc3RyaW5nKCkpLFxuICAgICAgKS5yZXR1cm5zKFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKSxcbiAgICAgIHRyeVJlY2xhaW1pbmdXaXRoZHJhd25QYXltZW50czogTS5jYWxsKFxuICAgICAgICBNLm9yKE0ubnVtYmVyKCksIE0uc3RyaW5nKCkpLFxuICAgICAgKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICB9KSxcbiAgICBvZmZlcnM6IE0uaW50ZXJmYWNlKCdvZmZlcnMgZmFjZXQnLCB7XG4gICAgICBleGVjdXRlT2ZmZXI6IE0uY2FsbChzaGFwZS5PZmZlclNwZWMpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgICAgdHJ5RXhpdE9mZmVyOiBNLmNhbGwoTS5zY2FsYXIoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgfSksXG4gICAgaW52b2tlOiBNLmludGVyZmFjZSgnaW52b2tlJywge1xuICAgICAgaW52b2tlRW50cnk6IE0uY2FsbChzaGFwZS5JbnZva2VFbnRyeU1lc3NhZ2UpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIH0pLFxuICAgIHJlc3VsdFN0ZXBXYXRjaGVyOiBNLmludGVyZmFjZSgncmVzdWx0U3RlcFdhdGNoZXInLCB7XG4gICAgICBvbkZ1bGZpbGxlZDogTS5jYWxsKE0uYW55KCksIGludm9jYXRpb25SZXN1bHRTaGFwZSkucmV0dXJucygpLFxuICAgICAgb25SZWplY3RlZDogTS5jYWxsKE0uYW55KCksIGludm9jYXRpb25SZXN1bHRTaGFwZSkucmV0dXJucygpLFxuICAgIH0pLFxuICAgIHNlbGY6IE0uaW50ZXJmYWNlKCdzZWxmRmFjZXRJJywge1xuICAgICAgaGFuZGxlQnJpZGdlQWN0aW9uOiBNLmNhbGwoc2hhcGUuU3RyaW5nQ2FwRGF0YSwgTS5ib29sZWFuKCkpLnJldHVybnMoXG4gICAgICAgIE0ucHJvbWlzZSgpLFxuICAgICAgKSxcbiAgICAgIGdldERlcG9zaXRGYWNldDogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgpKSxcbiAgICAgIGdldEludm9rZUZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCkpLFxuICAgICAgZ2V0T2ZmZXJzRmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoKSksXG4gICAgICBnZXRDdXJyZW50U3Vic2NyaWJlcjogTS5jYWxsKCkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuICAgICAgZ2V0VXBkYXRlc1N1YnNjcmliZXI6IE0uY2FsbCgpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbiAgICAgIGdldFB1YmxpY1RvcGljczogTS5jYWxsKCkucmV0dXJucyhUb3BpY3NSZWNvcmRTaGFwZSksXG4gICAgfSksXG4gIH07XG5cbiAgLyogVE9ETyBtb3ZlIHRvIHRvcCBsZXZlbCBzbyBpdHMgdHlwZSBjYW4gYmUgZXhwb3J0ZWQqL1xuICAvKipcbiAqIE1ha2UgdGhlIGR1cmFibGUgb2JqZWN0IHRvIHJldHVybiwgYnV0IHRha2luZyBzb21lIHBhcmFtZXRlcnMgdGhhdCBhcmVcbiAqIGF3YWl0ZWQgYnkgYSB3cmFwcGluZyBmdW5jdGlvbi4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgY2xhc3Mga2l0XG4gKiBjb25zdHJ1Y3Rpb24gaGVscGVycywgYGluaXRTdGF0ZWAgYW5kIGBmaW5pc2hgIHJ1biBzeW5jaHJvbm91c2x5IGFuZCB0aGVcbiAqIGNoaWxkIHN0b3JhZ2Ugbm9kZSBtdXN0IGJlIGF3YWl0ZWQgdW50aWwgd2UgaGF2ZSBkdXJhYmxlIHByb21pc2VzLlxuICovXG4gIGNvbnN0IG1ha2VXYWxsZXRXaXRoUmVzb2x2ZWRTdG9yYWdlTm9kZXMgPSBwcmVwYXJlRXhvQ2xhc3NLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICAnU21hcnRXYWxsZXQnLFxuICAgIGJlaGF2aW9yR3VhcmRzLFxuICAgIGluaXRTdGF0ZSxcbiAgICB7XG4gICAgICBoZWxwZXI6IHtcbiAgICAgICAgLyoqXG4gKiBBc3NlcnQgdGhpcyBJRCBpcyB1bmlxdWUgd2l0aCByZXNwZWN0IHRvIHdoYXQgaGFzIGJlZW4gc3RvcmVkLiBUaGVcbiAqIHdhbGxldCBkb2Vzbid0IHN0b3JlIGV2ZXJ5IG9mZmVyIElEIGJ1dCB0aGUgb2ZmZXJzIGZvciB3aGljaCBpdFxuICogZG9lc24ndCBhcmUgdW5saWtlbHkgdG8gYmUgaW1wYWN0ZWQgYnkgcmUtdXNlLlxuICpcbiAqIEB0eXBlIHsoaWQ6IHN0cmluZykgPT4gdm9pZH1cbiAqL1xuICAgICAgICBhc3NlcnRVbmlxdWVPZmZlcklkKGlkKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgbGl2ZU9mZmVycyxcbiAgICAgICAgICAgIGxpdmVPZmZlclNlYXRzLFxuICAgICAgICAgICAgb2ZmZXJUb0ludml0YXRpb25NYWtlcnMsXG4gICAgICAgICAgICBvZmZlclRvUHVibGljU3Vic2NyaWJlclBhdGhzLFxuICAgICAgICAgICAgb2ZmZXJUb1VzZWRJbnZpdGF0aW9uLFxuICAgICAgICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IHVzZWQgPVxuICAgICAgICAgICAgbGl2ZU9mZmVycy5oYXMoaWQpIHx8XG4gICAgICAgICAgICBsaXZlT2ZmZXJTZWF0cy5oYXMoaWQpIHx8XG4gICAgICAgICAgICBmYWNldHMuaGVscGVyLmdldExpdmVPZmZlclBheW1lbnRzKCkuaGFzKGlkKSB8fFxuICAgICAgICAgICAgb2ZmZXJUb0ludml0YXRpb25NYWtlcnMuaGFzKGlkKSB8fFxuICAgICAgICAgICAgb2ZmZXJUb1B1YmxpY1N1YnNjcmliZXJQYXRocy5oYXMoaWQpIHx8XG4gICAgICAgICAgICBvZmZlclRvVXNlZEludml0YXRpb24uaGFzKGlkKTtcbiAgICAgICAgICAhdXNlZCB8fCBGYWlsYGNhbm5vdCByZS11c2Ugb2ZmZXIgaWQgJHtpZH1gO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAqIEBwYXJhbSB7UHVyc2V9IHB1cnNlXG4gKiBAcGFyYW0ge0Ftb3VudDxhbnk+fSBiYWxhbmNlXG4gKi9cbiAgICAgICAgdXBkYXRlQmFsYW5jZShwdXJzZSwgYmFsYW5jZSkge1xuICAgICAgICAgIGNvbnN0IHsgcHVyc2VCYWxhbmNlcywgdXBkYXRlUmVjb3JkZXJLaXQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgaWYgKHB1cnNlQmFsYW5jZXMuaGFzKHB1cnNlKSkge1xuICAgICAgICAgICAgcHVyc2VCYWxhbmNlcy5zZXQocHVyc2UsIGJhbGFuY2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwdXJzZUJhbGFuY2VzLmluaXQocHVyc2UsIGJhbGFuY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2b2lkIHVwZGF0ZVJlY29yZGVyS2l0LnJlY29yZGVyLndyaXRlKHtcbiAgICAgICAgICAgIHVwZGF0ZWQ6ICdiYWxhbmNlJyxcbiAgICAgICAgICAgIGN1cnJlbnRBbW91bnQ6IGNsZWFuQW1vdW50Rm9yUHVibGlzaChiYWxhbmNlKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgaGVscGVyLnB1Ymxpc2hDdXJyZW50U3RhdGUoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBwdWJsaXNoQ3VycmVudFN0YXRlKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGN1cnJlbnRSZWNvcmRlcktpdCxcbiAgICAgICAgICAgIG9mZmVyVG9Vc2VkSW52aXRhdGlvbixcbiAgICAgICAgICAgIG9mZmVyVG9QdWJsaWNTdWJzY3JpYmVyUGF0aHMsXG4gICAgICAgICAgICBwdXJzZUJhbGFuY2VzLFxuICAgICAgICAgICAgbGl2ZU9mZmVycyxcbiAgICAgICAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICB2b2lkIGN1cnJlbnRSZWNvcmRlcktpdC5yZWNvcmRlci53cml0ZSh7XG4gICAgICAgICAgICBwdXJzZXM6IFsuLi5wdXJzZUJhbGFuY2VzLnZhbHVlcygpXS5tYXAoYSA9PiAoe1xuICAgICAgICAgICAgICBicmFuZDogYS5icmFuZCxcbiAgICAgICAgICAgICAgYmFsYW5jZTogY2xlYW5BbW91bnRGb3JQdWJsaXNoKGEpLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgb2ZmZXJUb1VzZWRJbnZpdGF0aW9uOiBbLi4ub2ZmZXJUb1VzZWRJbnZpdGF0aW9uLmVudHJpZXMoKV0ubWFwKFxuICAgICAgICAgICAgICAoW29mZmVySWQsIGFdKSA9PiBbb2ZmZXJJZCwgY2xlYW5BbW91bnRGb3JQdWJsaXNoKGEpXSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBvZmZlclRvUHVibGljU3Vic2NyaWJlclBhdGhzOiBbXG4gICAgICAgICAgICAgIC4uLm9mZmVyVG9QdWJsaWNTdWJzY3JpYmVyUGF0aHMuZW50cmllcygpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGxpdmVPZmZlcnM6IFsuLi5saXZlT2ZmZXJzLmVudHJpZXMoKV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqIEB0eXBlIHsocHVyc2U6IEVSZWY8UHVyc2U+KSA9PiBQcm9taXNlPHZvaWQ+fSAqL1xuICAgICAgICBhc3luYyB3YXRjaFB1cnNlKHB1cnNlUmVmKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuXG4gICAgICAgICAgLyogVGhpcyB3b3VsZCBzZWVtIHRvIGZpdCB0aGUgb2JzZXJ2ZU5vdGlmaWVyKCkgcGF0dGVybiwqL1xuICAgICAgICAgIC8qIGJ1dCBwdXJzZSBub3RpZmllcnMgYXJlIG5vdCBuZWNlc3NhcmlseSBkdXJhYmxlLiovXG4gICAgICAgICAgLyogSWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVlIHRvIHVwZ3JhZGUsIHJldHJ5IHdhdGNoUHVyc2UoKS4qL1xuXG4gICAgICAgICAgY29uc3QgcHVyc2UgPSBhd2FpdCBwdXJzZVJlZjsgLyogcHJvbWlzZXMgZG9uJ3QgZml0IGluIGR1cmFibGUgc3RvcmFnZSovXG4gICAgICAgICAgY29uc3QgaGFuZGxlciA9IG1ha2VBbW91bnRXYXRjaGVyKHB1cnNlLCBoZWxwZXIpO1xuXG4gICAgICAgICAgLyogcHVibGlzaCBwdXJzZSdzIGJhbGFuY2UgYW5kIGNoYW5nZXMqL1xuICAgICAgICAgIGNvbnN0IG5vdGlmaWVyID0gYXdhaXQgRShwdXJzZSkuZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyKCk7XG4gICAgICAgICAgY29uc3Qgc3RhcnRQID0gRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodW5kZWZpbmVkKTtcbiAgICAgICAgICB3YXRjaFByb21pc2Uoc3RhcnRQLCBoYW5kbGVyLCBub3RpZmllcik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgd2F0Y2hOZXh0QmFsYW5jZShoYW5kbGVyLCBub3RpZmllciwgdXBkYXRlQ291bnQpIHtcbiAgICAgICAgICBjb25zdCBuZXh0UCA9IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KTtcbiAgICAgICAgICB3YXRjaFByb21pc2UobmV4dFAsIGhhbmRsZXIsIG5vdGlmaWVyKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAqIFByb3ZpZGUgYSBwdXJzZSBnaXZlbiBhIE5hbWVIdWIgb2YgaXNzdWVycyBhbmQgdGhlaXIgYnJhbmRzLlxuICpcbiAqIFdlIGN1cnJlbnRseSBzdXBwb3J0IG9ubHkgb25lIE5hbWVIdWIsIGFnb3JpY05hbWVzLCBhbmQgaGVuY2Ugb25lXG4gKiBwdXJzZSBwZXIgYnJhbmQuIEJ1dCB3ZSBzdG9yZSBhbiBhcnJheSBvZiB0aGVtIHRvIGZhY2lsaXRhdGUgYVxuICogdHJhbnNpdGlvbiB0byBkZWNlbnRyYWxpemVkIGludHJvZHVjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7RVJlZjxOYW1lSHViPn0ga25vd24gLSBuYW1laHViIHdpdGggYnJhbmQsIGlzc3VlciBicmFuY2hlc1xuICogQHJldHVybnMge1Byb21pc2U8UHVyc2UgfCB1bmRlZmluZWQ+fSB1bmRlZmluZWQgaWYgYnJhbmQgaXMgbm90IGtub3duXG4gKi9cbiAgICAgICAgYXN5bmMgZ2V0UHVyc2VJZktub3duQnJhbmQoYnJhbmQsIGtub3duKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIsIHNlbGYgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IGJyYW5kVG9QdXJzZXMgPSBnZXRCcmFuZFRvUHVyc2VzKHdhbGxldFB1cnNlcywgc2VsZik7XG5cbiAgICAgICAgICBpZiAoYnJhbmRUb1B1cnNlcy5oYXMoYnJhbmQpKSB7XG4gICAgICAgICAgICBjb25zdCBwdXJzZXMgPSBicmFuZFRvUHVyc2VzLmdldChicmFuZCk7XG4gICAgICAgICAgICBpZiAocHVyc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MTI2Ki9cbiAgICAgICAgICAgICAgLyogbXVsdGlwbGUgcHVyc2VzKi9cbiAgICAgICAgICAgICAgcmV0dXJuIHB1cnNlc1swXS5wdXJzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmb3VuZCA9IGF3YWl0IG5hbWVzT2YoYnJhbmQsIEUoa25vd24pLmxvb2t1cCgnYnJhbmQnKSk7XG4gICAgICAgICAgaWYgKGZvdW5kLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgW2VkZ2VOYW1lXSA9IGZvdW5kO1xuICAgICAgICAgIGNvbnN0IGlzc3VlciA9IGF3YWl0IEUoa25vd24pLmxvb2t1cCgnaXNzdWVyJywgZWRnZU5hbWUpO1xuXG4gICAgICAgICAgLyogRXZlbiB0aG91Z2ggd2UgcmVseSBvbiB0aGlzIG5hbWVIdWIsIGRvdWJsZS1jaGVjayovXG4gICAgICAgICAgLyogdGhhdCB0aGUgaXNzdWVyIGFuZCB0aGUgYnJhbmQgYmVsb25nIHRvIGVhY2ggb3RoZXIuKi9cbiAgICAgICAgICBpZiAoIShhd2FpdCBjaGVja011dHVhbChpc3N1ZXIsIGJyYW5kKSkpIHtcbiAgICAgICAgICAgIC8qIGlmIHRoZXkgZG9uJ3QsIGl0J3Mgbm90IGEgXCJrbm93blwiIGJyYW5kIGluIGEgY29oZXJlbnQgd2F5Ki9cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLyogQWNjZXB0IHRoZSBpc3N1ZXI7IHJlbHkgb24gaXQgaW4gZnV0dXJlIG9mZmVycy4qL1xuICAgICAgICAgIGNvbnN0IFtkaXNwbGF5SW5mbywgcHVyc2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgRShpc3N1ZXIpLmdldERpc3BsYXlJbmZvKCksXG4gICAgICAgICAgICBFKGlzc3VlcikubWFrZUVtcHR5UHVyc2UoKSxcbiAgICAgICAgICBdKTtcblxuICAgICAgICAgIC8qIGFkb3B0IGVkZ2VOYW1lIGFzIHBldG5hbWUqL1xuICAgICAgICAgIC8qIE5PVEU6IGZvciBkZWNlbnRyYWxpemVkIGludHJvZHVjdGlvbnMsIHF1YWxpZnkgZWRnZW5hbWUgYnkgbmFtZUh1YiBwZXRuYW1lKi9cbiAgICAgICAgICBjb25zdCBwZXRuYW1lID0gZWRnZU5hbWU7XG4gICAgICAgICAgY29uc3QgYXNzZXRJbmZvID0geyBwZXRuYW1lLCBicmFuZCwgaXNzdWVyLCBwdXJzZSwgZGlzcGxheUluZm8gfTtcbiAgICAgICAgICBhcHBlbmRUb1N0b3JlZEFycmF5KGJyYW5kVG9QdXJzZXMsIGJyYW5kLCBhc3NldEluZm8pO1xuICAgICAgICAgIC8qIE5PVEU6IHdoZW4gd2UgZGVjZW50cmFsaXplIGludHJvZHVjdGlvbiBvZiBpc3N1ZXJzLCovXG4gICAgICAgICAgLyogcHJvY2VzcyBxdWV1ZWQgcGF5bWVudHMgZm9yIHRoaXMgYnJhbmQuKi9cblxuICAgICAgICAgIHZvaWQgaGVscGVyLndhdGNoUHVyc2UocHVyc2UpO1xuICAgICAgICAgIHJldHVybiBwdXJzZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiogQHBhcmFtIHtPZmZlclN0YXR1c30gb2ZmZXJTdGF0dXMgKi9cbiAgICAgICAgdXBkYXRlU3RhdHVzKG9mZmVyU3RhdHVzKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuICAgICAgICAgIGZhY2V0cy5oZWxwZXIubG9nV2FsbGV0SW5mbygnb2ZmZXJTdGF0dXMnLCBvZmZlclN0YXR1cyk7XG5cbiAgICAgICAgICB2b2lkIHN0YXRlLnVwZGF0ZVJlY29yZGVyS2l0LnJlY29yZGVyLndyaXRlKHtcbiAgICAgICAgICAgIHVwZGF0ZWQ6ICdvZmZlclN0YXR1cycsXG4gICAgICAgICAgICBzdGF0dXM6IG9mZmVyU3RhdHVzLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCdudW1XYW50c1NhdGlzZmllZCcgaW4gb2ZmZXJTdGF0dXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5saXZlT2ZmZXJTZWF0cy5oYXMob2ZmZXJTdGF0dXMuaWQpKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmxpdmVPZmZlclNlYXRzLmRlbGV0ZShvZmZlclN0YXR1cy5pZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmYWNldHMuaGVscGVyLmdldExpdmVPZmZlclBheW1lbnRzKCkuaGFzKG9mZmVyU3RhdHVzLmlkKSkge1xuICAgICAgICAgICAgICBmYWNldHMuaGVscGVyLmdldExpdmVPZmZlclBheW1lbnRzKCkuZGVsZXRlKG9mZmVyU3RhdHVzLmlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0YXRlLmxpdmVPZmZlcnMuaGFzKG9mZmVyU3RhdHVzLmlkKSkge1xuICAgICAgICAgICAgICBzdGF0ZS5saXZlT2ZmZXJzLmRlbGV0ZShvZmZlclN0YXR1cy5pZCk7XG4gICAgICAgICAgICAgIC8qIFRoaXMgbWlnaHQgZ2V0IHNraXBwZWQgaW4gc3Vic2VxdWVudCBwYXNzZXMsIHNpbmNlIHdlIC5kZWxldGUoKSovXG4gICAgICAgICAgICAgIC8qIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gqL1xuICAgICAgICAgICAgICBmYWNldHMuaGVscGVyLnB1Ymxpc2hDdXJyZW50U3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gb2ZmZXJJZFxuICogQHBhcmFtIHtBbW91bnQ8J3NldCc+fSBpbnZpdGF0aW9uQW1vdW50XG4gKiBAcGFyYW0ge0ludml0YXRpb25NYWtlcnN9IGludml0YXRpb25NYWtlcnNcbiAqIEBwYXJhbSB7UHVibGljU3Vic2NyaWJlcnN9IHB1YmxpY1N1YnNjcmliZXJzXG4gKi9cbiAgICAgICAgYXN5bmMgYWRkQ29udGludWluZ09mZmVyKFxuICAgICAgICAgIG9mZmVySWQsXG4gICAgICAgICAgaW52aXRhdGlvbkFtb3VudCxcbiAgICAgICAgICBpbnZpdGF0aW9uTWFrZXJzLFxuICAgICAgICAgIHB1YmxpY1N1YnNjcmliZXJzLFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG5cbiAgICAgICAgICBzdGF0ZS5vZmZlclRvVXNlZEludml0YXRpb24uaW5pdChvZmZlcklkLCBpbnZpdGF0aW9uQW1vdW50KTtcbiAgICAgICAgICBzdGF0ZS5vZmZlclRvSW52aXRhdGlvbk1ha2Vycy5pbml0KG9mZmVySWQsIGludml0YXRpb25NYWtlcnMpO1xuICAgICAgICAgIGNvbnN0IHBhdGhNYXAgPSBhd2FpdCBvYmplY3RNYXBTdG9yYWdlUGF0aChwdWJsaWNTdWJzY3JpYmVycyk7XG4gICAgICAgICAgaWYgKHBhdGhNYXApIHtcbiAgICAgICAgICAgIGZhY2V0cy5oZWxwZXIubG9nV2FsbGV0SW5mbygncmVjb3JkaW5nIHBhdGhNYXAnLCBwYXRoTWFwKTtcbiAgICAgICAgICAgIHN0YXRlLm9mZmVyVG9QdWJsaWNTdWJzY3JpYmVyUGF0aHMuaW5pdChvZmZlcklkLCBwYXRoTWFwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmFjZXRzLmhlbHBlci5wdWJsaXNoQ3VycmVudFN0YXRlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHJldHVybnMge1Byb21pc2U8UHVyc2U+fVxuICovXG4gICAgICAgIGFzeW5jIHB1cnNlRm9yQnJhbmQoYnJhbmQpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyByZWdpc3RyeSwgaW52aXRhdGlvbkJyYW5kIH0gPSBzaGFyZWQ7XG5cbiAgICAgICAgICBpZiAocmVnaXN0cnkuaGFzKGJyYW5kKSkge1xuICAgICAgICAgICAgcmV0dXJuIEUoc3RhdGUuYmFuaykuZ2V0UHVyc2UoYnJhbmQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW52aXRhdGlvbkJyYW5kID09PSBicmFuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmludml0YXRpb25QdXJzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBwdXJzZSA9IGF3YWl0IGZhY2V0cy5oZWxwZXIuZ2V0UHVyc2VJZktub3duQnJhbmQoXG4gICAgICAgICAgICBicmFuZCxcbiAgICAgICAgICAgIHNoYXJlZC5hZ29yaWNOYW1lcyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwdXJzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHB1cnNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBGYWlsYGNhbm5vdCBmaW5kL21ha2UgcHVyc2UgZm9yICR7YnJhbmR9YDtcbiAgICAgICAgfSxcbiAgICAgICAgbG9nV2FsbGV0SW5mbyguLi5hcmdzKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ3dhbGxldCcsIHN0YXRlLmFkZHJlc3MsIC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICBsb2dXYWxsZXRFcnJvciguLi5hcmdzKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd3YWxsZXQnLCBzdGF0ZS5hZGRyZXNzLCAuLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyogSW4gbmV3IFNtYXJ0V2FsbGV0cywgdGhpcyBpcyBwYXJ0IG9mIHN0YXRlLCBidXQgd2UgY2FuJ3QgYWRkIGZpZWxkcyovXG4gICAgICAgIC8qIHRvIGluc3RhbmNlIHN0YXRlIGZvciBvbGRlciBTbWFydFdhbGxldHMsIHNvIHB1dCBpdCBpbiBiYWdnYWdlLiovXG4gICAgICAgIGdldExpdmVPZmZlclBheW1lbnRzKCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG5cbiAgICAgICAgICBpZiAoc3RhdGUubGl2ZU9mZmVyUGF5bWVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5saXZlT2ZmZXJQYXltZW50cztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKiBUaGlzIHdpbGwgb25seSBoYXBwZW4gZm9yIGxlZ2FjeSB3YWxsZXRzLCBiZWZvcmUgV0YgaW5jYXJuYXRpb24gMiovXG4gICAgICAgICAgaWYgKCFiYWdnYWdlLmhhcyhzdGF0ZS5hZGRyZXNzKSkge1xuICAgICAgICAgICAgdHJhY2UoYGdldExpdmVPZmZlclBheW1lbnRzIGFkZGluZyBzdG9yZSBmb3IgJHtzdGF0ZS5hZGRyZXNzfWApO1xuICAgICAgICAgICAgYmFnZ2FnZS5pbml0KFxuICAgICAgICAgICAgICBzdGF0ZS5hZGRyZXNzLFxuICAgICAgICAgICAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ2xpdmUgb2ZmZXIgcGF5bWVudHMnLCB7XG4gICAgICAgICAgICAgICAgZHVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYmFnZ2FnZS5nZXQoc3RhdGUuYWRkcmVzcyk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICogQHJldHVybnMge05vbk51bGxhYmxlPEltbXV0YWJsZVN0YXRlWydteVN0b3JlJ10+fVxuICovXG4gICAgICAgIGdldE15U3RvcmUoKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBmYWNldHM6IHsgc2VsZiB9LFxuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIGlmICgnbXlTdG9yZScgaW4gc3RhdGUgJiYgc3RhdGUubXlTdG9yZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUubXlTdG9yZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcHJvdmlkZUxhenkoZXhpc3RpbmdXYWxsZXRNeVN0b3Jlcywgc2VsZiwgX2sgPT5cbiAgICAgICAgICAgIHpvbmUuZGV0YWNoZWQoKS5tYXBTdG9yZSgnbXkgaXRlbXMnKSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQHBhcmFtIHtzdHJpbmd9IHN1Z2dlc3Rpb24gKi9cbiAgICAgICAgZmluZFVudXNlZE5hbWUoc3VnZ2VzdGlvbikge1xuICAgICAgICAgIGNvbnN0IG15U3RvcmUgPSB0aGlzLmZhY2V0cy5oZWxwZXIuZ2V0TXlTdG9yZSgpO1xuICAgICAgICAgIGxldCBub25jZSA9IDA7XG4gICAgICAgICAgbGV0IG5hbWUgPSBzdWdnZXN0aW9uO1xuICAgICAgICAgIHdoaWxlIChteVN0b3JlLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgbm9uY2UgKz0gbXlTdG9yZS5nZXRTaXplKCk7IC8qIGF2b2lkIGxpbmVhciB3b3JrKi9cbiAgICAgICAgICAgIG5hbWUgPSBgJHtzdWdnZXN0aW9ufS4ke25vbmNlfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAqIEBwYXJhbSB7UmVzdWx0UGxhbn0gcGxhblxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICovXG4gICAgICAgIHNhdmVFbnRyeShwbGFuLCB2YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IG15U3RvcmUgPSB0aGlzLmZhY2V0cy5oZWxwZXIuZ2V0TXlTdG9yZSgpO1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBwbGFuLm92ZXJ3cml0ZVxuICAgICAgICAgICAgPyBwbGFuLm5hbWVcbiAgICAgICAgICAgIDogdGhpcy5mYWNldHMuaGVscGVyLmZpbmRVbnVzZWROYW1lKHBsYW4ubmFtZSk7XG5cbiAgICAgICAgICBpZiAobXlTdG9yZS5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIG15U3RvcmUuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXlTdG9yZS5pbml0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJhY2UoJ3NldCcsIG5hbWUsICc9JywgdmFsdWUpO1xuICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIC8qKlxuICogU2ltaWxhciB0byB7RGVwb3NpdEZhY2V0fSBidXQgYXN5bmMgYmVjYXVzZSBpdCBoYXMgdG8gbG9vayB1cCB0aGVcbiAqIHB1cnNlLlxuICovXG4gICAgICBkZXBvc2l0OiB7XG4gICAgICAgIC8qKlxuICogUHV0IHRoZSBhc3NldHMgZnJvbSB0aGUgcGF5bWVudCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBwdXJzZS5cbiAqXG4gKiBJZiB0aGUgcHVyc2UgZG9lc24ndCBleGlzdCwgd2UgaG9sZCB0aGUgcGF5bWVudCBpbiBkdXJhYmxlIHN0b3JhZ2UuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ+fVxuICogQHRocm93cyBpZiB0aGVyZSdzIG5vdCB5ZXQgYSBwdXJzZSwgdGhvdWdoIHRoZSBwYXltZW50IGlzIGhlbGQgdG8gdHJ5XG4gKiAgIGFnYWluIHdoZW4gdGhlcmUgaXNcbiAqL1xuICAgICAgICBhc3luYyByZWNlaXZlKHBheW1lbnQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgIGZhY2V0czogeyBoZWxwZXIgfSxcbiAgICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IHBheW1lbnRRdWV1ZXM6IHF1ZXVlcywgYmFuaywgaW52aXRhdGlvblB1cnNlIH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCB7IHJlZ2lzdHJ5LCBpbnZpdGF0aW9uQnJhbmQgfSA9IHNoYXJlZDtcblxuICAgICAgICAgIGNvbnN0IGJyYW5kID0gYXdhaXQgRShwYXltZW50KS5nZXRBbGxlZ2VkQnJhbmQoKTtcblxuICAgICAgICAgIC8qIFdoZW4gdGhlcmUgaXMgYSBwdXJzZSBkZXBvc2l0IGludG8gaXQqL1xuICAgICAgICAgIGlmIChyZWdpc3RyeS5oYXMoYnJhbmQpKSB7XG4gICAgICAgICAgICBjb25zdCBwdXJzZSA9IEUoYmFuaykuZ2V0UHVyc2UoYnJhbmQpO1xuICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3cgYXNzZXRLaW5kIHRvICduYXQnKi9cbiAgICAgICAgICAgIHJldHVybiBFKHB1cnNlKS5kZXBvc2l0KHBheW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW52aXRhdGlvbkJyYW5kID09PSBicmFuZCkge1xuICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3cgYXNzZXRLaW5kIHRvICdzZXQnKi9cbiAgICAgICAgICAgIHJldHVybiBFKGludml0YXRpb25QdXJzZSkuZGVwb3NpdChwYXltZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBwdXJzZSA9IGF3YWl0IGhlbHBlci5nZXRQdXJzZUlmS25vd25CcmFuZChcbiAgICAgICAgICAgIGJyYW5kLFxuICAgICAgICAgICAgc2hhcmVkLmFnb3JpY05hbWVzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHB1cnNlKSB7XG4gICAgICAgICAgICByZXR1cm4gRShwdXJzZSkuZGVwb3NpdChwYXltZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKiBXaGVuIHRoZXJlIGlzIG5vIHB1cnNlLCBzYXZlIHRoZSBwYXltZW50IGludG8gYSBxdWV1ZS4qL1xuICAgICAgICAgIC8qIEl0J3Mgbm90IHlldCBldmVyIHJlYWQgYnV0IGEgZnV0dXJlIHZlcnNpb24gb2YgdGhlIGNvbnRyYWN0IGNhbiovXG4gICAgICAgICAgYXBwZW5kVG9TdG9yZWRBcnJheShxdWV1ZXMsIGJyYW5kLCBwYXltZW50KTtcbiAgICAgICAgICB0aHJvdyBGYWlsYGNhbm5vdCBkZXBvc2l0IHBheW1lbnQgd2l0aCBicmFuZCAke2JyYW5kfTogbm8gcHVyc2VgO1xuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgcGF5bWVudHM6IHtcbiAgICAgICAgLyoqXG4gKiBXaXRoZHJhdyB0aGUgb2ZmZXJlZCBhbW91bnQgZnJvbSB0aGUgYXBwcm9wcmlhdGUgcHVyc2Ugb2YgdGhpc1xuICogd2FsbGV0LlxuICpcbiAqIFNhdmUgaXRzIGFtb3VudCBpbiBsaXZlT2ZmZXJQYXltZW50cyBpbiBjYXNlIHdlIG5lZWQgdG8gcmVjbGFpbSB0aGVcbiAqIHBheW1lbnQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBnaXZlXG4gKiBAcGFyYW0ge09mZmVySWR9IG9mZmVySWRcbiAqIEByZXR1cm5zIHtQYXltZW50UEtleXdvcmRSZWNvcmR9XG4gKi9cbiAgICAgICAgd2l0aGRyYXdHaXZlKGdpdmUsIG9mZmVySWQpIHtcbiAgICAgICAgICBjb25zdCB7IGZhY2V0cyB9ID0gdGhpcztcblxuICAgICAgICAgIC8qKiBAdHlwZSB7TWFwU3RvcmU8QnJhbmQsIFBheW1lbnQ+fSAqL1xuICAgICAgICAgIGNvbnN0IGJyYW5kUGF5bWVudFJlY29yZCA9IG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgncGF5bWVudFRvQnJhbmQnLCB7XG4gICAgICAgICAgICBkdXJhYmxlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZhY2V0cy5oZWxwZXJcbiAgICAgICAgICAgIC5nZXRMaXZlT2ZmZXJQYXltZW50cygpXG4gICAgICAgICAgICAuaW5pdChvZmZlcklkLCBicmFuZFBheW1lbnRSZWNvcmQpO1xuXG4gICAgICAgICAgLyogQWRkIGVhY2ggcGF5bWVudCBhbW91bnQgdG8gYnJhbmRQYXltZW50UmVjb3JkIGFzIGl0IGlzIHdpdGhkcmF3bi4gSWYqL1xuICAgICAgICAgIC8qIHRoZXJlJ3MgYW4gZXJyb3IgbGF0ZXIsIHdlIGNhbiB1c2UgaXQgdG8gcmVkZXBvc2l0IHRoZSBjb3JyZWN0IGFtb3VudC4qL1xuICAgICAgICAgIHJldHVybiBvYmplY3RNYXAoZ2l2ZSwgYW1vdW50ID0+IHtcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7UHJvbWlzZTxQdXJzZT59ICovXG4gICAgICAgICAgICBjb25zdCBwdXJzZVAgPSBmYWNldHMuaGVscGVyLnB1cnNlRm9yQnJhbmQoYW1vdW50LmJyYW5kKTtcbiAgICAgICAgICAgIGNvbnN0IHBheW1lbnRQID0gRShwdXJzZVApLndpdGhkcmF3KGFtb3VudCk7XG4gICAgICAgICAgICB2b2lkIEUud2hlbihcbiAgICAgICAgICAgICAgcGF5bWVudFAsXG4gICAgICAgICAgICAgIHBheW1lbnQgPT4gYnJhbmRQYXltZW50UmVjb3JkLmluaXQoYW1vdW50LmJyYW5kLCBwYXltZW50KSxcbiAgICAgICAgICAgICAgZSA9PiB7XG4gICAgICAgICAgICAgICAgLyogcmVjb3Zlcnkgd2lsbCBiZSBoYW5kbGVkIGJ5IHRyeVJlY2xhaW1pbmdXaXRoZHJhd25QYXltZW50cygpKi9cbiAgICAgICAgICAgICAgICBmYWNldHMuaGVscGVyLmxvZ1dhbGxldEluZm8oXG4gICAgICAgICAgICAgICAgICBg4pqg77iPIFBheW1lbnQgd2l0aGRyYXdhbCBmYWlsZWQuYCxcbiAgICAgICAgICAgICAgICAgIG9mZmVySWQsXG4gICAgICAgICAgICAgICAgICBlLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHBheW1lbnRQO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICogRmluZCB0aGUgbGl2ZSBwYXltZW50cyBmb3IgdGhlIG9mZmVyIGFuZCBkZXBvc2l0IHRoZW0gYmFjayBpbiB0aGVcbiAqIGFwcHJvcHJpYXRlIHB1cnNlcy5cbiAqXG4gKiBAcGFyYW0ge09mZmVySWR9IG9mZmVySWRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFtb3VudFtdPn1cbiAqL1xuICAgICAgICBhc3luYyB0cnlSZWNsYWltaW5nV2l0aGRyYXduUGF5bWVudHMob2ZmZXJJZCkge1xuICAgICAgICAgIGNvbnN0IHsgZmFjZXRzIH0gPSB0aGlzO1xuXG4gICAgICAgICAgYXdhaXQgbnVsbDtcblxuICAgICAgICAgIGNvbnN0IGxpdmVPZmZlclBheW1lbnRzID0gZmFjZXRzLmhlbHBlci5nZXRMaXZlT2ZmZXJQYXltZW50cygpO1xuICAgICAgICAgIGlmIChsaXZlT2ZmZXJQYXltZW50cy5oYXMob2ZmZXJJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJyYW5kUGF5bWVudFJlY29yZCA9IGxpdmVPZmZlclBheW1lbnRzLmdldChvZmZlcklkKTtcbiAgICAgICAgICAgIGlmICghYnJhbmRQYXltZW50UmVjb3JkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG91dCA9IFtdO1xuICAgICAgICAgICAgLyogVXNlIGFsbFNldHRsZWQgdG8gZW5zdXJlIHdlIGF0dGVtcHQgYWxsIHRoZSBkZXBvc2l0cywgcmVnYXJkbGVzcyBvZiovXG4gICAgICAgICAgICAvKiBpbmRpdmlkdWFsIHJlamVjdGlvbnMuKi9cbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgICAgQXJyYXkuZnJvbShicmFuZFBheW1lbnRSZWNvcmQuZW50cmllcygpKS5tYXAoKFtiLCBwXSkgPT4ge1xuICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIHRoZSB3aXRoZHJhd2FsIHRvIGNvbXBsZXRlLiAgVGhpcyBwcm90ZWN0cyBhZ2FpbnN0IGEqL1xuICAgICAgICAgICAgICAgIC8qIHJhY2Ugd2hlbiB1cGRhdGluZyBwYXltZW50VG9QdXJzZS4qL1xuICAgICAgICAgICAgICAgIGNvbnN0IHB1cnNlUCA9IGZhY2V0cy5oZWxwZXIucHVyc2VGb3JCcmFuZChiKTtcblxuICAgICAgICAgICAgICAgIC8qIE5vdyBzZW5kIGl0IGJhY2sgdG8gdGhlIHB1cnNlLiovXG4gICAgICAgICAgICAgICAgcmV0dXJuIEUocHVyc2VQKVxuICAgICAgICAgICAgICAgICAgLmRlcG9zaXQocClcbiAgICAgICAgICAgICAgICAgIC50aGVuKGFtdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKGFtdCk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbihvdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBvZmZlcnM6IHtcbiAgICAgICAgLyoqXG4gKiBUYWtlIGFuIG9mZmVyIGRlc2NyaXB0aW9uIHByb3ZpZGVkIGluIGNhcERhdGEsIGF1Z21lbnQgaXQgd2l0aFxuICogcGF5bWVudHMgYW5kIGNhbGwgem9lLm9mZmVyKClcbiAqXG4gKiBAcGFyYW0ge09mZmVyU3BlY30gb2ZmZXJTcGVjXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gYWZ0ZXIgdGhlIG9mZmVyIGhhcyBiZWVuIGJvdGggc2VhdGVkIGFuZFxuICogICBleGl0ZWQgYnkgWm9lLlxuICogQHRocm93cyBpZiBhbnkgcGFydHMgb2YgdGhlIG9mZmVyIGNhbiBiZSBkZXRlcm1pbmVkIHN5bmNocm9ub3VzbHkgdG9cbiAqICAgYmUgaW52YWxpZFxuICovXG4gICAgICAgIGFzeW5jIGV4ZWN1dGVPZmZlcihvZmZlclNwZWMpIHtcbiAgICAgICAgICBjb25zdCB7IGZhY2V0cywgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBhZGRyZXNzLCBpbnZpdGF0aW9uUHVyc2UgfSA9IHN0YXRlO1xuICAgICAgICAgIGNvbnN0IHsgem9lLCBhZ29yaWNOYW1lcyB9ID0gc2hhcmVkO1xuICAgICAgICAgIGNvbnN0IHsgaW52aXRhdGlvbkJyYW5kLCBpbnZpdGF0aW9uSXNzdWVyIH0gPSBzaGFyZWQ7XG5cbiAgICAgICAgICBmYWNldHMuaGVscGVyLmFzc2VydFVuaXF1ZU9mZmVySWQoU3RyaW5nKG9mZmVyU3BlYy5pZCkpO1xuXG4gICAgICAgICAgYXdhaXQgbnVsbDtcblxuICAgICAgICAgIC8qKiBAdHlwZSB7VXNlclNlYXR9ICovXG4gICAgICAgICAgbGV0IHNlYXRSZWY7XG4gICAgICAgICAgbGV0IHdhdGNoZXI7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGludml0YXRpb25Gcm9tU3BlYyA9IG1ha2VJbnZpdGF0aW9uc0hlbHBlcihcbiAgICAgICAgICAgICAgem9lLFxuICAgICAgICAgICAgICBhZ29yaWNOYW1lcyxcbiAgICAgICAgICAgICAgaW52aXRhdGlvbkJyYW5kLFxuICAgICAgICAgICAgICBpbnZpdGF0aW9uUHVyc2UsXG4gICAgICAgICAgICAgIHN0YXRlLm9mZmVyVG9JbnZpdGF0aW9uTWFrZXJzLmdldCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZhY2V0cy5oZWxwZXIubG9nV2FsbGV0SW5mbygnc3RhcnRpbmcgZXhlY3V0ZU9mZmVyJywgb2ZmZXJTcGVjLmlkKTtcblxuICAgICAgICAgICAgLyogMS4gUHJlcGFyZSB2YWx1ZXMgYW5kIHZhbGlkYXRlIHN5bmNocm9ub3VzbHkuKi9cbiAgICAgICAgICAgIGNvbnN0IHsgcHJvcG9zYWwgfSA9IG9mZmVyU3BlYztcblxuICAgICAgICAgICAgY29uc3QgaW52aXRhdGlvbiA9IGludml0YXRpb25Gcm9tU3BlYyhvZmZlclNwZWMuaW52aXRhdGlvblNwZWMpO1xuXG4gICAgICAgICAgICBjb25zdCBpbnZpdGF0aW9uQW1vdW50ID1cbiAgICAgICAgICAgICAgYXdhaXQgRShpbnZpdGF0aW9uSXNzdWVyKS5nZXRBbW91bnRPZihpbnZpdGF0aW9uKTtcblxuICAgICAgICAgICAgLyogMi4gQmVnaW4gZXhlY3V0aW5nIG9mZmVyKi9cbiAgICAgICAgICAgIC8qIE5vIGV4cGxpY2l0IHNpZ25hbCB0byB1c2VyIHRoYXQgd2UgcmVhY2hlZCBoZXJlIGJ1dCBpZiBhbnl0aGluZyBhYm92ZSovXG4gICAgICAgICAgICAvKiBmYWlsZWQgdGhleSdkIGdldCBhbiAnZXJyb3InIHN0YXR1cyB1cGRhdGUuKi9cblxuICAgICAgICAgICAgY29uc3Qgd2l0aGRyYXduUGF5bWVudHMgPVxuICAgICAgICAgICAgICBwcm9wb3NhbD8uZ2l2ZSAmJlxuICAgICAgICAgICAgICAoYXdhaXQgZGVlcGx5RnVsZmlsbGVkT2JqZWN0KFxuICAgICAgICAgICAgICAgIGZhY2V0cy5wYXltZW50cy53aXRoZHJhd0dpdmUocHJvcG9zYWwuZ2l2ZSwgb2ZmZXJTcGVjLmlkKSxcbiAgICAgICAgICAgICAgKSk7XG5cbiAgICAgICAgICAgIHNlYXRSZWYgPSBhd2FpdCBFKHpvZSkub2ZmZXIoXG4gICAgICAgICAgICAgIGludml0YXRpb24sXG4gICAgICAgICAgICAgIHByb3Bvc2FsLFxuICAgICAgICAgICAgICB3aXRoZHJhd25QYXltZW50cyxcbiAgICAgICAgICAgICAgb2ZmZXJTcGVjLm9mZmVyQXJncyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmYWNldHMuaGVscGVyLmxvZ1dhbGxldEluZm8ob2ZmZXJTcGVjLmlkLCAnc2VhdGVkJyk7XG5cbiAgICAgICAgICAgIHdhdGNoZXIgPSBtYWtlT2ZmZXJXYXRjaGVyKFxuICAgICAgICAgICAgICBmYWNldHMuaGVscGVyLFxuICAgICAgICAgICAgICBmYWNldHMuZGVwb3NpdCxcbiAgICAgICAgICAgICAgb2ZmZXJTcGVjLFxuICAgICAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgICAgICBpbnZpdGF0aW9uQW1vdW50LFxuICAgICAgICAgICAgICBzZWF0UmVmLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgc3RhdGUubGl2ZU9mZmVycy5pbml0KG9mZmVyU3BlYy5pZCwgb2ZmZXJTcGVjKTtcbiAgICAgICAgICAgIHN0YXRlLmxpdmVPZmZlclNlYXRzLmluaXQob2ZmZXJTcGVjLmlkLCBzZWF0UmVmKTtcblxuICAgICAgICAgICAgLyogcHVibGlzaCB0aGUgbGl2ZSBvZmZlcnMqL1xuICAgICAgICAgICAgZmFjZXRzLmhlbHBlci5wdWJsaXNoQ3VycmVudFN0YXRlKCk7XG5cbiAgICAgICAgICAgIC8qIGF3YWl0IHNvIHRoYXQgYW55IGVycm9ycyBhcmUgY2F1Z2h0IGFuZCBoYW5kbGVkIGJlbG93Ki9cbiAgICAgICAgICAgIGF3YWl0IHdhdGNoT2ZmZXJPdXRjb21lcyh3YXRjaGVyLCBzZWF0UmVmKTtcbiAgICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICAgIC8qIFRoaXMgYmxvY2sgb25seSBydW5zIGlmIHRoZSBibG9jayBhYm92ZSBmYWlscyBkdXJpbmcgb25lIHZhdCBpbmNhcm5hdGlvbi4qL1xuICAgICAgICAgICAgZmFjZXRzLmhlbHBlci5sb2dXYWxsZXRFcnJvcignSU1NRURJQVRFIE9GRkVSIEVSUk9SOicsIHJlYXNvbik7XG5cbiAgICAgICAgICAgIC8qIFVwZGF0ZSBzdGF0dXMgdG8gb2JzZXJ2ZXJzKi9cbiAgICAgICAgICAgIGlmIChpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKHJlYXNvbikpIHtcbiAgICAgICAgICAgICAgLyogVGhlIG9mZmVyIHdhdGNoZXJzIHdpbGwgcmVjb25uZWN0LiBEb24ndCByZWNsYWltIG9yIGV4aXQqL1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdhdGNoZXIpIHtcbiAgICAgICAgICAgICAgLyogVGhlIHdhdGNoZXIncyBvblJlamVjdGVkIHdpbGwgdXBkYXRlU3RhdHVzKCkqL1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZmFjZXRzLmhlbHBlci51cGRhdGVTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGVycm9yOiByZWFzb24udG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAuLi5vZmZlclNwZWMsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBCYWNrc3RvcCByZWNvdmVyeSwgaW4gY2FzZSBzb21ldGhpbmcgdmVyeSBiYXNpYyBmYWlscy4qL1xuICAgICAgICAgICAgaWYgKG9mZmVyU3BlYz8ucHJvcG9zYWw/LmdpdmUpIHtcbiAgICAgICAgICAgICAgZmFjZXRzLnBheW1lbnRzXG4gICAgICAgICAgICAgICAgLnRyeVJlY2xhaW1pbmdXaXRoZHJhd25QYXltZW50cyhvZmZlclNwZWMuaWQpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGUgPT5cbiAgICAgICAgICAgICAgICAgIGZhY2V0cy5oZWxwZXIubG9nV2FsbGV0RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICdyZWNvdmVyeSBmYWlsZWQgcmVjbGFpbWluZyBwYXltZW50cycsXG4gICAgICAgICAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFhYWCB0ZXN0cyByZWx5IG9uIHRocm93aW5nIGltbWVkaWF0ZSBlcnJvcnMsIG5vdCBjb3ZlcmluZyB0aGUqL1xuICAgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgaW4gdGhlIGV2ZW50IHRoZSBmYWlsdXJlIGlzIGFmdGVyIGFuIHVwZ3JhZGUqL1xuICAgICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gKiBUYWtlIGFuIG9mZmVyJ3MgaWQsIGxvb2sgdXAgaXRzIHNlYXQsIHRyeSB0byBleGl0LlxuICpcbiAqIEBwYXJhbSB7T2ZmZXJJZH0gb2ZmZXJJZFxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKiBAdGhyb3dzIGlmIHRoZSBzZWF0IGNhbid0IGJlIGZvdW5kIG9yIEUoc2VhdFJlZikudHJ5RXhpdCgpIGZhaWxzLlxuICovXG4gICAgICAgIGFzeW5jIHRyeUV4aXRPZmZlcihvZmZlcklkKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgYW10cyA9IGF3YWl0IGZhY2V0cy5wYXltZW50c1xuICAgICAgICAgICAgLnRyeVJlY2xhaW1pbmdXaXRoZHJhd25QYXltZW50cyhvZmZlcklkKVxuICAgICAgICAgICAgLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICBmYWNldHMuaGVscGVyLmxvZ1dhbGxldEVycm9yKFxuICAgICAgICAgICAgICAgICdyZWNvdmVyeSBmYWlsZWQgcmVjbGFpbWluZyBwYXltZW50cycsXG4gICAgICAgICAgICAgICAgZSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGFtdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmFjZXRzLmhlbHBlci5sb2dXYWxsZXRJbmZvKCdyZWNsYWltZWQnLCBhbXRzLCAnZnJvbScsIG9mZmVySWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzZWF0UmVmID0gdGhpcy5zdGF0ZS5saXZlT2ZmZXJTZWF0cy5nZXQob2ZmZXJJZCk7XG4gICAgICAgICAgYXdhaXQgRShzZWF0UmVmKS50cnlFeGl0KCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBpbnZva2U6IHtcbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge0ludm9rZUVudHJ5TWVzc2FnZX0gbWVzc2FnZVxuICovXG4gICAgICAgIGludm9rZUVudHJ5KG1lc3NhZ2UpIHtcbiAgICAgICAgICB0cmFjZSgnaW52b2tlRW50cnknLCBtZXNzYWdlKTtcbiAgICAgICAgICBjb25zdCB7IHJlc3VsdFN0ZXBXYXRjaGVyLCBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuXG4gICAgICAgICAgY29uc3QgeyB0YXJnZXROYW1lOiBuYW1lLCBtZXRob2QsIGFyZ3MsIHNhdmVSZXN1bHQsIGlkIH0gPSBtZXNzYWdlO1xuICAgICAgICAgIC8qIEZyb20gaGVyZSBvbiB3ZSBjYW4gcmVwb3J0IHN0YXR1cyByZWNvcmRzIHJlbGF0ZWQgdG8gdGhlIGlkKi9cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbXlTdG9yZSA9IGhlbHBlci5nZXRNeVN0b3JlKCk7XG4gICAgICAgICAgICBteVN0b3JlLmhhcyhuYW1lKSB8fCBGYWlsYGNhbm5vdCBpbnZva2UgJHtxKG5hbWUpfTogbm8gc3VjaCBpdGVtYDtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbXlTdG9yZS5nZXQobmFtZSk7XG4gICAgICAgICAgICB0cmFjZSgnZW50cnknLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICB0cmFjZSgnaW52b2tlJywgdmFsdWUsICcuJywgbWV0aG9kLCAnKCcsIGFyZ3MsICcpJyk7XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyB1cGRhdGVSZWNvcmRlcktpdCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICAgICAgdm9pZCB1cGRhdGVSZWNvcmRlcktpdC5yZWNvcmRlci53cml0ZSh7XG4gICAgICAgICAgICAgICAgdXBkYXRlZDogJ2ludm9jYXRpb24nLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNhbGxQID0gRSh2YWx1ZSlbbWV0aG9kXSguLi5hcmdzKTtcbiAgICAgICAgICAgIGlmIChpZCB8fCBzYXZlUmVzdWx0KSB7XG4gICAgICAgICAgICAgIHZvd1Rvb2xzLndhdGNoKGNhbGxQLCByZXN1bHRTdGVwV2F0Y2hlciwgeyBpZCwgc2F2ZVJlc3VsdCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZvaWQgY2FsbFA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyB1cGRhdGVSZWNvcmRlcktpdCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICAgICAgdm9pZCB1cGRhdGVSZWNvcmRlcktpdC5yZWNvcmRlci53cml0ZSh7XG4gICAgICAgICAgICAgICAgdXBkYXRlZDogJ2ludm9jYXRpb24nLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBTdHJpbmcocmVhc29uKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIC8qIGhhbmRsZUJyaWRnZUFjdGlvbiByZWNvcmRzIHN5bmMgZXJyb3Igc28gcmV0dXJuIGEgcmVqZWN0ZWQqL1xuICAgICAgICAgICAgICAvKiBQcm9taXNlIHRvIGF2b2lkIG92ZXJyaWRpbmcgb3VyIHVwZGF0ZSwgYnV0IHN0aWxsIHJlcG9ydCBhbiovXG4gICAgICAgICAgICAgIC8qIGVycm9yIHRvIGFueSB0ZXN0IGNhbGxlciBvZiBgaGFuZGxlQnJpZGdlQWN0aW9uYCovXG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLyogV2UgY291bGQnZCByZXBvcnQgdGhlIGZhaWx1cmUsIHNvIGxldCBgaGFuZGxlQnJpZGdlQWN0aW9uYCBkbyovXG4gICAgICAgICAgICAgIC8qIHNvbWUgYmVzdCBlZmZvcnQgcmVwb3J0aW5nKi9cbiAgICAgICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHJlc3VsdFN0ZXBXYXRjaGVyOiB7XG4gICAgICAgIC8qKlxuICogQHBhcmFtIHt1bmtub3dufSByZXN1bHRcbiAqIEBwYXJhbSB7eyBpZD86IHN0cmluZyB8IG51bWJlcjsgc2F2ZVJlc3VsdD86IFJlc3VsdFBsYW4gfX0gb3B0c1xuICovXG4gICAgICAgIG9uRnVsZmlsbGVkKHJlc3VsdCwgb3B0cykge1xuICAgICAgICAgIHRyYWNlKCdyZXN1bHRTdGVwV2F0Y2hlciBvcHRzJywgb3B0cyk7XG4gICAgICAgICAgY29uc3QgeyBpZCwgc2F2ZVJlc3VsdCB9ID0gb3B0cztcbiAgICAgICAgICBpZiAoc2F2ZVJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5mYWNldHMuaGVscGVyLnNhdmVFbnRyeShzYXZlUmVzdWx0LCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZXN1bHQpO1xuICAgICAgICAgIGNvbnN0IHsgdXBkYXRlUmVjb3JkZXJLaXQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICB2b2lkIHVwZGF0ZVJlY29yZGVyS2l0LnJlY29yZGVyLndyaXRlKHtcbiAgICAgICAgICAgICAgdXBkYXRlZDogJ2ludm9jYXRpb24nLFxuICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgLi4uKHNhdmVSZXN1bHQ/Lm5hbWUgPyB7IG5hbWU6IHNhdmVSZXN1bHQubmFtZSB9IDoge30pLFxuICAgICAgICAgICAgICAgIHBhc3NTdHlsZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHJlYXNvblxuICogQHBhcmFtIHt7IGlkOiBzdHJpbmcgfCBudW1iZXI7IHNhdmVSZXN1bHQ/OiBSZXN1bHRQbGFuIH19IG9wdHNcbiAqL1xuICAgICAgICBvblJlamVjdGVkKHJlYXNvbiwgb3B0cykge1xuICAgICAgICAgIHRyYWNlKCdyZWplY3RlZCcsIHJlYXNvbiwgb3B0cyk7XG4gICAgICAgICAgaWYgKG9wdHMuaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlUmVjb3JkZXJLaXQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgICB2b2lkIHVwZGF0ZVJlY29yZGVyS2l0LnJlY29yZGVyLndyaXRlKHtcbiAgICAgICAgICAgICAgdXBkYXRlZDogJ2ludm9jYXRpb24nLFxuICAgICAgICAgICAgICBpZDogb3B0cy5pZCxcbiAgICAgICAgICAgICAgZXJyb3I6IFN0cmluZyhyZWFzb24pLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgc2VsZjoge1xuICAgICAgICAvKipcbiAqIFVtYXJzaGFscyB0aGUgYWN0aW9uQ2FwRGF0YSBhbmQgZGVsZWdhdGVzIHRvIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb25cbiAqIGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHtDYXBEYXRhPHN0cmluZyB8IG51bGw+fSBhY3Rpb25DYXBEYXRhIG9mIHR5cGUgQnJpZGdlQWN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjYW5TcGVuZF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICAgIGhhbmRsZUJyaWRnZUFjdGlvbihhY3Rpb25DYXBEYXRhLCBjYW5TcGVuZCA9IGZhbHNlKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBvZmZlcnMsIGludm9rZSB9ID0gZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IHsgcHVibGljTWFyc2hhbGxlciB9ID0gc2hhcmVkO1xuXG4gICAgICAgICAgLyoqIEBwYXJhbSB7RXJyb3J9IGVyciAqL1xuICAgICAgICAgIGNvbnN0IHJlY29yZEVycm9yID0gZXJyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlUmVjb3JkZXJLaXQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgICBmYWNldHMuaGVscGVyLmxvZ1dhbGxldEVycm9yKCdoYW5kbGVCcmlkZ2VBY3Rpb24gZXJyb3I6JywgZXJyKTtcbiAgICAgICAgICAgIHZvaWQgdXBkYXRlUmVjb3JkZXJLaXQucmVjb3JkZXIud3JpdGUoe1xuICAgICAgICAgICAgICB1cGRhdGVkOiAnd2FsbGV0QWN0aW9uJyxcbiAgICAgICAgICAgICAgc3RhdHVzOiB7IGVycm9yOiBlcnIubWVzc2FnZSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8qIHVzZSBFLndoZW4gdG8gcmV0YWluIGRpc3RyaWJ1dGVkIHN0YWNrIHRyYWNlKi9cbiAgICAgICAgICByZXR1cm4gRS53aGVuKFxuICAgICAgICAgICAgRShwdWJsaWNNYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShhY3Rpb25DYXBEYXRhKSxcbiAgICAgICAgICAgIC8qKiBAcGFyYW0ge0JyaWRnZUFjdGlvbn0gYWN0aW9uICovXG4gICAgICAgICAgICBhY3Rpb24gPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgY2FzZSAnZXhlY3V0ZU9mZmVyJzoge1xuICAgICAgICAgICAgICAgICAgICBjYW5TcGVuZCB8fCBGYWlsYGV4ZWN1dGVPZmZlciByZXF1aXJlcyBzcGVuZCBhdXRob3JpdHlgO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZlcnMuZXhlY3V0ZU9mZmVyKGFjdGlvbi5vZmZlcik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlICd0cnlFeGl0T2ZmZXInOiB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydChjYW5TcGVuZCwgJ3RyeUV4aXRPZmZlciByZXF1aXJlcyBzcGVuZCBhdXRob3JpdHknKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZmVycy50cnlFeGl0T2ZmZXIoYWN0aW9uLm9mZmVySWQpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAnaW52b2tlRW50cnknOiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnZva2UuaW52b2tlRW50cnkoYWN0aW9uLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgaGFuZGxlIGJyaWRnZSBhY3Rpb24gJHtxKGFjdGlvbil9YDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8qIHJlY29yZCBzeW5jaHJvbm91cyBlcnJvciBpbiB0aGUgYWN0aW9uIGRlbGVnYXRvciBhYm92ZSovXG4gICAgICAgICAgICAgICAgLyogYnV0IGxlYXZlIGFzeW5jIHJlamVjdGlvbnMgYWxvbmUgYmVjYXVzZSB0aGUgb2ZmZXIgaGFuZGxlciByZWNvcmRlZCB0aGVtKi9cbiAgICAgICAgICAgICAgICAvKiB3aXRoIGdyZWF0ZXIgZGV0YWlsKi9cbiAgICAgICAgICAgICAgICByZWNvcmRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKiByZWNvcmQgZXJyb3JzIGluIHRoZSB1bnNlcmlhbGl6ZSBhbmQgbGVhdmUgdGhlIHJlamVjdGlvbiBoYW5kbGVkKi9cbiAgICAgICAgICAgIHJlY29yZEVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldERlcG9zaXRGYWNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0SW52b2tlRmFjZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLmludm9rZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T2ZmZXJzRmFjZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLm9mZmVycztcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIHVzZSBnZXRQdWJsaWNUb3BpY3MgKi9cbiAgICAgICAgZ2V0Q3VycmVudFN1YnNjcmliZXIoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gc3RhdGUuY3VycmVudFJlY29yZGVyS2l0LnN1YnNjcmliZXI7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UHVibGljVG9waWNzICovXG4gICAgICAgIGdldFVwZGF0ZXNTdWJzY3JpYmVyKCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlLnVwZGF0ZVJlY29yZGVyS2l0LnN1YnNjcmliZXI7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFB1YmxpY1RvcGljcygpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgY3VycmVudFJlY29yZGVyS2l0LCB1cGRhdGVSZWNvcmRlcktpdCB9ID0gc3RhdGU7XG5cbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdDdXJyZW50IHN0YXRlIG9mIHdhbGxldCcsXG4gICAgICAgICAgICAgIHN1YnNjcmliZXI6IGN1cnJlbnRSZWNvcmRlcktpdC5zdWJzY3JpYmVyLFxuICAgICAgICAgICAgICBzdG9yYWdlUGF0aDogY3VycmVudFJlY29yZGVyS2l0LnJlY29yZGVyLmdldFN0b3JhZ2VQYXRoKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlczoge1xuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0NoYW5nZXMgdG8gd2FsbGV0JyxcbiAgICAgICAgICAgICAgc3Vic2NyaWJlcjogdXBkYXRlUmVjb3JkZXJLaXQuc3Vic2NyaWJlcixcbiAgICAgICAgICAgICAgc3RvcmFnZVBhdGg6IHVwZGF0ZVJlY29yZGVyS2l0LnJlY29yZGVyLmdldFN0b3JhZ2VQYXRoKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpbmlzaDogKHsgc3RhdGUsIGZhY2V0cyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW52aXRhdGlvblB1cnNlIH0gPSBzdGF0ZTtcbiAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IGZhY2V0cztcblxuICAgICAgICB2b2lkIGhlbHBlci53YXRjaFB1cnNlKGludml0YXRpb25QdXJzZSk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge09taXQ8XG4gKiAgIFVuaXF1ZVBhcmFtcyxcbiAqICAgJ2N1cnJlbnRTdG9yYWdlTm9kZScgfCAnd2FsbGV0U3RvcmFnZU5vZGUnXG4gKiA+ICYge1xuICogICB3YWxsZXRTdG9yYWdlTm9kZTogRVJlbW90ZTxTdG9yYWdlTm9kZT47XG4gKiB9fSB1bmlxdWVXaXRob3V0Q2hpbGROb2Rlc1xuICovXG4gIGNvbnN0IG1ha2VTbWFydFdhbGxldCA9IGFzeW5jIHVuaXF1ZVdpdGhvdXRDaGlsZE5vZGVzID0+IHtcbiAgICBjb25zdCBbd2FsbGV0U3RvcmFnZU5vZGUsIGN1cnJlbnRTdG9yYWdlTm9kZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB1bmlxdWVXaXRob3V0Q2hpbGROb2Rlcy53YWxsZXRTdG9yYWdlTm9kZSxcbiAgICAgIEUodW5pcXVlV2l0aG91dENoaWxkTm9kZXMud2FsbGV0U3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoJ2N1cnJlbnQnKSxcbiAgICBdKTtcblxuICAgIHJldHVybiBtYWtlV2FsbGV0V2l0aFJlc29sdmVkU3RvcmFnZU5vZGVzKFxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgLi4udW5pcXVlV2l0aG91dENoaWxkTm9kZXMsXG4gICAgICAgIGN1cnJlbnRTdG9yYWdlTm9kZSxcbiAgICAgICAgd2FsbGV0U3RvcmFnZU5vZGUsXG4gICAgICB9KSxcbiAgICApLnNlbGY7XG4gIH07XG4gIHJldHVybiBtYWtlU21hcnRXYWxsZXQ7XG59OyRozY9fb25jZS5wcmVwYXJlU21hcnRXYWxsZXQocHJlcGFyZVNtYXJ0V2FsbGV0KTtcbmhhcmRlbihwcmVwYXJlU21hcnRXYWxsZXQpO1xuLyoqIEB0eXBlZGVmIHtFUmV0dXJuPEVSZXR1cm48dHlwZW9mIHByZXBhcmVTbWFydFdhbGxldD4+fSBTbWFydFdhbGxldCAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiRVhJU1RJTkdfV0FMTEVUX01ZX1NUT1JFU19LRVkiOlsiRVhJU1RJTkdfV0FMTEVUX01ZX1NUT1JFU19LRVkiXSwiQlJBTkRfVE9fUFVSU0VTX0tFWSI6WyJCUkFORF9UT19QVVJTRVNfS0VZIl0sInByZXBhcmVTbWFydFdhbGxldCI6WyJwcmVwYXJlU21hcnRXYWxsZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIbk3A80MAADNDAAALQAAAEBhZ29yaWMvc21hcnQtd2FsbGV0LXYwLjUuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJzaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sSW5zdGFuY2VIYW5kbGVTaGFwZSxQcm9wb3NhbFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiSW5zdGFuY2VIYW5kbGVTaGFwZVwiLFskaM2PX2EgPT4gKEluc3RhbmNlSGFuZGxlU2hhcGUgPSAkaM2PX2EpXV0sW1wiUHJvcG9zYWxTaGFwZVwiLFskaM2PX2EgPT4gKFByb3Bvc2FsU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7VHlwZWRQYXR0ZXJufSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0ludm9rZUVudHJ5TWVzc2FnZSwgUmVzdWx0UGxhbn0gZnJvbSAnLi9vZmZlcnMuanMnO1xuICovXG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFJlc3VsdFBsYW4+fSAqL1xuY29uc3QgUmVzdWx0UGxhblNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAgeyBuYW1lOiBNLnN0cmluZygpIH0sXG4gIHsgb3ZlcndyaXRlOiBNLmJvb2xlYW4oKSB9LFxuICB7fSxcbik7XG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxJbnZva2VFbnRyeU1lc3NhZ2U+fSAqL1xuY29uc3QgSW52b2tlRW50cnlNZXNzYWdlU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAgdGFyZ2V0TmFtZTogTS5zdHJpbmcoKSxcbiAgICBtZXRob2Q6IE0uc3RyaW5nKCksXG4gICAgYXJnczogTS5hcnJheSgpLFxuICB9LFxuICB7IHNhdmVSZXN1bHQ6IFJlc3VsdFBsYW5TaGFwZSwgaWQ6IE0ub3IoTS5udW1iZXIoKSwgTS5zdHJpbmcoKSkgfSxcbiAge30sXG4pO1xuXG4gICAgICAgY29uc3Qgc2hhcGUgPSB7XG4gIC8qIHNtYXJ0V2FsbGV0Ki9cbiAgU3RyaW5nQ2FwRGF0YToge1xuICAgIGJvZHk6IE0uc3RyaW5nKCksXG4gICAgc2xvdHM6IE0uYXJyYXlPZihNLnN0cmluZygpKSxcbiAgfSxcblxuICAvKiBpbnZpdGF0aW9ucyovXG4gIEFnb3JpY0NvbnRyYWN0SW52aXRhdGlvblNwZWM6IHtcbiAgICBzb3VyY2U6ICdhZ29yaWNDb250cmFjdCcsXG4gICAgaW5zdGFuY2VQYXRoOiBNLmFycmF5T2YoTS5zdHJpbmcoKSksXG4gICAgY2FsbFBpcGU6IE0uYXJyYXlPZihNLnNwbGl0QXJyYXkoW00uc3RyaW5nKCldLCBbTS5hcnJheU9mKE0uYW55KCkpXSkpLFxuICB9LFxuICBDb250cmFjdEludml0YXRpb25TcGVjOiBNLnNwbGl0UmVjb3JkKFxuICAgIHtcbiAgICAgIHNvdXJjZTogJ2NvbnRyYWN0JyxcbiAgICAgIGluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxuICAgICAgcHVibGljSW52aXRhdGlvbk1ha2VyOiBNLnN0cmluZygpLFxuICAgIH0sXG4gICAge1xuICAgICAgaW52aXRhdGlvbkFyZ3M6IE0uYXJyYXkoKSxcbiAgICB9LFxuICApLFxuICBDb250aW51aW5nSW52aXRhdGlvblNwZWM6IE0uc3BsaXRSZWNvcmQoXG4gICAge1xuICAgICAgc291cmNlOiAnY29udGludWluZycsXG4gICAgICBwcmV2aW91c09mZmVyOiBNLm9yKE0ubnVtYmVyKCksIE0uc3RyaW5nKCkpLFxuICAgICAgaW52aXRhdGlvbk1ha2VyTmFtZTogTS5zdHJpbmcoKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGludml0YXRpb25BcmdzOiBNLmFycmF5KCksXG4gICAgfSxcbiAgKSxcbiAgUHVyc2VJbnZpdGF0aW9uU3BlYzoge1xuICAgIHNvdXJjZTogJ3B1cnNlJyxcbiAgICBpbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbiAgICBkZXNjcmlwdGlvbjogTS5zdHJpbmcoKSxcbiAgfSxcblxuICAvKiBvZmZlcnMqL1xuICBPZmZlclNwZWM6IE0uc3BsaXRSZWNvcmQoXG4gICAge1xuICAgICAgaWQ6IE0ub3IoTS5udW1iZXIoKSwgTS5zdHJpbmcoKSksXG4gICAgICAvKiBUT0RPIE0udW5rbm93bigpIHRvIGRlZmVyIHZhbGlkYXRpb24qL1xuICAgICAgaW52aXRhdGlvblNwZWM6IE0uYW55KCksXG4gICAgICBwcm9wb3NhbDogUHJvcG9zYWxTaGFwZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG9mZmVyQXJnczogTS5hbnkoKSxcbiAgICAgIHNhdmVSZXN1bHQ6IFJlc3VsdFBsYW5TaGFwZSxcbiAgICB9LFxuICAgIHt9LFxuICApLFxuICBSZXN1bHRQbGFuOiBSZXN1bHRQbGFuU2hhcGUsXG4gIEludm9rZUVudHJ5TWVzc2FnZTogSW52b2tlRW50cnlNZXNzYWdlU2hhcGUsXG5cbiAgLyogd2FsbGV0RmFjdG9yeSovXG4gIC8qKlxuICogRGVmaW5lZCBieSB3YWxsZXRBY3Rpb24gc3RydWN0IGluIG1zZ19zZXJ2ZXIuZ29cbiAqXG4gKiBAc2VlIHdhbGxldEFjdGlvbiBpbiBtc2dfc2VydmVyLmdvXG4gKi9cbiAgV2FsbGV0QWN0aW9uTXNnOiBNLnNwbGl0UmVjb3JkKHtcbiAgICB0eXBlOiAnV0FMTEVUX0FDVElPTicsXG4gICAgYWN0aW9uOiBNLnN0cmluZygpLFxuXG4gICAgYmxvY2tIZWlnaHQ6IE0ubnVtYmVyKCksXG4gICAgYmxvY2tUaW1lOiBNLm51bWJlcigpLFxuICAgIG93bmVyOiBNLnN0cmluZygpLFxuICB9KSxcblxuICAvKipcbiAqIERlZmluZWQgYnkgd2FsbGV0QWN0aW9uIHN0cnVjdCBpbiBtc2dfc2VydmVyLmdvXG4gKlxuICogQHNlZSB3YWxsZXRTcGVuZEFjdGlvbiBpbiBtc2dfc2VydmVyLmdvXG4gKi9cbiAgV2FsbGV0U3BlbmRBY3Rpb25Nc2c6IE0uc3BsaXRSZWNvcmQoe1xuICAgIHR5cGU6ICdXQUxMRVRfU1BFTkRfQUNUSU9OJyxcbiAgICBzcGVuZEFjdGlvbjogTS5zdHJpbmcoKSxcblxuICAgIGJsb2NrSGVpZ2h0OiBNLm51bWJlcigpLFxuICAgIGJsb2NrVGltZTogTS5udW1iZXIoKSxcbiAgICBvd25lcjogTS5zdHJpbmcoKSxcbiAgfSksXG59OyRozY9fb25jZS5zaGFwZShzaGFwZSk7XG5zaGFwZS5XYWxsZXRCcmlkZ2VNc2cgPSBNLm9yKHNoYXBlLldhbGxldEFjdGlvbk1zZywgc2hhcGUuV2FsbGV0U3BlbmRBY3Rpb25Nc2cpO1xuaGFyZGVuKHNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNoYXBlIjpbInNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI/+FtDgFQAA4BUAACgAAABAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjMvc3JjL3V0aWxzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsiY29hbGVzY2VVcGRhdGVzIiwibWFrZVdhbGxldFN0YXRlQ29hbGVzY2VyIiwib2JqZWN0TWFwU3RvcmFnZVBhdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBkZWVwbHlGdWxmaWxsZWRPYmplY3QsbWFrZVRyYWNlcixvYmplY3RNYXAsb2JzZXJ2ZUl0ZXJhdGlvbixzdWJzY3JpYmVFYWNoLEU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRPYmplY3RcIixbJGjNj19hID0+IChkZWVwbHlGdWxmaWxsZWRPYmplY3QgPSAkaM2PX2EpXV0sW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV0sW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLFskaM2PX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaM2PX2EpXV0sW1wic3Vic2NyaWJlRWFjaFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogQGltcG9ydCB7T2ZmZXJJZCwgT2ZmZXJTdGF0dXN9IGZyb20gJy4vb2ZmZXJzLmpzJztcbiAqIEBpbXBvcnQge1VwZGF0ZVJlY29yZH0gZnJvbSAnLi9zbWFydFdhbGxldC5qcyc7XG4gKiBAaW1wb3J0IHtTdWJzY3JpYmVyfSBmcm9tICdAYWdvcmljL25vdGlmaWVyJztcbiAqIEBpbXBvcnQge1B1YmxpY1N1YnNjcmliZXJzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1RvcGljc1JlY29yZH0gZnJvbSAnQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyc7XG4gKiBAaW1wb3J0IHtJbnN0YW5jZX0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7QnJhbmR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtBbW91bnR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdXVVRJTCcsIGZhbHNlKTtcblxuLyoqIEBwYXJhbSB7QnJhbmQ8J3NldCc+fSBbaW52aXRhdGlvbkJyYW5kXSAqL1xuY29uc3QgbWFrZUNvYWxlc2NlciA9IChpbnZpdGF0aW9uQnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgLyoqIEB0eXBlIHtNYXA8T2ZmZXJJZCwgT2ZmZXJTdGF0dXM+fSAqL1xuICBjb25zdCBvZmZlclN0YXR1c2VzID0gbmV3IE1hcCgpO1xuICAvKiogQHR5cGUge01hcDxCcmFuZCwgQW1vdW50Pn0gKi9cbiAgY29uc3QgYmFsYW5jZXMgPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gKiBrZXllZCBieSBkZXNjcmlwdGlvbjsgeHh4IGFzc3VtZXMgdW5pcXVlXG4gKlxuICogQHR5cGUge01hcDxcbiAqICAgc3RyaW5nLFxuICogICB7XG4gKiAgICAgYWNjZXB0ZWRJbj86IE9mZmVySWQ7XG4gKiAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAqICAgICBpbnN0YW5jZTogSW5zdGFuY2U7XG4gKiAgIH1cbiAqID59XG4gKi9cbiAgY29uc3QgaW52aXRhdGlvbnNSZWNlaXZlZCA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAqIEBwYXJhbSB7VXBkYXRlUmVjb3JkIHwge319IHVwZGF0ZVJlY29yZCBuZXdlciB0aGFuIHByZXZpb3VzXG4gKi9cbiAgY29uc3QgdXBkYXRlID0gdXBkYXRlUmVjb3JkID0+IHtcbiAgICBpZiAoISgndXBkYXRlZCcgaW4gdXBkYXRlUmVjb3JkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHVwZGF0ZWQgfSA9IHVwZGF0ZVJlY29yZDtcbiAgICBzd2l0Y2ggKHVwZGF0ZVJlY29yZC51cGRhdGVkKSB7XG4gICAgICBjYXNlICdiYWxhbmNlJzoge1xuICAgICAgICBjb25zdCB7IGN1cnJlbnRBbW91bnQgfSA9IHVwZGF0ZVJlY29yZDtcbiAgICAgICAgLyogbGFzdCByZWNvcmQgd2lucyovXG4gICAgICAgIGJhbGFuY2VzLnNldChjdXJyZW50QW1vdW50LmJyYW5kLCBjdXJyZW50QW1vdW50KTtcbiAgICAgICAgaWYgKCFpbnZpdGF0aW9uQnJhbmQpIHtcbiAgICAgICAgICB0cmFjZShcbiAgICAgICAgICAgICdiYWxhbmNlIHVwZGF0ZSB3aXRob3V0IGludml0YXRpb25CcmFuZCBrbm93biBtYXkgYmUgYW4gaW52aXRhdGlvbicsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudEFtb3VudC5icmFuZCA9PT0gaW52aXRhdGlvbkJyYW5kKSB7XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3cgdG8gU2V0VmFsdWUqL1xuICAgICAgICAgIGZvciAoY29uc3QgaW52aXRhdGlvbiBvZiBjdXJyZW50QW1vdW50LnZhbHVlKSB7XG4gICAgICAgICAgICBpbnZpdGF0aW9uc1JlY2VpdmVkLnNldChpbnZpdGF0aW9uLmRlc2NyaXB0aW9uLCBpbnZpdGF0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdvZmZlclN0YXR1cyc6IHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMgfSA9IHVwZGF0ZVJlY29yZDtcbiAgICAgICAgY29uc3QgbGFzdFN0YXR1cyA9IG9mZmVyU3RhdHVzZXMuZ2V0KHN0YXR1cy5pZCk7XG4gICAgICAgIC8qIG1lcmdlIHJlY29yZHMqL1xuICAgICAgICBvZmZlclN0YXR1c2VzLnNldChzdGF0dXMuaWQsIHsgLi4ubGFzdFN0YXR1cywgLi4uc3RhdHVzIH0pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3RhdHVzLmludml0YXRpb25TcGVjLnNvdXJjZSA9PT0gJ3B1cnNlJyAmJlxuICAgICAgICAgIHN0YXR1cy5udW1XYW50c1NhdGlzZmllZCA9PT0gMVxuICAgICAgICApIHtcbiAgICAgICAgICAvKiByZWNvcmQgYWNjZXB0YW5jZSBvZiBpbnZpdGF0aW9uKi9cbiAgICAgICAgICAvKiB4eHggbWF0Y2hpbmcgb25seSBieSBkZXNjcmlwdGlvbiovXG4gICAgICAgICAgY29uc3QgeyBkZXNjcmlwdGlvbiB9ID0gc3RhdHVzLmludml0YXRpb25TcGVjO1xuICAgICAgICAgIGNvbnN0IHJlY2VwdGlvblJlY29yZCA9IGludml0YXRpb25zUmVjZWl2ZWQuZ2V0KGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICBpZiAocmVjZXB0aW9uUmVjb3JkKSB7XG4gICAgICAgICAgICBpbnZpdGF0aW9uc1JlY2VpdmVkLnNldChkZXNjcmlwdGlvbiwge1xuICAgICAgICAgICAgICAuLi5yZWNlcHRpb25SZWNvcmQsXG4gICAgICAgICAgICAgIGFjY2VwdGVkSW46IHN0YXR1cy5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmFjZSgnbm8gcmVjb3JkIG9mIGludml0YXRpb24gaW4gb2ZmZXJTdGF0dXMnLCBzdGF0dXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgYmFja3dhcmRzIGNvbXBhdGliaWxlKi9cbiAgICAgIGNhc2UgJ2JyYW5kJzoge1xuICAgICAgICB0cmFjZSgnb2Jzb2xldGUgYnJhbmQgdXBkYXRlIHJlY29yZCAtIGlnbm9yaW5nJywgdXBkYXRlUmVjb3JkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBFcnJvcihgdW5rbm93biByZWNvcmQgdXBkYXRlZCAke3VwZGF0ZWR9YCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgc3RhdGU6IHsgaW52aXRhdGlvbnNSZWNlaXZlZCwgb2ZmZXJTdGF0dXNlcywgYmFsYW5jZXMgfSxcbiAgICB1cGRhdGUsXG4gIH07XG59O1xuXG4vKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlIGV4cG9ydCB0aGUgc2FtZSBmdW5jdGlvbiB1bmRlciB0aGUgb2xkIG5hbWUuKi8kaM2PX29uY2UubWFrZUNvYWxlc2NlcihtYWtlQ29hbGVzY2VyKTtcblxuXG4vKipcbiAqIENvYWxlc2NlIHVwZGF0ZXMgZnJvbSBhIHdhbGxldCBVcGRhdGVSZWNvcmQgcHVibGljYXRpb24gZmVlZC4gTm90ZSB0aGF0IGxvY2FsXG4gKiBzdGF0ZSBtYXkgbm90IHJlZmxlY3QgdGhlIHdhbGxldCdzIHN0YXRlIGlmIHRoZSBpbml0aWFsIHVwZGF0ZXMgYXJlIG1pc3NlZC5cbiAqXG4gKiBJZiB0aGlzIHByb3ZlcyB0byBiZSBhIHByb2JsZW0gd2UgY2FuIGFkZCBhbiBvcHRpb24gdG8gdGhpcyBvciBhIHJlbGF0ZWRcbiAqIHV0aWxpdHkgdG8gcmVzZXQgc3RhdGUgZnJvbSBSUEMuXG4gKlxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VXBkYXRlUmVjb3JkPj59IHVwZGF0ZXNcbiAqIEBwYXJhbSB7QnJhbmQ8J3NldCc+fSBbaW52aXRhdGlvbkJyYW5kXVxuICovXG4gICAgICAgY29uc3QgY29hbGVzY2VVcGRhdGVzID0gKHVwZGF0ZXMsIGludml0YXRpb25CcmFuZCkgPT4ge1xuICBjb25zdCBjb2FsZXNjZXIgPSBtYWtlQ29hbGVzY2VyKGludml0YXRpb25CcmFuZCk7XG5cbiAgdm9pZCBvYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmliZUVhY2godXBkYXRlcyksIHtcbiAgICB1cGRhdGVTdGF0ZTogdXBkYXRlUmVjb3JkID0+IHtcbiAgICAgIGNvYWxlc2Nlci51cGRhdGUodXBkYXRlUmVjb3JkKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGNvYWxlc2Nlci5zdGF0ZTtcbn07XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgY2FzZSBvZiBmYWxzeSBhcmd1bWVudCBzbyB0aGUgY2FsbGVyIGNhbiBjb25zaXN0ZW50bHkgYXdhaXQuXG4gKlxuICogQHBhcmFtIHtQdWJsaWNTdWJzY3JpYmVycyB8IFRvcGljc1JlY29yZH0gW3N1YnNjcmliZXJzXVxuICogQHJldHVybnMge0VSZWY8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gfCBudWxsfVxuICovJGjNj19vbmNlLmNvYWxlc2NlVXBkYXRlcyhjb2FsZXNjZVVwZGF0ZXMpO1xuICAgICAgIGNvbnN0IG9iamVjdE1hcFN0b3JhZ2VQYXRoID0gc3Vic2NyaWJlcnMgPT4ge1xuICBpZiAoIXN1YnNjcmliZXJzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGRlZXBseUZ1bGZpbGxlZE9iamVjdChcbiAgICBvYmplY3RNYXAoc3Vic2NyaWJlcnMsIHN1YiA9PlxuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBiYWNrd2FyZHMgY29tcGF0Ki9cbiAgICAgICdzdWJzY3JpYmVyJyBpbiBzdWIgPyBzdWIuc3RvcmFnZVBhdGggOiBFKHN1YikuZ2V0UGF0aCgpLFxuICAgICksXG4gICk7XG59OyRozY9fb25jZS5vYmplY3RNYXBTdG9yYWdlUGF0aChvYmplY3RNYXBTdG9yYWdlUGF0aCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2FsbGV0U3RhdGVDb2FsZXNjZXIiOlsibWFrZUNvYWxlc2NlciJdLCJjb2FsZXNjZVVwZGF0ZXMiOlsiY29hbGVzY2VVcGRhdGVzIl0sIm9iamVjdE1hcFN0b3JhZ2VQYXRoIjpbIm9iamVjdE1hcFN0b3JhZ2VQYXRoIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGHtzu40NwAANDcAADAAAABAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjMvc3JjL3dhbGxldEZhY3RvcnkuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3N0b3JlL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC90ZXN0SmlnSGVscGVycy5qcyIsIkBlbmRvL2ZhciIsIi4vc21hcnRXYWxsZXQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJjdXN0b21UZXJtc1NoYXBlIiwibWFrZUFzc2V0UmVnaXN0cnkiLCJwcmVwYXJlIiwicHJpdmF0ZUFyZ3NTaGFwZSIsInB1Ymxpc2hEZXBvc2l0RmFjZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlVHJhY2VyLFdhbGxldE5hbWUsd3JhcFJlbW90ZU1hcnNoYWxsZXIsb2JzZXJ2ZUl0ZXJhdGlvbixzdWJzY3JpYmVFYWNoLE0sbWFrZUV4byxtYWtlU2NhbGFyTWFwU3RvcmUsbXVzdE1hdGNoLG1ha2VBdG9taWNQcm92aWRlcixwcmVwYXJlRXhvLHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUscHJvdmlkZUFsbCxtYWtlSmlnS2l0LEUscHJlcGFyZVNtYXJ0V2FsbGV0LHNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV0sW1wiV2FsbGV0TmFtZVwiLFskaM2PX2EgPT4gKFdhbGxldE5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qc1wiLCBbW1wid3JhcFJlbW90ZU1hcnNoYWxsZXJcIixbJGjNj19hID0+ICh3cmFwUmVtb3RlTWFyc2hhbGxlciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm9ic2VydmVJdGVyYXRpb25cIixbJGjNj19hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjNj19hKV1dLFtcInN1YnNjcmliZUVhY2hcIixbJGjNj19hID0+IChzdWJzY3JpYmVFYWNoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWFrZUV4b1wiLFskaM2PX2EgPT4gKG1ha2VFeG8gPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmUvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUF0b21pY1Byb3ZpZGVyXCIsWyRozY9fYSA9PiAobWFrZUF0b21pY1Byb3ZpZGVyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG8gPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVNYXBTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanNcIiwgW1tcInByb3ZpZGVBbGxcIixbJGjNj19hID0+IChwcm92aWRlQWxsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC90ZXN0SmlnSGVscGVycy5qc1wiLCBbW1wibWFrZUppZ0tpdFwiLFskaM2PX2EgPT4gKG1ha2VKaWdLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiLi9zbWFydFdhbGxldC5qc1wiLCBbW1wicHJlcGFyZVNtYXJ0V2FsbGV0XCIsWyRozY9fYSA9PiAocHJlcGFyZVNtYXJ0V2FsbGV0ID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJzaGFwZVwiLFskaM2PX2EgPT4gKHNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZW1vdGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7U3RvcmFnZU5vZGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICogQGltcG9ydCB7TWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge05hbWVIdWJ9IGZyb20gJ0BhZ29yaWMvdmF0cyc7XG4gKiBAaW1wb3J0IHtJdGVyYWJsZUVhY2hUb3BpY30gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtTbWFydFdhbGxldCwgU21hcnRXYWxsZXRUZXN0SmlnfSBmcm9tICcuL3NtYXJ0V2FsbGV0LmpzJztcbiAqIEBpbXBvcnQge05hbWVBZG1pbn0gZnJvbSAnQGFnb3JpYy92YXRzJztcbiAqIEBpbXBvcnQge1BldG5hbWV9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7Qm9hcmR9IGZyb20gJ0BhZ29yaWMvdmF0cyc7XG4gKiBAaW1wb3J0IHtBc3NldERlc2NyaXB0b3J9IGZyb20gJ0BhZ29yaWMvdmF0cy9zcmMvdmF0LWJhbmsuanMnO1xuICogQGltcG9ydCB7U2NvcGVkQnJpZGdlTWFuYWdlcn0gZnJvbSAnQGFnb3JpYy92YXRzJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnO1xuICogQGltcG9ydCB7V2FsbGV0QnJpZGdlTXNnfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0Jhbmt9IGZyb20gJ0BhZ29yaWMvdmF0cy9zcmMvdmF0LWJhbmsuanMnO1xuICogQGltcG9ydCB7VGVzdEppZ0tpdH0gZnJvbSAnQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC90ZXN0SmlnSGVscGVycy5qcyc7XG4gKiBAaW1wb3J0IHtaQ0Z9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqIEBpbXBvcnQge0JyYW5kfSBmcm9tICdAYWdvcmljL2VydHAnO1xuICogQGltcG9ydCB7RGlzcGxheUluZm99IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtJc3N1ZXJ9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdXbHRGY3QnKTtcblxuICAgICAgIGNvbnN0IGN1c3RvbVRlcm1zU2hhcGUgPSBoYXJkZW4oe1xuICBhZ29yaWNOYW1lczogTS5lcmVmKE0ucmVtb3RhYmxlKCdhZ29yaWNOYW1lcycpKSxcbiAgYm9hcmQ6IE0uZXJlZihNLnJlbW90YWJsZSgnYm9hcmQnKSksXG4gIGFzc2V0UHVibGlzaGVyOiBNLmVyZWYoTS5yZW1vdGFibGUoJ0JhbmsnKSksXG59KTskaM2PX29uY2UuY3VzdG9tVGVybXNTaGFwZShjdXN0b21UZXJtc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IHByaXZhdGVBcmdzU2hhcGUgPSBoYXJkZW4oXG4gIE0uc3BsaXRSZWNvcmQoXG4gICAgeyBzdG9yYWdlTm9kZTogTS5lcmVmKE0ucmVtb3RhYmxlKCdTdG9yYWdlTm9kZScpKSB9LFxuICAgIHsgd2FsbGV0QnJpZGdlTWFuYWdlcjogTS5lcmVmKE0ucmVtb3RhYmxlKCd3YWxsZXRCcmlkZ2VNYW5hZ2VyJykpIH0sXG4gICksXG4pOyRozY9fb25jZS5wcml2YXRlQXJnc1NoYXBlKHByaXZhdGVBcmdzU2hhcGUpO1xuXG5jb25zdCBXQUxMRVRTX0JZX0FERFJFU1MgPSAnd2FsbGV0c0J5QWRkcmVzcyc7XG5cbi8qKlxuICogUHJvdmlkZSBhIE5hbWVIdWIgZm9yIHRoaXMgYWRkcmVzcyBhbmQgaW5zZXJ0IGRlcG9zaXRGYWNldCBvbmx5IGlmIG5vdFxuICogYWxyZWFkeSBkb25lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG4gKiBAcGFyYW0ge1NtYXJ0V2FsbGV0fSB3YWxsZXRcbiAqIEBwYXJhbSB7RVJlZjxOYW1lQWRtaW4+fSBuYW1lc0J5QWRkcmVzc0FkbWluXG4gKi9cbiAgICAgICBjb25zdCBwdWJsaXNoRGVwb3NpdEZhY2V0ID0gYXN5bmMgKFxuICBhZGRyZXNzLFxuICB3YWxsZXQsXG4gIG5hbWVzQnlBZGRyZXNzQWRtaW4sXG4pID0+IHtcbiAgY29uc3QgeyBuYW1lQWRtaW46IG15QWRkcmVzc05hbWVBZG1pbiB9ID0gYXdhaXQgRShcbiAgICBuYW1lc0J5QWRkcmVzc0FkbWluLFxuICApLnByb3ZpZGVDaGlsZChhZGRyZXNzLCBbV2FsbGV0TmFtZS5kZXBvc2l0RmFjZXRdKTtcblxuICByZXR1cm4gRShteUFkZHJlc3NOYW1lQWRtaW4pLmRlZmF1bHQoXG4gICAgV2FsbGV0TmFtZS5kZXBvc2l0RmFjZXQsXG4gICAgd2FsbGV0LmdldERlcG9zaXRGYWNldCgpLFxuICApO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcmVnaXN0cnkgZm9yIHVzZSBieSB0aGUgd2FsbGV0IGluc3RhbmNlcy5cbiAqXG4gKiBUaGlzIGRvZXNuJ3QgbmVlZCB0byBwZXJzaXN0IGR1cmFibHkgYmVjYXVzZSB0aGUgYGFzc2V0UHVibGlzaGVyYCBoYXMgYVxuICogXCJwaW5uZWRcIiB0b3BpYyBhbmQgY2FsbCB0byBnZXRBc3NldFN1YnNjcmlwdGlvbiBnZXRzIGEgZnJlc2ggc3RyZWFtIG9mIGFsbFxuICogdGhlIGFzc2V0cyB0aGF0IGl0IGtub3dzIG9mLlxuICpcbiAqIEBwYXJhbSB7QXNzZXRQdWJsaXNoZXJ9IGFzc2V0UHVibGlzaGVyXG4gKi8kaM2PX29uY2UucHVibGlzaERlcG9zaXRGYWNldChwdWJsaXNoRGVwb3NpdEZhY2V0KTtcbiAgICAgICBjb25zdCBtYWtlQXNzZXRSZWdpc3RyeSA9IGFzc2V0UHVibGlzaGVyID0+IHtcbiAgdHJhY2UoJ21ha2VBc3NldFJlZ2lzdHJ5JywgYXNzZXRQdWJsaXNoZXIpO1xuICAvKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGJyYW5kOiBCcmFuZDtcbiAqICAgZGlzcGxheUluZm86IERpc3BsYXlJbmZvO1xuICogICBpc3N1ZXI6IElzc3VlcjtcbiAqICAgcGV0bmFtZTogUGV0bmFtZTtcbiAqIH19IEJyYW5kRGVzY3JpcHRvclxuICogICBGb3IgdXNlIGJ5IGNsaWVudHMgdG8gZGVzY3JpYmUgYnJhbmRzIHRvIHVzZXJzLiBJbmNsdWRlcyBgZGlzcGxheUluZm9gIHRvXG4gKiAgIHNhdmUgYSByZW1vdGUgY2FsbC5cbiAqL1xuICAvKiogQHR5cGUge01hcFN0b3JlPEJyYW5kLCBCcmFuZERlc2NyaXB0b3I+fSAqL1xuICBjb25zdCBicmFuZERlc2NyaXB0b3JzID0gbWFrZVNjYWxhck1hcFN0b3JlKCk7XG5cbiAgLyogV2F0Y2ggdGhlIGJhbmsgZm9yIGlzc3VlcnMgdG8ga2VlcCBvbiBoYW5kIGZvciBtYWtpbmcgcHVyc2VzLiovXG4gIHZvaWQgb2JzZXJ2ZUl0ZXJhdGlvbihcbiAgICBzdWJzY3JpYmVFYWNoKEUoYXNzZXRQdWJsaXNoZXIpLmdldEFzc2V0U3Vic2NyaXB0aW9uKCkpLFxuICAgIHtcbiAgICAgIGFzeW5jIHVwZGF0ZVN0YXRlKGRlc2MpIHtcbiAgICAgICAgdHJhY2UoJ3JlZ2lzdGVyaW5nIGFzc2V0JywgZGVzYy5pc3N1ZXJOYW1lKTtcbiAgICAgICAgY29uc3QgeyBicmFuZCwgaXNzdWVyOiBpc3N1ZXJQLCBpc3N1ZXJOYW1lOiBwZXRuYW1lIH0gPSBkZXNjO1xuICAgICAgICAvKiBhd2FpdCBpc3N1ZXIgaWRlbnRpdHkgZm9yIHVzZSBpbiBjaGFpblN0b3JhZ2UqL1xuICAgICAgICBjb25zdCBbaXNzdWVyLCBkaXNwbGF5SW5mb10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgaXNzdWVyUCxcbiAgICAgICAgICBFKGJyYW5kKS5nZXREaXNwbGF5SW5mbygpLFxuICAgICAgICBdKTtcblxuICAgICAgICBicmFuZERlc2NyaXB0b3JzLmluaXQoZGVzYy5icmFuZCwge1xuICAgICAgICAgIGJyYW5kLFxuICAgICAgICAgIGlzc3VlcixcbiAgICAgICAgICBwZXRuYW1lLFxuICAgICAgICAgIGRpc3BsYXlJbmZvLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICBjb25zdCByZWdpc3RyeSA9IHtcbiAgICAvKiogQHBhcmFtIHtCcmFuZH0gYnJhbmQgKi9cbiAgICBoYXM6IGJyYW5kID0+IGJyYW5kRGVzY3JpcHRvcnMuaGFzKGJyYW5kKSxcbiAgICAvKiogQHBhcmFtIHtCcmFuZH0gYnJhbmQgKi9cbiAgICBnZXQ6IGJyYW5kID0+IGJyYW5kRGVzY3JpcHRvcnMuZ2V0KGJyYW5kKSxcbiAgICB2YWx1ZXM6ICgpID0+IGJyYW5kRGVzY3JpcHRvcnMudmFsdWVzKCksXG4gIH07XG4gIHJldHVybiByZWdpc3RyeTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqICAgYWdvcmljTmFtZXM6IEVSZWY8TmFtZUh1Yj47XG4gKiAgIGJvYXJkOiBFUmVmPEJvYXJkPjtcbiAqICAgYXNzZXRQdWJsaXNoZXI6IEFzc2V0UHVibGlzaGVyO1xuICogfX0gU21hcnRXYWxsZXRDb250cmFjdFRlcm1zXG4gKlxuICpcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGdldEFzc2V0U3Vic2NyaXB0aW9uOiAoKSA9PiBFUmVmPEl0ZXJhYmxlRWFjaFRvcGljPEFzc2V0RGVzY3JpcHRvcj4+O1xuICogfX0gQXNzZXRQdWJsaXNoZXJcbiAqXG4gKlxuICogQHR5cGVkZWYge2Jvb2xlYW59IElzUmV2aXZlXG4gKlxuICogQHR5cGVkZWYge3tcbiAqICAgcmV2aXZlV2FsbGV0OiAoYWRkcmVzczogc3RyaW5nKSA9PiBQcm9taXNlPFNtYXJ0V2FsbGV0PjtcbiAqICAgYWNrV2FsbGV0OiAoYWRkcmVzczogc3RyaW5nKSA9PiBJc1Jldml2ZTtcbiAqIH19IFdhbGxldFJldml2ZXJcbiAqL1xuXG4vKiBOQjogZXZlbiB0aG91Z2ggYWxsIHRoZSB3YWxsZXRzIHNoYXJlIHRoaXMgY29udHJhY3QsKi9cbi8qIDEuIHRoZXkgc2hvdWxkIG5vdCByZWx5IG9uIHRoYXQ7IHRoZXkgbWF5IGJlIHBhcnRpdGlvbmVkIGxhdGVyKi9cbi8qIDIuIHRoZXkgc2hvdWxkIG5ldmVyIGJlIGFibGUgdG8gZGV0ZWN0IGJlaGF2aW9ycyBmcm9tIGFub3RoZXIgd2FsbGV0Ki9cbi8qKlxuICogQHBhcmFtIHtaQ0Y8U21hcnRXYWxsZXRDb250cmFjdFRlcm1zPn0gemNmXG4gKiBAcGFyYW0ge3tcbiAqICAgc3RvcmFnZU5vZGU6IEVSZW1vdGU8U3RvcmFnZU5vZGU+O1xuICogICB3YWxsZXRCcmlkZ2VNYW5hZ2VyPzogRVJlZjxTY29wZWRCcmlkZ2VNYW5hZ2VyPCd3YWxsZXQnPj47XG4gKiAgIHdhbGxldFJldml2ZXI/OiBFUmVmPFdhbGxldFJldml2ZXI+O1xuICogfX0gcHJpdmF0ZUFyZ3NcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICovJGjNj19vbmNlLm1ha2VBc3NldFJlZ2lzdHJ5KG1ha2VBc3NldFJlZ2lzdHJ5KTtcbiAgICAgICBjb25zdCBwcmVwYXJlID0gYXN5bmMgKHpjZiwgcHJpdmF0ZUFyZ3MsIGJhZ2dhZ2UpID0+IHtcbiAgY29uc3QgdXBncmFkaW5nID0gYmFnZ2FnZS5oYXMoV0FMTEVUU19CWV9BRERSRVNTKTtcbiAgY29uc3QgeyBhZ29yaWNOYW1lcywgYm9hcmQsIGFzc2V0UHVibGlzaGVyIH0gPSB6Y2YuZ2V0VGVybXMoKTtcblxuICBjb25zdCB6b2UgPSB6Y2YuZ2V0Wm9lU2VydmljZSgpO1xuICBjb25zdCB7IHN0b3JhZ2VOb2RlLCB3YWxsZXRCcmlkZ2VNYW5hZ2VyLCB3YWxsZXRSZXZpdmVyIH0gPSBwcml2YXRlQXJncztcblxuICAvKiogQHR5cGUge01hcFN0b3JlPHN0cmluZywgU21hcnRXYWxsZXQ+fSAqL1xuICBjb25zdCB3YWxsZXRzQnlBZGRyZXNzID0gcHJvdmlkZUR1cmFibGVNYXBTdG9yZShiYWdnYWdlLCBXQUxMRVRTX0JZX0FERFJFU1MpO1xuICBjb25zdCBwcm92aWRlciA9IG1ha2VBdG9taWNQcm92aWRlcih3YWxsZXRzQnlBZGRyZXNzKTtcblxuICBjb25zdCBoYW5kbGVXYWxsZXRBY3Rpb24gPSBtYWtlRXhvKFxuICAgICd3YWxsZXRBY3Rpb25IYW5kbGVyJyxcbiAgICBNLmludGVyZmFjZSgnd2FsbGV0QWN0aW9uSGFuZGxlckknLCB7XG4gICAgICBmcm9tQnJpZGdlOiBNLmNhbGwoc2hhcGUuV2FsbGV0QnJpZGdlTXNnKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICB9KSxcbiAgICB7XG4gICAgICAvKipcbiAqIERlc2lnbmVkIHRvIGJlIGNhbGxlZCBieSB0aGUgYnJpZGdlTWFuYWdlciB2YXQuXG4gKlxuICogSWYgdGhpcyBlcnJvcnMgYmVmb3JlIGNhbGxpbmcgaGFuZGxlQnJpZGdlQWN0aW9uKCksIHRoZSBmYWlsdXJlIHdpbGxcbiAqIG5vdCBiZSBvYnNlcnZhYmxlLiBUaGUgcHJvbWlzZSBkb2VzIHJlamVjdCwgYnV0IGFzIG9mIG5vdyBicmlkZ2VcbiAqIG1hbmFnZXIgZHJvcHMgaW5zdGVhZCBvZiBoYW5kbGluZyBpdC4gRXZlbnR1YWxseSB3ZSdsbCBtYWtlIHRoZSBicmlkZ2VcbiAqIGFibGUgdG8gZ2l2ZSBmZWVkYmFjayBhYm91dCB0aGUgcmVxdWVzdGluZyB0cmFuc2FjdGlvbi4gTWVhbndoaWxlIHdlXG4gKiBjb3VsZCB3cml0ZSB0aGUgZXJyb3IgdG8gY2hhaW5TdG9yYWdlIGJ1dCB3ZSBkb24ndCBoYXZlIGEgZ3VhcmFudGVlIG9mXG4gKiB0aGUgd2FsbGV0IG93bmVyIHRvIGFzc29jaWF0ZSBpdCB3aXRoLiAoV2UgY291bGQgaGF2ZSBhIHNoYXJlZFxuICogYGxhc3RFcnJvcmAgbm9kZSBidXQgaXQgd291bGQgYmUgc28gbm9pc3kgYXMgdG8gbm90IHByb3ZpZGUgbXVjaCBpbmZvXG4gKiB0byB0aGUgZW5kIHVzZXIuKVxuICpcbiAqIE9uY2UgdGhlIG93bmVyIGlzIGtub3duLCB0aGlzIGNhbGxzIGhhbmRsZUJyaWRnZUFjdGlvbiB3aGljaCBlbnN1cmVzXG4gKiB0aGF0IGFsbCBlcnJvcnMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUgb3duZXIgd2FsbGV0J3MgdnN0b3JhZ2UgcGF0aC5cbiAqXG4gKiBAcGFyYW0ge1dhbGxldEJyaWRnZU1zZ30gb2JqIHZhbGlkYXRlZCBieSBzaGFwZS5XYWxsZXRCcmlkZ2VNc2dcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICBmcm9tQnJpZGdlOiBhc3luYyBvYmogPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnd2FsbGV0RmFjdG9yeS5mcm9tQnJpZGdlOicsIG9iaik7XG5cbiAgICAgICAgY29uc3QgY2FuU3BlbmQgPSAnc3BlbmRBY3Rpb24nIGluIG9iajtcblxuICAgICAgICAvKiB4eHggY2FwRGF0YSBib2R5IGlzIGFsc28gYSBKU09OIHN0cmluZyBzbyB0aGlzIGlzIGRvdWJsZS1lbmNvZGVkKi9cbiAgICAgICAgLyogcmV2aXNpdCBhZnRlciBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI1ODkqL1xuICAgICAgICBjb25zdCBhY3Rpb25DYXBEYXRhID0gSlNPTi5wYXJzZShcbiAgICAgICAgICBjYW5TcGVuZCA/IG9iai5zcGVuZEFjdGlvbiA6IG9iai5hY3Rpb24sXG4gICAgICAgICk7XG4gICAgICAgIG11c3RNYXRjaChoYXJkZW4oYWN0aW9uQ2FwRGF0YSksIHNoYXBlLlN0cmluZ0NhcERhdGEpO1xuXG4gICAgICAgIC8qIFJldml2ZSBhbiBvbGQgd2FsbGV0IGlmIG5lY2Vzc2FyeSwgYnV0IG90aGVyd2lzZSovXG4gICAgICAgIC8qIGluc2lzdCB0aGF0IGl0IGlzIGFscmVhZHkgaW4gdGhlIHN0b3JlLiovXG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSBvYmoub3duZXI7XG4gICAgICAgIGNvbnN0IHdhbGxldFAgPVxuICAgICAgICAgICF3YWxsZXRzQnlBZGRyZXNzLmhhcyhhZGRyZXNzKSAmJiB3YWxsZXRSZXZpdmVyXG4gICAgICAgICAgICA/IC8qIHRoaXMgd2lsbCBjYWxsIHByb3ZpZGVTbWFydFdhbGxldCB3aGljaCB3aWxsIHVwZGF0ZSBgd2FsbGV0c0J5QWRkcmVzc2AgZm9yIG5leHQgdGltZSovXG4gICAgICAgICAgICAgIEUod2FsbGV0UmV2aXZlcikucmV2aXZlV2FsbGV0KGFkZHJlc3MpXG4gICAgICAgICAgICA6IHdhbGxldHNCeUFkZHJlc3MuZ2V0KGFkZHJlc3MpOyAvKiBvciB0aHJvdyovXG4gICAgICAgIGNvbnN0IHdhbGxldCA9IGF3YWl0IHdhbGxldFA7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ3dhbGxldEZhY3Rvcnk6JywgeyB3YWxsZXQsIGFjdGlvbkNhcERhdGEgfSk7XG4gICAgICAgIHJldHVybiBFKHdhbGxldCkuaGFuZGxlQnJpZGdlQWN0aW9uKGFjdGlvbkNhcERhdGEsIGNhblNwZW5kKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICAvKiBab2UgaXMgYW4gaW50ZXItdmF0IGNhbGwgYW5kIHRodXMgY2Fubm90IGJlIG1hZGUgZHVyaW5nIHVwZ3JhZGUuIFNvIGVuc3VyZSB0aGF0Ki9cbiAgLyogdGhlIGZpcnN0IGluY2FybmF0aW9uIHNhdmVzIHRoZW0gYW5kIHN1YnNlcXVlbnQgb25lcyByZWFkIGZyb20gYmFnZ2FnZS4qL1xuICBjb25zdCBpbnZpdGF0aW9uSXNzdWVyUCA9IEUoem9lKS5nZXRJbnZpdGF0aW9uSXNzdWVyKCk7XG4gIGNvbnN0IHtcbiAgICBpbnZpdGF0aW9uSXNzdWVyLFxuICAgIGludml0YXRpb25CcmFuZCxcbiAgICBpbnZpdGF0aW9uRGlzcGxheUluZm8sXG4gICAgcHVibGljTWFyc2hhbGxlcjogcmVtb3RlUHVibGljTWFyc2hhbGxlcixcbiAgfSA9IGF3YWl0IHByb3ZpZGVBbGwoYmFnZ2FnZSwge1xuICAgIGludml0YXRpb25Jc3N1ZXI6ICgpID0+IGludml0YXRpb25Jc3N1ZXJQLFxuICAgIGludml0YXRpb25CcmFuZDogKCkgPT4gRShpbnZpdGF0aW9uSXNzdWVyUCkuZ2V0QnJhbmQoKSxcbiAgICBpbnZpdGF0aW9uRGlzcGxheUluZm86ICgpID0+XG4gICAgICBFKEUoaW52aXRhdGlvbklzc3VlclApLmdldEJyYW5kKCkpLmdldERpc3BsYXlJbmZvKCksXG4gICAgcHVibGljTWFyc2hhbGxlcjogKCkgPT4gRShib2FyZCkuZ2V0UmVhZG9ubHlNYXJzaGFsbGVyKCksXG4gIH0pO1xuXG4gIGNvbnN0IHJlZ2lzdHJ5ID0gbWFrZUFzc2V0UmVnaXN0cnkoYXNzZXRQdWJsaXNoZXIpO1xuXG4gIGNvbnN0IHB1YmxpY0NhY2hpbmdNYXJzaGFsbGVyID0gd3JhcFJlbW90ZU1hcnNoYWxsZXIocmVtb3RlUHVibGljTWFyc2hhbGxlcik7XG5cbiAgY29uc3Qgc2hhcmVkID0gaGFyZGVuKHtcbiAgICBhZ29yaWNOYW1lcyxcbiAgICBpbnZpdGF0aW9uQnJhbmQsXG4gICAgaW52aXRhdGlvbkRpc3BsYXlJbmZvLFxuICAgIGludml0YXRpb25Jc3N1ZXIsXG4gICAgcHVibGljTWFyc2hhbGxlcjogcHVibGljQ2FjaGluZ01hcnNoYWxsZXIsXG4gICAgcmVnaXN0cnksXG4gICAgem9lLFxuICB9KTtcblxuICAvKiogQHR5cGUge1Rlc3RKaWdLaXQ8U21hcnRXYWxsZXRUZXN0SmlnPn0gKi9cbiAgY29uc3Qgc21hcnRXYWxsZXRKaWdLaXQgPSBtYWtlSmlnS2l0KCk7XG5cbiAgLyoqXG4gKiBIb2xkZXJzIG9mIHRoaXMgb2JqZWN0OlxuICpcbiAqIC0gdmF0ICh0cmFuc2l0aXZlbHkgZnJvbSBob2xkaW5nIHRoZSB3YWxsZXQgZmFjdG9yeSlcbiAqIC0gd2FsbGV0LXVpICh3aGljaCBoYXMga2V5IG1hdGVyaWFsOyBkYXBwcyB1c2Ugd2FsbGV0LXVpIHRvIHByb3Bvc2UgYWN0aW9ucylcbiAqL1xuICBjb25zdCBtYWtlU21hcnRXYWxsZXQgPSBwcmVwYXJlU21hcnRXYWxsZXQoXG4gICAgYmFnZ2FnZSxcbiAgICBzaGFyZWQsXG4gICAgc21hcnRXYWxsZXRKaWdLaXQuc2V0VGVzdEppZyxcbiAgKTtcblxuICBjb25zdCBjcmVhdG9yRmFjZXQgPSBwcmVwYXJlRXhvKFxuICAgIGJhZ2dhZ2UsXG4gICAgJ3dhbGxldEZhY3RvcnlDcmVhdG9yJyxcbiAgICBNLmludGVyZmFjZSgnd2FsbGV0RmFjdG9yeUNyZWF0b3JJJywge1xuICAgICAgcHJvdmlkZVNtYXJ0V2FsbGV0OiBNLmNhbGxXaGVuKFxuICAgICAgICBNLnN0cmluZygpLFxuICAgICAgICBNLmF3YWl0KE0ucmVtb3RhYmxlKCdCYW5rJykpLFxuICAgICAgICBNLmF3YWl0KE0ucmVtb3RhYmxlKCduYW1lc0J5QWRkcmVzc0FkbWluJykpLFxuICAgICAgKS5yZXR1cm5zKFtNLnJlbW90YWJsZSgnU21hcnRXYWxsZXQnKSwgTS5ib29sZWFuKCldKSxcbiAgICB9KSxcbiAgICB7XG4gICAgICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG4gKiBAcGFyYW0ge0VSZWY8QmFuaz59IGJhbmtcbiAqIEBwYXJhbSB7RVJlZjxOYW1lQWRtaW4+fSBuYW1lc0J5QWRkcmVzc0FkbWluXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxbd2FsbGV0OiBTbWFydFdhbGxldCwgaXNOZXc6IGJvb2xlYW5dPn0gd2FsbGV0IGFsb25nXG4gKiAgIHdpdGggYSBmbGFnIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbG9va2luZyB1cCBhbiBleGlzdGluZyB3YWxsZXQgYW5kXG4gKiAgIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAqL1xuICAgICAgcHJvdmlkZVNtYXJ0V2FsbGV0KGFkZHJlc3MsIGJhbmssIG5hbWVzQnlBZGRyZXNzQWRtaW4pIHtcbiAgICAgICAgbGV0IGlzTmV3ID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gKiBAdHlwZSB7KGFkZHJlc3M6IHN0cmluZykgPT4gUHJvbWlzZTxTbWFydFdhbGxldD59XG4gKi9cbiAgICAgICAgY29uc3QgbWFrZXIgPSBhc3luYyBfYWRkcmVzcyA9PiB7XG4gICAgICAgICAgY29uc3QgaW52aXRhdGlvblB1cnNlID0gYXdhaXQgRShpbnZpdGF0aW9uSXNzdWVyKS5tYWtlRW1wdHlQdXJzZSgpO1xuICAgICAgICAgIGNvbnN0IHdhbGxldFN0b3JhZ2VOb2RlID0gRShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShhZGRyZXNzKTtcbiAgICAgICAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCBtYWtlU21hcnRXYWxsZXQoXG4gICAgICAgICAgICBoYXJkZW4oeyBhZGRyZXNzLCB3YWxsZXRTdG9yYWdlTm9kZSwgYmFuaywgaW52aXRhdGlvblB1cnNlIH0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvKiBBbiBhd2FpdCBoZXJlIHdvdWxkIGRlYWRsb2NrIHdpdGggaW52aXRlUFNNQ29tbWl0dGVlTWVtYmVycyovXG4gICAgICAgICAgdm9pZCBwdWJsaXNoRGVwb3NpdEZhY2V0KGFkZHJlc3MsIHdhbGxldCwgbmFtZXNCeUFkZHJlc3NBZG1pbik7XG5cbiAgICAgICAgICBpc05ldyA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHdhbGxldDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmaW5pc2hlciA9IHdhbGxldFJldml2ZXJcbiAgICAgICAgICA/IGFzeW5jIChfYWRkcmVzcywgX3dhbGxldCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpc1Jldml2ZSA9IGF3YWl0IEUod2FsbGV0UmV2aXZlcikuYWNrV2FsbGV0KGFkZHJlc3MpO1xuICAgICAgICAgICAgICBpc05ldyA9ICFpc1Jldml2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gcHJvdmlkZXJcbiAgICAgICAgICAucHJvdmlkZUFzeW5jKGFkZHJlc3MsIG1ha2VyLCBmaW5pc2hlcilcbiAgICAgICAgICAudGhlbih3ID0+IFt3LCBpc05ld10pO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIC8qIE5PVEU6IGJvdGggYE1zZ1dhbGxldEFjdGlvbmAgYW5kIGBNc2dXYWxsZXRTcGVuZEFjdGlvbmAgYXJyaXZlIGFzIEJSSURHRV9JRC5XQUxMRVQqL1xuICAvKiBieSB3YXkgb2YgcGVyZm9ybUFjdGlvbigpIGluIGNvc21pYy1zd2luZ3NldC9zcmMvbGF1bmNoLWNoYWluLmpzKi9cbiAgaWYgKHdhbGxldEJyaWRnZU1hbmFnZXIpIHtcbiAgICAvKiBOQjogbWF5IG5vdCBiZSBpbiBzZXJ2aWNlIHdoZW4gY3JlYXRvckZhY2V0IGlzIHVzZWQsIG9yIGV2ZXIqL1xuICAgIC8qIEl0IGNhbid0IGJlIGF3YWl0ZWQgYmVjYXVzZSB0aGF0IGZhaWxzIHZhdCByZXN0YXJ0Ki9cbiAgICBpZiAodXBncmFkaW5nKSB7XG4gICAgICB2b2lkIEUod2FsbGV0QnJpZGdlTWFuYWdlcikuc2V0SGFuZGxlcihoYW5kbGVXYWxsZXRBY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2b2lkIEUod2FsbGV0QnJpZGdlTWFuYWdlcikuaW5pdEhhbmRsZXIoaGFuZGxlV2FsbGV0QWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICB6Y2Yuc2V0VGVzdEppZygoKSA9PiB7XG4gICAgcmV0dXJuIHsgLi4uc21hcnRXYWxsZXRKaWdLaXQuZ2V0VGVzdEppZygpIH07XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgY3JlYXRvckZhY2V0LFxuICB9O1xufTskaM2PX29uY2UucHJlcGFyZShwcmVwYXJlKTtcbmhhcmRlbihwcmVwYXJlKTtcblxuLyogU28gd2UgY2FuIGNvbnNpc3RlbnRseSBpbXBvcnQgYHN0YXJ0YCBmcm9tIGNvbnRyYWN0cy4qL1xuLyogQ2FuJ3QgYmUgYSB2YWx1ZSBleHBvcnQgYmVjYXVzZSBab2UgZW5mb3JjZXMgdGhhdCBjb250cmFjdHMgZXhwb3J0IG9uZSBvciB0aGUgb3RoZXIuKi9cbi8qKiBAdHlwZWRlZiB7dHlwZW9mIHByZXBhcmV9IHN0YXJ0ICovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjdXN0b21UZXJtc1NoYXBlIjpbImN1c3RvbVRlcm1zU2hhcGUiXSwicHJpdmF0ZUFyZ3NTaGFwZSI6WyJwcml2YXRlQXJnc1NoYXBlIl0sInB1Ymxpc2hEZXBvc2l0RmFjZXQiOlsicHVibGlzaERlcG9zaXRGYWNldCJdLCJtYWtlQXNzZXRSZWdpc3RyeSI6WyJtYWtlQXNzZXRSZWdpc3RyeSJdLCJwcmVwYXJlIjpbInByZXBhcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARxpyk0YOAABGDgAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyIsIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsIkBlbmRvL2V4byIsIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyIsIm11c3RNYXRjaCIsInByb3ZpZGVMYXp5IiwicHJvdmlkZUxhenkiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCB0eXBlbGVzc011c3RNYXRjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+ICh0eXBlbGVzc011c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzXCIsIFtdXSxbXCJAZW5kby9leG9cIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbXV0sW1wiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogWFhYIEBhZ29yaWMvc3RvcmUgc2hvdWxkIG5vdCBkZXBlbmQgb24gQGFnb3JpYy9pbnRlcm5hbCovXG4vKiBUT0RPIG1vdmUgdG8gRW5kbyovXG4vKiogQHR5cGUge011c3RNYXRjaH0gKi9cbiAgICAgICBjb25zdCBtdXN0TWF0Y2ggPSB0eXBlbGVzc011c3RNYXRjaDskaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6W1sibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6W1sibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6W1sibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUF0b21pY1Byb3ZpZGVyIl0sWyJwcm92aWRlTGF6eSIsInByb3ZpZGVMYXp5Il1dLCJAZW5kby9wYXR0ZXJucyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXSxbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl0sWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXSxbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl0sWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il0sWyJiYWdJc1N1cGVyYmFnIiwiYmFnSXNTdXBlcmJhZyJdLFsiYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXSxbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJpc0NvcHlTZXQiLCJpc0NvcHlTZXQiXSxbImlzQ29weU1hcCIsImlzQ29weU1hcCJdXSwiQGVuZG8vZXhvIjpbWyJpbml0RW1wdHkiLCJpbml0RW1wdHkiXSxbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiXSxbImRlZmluZUV4b0NsYXNzS2l0IiwiZGVmaW5lRXhvQ2xhc3NLaXQiXSxbIm1ha2VFeG8iLCJtYWtlRXhvIl1dLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiOltbIm1ha2VMZWdhY3lNYXAiLCJtYWtlTGVnYWN5TWFwIl1dLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjpbWyJtYWtlTGVnYWN5V2Vha01hcCIsIm1ha2VMZWdhY3lXZWFrTWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAD9JGLuILAADiCwAALAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBhbmQgaXRzIGZyYXRlcm5hbCBzaWJsaW5nIGxlZ2FjeVdlYWtNYXAgZXhpc3Qgb25seSB0byBlYXNlIGFcbiAqIHRyYW5zaXRpb24gdG8gdGhlIG1vZGVybiBgc3RvcmVgIHN5c3RlbSwgYXJlIGRlcHJlY2F0ZWQsIGFuZCB3aWxsIGV2ZW50dWFsbHlcbiAqIGRpc2FwcGVhci4gVGhleSBhcmUgbmVlZGVkIGZvciBub3cgdG8gc3VwcG9ydCBzb21lIG9mIHRoZSB1c2VzIG9mIHRoZSBvbGRcbiAqIGJlaGF2aW9yIHRoYXQgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG5ldy4gVGhlIGNvbnN0cmFpbnQgaW1wb3NlZCBieSB0aGVcbiAqIG5ldyBpcyB0aGF0IG9ubHkgcGFzc2FibGVzIGNhbiBiZSB1c2VkIGFzIHZhbHVlcywgYW5kIG9ubHkga2V5cyAocm91Z2hseSxcbiAqIHN0cnVjdHVyZXMsIGFrYSBjb21wYXJhYmxlcykgY2FuIGJlIHVzZWQgYXMgdmFsdWVzLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC8zNTY3XG4gKlxuICogVE9ETyBPbmNlIHRoYXQgUFIgaXMgbWVyZ2VkLCBsaW5rIHRvIHRoZSBkb2N1bWVudHMgcmF0aGVyIHRoYW4gdGhlIFBScy5cbiAqXG4gKiBFYWNoIG9mIHRoZXNlIG5vbi1jb25mb3JtaW5nIHVzZXMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoIGFcbiAqXG4gKiBgYGBqc1xuICogLy8gTGVnYWN5IGJlY2F1c2UuLi5cbiAqIGBgYFxuICpcbiAqIGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgcHJvYmxlbSBpbmhpYml0aW5nIGNvbnZlcnNpb24gdG8gdGhlIG5ldyBzeXN0ZW0uIFNvbWVcbiAqIG9mIHRoZXNlIHByb2JsZW1zIGFzIG9mIHRoaXMgd3JpdGluZzpcbiAqXG4gKiAtIEEgcHJvbWlzZUtpdCB1c2VkIGFzIGEgdmFsdWUsIGV2ZW4gdGhvdWdoIGEgcHJvbWlzZUtpdCBpcyBub3QgYSBwYXNzYWJsZS5cbiAqICAgU29sdXRpb25zIGFyZSB0byBtYWtlIGl0IGEgcGFzc2FibGUsIG9yIHRvIGNvbnZlcnQgdGhlIGNvbnRhaW5lciBiYWNrIHRvIGFcbiAqICAgY29udmVudGlvbmFsIEphdmFTY3JpcHQgTWFwLlxuICogLSBBIG11dGFibGUgYXJyYXkgdXNlZCBhcyBhIHZhbHVlLCB0aGF0IGlzIHN1YnNlcXVlbnRseSBtdXRhdGVkLiBGcmVlemluZyB0aGVcbiAqICAgYXJyYXkgd291bGRuJ3Qgd29yayBvZiBjb3Vyc2UgYmVjYXVzZSBpdCB3b3VsZCBicmVhayB0aGUgc3Vic2VxdWVudFxuICogICBtdXRhdGlvbi4gVXNpbmcgYSBmYXIgb2JqZWN0IHdyYXBwaW5nIGFuIGFycmF5IHdvdWxkIGxpa2VseSB3b3JrIGZpbmUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhck1hcCBpZiBwb3NzaWJsZSwgTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lNYXA8SywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTGVnYWN5TWFwID0gKHRhZyA9ICdrZXknKSA9PiB7XG4gIGNvbnN0IG0gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdCA9IGtleSA9PlxuICAgICFtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0ga2V5ID0+XG4gICAgbS5oYXMoa2V5KSB8fCBGYWlsYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGhhczoga2V5ID0+IHtcbiAgICAgIC8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbiAgICAgIC8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbiAgICAgIC8qIGluIHRoaXMgbWFwLiovXG4gICAgICByZXR1cm4gbS5oYXMoa2V5KTtcbiAgICB9LFxuICAgIGluaXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbiAgICAgIG0uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZ2V0OiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICByZXR1cm4gbS5nZXQoa2V5KTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgbS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIG0uZGVsZXRlKGtleSk7XG4gICAgfSxcbiAgICBrZXlzOiAoKSA9PiBtLmtleXMoKSxcbiAgICB2YWx1ZXM6ICgpID0+IG0udmFsdWVzKCksXG4gICAgZW50cmllczogKCkgPT4gbS5lbnRyaWVzKCksXG4gICAgZ2V0U2l6ZTogKCkgPT4gbS5zaXplLFxuICAgIGNsZWFyOiAoKSA9PiBtLmNsZWFyKCksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUxlZ2FjeU1hcChtYWtlTGVnYWN5TWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADbxEI1bQcAAG0HAAAwAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogU2VlIGRvY2NvbW1lbnQgaW4gdGhlIGNsb3NlbHkgcmVsYXRlZCBgbGVnYWN5TWFwLmpzYCBtb2R1bGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhcldlYWtNYXAgaWYgcG9zc2libGUsIFdlYWtNYXAgb3RoZXJ3aXNlXG4gKiBAdGVtcGxhdGUge1dlYWtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHJldHVybnMge0xlZ2FjeVdlYWtNYXA8SywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTGVnYWN5V2Vha01hcCA9ICh0YWcgPSAna2V5JykgPT4ge1xuICAvKiogQHR5cGUge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59ICovXG4gIGNvbnN0IHdtID0gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0ID0ga2V5ID0+XG4gICAgIXdtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0ga2V5ID0+XG4gICAgd20uaGFzKGtleSkgfHwgRmFpbGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IGtleSA9PiB7XG4gICAgICAvKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4gICAgICAvKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4gICAgICAvKiBpbiB0aGlzIG1hcC4qL1xuICAgICAgcmV0dXJuIHdtLmhhcyhrZXkpO1xuICAgIH0sXG4gICAgaW5pdDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuICAgICAgd20uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZ2V0OiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICAvKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtWfSAqLyAod20uZ2V0KGtleSkpO1xuICAgIH0sXG4gICAgc2V0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICB3bS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIHdtLmRlbGV0ZShrZXkpO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUxlZ2FjeVdlYWtNYXAobWFrZUxlZ2FjeVdlYWtNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lXZWFrTWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANehQUbqGAAA6hgAADEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiLCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYXIsYXNzZXJ0UGFzc2FibGUsZmlsdGVySXRlcmFibGUsbWFwSXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5TWFwLG1hdGNoZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4sbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsWyRozY9fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaM2PX2EpXV0sW1wibWFwSXRlcmFibGVcIixbJGjNj19hID0+IChtYXBJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzXCIsWyRozY9fYSA9PiAobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIixbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7S2V5LCBQYXR0ZXJufSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtNYXBTdG9yZSwgTWFwU3RvcmVNZXRob2RzLCBTdG9yZU9wdGlvbnN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge01hcDxLLCBWPn0ganNtYXBcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb0FkZFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvU2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXVxuICogQHJldHVybnMge01hcFN0b3JlTWV0aG9kczxLLCBWPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNYXBTdG9yZU1ldGhvZHMgPSAoXG4gIGpzbWFwLFxuICBhc3NlcnRLVk9rVG9BZGQsXG4gIGFzc2VydEtWT2tUb1NldCxcbiAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbiAgdGFnID0gJ2tleScsXG4pID0+IHtcbiAgY29uc3QgeyBhc3NlcnRVcGRhdGVPbkFkZCwgYXNzZXJ0VXBkYXRlT25EZWxldGUsIGl0ZXJhYmxlS2V5cyB9ID1cbiAgICBtYWtlQ3VycmVudEtleXNLaXQoXG4gICAgICAoKSA9PiBqc21hcC5rZXlzKCksXG4gICAgICBrID0+IGpzbWFwLmhhcyhrKSxcbiAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgYXNzZXJ0S1ZPa1RvQWRkLFxuICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbiAgICAgIHRhZyxcbiAgICApO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuICBjb25zdCBrZXlzID0gKGtleVBhdHQsIHZhbHVlUGF0dCkgPT4ge1xuICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBpdGVyYWJsZUtleXM7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IGsgPT4ge1xuICAgICAgaWYgKGtleVBhdHQgIT09IHVuZGVmaW5lZCAmJiAhbWF0Y2hlcyhrLCBrZXlQYXR0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvKiBVc2VzIHRoZSBjdXJyZW50IGpzbWFwIHZhbHVlLCBzaW5jZSB0aGUgaXRlcmF0YXRvciBzdXJ2aXZlcyBgLnNldGAqL1xuICAgICAgaWYgKHZhbHVlUGF0dCAhPT0gdW5kZWZpbmVkICYmICFtYXRjaGVzKGpzbWFwLmdldChrKSwgdmFsdWVQYXR0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsIGZpbHRlcik7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHBhcmFtIHtQYXR0ZXJufSBbdmFsdWVQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPFY+fVxuICovXG4gIGNvbnN0IHZhbHVlcyA9IChrZXlQYXR0LCB2YWx1ZVBhdHQpID0+XG4gICAgbWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LCB2YWx1ZVBhdHQpLCBrID0+IC8qKiBAdHlwZSB7Vn0gKi8gKGpzbWFwLmdldChrKSkpO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSywgVl0+fVxuICovXG4gIGNvbnN0IGVudHJpZXMgPSAoa2V5UGF0dCwgdmFsdWVQYXR0KSA9PlxuICAgIG1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSwgayA9PiBbXG4gICAgICBrLFxuICAgICAgLyoqIEB0eXBlIHtWfSAqLyAoanNtYXAuZ2V0KGspKSxcbiAgICBdKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICAuLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzbWFwLFxuICAgICAgLyoqIEB0eXBlIHsoazogSywgdjogVikgPT4gdm9pZH0gKi8gKGFzc2VydFVwZGF0ZU9uQWRkKSxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIGFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuICAgICAgdGFnLFxuICAgICksXG4gICAga2V5cyxcbiAgICB2YWx1ZXMsXG4gICAgZW50cmllcyxcblxuICAgIHNuYXBzaG90OiAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LCB2YWx1ZVBhdHQpKSxcblxuICAgIGdldFNpemU6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgICBrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBqc21hcC5zaXplXG4gICAgICAgIDogWy4uLmtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG4gICAgY2xlYXI6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAganNtYXAuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSkge1xuICAgICAgICBqc21hcC5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvciByZWZlcmVuY2luZyBhXG4gKiBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCwgYHNldGAgYW5kXG4gKiBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSBfc2NhbGFyXyBtYXAgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZU1hcHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgSz1hbnlcbiAqIEB0ZW1wbGF0ZSBWPWFueVxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGhlIGNvbHVtbiBuYW1lIGZvciB0aGUga2V5XG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SywgVj59XG4gKi8kaM2PX29uY2UubWFrZU1hcFN0b3JlTWV0aG9kcyhtYWtlTWFwU3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyTWFwU3RvcmUgPSAoXG4gIHRhZyA9ICdrZXknLFxuICB7IGtleVNoYXBlLCB2YWx1ZVNoYXBlIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCBqc21hcCA9IG5ldyBNYXAoKTtcbiAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiAgfVxuICBpZiAodmFsdWVTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiAgfVxuXG4gIGNvbnN0IGFzc2VydEtWT2tUb1NldCA9IChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgIC8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbiAgICBoYXJkZW4odmFsdWUpO1xuXG4gICAgYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuICAgIGlmICh2YWx1ZVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSwgJ21hcFN0b3JlIHZhbHVlJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFzc2VydEtWT2tUb0FkZCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbihrZXkpO1xuXG4gICAgYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG4gICAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChrZXksIGtleVNoYXBlLCAnbWFwU3RvcmUga2V5Jyk7XG4gICAgfVxuICAgIGFzc2VydEtWT2tUb1NldChrZXksIHZhbHVlKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKGBzY2FsYXIgTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VNYXBTdG9yZU1ldGhvZHMoXG4gICAgICBqc21hcCxcbiAgICAgIGFzc2VydEtWT2tUb0FkZCxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRhZyxcbiAgICApLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJNYXBTdG9yZShtYWtlU2NhbGFyTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACmQkq1EREAABERAAAxAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIixbJGjNj19hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsWyRozY9fYSA9PiAobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIixbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXksIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1NldFN0b3JlLCBTZXRTdG9yZU1ldGhvZHMsIFN0b3JlT3B0aW9uc30gZnJvbSAnLi4vdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7U2V0PEs+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7U2V0U3RvcmVNZXRob2RzPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVNldFN0b3JlTWV0aG9kcyA9IChcbiAganNzZXQsXG4gIGFzc2VydEtleU9rVG9BZGQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBjb25zdCB7IGFzc2VydFVwZGF0ZU9uQWRkLCBhc3NlcnRVcGRhdGVPbkRlbGV0ZSwgaXRlcmFibGVLZXlzIH0gPVxuICAgIG1ha2VDdXJyZW50S2V5c0tpdChcbiAgICAgICgpID0+IGpzc2V0LmtleXMoKSxcbiAgICAgIGsgPT4ganNzZXQuaGFzKGspLFxuICAgICAgY29tcGFyZVJhbmssXG4gICAgICBhc3NlcnRLZXlPa1RvQWRkLFxuICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbiAgICAgIGtleU5hbWUsXG4gICAgKTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbiAgY29uc3Qga2V5cyA9IGtleVBhdHQgPT5cbiAgICBrZXlQYXR0ID09PSB1bmRlZmluZWRcbiAgICAgID8gaXRlcmFibGVLZXlzXG4gICAgICA6IGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cywgayA9PiBtYXRjaGVzKGssIGtleVBhdHQpKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICAuLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzc2V0LFxuICAgICAgYXNzZXJ0VXBkYXRlT25BZGQsXG4gICAgICBhc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbiAgICAgIGtleU5hbWUsXG4gICAgKSxcblxuICAgIGtleXMsXG5cbiAgICB2YWx1ZXM6IGtleXMsXG5cbiAgICBzbmFwc2hvdDogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+IG1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG4gICAgZ2V0U2l6ZTogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgICBrZXlQYXR0ID09PSB1bmRlZmluZWQgPyBqc3NldC5zaXplIDogWy4uLmtleXMoa2V5UGF0dCldLmxlbmd0aCxcblxuICAgIGNsZWFyOiAoa2V5UGF0dCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGtleVBhdHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBqc3NldC5jbGVhcigpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0KSkge1xuICAgICAgICBqc3NldC5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvciByZWZlcmVuY2luZyBhXG4gKiBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCwgYHNldGAgYW5kXG4gKiBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSBfc2NhbGFyXyBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqLyRozY9fb25jZS5tYWtlU2V0U3RvcmVNZXRob2RzKG1ha2VTZXRTdG9yZU1ldGhvZHMpO1xuICAgICAgIGNvbnN0IG1ha2VTY2FsYXJTZXRTdG9yZSA9ICh0YWcgPSAna2V5JywgeyBrZXlTaGFwZSB9ID0ge30pID0+IHtcbiAgY29uc3QganNzZXQgPSBuZXcgU2V0KCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLZXlPa1RvQWRkID0ga2V5ID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKGtleSk7XG5cbiAgICBhc3NlcnRTY2FsYXJLZXkoa2V5KTtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICdzZXRTdG9yZSBrZXknKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEZhcihgc2NhbGFyIFNldFN0b3JlIG9mICR7cSh0YWcpfWAsIHtcbiAgICAuLi5tYWtlU2V0U3RvcmVNZXRob2RzKGpzc2V0LCBhc3NlcnRLZXlPa1RvQWRkLCB1bmRlZmluZWQsIHRhZyksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhclNldFN0b3JlKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhclNldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPk186ftFgAA7RYAADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsRmFyLGFzc2VydFBhc3NhYmxlLHBhc3NTdHlsZU9mLGdldENvcHlNYXBFbnRyaWVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weU1hcDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldENvcHlNYXBFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJpZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dLFtcImlzQ29weU1hcFwiLFskaM2PX2EgPT4gKGlzQ29weU1hcCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXl9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7V2Vha01hcFN0b3JlLCBTdG9yZU9wdGlvbnN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7V2Vha01hcFN0b3JlPEssIFY+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAoXG4gIGpzbWFwLFxuICBhc3NlcnRLVk9rVG9BZGQsXG4gIGFzc2VydEtWT2tUb1NldCxcbiAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSA9IHVuZGVmaW5lZCxcbiAga2V5TmFtZSA9ICdrZXknLFxuKSA9PiB7XG4gIGNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdCA9IGtleSA9PlxuICAgICFqc21hcC5oYXMoa2V5KSB8fCBGYWlsYCR7cShrZXlOYW1lKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuXG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIGpzbWFwLmhhcyhrZXkpIHx8IEZhaWxgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuICAgICAgLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuICAgICAgLyogaW4gdGhpcyBtYXAuKi9cbiAgICAgIHJldHVybiBqc21hcC5oYXMoa2V5KTtcbiAgICB9LFxuICAgIGdldDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7Vn0gKi8gKGpzbWFwLmdldChrZXkpKTtcbiAgICB9LFxuXG4gICAgaW5pdDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuICAgICAgYXNzZXJ0S1ZPa1RvQWRkKGtleSwgdmFsdWUpO1xuICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBhc3NlcnRLVk9rVG9TZXQoa2V5LCB2YWx1ZSk7XG4gICAgICBqc21hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIGlmIChhc3NlcnRLZXlPa1RvRGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAganNtYXAuZGVsZXRlKGtleSk7XG4gICAgfSxcblxuICAgIGFkZEFsbDogZW50cmllcyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGVudHJpZXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGVudHJpZXMpICYmIGlzQ29weU1hcChlbnRyaWVzKSkge1xuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYKi9cbiAgICAgICAgICBlbnRyaWVzID0gZ2V0Q29weU1hcEVudHJpZXMoZW50cmllcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRmFpbGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7ZW50cmllc31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAvKiogQHR5cGUge0l0ZXJhYmxlPFtLLCBWXT59ICovIChlbnRyaWVzKSkge1xuICAgICAgICAvKiBEb24ndCBhc3NlcnQgdGhhdCB0aGUga2V5IGVpdGhlciBkb2VzIG9yIGRvZXMgbm90IGV4aXN0LiovXG4gICAgICAgIGFzc2VydEtWT2tUb0FkZChrZXksIHZhbHVlKTtcbiAgICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgX3NjYWxhcl8gbWFwU3RvcmUgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzOlxuICogcHJpbWl0aXZlcyBvciByZW1vdGFibGVzLiBPdGhlciBtYXBTdG9yZXMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLFxuICogY29weUFycmF5cyBhbmQgY29weVJlY29yZHMgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mXG4gKiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha01hcCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha01hcCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dCBpdFxuICogc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogbWFwLiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlIHJlbW90YWJsZXMsXG4gKiBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIHJlYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlT2JqZWN0ICYgV2Vha01hcFN0b3JlPEssIFY+fVxuICovJGjNj19vbmNlLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gKFxuICB0YWcgPSAna2V5JyxcbiAgeyBsb25nTGl2ZWQgPSB0cnVlLCBrZXlTaGFwZSA9IHVuZGVmaW5lZCwgdmFsdWVTaGFwZSA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSAqL1xuICBjb25zdCBqc21hcCA9IGxvbmdMaXZlZCA/IG5ldyBXZWFrTWFwKCkgOiBuZXcgTWFwKCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cbiAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLVk9rVG9TZXQgPSAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKHZhbHVlKTtcblxuICAgIGFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbiAgICBpZiAodmFsdWVTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2godmFsdWUsIHZhbHVlU2hhcGUsICd3ZWFrTWFwU3RvcmUgdmFsdWUnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvQWRkID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKGtleSk7XG4gICAgcGFzc1N0eWxlT2Yoa2V5KSA9PT0gJ3JlbW90YWJsZScgfHxcbiAgICAgIEZhaWxgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrTWFwU3RvcmVzOiAke2tleX1gO1xuICAgIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2goa2V5LCBrZXlTaGFwZSwgJ3dlYWtNYXBTdG9yZSBrZXknKTtcbiAgICB9XG4gICAgYXNzZXJ0S1ZPa1RvU2V0KGtleSwgdmFsdWUpO1xuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBXZWFrTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuICAgICAganNtYXAsXG4gICAgICBhc3NlcnRLVk9rVG9BZGQsXG4gICAgICBhc3NlcnRLVk9rVG9TZXQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0YWcsXG4gICAgKSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlU2NhbGFyV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJRapRtOEQAAThEAADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsRmFyLHBhc3NTdHlsZU9mLGdldENvcHlTZXRLZXlzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weVNldDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXSxbXCJpc0NvcHlTZXRcIixbJGjNj19hID0+IChpc0NvcHlTZXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7S2V5fSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtTdG9yZU9wdGlvbnMsIFdlYWtTZXRTdG9yZSwgV2Vha1NldFN0b3JlTWV0aG9kc30gZnJvbSAnQGFnb3JpYy9zdG9yZSc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtXZWFrU2V0PEsgJiBvYmplY3Q+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlTWV0aG9kczxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gKFxuICBqc3NldCxcbiAgYXNzZXJ0S2V5T2tUb0FkZCxcbiAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSA9IHVuZGVmaW5lZCxcbiAga2V5TmFtZSA9ICdrZXknLFxuKSA9PiB7XG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIGpzc2V0LmhhcyhrZXkpIHx8IEZhaWxgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuICAgICAgLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuICAgICAgLyogaW4gdGhpcyBzZXQuKi9cbiAgICAgIHJldHVybiBqc3NldC5oYXMoa2V5KTtcbiAgICB9LFxuXG4gICAgYWRkOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuICAgICAganNzZXQuYWRkKGtleSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIGlmIChhc3NlcnRLZXlPa1RvRGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAganNzZXQuZGVsZXRlKGtleSk7XG4gICAgfSxcblxuICAgIGFkZEFsbDoga2V5cyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGtleXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGtleXMpICYmIGlzQ29weVNldChrZXlzKSkge1xuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYKi9cbiAgICAgICAgICBrZXlzID0gZ2V0Q29weVNldEtleXMoa2V5cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRmFpbGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7a2V5c31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiAvKiogQHR5cGUge0l0ZXJhYmxlPEs+fSAqLyAoa2V5cykpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuICAgICAgICBqc3NldC5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogVGhpcyBpcyBhIF9zY2FsYXJfIHNldCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlU2V0cyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrU2V0IGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrU2V0IGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0IGl0XG4gKiBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBzZXQuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGUgcmVtb3RhYmxlcyxcbiAqIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqLyRozY9fb25jZS5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyk7XG4gICAgICAgY29uc3QgbWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9IChcbiAgdGFnID0gJ2tleScsXG4gIHsgbG9uZ0xpdmVkID0gdHJ1ZSwga2V5U2hhcGUgPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGpzc2V0ID0gbmV3IChsb25nTGl2ZWQgPyBXZWFrU2V0IDogU2V0KSgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S2V5T2tUb0FkZCA9IGtleSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbihrZXkpO1xuICAgIHBhc3NTdHlsZU9mKGtleSkgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgICBGYWlsYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha1N0b3JlczogJHtrZXl9YDtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICd3ZWFrU2V0U3RvcmUga2V5Jyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBXZWFrU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKGpzc2V0LCBhc3NlcnRLZXlPa1RvQWRkLCB1bmRlZmluZWQsIHRhZyksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhcldlYWtTZXRTdG9yZShtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACqV+8u2xoAANsaAAAuAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJhcHBlbmRUb1N0b3JlZEFycmF5IiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRmFyLGlzQ29weU1hcCxpc0NvcHlTZXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImlzQ29weU1hcFwiLFskaM2PX2EgPT4gKGlzQ29weU1hcCA9ICRozY9fYSksJGjNj19saXZlW1wiaXNDb3B5TWFwXCJdXV0sW1wiaXNDb3B5U2V0XCIsWyRozY9fYSA9PiAoaXNDb3B5U2V0ID0gJGjNj19hKSwkaM2PX2xpdmVbXCJpc0NvcHlTZXRcIl1dXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDdXJyZW50S2V5c0tpdFxuICogQHByb3BlcnR5IHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uQWRkXG4gKiBAcHJvcGVydHkgeyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkRlbGV0ZVxuICogQHByb3BlcnR5IHtJdGVyYWJsZTxLPn0gaXRlcmFibGVLZXlzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHsoKSA9PiBJdGVyYWJsZTxLPn0gZ2V0UmF3S2V5c1xuICogQHBhcmFtIHsoazogSykgPT4gYm9vbGVhbn0gY2hlY2tIYXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtDdXJyZW50S2V5c0tpdDxLLCBWPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDdXJyZW50S2V5c0tpdCA9IChcbiAgZ2V0UmF3S2V5cyxcbiAgY2hlY2tIYXMsXG4gIGNvbXBhcmUsXG4gIGFzc2VydE9rVG9BZGQsXG4gIGFzc2VydE9rVG9EZWxldGUsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBsZXQgdXBkYXRlQ291bnQgPSAwO1xuICAvKiogQHR5cGUge0FycmF5PEs+IHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgc29ydGVkS2V5c01lbW87XG5cbiAgY29uc3QgYXNzZXJ0VXBkYXRlT25BZGQgPSAoaywgdiA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFzc2VydE9rVG9BZGQoaywgdik7XG4gICAgdXBkYXRlQ291bnQgKz0gMTtcbiAgICBzb3J0ZWRLZXlzTWVtbyA9IHVuZGVmaW5lZDtcbiAgfTtcblxuICBjb25zdCBhc3NlcnRVcGRhdGVPbkRlbGV0ZSA9IGsgPT4gYXNzZXJ0T2tUb0RlbGV0ZSAmJiBhc3NlcnRPa1RvRGVsZXRlKGspO1xuXG4gIGNvbnN0IGdldFNvcnRlZEtleXMgPSAoKSA9PiB7XG4gICAgaWYgKHNvcnRlZEtleXNNZW1vID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNvcnRlZEtleXNNZW1vID0gaGFyZGVuKFsuLi5nZXRSYXdLZXlzKCldLnNvcnQoY29tcGFyZSkpO1xuICAgIH1cbiAgICByZXR1cm4gc29ydGVkS2V5c01lbW87XG4gIH07XG5cbiAgY29uc3QgaXRlcmFibGVLZXlzID0gRmFyKCdJdGVyYWJsZSBvZiBrZXlzJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBnZW5lcmF0aW9uID0gdXBkYXRlQ291bnQ7XG4gICAgICBnZXRTb3J0ZWRLZXlzKCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFRTIGRvZXNuJ3QgdHJhY2sgdGhhdCBzb3J0ZWRLZXlzTWVtbyBpcyBkZWZpbmVkKi9cbiAgICAgIGNvbnN0IGxlbiA9IHNvcnRlZEtleXNNZW1vLmxlbmd0aDtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHJldHVybiBGYXIoJ0l0ZXJhdG9yIG9mIGtleXMnLCB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBnZW5lcmF0aW9uID09PSB1cGRhdGVDb3VudCB8fCBGYWlsYFN0b3JlICR7cShrZXlOYW1lKX0gY3Vyc29yIHN0YWxlYDtcbiAgICAgICAgICAvKiBJZiB0aGV5J3JlIGVxdWFsLCB0aGVuIHRoZSBzb3J0ZWRLZXlNZW1vIGlzIHRoZSBzYW1lIG9uZSovXG4gICAgICAgICAgLyogd2Ugc3RhcnRlZCB3aXRoLiovXG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUUyBkb2Vzbid0IHRyYWNrIHRoYXQgc29ydGVkS2V5c01lbW8gaXMgZGVmaW5lZCovXG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gc29ydGVkS2V5c01lbW9baV07XG4gICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgaWYgKGNoZWNrSGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oLyoqIEB0eXBlIHtjb25zdH0gKi8gKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge2NvbnN0fSAqLyAoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGFzc2VydFVwZGF0ZU9uQWRkLFxuICAgIGFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuICAgIGl0ZXJhYmxlS2V5cyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQ3VycmVudEtleXNLaXQobWFrZUN1cnJlbnRLZXlzS2l0KTtcbmhhcmRlbihtYWtlQ3VycmVudEtleXNLaXQpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVMYXp5YCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuIElmIHRoZXJlXG4gKiBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSwgY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhc1xuICogdGhlIHZhbHVlIGZvciB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SywgVj59IG1hcFN0b3JlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBWfSBtYWtlVmFsdWVcbiAqIEByZXR1cm5zIHtWfVxuICovXG4gICAgICAgY29uc3QgcHJvdmlkZUxhenkgPSAobWFwU3RvcmUsIGtleSwgbWFrZVZhbHVlKSA9PiB7XG4gIGlmICghbWFwU3RvcmUuaGFzKGtleSkpIHtcbiAgICBtYXBTdG9yZS5pbml0KGtleSwgbWFrZVZhbHVlKGtleSkpO1xuICB9XG4gIHJldHVybiBtYXBTdG9yZS5nZXQoa2V5KTtcbn07JGjNj19vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qKlxuICogSGVscGVyIGZvciB1c2UgY2FzZXMgaW4gd2hpY2ggdGhlIG1ha2VyIGZ1bmN0aW9uIGlzIGFzeW5jLiBGb3IgdHdvXG4gKiBwcm92aWRlTGF6eSBjYWxscyB3aXRoIHRoZSBzYW1lIGtleSwgb25lIG1heSBiZSBtYWtpbmcgd2hlbiB0aGUgb3RoZXIgY2FsbFxuICogc3RhcnRzIGFuZCBpdCB3b3VsZCBtYWtlIGFnYWluLiAoVGhlbiB0aGVyZSdkIGJlIGEgY29sbGlzaW9uIHdoZW4gdGhlIHNlY29uZFxuICogdHJpZXMgdG8gc3RvcmUgdGhlIGtleS4pIFRoaXMgcHJldmVudHMgdGhhdCByYWNlIGNvbmRpdGlvbiBieSBpbW1lZGlhdGVseVxuICogc3RvcmluZyBhIFByb21pc2UgZm9yIHRoZSBtYWtlciBpbiBhbiBlcGhlbWVyYWwgc3RvcmUuXG4gKlxuICogV2hlbiB0aGUgYHN0b3JlYCBhcmd1bWVudCBpcyBkdXJhYmxlIHN0b3JhZ2UsIG5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvclxuICogdGVybWluYXRpb24gdG8gaGFwcGVuIGFmdGVyIHRoZSBtYWtlIGNvbXBsZXRlcyBhbmQgYmVmb3JlIGl0IHJlYWNoZXMgZHVyYWJsZVxuICogc3RvcmFnZS5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SywgVj59IHN0b3JlXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQXRvbWljUHJvdmlkZXIgPSBzdG9yZSA9PiB7XG4gIC8qKiBAdHlwZSB7TWFwPEssIFByb21pc2U8Vj4+fSAqL1xuICBjb25zdCBwZW5kaW5nID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICogQ2FsbCBgcHJvdmlkZUFzeW5jYCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIHdoZW5cbiAqIHRoZSBtYWtlciBpcyBhc3luY2hyb25vdXMuIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yIHRoYXQga2V5LCBhbmQgcmV0dXJuXG4gKiBpdC5cbiAqXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBQcm9taXNlPFY+fSBtYWtlVmFsdWUgbWFrZSB0aGUgdmFsdWUgZm9yIHRoZSBzdG9yZSBpZlxuICogICBpdCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciB0aGUgbGFzdCBtYWtlIGZhaWxlZFxuICogQHBhcmFtIHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gUHJvbWlzZTx2b2lkPn0gW2ZpbmlzaFZhbHVlXSBydW5zIGV4YWN0bHlcbiAqICAgb25jZSBhZnRlciBhIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgc3RvcmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFY+fVxuICovXG4gIGNvbnN0IHByb3ZpZGVBc3luYyA9IChrZXksIG1ha2VWYWx1ZSwgZmluaXNoVmFsdWUpID0+IHtcbiAgICBpZiAoc3RvcmUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3RvcmUuZ2V0KGtleSkpO1xuICAgIH1cbiAgICBpZiAoIXBlbmRpbmcuaGFzKGtleSkpIHtcbiAgICAgIGNvbnN0IHZhbFAgPSBtYWtlVmFsdWUoa2V5KVxuICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICBzdG9yZS5pbml0KGtleSwgdik7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHYgPT4ge1xuICAgICAgICAgIGlmIChmaW5pc2hWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmlzaFZhbHVlKGtleSwgdikudGhlbigoKSA9PiB2KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICBwZW5kaW5nLmRlbGV0ZShrZXkpO1xuICAgICAgICB9KTtcbiAgICAgIHBlbmRpbmcuc2V0KGtleSwgdmFsUCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbFAgPSBwZW5kaW5nLmdldChrZXkpO1xuICAgIGFzc2VydCh2YWxQKTtcbiAgICByZXR1cm4gdmFsUDtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHJvdmlkZUFzeW5jIH0pO1xufTskaM2PX29uY2UubWFrZUF0b21pY1Byb3ZpZGVyKG1ha2VBdG9taWNQcm92aWRlcik7XG5oYXJkZW4obWFrZUF0b21pY1Byb3ZpZGVyKTtcbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXRvbWljUHJvdmlkZXI8SywgVj4+fSBBdG9taWNQcm92aWRlcjxLLCBWPlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7TWFwU3RvcmU8SywgVltdPn0gbWFwU3RvcmVcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0ge1Z9IGl0ZW1cbiAqL1xuICAgICAgIGNvbnN0IGFwcGVuZFRvU3RvcmVkQXJyYXkgPSAobWFwU3RvcmUsIGtleSwgaXRlbSkgPT4ge1xuICBpZiAobWFwU3RvcmUuaGFzKGtleSkpIHtcbiAgICBjb25zdCBleHRhbnQgPSBtYXBTdG9yZS5nZXQoa2V5KTtcbiAgICBtYXBTdG9yZS5zZXQoa2V5LCBoYXJkZW4oWy4uLmV4dGFudCwgaXRlbV0pKTtcbiAgfSBlbHNlIHtcbiAgICBtYXBTdG9yZS5pbml0KGtleSwgaGFyZGVuKFtpdGVtXSkpO1xuICB9XG59OyRozY9fb25jZS5hcHBlbmRUb1N0b3JlZEFycmF5KGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xuaGFyZGVuKGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiaXNDb3B5TWFwIjpbImlzQ29weU1hcCIsZmFsc2VdLCJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0IixmYWxzZV19LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUN1cnJlbnRLZXlzS2l0IjpbIm1ha2VDdXJyZW50S2V5c0tpdCJdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSJdLCJtYWtlQXRvbWljUHJvdmlkZXIiOlsibWFrZUF0b21pY1Byb3ZpZGVyIl0sImFwcGVuZFRvU3RvcmVkQXJyYXkiOlsiYXBwZW5kVG9TdG9yZWRBcnJheSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO31mJswAgAAMAIAABwAAABAYWdvcmljL3RpbWUtdjAuMy4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3RpbWVNYXRoLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvdGltZU1hdGguanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALQzbZQKJQAACiUAACMAAABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90aW1lTWF0aC5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiVGltZU1hdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsRmFpbCxxLG11c3RNYXRjaCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxUaW1lc3RhbXBSZWNvcmRTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSA9ICRozY9fYSldXSxbXCJUaW1lc3RhbXBSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFJlY29yZFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZWxhdGl2ZVRpbWUsIFJlbGF0aXZlVGltZVZhbHVlLCBUaW1lckJyYW5kLCBUaW1lTWF0aFR5cGUsIFRpbWVzdGFtcCwgVGltZXN0YW1wUmVjb3JkLCBUaW1lc3RhbXBWYWx1ZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtSYW5rQ29tcGFyaXNvbn0gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKi9cblxuLyoqXG4gKiBgYWdyZWVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUuXG4gKlxuICogQHBhcmFtIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfSBsZWZ0QnJhbmRcbiAqIEBwYXJhbSB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH0gcmlnaHRCcmFuZFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGFncmVlZFRpbWVyQnJhbmQgPSAobGVmdEJyYW5kLCByaWdodEJyYW5kKSA9PiB7XG4gIGlmIChsZWZ0QnJhbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChyaWdodEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByaWdodEJyYW5kO1xuICAgIH1cbiAgfSBlbHNlIGlmIChyaWdodEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbGVmdEJyYW5kO1xuICB9IGVsc2Uge1xuICAgIGxlZnRCcmFuZCA9PT0gcmlnaHRCcmFuZCB8fFxuICAgICAgRmFpbGBUaW1lckJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdEJyYW5kKX0gdnMgJHtxKHJpZ2h0QnJhbmQpfWA7XG4gICAgcmV0dXJuIGxlZnRCcmFuZDtcbiAgfVxufTtcblxuLyoqXG4gKiBgc2hhcmVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCBpbXBsZW1lbnRzIHRoZVxuICogdHJhbnNpdGlvbmFsIGJyYW5kIGNoZWNraW5nIGFuZCBjb250YWlnaW9uIGxvZ2ljIGV4cGxhaW5lZCBpbiB0aGUgYFRpbWVNYXRoYFxuICogY29tbWVudC4gSXQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGJpbmFyeSBvcGVyYXRvcnMgdGhhdCBzaG91bGQgZm9sbG93XG4gKiB0aGlzIGxvZ2ljLiBJdCBkb2VzIHRoZSBlcnJvciBjaGVja2luZyBiZXR3ZWVuIHRoZSBvcGVyYW5kcywgYW5kIHJldHVybnNcbiAqIHRoZSBicmFuZCwgaWYgYW55LCB0aGF0IHNob3VsZCBsYWJlbCB0aGUgcmVzdWx0aW5nIHRpbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IHNoYXJlZFRpbWVyQnJhbmQgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgY29uc3QgbGVmdEJyYW5kID0gdHlwZW9mIGxlZnQgPT09ICdiaWdpbnQnID8gdW5kZWZpbmVkIDogbGVmdC50aW1lckJyYW5kO1xuICBjb25zdCByaWdodEJyYW5kID0gdHlwZW9mIHJpZ2h0ID09PSAnYmlnaW50JyA/IHVuZGVmaW5lZCA6IHJpZ2h0LnRpbWVyQnJhbmQ7XG4gIHJldHVybiBhZ3JlZWRUaW1lckJyYW5kKGxlZnRCcmFuZCwgcmlnaHRCcmFuZCk7XG59O1xuXG4vKipcbiAqIGBhYnNMaWtlYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnlcbiAqIG9wZXJhdG9ycyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgYSBgVGltZXN0YW1wYFxuICogcmF0aGVyIHRoYW4gYSBgUmVsYXRpdmVUaW1lYC5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcFZhbHVlfSBhYnNWYWx1ZVxuICogQHJldHVybnMge1RpbWVzdGFtcH1cbiAqL1xuY29uc3QgYWJzTGlrZSA9IChsZWZ0LCByaWdodCwgYWJzVmFsdWUpID0+IHtcbiAgTmF0KGFic1ZhbHVlKTtcbiAgY29uc3QgdGltZXJCcmFuZCA9IHNoYXJlZFRpbWVyQnJhbmQobGVmdCwgcmlnaHQpO1xuICBpZiAodGltZXJCcmFuZCkge1xuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgdGltZXJCcmFuZCxcbiAgICAgIGFic1ZhbHVlLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhYnNWYWx1ZTtcbiAgfVxufTtcblxuLyoqXG4gKiBgcmVsTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFJlbGF0aXZlVGltZWBcbiAqIHJhdGhlciB0aGFuIGEgYFRpbWVzdGFtcGAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWVWYWx1ZX0gcmVsVmFsdWVcbiAqIEByZXR1cm5zIHtSZWxhdGl2ZVRpbWV9XG4gKi9cbmNvbnN0IHJlbExpa2UgPSAobGVmdCwgcmlnaHQsIHJlbFZhbHVlKSA9PiB7XG4gIE5hdChyZWxWYWx1ZSk7XG4gIGNvbnN0IHRpbWVyQnJhbmQgPSBzaGFyZWRUaW1lckJyYW5kKGxlZnQsIHJpZ2h0KTtcbiAgaWYgKHRpbWVyQnJhbmQpIHtcbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHRpbWVyQnJhbmQsXG4gICAgICByZWxWYWx1ZSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVsVmFsdWU7XG4gIH1cbn07XG5cbi8qIEZvciBhbGwgdGhlIGZvbGxvd2luZyB0aW1lIG9wZXJhdG9ycywgdGhlaXIgZG9jdW1lbnRhdGlvbiBpcyBpbiovXG4vKiB0aGUgYFRpbWVNYXRoVHlwZWAsIHNpbmNlIHRoYXQgaXMgdGhlIGRvY3VtZW50YXRpb24gdGhhdCBzaG93cyB1cCovXG4vKiBpbiB0aGUgSURFLiBXZWxsLCBhdCBsZWFzdCB0aGUgdnNjb2RlIElERS4qL1xuXG5jb25zdCBhYnNWYWx1ZSA9IGFicyA9PiB7XG4gIGlmICh0eXBlb2YgYWJzID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBOYXQoYWJzKTtcbiAgfVxuICBtdXN0TWF0Y2goYWJzLCBUaW1lc3RhbXBSZWNvcmRTaGFwZSwgJ3RpbWVzdGFtcCcpO1xuICByZXR1cm4gTmF0KGFicy5hYnNWYWx1ZSk7XG59O1xuXG5jb25zdCByZWxWYWx1ZSA9IHJlbCA9PiB7XG4gIGlmICh0eXBlb2YgcmVsID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBOYXQocmVsKTtcbiAgfVxuICBtdXN0TWF0Y2gocmVsLCBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSwgJ3JlbGF0aXZlJyk7XG4gIHJldHVybiBOYXQocmVsLnJlbFZhbHVlKTtcbn07XG5cbmNvbnN0IG1ha2VUaW1lc3RhbXBSZWNvcmQgPSAoYWJzLCB0aW1lckJyYW5kKSA9PlxuICBoYXJkZW4oeyBhYnNWYWx1ZTogYWJzLCB0aW1lckJyYW5kIH0pO1xuY29uc3QgbWFrZVJlbGF0aXZlVGltZVJlY29yZCA9IChyZWwsIHRpbWVyQnJhbmQpID0+XG4gIGhhcmRlbih7IHJlbFZhbHVlOiByZWwsIHRpbWVyQnJhbmQgfSk7XG5cbmNvbnN0IGNvZXJjZVRpbWVzdGFtcFJlY29yZCA9ICh0cywgYnJhbmQpID0+IHtcbiAgYnJhbmQgfHwgRmFpbGBtdXN0IGhhdmUgYSBicmFuZGA7XG4gIGlmICh0eXBlb2YgdHMgPT09ICdudW1iZXInKSB7XG4gICAgdHMgPSBOYXQodHMpO1xuICB9XG4gIGlmICh0eXBlb2YgdHMgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIG1ha2VUaW1lc3RhbXBSZWNvcmQodHMsIGJyYW5kKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHRpbWVyQnJhbmQgfSA9IHRzO1xuICAgIG11c3RNYXRjaCh0cywgVGltZXN0YW1wUmVjb3JkU2hhcGUsICd0aW1lc3RhbXAnKTtcbiAgICBhZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsIGJyYW5kKTtcbiAgICByZXR1cm4gdHM7XG4gIH1cbn07XG5cbmNvbnN0IGNvZXJjZVJlbGF0aXZlVGltZVJlY29yZCA9IChydCwgYnJhbmQpID0+IHtcbiAgYnJhbmQgfHwgRmFpbGBtdXN0IGhhdmUgYSBicmFuZGA7XG4gIGlmICh0eXBlb2YgcnQgPT09ICdudW1iZXInKSB7XG4gICAgcnQgPSBOYXQocnQpO1xuICB9XG4gIGlmICh0eXBlb2YgcnQgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIG1ha2VSZWxhdGl2ZVRpbWVSZWNvcmQocnQsIGJyYW5kKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHRpbWVyQnJhbmQgfSA9IHJ0O1xuICAgIG11c3RNYXRjaChydCwgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsICdyZWxhdGl2ZVRpbWUnKTtcbiAgICBhZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsIGJyYW5kKTtcbiAgICByZXR1cm4gcnQ7XG4gIH1cbn07XG5cbmNvbnN0IGFkZEFic1JlbCA9IChhYnMsIHJlbCkgPT5cbiAgYWJzTGlrZShhYnMsIHJlbCwgYWJzVmFsdWUoYWJzKSArIHJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBhZGRSZWxSZWwgPSAocmVsMSwgcmVsMikgPT5cbiAgcmVsTGlrZShyZWwxLCByZWwyLCByZWxWYWx1ZShyZWwxKSArIHJlbFZhbHVlKHJlbDIpKTtcblxuY29uc3Qgc3VidHJhY3RBYnNBYnMgPSAoYWJzMSwgYWJzMikgPT5cbiAgcmVsTGlrZShhYnMxLCBhYnMyLCBhYnNWYWx1ZShhYnMxKSAtIGFic1ZhbHVlKGFiczIpKTtcblxuY29uc3QgY2xhbXBlZFN1YnRyYWN0QWJzQWJzID0gKGFiczEsIGFiczIpID0+IHtcbiAgY29uc3QgdmFsMSA9IGFic1ZhbHVlKGFiczEpO1xuICBjb25zdCB2YWwyID0gYWJzVmFsdWUoYWJzMik7XG4gIHJldHVybiByZWxMaWtlKGFiczEsIGFiczIsIHZhbDEgPiB2YWwyID8gdmFsMSAtIHZhbDIgOiAwbik7XG59O1xuXG5jb25zdCBzdWJ0cmFjdEFic1JlbCA9IChhYnMsIHJlbCkgPT5cbiAgYWJzTGlrZShhYnMsIHJlbCwgYWJzVmFsdWUoYWJzKSAtIHJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBzdWJ0cmFjdFJlbFJlbCA9IChyZWwxLCByZWwyKSA9PlxuICByZWxMaWtlKHJlbDEsIHJlbDIsIHJlbFZhbHVlKHJlbDEpIC0gcmVsVmFsdWUocmVsMikpO1xuXG5jb25zdCBpc1JlbFplcm8gPSByZWwgPT4gcmVsVmFsdWUocmVsKSA9PT0gMG47XG5cbmNvbnN0IG11bHRpcGx5UmVsTmF0ID0gKHJlbCwgbmF0KSA9PiByZWxMaWtlKHJlbCwgbmF0LCByZWxWYWx1ZShyZWwpICogbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsTmF0ID0gKHJlbCwgbmF0KSA9PiByZWxMaWtlKHJlbCwgbmF0LCByZWxWYWx1ZShyZWwpIC8gbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsUmVsID0gKHJlbDEsIHJlbDIpID0+IHtcbiAgc2hhcmVkVGltZXJCcmFuZChyZWwxLCByZWwyKTsgLyoganVzdCBlcnJvciBjaGVjayovXG4gIHJldHVybiByZWxWYWx1ZShyZWwxKSAvIHJlbFZhbHVlKHJlbDIpO1xufTtcblxuY29uc3QgbW9kQWJzUmVsID0gKGFicywgc3RlcCkgPT5cbiAgcmVsTGlrZShhYnMsIHN0ZXAsIGFic1ZhbHVlKGFicykgJSByZWxWYWx1ZShzdGVwKSk7XG5cbmNvbnN0IG1vZFJlbFJlbCA9IChyZWwsIHN0ZXApID0+XG4gIHJlbExpa2UocmVsLCBzdGVwLCByZWxWYWx1ZShyZWwpICUgcmVsVmFsdWUoc3RlcCkpO1xuXG4vKipcbiAqIGBjb21wYXJlVmFsdWVzYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50XG4gKiB0aGUgdGltZSBjb21wYXJpc29uIG9wZXJhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge2JpZ2ludH0gdjFcbiAqIEBwYXJhbSB7YmlnaW50fSB2MlxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG5jb25zdCBjb21wYXJlVmFsdWVzID0gKGxlZnQsIHJpZ2h0LCB2MSwgdjIpID0+IHtcbiAgc2hhcmVkVGltZXJCcmFuZChsZWZ0LCByaWdodCk7XG4gIGlmICh2MSA8IHYyKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2UgaWYgKHYxID09PSB2Mikge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIGFzc2VydCh2MSA+IHYyKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTtcblxuLyoqXG4gKiBUaGUgYFRpbWVNYXRoYCBvYmplY3QgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdG8gZG8gYXJpdGhtZXRpYyBvbiBsYWJlbGVkXG4gKiB0aW1lIHZhbHVlcywgbXVjaCBsaWtlIGBBbW91bnRNYXRoYCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBkbyBhcml0aG1ldGljXG4gKiBvbiBsYWJlbGVkIGFzc2V0L21vbmV5IHZhbHVlcy4gQm90aCBjaGVjayBmb3IgY29uc2lzdGVuY3kgb2YgbGFiZWxzOiBhXG4gKiBiaW5hcnkgb3BlcmF0aW9uIG9uIHR3byBsYWJlbGVkIG9iamVjdHMgZW5zdXJlcyB0aGF0IHRoZSBib3RoIGNhcnJ5XG4gKiB0aGUgc2FtZSBsYWJlbC4gSWYgdGhleSBwcm9kdWNlIGFub3RoZXIgb2JqZWN0IGZyb20gdGhlIHNhbWUgZG9tYWluLCBpdFxuICogd2lsbCBjYXJyeSB0aGUgc2FtZSBsYWJlbC4gSWYgdGhlIG9wZXJhbmRzIGhhdmUgaW5jb21wYXRpYmxlIGxhYmVscyxcbiAqIGFuIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBVbmxpa2UgYW1vdW50IGFyaXRobWV0aWMsIHRpbWUgYXJpdGhtZXRpYyBkZWFscyBpbiB0d28ga2luZHMgb2YgdGltZSBvYmplY3RzOlxuICogVGltZXN0YW1wcywgd2hpY2ggcmVwcmVzZW50IGFic29sdXRlIHRpbWUsIGFuZCBSZWxhdGl2ZVRpbWUsIHdoaWNoIHJlcHJlc2VudHNcbiAqIHRoZSBkdXJhdGlvbiBiZXR3ZWVuIHR3byBhYnNvbHV0ZSB0aW1lcy4gQm90aCBraW5kcyBvZiB0aW1lIG9iamVjdFxuICogYXJlIGxhYmVsZWQgYnkgYSBgVGltZXJCcmFuZGAuIEZvciBhIFRpbWVzdGFtcCBvYmplY3QsIHRoZSB2YWx1ZSBpc1xuICogYSBiaWdpbnQgaW4gYW4gYGFic1ZhbHVlYCBwcm9wZXJ0eS4gRm9yIGEgUmVsYXRpdmVUaW1lIG9iamVjdCwgdGhlIHZhbHVlXG4gKiBpcyBhIGJpZ2ludCBpbiBhIGByZWxWYWx1ZWAgcHJvcGVydHkuIFRodXMgd2UgaGF2ZSBhIHJ1bnRpbWUgc2FmZXR5IGNoZWNrXG4gKiB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBjb25mdXNlZCB0aGUgdHdvLCBldmVuIGlmIHdlIGhhdmUgbWFuYWdlZCB0byBmb29sXG4gKiB0aGUgKHVuc291bmQpIHN0YXRpYyB0eXBlIHN5c3RlbS5cbiAqXG4gKiBBcyBhIHRyYW5zaXRpb25hbCBtZWFzdXJlLCBjdXJyZW50bHkgbWFueSBUaW1lc3RhbXBzIGFuZCBSZWxhdGl2ZVRpbWVzIGFyZVxuICogc3RpbGwgcmVwcmVzZW50ZWQgYnkgdW5sYWJlbGVkIGJpZ2ludHMuIER1cmluZyB0aGlzIHRyYW5zaXRpb25hbCBwZXJpb2QsXG4gKiB3ZSBhbGxvdyB0aGlzLCBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5LiBGb3IgYSBub3JtYWwgYmluYXJ5XG4gKiBvcGVyYXRpb24sIGlmIGJvdGggaW5wdXRzIGFyZSBsYWJlbGVkLCB0aGVuIHdlIGRvIHRoZSBmdWxsIGNoZWNraW5nIGFzXG4gKiBleHBsYWluZWQgYWJvdmUgYW5kIHJldHVybiBhIGxhYmVsZWQgcmVzdWx0LiBJZiBib3RoIGlucHV0cyBhcmUgdW5sYWJlbGVkXG4gKiBiaWdpbnRzLCB3ZSAqYXNzdW1lKiB0aGF0IHRoZXkgaW5kaWNhdGUgYSB0aW1lIG9mIHRoZSByaWdodCBraW5kXG4gKiAoVGltZXN0YW1wIHZzIFJlbGF0aXZlVGltZSkgYW5kIHRpbWVyIGJyYW5kLiBTaW5jZSB3ZSBkb24ndCBrbm93IHdoYXRcbiAqIGJyYW5kIHdhcyBpbnRlbmRlZCwgd2UgY2FuIG9ubHkgcmV0dXJuIHlldCBhbm90aGVyIHVubGFiZWxlZCBiaWdpbnQuXG4gKlxuICogSWYgb25lIG9wZXJhbmQgaXMgbGFiZWxlZCBhbmQgdGhlIG90aGVyIGlzIG5vdCwgd2UgY2hlY2sgdGhlIGxhYmVsZWQgb3BlcmFuZCxcbiAqICphc3N1bWUqIHRoZSB1bmxhYmVsZWQgYmlnaW50IHJlcHJlc2VudHMgdGhlIHZhbHVlIG5lZWRlZCBmb3IgdGhlIG90aGVyXG4gKiBvcGVyYW5kLCBhbmQgcmV0dXJuIGEgbGFiZWxlZCB0aW1lIG9iamVjdCB3aXRoIHRoZSBicmFuZCBvZiB0aGUgbGFiZWxlZFxuICogb3BlcmFuZC5cbiAqXG4gKiBAdHlwZSB7VGltZU1hdGhUeXBlfVxuICovXG4gICAgICAgY29uc3QgVGltZU1hdGggPSBoYXJkZW4oe1xuICBhYnNWYWx1ZSxcbiAgcmVsVmFsdWUsXG4gIGNvZXJjZVRpbWVzdGFtcFJlY29yZCxcbiAgY29lcmNlUmVsYXRpdmVUaW1lUmVjb3JkLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIHh4eCBkeW5hbWljIHR5cGluZyovXG4gIGFkZEFic1JlbCxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciB4eHggZHluYW1pYyB0eXBpbmcqL1xuICBhZGRSZWxSZWwsXG4gIHN1YnRyYWN0QWJzQWJzLFxuICBjbGFtcGVkU3VidHJhY3RBYnNBYnMsXG4gIHN1YnRyYWN0QWJzUmVsLFxuICBzdWJ0cmFjdFJlbFJlbCxcbiAgaXNSZWxaZXJvLFxuICBtdWx0aXBseVJlbE5hdCxcbiAgZGl2aWRlUmVsTmF0LFxuICBkaXZpZGVSZWxSZWwsXG4gIG1vZEFic1JlbCxcbiAgbW9kUmVsUmVsLFxuICBjb21wYXJlQWJzOiAoYWJzMSwgYWJzMikgPT5cbiAgICBjb21wYXJlVmFsdWVzKGFiczEsIGFiczIsIGFic1ZhbHVlKGFiczEpLCBhYnNWYWx1ZShhYnMyKSksXG4gIGNvbXBhcmVSZWw6IChyZWwxLCByZWwyKSA9PlxuICAgIGNvbXBhcmVWYWx1ZXMocmVsMSwgcmVsMiwgcmVsVmFsdWUocmVsMSksIHJlbFZhbHVlKHJlbDIpKSxcbn0pOyRozY9fb25jZS5UaW1lTWF0aChUaW1lTWF0aCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUaW1lTWF0aCI6WyJUaW1lTWF0aCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA09hXE8wkAAPMJAAAlAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIiwiUmVsYXRpdmVUaW1lU2hhcGUiLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIiwiVGltZXJCcmFuZFNoYXBlIiwiVGltZXJTZXJ2aWNlU2hhcGUiLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSIsIlRpbWVzdGFtcFNoYXBlIiwiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE07JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtUaW1lc3RhbXBSZWNvcmQsIFRpbWVzdGFtcFZhbHVlLCBSZWxhdGl2ZVRpbWVWYWx1ZSwgUmVsYXRpdmVUaW1lUmVjb3JkfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4gICAgICAgY29uc3QgVGltZXJCcmFuZFNoYXBlID0gTS5yZW1vdGFibGUoJ1RpbWVyQnJhbmQnKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48YmlnaW50Pn0gKi8kaM2PX29uY2UuVGltZXJCcmFuZFNoYXBlKFRpbWVyQnJhbmRTaGFwZSk7XG4gICAgICAgY29uc3QgVGltZXN0YW1wVmFsdWVTaGFwZSA9IE0ubmF0KCk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPGJpZ2ludD59ICovJGjNj19vbmNlLlRpbWVzdGFtcFZhbHVlU2hhcGUoVGltZXN0YW1wVmFsdWVTaGFwZSk7XG4gICAgICAgY29uc3QgUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSA9IE0ubmF0KCk7IC8qIFNob3VsZCB3ZSBhbGxvdyBuZWdhdGl2ZXM/Ki9cblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48VGltZXN0YW1wUmVjb3JkPn0gKi8kaM2PX29uY2UuUmVsYXRpdmVUaW1lVmFsdWVTaGFwZShSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTtcbiAgICAgICBjb25zdCBUaW1lc3RhbXBSZWNvcmRTaGFwZSA9IHtcbiAgdGltZXJCcmFuZDogVGltZXJCcmFuZFNoYXBlLFxuICBhYnNWYWx1ZTogVGltZXN0YW1wVmFsdWVTaGFwZSxcbn07JGjNj19vbmNlLlRpbWVzdGFtcFJlY29yZFNoYXBlKFRpbWVzdGFtcFJlY29yZFNoYXBlKTtcbmhhcmRlbihUaW1lc3RhbXBSZWNvcmRTaGFwZSk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFJlbGF0aXZlVGltZVJlY29yZD59ICovXG4gICAgICAgY29uc3QgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUgPSB7XG4gIHRpbWVyQnJhbmQ6IFRpbWVyQnJhbmRTaGFwZSxcbiAgcmVsVmFsdWU6IFJlbGF0aXZlVGltZVZhbHVlU2hhcGUsXG59OyRozY9fb25jZS5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZShSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSk7XG5oYXJkZW4oUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxUaW1lc3RhbXBSZWNvcmQgfCBUaW1lc3RhbXBWYWx1ZT59ICovXG4gICAgICAgY29uc3QgVGltZXN0YW1wU2hhcGUgPSBNLm9yKFRpbWVzdGFtcFJlY29yZFNoYXBlLCBUaW1lc3RhbXBWYWx1ZVNoYXBlKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48UmVsYXRpdmVUaW1lUmVjb3JkIHwgUmVsYXRpdmVUaW1lVmFsdWU+fSAqLyRozY9fb25jZS5UaW1lc3RhbXBTaGFwZShUaW1lc3RhbXBTaGFwZSk7XG4gICAgICAgY29uc3QgUmVsYXRpdmVUaW1lU2hhcGUgPSBNLm9yKFxuICBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxcbiAgUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSxcbik7JGjNj19vbmNlLlJlbGF0aXZlVGltZVNoYXBlKFJlbGF0aXZlVGltZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IFRpbWVyU2VydmljZVNoYXBlID0gTS5yZW1vdGFibGUoJ1RpbWVyU2VydmljZScpOyRozY9fb25jZS5UaW1lclNlcnZpY2VTaGFwZShUaW1lclNlcnZpY2VTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUaW1lckJyYW5kU2hhcGUiOlsiVGltZXJCcmFuZFNoYXBlIl0sIlRpbWVzdGFtcFZhbHVlU2hhcGUiOlsiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIjpbIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiXSwiVGltZXN0YW1wUmVjb3JkU2hhcGUiOlsiVGltZXN0YW1wUmVjb3JkU2hhcGUiXSwiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiOlsiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiXSwiVGltZXN0YW1wU2hhcGUiOlsiVGltZXN0YW1wU2hhcGUiXSwiUmVsYXRpdmVUaW1lU2hhcGUiOlsiUmVsYXRpdmVUaW1lU2hhcGUiXSwiVGltZXJTZXJ2aWNlU2hhcGUiOlsiVGltZXJTZXJ2aWNlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADYPWJQtLAAALSwAACgAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzIiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiaWdub3JlQ29udGV4dCIsIm1ha2VFeG9VdGlscyIsInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvQ2xhc3MiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlU2luZ2xldG9uIiwicHJvdmlkZUtpbmRIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpbml0RW1wdHkscHJvdmlkZSxnbG9iYWxWYXREYXRhOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsWyRozY9fYSA9PiAoaW5pdEVtcHR5ID0gJGjNj19hKV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wicHJvdmlkZVwiLFskaM2PX2EgPT4gKHByb3ZpZGUgPSAkaM2PX2EpXV0sW1wiVmF0RGF0YVwiLFskaM2PX2EgPT4gKGdsb2JhbFZhdERhdGEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1JlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlLCBEZWZpbmVLaW5kT3B0aW9ucywgRHVyYWJsZUtpbmRIYW5kbGUsIEludGVyZmFjZUd1YXJkS2l0fSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtQbHVzQ29udGV4dH0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7VmF0RGF0YX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7UHJlcGFyZUtpbmR9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge1ByZXBhcmVLaW5kTXVsdGl9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge0d1YXJkZWR9IGZyb20gJ0BlbmRvL2V4byc7XG4gKiBAaW1wb3J0IHtHdWFyZGVkS2l0fSBmcm9tICdAZW5kby9leG8nO1xuICovXG5cbi8qIFNvbWUgZmVlZGJhY2sgaWYgdGhlIGluaXQgZnVuY3Rpb24gaXMgYXN5bmMqL1xuLyoqXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEluaXRTdGF0ZVxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxJPiBleHRlbmRzIFByb21pc2U8YW55PiA/IG5ldmVyIDogUmV0dXJuVHlwZTxJPn0gU3RhdGVSZXN1bHRcbiAqL1xuXG4vKipcbiAqIE1ha2UgYSB2ZXJzaW9uIG9mIHRoZSBhcmd1bWVudCBmdW5jdGlvbiB0aGF0IHRha2VzIGEga2luZCBjb250ZXh0IGJ1dCBpZ25vcmVzXG4gKiBpdC5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyAoLi4uYXJnczogYW55KSA9PiBhbnk+KFxuICogICBmbjogVCxcbiAqICkgPT4gUGx1c0NvbnRleHQ8bmV2ZXIsIFQ+fVxuICovXG4gICAgICAgY29uc3QgaWdub3JlQ29udGV4dCA9XG4gIGZuID0+XG4gIChfY29udGV4dCwgLi4uYXJncykgPT5cbiAgICBmbiguLi5hcmdzKTskaM2PX29uY2UuaWdub3JlQ29udGV4dChpZ25vcmVDb250ZXh0KTtcbmhhcmRlbihpZ25vcmVDb250ZXh0KTtcblxuLyogVE9ETzogRmluZCBhIGdvb2QgaG9tZSBmb3IgdGhpcyBmdW5jdGlvbiB1c2VkIGJ5IEBhZ29yaWMvdmF0LWRhdGEgYW5kIHRlc3RpbmcgY29kZSovXG4vKiogQHBhcmFtIHtWYXREYXRhfSBWYXREYXRhICovXG4gICAgICAgY29uc3QgbWFrZUV4b1V0aWxzID0gVmF0RGF0YSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWZpbmVLaW5kLFxuICAgIGRlZmluZUtpbmRNdWx0aSxcbiAgICBkZWZpbmVEdXJhYmxlS2luZCxcbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpLFxuICAgIG1ha2VLaW5kSGFuZGxlLFxuICB9ID0gVmF0RGF0YTtcblxuICAvKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEByZXR1cm5zIHtEdXJhYmxlS2luZEhhbmRsZX1cbiAqL1xuICBjb25zdCBwcm92aWRlS2luZEhhbmRsZSA9IChiYWdnYWdlLCBraW5kTmFtZSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwgKCkgPT4gbWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTtcbiAgaGFyZGVuKHByb3ZpZGVLaW5kSGFuZGxlKTtcblxuICAvKipcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvQ2xhc3MgaW5zdGVhZFxuICogQHR5cGUge1ByZXBhcmVLaW5kfVxuICovXG4gIGNvbnN0IHByZXBhcmVLaW5kID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW5pdCxcbiAgICBiZWhhdmlvcixcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUtpbmQoXG4gICAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgICBpbml0LFxuICAgICAgYmVoYXZpb3IsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIGhhcmRlbihwcmVwYXJlS2luZCk7XG5cbiAgLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4b0NsYXNzS2l0IGluc3RlYWRcbiAqIEB0eXBlIHtQcmVwYXJlS2luZE11bHRpfVxuICovXG4gIGNvbnN0IHByZXBhcmVLaW5kTXVsdGkgPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBpbml0LFxuICAgIGJlaGF2aW9yLFxuICAgIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4gICkgPT5cbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpKFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW5pdCxcbiAgICAgIGJlaGF2aW9yLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUtpbmRNdWx0aSk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgVCBiZWhhdmlvclxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIHNlbGY6IFQ7XG4gKiAgICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogICB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIHNlbGY6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZDxUPn1cbiAqL1xuICBjb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MgPSAodGFnLCBpbnRlcmZhY2VHdWFyZCwgaW5pdCwgbWV0aG9kcywgb3B0aW9ucykgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUtpbmQodGFnLCBpbml0LCBtZXRob2RzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZEtpdCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIGZhY2V0czogR3VhcmRlZEtpdDxUPjtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZEtpdDxUPn1cbiAqL1xuICBjb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQgPSAoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIGluaXQsXG4gICAgZmFjZXRzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUtpbmRNdWx0aSh0YWcsIGluaXQsIGZhY2V0cywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRoaXNmdWxNZXRob2RzOiB0cnVlLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgfSk7XG4gIGhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtJbml0U3RhdGV9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBUO1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWQ8VD59XG4gKi9cbiAgY29uc3QgZGVmaW5lRHVyYWJsZUV4b0NsYXNzID0gKFxuICAgIGtpbmRIYW5kbGUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdCxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUR1cmFibGVLaW5kKGtpbmRIYW5kbGUsIGluaXQsIG1ldGhvZHMsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB0aGlzZnVsTWV0aG9kczogdHJ1ZSxcbiAgICAgIGludGVyZmFjZUd1YXJkLFxuICAgIH0pO1xuICBoYXJkZW4oZGVmaW5lRHVyYWJsZUV4b0NsYXNzKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkS2l0IHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJlxuICogICBUaGlzVHlwZTx7XG4gKiAgICAgZmFjZXRzOiBHdWFyZGVkS2l0PFQ+O1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIGZhY2V0czogVDtcbiAqICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiBHdWFyZGVkS2l0PFQ+fVxuICovXG4gIGNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCA9IChcbiAgICBraW5kSGFuZGxlLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIGluaXQsXG4gICAgZmFjZXRzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSwgaW5pdCwgZmFjZXRzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj59IFQgbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBSZW1vdGFibGVPYmplY3QgJiBUO1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWQ8VD59XG4gKi9cbiAgY29uc3QgcHJlcGFyZUV4b0NsYXNzID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdCxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4gICkgPT5cbiAgICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3MoXG4gICAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICAgIGluaXQsXG4gICAgICBtZXRob2RzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUV4b0NsYXNzKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZEtpdCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIGZhY2V0czogR3VhcmRlZEtpdDxUPjtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZEtpdDxUPn1cbiAqL1xuICBjb25zdCBwcmVwYXJlRXhvQ2xhc3NLaXQgPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICBpbml0LFxuICAgIGZhY2V0cyxcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgICBpbml0LFxuICAgICAgZmFjZXRzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUV4b0NsYXNzS2l0KTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7TSAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBSZW1vdGFibGVPYmplY3QgJiBNO1xuICogICB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IE0gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMge0d1YXJkZWQ8TT59XG4gKi9cbiAgY29uc3QgcHJlcGFyZUV4byA9IChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIG1ldGhvZHMsXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgY29uc3QgbWFrZVNpbmdsZXRvbiA9IHByZXBhcmVFeG9DbGFzcyhcbiAgICAgIGJhZ2dhZ2UsXG4gICAgICBraW5kTmFtZSxcbiAgICAgIGludGVyZmFjZUd1YXJkLFxuICAgICAgaW5pdEVtcHR5LFxuICAgICAgbWV0aG9kcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcblxuICAgIHJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9zaW5nbGV0b25gLCAoKSA9PiBtYWtlU2luZ2xldG9uKCkpO1xuICB9O1xuICBoYXJkZW4ocHJlcGFyZUV4byk7XG5cbiAgLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4byBpbnN0ZWFkLlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+fSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge019IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtHdWFyZGVkPE0+fVxuICovXG4gIGNvbnN0IHByZXBhcmVTaW5nbGV0b24gPSAoYmFnZ2FnZSwga2luZE5hbWUsIG1ldGhvZHMsIG9wdGlvbnMgPSB1bmRlZmluZWQpID0+XG4gICAgcHJlcGFyZUV4byhiYWdnYWdlLCBraW5kTmFtZSwgdW5kZWZpbmVkLCBtZXRob2RzLCBvcHRpb25zKTtcbiAgaGFyZGVuKHByZXBhcmVTaW5nbGV0b24pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGRlZmluZVZpcnR1YWxFeG9DbGFzcyxcbiAgICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuICAgIGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCxcbiAgICBwcmVwYXJlRXhvQ2xhc3MsXG4gICAgcHJlcGFyZUV4b0NsYXNzS2l0LFxuICAgIHByZXBhcmVFeG8sXG5cbiAgICBwcmVwYXJlU2luZ2xldG9uLFxuICAgIHByb3ZpZGVLaW5kSGFuZGxlLFxuICAgIHByZXBhcmVLaW5kLFxuICAgIHByZXBhcmVLaW5kTXVsdGksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUV4b1V0aWxzKG1ha2VFeG9VdGlscyk7XG5cbmNvbnN0IGdsb2JhbEV4b1V0aWxzID0gbWFrZUV4b1V0aWxzKGdsb2JhbFZhdERhdGEpO1xuXG4gICAgICAgY29uc3Qge1xuICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG4gIGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbiAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG4gIHByZXBhcmVFeG9DbGFzcyxcbiAgcHJlcGFyZUV4b0NsYXNzS2l0LFxuICBwcmVwYXJlRXhvLFxuICBwcmVwYXJlU2luZ2xldG9uLFxufSA9IGdsb2JhbEV4b1V0aWxzO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovJGjNj19vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzcyhkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpOyRozY9fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQoZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpOyRozY9fb25jZS5wcmVwYXJlRXhvQ2xhc3MocHJlcGFyZUV4b0NsYXNzKTskaM2PX29uY2UucHJlcGFyZUV4b0NsYXNzS2l0KHByZXBhcmVFeG9DbGFzc0tpdCk7JGjNj19vbmNlLnByZXBhcmVFeG8ocHJlcGFyZUV4byk7JGjNj19vbmNlLnByZXBhcmVTaW5nbGV0b24ocHJlcGFyZVNpbmdsZXRvbik7XG4gICAgICAgY29uc3QgeyBwcm92aWRlS2luZEhhbmRsZSwgcHJlcGFyZUtpbmQsIHByZXBhcmVLaW5kTXVsdGkgfSA9XG4gIGdsb2JhbEV4b1V0aWxzOyRozY9fb25jZS5wcm92aWRlS2luZEhhbmRsZShwcm92aWRlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByZXBhcmVLaW5kKHByZXBhcmVLaW5kKTskaM2PX29uY2UucHJlcGFyZUtpbmRNdWx0aShwcmVwYXJlS2luZE11bHRpKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCJdLCJtYWtlRXhvVXRpbHMiOlsibWFrZUV4b1V0aWxzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4b0NsYXNzIjpbInByZXBhcmVFeG9DbGFzcyJdLCJwcmVwYXJlRXhvQ2xhc3NLaXQiOlsicHJlcGFyZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG8iOlsicHJlcGFyZUV4byJdLCJwcmVwYXJlU2luZ2xldG9uIjpbInByZXBhcmVTaW5nbGV0b24iXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwicHJlcGFyZUtpbmQiOlsicHJlcGFyZUtpbmQiXSwicHJlcGFyZUtpbmRNdWx0aSI6WyJwcmVwYXJlS2luZE11bHRpIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM+c6+m2CAAAtggAACQAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCIuL2V4by11dGlscy5qcyJdLCJleHBvcnRzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtdXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtdXSxbXCIuL2V4by11dGlscy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvc3RvcmUiOltbIk0iLCJNIl0sWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjpbWyJtYWtlS2luZEhhbmRsZSIsIm1ha2VLaW5kSGFuZGxlIl0sWyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSxbIndhdGNoUHJvbWlzZSIsIndhdGNoUHJvbWlzZSJdLFsibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLFsiY2FuQmVEdXJhYmxlIiwiY2FuQmVEdXJhYmxlIl0sWyJwaWNrRmFjZXQiLCJwaWNrRmFjZXQiXSxbInBhcnRpYWxBc3NpZ24iLCJwYXJ0aWFsQXNzaWduIl0sWyJwcm92aWRlIiwicHJvdmlkZSJdLFsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl0sWyJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZCJdLFsiZGVmaW5lS2luZE11bHRpIiwiZGVmaW5lS2luZE11bHRpIl0sWyJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kIl0sWyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdXSwiLi9leG8tdXRpbHMuanMiOltbImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLFsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSxbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLFsicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzIl0sWyJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvIl0sWyJwcmVwYXJlU2luZ2xldG9uIiwicHJlcGFyZVNpbmdsZXRvbiJdLFsiaWdub3JlQ29udGV4dCIsImlnbm9yZUNvbnRleHQiXSxbInByb3ZpZGVLaW5kSGFuZGxlIiwicHJvdmlkZUtpbmRIYW5kbGUiXSxbInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmQiXSxbInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlS2luZE11bHRpIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADvd74wOSMAADkjAAAwAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJWYXREYXRhIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmVVdGlscyIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxwcm92aWRlTGF6eTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLFskaM2PX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqIEBpbXBvcnQge0JhZ2dhZ2UsIFBpY2tGYWNldCwgVmF0RGF0YX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnICovXG5cbi8qKiBAdHlwZSB7VmF0RGF0YX0gKi9cbmxldCBWYXREYXRhR2xvYmFsO1xuaWYgKCdWYXREYXRhJyBpbiBnbG9iYWxUaGlzKSB7XG4gIGdsb2JhbFRoaXMuVmF0RGF0YSB8fCBGYWlsYFZhdERhdGEgZGVmaW5lZCBpbiBnbG9iYWwgYXMgbnVsbCBvciB1bmRlZmluZWRgO1xuICAvKiBYWFggdHlwZXMgaW5jb21wYXRpYmlsaXR5Ki9cbiAgVmF0RGF0YUdsb2JhbCA9IC8qKiBAdHlwZSB7YW55fSAqLyAoZ2xvYmFsVGhpcy5WYXREYXRhKTtcbn0gZWxzZSB7XG4gIC8qIFhYWCB0aGlzIG1vZHVsZSBoYXMgYmVlbiBrbm93biB0byBnZXQgaW1wb3J0ZWQgKHRyYW5zaXRpdmVseSkgaW4gY2FzZXMgdGhhdCovXG4gIC8qIG5ldmVyIHVzZSBpdCBzbyB3ZSBtYWtlIGEgdmVyc2lvbiB0aGF0IHdpbGwgc2F0aXNmeSBtb2R1bGUgcmVzb2x1dGlvbiBidXQqL1xuICAvKiBmYWlsIGF0IHJ1bnRpbWUuKi9cbiAgY29uc3QgdW5hdmFpbGFibGUgPSAoKSA9PiBGYWlsYFZhdERhdGEgdW5hdmFpbGFibGVgO1xuICBWYXREYXRhR2xvYmFsID0ge1xuICAgIGRlZmluZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUtpbmRNdWx0aTogdW5hdmFpbGFibGUsXG4gICAgZGVmaW5lRHVyYWJsZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGk6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VLaW5kSGFuZGxlOiB1bmF2YWlsYWJsZSxcbiAgICBwcm92aWRlUHJvbWlzZVdhdGNoZXI6IHVuYXZhaWxhYmxlLFxuICAgIHdhdGNoUHJvbWlzZTogdW5hdmFpbGFibGUsXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIGNhbkJlRHVyYWJsZTogdW5hdmFpbGFibGUsXG4gIH07XG59XG5cbmNvbnN0IFZhdERhdGFFeHBvcnQgPSBWYXREYXRhR2xvYmFsOyRozY9fb25jZS5WYXREYXRhRXhwb3J0KFZhdERhdGFFeHBvcnQpO1xuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIEV4b3MvRXhvQ2xhc3NlcyBpbnN0ZWFkIG9mIEtpbmRzXG4gKi9cbiAgICAgICBjb25zdCB7XG4gIGRlZmluZUtpbmQsXG4gIGRlZmluZUtpbmRNdWx0aSxcbiAgZGVmaW5lRHVyYWJsZUtpbmQsXG4gIGRlZmluZUR1cmFibGVLaW5kTXVsdGksXG59ID0gVmF0RGF0YUdsb2JhbDskaM2PX29uY2UuZGVmaW5lS2luZChkZWZpbmVLaW5kKTskaM2PX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVLaW5kKGRlZmluZUR1cmFibGVLaW5kKTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShkZWZpbmVEdXJhYmxlS2luZE11bHRpKTtcblxuICAgICAgIGNvbnN0IHtcbiAgbWFrZUtpbmRIYW5kbGUsXG4gIHByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbiAgd2F0Y2hQcm9taXNlLFxuICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4gIG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG4gIG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbiAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSxcbiAgY2FuQmVEdXJhYmxlLFxufSA9IFZhdERhdGFHbG9iYWw7XG5cbi8qKlxuICogV2hlbiBtYWtpbmcgYSBtdWx0aS1mYWNldCBraW5kLCBpdCdzIGNvbW1vbiB0byBwaWNrIG9uZSBmYWNldCB0byBleHBvc2UuXG4gKiBFLmcuLFxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gKGEsIGIsIGMsIGQpID0+IG1ha2VGb29CYXNlKGEsIGIsIGMsIGQpLnNlbGY7XG4gKlxuICogVGhpcyBoZWxwZXIgcmVkdWNlcyB0aGUgZHVwbGljYXRpb246XG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSBwaWNrRmFjZXQobWFrZUZvb0Jhc2UsICdzZWxmJyk7XG4gKlxuICogQHR5cGUge1BpY2tGYWNldH1cbiAqLyRozY9fb25jZS5tYWtlS2luZEhhbmRsZShtYWtlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ01hcFN0b3JlKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUpOyRozY9fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbiAgICAgICBjb25zdCBwaWNrRmFjZXQgPVxuICAobWFrZXIsIGZhY2V0TmFtZSkgPT5cbiAgKC4uLmFyZ3MpID0+XG4gICAgbWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaM2PX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLyoqXG4gKiBBc3NpZ24gdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlXG4gKiBvYmplY3QgdG8gdGhlaXIga2V5cyBpbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQYXJ0aWFsPFQ+fSBzb3VyY2VcbiAqL1xuICAgICAgIGNvbnN0IHBhcnRpYWxBc3NpZ24gPSAodGFyZ2V0LCBzb3VyY2UpID0+IHtcbiAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSk7XG59OyRozY9fb25jZS5wYXJ0aWFsQXNzaWduKHBhcnRpYWxBc3NpZ24pO1xuaGFyZGVuKHBhcnRpYWxBc3NpZ24pO1xuXG4vKiogQGltcG9ydCB7U3RvcmVPcHRpb25zfSBmcm9tICdAYWdvcmljL3N0b3JlJyAqL1xuXG4vKipcbiAqIFVubGlrZSBgcHJvdmlkZUxhenlgLCBgcHJvdmlkZWAgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2Ugd2l0aGluIGFueSB2YXRcbiAqIGluY2FybmF0aW9uIHdpdGggYSBnaXZlbiBgYmFnZ2FnZWAsYGtleWAgcGFpci5cbiAqXG4gKiBgcHJvdmlkZWAgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBwb3B1bGF0ZSBiYWdnYWdlLCB3aGVyZSB0aGUgdG90YWwgbnVtYmVyIG9mXG4gKiBjYWxscyB0byBgcHJvdmlkZWAgbXVzdCBiZSBsb3cgY2FyZGluYWxpdHksIHNpbmNlIHdlIGtlZXAgdGhlIGJvb2trZWVwaW5nIHRvXG4gKiBkZXRlY3QgY29sbGlzaW9ucyBpbiBub3JtYWwgbGFuZ3VhZ2UtaGVhcCBtZW1vcnkuIEFsbCB0aGUgb3RoZXJcbiAqIGJhZ2dhZ2Utb3JpZW50ZWQgYHByb3ZpZGUqYCBhbmQgYHByZXBhcmUqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsIGFuZCBzb1xuICogaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBvdXIgZXhwZWN0ZWQgZHVyYWJpbGl0eVxuICogcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqXG4gKiAtIGtpbmRIYW5kbGVzLCB3aGljaCBhcmUgcGVyIGtpbmQsIHdoaWNoIG11c3QgYmUgbG93IGNhcmRpbmFsaXR5XG4gKiAtIGRhdGEgXCJ2YXJpYWJsZXNcIiBmb3IgcmVlc3RhYmxpc2hpbmcgdGhlIGxleGljYWwgc2NvcGUsIGVzcGVjaWFsbHkgb2ZcbiAqICAgc2luZ2xldG9uc1xuICogLSBuYW1lZCBub24tYmFnZ2FnZSBjb2xsZWN0aW9ucyBhdCB0aGUgbGVhdmVzIG9mIHRoZSBiYWdnYWdlIHRyZWUuXG4gKlxuICogV2hhdCBpcyBleHBlY3RlZCB0byBiZSBoaWdoIGNhcmRpbmFsaXR5IGFyZSB0aGUgaW5zdGFuY2VzIG9mIHRoZSBraW5kcywgYW5kXG4gKiB0aGUgbWVtYmVycyBvZiB0aGUgbm9uLWJhZ2dnYWdlIGNvbGxlY3Rpb25zLlxuICpcbiAqIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTg3NSA6IEltcGxlbWVudFxuICogZGV2ZWxvcG1lbnQtdGltZSBpbnN0cnVtZW50YXRpb24gdG8gZGV0ZWN0IHdoZW4gYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZVxuICogcHJlc2NyaXB0aW9uLCBhbmQgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBzYW1lIHZhdCBpbmNhcm5hdGlvbiB3aXRoXG4gKiB0aGUgc2FtZSBiYWdnYWdlLGtleSBwYWlyLlxuICovXG5cbiAgICAgICBjb25zdCBwcm92aWRlID1cbiAgLyogWFhYIGNhc3QgYmVjYXVzZSBwcm92aWRlTGF6eSBpcyBgYW55YCBkdWUgdG8gYnJva2VuIHR5cGUgaW1wb3J0Ki9cbiAgLyoqXG4gKiBAdHlwZSB7PEssIFY+KFxuICogICBiYWdnYWdlOiBCYWdnYWdlLFxuICogICBrZXk6IEssXG4gKiAgIG1ha2VWYWx1ZTogKGtleTogSykgPT4gVixcbiAqICkgPT4gVn1cbiAqLyAgIChwcm92aWRlTGF6eSk7XG5cbi8qIFRPRE86IEZpbmQgYSBnb29kIGhvbWUgZm9yIHRoaXMgZnVuY3Rpb24gdXNlZCBieSBAYWdvcmljL3ZhdC1kYXRhIGFuZCB0ZXN0aW5nIGNvZGUqL1xuLyoqIEBwYXJhbSB7VmF0RGF0YX0gVmF0RGF0YSAqLyRozY9fb25jZS5wcm92aWRlKHByb3ZpZGUpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZVV0aWxzID0gVmF0RGF0YSA9PiB7XG4gIGNvbnN0IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xuICAgIG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xuICAgIG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbiAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbiAgICBtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuICB9ID0gVmF0RGF0YTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gKGJhZ2dhZ2UsIG5hbWUsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+XG4gICAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVNldFN0b3JlID0gKGJhZ2dhZ2UsIG5hbWUsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+XG4gICAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZVNldFN0b3JlKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG4gICAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVN0b3JlVXRpbHMobWFrZVN0b3JlVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxTdG9yZVV0aWxzID0gbWFrZVN0b3JlVXRpbHMoVmF0RGF0YUdsb2JhbCk7XG4gICAgICAgY29uc3Qge1xuICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxuICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVTZXRTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsXG59ID0gZ2xvYmFsU3RvcmVVdGlsczskaM2PX29uY2UucHJvdmlkZUR1cmFibGVNYXBTdG9yZShwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTskaM2PX29uY2UucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJWYXREYXRhIjpbIlZhdERhdGFFeHBvcnQiXSwiZGVmaW5lS2luZCI6WyJkZWZpbmVLaW5kIl0sImRlZmluZUtpbmRNdWx0aSI6WyJkZWZpbmVLaW5kTXVsdGkiXSwiZGVmaW5lRHVyYWJsZUtpbmQiOlsiZGVmaW5lRHVyYWJsZUtpbmQiXSwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSI6WyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIl0sIm1ha2VLaW5kSGFuZGxlIjpbIm1ha2VLaW5kSGFuZGxlIl0sInByb3ZpZGVQcm9taXNlV2F0Y2hlciI6WyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLCJjYW5CZUR1cmFibGUiOlsiY2FuQmVEdXJhYmxlIl0sInBpY2tGYWNldCI6WyJwaWNrRmFjZXQiXSwicGFydGlhbEFzc2lnbiI6WyJwYXJ0aWFsQXNzaWduIl0sInByb3ZpZGUiOlsicHJvdmlkZSJdLCJtYWtlU3RvcmVVdGlscyI6WyJtYWtlU3RvcmVVdGlscyJdLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPrtlG3iOAAA4jgAABsAAABAYWdvcmljL3Zvdy12MC4xLjAvc3JjL0UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi90cmFjay10dXJucy5qcyIsIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHEsRmFpbCxtYWtlRXJyb3IsdHJhY2tUdXJucyxtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXV1dLFtcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIixbJGjNj19hID0+ICh0cmFja1R1cm5zID0gJGjNj19hKV1dXV0sW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIixbJGjNj19hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0VVbndyYXB9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHsgYXNzaWduLCBjcmVhdGUgfSA9IE9iamVjdDtcblxuY29uc3Qgb25TZW5kID0gbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX1NFTkRfQlJFQUtQT0lOVFMnKTtcblxuLyoqXG4gKiBAaW1wb3J0IHsgSGFuZGxlZFByb21pc2VDb25zdHJ1Y3RvciwgUmVtb3RhYmxlQnJhbmQgfSBmcm9tICdAZW5kby9ldmVudHVhbC1zZW5kJ1xuICovXG4vKiogQHR5cGVkZWYgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gQ2FsbGFibGUgKi9cblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIgPSB7XG4gIHNldChfdGFyZ2V0LCBfcHJvcCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBpc0V4dGVuc2libGUoX3RhcmdldCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgc2V0UHJvdG90eXBlT2YoX3RhcmdldCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eShfdGFyZ2V0LCBfcHJvcCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbn07XG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHthbnl9IHJlY2lwaWVudCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUoeClcbiAqIEBwYXJhbSB7SGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEBwYXJhbSB7PFQ+KHg6IFQpID0+IFByb21pc2U8RVVud3JhcDxUPj59IHVud3JhcFxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcjxhbnk+fSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRVByb3h5SGFuZGxlciA9IChyZWNpcGllbnQsIEhhbmRsZWRQcm9taXNlLCB1bndyYXApID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgIHJldHVybiBoYXJkZW4oXG4gICAgICAgIHtcbiAgICAgICAgICAvKipcbiAqIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpXG4gKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2RcbiAqIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvblxuICogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC5cbiAqIEBwYXJhbSAgey4uLmFueVtdfSBhcmdzXG4gKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzICE9PSByZWNlaXZlcikge1xuICAgICAgICAgICAgICAvKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xuICAgICAgICAgICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UucmVqZWN0KFxuICAgICAgICAgICAgICAgIG1ha2VFcnJvcihcbiAgICAgICAgICAgICAgICAgIFhgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocHJvcGVydHlLZXkpfVwiIG1ldGhvZCBvZiBFKCR7cShcbiAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICAgICAgKX0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgICAgICAgICAgIGRlYnVnZ2VyOyAvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4gICAgICAgICAgICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBtZXRob2QtY2FsbCBtZXNzYWdlLCovXG4gICAgICAgICAgICAgIC8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4gICAgICAgICAgICAgIC8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bndyYXAoXG4gICAgICAgICAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kKHVud3JhcChyZWNpcGllbnQpLCBwcm9wZXJ0eUtleSwgYXJncyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdBcnJheSA9IFtdKSA9PiB7XG4gICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgICAgICBkZWJ1Z2dlcjsgLyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuICAgICAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgZnVuY3Rpb24tY2FsbCBtZXNzYWdlLCovXG4gICAgICAgIC8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4gICAgICAgIC8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bndyYXAoSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvbih1bndyYXAocmVjaXBpZW50KSwgYXJnQXJyYXkpKTtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvKiBXZSBqdXN0IHByZXRlbmQgZXZlcnl0aGluZyBleGlzdHMuKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0pO1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHthbnl9IHJlY2lwaWVudCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUuc2VuZE9ubHkoeClcbiAqIEBwYXJhbSB7SGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEBwYXJhbSB7PFQ+KHg6IFQpID0+IFByb21pc2U8RVVud3JhcDxUPj59IHVud3JhcFxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcjxhbnk+fSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyID0gKHJlY2lwaWVudCwgSGFuZGxlZFByb21pc2UsIHVud3JhcCkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8qKlxuICogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSlcbiAqIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZFxuICogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uXG4gKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LlxuICogQHBhcmFtICB7Li4uYW55W119IGFyZ3NcbiAqL1xuICAgICAgICAgIFtwcm9wZXJ0eUtleV0oLi4uYXJncykge1xuICAgICAgICAgICAgLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG4gICAgICAgICAgICB0aGlzID09PSByZWNlaXZlciB8fFxuICAgICAgICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgICApfVwiIG1ldGhvZCBvZiBFLnNlbmRPbmx5KCR7cShyZWNpcGllbnQpfSlgO1xuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuICAgICAgICAgICAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgbWV0aG9kLWNhbGwgbWVzc2FnZSwqL1xuICAgICAgICAgICAgICAvKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuICAgICAgICAgICAgICAvKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KFxuICAgICAgICAgICAgICB1bndyYXAocmVjaXBpZW50KSxcbiAgICAgICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki9cbiAgICAgICAgfVtwcm9wZXJ0eUtleV0sXG4gICAgICApO1xuICAgIH0sXG4gICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJnc0FycmF5ID0gW10pID0+IHtcbiAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgICAgIGRlYnVnZ2VyOyAvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4gICAgICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBmdW5jdGlvbi1jYWxsIG1lc3NhZ2UsKi9cbiAgICAgICAgLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbiAgICAgICAgLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuICAgICAgfVxuICAgICAgSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvblNlbmRPbmx5KHVud3JhcChyZWNpcGllbnQpLCBhcmdzQXJyYXkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFLmdldCh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHthbnl9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLmdldCh4KVxuICogQHBhcmFtIHtIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHBhcmFtIHs8VD4oeDogVCkgPT4gUHJvbWlzZTxFVW53cmFwPFQ+Pn0gdW53cmFwXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyPGFueT59IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyID0gKHgsIEhhbmRsZWRQcm9taXNlLCB1bndyYXApID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBoYXM6IChfdGFyZ2V0LCBfcHJvcCkgPT4gdHJ1ZSxcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiBIYW5kbGVkUHJvbWlzZS5nZXQodW53cmFwKHgpLCBwcm9wKSxcbiAgfSk7XG5cbi8qKiBAcGFyYW0ge2FueX0geCAqL1xuY29uc3QgcmVzb2x2ZSA9IHggPT4gSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW0E9e31dXG4gKiBAcGFyYW0ge0hhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcGFyYW0ge29iamVjdH0gW3Bvd2Vyc11cbiAqIEBwYXJhbSB7PFQ+KHg6IFQpID0+IFByb21pc2U8RVVud3JhcDxUPj59IFtwb3dlcnMudW53cmFwXVxuICogQHBhcmFtIHtBfSBbcG93ZXJzLmFkZGl0aW9uYWxdXG4gKi9cbmNvbnN0IG1ha2VFID0gKEhhbmRsZWRQcm9taXNlLCBwb3dlcnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgYWRkaXRpb25hbCA9IC8qKiBAdHlwZSB7QX0gKi8gKHt9KSxcbiAgICB1bndyYXAgPSAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiBwb3dlcnMudW53cmFwPn0gKi8gKHJlc29sdmUpLFxuICB9ID0gcG93ZXJzO1xuXG4gIHJldHVybiBoYXJkZW4oXG4gICAgYXNzaWduKFxuICAgICAgLyoqXG4gKiBFKHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGNhbGwgYXJiaXRyYXJ5IG1ldGhvZHMuIEVhY2ggb2YgdGhlc2VcbiAqIG1ldGhvZCBjYWxscyByZXR1cm5zIGEgcHJvbWlzZS4gVGhlIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgb24gd2hhdGV2ZXJcbiAqICd4JyBkZXNpZ25hdGVzIChvciByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBtZXRob2QvZnVuY3Rpb24gY2FsbFxuICogQHJldHVybnMge0VDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICovXG4gICAgICB4ID0+XG4gICAgICAgIGhhcmRlbihcbiAgICAgICAgICBuZXcgUHJveHkoKCkgPT4ge30sIG1ha2VFUHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlLCB1bndyYXApKSxcbiAgICAgICAgKSxcbiAgICAgIHtcbiAgICAgICAgLyoqXG4gKiBFLmdldCh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBnZXQgYXJiaXRyYXJ5IHByb3BlcnRpZXMuXG4gKiBFYWNoIG9mIHRoZXNlIHByb3BlcnRpZXMgcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSBwcm9wZXJ0eS4gIFRoZSBwcm9taXNlXG4gKiB2YWx1ZSB3aWxsIGJlIHRoZSBwcm9wZXJ0eSBmZXRjaGVkIGZyb20gd2hhdGV2ZXIgJ3gnIGRlc2lnbmF0ZXMgKG9yXG4gKiByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBwcm9wZXJ0eSBnZXRcbiAqIEByZXR1cm5zIHtFR2V0dGVyczxMb2NhbFJlY29yZDxUPj59IHByb3BlcnR5IGdldCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbiAgICAgICAgZ2V0OiB4ID0+XG4gICAgICAgICAgaGFyZGVuKFxuICAgICAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgICAgICBjcmVhdGUobnVsbCksXG4gICAgICAgICAgICAgIG1ha2VFR2V0UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlLCB1bndyYXApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuXG4gICAgICAgIC8qKlxuICogRS5yZXNvbHZlKHgpIGNvbnZlcnRzIHggdG8gYSBoYW5kbGVkIHByb21pc2UuIEl0IGlzXG4gKiBzaG9ydGhhbmQgZm9yIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeClcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBoYW5kbGVkIHByb21pc2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBoYW5kbGVkIHByb21pc2UgZm9yIHhcbiAqIEByZWFkb25seVxuICovXG4gICAgICAgIHJlc29sdmU6IHggPT4gcmVzb2x2ZSh1bndyYXAoeCkpLFxuXG4gICAgICAgIC8qKlxuICogRS5zZW5kT25seSByZXR1cm5zIGEgcHJveHkgc2ltaWxhciB0byBFLCBidXQgZm9yIHdoaWNoIHRoZSByZXN1bHRzXG4gKiBhcmUgaWdub3JlZCAodW5kZWZpbmVkIGlzIHJldHVybmVkKS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgbWV0aG9kL2Z1bmN0aW9uIGNhbGxcbiAqIEByZXR1cm5zIHtFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbiAgICAgICAgc2VuZE9ubHk6IHggPT5cbiAgICAgICAgICBoYXJkZW4oXG4gICAgICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgICAgICgpID0+IHt9LFxuICAgICAgICAgICAgICBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlLCB1bndyYXApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuXG4gICAgICAgIC8qKlxuICogRS53aGVuKHgsIHJlcywgcmVqKSBpcyBlcXVpdmFsZW50IHRvXG4gKiB1bndyYXAoeCkudGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZClcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtUUmVzdWx0MT1FVW53cmFwPFQ+XVxuICogQHRlbXBsYXRlIFtUUmVzdWx0Mj1uZXZlcl1cbiAqIEBwYXJhbSB7RVJlZjxUPn0geCB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgaGFuZGxlZCBwcm9taXNlXG4gKiBAcGFyYW0geyh2YWx1ZTogRVVud3JhcDxUPikgPT4gRVJlZjxUUmVzdWx0MT59IFtvbmZ1bGZpbGxlZF1cbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiBFUmVmPFRSZXN1bHQyPn0gW29ucmVqZWN0ZWRdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPn1cbiAqIEByZWFkb25seVxuICovXG4gICAgICAgIHdoZW46ICh4LCBvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVud3JhcHBlZCA9IHJlc29sdmUodW53cmFwKHgpKTtcbiAgICAgICAgICBpZiAob25mdWxmaWxsZWQgPT0gbnVsbCAmJiBvbnJlamVjdGVkID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB1bndyYXBwZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bndyYXBwZWQudGhlbihcbiAgICAgICAgICAgIC4uLnRyYWNrVHVybnMoLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtvbmZ1bGZpbGxlZCwgb25yZWplY3RlZF0pKSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWwsXG4gICAgKSxcbiAgKTtcbn07XG5cbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgbWFrZUU+fSBFUHJveHkgKi9cblxuLyoqXG4gKiBgRGF0YU9ubHk8VD5gIG1lYW5zIHRvIHJldHVybiBhIHJlY29yZCB0eXBlIGBUMmAgY29uc2lzdGluZyBvbmx5IG9mXG4gKiBwcm9wZXJ0aWVzIHRoYXQgYXJlICpub3QqIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSB0byBiZSBmaWx0ZXJlZC5cbiAqIEB0eXBlZGVmIHtPbWl0PFQsIEZpbHRlcmVkS2V5czxULCBDYWxsYWJsZT4+fSBEYXRhT25seVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDYWxsYWJsZX0gVFxuICogQHR5cGVkZWYge1JldHVyblR5cGU8VD4gZXh0ZW5kcyBQcm9taXNlPEVVbndyYXA8UmV0dXJuVHlwZTxUPj4+XG4gKiAgICAgPyBUXG4gKiAgICAgOiAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTxFVW53cmFwPFJldHVyblR5cGU8VD4+Pn0gRUNhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gRUNhbGxhYmxlPFRbUF0+XG4gKiAgICAgOiBuZXZlcjtcbiAqIH19IEVNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBQcm9taXNlTGlrZTxhbnk+XG4gKiAgICAgPyBUW1BdXG4gKiAgICAgOiBQcm9taXNlPEF3YWl0ZWQ8VFtQXT4+O1xuICogfX0gRUdldHRlcnNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q2FsbGFibGV9IFRcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTx2b2lkPn0gRVNlbmRPbmx5Q2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyBFU2VuZE9ubHlDYWxsYWJsZTxUW1BdPlxuICogICAgIDogbmV2ZXI7XG4gKiB9fSBFU2VuZE9ubHlNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyBFU2VuZE9ubHlDYWxsYWJsZTxUPiAmIEVTZW5kT25seU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiAgICAgOiBFU2VuZE9ubHlNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogKX0gRVNlbmRPbmx5Q2FsbGFibGVPck1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUPiAmIEVNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogICAgIDogRU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFQ2FsbGFibGVPck1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIFJldHVybiBhIHVuaW9uIG9mIHByb3BlcnR5IG5hbWVzL3N5bWJvbHMvbnVtYmVycyBQIGZvciB3aGljaCB0aGUgcmVjb3JkIGVsZW1lbnQgVFtQXSdzIHR5cGUgZXh0ZW5kcyBVLlxuICpcbiAqIEdpdmVuIGNvbnN0IHggPSB7IGE6IDEyMywgYjogJ2hlbGxvJywgYzogNDIsIDQ5OiAoKSA9PiB7fSwgNTM6IDY3IH0sXG4gKlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBudW1iZXI+IGlzIHRoZSB0eXBlICdhJyB8ICdjJyB8IDUzLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBzdHJpbmc+IGlzIHRoZSB0eXBlICdiJy5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgNDIgfCA2Nz4gaXMgdGhlIHR5cGUgJ2MnIHwgNTMuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIGJvb2xlYW4+IGlzIHRoZSB0eXBlIG5ldmVyLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHR5cGVkZWYge3sgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBVID8gUCA6IG5ldmVyOyB9W2tleW9mIFRdfSBGaWx0ZXJlZEtleXNcbiAqL1xuXG4vKipcbiAqIGBQaWNrQ2FsbGFibGU8VD5gIG1lYW5zIHRvIHJldHVybiBhIHNpbmdsZSByb290IGNhbGxhYmxlIG9yIGEgcmVjb3JkIHR5cGVcbiAqIGNvbnNpc3Rpbmcgb25seSBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUmV0dXJuVHlwZTxUPiAgIC8vIGEgcm9vdCBjYWxsYWJsZSwgbm8gbWV0aG9kc1xuICogICAgIDogRmlsdGVyZWRLZXlzPFQsIENhbGxhYmxlPiBleHRlbmRzIG5ldmVyXG4gKiAgICAgPyBuZXZlclxuICogICAgIDogUGljazxULCBGaWx0ZXJlZEtleXM8VCwgQ2FsbGFibGU+PiAgICAgICAgICAvLyBhbnkgY2FsbGFibGUgbWV0aG9kc1xuICogKX0gUGlja0NhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBgUmVtb3RlRnVuY3Rpb25zPFQ+YCBtZWFucyB0byByZXR1cm4gdGhlIGZ1bmN0aW9ucyBhbmQgcHJvcGVydGllcyB0aGF0IGFyZSByZW1vdGVseSBjYWxsYWJsZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgRVVud3JhcDxUPiBleHRlbmRzIFJlbW90YWJsZUJyYW5kPGFueSwgaW5mZXIgUj4gIC8vIGlmIGEgZ2l2ZW4gVCB3aWxsIHNldHRsZSB0byBzb21lIHJlbW90ZSBpbnRlcmZhY2UgUlxuICogICAgID8gUGlja0NhbGxhYmxlPFI+ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBjYWxsYWJsZSBwcm9wZXJ0aWVzIG9mIFJcbiAqICAgICA6IFBpY2tDYWxsYWJsZTxFVW53cmFwPFQ+PiAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHJldHVybiB0aGUgY2FsbGFibGUgcHJvcGVydGllcyBvZiB0aGUgc2V0dGxlZCBUXG4gKiApfSBSZW1vdGVGdW5jdGlvbnNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgYW55PlxuICogICAgID8gTFxuICogICAgIDogRVVud3JhcDxUPlxuICogKX0gTG9jYWxSZWNvcmRcbiAqL1xuXG4vKipcbiAqIFR5cGUgZm9yIGFuIG9iamVjdCB0aGF0IG11c3Qgb25seSBiZSBpbnZva2VkIHdpdGggRS4gIEl0IHN1cHBvcnRzIGEgZ2l2ZW5cbiAqIGludGVyZmFjZSBidXQgZGVjbGFyZXMgYWxsIHRoZSBmdW5jdGlvbnMgYXMgYXN5bmNhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBFUmVmPEF3YWl0ZWQ8RU9ubHk8UmV0dXJuVHlwZTxUPj4+PlxuICogICAgIDogVCBleHRlbmRzIFJlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGU+XG4gKiAgICAgPyB7XG4gKiAgICAgICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICAgICAgICA/ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFRbS10+KSA9PiBFUmVmPEF3YWl0ZWQ8RU9ubHk8UmV0dXJuVHlwZTxUW0tdPj4+PlxuICogICAgICAgICAgIDogVFtLXTtcbiAqICAgICAgIH1cbiAqICAgICA6IFRcbiAqICl9IEVPbmx5XG4gKi8kaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJh5zZSVAgAAlQIAAB8AAABAYWdvcmljL3Zvdy12MC4xLjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4uL3ZhdC5qcyIsIi4vRS5qcyIsIi4vdm93LXV0aWxzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbInRvUGFzc2FibGVDYXAiLCJ0b1Bhc3NhYmxlQ2FwIixudWxsXSwicmVleHBvcnRzIjpbIi4uL3ZhdC5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi4vdmF0LmpzXCIsIFtdXSxbXCIuL0UuanNcIiwgW11dLFtcIi4vdm93LXV0aWxzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9FLmpzIjpbWyJkZWZhdWx0IiwibWFrZUUiXV0sIi4vdm93LXV0aWxzLmpzIjpbWyJWb3dTaGFwZSIsIlZvd1NoYXBlIl0sWyJ0b1Bhc3NhYmxlQ2FwIiwidG9QYXNzYWJsZUNhcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXT1b6EgZAABIGQAALQAAAEBhZ29yaWMvdm93LXYwLjEuMC9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbmNvbnN0IHsgaGFzT3duLCBmcmVlemUsIGVudHJpZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgJyonfSBNYXRjaFN0cmluZ1RhZ1xuICogICBBIHN0YXIgYCcqJ2AgbWF0Y2hlcyBhbnkgcmVjaXBpZW50LiBPdGhlcndpc2UsIHRoZSBzdHJpbmcgaXNcbiAqICAgbWF0Y2hlZCBhZ2FpbnN0IHRoZSB2YWx1ZSBvZiBhIHJlY2lwaWVudCdzIGBAQHRvU3RyaW5nVGFnYFxuICogICBhZnRlciBzdHJpcHBpbmcgb3V0IGFueSBsZWFkaW5nIGAnQWxsZWdlZDogJ2Agb3IgYCdEZWJ1Z05hbWU6ICdgXG4gKiAgIHByZWZpeC4gRm9yIG9iamVjdHMgZGVmaW5lZCB3aXRoIGBGYXJgIHRoaXMgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogICBrbm93biBhcyB0aGUgYGZhck5hbWVgLiBGb3IgZXhvcywgdGhpcyBpcyB0aGUgdGFnLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCAnKid9IE1hdGNoTWV0aG9kTmFtZVxuICogICBBIHN0YXIgYCcqJ2AgbWF0Y2hlcyBhbnkgbWV0aG9kIG5hbWUuIE90aGVyd2lzZSwgdGhlIHN0cmluZyBpc1xuICogICBtYXRjaGVkIGFnYWluc3QgdGhlIG1ldGhvZCBuYW1lLiBDdXJyZW50bHksIHRoaXMgaXMgb25seSBhbiBleGFjdCBtYXRjaC5cbiAqICAgSG93ZXZlciwgYmV3YXJlIHRoYXQgd2UgbWF5IGludHJvZHVjZSBhIHN0cmluZyBzeW50YXggZm9yXG4gKiAgIHN5bWJvbCBtZXRob2QgbmFtZXMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge251bWJlciB8ICcqJ30gTWF0Y2hDb3VudGRvd25cbiAqICAgQSBzdGFyIGAnKidgIHdpbGwgYWx3YXlzIGJyZWFrcG9pbnQuIE90aGVyd2lzZSwgdGhlIHN0cmluZ1xuICogICBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuIE9uY2UgdGhhdCBpcyB6ZXJvLCBhbHdheXMgYnJlYWtwb2ludC5cbiAqICAgT3RoZXJ3aXNlIGRlY3JlbWVudCBieSBvbmUgZWFjaCB0aW1lIGl0IG1hdGNoZXMgdW50aWwgaXQgcmVhY2hlcyB6ZXJvLlxuICogICBJbiBvdGhlciB3b3JkcywgdGhlIGNvdW50ZG93biByZXByZXNlbnRzIHRoZSBudW1iZXIgb2ZcbiAqICAgYnJlYWtwb2ludCBvY2N1cnJlbmNlcyB0byBza2lwIGJlZm9yZSBhY3R1YWxseSBicmVha3BvaW50aW5nLlxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXh0ZXJuYWwgSlNPTiByZXByZXNlbnRhdGlvbiwgaW4gd2hpY2hcbiAqIC0gdGhlIG91dGVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIGNsYXNzLWxpa2UgdGFnIG9yICcqJyxcbiAqIC0gdGhlIGlubmVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIG1ldGhvZCBuYW1lIG9yICcqJyxcbiAqIC0gdGhlIHZhbHVlIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgY291bnRkb3duIG9yICcqJy5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPE1hdGNoU3RyaW5nVGFnLCBSZWNvcmQ8TWF0Y2hNZXRob2ROYW1lLCBNYXRjaENvdW50ZG93bj4+fSBNZXNzYWdlQnJlYWtwb2ludHNcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGludGVybmFsIEpTT04gcmVwcmVzZW50YXRpb24sIGluIHdoaWNoXG4gKiAtIHRoZSBvdXRlciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBtZXRob2QgbmFtZSBvciAnKicsXG4gKiAtIHRoZSBpbm5lciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBjbGFzcy1saWtlIHRhZyBvciAnKicsXG4gKiAtIHRoZSB2YWx1ZSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGNvdW50ZG93biBvciAnKicuXG4gKlxuICogQHR5cGVkZWYge1JlY29yZDxNYXRjaE1ldGhvZE5hbWUsIFJlY29yZDxNYXRjaFN0cmluZ1RhZywgTWF0Y2hDb3VudGRvd24+Pn0gQnJlYWtwb2ludFRhYmxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNZXNzYWdlQnJlYWtwb2ludFRlc3RlclxuICogQHByb3BlcnR5IHsoKSA9PiBNZXNzYWdlQnJlYWtwb2ludHN9IGdldEJyZWFrcG9pbnRzXG4gKiBAcHJvcGVydHkgeyhuZXdCcmVha3BvaW50cz86IE1lc3NhZ2VCcmVha3BvaW50cykgPT4gdm9pZH0gc2V0QnJlYWtwb2ludHNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZWNpcGllbnQ6IG9iamVjdCxcbiAqICAgbWV0aG9kTmFtZTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkXG4gKiApID0+IGJvb2xlYW59IHNob3VsZEJyZWFrcG9pbnRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHt2YWwgaXMgUmVjb3JkPHN0cmluZywgYW55Pn1cbiAqL1xuY29uc3QgaXNKU09OUmVjb3JkID0gdmFsID0+XG4gIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWwpO1xuXG4vKipcbiAqIFJldHVybiBgdGFnYCBhZnRlciBzdHJpcHBpbmcgb2ZmIGFueSBgJ0FsbGVnZWQ6ICdgIG9yIGAnRGVidWdOYW1lOiAnYFxuICogcHJlZml4IGlmIHByZXNlbnQuXG4gKiBgYGBqc1xuICogc2ltcGxpZnlUYWcoJ0FsbGVnZWQ6IG1vb2xhIGlzc3VlcicpID09PSAnbW9vbGEgaXNzdWVyJ1xuICogYGBgXG4gKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3VjaCBwcmVmaXhlcywgb25seSB0aGUgb3V0ZXIgb25lIGlzIHJlbW92ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc2ltcGxpZnlUYWcgPSB0YWcgPT4ge1xuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ0FsbGVnZWQ6ICcsICdEZWJ1Z05hbWU6ICddKSB7XG4gICAgaWYgKHRhZy5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIHJldHVybiB0YWcuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0YWc7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcmV0dXJucyB7TWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgfCB1bmRlZmluZWR9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSBvcHRpb25OYW1lID0+IHtcbiAgbGV0IGJyZWFrcG9pbnRzID0gSlNPTi5wYXJzZShnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCAnbnVsbCcpKTtcblxuICBpZiAoYnJlYWtwb2ludHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEB0eXBlIHtCcmVha3BvaW50VGFibGV9ICovXG4gIGxldCBicmVha3BvaW50c1RhYmxlO1xuXG4gIGNvbnN0IGdldEJyZWFrcG9pbnRzID0gKCkgPT4gYnJlYWtwb2ludHM7XG4gIGZyZWV6ZShnZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2V0QnJlYWtwb2ludHMgPSAobmV3QnJlYWtwb2ludHMgPSBicmVha3BvaW50cykgPT4ge1xuICAgIGlzSlNPTlJlY29yZChuZXdCcmVha3BvaW50cykgfHxcbiAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24gdG8gYmUgYSBKU09OIGJyZWFrcG9pbnRzIHJlY29yZGA7XG5cbiAgICAvKiogQHR5cGUge0JyZWFrcG9pbnRUYWJsZX0gKi9cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvbmZ1c2VkIGJ5IF9fcHJvdG9fXyovXG4gICAgY29uc3QgbmV3QnJlYWtwb2ludHNUYWJsZSA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICBmb3IgKGNvbnN0IFt0YWcsIG1ldGhvZEJQc10gb2YgZW50cmllcyhuZXdCcmVha3BvaW50cykpIHtcbiAgICAgIHRhZyA9PT0gc2ltcGxpZnlUYWcodGFnKSB8fFxuICAgICAgICBGYWlsYEp1c3QgdXNlIHNpbXBsZSB0YWcgJHtxKHNpbXBsaWZ5VGFnKHRhZykpfSByYXRoZXIgdGhhbiAke3EodGFnKX1gO1xuICAgICAgaXNKU09OUmVjb3JkKG1ldGhvZEJQcykgfHxcbiAgICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cShcbiAgICAgICAgICB0YWcsXG4gICAgICAgICl9IHRvIGJlIGEgSlNPTiBtZXRob2RzIGJyZWFrcG9pbnRzIHJlY29yZGA7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBjb3VudF0gb2YgZW50cmllcyhtZXRob2RCUHMpKSB7XG4gICAgICAgIGNvdW50ID09PSAnKicgfHxcbiAgICAgICAgICAodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpICYmXG4gICAgICAgICAgICBjb3VudCA+PSAwKSB8fFxuICAgICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EodGFnKX0uJHtxKFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICApfSB0byBiZSBcIipcIiBvciBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYDtcblxuICAgICAgICBjb25zdCBjbGFzc0JQcyA9IGhhc093bihuZXdCcmVha3BvaW50c1RhYmxlLCBtZXRob2ROYW1lKVxuICAgICAgICAgID8gbmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXVxuICAgICAgICAgIDogKG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gPSB7XG4gICAgICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY29uZnVzZWQgYnkgX19wcm90b19fKi9cbiAgICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNsYXNzQlBzW3RhZ10gPSBjb3VudDtcbiAgICAgIH1cbiAgICB9XG4gICAgYnJlYWtwb2ludHMgPSBuZXdCcmVha3BvaW50cztcbiAgICBicmVha3BvaW50c1RhYmxlID0gbmV3QnJlYWtwb2ludHNUYWJsZTtcbiAgfTtcbiAgZnJlZXplKHNldEJyZWFrcG9pbnRzKTtcblxuICBjb25zdCBzaG91bGRCcmVha3BvaW50ID0gKHJlY2lwaWVudCwgbWV0aG9kTmFtZSkgPT4ge1xuICAgIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHwgbWV0aG9kTmFtZSA9PT0gbnVsbCkge1xuICAgICAgLyogVE9ETyBlbmFibGUgZnVuY3Rpb24gYnJlYWtwb2ludGluZyovXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzQlBzID0gYnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXSB8fCBicmVha3BvaW50c1RhYmxlWycqJ107XG4gICAgaWYgKGNsYXNzQlBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHRhZyA9IHNpbXBsaWZ5VGFnKHJlY2lwaWVudFtTeW1ib2wudG9TdHJpbmdUYWddKTtcbiAgICBsZXQgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YWcgPSAnKic7XG4gICAgICBjb3VudCA9IGNsYXNzQlBzW3RhZ107XG4gICAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXNzZXJ0KHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiYgY291bnQgPj0gMSk7XG4gICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50IC0gMTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIGZyZWV6ZShzaG91bGRCcmVha3BvaW50KTtcblxuICBjb25zdCBicmVha3BvaW50VGVzdGVyID0gZnJlZXplKHtcbiAgICBnZXRCcmVha3BvaW50cyxcbiAgICBzZXRCcmVha3BvaW50cyxcbiAgICBzaG91bGRCcmVha3BvaW50LFxuICB9KTtcbiAgYnJlYWtwb2ludFRlc3Rlci5zZXRCcmVha3BvaW50cygpO1xuICByZXR1cm4gYnJlYWtwb2ludFRlc3Rlcjtcbn07JGjNj19vbmNlLm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcihtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xuZnJlZXplKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEYv0d7UDgAA1A4AACsAAABAYWdvcmljL3Zvdy12MC4xLjAvc3JjL3JlamVjdGlvbi10cmFja2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vcGF0dGVybnMiLCIuL3Zvdy11dGlscy5qcyJdLCJleHBvcnRzIjpbInByZXBhcmVWb3dSZWplY3Rpb25UcmFja2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxtYWtlUHJvbWlzZUtpdCxNLHNpbms7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCIuL3Zvdy11dGlscy5qc1wiLCBbW1wic2lua1wiLFskaM2PX2EgPT4gKHNpbmsgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZUNhcH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtQcm9taXNlS2l0fSBmcm9tICdAZW5kby9wcm9taXNlLWtpdCc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2U8dm9pZD59IFtyZWplY3RlZF1cbiAqIEBwYXJhbSB7UHJvbWlzZUtpdDx2b2lkPn0gW3VwZ3JhZGVkUEtdXG4gKi9cbmNvbnN0IG1ha2VVbmhhbmRsZWRSZWplY3Rpb25DYW5jZWxsZXIgPSAocmVqZWN0ZWQsIHVwZ3JhZGVkUEspID0+IHtcbiAgcmV0dXJuICgpID0+IHtcbiAgICAvKiBIYW5kbGUgdGhlIHJlamVjdGVkIHByb21pc2UgdG8gc2lsZW5jZSBpdC4qL1xuICAgIHJlamVjdGVkPy5jYXRjaChzaW5rKTtcbiAgICAvKiBSZXNvbHZlIHRoZSB1cGdyYWRlZCBwcm9taXNlIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyByZWplY3RlZCBieSBhKi9cbiAgICAvKiBmdXR1cmUgdXBncmFkZS4qL1xuICAgIHVwZ3JhZGVkUEs/LnJlc29sdmUoKTtcbiAgfTtcbn07XG5cbi8qKiBAcGFyYW0ge1pvbmV9IHpvbmUgKi9cbiAgICAgICBjb25zdCBwcmVwYXJlVm93UmVqZWN0aW9uVHJhY2tlciA9IHpvbmUgPT4ge1xuICAvKiogQHR5cGUge1dlYWtNYXA8UGFzc2FibGVDYXAsICgpID0+IHZvaWQ+fSAqL1xuICBjb25zdCB2b3dUb0NhbmNlbFVuaGFuZGxlZFJlamVjdGlvbiA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgY29uc3QgdXBncmFkZVJlamVjdGlvbldhdGNoZXIgPSB6b25lLmV4byhcbiAgICAnVXBncmFkZVJlamVjdGlvbldhdGNoZXInLFxuICAgIE0uaW50ZXJmYWNlKCdVcGdyYWRlUmVqZWN0aW9uV2F0Y2hlcicsIHtcbiAgICAgIG9uUmVqZWN0ZWQ6IE0uY2FsbChNLnJhdygpLCBNLnJhdygpKS5yZXR1cm5zKCksXG4gICAgfSksXG4gICAge1xuICAgICAgb25SZWplY3RlZCh1cGdyYWRlUmVhc29uLCBiYXNlUmVhc29uKSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IGFzc2VydC5lcnJvcihcbiAgICAgICAgICBYYFZPV19SRUpFQ1RJT04gJHtiYXNlUmVhc29ufSBub3QgaGFuZGxlZCBiZWZvcmUgdXBncmFkZSAke3VwZ3JhZGVSZWFzb259YCxcbiAgICAgICAgKTtcbiAgICAgICAgLyogY29uc29sZS53YXJuKHJlYXNvbik7Ki9cbiAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIGNvbnN0IHZvd1JlamVjdGlvblRyYWNrZXIgPSB6b25lLmV4byhcbiAgICAnVm93UmVqZWN0aW9uVHJhY2tlcicsXG4gICAgTS5pbnRlcmZhY2UoJ1Zvd1JlamVjdGlvblRyYWNrZXInLCB7XG4gICAgICBoYW5kbGU6IE0uY2FsbChNLnJlbW90YWJsZSgpKS5yZXR1cm5zKCksXG4gICAgICByZWplY3Q6IE0uY2FsbChNLnJlbW90YWJsZSgpLCBNLnJhdygpKS5yZXR1cm5zKCksXG4gICAgfSksXG4gICAge1xuICAgICAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlQ2FwfSB2b3dDYXBcbiAqL1xuICAgICAgaGFuZGxlKHZvd0NhcCkge1xuICAgICAgICBjb25zdCBjYW5jZWwgPSB2b3dUb0NhbmNlbFVuaGFuZGxlZFJlamVjdGlvbi5nZXQodm93Q2FwKTtcbiAgICAgICAgaWYgKCFjYW5jZWwpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBhc3NlcnQuZXJyb3IoXG4gICAgICAgICAgICAgIFhgTm93IGhhbmRsaW5nIGEgVk9XX1JFSkVDVElPTiBmcm9tIGEgcHJpb3IgaW5jYXJuYXRpb24gZm9yICR7dm93Q2FwfWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZvd1RvQ2FuY2VsVW5oYW5kbGVkUmVqZWN0aW9uLmRlbGV0ZSh2b3dDYXApO1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGVDYXB9IHZvd0NhcFxuICogQHBhcmFtIHthbnl9IHJlYXNvblxuICovXG4gICAgICByZWplY3Qodm93Q2FwLCByZWFzb24pIHtcbiAgICAgICAgaWYgKHZvd1RvQ2FuY2VsVW5oYW5kbGVkUmVqZWN0aW9uLmhhcyh2b3dDYXApKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFyZGVuKHJlYXNvbik7XG4gICAgICAgIGNvbnN0IGJhc2VSZWFzb24gPSB6b25lLmlzU3RvcmFibGUocmVhc29uKVxuICAgICAgICAgID8gcmVhc29uXG4gICAgICAgICAgOiBhc3NlcnQuZXJyb3IoWGBWb3cgcmVqZWN0aW9uIHJlYXNvbiB3YXMgbm90IHN0b3JlZDogJHtyZWFzb259YCk7XG5cbiAgICAgICAgLyogUmVnaXN0ZXIgYSBuZXZlci1yZXNvbHZlZCBuYXRpdmUgcHJvbWlzZSB3aXRoIGxpdmVzbG90cywgc28gaXQqL1xuICAgICAgICAvKiBjYW4gcmVqZWN0IG9uIHVwZ3JhZGUuKi9cbiAgICAgICAgY29uc3QgdXBncmFkZWRQSyA9IG1ha2VQcm9taXNlS2l0KCk7XG4gICAgICAgIHpvbmUud2F0Y2hQcm9taXNlKFxuICAgICAgICAgIHVwZ3JhZGVkUEsucHJvbWlzZSxcbiAgICAgICAgICB1cGdyYWRlUmVqZWN0aW9uV2F0Y2hlcixcbiAgICAgICAgICBiYXNlUmVhc29uLFxuICAgICAgICApO1xuXG4gICAgICAgIC8qIFNhdmUgdGhlIGNhbmNlbCBmdW5jdGlvbi4qL1xuICAgICAgICBjb25zdCByZWplY3RlZCA9IFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIGNvbnN0IGNhbmNlbCA9IG1ha2VVbmhhbmRsZWRSZWplY3Rpb25DYW5jZWxsZXIocmVqZWN0ZWQsIHVwZ3JhZGVkUEspO1xuICAgICAgICB2b3dUb0NhbmNlbFVuaGFuZGxlZFJlamVjdGlvbi5zZXQodm93Q2FwLCBjYW5jZWwpO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiB2b3dSZWplY3Rpb25UcmFja2VyO1xufTtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlVm93UmVqZWN0aW9uVHJhY2tlcj59IFZvd1JlamVjdGlvblRyYWNrZXIgKi8kaM2PX29uY2UucHJlcGFyZVZvd1JlamVjdGlvblRyYWNrZXIocHJlcGFyZVZvd1JlamVjdGlvblRyYWNrZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVZvd1JlamVjdGlvblRyYWNrZXIiOlsicHJlcGFyZVZvd1JlamVjdGlvblRyYWNrZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/TsAScQdAADEHQAAIwAAAEBhZ29yaWMvdm93LXYwLjEuMC9zcmMvcmV0cnlhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3BhdHRlcm5zIiwiQGFnb3JpYy9iYXNlLXpvbmUiLCIuL3Zvdy11dGlscy5qcyJdLCJleHBvcnRzIjpbInByZXBhcmVSZXRyeWFibGVUb29scyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTSxQcm9taXNlV2F0Y2hlckksbWFrZUFzVm93LHRvUGFzc2FibGVDYXAsVm93U2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9iYXNlLXpvbmVcIiwgW1tcIlByb21pc2VXYXRjaGVySVwiLFskaM2PX2EgPT4gKFByb21pc2VXYXRjaGVySSA9ICRozY9fYSldXV1dLFtcIi4vdm93LXV0aWxzLmpzXCIsIFtbXCJtYWtlQXNWb3dcIixbJGjNj19hID0+IChtYWtlQXNWb3cgPSAkaM2PX2EpXV0sW1widG9QYXNzYWJsZUNhcFwiLFskaM2PX2EgPT4gKHRvUGFzc2FibGVDYXAgPSAkaM2PX2EpXV0sW1wiVm93U2hhcGVcIixbJGjNj19hID0+IChWb3dTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7TWFwU3RvcmUsIFdlYWtNYXBTdG9yZX0gZnJvbSAnQGFnb3JpYy9zdG9yZSdcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJ1xuICogQGltcG9ydCB7Vm93LCBWb3dLaXQsIElzUmV0cnlhYmxlUmVhc29uLCBWb3dUb29sc30gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBQYXNzYWJsZUNhcH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByZXBhcmF0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHsoKSA9PiBWb3dLaXQ8YW55Pn0gbWFrZVZvd0tpdFxuICogQHByb3BlcnR5IHtJc1JldHJ5YWJsZVJlYXNvbn0gaXNSZXRyeWFibGVSZWFzb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogUGFzc2FibGVbXSkgPT4gUHJvbWlzZTxhbnk+fSBSZXRyeWFibGVGdW5jXG4gKi9cblxuY29uc3QgeyBkZWZpbmVQcm9wZXJ0aWVzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IFJldHJ5YWJsZUZsb3dJS2l0ID0gaGFyZGVuKHtcbiAgZmxvdzogTS5pbnRlcmZhY2UoJ0Zsb3cnLCB7XG4gICAgcmVzdGFydDogTS5jYWxsKCkucmV0dXJucygpLFxuICAgIGdldE91dGNvbWU6IE0uY2FsbCgpLnJldHVybnMoVm93U2hhcGUpLFxuICB9KSxcbiAgcmVzdWx0V2F0Y2hlcjogUHJvbWlzZVdhdGNoZXJJLFxufSk7XG5cbmNvbnN0IEFkbWluUmV0cnlhYmxlRmxvd0kgPSBNLmludGVyZmFjZSgnUmV0cnlhYmxlRmxvd0FkbWluJywge1xuICBnZXRGbG93Rm9yT3V0Y29tZVZvdzogTS5jYWxsKFZvd1NoYXBlKS5yZXR1cm5zKE0ub3B0KE0ucmVtb3RhYmxlKCdmbG93JykpKSxcbn0pO1xuXG4vKipcbiAqIEBwYXJhbSB7Wm9uZX0gb3V0ZXJab25lXG4gKiBAcGFyYW0ge1ByZXBhcmF0aW9uT3B0aW9uc30gb3V0ZXJPcHRpb25zXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUmV0cnlhYmxlVG9vbHMgPSAob3V0ZXJab25lLCBvdXRlck9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyBtYWtlVm93S2l0LCBpc1JldHJ5YWJsZVJlYXNvbiB9ID0gb3V0ZXJPcHRpb25zO1xuXG4gIGNvbnN0IGFzVm93ID0gbWFrZUFzVm93KG1ha2VWb3dLaXQpO1xuXG4gIC8qKlxuICogU28gd2UgY2FuIGdpdmUgb3V0IHdyYXBwZXIgZnVuY3Rpb25zIGVhc2lseSBhbmQgcmVjb3ZlciBmbG93IG9iamVjdHNcbiAqIGZvciB0aGVpciBhY3RpdmF0aW9ucyBsYXRlci5cbiAqL1xuICBjb25zdCBmbG93Rm9yT3V0Y29tZVZvd0tleSA9XG4gICAgLyoqIEB0eXBlIHtNYXBTdG9yZTxQYXNzYWJsZUNhcCwgUmV0cnlhYmxlRmxvdz59ICovIChcbiAgICAgIG91dGVyWm9uZS5tYXBTdG9yZSgncmV0cnlhYmxlRmxvd0Zvck91dGNvbWVWb3cnLCB7XG4gICAgICAgIGtleVNoYXBlOiBNLnJlbW90YWJsZSgndG9QYXNzYWJsZUNhcCcpLFxuICAgICAgICB2YWx1ZVNoYXBlOiBNLnJlbW90YWJsZSgnZmxvdycpICAvKiBpc0RvbmUgPT09IGZhbHNlKi9cbiAgICAgIH0pXG4gICAgKTtcblxuICAvKipcbiAqIEBwYXJhbSB7Wm9uZX0gem9uZVxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtSZXRyeWFibGVGdW5jfSByZXRyeWFibGVGdW5jXG4gKi9cbiAgY29uc3QgcHJlcGFyZVJldHJ5YWJsZUZsb3dLaXQgPSAoem9uZSwgdGFnLCByZXRyeWFibGVGdW5jKSA9PiB7XG4gICAgdHlwZW9mIHJldHJ5YWJsZUZ1bmMgPT09ICdmdW5jdGlvbicgfHxcbiAgICAgIEZhaWxgcmV0cnlhYmxlRnVuYyBtdXN0IGJlIGEgY2FsbGFibGUgZnVuY3Rpb24gJHtyZXRyeWFibGVGdW5jfWA7XG5cbiAgICBjb25zdCBpbnRlcm5hbE1ha2VSZXRyeWFibGVGbG93S2l0ID0gem9uZS5leG9DbGFzc0tpdChcbiAgICAgIHRhZyxcbiAgICAgIFJldHJ5YWJsZUZsb3dJS2l0LFxuICAgICAgYWN0aXZhdGlvbkFyZ3MgPT4ge1xuICAgICAgICBoYXJkZW4oYWN0aXZhdGlvbkFyZ3MpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWN0aXZhdGlvbkFyZ3MsIC8qIHJlc3RhcnRpbmcgdGhlIHJldHJ5YWJsZSBmdW5jdGlvbiB1c2VzIHRoZSBvcmlnaW5hbCBhcmdzKi9cbiAgICAgICAgICBvdXRjb21lS2l0OiBtYWtlVm93S2l0KCksIC8qIG91dGNvbWUgb2YgYWN0aXZhdGlvbiBhcyB2b3cqL1xuICAgICAgICAgIGxhc3RSZXRyeVJlYXNvbjogdW5kZWZpbmVkLFxuICAgICAgICAgIHJ1bnM6IDBuLFxuICAgICAgICAgIGlzRG9uZTogZmFsc2UgIC8qIHBlcnNpc3RlbnRseSBkb25lKi9cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZsb3c6IHtcbiAgICAgICAgICAvKipcbiAqIENhbGxzIHRoZSByZXRyeWFibGUgZnVuY3Rpb24sIGVpdGhlciBmb3IgdGhlIGluaXRpYWwgcnVuIG9yIHdoZW5cbiAqIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHJ1biBmYWlscyB3aXRoIGEgcmV0cnlhYmxlIHJlYXNvbi5cbiAqL1xuICAgICAgICAgIHJlc3RhcnQoKSB7XG4gICAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgICBjb25zdCB7IGFjdGl2YXRpb25BcmdzLCBpc0RvbmUgfSA9IHN0YXRlO1xuICAgICAgICAgICAgY29uc3QgeyBmbG93LCByZXN1bHRXYXRjaGVyIH0gPSBmYWNldHM7XG5cbiAgICAgICAgICAgICFpc0RvbmUgfHxcbiAgICAgICAgICAgICAgLyogc2VwYXJhdGUgbGluZSBzbyBJIGNhbiBzZXQgYSBicmVha3BvaW50Ki9cbiAgICAgICAgICAgICAgRmFpbGBDYW5ub3QgcmVzdGFydCBhIGRvbmUgcmV0cnlhYmxlIGZsb3cgJHtmbG93fWA7XG5cbiAgICAgICAgICAgIGNvbnN0IHJ1bklkID0gc3RhdGUucnVucyArIDFuO1xuICAgICAgICAgICAgc3RhdGUucnVucyA9IHJ1bklkO1xuXG4gICAgICAgICAgICBsZXQgcmVzdWx0UDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc3VsdFAgPSBQcm9taXNlLnJlc29sdmUocmV0cnlhYmxlRnVuYyguLi5hY3RpdmF0aW9uQXJncykpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIHJlc3VsdFAgPSBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvdXRlclpvbmUud2F0Y2hQcm9taXNlKGhhcmRlbihyZXN1bHRQKSwgcmVzdWx0V2F0Y2hlciwgcnVuSWQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0T3V0Y29tZSgpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgICBjb25zdCB7IG91dGNvbWVLaXQgfSA9IHN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuIG91dGNvbWVLaXQudm93O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdFdhdGNoZXI6IHtcbiAgICAgICAgICBvbkZ1bGZpbGxlZCh2YWx1ZSwgcnVuSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgICBjb25zdCB7IHJ1bnMsIG91dGNvbWVLaXQgfSA9IHN0YXRlO1xuICAgICAgICAgICAgaWYgKHJ1bklkICE9PSBydW5zKSByZXR1cm47XG4gICAgICAgICAgICAhc3RhdGUuaXNEb25lIHx8XG4gICAgICAgICAgICAgIEZhaWxgQ2Fubm90IHJlc29sdmUgYSBkb25lIHJldHJ5YWJsZSBmbG93ICR7dGhpcy5mYWNldHMuZmxvd31gO1xuICAgICAgICAgICAgb3V0Y29tZUtpdC5yZXNvbHZlci5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgIGZsb3dGb3JPdXRjb21lVm93S2V5LmRlbGV0ZSh0b1Bhc3NhYmxlQ2FwKG91dGNvbWVLaXQudm93KSk7XG4gICAgICAgICAgICBzdGF0ZS5pc0RvbmUgPSB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25SZWplY3RlZChyZWFzb24sIHJ1bklkKSB7XG4gICAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgICAgY29uc3QgeyBydW5zLCBvdXRjb21lS2l0IH0gPSBzdGF0ZTtcbiAgICAgICAgICAgIGlmIChydW5JZCAhPT0gcnVucykgcmV0dXJuO1xuICAgICAgICAgICAgIXN0YXRlLmlzRG9uZSB8fFxuICAgICAgICAgICAgICBGYWlsYENhbm5vdCByZWplY3QgYSBkb25lIHJldHJ5YWJsZSBmbG93ICR7dGhpcy5mYWNldHMuZmxvd31gO1xuICAgICAgICAgICAgY29uc3QgcmV0cnlSZWFzb24gPSBpc1JldHJ5YWJsZVJlYXNvbihcbiAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgICBzdGF0ZS5sYXN0UmV0cnlSZWFzb24sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHJldHJ5UmVhc29uKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RSZXRyeVJlYXNvbiA9IHJldHJ5UmVhc29uO1xuICAgICAgICAgICAgICB0aGlzLmZhY2V0cy5mbG93LnJlc3RhcnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dGNvbWVLaXQucmVzb2x2ZXIucmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICAgIGZsb3dGb3JPdXRjb21lVm93S2V5LmRlbGV0ZSh0b1Bhc3NhYmxlQ2FwKG91dGNvbWVLaXQudm93KSk7XG4gICAgICAgICAgICAgIHN0YXRlLmlzRG9uZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBtYWtlUmV0cnlhYmxlRmxvd0tpdCA9IGFjdGl2YXRpb25BcmdzID0+IHtcbiAgICAgIGNvbnN0IHJldHJ5YWJsZUtpdCA9IGludGVybmFsTWFrZVJldHJ5YWJsZUZsb3dLaXQoYWN0aXZhdGlvbkFyZ3MpO1xuICAgICAgY29uc3QgeyBmbG93IH0gPSByZXRyeWFibGVLaXQ7XG5cbiAgICAgIGNvbnN0IHZvdyA9IGZsb3cuZ2V0T3V0Y29tZSgpO1xuICAgICAgZmxvd0Zvck91dGNvbWVWb3dLZXkuaW5pdCh0b1Bhc3NhYmxlQ2FwKHZvdyksIGZsb3cpO1xuICAgICAgZmxvdy5yZXN0YXJ0KCk7XG4gICAgICByZXR1cm4gcmV0cnlhYmxlS2l0O1xuICAgIH07XG4gICAgcmV0dXJuIGhhcmRlbihtYWtlUmV0cnlhYmxlRmxvd0tpdCk7XG4gIH07XG5cbiAgLyoqXG4gKiBAdHlwZSB7Vm93VG9vbHNbJ3JldHJ5YWJsZSddfVxuICovXG4gIGNvbnN0IHJldHJ5YWJsZSA9ICh6b25lLCB0YWcsIHJldHJ5YWJsZUZ1bmMpID0+IHtcbiAgICBjb25zdCBtYWtlUmV0cnlhYmxlS2l0ID0gcHJlcGFyZVJldHJ5YWJsZUZsb3dLaXQoem9uZSwgdGFnLCByZXRyeWFibGVGdW5jKTtcbiAgICBjb25zdCB3cmFwcGVyRnVuY05hbWUgPSBgJHt0YWd9X3JldHJ5YWJsZWA7XG5cbiAgICBjb25zdCB3cmFwcGVyRnVuYyA9IHtcbiAgICAgIC8qKiBAcGFyYW0ge2FueVtdfSBhcmdzICovXG4gICAgICBbd3JhcHBlckZ1bmNOYW1lXSguLi5hcmdzKSB7XG4gICAgICAgIC8qIE1ha2Ugc3VyZSBhbnkgZXJyb3IgcmVzdWx0cyBpbiBhIHJlamVjdGVkIHZvdyovXG4gICAgICAgIHJldHVybiBhc1ZvdygoKSA9PiB7XG4gICAgICAgICAgem9uZS5pc1N0b3JhYmxlKGhhcmRlbihhcmdzKSkgfHxcbiAgICAgICAgICAgIEZhaWxgcmV0cnlhYmxlIGFyZ3VtZW50cyBtdXN0IGJlIHN0b3JhYmxlICR7YXJnc31gO1xuICAgICAgICAgIGNvbnN0IHsgZmxvdyB9ID0gbWFrZVJldHJ5YWJsZUtpdChhcmdzKTtcbiAgICAgICAgICByZXR1cm4gZmxvdy5nZXRPdXRjb21lKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9W3dyYXBwZXJGdW5jTmFtZV07XG4gICAgZGVmaW5lUHJvcGVydGllcyh3cmFwcGVyRnVuYywge1xuICAgICAgbGVuZ3RoOiB7IHZhbHVlOiByZXRyeWFibGVGdW5jLmxlbmd0aCB9LFxuICAgIH0pO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgaW5mZXJyZWQgZ2VuZXJpYyBmdW5jKi9cbiAgICByZXR1cm4gaGFyZGVuKHdyYXBwZXJGdW5jKTtcbiAgfTtcblxuICBjb25zdCBhZG1pblJldHJ5YWJsZUZsb3cgPSBvdXRlclpvbmUuZXhvKFxuICAgICdBZG1pblJldHJ5YWJsZUZsb3cnLFxuICAgIEFkbWluUmV0cnlhYmxlRmxvd0ksXG4gICAge1xuICAgICAgLyoqXG4gKiBAcGFyYW0ge1Zvd30gb3V0Y29tZVZvd1xuICovXG4gICAgICBnZXRGbG93Rm9yT3V0Y29tZVZvdyhvdXRjb21lVm93KSB7XG4gICAgICAgIHJldHVybiBmbG93Rm9yT3V0Y29tZVZvd0tleS5nZXQodG9QYXNzYWJsZUNhcChvdXRjb21lVm93KSk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgcHJlcGFyZVJldHJ5YWJsZUZsb3dLaXQsXG4gICAgYWRtaW5SZXRyeWFibGVGbG93LFxuICAgIHJldHJ5YWJsZSxcbiAgfSk7XG59OyRozY9fb25jZS5wcmVwYXJlUmV0cnlhYmxlVG9vbHMocHJlcGFyZVJldHJ5YWJsZVRvb2xzKTtcbmhhcmRlbihwcmVwYXJlUmV0cnlhYmxlVG9vbHMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlUmV0cnlhYmxlVG9vbHM+fSBSZXRyeWFibGVUb29sc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JldHJ5YWJsZVRvb2xzWydhZG1pblJldHJ5YWJsZUZsb3cnXX0gQWRtaW5SZXRyeWFibGVGbG93XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxSZXRyeWFibGVUb29sc1sncHJlcGFyZVJldHJ5YWJsZUZsb3dLaXQnXT59IE1ha2VSZXRyeWFibGVGbG93S2l0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxNYWtlUmV0cnlhYmxlRmxvd0tpdD59IFJldHJ5YWJsZUZsb3dLaXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZXRyeWFibGVGbG93S2l0WydmbG93J119IFJldHJ5YWJsZUZsb3dcbiAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVJldHJ5YWJsZVRvb2xzIjpbInByZXBhcmVSZXRyeWFibGVUb29scyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAARcQhBKBAAACgQAAAfAAAAQGFnb3JpYy92b3ctdjAuMS4wL3NyYy90b29scy5qc3siaW1wb3J0cyI6WyIuL3Zvdy11dGlscy5qcyIsIi4vdm93LmpzIiwiLi93YXRjaC11dGlscy5qcyIsIi4vd2F0Y2guanMiLCIuL3JlamVjdGlvbi10cmFja2VyLmpzIiwiLi9yZXRyeWFibGUuanMiLCIuL3doZW4uanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlQmFzaWNWb3dUb29scyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VBc1ZvdyxwcmVwYXJlVm93S2l0LHByZXBhcmVXYXRjaFV0aWxzLHByZXBhcmVXYXRjaCxwcmVwYXJlVm93UmVqZWN0aW9uVHJhY2tlcixwcmVwYXJlUmV0cnlhYmxlVG9vbHMsbWFrZVdoZW47JGjNj19pbXBvcnRzKFtbXCIuL3Zvdy11dGlscy5qc1wiLCBbW1wibWFrZUFzVm93XCIsWyRozY9fYSA9PiAobWFrZUFzVm93ID0gJGjNj19hKV1dXV0sW1wiLi92b3cuanNcIiwgW1tcInByZXBhcmVWb3dLaXRcIixbJGjNj19hID0+IChwcmVwYXJlVm93S2l0ID0gJGjNj19hKV1dXV0sW1wiLi93YXRjaC11dGlscy5qc1wiLCBbW1wicHJlcGFyZVdhdGNoVXRpbHNcIixbJGjNj19hID0+IChwcmVwYXJlV2F0Y2hVdGlscyA9ICRozY9fYSldXV1dLFtcIi4vd2F0Y2guanNcIiwgW1tcInByZXBhcmVXYXRjaFwiLFskaM2PX2EgPT4gKHByZXBhcmVXYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vcmVqZWN0aW9uLXRyYWNrZXIuanNcIiwgW1tcInByZXBhcmVWb3dSZWplY3Rpb25UcmFja2VyXCIsWyRozY9fYSA9PiAocHJlcGFyZVZvd1JlamVjdGlvblRyYWNrZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3JldHJ5YWJsZS5qc1wiLCBbW1wicHJlcGFyZVJldHJ5YWJsZVRvb2xzXCIsWyRozY9fYSA9PiAocHJlcGFyZVJldHJ5YWJsZVRvb2xzID0gJGjNj19hKV1dXV0sW1wiLi93aGVuLmpzXCIsIFtbXCJtYWtlV2hlblwiLFskaM2PX2EgPT4gKG1ha2VXaGVuID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0lzUmV0cnlhYmxlUmVhc29uLCBBc1Byb21pc2VGdW5jdGlvbiwgRnVsZmlsbGVkLCBWb3csIFZvd1Rvb2xzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIE5COiBOb3QgdG8gYmUgdXNlZCBpbiBhIFZhdC4gSXQgZG9lc24ndCBrbm93IHdoYXQgYW4gdXBncmFkZSBpcy4gRm9yIHRoYXQgeW91XG4gKiBuZWVkIGBwcmVwYXJlVm93VG9vbHNgIGZyb20gYHZhdC5qc2AuXG4gKlxuICogQHBhcmFtIHtab25lfSB6b25lXG4gKiBAcGFyYW0ge29iamVjdH0gW3Bvd2Vyc11cbiAqIEBwYXJhbSB7SXNSZXRyeWFibGVSZWFzb259IFtwb3dlcnMuaXNSZXRyeWFibGVSZWFzb25dXG4gKiBAcmV0dXJucyB7Vm93VG9vbHN9XG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlQmFzaWNWb3dUb29scyA9ICh6b25lLCBwb3dlcnMgPSB7fSkgPT4ge1xuICBjb25zdCB7IGlzUmV0cnlhYmxlUmVhc29uID0gLyoqIEB0eXBlIHtJc1JldHJ5YWJsZVJlYXNvbn0gKi8gKCgpID0+IGZhbHNlKSB9ID1cbiAgICBwb3dlcnM7XG4gIGNvbnN0IHZvd1JlamVjdGlvblRyYWNrZXIgPSBwcmVwYXJlVm93UmVqZWN0aW9uVHJhY2tlcih6b25lKTtcbiAgY29uc3QgbWFrZVZvd0tpdCA9IHByZXBhcmVWb3dLaXQoem9uZSwgdm93UmVqZWN0aW9uVHJhY2tlcik7XG4gIGNvbnN0IHdoZW4gPSBtYWtlV2hlbihpc1JldHJ5YWJsZVJlYXNvbik7XG4gIGNvbnN0IHdhdGNoID0gcHJlcGFyZVdhdGNoKHpvbmUsIG1ha2VWb3dLaXQsIGlzUmV0cnlhYmxlUmVhc29uKTtcbiAgY29uc3QgbWFrZVdhdGNoVXRpbHMgPSBwcmVwYXJlV2F0Y2hVdGlscyh6b25lLCB7XG4gICAgd2F0Y2gsXG4gICAgd2hlbixcbiAgICBtYWtlVm93S2l0LFxuICAgIGlzUmV0cnlhYmxlUmVhc29uLFxuICB9KTtcbiAgY29uc3Qgd2F0Y2hVdGlscyA9IG1ha2VXYXRjaFV0aWxzKCk7XG4gIGNvbnN0IGFzVm93ID0gbWFrZUFzVm93KG1ha2VWb3dLaXQpO1xuXG4gIGNvbnN0IHsgcmV0cnlhYmxlIH0gPSBwcmVwYXJlUmV0cnlhYmxlVG9vbHMoem9uZSwge1xuICAgIG1ha2VWb3dLaXQsXG4gICAgaXNSZXRyeWFibGVSZWFzb24sXG4gIH0pO1xuXG4gIC8qKlxuICogVm93LXRvbGVyYW50IGltcGxlbWVudGF0aW9uIG9mIFByb21pc2UuYWxsIHRoYXQgdGFrZXMgYW4gaXRlcmFibGUgb2Ygdm93c1xuICogYW5kIG90aGVyIHtAbGluayBQYXNzYWJsZX1zIGFuZCByZXR1cm5zIGEgc2luZ2xlIHtAbGluayBWb3d9LiBJdCByZXNvbHZlc1xuICogd2l0aCBhbiBhcnJheSBvZiB2YWx1ZXMgd2hlbiBhbGwgb2YgdGhlIGlucHV0J3MgcHJvbWlzZXMgb3Igdm93cyBhcmVcbiAqIGZ1bGZpbGxlZCBhbmQgcmVqZWN0cyB3aGVuIGFueSBvZiB0aGUgaW5wdXQncyBwcm9taXNlcyBvciB2b3dzIGFyZVxuICogcmVqZWN0ZWQgd2l0aCB0aGUgZmlyc3QgcmVqZWN0aW9uIHJlYXNvbi5cbiAqXG4gKiBAdGVtcGxhdGUge3JlYWRvbmx5IHVua25vd25bXX0gVFNcbiAqIEBwYXJhbSB7VFN9IG1heWJlVm93c1xuICogQHJldHVybnMge1Zvdzx7IFtQIGluIGtleW9mIFRTXTogRnVsZmlsbGVkPFRTW1BdPiB9Pn1cbiAqL1xuICBjb25zdCBhbGwgPSBtYXliZVZvd3MgPT4gd2F0Y2hVdGlscy5hbGwobWF5YmVWb3dzKTtcblxuICAvKipcbiAqIEBkZXByZWNhdGVkIHVzZSBgdm93VG9vbHMuYWxsYFxuICogQHRlbXBsYXRlIHtyZWFkb25seSB1bmtub3duW119IFRTXG4gKiBAcGFyYW0ge1RTfSBtYXliZVZvd3NcbiAqIEByZXR1cm5zIHtWb3c8eyBbUCBpbiBrZXlvZiBUU106IEZ1bGZpbGxlZDxUU1tQXT59Pn1cbiAqL1xuICBjb25zdCBhbGxWb3dzID0gYWxsO1xuXG4gIC8qKlxuICogVm93LXRvbGVyYW50IGltcGxlbWVudGF0aW9uIG9mIFByb21pc2UuYWxsU2V0dGxlZCB0aGF0IHRha2VzIGFuIGl0ZXJhYmxlXG4gKiBvZiB2b3dzIGFuZCBvdGhlciB7QGxpbmsgUGFzc2FibGV9cyBhbmQgcmV0dXJucyBhIHNpbmdsZSB7QGxpbmsgVm93fS4gSXRcbiAqIHJlc29sdmVzIHdoZW4gYWxsIG9mIHRoZSBpbnB1dCdzIHByb21pc2VzIG9yIHZvd3MgYXJlIHNldHRsZWQgd2l0aCBhblxuICogYXJyYXkgb2Ygc2V0dGxlZCBvdXRjb21lIG9iamVjdHMuXG4gKlxuICogQHRlbXBsYXRlIHtyZWFkb25seSB1bmtub3duW119IFRTXG4gKiBAcGFyYW0ge1RTfSBtYXliZVZvd3NcbiAqIEByZXR1cm5zIHtWb3c8eyBbUCBpbiBrZXlvZiBUU106IFByb21pc2VTZXR0bGVkUmVzdWx0PEZ1bGZpbGxlZDxUU1tQXT4+IH0+fVxuICovXG4gIGNvbnN0IGFsbFNldHRsZWQgPSBtYXliZVZvd3MgPT4gd2F0Y2hVdGlscy5hbGxTZXR0bGVkKG1heWJlVm93cyk7XG5cbiAgLyoqIEB0eXBlIHtBc1Byb21pc2VGdW5jdGlvbn0gKi9cbiAgY29uc3QgYXNQcm9taXNlID0gKHNwZWNpbWVuUCwgLi4ud2F0Y2hlckFyZ3MpID0+XG4gICAgd2F0Y2hVdGlscy5hc1Byb21pc2Uoc3BlY2ltZW5QLCAuLi53YXRjaGVyQXJncyk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgd2hlbixcbiAgICB3YXRjaCxcbiAgICBtYWtlVm93S2l0LFxuICAgIGFsbCxcbiAgICBhbGxWb3dzLFxuICAgIGFsbFNldHRsZWQsXG4gICAgYXNWb3csXG4gICAgYXNQcm9taXNlLFxuICAgIHJldHJ5YWJsZSxcbiAgICByZXRyaWFibGU6IHJldHJ5YWJsZSAgLyogRm9yIHRlbXBvcmFyeSBiYWNrd2FyZHMgY29tcGF0IHdpdGggYWxwaGEgaW1wbGVtZW50YXRpb24qL1xuICB9KTtcbn07JGjNj19vbmNlLnByZXBhcmVCYXNpY1Zvd1Rvb2xzKHByZXBhcmVCYXNpY1Zvd1Rvb2xzKTtcbmhhcmRlbihwcmVwYXJlQmFzaWNWb3dUb29scyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlQmFzaWNWb3dUb29scyI6WyJwcmVwYXJlQmFzaWNWb3dUb29scyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAu5cbEJREAACURAAAlAAAAQGFnb3JpYy92b3ctdjAuMS4wL3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbixlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLGFubm90YXRlRXJyb3IsWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dLFtcImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXNcIixbJGjNj19hID0+IChlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogV0FSTklORzogR2xvYmFsIE11dGFibGUgU3RhdGUhKi9cbi8qIFRoaXMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIGBhc3NlcnRgIHRoYXQgbWFrZXMgaXQgYXZhaWxhYmxlIHRvIHRoZSovXG4vKiBjYXVzYWwgY29uc29sZSwgd2hpY2ggYWZmZWN0cyB0aGUgY29uc29sZSBsb2cgb3V0cHV0LiBOb3JtYWxseSB3ZSovXG4vKiByZWdhcmQgdGhlIGFiaWxpdHkgdG8gc2VlIGNvbnNvbGUgbG9nIG91dHB1dCBhcyBhIG1ldGEtbGV2ZWwgcHJpdmlsZWdlKi9cbi8qIGFuYWxvZ291cyB0byB0aGUgYWJpbGl0eSB0byBkZWJ1Zy4gQXNpZGUgZnJvbSB0aGF0LCB0aGlzIG1vZHVsZSBzaG91bGQqL1xuLyogbm90IGhhdmUgYW55IG9ic2VydmFibHkgbXV0YWJsZSBzdGF0ZS4qL1xuXG5sZXQgaGlkZGVuUHJpb3JFcnJvcjtcbmxldCBoaWRkZW5DdXJyZW50VHVybiA9IDA7XG5sZXQgaGlkZGVuQ3VycmVudEV2ZW50ID0gMDtcblxuLyogVHVybiBvbiBpZiB5b3Ugc2VlbSB0byBiZSBsb3NpbmcgZXJyb3IgbG9nZ2luZyBhdCB0aGUgdG9wIG9mIHRoZSBldmVudCBsb29wKi9cbmNvbnN0IFZFUkJPU0UgPSBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKCdERUJVRycsICd0cmFjay10dXJucycpO1xuXG4vKiBUcmFjay10dXJucyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZCBjYW4gYmUgZW5hYmxlZCBieSBhbiBlbnZpcm9ubWVudCovXG4vKiBvcHRpb24uKi9cbmNvbnN0IEVOQUJMRUQgPVxuICBnZXRFbnZpcm9ubWVudE9wdGlvbignVFJBQ0tfVFVSTlMnLCAnZGlzYWJsZWQnLCBbJ2VuYWJsZWQnXSkgPT09ICdlbmFibGVkJztcblxuLyogV2UgaG9pc3QgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgb3V0IG9mIHRyYWNrVHVybnMoKSB0byBkaXNjb3VyYWdlIHRoZSovXG4vKiBjbG9zdXJlcyBmcm9tIGhvbGRpbmcgb250byAnYXJncycgb3IgJ2Z1bmMnIGxvbmdlciB0aGFuIG5lY2Vzc2FyeSwqL1xuLyogd2hpY2ggd2UndmUgc2VlbiBjYXVzZSBIYW5kbGVkUHJvbWlzZSBhcmd1bWVudHMgdG8gYmUgcmV0YWluZWQgZm9yKi9cbi8qIGEgc3VycHJpc2luZ2x5IGxvbmcgdGltZS4qL1xuXG5jb25zdCBhZGRSZWplY3Rpb25Ob3RlID0gZGV0YWlsc05vdGUgPT4gcmVhc29uID0+IHtcbiAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgYW5ub3RhdGVFcnJvcihyZWFzb24sIGRldGFpbHNOb3RlKTtcbiAgfVxuICBpZiAoVkVSQk9TRSkge1xuICAgIGNvbnNvbGUubG9nKCdSRUpFQ1RFRCBhdCB0b3Agb2YgZXZlbnQgbG9vcCcsIHJlYXNvbik7XG4gIH1cbn07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbiA9XG4gIChmdW5jLCBzZW5kaW5nRXJyb3IpID0+XG4gICguLi5hcmdzKSA9PiB7XG4gICAgaGlkZGVuUHJpb3JFcnJvciA9IHNlbmRpbmdFcnJvcjtcbiAgICBoaWRkZW5DdXJyZW50VHVybiArPSAxO1xuICAgIGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG4gICAgdHJ5IHtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBmdW5jKC4uLmFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGFubm90YXRlRXJyb3IoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBYYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoVkVSQk9TRSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIC8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG4gICAgICBjb25zdCBkZXRhaWxzTm90ZSA9IFhgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcbiAgICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGhpZGRlblByaW9yRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIEdpdmVuIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzLCByZXR1cm5zIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzIHdob3NlXG4gKiBgdGhpc2AtZnJlZSBjYWxsIGJlaGF2aW9ycyBhcmUgbm90IG9ic2VydmFibHkgZGlmZmVyZW50IHRvIHRob3NlIHRoYXRcbiAqIGNhbm5vdCBzZWUgY29uc29sZSBvdXRwdXQuIFRoZSBvbmx5IHB1cnBvc2UgaXMgdG8gY2F1c2UgYWRkaXRpb25hbFxuICogaW5mb3JtYXRpb24gdG8gYXBwZWFyIG9uIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBjYWxsIHRvIGB0cmFja1R1cm5zYCBpcyBpdHNlbGYgYSBzZW5kaW5nIGV2ZW50LCB0aGF0IG9jY3VycyBpbiBzb21lIGNhbGxcbiAqIHN0YWNrIGluIHNvbWUgdHVybiBudW1iZXIgYXQgc29tZSBldmVudCBudW1iZXIgd2l0aGluIHRoYXQgdHVybi4gRWFjaCBjYWxsXG4gKiB0byBhbnkgb2YgdGhlIHJldHVybmVkIGBUdXJuU3RhcnRGbmBzIGlzIGEgcmVjZWl2aW5nIGV2ZW50IHRoYXQgYmVnaW5zIGEgbmV3XG4gKiB0dXJuLiBUaGlzIHNlbmRpbmcgZXZlbnQgY2F1c2VkIGVhY2ggb2YgdGhvc2UgcmVjZWl2aW5nIGV2ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUge1R1cm5TdGFydGVyRm5bXX0gVFxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbiAgICAgICBjb25zdCB0cmFja1R1cm5zID0gZnVuY3MgPT4ge1xuICBpZiAoIUVOQUJMRUQgfHwgdHlwZW9mIGdsb2JhbFRoaXMgPT09ICd1bmRlZmluZWQnIHx8ICFnbG9iYWxUaGlzLmFzc2VydCkge1xuICAgIHJldHVybiBmdW5jcztcbiAgfVxuXG4gIGhpZGRlbkN1cnJlbnRFdmVudCArPSAxO1xuICBjb25zdCBzZW5kaW5nRXJyb3IgPSBFcnJvcihcbiAgICBgRXZlbnQ6ICR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWAsXG4gICk7XG4gIGlmIChoaWRkZW5QcmlvckVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbm5vdGF0ZUVycm9yKHNlbmRpbmdFcnJvciwgWGBDYXVzZWQgYnk6ICR7aGlkZGVuUHJpb3JFcnJvcn1gKTtcbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge1R9ICovIChcbiAgICBmdW5jcy5tYXAoZnVuYyA9PiBmdW5jICYmIHdyYXBGdW5jdGlvbihmdW5jLCBzZW5kaW5nRXJyb3IpKVxuICApO1xufTtcblxuLyoqXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqXG4gKiBAdHlwZWRlZiB7KCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IHVuZGVmaW5lZH0gVHVyblN0YXJ0ZXJGblxuICovJGjNj19vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cmFja1R1cm5zIjpbInRyYWNrVHVybnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJQAAAEBhZ29yaWMvdm93LXYwLjEuMC9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2uU8XwkQAAAJEAAAIwAAAEBhZ29yaWMvdm93LXYwLjEuMC9zcmMvdm93LXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJWb3dTaGFwZSIsImJhc2ljRSIsImdldFZvd1BheWxvYWQiLCJpc1ZvdyIsIm1ha2VBc1ZvdyIsInNpbmsiLCJ0b1Bhc3NhYmxlQ2FwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYmFzaWNFLGlzUGFzc2FibGUsTSxtYXRjaGVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKGJhc2ljRSA9ICRozY9fYSksJGjNj19saXZlW1wiYmFzaWNFXCJdXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJpc1Bhc3NhYmxlXCIsWyRozY9fYSA9PiAoaXNQYXNzYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGVDYXB9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7Vm93UGF5bG9hZCwgVm93LCBQcm9taXNlVm93fSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge01ha2VWb3dLaXR9IGZyb20gJy4vdm93LmpzJztcbiAqL1xuXG4gICAgICAgY29uc3Qgc2luayA9ICgpID0+IHt9OyRozY9fb25jZS5zaW5rKHNpbmspO1xuaGFyZGVuKHNpbmspO1xuXG5cblxuICAgICAgIGNvbnN0IFZvd1NoYXBlID0gTS50YWdnZWQoXG4gICdWb3cnLFxuICBNLnNwbGl0UmVjb3JkKHtcbiAgICB2b3dWMDogTS5yZW1vdGFibGUoJ1Zvd1YwJyksXG4gIH0pLFxuKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7c3BlY2ltZW4gaXMgVm93fVxuICovJGjNj19vbmNlLlZvd1NoYXBlKFZvd1NoYXBlKTtcbiAgICAgICBjb25zdCBpc1ZvdyA9IHNwZWNpbWVuID0+XG4gIGlzUGFzc2FibGUoc3BlY2ltZW4pICYmIG1hdGNoZXMoc3BlY2ltZW4sIFZvd1NoYXBlKTskaM2PX29uY2UuaXNWb3coaXNWb3cpO1xuaGFyZGVuKGlzVm93KTtcblxuLyoqXG4gKiBBIHZvdyBpcyBhIHBhc3NhYmxlIHRhZ2dlZCBhcyAnVm93Jy4gIEl0cyBwYXlsb2FkIGlzIGEgcmVjb3JkIHdpdGhcbiAqIEFQSS12ZXJzaW9uZWQgcmVtb3RhYmxlcy4gIHBheWxvYWQudm93VjAgaXMgdGhlIEFQSSBmb3IgdGhlIGB3YXRjaGAgYW5kXG4gKiBgd2hlbmAgb3BlcmF0b3JzIHRvIHVzZSBmb3IgcmV0cnlhYmxlIHNob3J0ZW5pbmcgb2YgdGhlIHZvdyBjaGFpbi5cbiAqXG4gKiBJZiB0aGUgc3BlY2ltZW4gaXMgYSBWb3csIHJldHVybiBpdHMgcGF5bG9hZCwgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuIGFueSB2YWx1ZSB0byB2ZXJpZnkgYXMgYSB2b3dcbiAqIEByZXR1cm5zIHtWb3dQYXlsb2FkPFQ+IHwgdW5kZWZpbmVkfSB1bmRlZmluZWQgaWYgc3BlY2ltZW4gaXMgbm90IGEgdm93LCBvdGhlcndpc2UgdGhlIHZvdydzIHBheWxvYWQuXG4gKi9cbiAgICAgICBjb25zdCBnZXRWb3dQYXlsb2FkID0gc3BlY2ltZW4gPT4ge1xuICBpZiAoIWlzVm93KHNwZWNpbWVuKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCB2b3cgPSAvKiogQHR5cGUge1ZvdzxUPn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHNwZWNpbWVuKSk7XG4gIHJldHVybiB2b3cucGF5bG9hZDtcbn07JGjNj19vbmNlLmdldFZvd1BheWxvYWQoZ2V0Vm93UGF5bG9hZCk7XG5oYXJkZW4oZ2V0Vm93UGF5bG9hZCk7XG5cbi8qKlxuICogRm9yIHdoZW4geW91IGhhdmUgYSBWb3cgb3IgYSBgUGFzc2FibGVDYXBgIChgUmVtb3RhYmxlT2JqZWN0YCBvclxuICogcGFzc2FibGUgYFByb21pc2VgKSBhbmQgeW91IG5lZWQgYFBhc3NhYmxlQ2FwYCxcbiAqIHR5cGljYWxseSB0byBzZXJ2ZSBhcyBhIGtleSBpbiBhIGBNYXBgLCBgV2Vha01hcGAsIGBTdG9yZWAsIG9yIGBXZWFrU3RvcmVgLlxuICpcbiAqIFJlbGllcyBvbiwgYW5kIGVuY2Fwc3VsYXRlcywgdGhlIGN1cnJlbnQgXCJWMFwiIHJlcHJlc2VudGF0aW9uIG9mIGEgdm93XG4gKiBhcyBjb250YWluaW5nIGEgdW5pcXVlIHJlbW90YWJsZSBzaG9ydGVuZXIuXG4gKlxuICogTm90ZTogaWYgYGtgIGlzIG5vdCBhIGBWb3dgLCBgdG9QYXNzYWJsZUNhcGAgZG9lcyBubyBlbmZvcmNlbWVudCB0aGF0IGBrYFxuICogaXMgYWxyZWFkeSBhIGBQYXNzYWJsZUNhcGAuIFJhdGhlciwgaXQganVzdCBhY3RzIGFzIGFuIGlkZW50aXR5IGZ1bmN0aW9uXG4gKiByZXR1cm5pbmcgYGtgIHdpdGhvdXQgZnVydGhlciBjaGVja2luZy4gVGhlIHR5cGVzIG9ubHkgZGVzY3JpYmUgdGhlXG4gKiBpbnRlbmRlZCB1c2UuIChJZiB3YXJyYW50ZWQsIHdlIG1heSBsYXRlciBhZGQgc3VjaCBlbmZvcmNlbWVudCwgc28gcGxlYXNlXG4gKiBkbyBub3QgcmVseSBvbiBlaXRoZXIgdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2Ygc3VjaCBlbmZvcmNlbWVudC4pXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZUNhcCB8IFZvd30ga1xuICogQHJldHVybnMge1Bhc3NhYmxlQ2FwfVxuICovXG4gICAgICAgY29uc3QgdG9QYXNzYWJsZUNhcCA9IGsgPT4ge1xuICBjb25zdCBwYXlsb2FkID0gZ2V0Vm93UGF5bG9hZChrKTtcbiAgaWYgKHBheWxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1Bhc3NhYmxlQ2FwfSAqLyAoayk7XG4gIH1cbiAgY29uc3QgeyB2b3dWMCB9ID0gcGF5bG9hZDtcbiAgLyogdm93TWFwLnNldCh2b3dWMCwgaCk7Ki9cbiAgcmV0dXJuIHZvd1YwO1xufTskaM2PX29uY2UudG9QYXNzYWJsZUNhcCh0b1Bhc3NhYmxlQ2FwKTtcbmhhcmRlbih0b1Bhc3NhYmxlQ2FwKTtcblxuLyoqIEBwYXJhbSB7TWFrZVZvd0tpdH0gbWFrZVZvd0tpdCAqL1xuICAgICAgIGNvbnN0IG1ha2VBc1ZvdyA9IG1ha2VWb3dLaXQgPT4ge1xuICAvKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGNvZXJjZXMgdGhlIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIHRvIGEgVm93LiBIZWxwZnVsXG4gKiBmb3Igc2NlbmFyaW9zIGxpa2UgYSBzeW5jaHJvbm91c2x5IHRocm93biBlcnJvci5cbiAqIEB0ZW1wbGF0ZSB7YW55fSBUXG4gKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gVm93PEF3YWl0ZWQ8VD4+IHwgQXdhaXRlZDxUPiB8IFByb21pc2VWb3c8VD59IGZuXG4gKiBAcmV0dXJucyB7Vm93PEF3YWl0ZWQ8VD4+fVxuICovXG4gIGNvbnN0IGFzVm93ID0gZm4gPT4ge1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGZuKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0ID0gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgfVxuICAgIGlmIChpc1ZvdyhyZXN1bHQpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjb25zdCB7IHZvdywgcmVzb2x2ZXIgfSA9IG1ha2VWb3dLaXQoKTtcbiAgICByZXNvbHZlci5yZXNvbHZlKHJlc3VsdCk7XG4gICAgcmV0dXJuIHZvdztcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihhc1Zvdyk7XG59OyRozY9fb25jZS5tYWtlQXNWb3cobWFrZUFzVm93KTtcbmhhcmRlbihtYWtlQXNWb3cpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiYmFzaWNFIjpbImJhc2ljRSIsZmFsc2VdfSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNpbmsiOlsic2luayJdLCJWb3dTaGFwZSI6WyJWb3dTaGFwZSJdLCJpc1ZvdyI6WyJpc1ZvdyJdLCJnZXRWb3dQYXlsb2FkIjpbImdldFZvd1BheWxvYWQiXSwidG9QYXNzYWJsZUNhcCI6WyJ0b1Bhc3NhYmxlQ2FwIl0sIm1ha2VBc1ZvdyI6WyJtYWtlQXNWb3ciXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArBd0IZAgAACQIAAAHQAAAEBhZ29yaWMvdm93LXYwLjEuMC9zcmMvdm93LmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vcGF0dGVybnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGFnb3JpYy9iYXNlLXpvbmUiXSwiZXhwb3J0cyI6WyJwcmVwYXJlVm93S2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVByb21pc2VLaXQsTSxtYWtlVGFnZ2VkLFByb21pc2VXYXRjaGVySTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2Jhc2Utem9uZVwiLCBbW1wiUHJvbWlzZVdhdGNoZXJJXCIsWyRozY9fYSA9PiAoUHJvbWlzZVdhdGNoZXJJID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5jb25zdCB7IGRldGFpbHM6IFggfSA9IGFzc2VydDtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuaGFyZGVuKG5vb3ApO1xuXG4vKipcbiAqIEBpbXBvcnQge1Byb21pc2VLaXR9IGZyb20gJ0BlbmRvL3Byb21pc2Uta2l0JztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge1Zvd1Jlc29sdmVyLCBWb3dLaXR9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7Vm93UmVqZWN0aW9uVHJhY2tlcn0gZnJvbSAnLi9yZWplY3Rpb24tdHJhY2tlci5qcyc7XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxQcm9taXNlS2l0PGFueT4+ICZcbiAqICAgUGljazxQcm9taXNlS2l0PGFueT4sICdwcm9taXNlJz4gJlxuICogICB7IHBvdGVudGlhbGx5SGFuZGxlZD86IGJvb2xlYW4gfX0gVm93RXBoZW1lcmFcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7Wm9uZX0gem9uZVxuICogQHBhcmFtIHtWb3dSZWplY3Rpb25UcmFja2VyfSBbdm93UmVqZWN0aW9uVHJhY2tlcl1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVWb3dLaXQgPSAoem9uZSwgdm93UmVqZWN0aW9uVHJhY2tlcikgPT4ge1xuICAvKiogQHR5cGUge1dlYWtNYXA8Vm93UmVzb2x2ZXIsIFZvd0VwaGVtZXJhPn0gKi9cbiAgY29uc3QgcmVzb2x2ZXJUb0VwaGVtZXJhID0gbmV3IFdlYWtNYXAoKTtcblxuICAvKiogQHR5cGUge1dlYWtNYXA8Vm93UmVzb2x2ZXIsIGFueT59ICovXG4gIGNvbnN0IHJlc29sdmVyVG9Ob25TdG9yZWRWYWx1ZSA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLyoqXG4gKiBHZXQgdGhlIGVwaGVtZXJhIGFzc29jaWF0ZWQgd2l0aCBhIHZvd0tpdC5yZXNvbHZlci5cbiAqXG4gKiBAcGFyYW0ge1Zvd1Jlc29sdmVyfSByZXNvbHZlclxuICogQHBhcmFtIHt7IHBvdGVudGlhbGx5SGFuZGxlZD86IGJvb2xlYW4gfX0gW29wdGlvbnNdXG4gKi9cbiAgY29uc3QgcHJvdmlkZUVwaGVtZXJhID0gKHJlc29sdmVyLCBvcHRpb25zKSA9PiB7XG4gICAgbGV0IGVwaGVtZXJhID0gcmVzb2x2ZXJUb0VwaGVtZXJhLmdldChyZXNvbHZlcik7XG4gICAgaWYgKCFlcGhlbWVyYSkge1xuICAgICAgZXBoZW1lcmEgPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgLyogU2lsZW5jZSB0aGlzIGludGVybmFsIHByb21pc2UncyByZWplY3Rpb25zLCBzaW5jZSB3ZSB1c2UgdGhlKi9cbiAgICAgIC8qIHJlamVjdGlvblRyYWNrZXIgaW5zdGVhZC4qL1xuICAgICAgZXBoZW1lcmEucHJvbWlzZS5jYXRjaChub29wKTtcbiAgICB9XG5cbiAgICBlcGhlbWVyYSA9IGhhcmRlbih7IC4uLmVwaGVtZXJhLCAuLi5vcHRpb25zIH0pO1xuICAgIHJlc29sdmVyVG9FcGhlbWVyYS5zZXQocmVzb2x2ZXIsIGVwaGVtZXJhKTtcbiAgICByZXR1cm4gZXBoZW1lcmE7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Zvd1Jlc29sdmVyfSByZXNvbHZlclxuICovXG4gIGNvbnN0IHByb3ZpZGVFcGhlbWVyYUZvclJlc29sdXRpb24gPSByZXNvbHZlciA9PiB7XG4gICAgY29uc3QgZXBoZW1lcmEgPSBwcm92aWRlRXBoZW1lcmEocmVzb2x2ZXIpO1xuICAgIGlmIChlcGhlbWVyYS5yZXNvbHZlKSB7XG4gICAgICAvKiBSZXNvbHV0aW9uIGlzIGEgb25lLXRpbWUgZXZlbnQsIHNvIGZvcmdldCB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zLiovXG4gICAgICBjb25zdCB7IHJlc29sdmU6IF8xLCByZWplY3Q6IF8yLCAuLi5yZXN0IH0gPSBlcGhlbWVyYTtcbiAgICAgIHJlc29sdmVyVG9FcGhlbWVyYS5zZXQocmVzb2x2ZXIsIGhhcmRlbihyZXN0KSk7XG4gICAgfVxuICAgIHJldHVybiBlcGhlbWVyYTtcbiAgfTtcblxuICBjb25zdCBtYWtlVm93SW50ZXJuYWxzS2l0ID0gem9uZS5leG9DbGFzc0tpdChcbiAgICAnVm93SW50ZXJuYWxzS2l0JyxcbiAgICB7XG4gICAgICB2b3dWMDogTS5pbnRlcmZhY2UoJ1Zvd1YwJywge1xuICAgICAgICBzaG9ydGVuOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICAgIH0pLFxuICAgICAgcmVzb2x2ZXI6IE0uaW50ZXJmYWNlKCdWb3dSZXNvbHZlcicsIHtcbiAgICAgICAgcmVzb2x2ZTogTS5jYWxsKCkub3B0aW9uYWwoTS5yYXcoKSkucmV0dXJucygpLFxuICAgICAgICByZWplY3Q6IE0uY2FsbCgpLm9wdGlvbmFsKE0ucmF3KCkpLnJldHVybnMoKSxcbiAgICAgIH0pLFxuICAgICAgd2F0Y2hOZXh0U3RlcDogUHJvbWlzZVdhdGNoZXJJLFxuICAgIH0sXG4gICAgKCkgPT4gKHtcbiAgICAgIC8qKiBAdHlwZSB7YW55fSAqL1xuICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIC8qKlxuICogVGhlIHN0ZXBTdGF0dXMgaXMgbnVsbCBpZiB0aGUgcHJvbWlzZSBzdGVwIGhhc24ndCBzZXR0bGVkIHlldC5cbiAqIEB0eXBlIHtudWxsIHwgJ3BlbmRpbmcnIHwgJ2Z1bGZpbGxlZCcgfCAncmVqZWN0ZWQnfVxuICovXG4gICAgICBzdGVwU3RhdHVzOiBudWxsLFxuICAgICAgaXNTdG9yZWRWYWx1ZTogZmFsc2UsXG4gICAgICAvKipcbiAqIFNvbWUgdmVyc2lvbnMgb2YgdGhlIFZvd0ludGVybmFsc0tpdCB3aWxsIG5vdCBoYXZlIHRoaXMgcHJvcGVydHksXG4gKiAoYW5kIGl0IGNhbm5vdCBiZSBhZGRlZCBkeW5hbWljYWxseSkuXG4gKiBAdHlwZSB7Ym9vbGVhbiB8IHVuZGVmaW5lZH1cbiAqL1xuICAgICAgdm93SXNIYW5kbGVkOiBmYWxzZSxcbiAgICAgIC8qKlxuICogUmVjb3JkIGZvciBmdXR1cmUgcHJvcGVydGllcyB0aGF0IGFyZW4ndCBpbiB0aGUgc2NoZW1hLlxuICogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy83NDA3XG4gKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZH1cbiAqL1xuICAgICAgZXh0cmE6IHVuZGVmaW5lZCxcbiAgICB9KSxcbiAgICB7XG4gICAgICB2b3dWMDoge1xuICAgICAgICAvKipcbiAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gKi9cbiAgICAgICAgYXN5bmMgc2hvcnRlbigpIHtcbiAgICAgICAgICBjb25zdCB7IHN0ZXBTdGF0dXMsIGlzU3RvcmVkVmFsdWUsIHZhbHVlLCB2b3dJc0hhbmRsZWQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyByZXNvbHZlciwgdm93VjAgfSA9IHRoaXMuZmFjZXRzO1xuXG4gICAgICAgICAgc3dpdGNoIChzdGVwU3RhdHVzKSB7XG4gICAgICAgICAgICBjYXNlICdmdWxmaWxsZWQnOiB7XG4gICAgICAgICAgICAgIGlmICh2b3dJc0hhbmRsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS52b3dJc0hhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpc1N0b3JlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLyogQWx3YXlzIHJldHVybiBhIHN0b3JlZCBmdWxmaWxsZWQgdmFsdWUuKi9cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZXJUb05vblN0b3JlZFZhbHVlLmhhcyhyZXNvbHZlcikpIHtcbiAgICAgICAgICAgICAgICAvKiBOb24tc3RvcmVkIHZhbHVlIGlzIGF2YWlsYWJsZS4qL1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlclRvTm9uU3RvcmVkVmFsdWUuZ2V0KHJlc29sdmVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvKiBXZSBjYW4ndCByZWNvdmVyIHRoZSBub24tc3RvcmVkIHZhbHVlLCBzbyB0aHJvdyB0aGUqL1xuICAgICAgICAgICAgICAvKiBleHBsYW5hdGlvbi4qL1xuICAgICAgICAgICAgICB0aHJvdyB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ3JlamVjdGVkJzoge1xuICAgICAgICAgICAgICBpZiAodm93SXNIYW5kbGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUudm93SXNIYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2b3dSZWplY3Rpb25UcmFja2VyPy5oYW5kbGUodm93VjApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IHJlc29sdmVyVG9Ob25TdG9yZWRWYWx1ZS5oYXMocmVzb2x2ZXIpXG4gICAgICAgICAgICAgICAgPyByZXNvbHZlclRvTm9uU3RvcmVkVmFsdWUuZ2V0KHJlc29sdmVyKVxuICAgICAgICAgICAgICAgIDogdmFsdWU7XG5cbiAgICAgICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBudWxsOlxuICAgICAgICAgICAgY2FzZSAncGVuZGluZyc6XG4gICAgICAgICAgICAgIHJldHVybiBwcm92aWRlRXBoZW1lcmEodGhpcy5mYWNldHMucmVzb2x2ZXIsIHtcbiAgICAgICAgICAgICAgICBwb3RlbnRpYWxseUhhbmRsZWQ6IHRydWUsXG4gICAgICAgICAgICAgIH0pLnByb21pc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYHVuZXhwZWN0ZWQgc3RlcFN0YXR1cyAke3N0ZXBTdGF0dXN9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlc29sdmVyOiB7XG4gICAgICAgIC8qKlxuICogQHBhcmFtIHthbnl9IFt2YWx1ZV1cbiAqL1xuICAgICAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGVwU3RhdHVzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGlmIChzdGVwU3RhdHVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc3RhdGUuc3RlcFN0YXR1cyA9ICdwZW5kaW5nJztcblxuICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZSB9ID0gcHJvdmlkZUVwaGVtZXJhRm9yUmVzb2x1dGlvbihyZXNvbHZlcik7XG4gICAgICAgICAgcmVzb2x2ZSAmJiByZXNvbHZlKHZhbHVlKTtcblxuICAgICAgICAgIHpvbmUud2F0Y2hQcm9taXNlKFxuICAgICAgICAgICAgSGFuZGxlZFByb21pc2UucmVzb2x2ZSh2YWx1ZSksXG4gICAgICAgICAgICB0aGlzLmZhY2V0cy53YXRjaE5leHRTdGVwLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICogQHBhcmFtIHthbnl9IFtyZWFzb25dXG4gKi9cbiAgICAgICAgcmVqZWN0KHJlYXNvbikge1xuICAgICAgICAgIGNvbnN0IHsgc3RlcFN0YXR1cyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBpZiAoc3RlcFN0YXR1cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnN0YXRlLnN0ZXBTdGF0dXMgPSAncmVqZWN0ZWQnO1xuXG4gICAgICAgICAgY29uc3QgeyByZXNvbHZlciwgd2F0Y2hOZXh0U3RlcCB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgY29uc3QgeyByZWplY3QgfSA9IHByb3ZpZGVFcGhlbWVyYUZvclJlc29sdXRpb24ocmVzb2x2ZXIpO1xuICAgICAgICAgIHJlamVjdCAmJiByZWplY3QocmVhc29uKTtcbiAgICAgICAgICB3YXRjaE5leHRTdGVwLm9uUmVqZWN0ZWQocmVhc29uKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB3YXRjaE5leHRTdGVwOiB7XG4gICAgICAgIG9uRnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZS5zdGVwU3RhdHVzID0gJ2Z1bGZpbGxlZCc7XG5cbiAgICAgICAgICBjb25zdCB7IHJlc29sdmVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICBjb25zdCB7IHJlc29sdmUgfSA9IHByb3ZpZGVFcGhlbWVyYUZvclJlc29sdXRpb24ocmVzb2x2ZXIpO1xuICAgICAgICAgIGhhcmRlbih2YWx1ZSk7XG4gICAgICAgICAgcmVzb2x2ZSAmJiByZXNvbHZlKHZhbHVlKTtcblxuICAgICAgICAgIHRoaXMuc3RhdGUuaXNTdG9yZWRWYWx1ZSA9IHpvbmUuaXNTdG9yYWJsZSh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUuaXNTdG9yZWRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlclRvTm9uU3RvcmVkVmFsdWUuc2V0KHJlc29sdmVyLCB2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnZhbHVlID0gYXNzZXJ0LmVycm9yKFxuICAgICAgICAgICAgICBYYFZvdyBmdWxmaWxsbWVudCB2YWx1ZSB3YXMgbm90IHN0b3JlZDogJHt2YWx1ZX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVqZWN0ZWQocmVhc29uKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZS5zdGVwU3RhdHVzID0gJ3JlamVjdGVkJztcblxuICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZXIsIHZvd1YwIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICBjb25zdCB7IHJlamVjdCwgcG90ZW50aWFsbHlIYW5kbGVkIH0gPVxuICAgICAgICAgICAgcHJvdmlkZUVwaGVtZXJhRm9yUmVzb2x1dGlvbihyZXNvbHZlcik7XG4gICAgICAgICAgaGFyZGVuKHJlYXNvbik7XG4gICAgICAgICAgcmVqZWN0ICYmIHJlamVjdChyZWFzb24pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUudm93SXNIYW5kbGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHBvdGVudGlhbGx5SGFuZGxlZCkge1xuICAgICAgICAgICAgICB0aGlzLnN0YXRlLnZvd0lzSGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2b3dSZWplY3Rpb25UcmFja2VyPy5yZWplY3Qodm93VjAsIHJlYXNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc3RhdGUuaXNTdG9yZWRWYWx1ZSA9IHpvbmUuaXNTdG9yYWJsZShyZWFzb24pO1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmlzU3RvcmVkVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudmFsdWUgPSByZWFzb247XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmVyVG9Ob25TdG9yZWRWYWx1ZS5zZXQocmVzb2x2ZXIsIHJlYXNvbik7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnZhbHVlID0gYXNzZXJ0LmVycm9yKFxuICAgICAgICAgICAgICBYYFZvdyByZWplY3Rpb24gcmVhc29uIHdhcyBub3Qgc3RvcmVkOiAke3JlYXNvbn1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1Zvd0tpdDxUPn1cbiAqL1xuICBjb25zdCBtYWtlVm93S2l0ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVzb2x2ZXIsIHZvd1YwIH0gPSBtYWtlVm93SW50ZXJuYWxzS2l0KCk7XG4gICAgY29uc3Qgdm93ID0gbWFrZVRhZ2dlZCgnVm93JywgaGFyZGVuKHsgdm93VjAgfSkpO1xuICAgIHJldHVybiBoYXJkZW4oeyByZXNvbHZlciwgdm93IH0pO1xuICB9O1xuXG4gIHJldHVybiBtYWtlVm93S2l0O1xufTtcbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgcHJlcGFyZVZvd0tpdD59IE1ha2VWb3dLaXQgKi8kaM2PX29uY2UucHJlcGFyZVZvd0tpdChwcmVwYXJlVm93S2l0KTtcblxuaGFyZGVuKHByZXBhcmVWb3dLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVZvd0tpdCI6WyJwcmVwYXJlVm93S2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANAd/3P7JQAA+yUAACUAAABAYWdvcmljL3Zvdy12MC4xLjAvc3JjL3dhdGNoLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2pzLXV0aWxzLmpzIiwiQGVuZG8vcGF0dGVybnMiLCJAYWdvcmljL2Jhc2Utem9uZSJdLCJleHBvcnRzIjpbInByZXBhcmVXYXRjaFV0aWxzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcHJvdmlkZUxhenlNYXAsTSxQcm9taXNlV2F0Y2hlckk7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsL3NyYy9qcy11dGlscy5qc1wiLCBbW1wicHJvdmlkZUxhenlNYXBcIixbJGjNj19hID0+IChwcm92aWRlTGF6eU1hcCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lXCIsIFtbXCJQcm9taXNlV2F0Y2hlcklcIixbJGjNj19hID0+IChQcm9taXNlV2F0Y2hlckkgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbmNvbnN0IHsgRmFpbCwgYmFyZSwgZGV0YWlsczogWCB9ID0gYXNzZXJ0O1xuXG4vKipcbiAqIEBpbXBvcnQge01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlL3NyYy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKiBAaW1wb3J0IHtXYXRjaH0gZnJvbSAnLi93YXRjaC5qcyc7XG4gKiBAaW1wb3J0IHtXaGVufSBmcm9tICcuL3doZW4uanMnO1xuICogQGltcG9ydCB7Vm93S2l0LCBBc1Byb21pc2VGdW5jdGlvbiwgRnVsZmlsbGVkLCBJc1JldHJ5YWJsZVJlYXNvbiwgVm93fSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCBWb3dTaGFwZSA9IE0udGFnZ2VkKFxuICAnVm93JyxcbiAgaGFyZGVuKHtcbiAgICB2b3dWMDogTS5yZW1vdGFibGUoJ1Zvd1YwJyksXG4gIH0pLFxuKTtcblxuLyoqXG4gKiBAcGFyYW0ge1pvbmV9IHpvbmVcbiAqIEBwYXJhbSB7b2JqZWN0fSBwb3dlcnNcbiAqIEBwYXJhbSB7V2F0Y2h9IHBvd2Vycy53YXRjaFxuICogQHBhcmFtIHtXaGVufSBwb3dlcnMud2hlblxuICogQHBhcmFtIHsoKSA9PiBWb3dLaXQ8YW55Pn0gcG93ZXJzLm1ha2VWb3dLaXRcbiAqIEBwYXJhbSB7SXNSZXRyeWFibGVSZWFzb259IHBvd2Vycy5pc1JldHJ5YWJsZVJlYXNvblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVdhdGNoVXRpbHMgPSAoXG4gIHpvbmUsXG4gIHsgd2F0Y2gsIHdoZW4sIG1ha2VWb3dLaXQsIGlzUmV0cnlhYmxlUmVhc29uIH0sXG4pID0+IHtcbiAgY29uc3QgZGV0YWNoZWQgPSB6b25lLmRldGFjaGVkKCk7XG4gIGNvbnN0IHV0aWxzVG9Ob25TdG9yYWJsZVJlc3VsdHMgPSBuZXcgV2Vha01hcCgpO1xuXG4gIGNvbnN0IG1ha2VXYXRjaFV0aWxzS2l0ID0gem9uZS5leG9DbGFzc0tpdChcbiAgICAnV2F0Y2hVdGlscycsXG4gICAge1xuICAgICAgdXRpbHM6IE0uaW50ZXJmYWNlKCdVdGlscycsIHtcbiAgICAgICAgYWxsOiBNLmNhbGwoTS5hcnJheU9mKE0uYW55KCkpKS5yZXR1cm5zKFZvd1NoYXBlKSxcbiAgICAgICAgYWxsU2V0dGxlZDogTS5jYWxsKE0uYXJyYXlPZihNLmFueSgpKSkucmV0dXJucyhWb3dTaGFwZSksXG4gICAgICAgIGFzUHJvbWlzZTogTS5jYWxsKE0ucmF3KCkpLnJlc3QoTS5yYXcoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICB9KSxcbiAgICAgIHdhdGNoZXI6IE0uaW50ZXJmYWNlKCdXYXRjaGVyJywge1xuICAgICAgICBvbkZ1bGZpbGxlZDogTS5jYWxsKE0ucmF3KCkpLnJlc3QoTS5yYXcoKSkucmV0dXJucyhNLnJhdygpKSxcbiAgICAgICAgb25SZWplY3RlZDogTS5jYWxsKE0ucmF3KCkpLnJlc3QoTS5yYXcoKSkucmV0dXJucyhNLnJhdygpKSxcbiAgICAgIH0pLFxuICAgICAgaGVscGVyOiBNLmludGVyZmFjZSgnSGVscGVyJywge1xuICAgICAgICBjcmVhdGVWb3c6IE0uY2FsbChNLmFycmF5T2YoTS5hbnkoKSksIE0uYm9vbGVhbigpKS5yZXR1cm5zKFZvd1NoYXBlKSxcbiAgICAgICAgcHJvY2Vzc1Jlc3VsdDogTS5jYWxsKE0ucmF3KCkpLnJlc3QoTS5yYXcoKSkucmV0dXJucyhNLnVuZGVmaW5lZCgpKSxcbiAgICAgIH0pLFxuICAgICAgcmV0cnlSZWplY3Rpb25Qcm9taXNlV2F0Y2hlcjogUHJvbWlzZVdhdGNoZXJJLFxuICAgIH0sXG4gICAgKCkgPT4ge1xuICAgICAgLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3dTdGF0ZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHJlbWFpbmluZ1xuICogQHByb3BlcnR5IHtNYXBTdG9yZTxudW1iZXIsIGFueT59IHJlc3VsdHNNYXBcbiAqIEBwcm9wZXJ0eSB7Vm93S2l0WydyZXNvbHZlciddfSByZXNvbHZlclxuICogQHByb3BlcnR5IHtib29sZWFufSBbaXNBbGxTZXR0bGVkXVxuICovXG4gICAgICAvKiogQHR5cGUge01hcFN0b3JlPGJpZ2ludCwgVm93U3RhdGU+fSAqL1xuICAgICAgY29uc3QgaWRUb1Zvd1N0YXRlID0gZGV0YWNoZWQubWFwU3RvcmUoJ2lkVG9Wb3dTdGF0ZScpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0SWQ6IDBuLFxuICAgICAgICBpZFRvVm93U3RhdGUsXG4gICAgICB9O1xuICAgIH0sXG4gICAge1xuICAgICAgdXRpbHM6IHtcbiAgICAgICAgLyoqXG4gKiBAdGVtcGxhdGUge3JlYWRvbmx5IHVua25vd25bXX0gU1xuICogQHBhcmFtIHtTfSBzcGVjaW1lbnNcbiAqIEByZXR1cm5zIHtWb3c8eyBbUCBpbiBrZXlvZiBTXTogRnVsZmlsbGVkPFNbUF0+IH0+fVxuICovXG4gICAgICAgIGFsbChzcGVjaW1lbnMpIHtcbiAgICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHtWb3c8eyBbUCBpbiBrZXlvZiBTXTogRnVsZmlsbGVkPFNbUF0+IH0+fSAqLyAoXG4gICAgICAgICAgICB0aGlzLmZhY2V0cy5oZWxwZXIuY3JlYXRlVm93KHNwZWNpbWVucywgZmFsc2UpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gKiBAdGVtcGxhdGUge3JlYWRvbmx5IHVua25vd25bXX0gU1xuICogQHBhcmFtIHtTfSBzcGVjaW1lbnNcbiAqIEByZXR1cm5zIHtWb3c8eyBbUCBpbiBrZXlvZiBTXTogUHJvbWlzZVNldHRsZWRSZXN1bHQ8RnVsZmlsbGVkPFNbUF0+PiB9Pn1cbiAqL1xuICAgICAgICBhbGxTZXR0bGVkKHNwZWNpbWVucykge1xuICAgICAgICAgIHJldHVybiAvKiogQHR5cGUge1Zvdzx7IFtQIGluIGtleW9mIFNdOiBQcm9taXNlU2V0dGxlZFJlc3VsdDxGdWxmaWxsZWQ8U1tQXT4+IH0+fSAqLyAoXG4gICAgICAgICAgICB0aGlzLmZhY2V0cy5oZWxwZXIuY3JlYXRlVm93KHNwZWNpbWVucywgdHJ1ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQHR5cGUge0FzUHJvbWlzZUZ1bmN0aW9ufSAqL1xuICAgICAgICBhc1Byb21pc2Uoc3BlY2ltZW5QLCAuLi53YXRjaGVyQXJncykge1xuICAgICAgICAgIC8qIFdhdGNoIHRoZSBzcGVjaW1lbiBpbiBjYXNlIGl0IGlzIGFuIGVwaGVtZXJhbCBwcm9taXNlLiovXG4gICAgICAgICAgY29uc3Qgdm93ID0gd2F0Y2goc3BlY2ltZW5QLCAuLi53YXRjaGVyQXJncyk7XG4gICAgICAgICAgY29uc3QgcHJvbWlzZSA9IHdoZW4odm93KTtcbiAgICAgICAgICAvKiBXYXRjaCB0aGUgZXBoZW1lcmFsIHJlc3VsdCBwcm9taXNlIHRvIGVuc3VyZSB0aGF0IGlmIGl0cyBzZXR0bGVtZW50IGlzKi9cbiAgICAgICAgICAvKiBsb3N0IGR1ZSB0byB1cGdyYWRlIG9mIHRoaXMgaW5jYXJuYXRpb24sIHdlIHdpbGwgYXQgbGVhc3QgY2F1c2UgYW4qL1xuICAgICAgICAgIC8qIHVuaGFuZGxlZCByZWplY3Rpb24gaW4gdGhlIG5ldyBpbmNhcm5hdGlvbi4qL1xuICAgICAgICAgIHpvbmUud2F0Y2hQcm9taXNlKHByb21pc2UsIHRoaXMuZmFjZXRzLnJldHJ5UmVqZWN0aW9uUHJvbWlzZVdhdGNoZXIpO1xuXG4gICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgd2F0Y2hlcjoge1xuICAgICAgICAvKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBjdHhcbiAqIEBwYXJhbSB7YmlnaW50fSBjdHguaWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBjdHguaW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjdHgubnVtUmVzdWx0c1xuICogQHBhcmFtIHtib29sZWFufSBjdHguaXNBbGxTZXR0bGVkXG4gKi9cbiAgICAgICAgb25GdWxmaWxsZWQodmFsdWUsIGN0eCkge1xuICAgICAgICAgIHRoaXMuZmFjZXRzLmhlbHBlci5wcm9jZXNzUmVzdWx0KHZhbHVlLCBjdHgsICdmdWxmaWxsZWQnKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHJlYXNvblxuICogQHBhcmFtIHtvYmplY3R9IGN0eFxuICogQHBhcmFtIHtiaWdpbnR9IGN0eC5pZFxuICogQHBhcmFtIHtudW1iZXJ9IGN0eC5pbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IGN0eC5udW1SZXN1bHRzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGN0eC5pc0FsbFNldHRsZWRcbiAqL1xuICAgICAgICBvblJlamVjdGVkKHJlYXNvbiwgY3R4KSB7XG4gICAgICAgICAgdGhpcy5mYWNldHMuaGVscGVyLnByb2Nlc3NSZXN1bHQocmVhc29uLCBjdHgsICdyZWplY3RlZCcpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhlbHBlcjoge1xuICAgICAgICAvKipcbiAqIEBwYXJhbSB7cmVhZG9ubHkgdW5rbm93bltdfSBzcGVjaW1lbnNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNBbGxTZXR0bGVkXG4gKi9cbiAgICAgICAgY3JlYXRlVm93KHNwZWNpbWVucywgaXNBbGxTZXR0bGVkKSB7XG4gICAgICAgICAgY29uc3QgeyBuZXh0SWQ6IGlkLCBpZFRvVm93U3RhdGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgLyoqIEB0eXBlIHtWb3dLaXQ8YW55W10+fSAqL1xuICAgICAgICAgIGNvbnN0IGtpdCA9IG1ha2VWb3dLaXQoKTtcblxuICAgICAgICAgIC8qIFByZXNlcnZlIHRoZSBvcmRlciBvZiB0aGUgcmVzdWx0cy4qL1xuICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzcGVjaW1lbnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgICB3YXRjaChzcGVjaW1lbnNbaW5kZXhdLCB0aGlzLmZhY2V0cy53YXRjaGVyLCB7XG4gICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgbnVtUmVzdWx0czogc3BlY2ltZW5zLmxlbmd0aCxcbiAgICAgICAgICAgICAgaXNBbGxTZXR0bGVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNwZWNpbWVucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvKiBTYXZlIHRoZSBzdGF0ZSB1bnRpbCByZWplY3Rpb24gb3IgYWxsIGZ1bGZpbGxlZC4qL1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5uZXh0SWQgKz0gMW47XG4gICAgICAgICAgICBpZFRvVm93U3RhdGUuaW5pdChcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIGhhcmRlbih7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZXI6IGtpdC5yZXNvbHZlcixcbiAgICAgICAgICAgICAgICByZW1haW5pbmc6IHNwZWNpbWVucy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgcmVzdWx0c01hcDogZGV0YWNoZWQubWFwU3RvcmUoJ3Jlc3VsdHNNYXAnKSxcbiAgICAgICAgICAgICAgICBpc0FsbFNldHRsZWQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGlkVG9Ob25TdG9yYWJsZVJlc3VsdHMgPSBwcm92aWRlTGF6eU1hcChcbiAgICAgICAgICAgICAgdXRpbHNUb05vblN0b3JhYmxlUmVzdWx0cyxcbiAgICAgICAgICAgICAgdGhpcy5mYWNldHMudXRpbHMsXG4gICAgICAgICAgICAgICgpID0+IG5ldyBNYXAoKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZFRvTm9uU3RvcmFibGVSZXN1bHRzLnNldChpZCwgbmV3IE1hcCgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogQmFzZSBjYXNlOiBub3RoaW5nIHRvIHdhaXQgZm9yLiovXG4gICAgICAgICAgICBraXQucmVzb2x2ZXIucmVzb2x2ZShoYXJkZW4oW10pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGtpdC52b3c7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICogQHBhcmFtIHt1bmtub3dufSByZXN1bHRcbiAqIEBwYXJhbSB7b2JqZWN0fSBjdHhcbiAqIEBwYXJhbSB7YmlnaW50fSBjdHguaWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBjdHguaW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjdHgubnVtUmVzdWx0c1xuICogQHBhcmFtIHtib29sZWFufSBjdHguaXNBbGxTZXR0bGVkXG4gKiBAcGFyYW0geydmdWxmaWxsZWQnIHwgJ3JlamVjdGVkJ30gc3RhdHVzXG4gKi9cbiAgICAgICAgcHJvY2Vzc1Jlc3VsdChyZXN1bHQsIHsgaWQsIGluZGV4LCBudW1SZXN1bHRzLCBpc0FsbFNldHRsZWQgfSwgc3RhdHVzKSB7XG4gICAgICAgICAgY29uc3QgeyBpZFRvVm93U3RhdGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgaWYgKCFpZFRvVm93U3RhdGUuaGFzKGlkKSkge1xuICAgICAgICAgICAgLyogUmVzb2x1dGlvbiBvZiB0aGUgcmV0dXJuZWQgdm93IGhhcHBlbmVkIGFscmVhZHkuKi9cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaWRUb05vblN0b3JhYmxlUmVzdWx0cyA9IHByb3ZpZGVMYXp5TWFwKFxuICAgICAgICAgICAgdXRpbHNUb05vblN0b3JhYmxlUmVzdWx0cyxcbiAgICAgICAgICAgIHRoaXMuZmFjZXRzLnV0aWxzLFxuICAgICAgICAgICAgKCkgPT4gbmV3IE1hcCgpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgeyByZW1haW5pbmcsIHJlc3VsdHNNYXAsIHJlc29sdmVyIH0gPSBpZFRvVm93U3RhdGUuZ2V0KGlkKTtcbiAgICAgICAgICBpZiAoIWlzQWxsU2V0dGxlZCAmJiBzdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIC8qIEZvciAnYWxsJywgd2UgcmVqZWN0IGltbWVkaWF0ZWx5IG9uIHRoZSBmaXJzdCByZWplY3Rpb24qL1xuICAgICAgICAgICAgaWRUb1Zvd1N0YXRlLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICBpZFRvTm9uU3RvcmFibGVSZXN1bHRzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICByZXNvbHZlci5yZWplY3QocmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBwb3NzaWJseVdyYXBwZWRSZXN1bHQgPSBpc0FsbFNldHRsZWRcbiAgICAgICAgICAgID8gaGFyZGVuKHtcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgW3N0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgPyAndmFsdWUnIDogJ3JlYXNvbiddOiByZXN1bHQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IHJlc3VsdDtcblxuICAgICAgICAgIGNvbnN0IG5vblN0b3JhYmxlUmVzdWx0cyA9IHByb3ZpZGVMYXp5TWFwKFxuICAgICAgICAgICAgaWRUb05vblN0b3JhYmxlUmVzdWx0cyxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgKCkgPT4gbmV3IE1hcCgpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvKiBDYXB0dXJlIHRoZSBmdWxmaWxsZWQgdmFsdWUuKi9cbiAgICAgICAgICBpZiAoem9uZS5pc1N0b3JhYmxlKHBvc3NpYmx5V3JhcHBlZFJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdHNNYXAuaW5pdChpbmRleCwgcG9zc2libHlXcmFwcGVkUmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9uU3RvcmFibGVSZXN1bHRzLnNldChpbmRleCwgcG9zc2libHlXcmFwcGVkUmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgdm93U3RhdGUgPSBoYXJkZW4oe1xuICAgICAgICAgICAgcmVtYWluaW5nOiByZW1haW5pbmcgLSAxLFxuICAgICAgICAgICAgcmVzdWx0c01hcCxcbiAgICAgICAgICAgIHJlc29sdmVyLFxuICAgICAgICAgICAgaXNBbGxTZXR0bGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh2b3dTdGF0ZS5yZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgICBpZFRvVm93U3RhdGUuc2V0KGlkLCB2b3dTdGF0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIFdlJ3JlIGRvbmUhICBFeHRyYWN0IHRoZSBhcnJheS4qL1xuICAgICAgICAgIGlkVG9Wb3dTdGF0ZS5kZWxldGUoaWQpO1xuICAgICAgICAgIGlkVG9Ob25TdG9yYWJsZVJlc3VsdHMuZGVsZXRlKGlkKTtcbiAgICAgICAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5KG51bVJlc3VsdHMpO1xuICAgICAgICAgIGxldCBudW1Mb3N0ID0gMDtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVJlc3VsdHM7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKG5vblN0b3JhYmxlUmVzdWx0cy5oYXMoaSkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IG5vblN0b3JhYmxlUmVzdWx0cy5nZXQoaSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdHNNYXAuaGFzKGkpKSB7XG4gICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSByZXN1bHRzTWFwLmdldChpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG51bUxvc3QgKz0gMTtcbiAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IGlzQWxsU2V0dGxlZFxuICAgICAgICAgICAgICAgID8geyBzdGF0dXM6ICdyZWplY3RlZCcsIHJlYXNvbjogJ1Vuc3RvcmFibGUgcmVzdWx0IHdhcyBsb3N0JyB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChudW1Mb3N0ID4gMCAmJiAhaXNBbGxTZXR0bGVkKSB7XG4gICAgICAgICAgICByZXNvbHZlci5yZWplY3QoXG4gICAgICAgICAgICAgIGFzc2VydC5lcnJvcihYYCR7bnVtTG9zdH0gdW5zdG9yYWJsZSByZXN1bHRzIHdlcmUgbG9zdGApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZXIucmVzb2x2ZShoYXJkZW4ocmVzdWx0cykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZXRyeVJlamVjdGlvblByb21pc2VXYXRjaGVyOiB7XG4gICAgICAgIG9uRnVsZmlsbGVkKF9yZXN1bHQpIHt9LFxuICAgICAgICBvblJlamVjdGVkKHJlYXNvbiwgZmFpbGVkT3ApIHtcbiAgICAgICAgICBpZiAoaXNSZXRyeWFibGVSZWFzb24ocmVhc29uLCB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBGYWlsYFBlbmRpbmcgJHtiYXJlKGZhaWxlZE9wKX0gY291bGQgbm90IHJldHJ5OyAke3JlYXNvbn1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICBjb25zdCBtYWtlV2F0Y2hVdGlsID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgdXRpbHMgfSA9IG1ha2VXYXRjaFV0aWxzS2l0KCk7XG4gICAgcmV0dXJuIGhhcmRlbih1dGlscyk7XG4gIH07XG5cbiAgcmV0dXJuIG1ha2VXYXRjaFV0aWw7XG59OyRozY9fb25jZS5wcmVwYXJlV2F0Y2hVdGlscyhwcmVwYXJlV2F0Y2hVdGlscyk7XG5cbmhhcmRlbihwcmVwYXJlV2F0Y2hVdGlscyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlV2F0Y2hVdGlscyI6WyJwcmVwYXJlV2F0Y2hVdGlscyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACAhdEJUR0AAFEdAAAfAAAAQGFnb3JpYy92b3ctdjAuMS4wL3NyYy93YXRjaC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Jhc2Utem9uZSIsIi4vdm93LXV0aWxzLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVdhdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgUHJvbWlzZVdhdGNoZXJJLGdldFZvd1BheWxvYWQsYmFzaWNFOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9iYXNlLXpvbmVcIiwgW1tcIlByb21pc2VXYXRjaGVySVwiLFskaM2PX2EgPT4gKFByb21pc2VXYXRjaGVySSA9ICRozY9fYSldXV1dLFtcIi4vdm93LXV0aWxzLmpzXCIsIFtbXCJnZXRWb3dQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0Vm93UGF5bG9hZCA9ICRozY9fYSldXSxbXCJiYXNpY0VcIixbJGjNj19hID0+IChiYXNpY0UgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBAaW1wb3J0IHsgUHJvbWlzZVdhdGNoZXIsIFpvbmUgfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKiBAaW1wb3J0IHsgRVZvdywgSXNSZXRyeWFibGVSZWFzb24sIFZvd0tpdCwgVm93UmVzb2x2ZXIsIFdhdGNoZXIgfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7Wm9uZX0gem9uZVxuICovXG5jb25zdCBtYWtlV2F0Y2hOZXh0U3RlcCA9XG4gIHpvbmUgPT5cbiAgLyoqXG4gKiBJZiB0aGUgc3BlY2ltZW4gaXMgYSB2b3csIG9idGFpbiBhIGZyZXNoIHNob3J0ZW5lZCBwcm9taXNlIGZyb20gaXQsXG4gKiBvdGhlcndpc2UgY29lcmNlIHRoZSBub24tdm93IHNwZWNpbWVuIHRvIGEgcHJvbWlzZS4gIFRoZW4sIGFzc29jaWF0ZSBhXG4gKiAodXN1YWxseSBkdXJhYmxlKSB3YXRjaGVyIG9iamVjdCB3aXRoIHRoZSBwcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtQcm9taXNlV2F0Y2hlcn0gcHJvbWlzZVdhdGNoZXJcbiAqL1xuICAoc3BlY2ltZW4sIHByb21pc2VXYXRjaGVyKSA9PiB7XG4gICAgbGV0IHByb21pc2U7XG4gICAgY29uc3QgcGF5bG9hZCA9IGdldFZvd1BheWxvYWQoc3BlY2ltZW4pO1xuICAgIGlmIChwYXlsb2FkKSB7XG4gICAgICBwcm9taXNlID0gYmFzaWNFKHBheWxvYWQudm93VjApLnNob3J0ZW4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZSA9IGJhc2ljRS5yZXNvbHZlKHNwZWNpbWVuKTtcbiAgICB9XG4gICAgem9uZS53YXRjaFByb21pc2UocHJvbWlzZSwgcHJvbWlzZVdhdGNoZXIpO1xuICB9O1xuXG4vKipcbiAqIEBwYXJhbSB7Vm93UmVzb2x2ZXIgfCB1bmRlZmluZWR9IHJlc29sdmVyXG4gKiBAcGFyYW0ge1dhdGNoZXI8dW5rbm93biwgdW5rbm93biwgdW5rbm93bj4gfCB1bmRlZmluZWR9IHdhdGNoZXJcbiAqIEBwYXJhbSB7a2V5b2YgUmVxdWlyZWQ8V2F0Y2hlcj59IHdjYlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHBhcmFtIHt1bmtub3duW119IFt3YXRjaGVyQXJnc11cbiAqL1xuY29uc3Qgc2V0dGxlID0gYXN5bmMgKHJlc29sdmVyLCB3YXRjaGVyLCB3Y2IsIHZhbHVlLCB3YXRjaGVyQXJncyA9IFtdKSA9PiB7XG4gIGF3YWl0IG51bGw7XG4gIHRyeSB7XG4gICAgbGV0IGNoYWluZWRWYWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IHcgPSB3YXRjaGVyICYmIHdhdGNoZXJbd2NiXTtcbiAgICBpZiAodykge1xuICAgICAgY2hhaW5lZFZhbHVlID0gYXBwbHkodywgd2F0Y2hlciwgW3ZhbHVlLCAuLi53YXRjaGVyQXJnc10pO1xuICAgIH0gZWxzZSBpZiAod2NiID09PSAnb25SZWplY3RlZCcpIHtcbiAgICAgIHRocm93IHZhbHVlO1xuICAgIH1cblxuICAgIGlmIChyZXNvbHZlcikge1xuICAgICAgcmVzb2x2ZXIucmVzb2x2ZShjaGFpbmVkVmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qIFdlIHdhbnQgdG8gcHJvcGFnYXRlIHJlamVjdGlvbnMgKGJ1dCBub3QgZnVsZmlsbG1lbnQgdmFsdWVzKSB0byBvdXIqL1xuICAgIC8qIGNhbGxlciBpZiBubyByZXNvbHZlciB3YXMgcHJvdmlkZWQuKi9cbiAgICBhd2FpdCBjaGFpbmVkVmFsdWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAocmVzb2x2ZXIpIHtcbiAgICAgIHJlc29sdmVyLnJlamVjdChlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKiBDcmVhdGUgYSBuYXRpdmUgdW5oYW5kbGVkIHJlamVjdGlvbi4qL1xuICAgIHRocm93IGU7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtab25lfSB6b25lXG4gKiBAcGFyYW0ge0lzUmV0cnlhYmxlUmVhc29ufSBpc1JldHJ5YWJsZVJlYXNvblxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlV2F0Y2hOZXh0U3RlcD59IHdhdGNoTmV4dFN0ZXBcbiAqL1xuY29uc3QgcHJlcGFyZVByb21pc2VXYXRjaGVyID0gKHpvbmUsIGlzUmV0cnlhYmxlUmVhc29uLCB3YXRjaE5leHRTdGVwKSA9PiB7XG4gIC8qIFdlIHVzZSBhbiBlcGhlbWVyYWwgV2Vha1NldCBmb3IgdGhlIHByZXZpb3VzbHkgc2VlbiB2b3dzIGluIGEgd2F0Y2ggb3BlcmF0aW9uKi9cbiAgLyogV2hpbGUgd2F0Y2ggaXMgZHVyYWJsZSwgaXQgc3VmZmljZXMgdG8gZGV0ZWN0IHRoZSBjeWNsZSBpbiBhIHNpbmdsZSBpbmNhcm5hdGlvbiovXG4gIC8qKiBAdHlwZSB7V2Vha01hcDxQcm9taXNlV2F0Y2hlciwgV2Vha1NldDxhbnk+Pn0gKi9cbiAgY29uc3Qgd2F0Y2hlclNlZW5QYXlsb2FkcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLyoqIEBwYXJhbSB7UHJvbWlzZVdhdGNoZXJ9IHdhdGNoZXIgKi9cbiAgY29uc3QgZ2V0U2VlblBheWxvYWRzID0gd2F0Y2hlciA9PiB7XG4gICAgbGV0IHNlZW5QYXlsb2FkcyA9IHdhdGNoZXJTZWVuUGF5bG9hZHMuZ2V0KHdhdGNoZXIpO1xuICAgIGlmICghc2VlblBheWxvYWRzKSB7XG4gICAgICBzZWVuUGF5bG9hZHMgPSBuZXcgV2Vha1NldCgpO1xuICAgICAgd2F0Y2hlclNlZW5QYXlsb2Fkcy5zZXQod2F0Y2hlciwgc2VlblBheWxvYWRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlZW5QYXlsb2FkcztcbiAgfTtcblxuICByZXR1cm4gem9uZS5leG9DbGFzcyhcbiAgICAnUHJvbWlzZVdhdGNoZXInLFxuICAgIFByb21pc2VXYXRjaGVySSxcbiAgICAvKipcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAdGVtcGxhdGUgW1RSZXN1bHQxPVRdXG4gKiBAdGVtcGxhdGUgW1RSZXN1bHQyPW5ldmVyXVxuICogQHBhcmFtIHtWb3dSZXNvbHZlcjxUUmVzdWx0MSB8IFRSZXN1bHQyPn0gcmVzb2x2ZXJcbiAqIEBwYXJhbSB7V2F0Y2hlcjxULCBUUmVzdWx0MSwgVFJlc3VsdDI+fSBbd2F0Y2hlcl1cbiAqIEBwYXJhbSB7dW5rbm93bltdfSBbd2F0Y2hlckFyZ3NdXG4gKi9cbiAgICAocmVzb2x2ZXIsIHdhdGNoZXIsIHdhdGNoZXJBcmdzKSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgICAgdm93OiAvKiogQHR5cGUge3Vua25vd259ICovICh1bmRlZmluZWQpLFxuICAgICAgICBwcmlvclJldHJ5VmFsdWU6IC8qKiBAdHlwZSB7YW55fSAqLyAodW5kZWZpbmVkKSxcbiAgICAgICAgcmVzb2x2ZXIsXG4gICAgICAgIHdhdGNoZXIsXG4gICAgICAgIHdhdGNoZXJBcmdzOiBoYXJkZW4od2F0Y2hlckFyZ3MpLFxuICAgICAgfTtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge1BhcnRpYWw8dHlwZW9mIHN0YXRlPn0gKi8gKHN0YXRlKTtcbiAgICB9LFxuICAgIHtcbiAgICAgIC8qKiBAdHlwZSB7UmVxdWlyZWQ8UHJvbWlzZVdhdGNoZXI+WydvbkZ1bGZpbGxlZCddfSAqL1xuICAgICAgb25GdWxmaWxsZWQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyB3YXRjaGVyLCB3YXRjaGVyQXJncywgcmVzb2x2ZXIgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGlmICghcmVzb2x2ZXIpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignVW5leHBlY3RlZCBtdWx0aXBsZSBjYWxscyB0byBQcm9taXNlV2F0Y2hlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBnZXRWb3dQYXlsb2FkKHZhbHVlKTtcbiAgICAgICAgaWYgKHBheWxvYWQpIHtcbiAgICAgICAgICBjb25zdCBzZWVuUGF5bG9hZHMgPSBnZXRTZWVuUGF5bG9hZHModGhpcy5zZWxmKTtcbiAgICAgICAgICAvKiBUT0RPOiByZWx5IG9uIGVuZG93ZWQgaGVscGVyIHRvIGdldCBzdG9yYWJsZSBjYXAgZnJvbSBwYXlsb2FkKi9cbiAgICAgICAgICBpZiAoc2VlblBheWxvYWRzLmhhcyhwYXlsb2FkLnZvd1YwKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZi5vblJlamVjdGVkKEVycm9yKCdWb3cgcmVzb2x1dGlvbiBjeWNsZSBkZXRlY3RlZCcpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VlblBheWxvYWRzLmFkZChwYXlsb2FkLnZvd1YwKTtcbiAgICAgICAgICAvKiBXZSd2ZSBiZWVuIHNob3J0ZW5lZCwgc28gcmVmbGVjdCBvdXIgc3RhdGUgYWNjb3JkaW5nbHksIGFuZCBnbyBhZ2Fpbi4qL1xuICAgICAgICAgIHRoaXMuc3RhdGUudm93ID0gdmFsdWU7XG4gICAgICAgICAgd2F0Y2hOZXh0U3RlcCh2YWx1ZSwgdGhpcy5zZWxmKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2F0Y2hlclNlZW5QYXlsb2Fkcy5kZWxldGUodGhpcy5zZWxmKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5wcmlvclJldHJ5VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc3RhdGUud2F0Y2hlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zdGF0ZS5yZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdm9pZCBzZXR0bGUocmVzb2x2ZXIsIHdhdGNoZXIsICdvbkZ1bGZpbGxlZCcsIHZhbHVlLCB3YXRjaGVyQXJncyk7XG4gICAgICB9LFxuICAgICAgLyoqIEB0eXBlIHtSZXF1aXJlZDxQcm9taXNlV2F0Y2hlcj5bJ29uUmVqZWN0ZWQnXX0gKi9cbiAgICAgIG9uUmVqZWN0ZWQocmVhc29uKSB7XG4gICAgICAgIGNvbnN0IHsgdm93LCB3YXRjaGVyLCB3YXRjaGVyQXJncywgcmVzb2x2ZXIsIHByaW9yUmV0cnlWYWx1ZSB9ID1cbiAgICAgICAgICB0aGlzLnN0YXRlO1xuICAgICAgICBpZiAoIXJlc29sdmVyKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoJ1VuZXhwZWN0ZWQgbXVsdGlwbGUgY2FsbHMgdG8gUHJvbWlzZVdhdGNoZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXRyeVZhbHVlID0gaXNSZXRyeWFibGVSZWFzb24ocmVhc29uLCBwcmlvclJldHJ5VmFsdWUpO1xuICAgICAgICBpZiAocmV0cnlWYWx1ZSkge1xuICAgICAgICAgIHRoaXMuc3RhdGUucHJpb3JSZXRyeVZhbHVlID0gcmV0cnlWYWx1ZTtcbiAgICAgICAgICBpZiAodm93KSB7XG4gICAgICAgICAgICAvKiBSZXRyeSB0aGUgc2FtZSBzcGVjaW1lbi4qL1xuICAgICAgICAgICAgd2F0Y2hOZXh0U3RlcCh2b3csIHRoaXMuc2VsZik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qIEZpbmFsIHJlamVjdGlvbi4qL1xuICAgICAgICB3YXRjaGVyU2VlblBheWxvYWRzLmRlbGV0ZSh0aGlzLnNlbGYpO1xuICAgICAgICB0aGlzLnN0YXRlLnByaW9yUmV0cnlWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zdGF0ZS5yZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zdGF0ZS53YXRjaGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB2b2lkIHNldHRsZShyZXNvbHZlciwgd2F0Y2hlciwgJ29uUmVqZWN0ZWQnLCByZWFzb24sIHdhdGNoZXJBcmdzKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtab25lfSB6b25lXG4gKiBAcGFyYW0geygpID0+IFZvd0tpdDxhbnk+fSBtYWtlVm93S2l0XG4gKiBAcGFyYW0geyhyZWFzb246IGFueSwgbGFzdFZhbHVlOiBhbnkpID0+IGFueX0gW2lzUmV0cnlhYmxlUmVhc29uXVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVdhdGNoID0gKFxuICB6b25lLFxuICBtYWtlVm93S2l0LFxuICBpc1JldHJ5YWJsZVJlYXNvbiA9IChfcmVhc29uLCBfbGFzdFZhbHVlKSA9PiB1bmRlZmluZWQsXG4pID0+IHtcbiAgY29uc3Qgd2F0Y2hOZXh0U3RlcCA9IG1ha2VXYXRjaE5leHRTdGVwKHpvbmUpO1xuICBjb25zdCBtYWtlUHJvbWlzZVdhdGNoZXIgPSBwcmVwYXJlUHJvbWlzZVdhdGNoZXIoXG4gICAgem9uZSxcbiAgICBpc1JldHJ5YWJsZVJlYXNvbixcbiAgICB3YXRjaE5leHRTdGVwLFxuICApO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0ZW1wbGF0ZSBbVFJlc3VsdDE9VF1cbiAqIEB0ZW1wbGF0ZSBbVFJlc3VsdDI9bmV2ZXJdXG4gKiBAdGVtcGxhdGUge2FueVtdfSBbQz1hbnlbXV0gd2F0Y2hlciBhcmdzXG4gKiBAcGFyYW0ge0VWb3c8VD59IHNwZWNpbWVuUFxuICogQHBhcmFtIHtXYXRjaGVyPFQsIFRSZXN1bHQxLCBUUmVzdWx0MiwgQz59IFt3YXRjaGVyXVxuICogQHBhcmFtIHtDfSB3YXRjaGVyQXJnc1xuICovXG4gIGNvbnN0IHdhdGNoID0gKHNwZWNpbWVuUCwgd2F0Y2hlciwgLi4ud2F0Y2hlckFyZ3MpID0+IHtcbiAgICAvKiogQHR5cGVkZWYge0V4Y2x1ZGU8VFJlc3VsdDEsIHZvaWQ+IHwgRXhjbHVkZTxUUmVzdWx0Miwgdm9pZD59IFZvaWRsZXNzICovXG4gICAgLyoqIEB0eXBlZGVmIHtWb2lkbGVzcyBleHRlbmRzIG5ldmVyID8gVFJlc3VsdDEgOiBWb2lkbGVzc30gTmFycm93ZXN0ICovXG4gICAgLyoqIEB0eXBlIHtWb3dLaXQ8TmFycm93ZXN0Pn0gKi9cbiAgICBjb25zdCB7IHJlc29sdmVyLCB2b3cgfSA9IG1ha2VWb3dLaXQoKTtcblxuICAgIC8qIENyZWF0ZSBhIHByb21pc2Ugd2F0Y2hlciB0byB0cmFjayB2b3dzLCByZXRyeWluZyB1cG9uIHJlamVjdGlvbiBhcyovXG4gICAgLyogY29udHJvbGxlZCBieSBgaXNSZXRyeWFibGVSZWFzb25gLiovXG4gICAgY29uc3QgcHJvbWlzZVdhdGNoZXIgPSBtYWtlUHJvbWlzZVdhdGNoZXIocmVzb2x2ZXIsIHdhdGNoZXIsIHdhdGNoZXJBcmdzKTtcblxuICAgIC8qIENvZXJjZSB0aGUgc3BlY2ltZW4gdG8gYSBwcm9taXNlLCBhbmQgc3RhcnQgdGhlIHdhdGNoZXIgY3ljbGUuKi9cbiAgICBjb25zdCBwcm9taXNlID0gYmFzaWNFLnJlc29sdmUoc3BlY2ltZW5QKTtcbiAgICB6b25lLndhdGNoUHJvbWlzZShwcm9taXNlLCBwcm9taXNlV2F0Y2hlcik7XG5cbiAgICByZXR1cm4gdm93O1xuICB9O1xuICBoYXJkZW4od2F0Y2gpO1xuXG4gIHJldHVybiB3YXRjaDtcbn07JGjNj19vbmNlLnByZXBhcmVXYXRjaChwcmVwYXJlV2F0Y2gpO1xuXG5oYXJkZW4ocHJlcGFyZVdhdGNoKTtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlV2F0Y2g+fSBXYXRjaCAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVdhdGNoIjpbInByZXBhcmVXYXRjaCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAWKg8Qjg0AAI4NAAAeAAAAQGFnb3JpYy92b3ctdjAuMS4wL3NyYy93aGVuLmpzeyJpbXBvcnRzIjpbIi4vdm93LXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZVdoZW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRWb3dQYXlsb2FkLGJhc2ljRTskaM2PX2ltcG9ydHMoW1tcIi4vdm93LXV0aWxzLmpzXCIsIFtbXCJnZXRWb3dQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0Vm93UGF5bG9hZCA9ICRozY9fYSldXSxbXCJiYXNpY0VcIixbJGjNj19hID0+IChiYXNpY0UgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qKiBAaW1wb3J0IHsgSXNSZXRyeWFibGVSZWFzb24sIEVVbndyYXAgfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG4vKipcbiAqIEBwYXJhbSB7SXNSZXRyeWFibGVSZWFzb259IFtpc1JldHJ5YWJsZVJlYXNvbl1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VXaGVuID0gKFxuICBpc1JldHJ5YWJsZVJlYXNvbiA9IC8qKiBAdHlwZSB7SXNSZXRyeWFibGVSZWFzb259ICovICgoKSA9PiBmYWxzZSksXG4pID0+IHtcbiAgLyoqXG4gKiBTaG9ydGVuIGBzcGVjaW1lblBgIHVudGlsIHdlIGFjaGlldmUgYSBmaW5hbCByZXN1bHQuXG4gKlxuICogRG9lcyBub3Qgc3Vydml2ZSB1cGdyYWRlIChldmVuIGlmIHNwZWNpbWVuUCBpcyBhIGR1cmFibGUgVm93KS5cbiAqXG4gKiBAc2VlIHtAbGluayAuLi8uLi9SRUFETUUubWR9XG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gc3BlY2ltZW5QIHZhbHVlIHRvIHVud3JhcFxuICogQHJldHVybnMge1Byb21pc2U8RVVud3JhcDxUPj59XG4gKi9cbiAgY29uc3QgdW53cmFwID0gYXN5bmMgc3BlY2ltZW5QID0+IHtcbiAgICAvKiBFbnN1cmUgd2UgZG9uJ3QgcnVuIHVudGlsIGEgc3Vic2VxdWVudCB0dXJuLiovXG4gICAgYXdhaXQgbnVsbDtcblxuICAgIC8qIEVuc3VyZSB3ZSBoYXZlIGEgcHJlc2VuY2UgdGhhdCB3b24ndCBiZSBkaXNjb25uZWN0ZWQgbGF0ZXIuKi9cbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgc3BlY2ltZW5QO1xuICAgIGxldCBwYXlsb2FkID0gZ2V0Vm93UGF5bG9hZChyZXN1bHQpO1xuICAgIGxldCBwcmlvclJldHJ5VmFsdWU7XG4gICAgY29uc3Qgc2VlblBheWxvYWRzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB3aGlsZSAocGF5bG9hZCkge1xuICAgICAgLyogVE9ETzogcmVseSBvbiBlbmRvd2VkIGhlbHBlcnMgZm9yIGdldHRpbmcgc3RvcmFibGUgY2FwIGFuZCBwZXJmb3JtaW5nKi9cbiAgICAgIC8qIHNob3J0ZW4gXCJuZXh0IHN0ZXBcIiovXG4gICAgICBjb25zdCB7IHZvd1YwIH0gPSBwYXlsb2FkO1xuICAgICAgaWYgKHNlZW5QYXlsb2Fkcy5oYXModm93VjApKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdWb3cgcmVzb2x1dGlvbiBjeWNsZSBkZXRlY3RlZCcpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvKiBTaG9ydGVuIHRoZSB2b3cgdG8gdGhlIFwibmV4dCBzdGVwXCIsIHdoZXRoZXIgYW5vdGhlciB2b3cgb3IgYSBmaW5hbCovXG4gICAgICAgIC8qIHJlc3VsdC4qL1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBiYXNpY0Uodm93VjApLnNob3J0ZW4oKTtcblxuICAgICAgICAvKiBQcmV2ZW50IGN5Y2xlcyBpbiB0aGUgcmVzb2x1dGlvbiBncmFwaC4qL1xuICAgICAgICBzZWVuUGF5bG9hZHMuYWRkKHZvd1YwKTtcbiAgICAgICAgcHJpb3JSZXRyeVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICByZXN1bHQgPSByZXM7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IG5leHRSZXRyeVZhbHVlID0gaXNSZXRyeWFibGVSZWFzb24oZSwgcHJpb3JSZXRyeVZhbHVlKTtcbiAgICAgICAgaWYgKCFuZXh0UmV0cnlWYWx1ZSkge1xuICAgICAgICAgIC8qIE5vdCBhIHJldHJ5LCBzbyBqdXN0IHJlamVjdCB3aXRoIHRoZSByZWFzb24uKi9cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2hvcnRlbiB0aGUgc2FtZSBzcGVjaW1lbiB0byB0cnkgYWdhaW4uKi9cbiAgICAgICAgcHJpb3JSZXRyeVZhbHVlID0gbmV4dFJldHJ5VmFsdWU7XG4gICAgICB9XG4gICAgICAvKiBBZHZhbmNlIHRvIHRoZSBuZXh0IHZvdy4qL1xuICAgICAgcGF5bG9hZCA9IGdldFZvd1BheWxvYWQocmVzdWx0KTtcbiAgICB9XG5cbiAgICBjb25zdCB1bndyYXBwZWQgPSAvKiogQHR5cGUge0VVbndyYXA8VD59ICovIChyZXN1bHQpO1xuICAgIHJldHVybiB1bndyYXBwZWQ7XG4gIH07XG5cbiAgLyoqXG4gKiBTaG9ydGVuIGBzcGVjaW1lblBgIHVudGlsIHdlIGFjaGlldmUgYSBmaW5hbCByZXN1bHQuXG4gKlxuICogRG9lcyBub3Qgc3Vydml2ZSB1cGdyYWRlIChldmVuIGlmIHNwZWNpbWVuUCBpcyBhIGR1cmFibGUgVm93KS5cbiAqXG4gKiBAc2VlIHtAbGluayAuLi8uLi9SRUFETUUubWR9XG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVFJlc3VsdDE9RVVud3JhcDxUPl1cbiAqIEB0ZW1wbGF0ZSBbVFJlc3VsdDI9bmV2ZXJdXG4gKiBAcGFyYW0ge1R9IHNwZWNpbWVuUCB2YWx1ZSB0byB1bndyYXBcbiAqIEBwYXJhbSB7KHZhbHVlOiBFVW53cmFwPFQ+KSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPn0gW29uRnVsZmlsbGVkXVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+fSBbb25SZWplY3RlZF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+fVxuICovXG4gIGNvbnN0IHdoZW4gPSAoc3BlY2ltZW5QLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkgPT4ge1xuICAgIGNvbnN0IHVud3JhcHBlZCA9IHVud3JhcChzcGVjaW1lblApO1xuXG4gICAgLyogV2UndmUgZXh0cmFjdGVkIHRoZSBmaW5hbCByZXN1bHQuKi9cbiAgICBpZiAob25GdWxmaWxsZWQgPT0gbnVsbCAmJiBvblJlamVjdGVkID09IG51bGwpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge1Byb21pc2U8VFJlc3VsdDE+fSAqLyAodW53cmFwcGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2ljRS5yZXNvbHZlKHVud3JhcHBlZCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gIH07XG4gIGhhcmRlbih3aGVuKTtcblxuICByZXR1cm4gd2hlbjtcbn07JGjNj19vbmNlLm1ha2VXaGVuKG1ha2VXaGVuKTtcblxuaGFyZGVuKG1ha2VXaGVuKTtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlV2hlbj59IFdoZW4gKi9cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXaGVuIjpbIm1ha2VXaGVuIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ8I1Ny/DAAAvwwAABkAAABAYWdvcmljL3Zvdy12MC4xLjAvdmF0LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIiwiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qcyIsIi4vc3JjL3Rvb2xzLmpzIiwiLi9zcmMvRS5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHRQb3dlcnMiLCJoZWFwVm93RSIsImhlYXBWb3dUb29scyIsInByZXBhcmVTd2luZ3NldFZvd1Rvb2xzIiwicHJlcGFyZVZvd1Rvb2xzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaXNVcGdyYWRlRGlzY29ubmVjdGlvbixpc0FiYW5kb25lZEVycm9yLG1ha2VIZWFwWm9uZSxwcmVwYXJlQmFzaWNWb3dUb29scyxtYWtlRTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzXCIsIFtbXCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uXCIsWyRozY9fYSA9PiAoaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9ICRozY9fYSldXSxbXCJpc0FiYW5kb25lZEVycm9yXCIsWyRozY9fYSA9PiAoaXNBYmFuZG9uZWRFcnJvciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanNcIiwgW1tcIm1ha2VIZWFwWm9uZVwiLFskaM2PX2EgPT4gKG1ha2VIZWFwWm9uZSA9ICRozY9fYSldXV1dLFtcIi4vc3JjL3Rvb2xzLmpzXCIsIFtbXCJwcmVwYXJlQmFzaWNWb3dUb29sc1wiLFskaM2PX2EgPT4gKHByZXBhcmVCYXNpY1Zvd1Rvb2xzID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvRS5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKG1ha2VFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7SXNSZXRyeWFibGVSZWFzb259IGZyb20gJy4vc3JjL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0V9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKi9cblxuLyoqIEB0eXBlIHtJc1JldHJ5YWJsZVJlYXNvbn0gKi9cbmNvbnN0IGlzUmV0cnlhYmxlUmVhc29uID0gKHJlYXNvbiwgcHJpb3JSZXRyeVZhbHVlKSA9PiB7XG4gIGlmIChcbiAgICBpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKHJlYXNvbikgJiZcbiAgICAoIWlzVXBncmFkZURpc2Nvbm5lY3Rpb24ocHJpb3JSZXRyeVZhbHVlKSB8fFxuICAgICAgcmVhc29uLmluY2FybmF0aW9uTnVtYmVyID4gcHJpb3JSZXRyeVZhbHVlLmluY2FybmF0aW9uTnVtYmVyKVxuICApIHtcbiAgICByZXR1cm4gcmVhc29uO1xuICB9XG4gIC8qIEZvciBhYmFuZG9uZWQgZXJyb3JzIHRoZXJlIGlzIG5vIHdheSB0byBkaWZmZXJlbnRpYXRlIGVycm9ycyBmcm9tKi9cbiAgLyogY29uc2VjdXRpdmUgdXBncmFkZXMqL1xuICBpZiAoaXNBYmFuZG9uZWRFcnJvcihyZWFzb24pICYmICFpc0FiYW5kb25lZEVycm9yKHByaW9yUmV0cnlWYWx1ZSkpIHtcbiAgICByZXR1cm4gcmVhc29uO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4gICAgICAgY29uc3QgZGVmYXVsdFBvd2VycyA9IGhhcmRlbih7XG4gIGlzUmV0cnlhYmxlUmVhc29uLFxufSk7XG5cbi8qKlxuICogUHJvZHVjZSBTd2luZ1NldC1jb21wYXRpYmxlIHZvd1Rvb2xzLCB3aXRoIGFuIGFyYml0cmFyeSBab25lIHR5cGVcbiAqXG4gKiBAdHlwZSB7dHlwZW9mIHByZXBhcmVCYXNpY1Zvd1Rvb2xzfVxuICovJGjNj19vbmNlLmRlZmF1bHRQb3dlcnMoZGVmYXVsdFBvd2Vycyk7XG4gICAgICAgY29uc3QgcHJlcGFyZVN3aW5nc2V0Vm93VG9vbHMgPSAoem9uZSwgcG93ZXJzID0ge30pID0+XG4gIHByZXBhcmVCYXNpY1Zvd1Rvb2xzKHpvbmUsIHsgLi4uZGVmYXVsdFBvd2VycywgLi4ucG93ZXJzIH0pOyRozY9fb25jZS5wcmVwYXJlU3dpbmdzZXRWb3dUb29scyhwcmVwYXJlU3dpbmdzZXRWb3dUb29scyk7XG5oYXJkZW4ocHJlcGFyZVN3aW5nc2V0Vm93VG9vbHMpO1xuXG4vKipcbiAqIFJlZXhwb3J0IGFzIHByZXBhcmVWb3dUb29scywgc2luY2UgdGhhdCdzIHRoZSB0aGluZyB0aGF0IHBlb3BsZSBmaW5kIGVhc2llc3RcbiAqIHRvIHJlYWNoLlxuICovXG5cblxuLyoqXG4gKiBgdm93VG9vbHNgIHRoYXQgYXJlIG5vdCBkdXJhYmxlLCBidXQgYXJlIHVzZWZ1bCBpbiBub24tZHVyYWJsZSBjbGllbnRzIHRoYXRcbiAqIG5lZWQgdG8gY29uc3VtZSB2b3dzIGZyb20gb3RoZXIgU3dpbmdTZXQgdmF0cy5cbiAqL1xuICAgICAgIGNvbnN0IGhlYXBWb3dUb29scyA9IHByZXBhcmVTd2luZ3NldFZvd1Rvb2xzKG1ha2VIZWFwWm9uZSgpKTtcblxuLyoqXG4gKiBBIHZvdy1zaG9ydGVuaW5nIEUsIGZvciB1c2UgaW4gdmF0cyB0aGF0IGFyZSBub3QgZHVyYWJsZSBidXQgcmVjZWl2ZSB2b3dzLlxuICpcbiAqIFdoZW4gdGhlIHZvd3MgbXVzdCBiZSB3YXRjaGVkIGR1cmFibHksIHVzZSB2b3dUb29scyBwcmVwYXJlZCBpbiBhIGR1cmFibGUgem9uZS5cbiAqXG4gKiBUaGlzIHByb2R1Y2VzIGxvbmctbGl2ZWQgZXBoZW1lcmFsIHByb21pc2VzIHRoYXQgZW5jYXBzdWxhdGUgdGhlIHNob3J0ZW5pbmdcbiAqIGJlaGF2aW91ciwgYW5kIHNvIHByb3ZpZGVzIG5vIHdheSBmb3IgYHdhdGNoYCB0byBkdXJhYmx5IHNob3J0ZW4uIFVzZSB0aGVcbiAqIHN0YW5kYXJkIGBFYCBpZiB5b3UgbmVlZCB0byBgd2F0Y2hgIGl0cyByZXN1bHRpbmdcbiAqIHByb21pc2VzLlxuICovJGjNj19vbmNlLmhlYXBWb3dUb29scyhoZWFwVm93VG9vbHMpO1xuICAgICAgIGNvbnN0IGhlYXBWb3dFID0gbWFrZUUoZ2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZSwge1xuICB1bndyYXA6IGhlYXBWb3dUb29scy53aGVuLFxuICBhZGRpdGlvbmFsOiB7IHdoZW46IGhlYXBWb3dUb29scy53aGVuIH0sXG59KTskaM2PX29uY2UuaGVhcFZvd0UoaGVhcFZvd0UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdFBvd2VycyI6WyJkZWZhdWx0UG93ZXJzIl0sInByZXBhcmVTd2luZ3NldFZvd1Rvb2xzIjpbInByZXBhcmVTd2luZ3NldFZvd1Rvb2xzIl0sInByZXBhcmVWb3dUb29scyI6WyJwcmVwYXJlU3dpbmdzZXRWb3dUb29scyJdLCJoZWFwVm93VG9vbHMiOlsiaGVhcFZvd1Rvb2xzIl0sImhlYXBWb3dFIjpbImhlYXBWb3dFIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKGWQ5mJEQAAiREAADQAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCJdLCJleHBvcnRzIjpbImlzT2ZmZXJTYWZlIiwic2F0aXNmaWVzV2FudCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEFtb3VudE1hdGg7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNPZmZlclNhZmUsJ25hbWUnLHt2YWx1ZTpcImlzT2ZmZXJTYWZlXCJ9KTskaM2PX29uY2UuaXNPZmZlclNhZmUoaXNPZmZlclNhZmUpO1xuXG4vKipcbiAqIEBpbXBvcnQge0Ftb3VudEtleXdvcmRSZWNvcmQsIFByb3Bvc2FsUmVjb3JkfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKi9cblxuLyoqXG4gKiBIZWxwZXIgdG8gcGVyZm9ybSBzYXRpc2ZpZXNXYW50IGFuZCBzYXRpc2ZpZXNHaXZlLiBJc1xuICogYWxsb2NhdGlvbkFtb3VudCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcmVxdWlyZWRBbW91bnQgZm9yIGV2ZXJ5XG4gKiBrZXl3b3JkIG9mIGdpdmVPcldhbnQ/XG4gKlxuICogVG8gcHJlcGFyZSBmb3IgbXVsdGlwbGVzLCBzYXRpc2ZpZXNXYW50IGFuZCBzYXRpc2ZpZXNHaXZlIHJldHVybiAwIG9yIDEuXG4gKiBpc09mZmVyU2FmZSB3aWxsIHN0aWxsIGJlIGJvb2xlYW4uIFdoZW4gd2UgaGF2ZSBNdWx0aXBsZXMsIHNhdGlzZmllc1dhbnQgYW5kXG4gKiBzYXRpc2ZpZXNHaXZlIHdpbGwgdGVsbCBob3cgbWFueSB0aW1lcyB0aGUgb2ZmZXIgd2FzIG1hdGNoZWQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBnaXZlT3JXYW50XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb25cbiAqIEByZXR1cm5zIHswfDF9XG4gKi9cbmNvbnN0IHNhdGlzZmllc0ludGVybmFsID0gKGdpdmVPcldhbnQgPSB7fSwgYWxsb2NhdGlvbikgPT4ge1xuICBjb25zdCBpc0dURUJ5S2V5d29yZCA9IChba2V5d29yZCwgcmVxdWlyZWRBbW91bnRdKSA9PiB7XG4gICAgLyogSWYgdGhlcmUgaXMgbm8gYWxsb2NhdGlvbiBmb3IgYSBrZXl3b3JkLCB3ZSBrbm93IHRoZSBnaXZlT3JXYW50Ki9cbiAgICAvKiBpcyBub3Qgc2F0aXNmaWVkIHdpdGhvdXQgY2hlY2tpbmcgZnVydGhlci4qL1xuICAgIGlmIChhbGxvY2F0aW9uW2tleXdvcmRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBhbGxvY2F0aW9uQW1vdW50ID0gYWxsb2NhdGlvbltrZXl3b3JkXTtcbiAgICByZXR1cm4gQW1vdW50TWF0aC5pc0dURShhbGxvY2F0aW9uQW1vdW50LCByZXF1aXJlZEFtb3VudCkgPyAxIDogMDtcbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGdpdmVPcldhbnQpLmV2ZXJ5KGlzR1RFQnlLZXl3b3JkKSA/IDEgOiAwO1xufTtcblxuLyoqXG4gKiBGb3IgdGhpcyBhbGxvY2F0aW9uIHRvIHNhdGlzZnkgd2hhdCB0aGUgdXNlciB3YW50ZWQsIHRoZWlyXG4gKiBhbGxvY2F0ZWQgYW1vdW50cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBwcm9wb3NhbC53YW50LlxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovXG5jb25zdCBzYXRpc2ZpZXNXYW50ID0gKHByb3Bvc2FsLCBhbGxvY2F0aW9uKSA9PlxuICBzYXRpc2ZpZXNJbnRlcm5hbChwcm9wb3NhbC53YW50LCBhbGxvY2F0aW9uKTtcblxuLyoqXG4gKiBGb3IgdGhpcyBhbGxvY2F0aW9uIHRvIGNvdW50IGFzIGEgZnVsbCByZWZ1bmQsIHRoZSBhbGxvY2F0ZWRcbiAqIGFtb3VudHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gd2hhdCB3YXMgb3JpZ2luYWxseVxuICogb2ZmZXJlZCAocHJvcG9zYWwuZ2l2ZSkuXG4gKlxuICogQHBhcmFtICB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0gIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqLyRozY9fb25jZS5zYXRpc2ZpZXNXYW50KHNhdGlzZmllc1dhbnQpO1xuY29uc3Qgc2F0aXNmaWVzR2l2ZSA9IChwcm9wb3NhbCwgYWxsb2NhdGlvbikgPT5cbiAgc2F0aXNmaWVzSW50ZXJuYWwocHJvcG9zYWwuZ2l2ZSwgYWxsb2NhdGlvbik7XG5cbi8qKlxuICogYGlzT2ZmZXJTYWZlYCBjaGVja3Mgb2ZmZXIgc2FmZXR5IGZvciBhIHNpbmdsZSBvZmZlci5cbiAqXG4gKiBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIGNoZWNrcyB3aGV0aGVyIHdlIGZ1bGx5IHNhdGlzZnlcbiAqIGBwcm9wb3NhbC5naXZlYCAoZ2l2aW5nIGEgcmVmdW5kKSBvciB3aGV0aGVyIHdlIGZ1bGx5IHNhdGlzZnlcbiAqIGBwcm9wb3NhbC53YW50YC4gQm90aCBjYW4gYmUgZnVsbHkgc2F0aXNmaWVkLlxuICpcbiAqIEBwYXJhbSAge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbCAtIHRoZSBydWxlcyB0aGF0IGFjY29tcGFuaWVkIHRoZVxuICogZXNjcm93IG9mIHBheW1lbnRzIHRoYXQgZGljdGF0ZSB3aGF0IHRoZSB1c2VyIGV4cGVjdGVkIHRvIGdldCBiYWNrXG4gKiBmcm9tIFpvZS4gQSBwcm9wb3NhbCBpcyBhIHJlY29yZCB3aXRoIGtleXMgYGdpdmVgLCBgd2FudGAsIGFuZFxuICogYGV4aXRgLiBgZ2l2ZWAgYW5kIGB3YW50YCBhcmUgcmVjb3JkcyB3aXRoIGtleXdvcmRzIGFzIGtleXMgYW5kXG4gKiBhbW91bnRzIGFzIHZhbHVlcy4gVGhlIHByb3Bvc2FsIGlzIGEgdXNlcidzIHVuZGVyc3RhbmRpbmcgb2YgdGhlXG4gKiBjb250cmFjdCB0aGF0IHRoZXkgYXJlIGVudGVyaW5nIHdoZW4gdGhleSBtYWtlIGFuIG9mZmVyLlxuICogQHBhcmFtICB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvbiAtIGEgcmVjb3JkIHdpdGgga2V5d29yZHNcbiAqIGFzIGtleXMgYW5kIGFtb3VudHMgYXMgdmFsdWVzLiBUaGVzZSBhbW91bnRzIGFyZSB0aGUgcmVhbGxvY2F0aW9uXG4gKiB0byBiZSBnaXZlbiB0byBhIHVzZXIuXG4gKi9cbmZ1bmN0aW9uIGlzT2ZmZXJTYWZlKHByb3Bvc2FsLCBhbGxvY2F0aW9uKSB7XG4gIHJldHVybiAoXG4gICAgc2F0aXNmaWVzR2l2ZShwcm9wb3NhbCwgYWxsb2NhdGlvbikgPiAwIHx8XG4gICAgc2F0aXNmaWVzV2FudChwcm9wb3NhbCwgYWxsb2NhdGlvbikgPiAwXG4gICk7XG59XG5cbmhhcmRlbihpc09mZmVyU2FmZSk7XG5oYXJkZW4oc2F0aXNmaWVzV2FudCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzYXRpc2ZpZXNXYW50IjpbInNhdGlzZmllc1dhbnQiXSwiaXNPZmZlclNhZmUiOlsiaXNPZmZlclNhZmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAazhNcmcTAABnEwAAOQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiLi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIlRyYW5zZmVyUGFydFNoYXBlIiwiYXRvbWljUmVhcnJhbmdlIiwiYXRvbWljVHJhbnNmZXIiLCJmcm9tT25seSIsInRvT25seSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFNlYXRTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiLi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlID0gJGjNj19hKV1dLFtcIlNlYXRTaGFwZVwiLFskaM2PX2EgPT4gKFNlYXRTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAaW1wb3J0IHtBbW91bnRLZXl3b3JkUmVjb3JkLCBUcmFuc2ZlclBhcnQsIFpDRiwgWkNGU2VhdH0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICovXG5cbiAgICAgICBjb25zdCBUcmFuc2ZlclBhcnRTaGFwZSA9IE0uc3BsaXRBcnJheShcbiAgaGFyZGVuKFtNLm9wdChTZWF0U2hhcGUpLCBNLm9wdChTZWF0U2hhcGUpLCBNLm9wdChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpXSksXG4gIGhhcmRlbihbTS5vcHQoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKV0pLFxuKTtcblxuLyoqXG4gKiBBc2tzIFpvZSAodmlhIHpjZikgdG8gcmVhcnJhbmdlIHRoZSBhbGxvY2F0aW9ucyBhbW9uZyB0aGUgc2VhdHNcbiAqIG1lbnRpb25lZC4gVGhpcyBpcyBhIHNldCBvZiBjaGFuZ2VzIHRvIGFsbG9jYXRpb25zIHRoYXQgbXVzdCBzYXRpc2Z5XG4gKiBzZXZlcmFsIGNvbnN0cmFpbnRzLiBJZiB0aGVzZSBjb25zdHJhaW50cyBhcmUgYWxsIG1ldCwgdGhlbiB0aGVcbiAqIHJlYWxsb2NhdGlvbiBoYXBwZW5zIGF0b21pY2FsbHkuIE90aGVyd2lzZSBpdCBkb2VzIG5vdCBoYXBwZW5cbiAqIGF0IGFsbC5cbiAqXG4gKiBUaGUgY29uZGl0aW9uc1xuICogICAgKiBBbGwgdGhlIG1lbnRpb25lZCBzZWF0cyBhcmUgc3RpbGwgbGl2ZSAtLSBlbmZvcmNlZCBieSBaQ0YuXG4gKiAgICAqIE5vIG91dHN0YW5kaW5nIHN0YWdpbmdzIGZvciBhbnkgb2YgdGhlIG1lbnRpb25lZCBzZWF0cy5cbiAqICAgICAgU3RhZ2luZ3Mgbm93IGRlcHJlY2F0ZWQgaW4gZmF2b3Igb3IgYXRvbWljUmVhcnJhbmdlLiBUb1xuICogICAgICBwcmV2ZW50IGNvbmZ1c2lvbiwgZm9yIGVhY2ggcmVhbGxvY2F0aW9uLCBpdCBjYW4gb25seSBiZVxuICogICAgICBleHByZXNzZWQgaW4gdGhlIG9sZCB3YXkgb3IgdGhlIG5ldyB3YXksIGJ1dCBub3QgYSBtaXh0dXJlLlxuICogICAgKiBPZmZlciBzYWZldHkgLS0gZW5mb3JjZWQgYnkgWkNGLlxuICogICAgKiBPdmVyYWxsIGNvbnNlcnZhdGlvbiAtLSBlbmZvcmNlZCBieSBaQ0YuXG4gKiAgICAqIFRoZSBvdmVyYWxsIHRyYW5zZmVyIGlzIGV4cHJlc3NlZCBhcyBhbiBhcnJheSBvZiBgVHJhbnNmZXJQYXJ0YC5cbiAqICAgICAgRWFjaCBpbmRpdmlkdWFsIGBUcmFuc2ZlclBhcnRgIGlzIG9uZSBvZlxuICogICAgICAgLSBBIHRyYW5zZmVyIGZyb20gYSBgZnJvbVNlYXRgIHRvIGEgYHRvU2VhdGAuXG4gKiAgICAgICAgIFRoaXMgaXMgbm90IG5lZWRlZCBmb3IgWm9lJ3Mgc2FmZXR5LCBhcyBab2UgZG9lc1xuIGl0cyBvd24gb3ZlcmFsbCBjb25zZXJ2YXRpb24gY2hlY2suIFJhdGhlciwgaXQgaGVscHMgY2F0Y2hcbiBhbmQgZGlhZ25vc2UgY29udHJhY3QgYnVncyBlYXJsaWVyLlxuICogICAgICAgLSBBIHRha2luZyBmcm9tIGEgYGZyb21TZWF0YCdzIGFsbG9jYXRpb24uIFNlZSB0aGUgYGZyb21Pbmx5YFxuIGhlbHBlci5cbiAtIEEgZ2l2aW5nIGludG8gYSBgdG9TZWF0YCdzIGFsbG9jYXRpb24uIFNlZSB0aGUgYHRvT25seWBcbiBoZWxwZXIuXG4gKlxuICogVE9ETyg2Njc5KSBSZWZhY3RvciBgYXRvbWljUmVhcnJhbmdlYGZyb20gYmVpbmcgYSBoZWxwZXIgaW50byBiZWluZ1xuICogemNmJ3MgcmVwbGFjZW1lbnQgZm9yIHJlYWxsb2NhdGUuIEl0IHdhcyBtYWRlIGEgaGVscGVyIGR1cmluZ1xuICogdGhlIHRyYW5zaXRpb24sIHRvIGF2b2lkIGludGVyZmVyZW5jZSB3aXRoIHByb2dyZXNzIG9uIFpvZSBkdXJhYmlsaXR5LlxuICpcbiAqIFNlZSB0aGUgaGVscGVycyBiZWxvdywgYGZyb21Pbmx5YCwgYHRvT25seWAsIGFuZCBgYXRvbWljVHJhbnNmZXJgLFxuICogd2hpY2ggd2lsbCByZW1haW4gaGVscGVycy4gVGhlc2UgaGVscGVyIGFyZSBmb3IgY29udmVuaWVuY2VcbiAqIGluIGV4cHJlc3NpbmcgYXRvbWljIHJlYXJyYW5nZW1lbnRzIGNsZWFybHkuXG4gKlxuICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB6Y2YgYnVpbHRpbiBpbnN0ZWFkXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtUcmFuc2ZlclBhcnRbXX0gdHJhbnNmZXJzXG4gKi8kaM2PX29uY2UuVHJhbnNmZXJQYXJ0U2hhcGUoVHJhbnNmZXJQYXJ0U2hhcGUpO1xuICAgICAgIGNvbnN0IGF0b21pY1JlYXJyYW5nZSA9ICh6Y2YsIHRyYW5zZmVycykgPT4ge1xuICB6Y2YuYXRvbWljUmVhcnJhbmdlKHRyYW5zZmVycyk7XG59O1xuXG4vKipcbiAqIFNvbWV0aW1lcyBhIFRyYW5zZmVyUGFydCBpbiBhbiBhdG9taWNSZWFycmFuZ2Ugb25seSBleHByZXNzZXMgd2hhdCBhbW91bnRzXG4gKiBzaG91bGQgYmUgdGFrZW4gZnJvbSBhIHNlYXQsIGxlYXZpbmcgaXQgdG8gb3RoZXIgVHJhbnNmZXJQYXJ0IG9mIHRoZVxuICogc2FtZSBhdG9taWNSZWFycmFuZ2UgdG8gYmFsYW5jZSBpdCBvdXQuIEZvciB0aGlzIGNhc2UsIHRoZVxuICogYFtmcm9tU2VhdCwgdW5kZWZpbmVkLCBmcm9tQW1vdW50c11gIGZvcm0gaXMgbW9yZSBjbGVhcmx5IGV4cHJlc3NlZCBhc1xuICogYGZyb21Pbmx5KGZyb21TZWF0LCBmcm9tQW1vdW50cylgLiBVbmxpa2UgVHJhbnNmZXJQYXJ0LCBib3RoIGFyZ3VtZW50cyB0b1xuICogYGZyb21Pbmx5YCBhcmUgbm9uLW9wdGlvbmFsLCBhcyBvdGhlcndpc2UgaXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UuXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBmcm9tU2VhdFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBmcm9tQW1vdW50c1xuICogQHJldHVybnMge1RyYW5zZmVyUGFydH1cbiAqLyRozY9fb25jZS5hdG9taWNSZWFycmFuZ2UoYXRvbWljUmVhcnJhbmdlKTtcbiAgICAgICBjb25zdCBmcm9tT25seSA9IChmcm9tU2VhdCwgZnJvbUFtb3VudHMpID0+XG4gIGhhcmRlbihbZnJvbVNlYXQsIHVuZGVmaW5lZCwgZnJvbUFtb3VudHNdKTtcblxuLyoqXG4gKiBTb21ldGltZXMgYSBUcmFuc2ZlclBhcnQgaW4gYW4gYXRvbWljUmVhcnJhbmdlIG9ubHkgZXhwcmVzc2VzIHdoYXQgYW1vdW50c1xuICogc2hvdWxkIGJlIGdpdmVuIHRvIGEgc2VhdCwgbGVhdmluZyBpdCB0byBvdGhlciBUcmFuc2ZlclBhcnQgb2YgdGhlXG4gKiBzYW1lIGF0b21pY1JlYXJyYW5nZSB0byBiYWxhbmNlIGl0IG91dC4gRm9yIHRoaXMgY2FzZSwgdGhlXG4gKiBgW3VuZGVmaW5lZCwgdG9TZWF0LCB1bmRlZmluZWQsIHRvQW1vdW50c11gIGZvcm0gaXMgbW9yZSBjbGVhcmx5IGV4cHJlc3NlZCBhc1xuICogYHRvT25seSh0b1NlYXQsIHRvQW1vdW50cylgLiBVbmxpa2UgVHJhbnNmZXJQYXJ0LCBib3RoIGFyZ3VtZW50cyB0b1xuICogYHRvT25seWAgYXJlIG5vbi1vcHRpb25hbCwgYXMgb3RoZXJ3aXNlIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gdG9TZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IHRvQW1vdW50c1xuICogQHJldHVybnMge1RyYW5zZmVyUGFydH1cbiAqLyRozY9fb25jZS5mcm9tT25seShmcm9tT25seSk7XG4gICAgICAgY29uc3QgdG9Pbmx5ID0gKHRvU2VhdCwgdG9BbW91bnRzKSA9PlxuICBoYXJkZW4oW3VuZGVmaW5lZCwgdG9TZWF0LCB1bmRlZmluZWQsIHRvQW1vdW50c10pO1xuXG4vKipcbiAqIFNwZWNpYWwgY2FzZSBvZiBhdG9taWNSZWFycmFuZ2UgZm9yIGEgc2luZ2xlIG9uZS13YXkgdHJhbnNmZXJcbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IFtmcm9tU2VhdF1cbiAqIEBwYXJhbSB7WkNGU2VhdH0gW3RvU2VhdF1cbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gW2Zyb21BbW91bnRzXVxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBbdG9BbW91bnRzXVxuICovJGjNj19vbmNlLnRvT25seSh0b09ubHkpO1xuICAgICAgIGNvbnN0IGF0b21pY1RyYW5zZmVyID0gKFxuICB6Y2YsXG4gIGZyb21TZWF0ID0gdW5kZWZpbmVkLFxuICB0b1NlYXQgPSB1bmRlZmluZWQsXG4gIGZyb21BbW91bnRzID0gdW5kZWZpbmVkLFxuICB0b0Ftb3VudHMgPSB1bmRlZmluZWQsXG4pID0+IHpjZi5hdG9taWNSZWFycmFuZ2UoaGFyZGVuKFtbZnJvbVNlYXQsIHRvU2VhdCwgZnJvbUFtb3VudHMsIHRvQW1vdW50c11dKSk7JGjNj19vbmNlLmF0b21pY1RyYW5zZmVyKGF0b21pY1RyYW5zZmVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRyYW5zZmVyUGFydFNoYXBlIjpbIlRyYW5zZmVyUGFydFNoYXBlIl0sImF0b21pY1JlYXJyYW5nZSI6WyJhdG9taWNSZWFycmFuZ2UiXSwiZnJvbU9ubHkiOlsiZnJvbU9ubHkiXSwidG9Pbmx5IjpbInRvT25seSJdLCJhdG9taWNUcmFuc2ZlciI6WyJhdG9taWNUcmFuc2ZlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABCPrHJjh0AAI4dAAA4AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwL3NyYy9zYWZlTWF0aC5qcyIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbImNhbGNMaXFWYWx1ZVRvTWludCIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsImNhbGNWYWx1ZVRvUmVtb3ZlIiwiZ2V0SW5wdXRQcmljZSIsImdldE91dHB1dFByaWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbmF0U2FmZU1hdGgsRmFpbCxOYXQ7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHAvc3JjL3NhZmVNYXRoLmpzXCIsIFtbXCJuYXRTYWZlTWF0aFwiLFskaM2PX2EgPT4gKG5hdFNhZmVNYXRoID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge05hdFZhbHVlfSBmcm9tICdAYWdvcmljL2VydHAnO1xuICovXG5cbmNvbnN0IHsgc3VidHJhY3QsIGFkZCwgbXVsdGlwbHksIGZsb29yRGl2aWRlIH0gPSBuYXRTYWZlTWF0aDtcblxuY29uc3QgQkFTSVNfUE9JTlRTID0gMTAwMDBuOyAvKiBUT0RPIGNoYW5nZSB0byAxMF8wMDBuIG9uY2UgdG9vbGluZyBjb3Blcy4qL1xuXG4vKipcbiAqIENhbGN1bGF0aW9ucyBmb3IgY29uc3RhbnQgcHJvZHVjdCBtYXJrZXRzIGxpa2UgVW5pc3dhcC5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ydW50aW1ldmVyaWZpY2F0aW9uL3ZlcmlmaWVkLXNtYXJ0LWNvbnRyYWN0cy9ibG9iL3VuaXN3YXAvdW5pc3dhcC94LXktay5wZGZcbiAqL1xuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgY2FsY3VsYXRpbmcgaG93IG11Y2ggc2hvdWxkIGJlIGdpdmVuXG4gKiBiYWNrIHRvIHRoZSB1c2VyIGluIGV4Y2hhbmdlIGZvciB3aGF0IHRoZXkgc2VudCBpbi4gUmV1c2VkIGluXG4gKiBzZXZlcmFsIGRpZmZlcmVudCBwbGFjZXMsIGluY2x1ZGluZyB0byBjaGVjayB3aGV0aGVyIGFuIG9mZmVyXG4gKiBpcyB2YWxpZCwgZ2V0dGluZyB0aGUgY3VycmVudCBwcmljZSBmb3IgYW4gYXNzZXQgb24gdXNlclxuICogcmVxdWVzdCwgYW5kIHRvIGRvIHRoZSBhY3R1YWwgcmVhbGxvY2F0aW9uIGFmdGVyIGFuIG9mZmVyIGhhc1xuICogYmVlbiBtYWRlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFZhbHVlIC0gdGhlIHZhbHVlIG9mIHRoZSBhc3NldCBzZW50XG4gKiBpbiB0byBiZSBzd2FwcGVkXG4gKiBAcGFyYW0ge2FueX0gaW5wdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGtpbmQgb2YgYXNzZXQgc2VudCBpblxuICogQHBhcmFtIHthbnl9IG91dHB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUga2luZCBvZiBhc3NldCB0byBiZSBzZW50IG91dFxuICogQHBhcmFtIHtiaWdpbnR9IFtmZWVCYXNpc1BvaW50c10gLSB0aGUgZmVlIHRha2VuIGluXG4gKiBiYXNpcyBwb2ludHMuIFRoZSBkZWZhdWx0IGlzIDAuMyUgb3IgMzAgYmFzaXMgcG9pbnRzLiBUaGUgZmVlXG4gKiBpcyB0YWtlbiBmcm9tIGlucHV0VmFsdWVcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX0gb3V0cHV0VmFsdWUgLSB0aGUgY3VycmVudCBwcmljZSwgaW4gdmFsdWUgZm9ybVxuICovXG4gICAgICAgY29uc3QgZ2V0SW5wdXRQcmljZSA9IChcbiAgaW5wdXRWYWx1ZSxcbiAgaW5wdXRSZXNlcnZlLFxuICBvdXRwdXRSZXNlcnZlLFxuICBmZWVCYXNpc1BvaW50cyA9IDMwbixcbikgPT4ge1xuICBpbnB1dFZhbHVlID0gTmF0KGlucHV0VmFsdWUpO1xuICBpbnB1dFJlc2VydmUgPSBOYXQoaW5wdXRSZXNlcnZlKTtcbiAgb3V0cHV0UmVzZXJ2ZSA9IE5hdChvdXRwdXRSZXNlcnZlKTtcbiAgaW5wdXRWYWx1ZSA+IDBuIHx8IEZhaWxgaW5wdXRWYWx1ZSAke2lucHV0VmFsdWV9IG11c3QgYmUgcG9zaXRpdmVgO1xuICBpbnB1dFJlc2VydmUgPiAwbiB8fCBGYWlsYGlucHV0UmVzZXJ2ZSAke2lucHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG4gIG91dHB1dFJlc2VydmUgPiAwbiB8fCBGYWlsYG91dHB1dFJlc2VydmUgJHtvdXRwdXRSZXNlcnZlfSBtdXN0IGJlIHBvc2l0aXZlYDtcblxuICBjb25zdCBvbmVNaW51c0ZlZVNjYWxlZCA9IHN1YnRyYWN0KEJBU0lTX1BPSU5UUywgZmVlQmFzaXNQb2ludHMpO1xuICBjb25zdCBpbnB1dFdpdGhGZWUgPSBtdWx0aXBseShpbnB1dFZhbHVlLCBvbmVNaW51c0ZlZVNjYWxlZCk7XG4gIGNvbnN0IG51bWVyYXRvciA9IG11bHRpcGx5KGlucHV0V2l0aEZlZSwgb3V0cHV0UmVzZXJ2ZSk7XG4gIGNvbnN0IGRlbm9taW5hdG9yID0gYWRkKG11bHRpcGx5KGlucHV0UmVzZXJ2ZSwgQkFTSVNfUE9JTlRTKSwgaW5wdXRXaXRoRmVlKTtcbiAgcmV0dXJuIGZsb29yRGl2aWRlKG51bWVyYXRvciwgZGVub21pbmF0b3IpO1xufTtcblxuLyoqXG4gKiBDb250YWlucyB0aGUgbG9naWMgZm9yIGNhbGN1bGF0aW5nIGhvdyBtdWNoIHNob3VsZCBiZSB0YWtlblxuICogZnJvbSB0aGUgdXNlciBpbiBleGNoYW5nZSBmb3Igd2hhdCB0aGV5IHdhbnQgdG8gb2J0YWluLiBSZXVzZWQgaW5cbiAqIHNldmVyYWwgZGlmZmVyZW50IHBsYWNlcywgaW5jbHVkaW5nIHRvIGNoZWNrIHdoZXRoZXIgYW4gb2ZmZXJcbiAqIGlzIHZhbGlkLCBnZXR0aW5nIHRoZSBjdXJyZW50IHByaWNlIGZvciBhbiBhc3NldCBvbiB1c2VyXG4gKiByZXF1ZXN0LCBhbmQgdG8gZG8gdGhlIGFjdHVhbCByZWFsbG9jYXRpb24gYWZ0ZXIgYW4gb2ZmZXIgaGFzXG4gKiBiZWVuIG1hZGUuXG4gKlxuICogQHBhcmFtIHthbnl9IG91dHB1dFZhbHVlIC0gdGhlIHZhbHVlIG9mIHRoZSBhc3NldCB0aGUgdXNlciB3YW50c1xuICogdG8gZ2V0XG4gKiBAcGFyYW0ge2FueX0gaW5wdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGFzc2V0IGJlaW5nIHNwZW50XG4gKiBAcGFyYW0ge2FueX0gb3V0cHV0UmVzZXJ2ZSAtIHRoZSB2YWx1ZSBpbiB0aGUgbGlxdWlkaXR5XG4gKiBwb29sIG9mIHRoZSBraW5kIG9mIGFzc2V0IHRvIGJlIHNlbnQgb3V0XG4gKiBAcGFyYW0ge2JpZ2ludH0gW2ZlZUJhc2lzUG9pbnRzXSAtIHRoZSBmZWUgdGFrZW4gaW5cbiAqIGJhc2lzIHBvaW50cy4gVGhlIGRlZmF1bHQgaXMgMC4zJSBvciAzMCBiYXNpcyBwb2ludHMuIFRoZSBmZWUgaXMgdGFrZW4gZnJvbVxuICogb3V0cHV0VmFsdWVcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX0gaW5wdXRWYWx1ZSAtIHRoZSB2YWx1ZSBvZiBpbnB1dCByZXF1aXJlZCB0byBwdXJjaGFzZSBvdXRwdXRcbiAqLyRozY9fb25jZS5nZXRJbnB1dFByaWNlKGdldElucHV0UHJpY2UpO1xuICAgICAgIGNvbnN0IGdldE91dHB1dFByaWNlID0gKFxuICBvdXRwdXRWYWx1ZSxcbiAgaW5wdXRSZXNlcnZlLFxuICBvdXRwdXRSZXNlcnZlLFxuICBmZWVCYXNpc1BvaW50cyA9IDMwbixcbikgPT4ge1xuICBvdXRwdXRWYWx1ZSA9IE5hdChvdXRwdXRWYWx1ZSk7XG4gIGlucHV0UmVzZXJ2ZSA9IE5hdChpbnB1dFJlc2VydmUpO1xuICBvdXRwdXRSZXNlcnZlID0gTmF0KG91dHB1dFJlc2VydmUpO1xuXG4gIGlucHV0UmVzZXJ2ZSA+IDBuIHx8IEZhaWxgaW5wdXRSZXNlcnZlICR7aW5wdXRSZXNlcnZlfSBtdXN0IGJlIHBvc2l0aXZlYDtcbiAgb3V0cHV0UmVzZXJ2ZSA+IDBuIHx8IEZhaWxgb3V0cHV0UmVzZXJ2ZSAke291dHB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgO1xuICBvdXRwdXRSZXNlcnZlID4gb3V0cHV0VmFsdWUgfHxcbiAgICBGYWlsYG91dHB1dFJlc2VydmUgJHtvdXRwdXRSZXNlcnZlfSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvdXRwdXRWYWx1ZSAke291dHB1dFZhbHVlfWA7XG5cbiAgY29uc3Qgb25lTWludXNGZWVTY2FsZWQgPSBzdWJ0cmFjdChCQVNJU19QT0lOVFMsIGZlZUJhc2lzUG9pbnRzKTtcbiAgY29uc3QgbnVtZXJhdG9yID0gbXVsdGlwbHkobXVsdGlwbHkob3V0cHV0VmFsdWUsIGlucHV0UmVzZXJ2ZSksIEJBU0lTX1BPSU5UUyk7XG4gIGNvbnN0IGRlbm9taW5hdG9yID0gbXVsdGlwbHkoXG4gICAgc3VidHJhY3Qob3V0cHV0UmVzZXJ2ZSwgb3V0cHV0VmFsdWUpLFxuICAgIG9uZU1pbnVzRmVlU2NhbGVkLFxuICApO1xuICByZXR1cm4gYWRkKGZsb29yRGl2aWRlKG51bWVyYXRvciwgZGVub21pbmF0b3IpLCAxbik7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSBob3cgbWFueSBsaXF1aWRpdHkgdG9rZW5zIHdlIHNob3VsZCBiZSBtaW50aW5nIHRvIHNlbmQgYmFjayB0byB0aGVcbiAqIHVzZXIgd2hlbiBhZGRpbmcgbGlxdWlkaXR5LiBXZSBwcm92aWRlIG5ldyBsaXF1aWRpdHkgZXF1YWwgdG8gdGhlIGV4aXN0aW5nXG4gKiBsaXF1aWRpdHkgbXVsdGlwbGllZCBieSB0aGUgcmF0aW8gb2YgbmV3IGNlbnRyYWwgdG9rZW5zIHRvIGNlbnRyYWwgdG9rZW5zXG4gKiBhbHJlYWR5IGhlbGQuIElmIHRoZSBjdXJyZW50IHN1cHBseSBpcyB6ZXJvLCByZXR1cm4gdGhlIGlucHV0VmFsdWUgYXMgdGhlXG4gKiBpbml0aWFsIGxpcXVpZGl0eSB0byBtaW50IGlzIGFyYml0cmFyeS5cbiAqXG4gKiBAcGFyYW0ge2JpZ2ludH0gbGlxVG9rZW5TdXBwbHlcbiAqIEBwYXJhbSB7YmlnaW50fSBpbnB1dFZhbHVlXG4gKiBAcGFyYW0ge2JpZ2ludH0gaW5wdXRSZXNlcnZlXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9XG4gKi8kaM2PX29uY2UuZ2V0T3V0cHV0UHJpY2UoZ2V0T3V0cHV0UHJpY2UpO1xuICAgICAgIGNvbnN0IGNhbGNMaXFWYWx1ZVRvTWludCA9IChcbiAgbGlxVG9rZW5TdXBwbHksXG4gIGlucHV0VmFsdWUsXG4gIGlucHV0UmVzZXJ2ZSxcbikgPT4ge1xuICBsaXFUb2tlblN1cHBseSA9IE5hdChsaXFUb2tlblN1cHBseSk7XG4gIGlucHV0VmFsdWUgPSBOYXQoaW5wdXRWYWx1ZSk7XG4gIGlucHV0UmVzZXJ2ZSA9IE5hdChpbnB1dFJlc2VydmUpO1xuXG4gIGlmIChsaXFUb2tlblN1cHBseSA9PT0gMG4pIHtcbiAgICByZXR1cm4gaW5wdXRWYWx1ZTtcbiAgfVxuICByZXR1cm4gZmxvb3JEaXZpZGUobXVsdGlwbHkoaW5wdXRWYWx1ZSwgbGlxVG9rZW5TdXBwbHkpLCBpbnB1dFJlc2VydmUpO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgaG93IG11Y2ggb2YgdGhlIHNlY29uZGFyeSB0b2tlbiBpcyByZXF1aXJlZCBmcm9tIHRoZSB1c2VyIHdoZW5cbiAqIGFkZGluZyBsaXF1aWRpdHkuIFdlIHJlcXVpcmUgdGhhdCB0aGUgZGVwb3NpdGVkIHJhdGlvIG9mIGNlbnRyYWwgdG8gc2Vjb25kYXJ5XG4gKiBtYXRjaCB0aGUgY3VycmVudCByYXRpbyBvZiBob2xkaW5ncyBpbiB0aGUgcG9vbC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gY2VudHJhbEluIC0gVGhlIHZhbHVlIG9mIGNlbnRyYWwgYXNzZXRzIGJlaW5nIGRlcG9zaXRlZFxuICogQHBhcmFtIHthbnl9IGNlbnRyYWxQb29sIC0gVGhlIHZhbHVlIG9mIGNlbnRyYWwgYXNzZXRzIGluIHRoZSBwb29sXG4gKiBAcGFyYW0ge2FueX0gc2Vjb25kYXJ5UG9vbCAtIFRoZSB2YWx1ZSBvZiBzZWNvbmRhcnkgYXNzZXRzIGluIHRoZSBwb29sXG4gKiBAcGFyYW0ge2FueX0gc2Vjb25kYXJ5SW4gLSBUaGUgdmFsdWUgb2Ygc2Vjb25kYXJ5IGFzc2V0cyBwcm92aWRlZC4gSWZcbiAqIHRoZSBwb29sIGlzIGVtcHR5LCB0aGUgZW50aXJlIGFtb3VudCB3aWxsIGJlIGFjY2VwdGVkXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9IC0gdGhlIGFtb3VudCBvZiBzZWNvbmRhcnkgcmVxdWlyZWRcbiAqLyRozY9fb25jZS5jYWxjTGlxVmFsdWVUb01pbnQoY2FsY0xpcVZhbHVlVG9NaW50KTtcbiAgICAgICBjb25zdCBjYWxjU2Vjb25kYXJ5UmVxdWlyZWQgPSAoXG4gIGNlbnRyYWxJbixcbiAgY2VudHJhbFBvb2wsXG4gIHNlY29uZGFyeVBvb2wsXG4gIHNlY29uZGFyeUluLFxuKSA9PiB7XG4gIGNlbnRyYWxJbiA9IE5hdChjZW50cmFsSW4pO1xuICBjZW50cmFsUG9vbCA9IE5hdChjZW50cmFsUG9vbCk7XG4gIHNlY29uZGFyeVBvb2wgPSBOYXQoc2Vjb25kYXJ5UG9vbCk7XG4gIHNlY29uZGFyeUluID0gTmF0KHNlY29uZGFyeUluKTtcblxuICBpZiAoY2VudHJhbFBvb2wgPT09IDBuIHx8IHNlY29uZGFyeVBvb2wgPT09IDBuKSB7XG4gICAgcmV0dXJuIHNlY29uZGFyeUluO1xuICB9XG5cbiAgY29uc3Qgc2NhbGVkU2Vjb25kYXJ5ID0gZmxvb3JEaXZpZGUoXG4gICAgbXVsdGlwbHkoY2VudHJhbEluLCBzZWNvbmRhcnlQb29sKSxcbiAgICBjZW50cmFsUG9vbCxcbiAgKTtcbiAgY29uc3QgZXhhY3QgPVxuICAgIG11bHRpcGx5KGNlbnRyYWxJbiwgc2Vjb25kYXJ5UG9vbCkgPT09XG4gICAgbXVsdGlwbHkoc2NhbGVkU2Vjb25kYXJ5LCBjZW50cmFsUG9vbCk7XG5cbiAgLyogZG9lc24ndCBtYXRjaCB0aGUgeC15LWsucGRmIHBhcGVyLCBidXQgbW9yZSBjb3JyZWN0LiBXaGVuIHRoZSByYXRpb3MgYXJlKi9cbiAgLyogZXhhY3RseSBlcXVhbCwgbFByaW1lIGlzIGV4YWN0bHkgbCAqICgxICsgYWxwaGEpIGFuZCBhZGRpbmcgb25lIGlzIHdyb25nKi9cbiAgcmV0dXJuIGV4YWN0ID8gc2NhbGVkU2Vjb25kYXJ5IDogMW4gKyBzY2FsZWRTZWNvbmRhcnk7XG59O1xuXG4vKiBDYWxjdWxhdGUgaG93IG1hbnkgdW5kZXJseWluZyB0b2tlbnMgKGluIHRoZSBmb3JtIG9mIGEgdmFsdWUpIHNob3VsZCBiZSovXG4vKiByZXR1cm5lZCB3aGVuIHJlbW92aW5nIGxpcXVpZGl0eS4qLyRozY9fb25jZS5jYWxjU2Vjb25kYXJ5UmVxdWlyZWQoY2FsY1NlY29uZGFyeVJlcXVpcmVkKTtcbiAgICAgICBjb25zdCBjYWxjVmFsdWVUb1JlbW92ZSA9IChcbiAgbGlxVG9rZW5TdXBwbHksXG4gIHBvb2xWYWx1ZSxcbiAgbGlxdWlkaXR5VmFsdWVJbixcbikgPT4ge1xuICBsaXFUb2tlblN1cHBseSA9IE5hdChsaXFUb2tlblN1cHBseSk7XG4gIGxpcXVpZGl0eVZhbHVlSW4gPSBOYXQobGlxdWlkaXR5VmFsdWVJbik7XG4gIHBvb2xWYWx1ZSA9IE5hdChwb29sVmFsdWUpO1xuXG4gIHJldHVybiBmbG9vckRpdmlkZShtdWx0aXBseShsaXF1aWRpdHlWYWx1ZUluLCBwb29sVmFsdWUpLCBsaXFUb2tlblN1cHBseSk7XG59OyRozY9fb25jZS5jYWxjVmFsdWVUb1JlbW92ZShjYWxjVmFsdWVUb1JlbW92ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRJbnB1dFByaWNlIjpbImdldElucHV0UHJpY2UiXSwiZ2V0T3V0cHV0UHJpY2UiOlsiZ2V0T3V0cHV0UHJpY2UiXSwiY2FsY0xpcVZhbHVlVG9NaW50IjpbImNhbGNMaXFWYWx1ZVRvTWludCJdLCJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiOlsiY2FsY1NlY29uZGFyeVJlcXVpcmVkIl0sImNhbGNWYWx1ZVRvUmVtb3ZlIjpbImNhbGNWYWx1ZVRvUmVtb3ZlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADfO1r4xFAAAMRQAADUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJtYWtlRXBoZW1lcmFQcm92aWRlciIsInByb3ZpZGVBbGwiLCJwcm92aWRlRW1wdHlTZWF0IiwicHJvdmlkZVNpbmdsZXRvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFsbFZhbHVlcyxvYmplY3RNYXAscHJvdmlkZSxFOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYWxsVmFsdWVzXCIsWyRozY9fYSA9PiAoYWxsVmFsdWVzID0gJGjNj19hKV1dLFtcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByb3ZpZGVcIixbJGjNj19hID0+IChwcm92aWRlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtNYXBTdG9yZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7WkNGLCBaQ0ZTZWF0fSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuLyoqXG4gKiBTQ0FMRTogT25seSBmb3IgbG93IGNhcmRpbmFsaXR5IHByb3Zpc2lvbmluZy4gRXZlcnkgdmFsdWUgZnJvbSBpbml0KCkgd2lsbFxuICogcmVtYWluIGluIHRoZSBtYXAgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgaGVhcC4gSWYgYSBrZXkgb2JqZWN0IGlzIEdDZWQsIGl0c1xuICogcmVwcmVzZW50YXRpdmUgYWxzbyByZW1haW5zLlxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IEUgRXBoZW1lcmFsIHN0YXRlXG4gKiBAdGVtcGxhdGUge1dlYWtLZXl9IEsga2V5IG9uIHdoaWNoIHRvIHByb3Zpc2lvblxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBFfSBpbml0XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRXBoZW1lcmFQcm92aWRlciA9IGluaXQgPT4ge1xuICAvKiogQHR5cGUge1dlYWtNYXA8SywgRT59ICovXG4gIGNvbnN0IGV4dGFudCA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLyoqXG4gKiBQcm92aWRlIGFuIG9iamVjdCB0byBob2xkIHN0YXRlIHRoYXQgbmVlZCBub3QgKG9yIGNhbm5vdCkgYmUgZHVyYWJsZS5cbiAqXG4gKiBAdHlwZSB7KGtleTogSykgPT4gRX1cbiAqL1xuICByZXR1cm4ga2V5ID0+IHtcbiAgICBpZiAoZXh0YW50LmhhcyhrZXkpKSB7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgICAgcmV0dXJuIGV4dGFudC5nZXQoa2V5KTtcbiAgICB9XG4gICAgY29uc3QgbmV3RXBoID0gaW5pdChrZXkpO1xuICAgIGV4dGFudC5zZXQoa2V5LCBuZXdFcGgpO1xuICAgIHJldHVybiBuZXdFcGg7XG4gIH07XG59OyRozY9fb25jZS5tYWtlRXBoZW1lcmFQcm92aWRlcihtYWtlRXBoZW1lcmFQcm92aWRlcik7XG5oYXJkZW4obWFrZUVwaGVtZXJhUHJvdmlkZXIpO1xuXG4vKipcbiAqIFByb3ZpZGUgYW4gZW1wdHkgWkNGIHNlYXQuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge1pDRlNlYXR9XG4gKi9cbiAgICAgICBjb25zdCBwcm92aWRlRW1wdHlTZWF0ID0gKHpjZiwgYmFnZ2FnZSwgbmFtZSkgPT4ge1xuICByZXR1cm4gcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PiB6Y2YubWFrZUVtcHR5U2VhdEtpdCgpLnpjZlNlYXQpO1xufTskaM2PX29uY2UucHJvdmlkZUVtcHR5U2VhdChwcm92aWRlRW1wdHlTZWF0KTtcbmhhcmRlbihwcm92aWRlRW1wdHlTZWF0KTtcblxuLyoqXG4gKiBGb3IgdXNlIGluIGNvbnRyYWN0IHVwZ3JhZGVzIHRvIHByb3ZpZGUgdmFsdWVzIHRoYXQgY29tZSBmcm9tIG90aGVyIHZhdHMuXG4gKiBBbGwgdmF0cyBtdXN0IGJlIGFibGUgdG8gZmluaXNoIHRoZWlyIHVwZ3JhZGUgd2l0aG91dCBjb250YWN0aW5nIG90aGVyIHZhdHMsXG4gKiBzbyB3aGF0ZXZlciB2YWx1ZXMgYW4gaW5zdGFuY2UgbmVlZHMgZnJvbSBvdGhlciB2YXRzIG11c3QgYmUgc2F2ZWQgaW4gdGhlIGZpcnN0XG4gKiBpbmNhcm5hdGlvbiBhbmQgcmVhZCBmcm9tIGJhZ2dhZ2UgaW4gZWFjaCBzdWJzZXF1ZW50LlxuICpcbiAqIFRoaXMgYWJzdHJhY3RzIHRoYXQgY29uZGl0aW9uIHNvIHRoYXQgdGhlIGNvbnRyYWN0IGNhbiBjb252ZXJ0IGEgZGljdGlvbmFyeVxuICogb2YgdGh1bmtzIGludG8gYSBkaWN0aW9uYXJ5IG9mIHZhbHVlcyBkdXJpbmcgaXRzIGZpcnN0IGBwcmVwYXJlYCAoc3RhcnQpLlxuICogRWFjaCBzdWJzZXF1ZW50IGBwcmVwYXJlYCBjYWxsIHdpbGwgYXV0b21hdGljYWxseSByZWFkIGZyb20gdGhlIGJhZ2dhZ2UgYW5kXG4gKiBlc2NoZXcgcmVtb3RlIGNhbGxzLlxuICpcbiAqIFRoZSB2YWx1ZXMgYXJlIHRodW5rcyBpbnN0ZWFkIG9mIHByb21pc2VzIHNvIHRoYXQgdGhleSBkb24ndCBzdGFydCBleGVjdXRpbmdcbiAqIHVubmVjZXNzYXJpbHkgb3IgaW5kdWNlIGZhaWx1cmVzLlxuICpcbiAqIEZvciBleGFtcGxlLFxuICpcbiAqICAgICBjb25zdCBpbnZpdGF0aW9uSXNzdWVyUCA9IEUoem9lKS5nZXRJbnZpdGF0aW9uSXNzdWVyKCk7XG4gKiAgICAgY29uc3Qge1xuICogICAgICAgaW52aXRhdGlvbklzc3VlcixcbiAqICAgICAgIGludml0YXRpb25CcmFuZCxcbiAqICAgICB9ID0gYXdhaXQgcHJvdmlkZUFsbChiYWdnYWdlLCB7XG4gKiAgICAgICBpbnZpdGF0aW9uSXNzdWVyOiAoKSA9PiBpbnZpdGF0aW9uSXNzdWVyUCxcbiAqICAgICAgIGludml0YXRpb25CcmFuZDogKCkgPT4gRShpbnZpdGF0aW9uSXNzdWVyUCkuZ2V0QnJhbmQoKSxcbiAqICAgICB9KTtcbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsICgpID0+IEVSZWY8YW55Pj59IFQgZGljdCBvZiB0aHVua3MgKHByb21pc2UgbWFrZXJzKVxuICogQHBhcmFtIHtNYXBTdG9yZTxzdHJpbmcsIGFueT59IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7VH0gdGh1bmtzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7IFtLIGluIGtleW9mIFRdOiBBd2FpdGVkPFJldHVyblR5cGU8VFtLXT4+IH0+fVxuICovXG4gICAgICAgY29uc3QgcHJvdmlkZUFsbCA9IChiYWdnYWdlLCB0aHVua3MpID0+IHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRodW5rcyk7XG4gIC8qIGFzc3VtZSBpZiBhbnkga2V5cyBhcmUgZGVmaW5lZCB0aGV5IGFsbCBhcmUqL1xuICBjb25zdCBpbkJhZ2dhZ2UgPSBiYWdnYWdlLmhhcyhrZXlzWzBdKTtcbiAgaWYgKGluQmFnZ2FnZSkge1xuICAgIGNvbnN0IG9iaiA9IG9iamVjdE1hcChcbiAgICAgIHRodW5rcyxcbiAgICAgIC8qKiBAdHlwZSB7KHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSA9PiBhbnl9ICovXG4gICAgICAoXywgaykgPT4gYmFnZ2FnZS5nZXQoayksXG4gICAgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGhhcmRlbihvYmopKTtcbiAgfVxuXG4gIGNvbnN0IGtleWVkUHJvbWlzZXMgPSBvYmplY3RNYXAodGh1bmtzLCBmbiA9PiBmbigpKTtcblxuICByZXR1cm4gYWxsVmFsdWVzKGtleWVkUHJvbWlzZXMpLnRoZW4oa2V5ZWRWYWxzID0+IHtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhrZXllZFZhbHMpKSB7XG4gICAgICBiYWdnYWdlLmluaXQoaywgdik7XG4gICAgfVxuICAgIHJldHVybiBrZXllZFZhbHM7XG4gIH0pO1xufTskaM2PX29uY2UucHJvdmlkZUFsbChwcm92aWRlQWxsKTtcbmhhcmRlbihwcm92aWRlQWxsKTtcblxuLyoqXG4gKiBMaWtlIHByb3ZpZGVBc3luYyBpbiBBdG9taWNQcm92aWRlciBidXQgYXNzdW1lcyBvbmx5IG9uZSBjYWxsIHNvIHRoZXJlIGFyZSBubyByYWNlIGNvbmRpdGlvbnMuXG4gKiBBZGRpdGlvbmFsbHkgb2ZmZXJzIGEgYHdpdGhWYWx1ZWAgaGVscGVyIHVzZWZ1bCBmb3IgdHJpZ2dlcmluZyBwcm9jZXNlc3Mgb24gYSBwcm92aWRlZCBvYmplY3QuXG4gKlxuICogQHNlZSB7bWFrZUF0b21pY1Byb3ZpZGVyfVxuICogQHNlZSB7QXRvbWljUHJvdmlkZXJ9XG4gKiBAdGVtcGxhdGUgeygpID0+IEVSZWY8YW55Pn0gVFxuICogQHBhcmFtIHtCYWdnYWdlfSBtYXBTdG9yZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHBhcmFtIHtUfSBtYWtlVmFsdWVcbiAqIEBwYXJhbSB7KHZhbHVlOiBBd2FpdGVkPFJldHVyblR5cGU8VD4+KSA9PiB2b2lkfSBbd2l0aFZhbHVlXVxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj59XG4gKi9cbiAgICAgICBjb25zdCBwcm92aWRlU2luZ2xldG9uID0gKG1hcFN0b3JlLCBrZXksIG1ha2VWYWx1ZSwgd2l0aFZhbHVlKSA9PiB7XG4gIGNvbnN0IHN0b3JlZCA9IG1hcFN0b3JlLmhhcyhrZXkpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IEUud2hlbihtYWtlVmFsdWUoKSwgdiA9PiBtYXBTdG9yZS5pbml0KGtleSwgaGFyZGVuKHYpKSk7XG5cbiAgcmV0dXJuIEUud2hlbihzdG9yZWQsICgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IG1hcFN0b3JlLmdldChrZXkpO1xuICAgIGlmICh3aXRoVmFsdWUpIHtcbiAgICAgIHdpdGhWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSk7XG59OyRozY9fb25jZS5wcm92aWRlU2luZ2xldG9uKHByb3ZpZGVTaW5nbGV0b24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVwaGVtZXJhUHJvdmlkZXIiOlsibWFrZUVwaGVtZXJhUHJvdmlkZXIiXSwicHJvdmlkZUVtcHR5U2VhdCI6WyJwcm92aWRlRW1wdHlTZWF0Il0sInByb3ZpZGVBbGwiOlsicHJvdmlkZUFsbCJdLCJwcm92aWRlU2luZ2xldG9uIjpbInByb3ZpZGVTaW5nbGV0b24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtZivOKYIAACmCAAAMAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2JvbmRpbmdDdXJ2ZXMuanMiLCJAYWdvcmljL2VydHAvc3JjL3NhZmVNYXRoLmpzIiwiLi9zdGF0ZU1hY2hpbmUuanMiLCIuL2F0b21pY1RyYW5zZmVyLmpzIiwiLi96b2VIZWxwZXJzLmpzIiwiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qcyIsIi4vZHVyYWJpbGl0eS5qcyIsIi4vcHJlcGFyZS1vd25hYmxlLmpzIiwiLi9wcmljZUF1dGhvcml0eS5qcyIsIi4vcHJpY2VRdW90ZS5qcyIsIi4vcmVjb3JkZXIuanMiLCIuL3N0YXRpc3RpY3MuanMiLCIuL3RvcGljcy5qcyJdLCJleHBvcnRzIjpbImFzc2VydE5hdEFzc2V0S2luZCIsImFzc2VydE5hdEFzc2V0S2luZCIsImF0b21pY1RyYW5zZmVyIiwiYXRvbWljVHJhbnNmZXIiLCJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiLCJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL2R1cmFiaWxpdHkuanMiLCIuL3ByZXBhcmUtb3duYWJsZS5qcyIsIi4vcHJpY2VBdXRob3JpdHkuanMiLCIuL3ByaWNlUXVvdGUuanMiLCIuL3JlY29yZGVyLmpzIiwiLi9zdGF0aXN0aWNzLmpzIiwiLi90b3BpY3MuanMiLCJAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vYm9uZGluZ0N1cnZlcy5qc1wiLCBbXV0sW1wiQGFnb3JpYy9lcnRwL3NyYy9zYWZlTWF0aC5qc1wiLCBbXV0sW1wiLi9zdGF0ZU1hY2hpbmUuanNcIiwgW11dLFtcIi4vYXRvbWljVHJhbnNmZXIuanNcIiwgW11dLFtcIi4vem9lSGVscGVycy5qc1wiLCBbXV0sW1wiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qc1wiLCBbXV0sW1wiLi9kdXJhYmlsaXR5LmpzXCIsIFtdXSxbXCIuL3ByZXBhcmUtb3duYWJsZS5qc1wiLCBbXV0sW1wiLi9wcmljZUF1dGhvcml0eS5qc1wiLCBbXV0sW1wiLi9wcmljZVF1b3RlLmpzXCIsIFtdXSxbXCIuL3JlY29yZGVyLmpzXCIsIFtdXSxbXCIuL3N0YXRpc3RpY3MuanNcIiwgW11dLFtcIi4vdG9waWNzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9ib25kaW5nQ3VydmVzLmpzIjpbWyJjYWxjTGlxVmFsdWVUb01pbnQiLCJjYWxjTGlxVmFsdWVUb01pbnQiXSxbImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCJdLFsiY2FsY1ZhbHVlVG9SZW1vdmUiLCJjYWxjVmFsdWVUb1JlbW92ZSJdLFsiZ2V0SW5wdXRQcmljZSIsImdldElucHV0UHJpY2UiXSxbImdldE91dHB1dFByaWNlIiwiZ2V0T3V0cHV0UHJpY2UiXV0sIkBhZ29yaWMvZXJ0cC9zcmMvc2FmZU1hdGguanMiOltbIm5hdFNhZmVNYXRoIiwibmF0U2FmZU1hdGgiXV0sIi4vc3RhdGVNYWNoaW5lLmpzIjpbWyJtYWtlU3RhdGVNYWNoaW5lIiwibWFrZVN0YXRlTWFjaGluZSJdXSwiLi9hdG9taWNUcmFuc2Zlci5qcyI6W1siYXRvbWljUmVhcnJhbmdlIiwiYXRvbWljUmVhcnJhbmdlIl0sWyJhdG9taWNUcmFuc2ZlciIsImF0b21pY1RyYW5zZmVyIl0sWyJmcm9tT25seSIsImZyb21Pbmx5Il0sWyJ0b09ubHkiLCJ0b09ubHkiXV0sIi4vem9lSGVscGVycy5qcyI6W1siYXNzZXJ0SXNzdWVyS2V5d29yZHMiLCJhc3NlcnRJc3N1ZXJLZXl3b3JkcyJdLFsiYXNzZXJ0TmF0QXNzZXRLaW5kIiwiYXNzZXJ0TmF0QXNzZXRLaW5kIl0sWyJhc3NlcnRQcm9wb3NhbFNoYXBlIiwiYXNzZXJ0UHJvcG9zYWxTaGFwZSJdLFsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciLCJkZWZhdWx0QWNjZXB0YW5jZU1zZyJdLFsiZGVwb3NpdFRvU2VhdCIsImRlcG9zaXRUb1NlYXQiXSxbImZpdFByb3Bvc2FsU2hhcGUiLCJmaXRQcm9wb3NhbFNoYXBlIl0sWyJvZmZlclRvIiwib2ZmZXJUbyJdLFsic2F0aXNmaWVzIiwic2F0aXNmaWVzIl0sWyJzYXZlQWxsSXNzdWVycyIsInNhdmVBbGxJc3N1ZXJzIl0sWyJzd2FwIiwic3dhcCJdLFsic3dhcEV4YWN0Iiwic3dhcEV4YWN0Il0sWyJ3aXRoZHJhd0Zyb21TZWF0Iiwid2l0aGRyYXdGcm9tU2VhdCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfM7hAasPAACrDwAAOgAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmVwYXJlLW93bmFibGUuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9iYXNlLXpvbmUvem9uZS1oZWxwZXJzLmpzIiwiQGVuZG8vcGF0dGVybnMiLCIuLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZU93bmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQsTSxPZmZlckhhbmRsZXJJOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9iYXNlLXpvbmUvem9uZS1oZWxwZXJzLmpzXCIsIFtbXCJwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXRcIixbJGjNj19hID0+IChwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJPZmZlckhhbmRsZXJJXCIsWyRozY9fYSA9PiAoT2ZmZXJIYW5kbGVySSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge1pDRn0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7SW52aXRhdGlvbn0gZnJvbSAnLi4vdHlwZXMtaW5kZXguanMnO1xuICovXG5cbmNvbnN0IFRyYW5zZmVyUHJvcG9zYWxTaGFwZSA9IE0uc3BsaXRSZWNvcmQoe1xuICBnaXZlOiB7fSxcbiAgd2FudDoge30sXG4gIGV4aXQ6IHtcbiAgICBvbkRlbWFuZDogbnVsbCxcbiAgfSxcbn0pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE93bmFibGVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VJbnRlcmZhY2VOYW1lXVxuICogICBUaGUgYGludGVyZmFjZU5hbWVgIG9mIHRoZSB1bmRlcmx5aW5nIGludGVyZmFjZSBndWFyZC5cbiAqICAgRGVmYXVsdHMgdG8gdGhlIGB1S2luZE5hbWVgLlxuICovXG5cbi8qKlxuICogUHJlcGFyZSBhIGtpbmQgdGhhdCB3cmFwcyBhbiAnb3duYWJsZScgb2JqZWN0IHdpdGggYSBgbWFrZVRyYW5zZmVySW52aXRhdGlvbmBcbiAqIGFiaWxpdHkgYW5kIGRlbGVnYXRlcyB0byB0aGUgdW5kZXJseWluZyBvYmplY3QgbWV0aG9kcyBzcGVjaWZpZWQgaW4gYW5cbiAqIGFsbG93bGlzdCBvZiBtZXRob2QgbmFtZXMuXG4gKlxuICogQHRlbXBsYXRlIHsoc3RyaW5nIHwgc3ltYm9sKVtdfSBNTiBNZXRob2QgbmFtZXNcbiAqIEBwYXJhbSB7Wm9uZX0gem9uZVxuICogQHBhcmFtIHtaQ0ZbJ21ha2VJbnZpdGF0aW9uJ119IG1ha2VJbnZpdGF0aW9uXG4gKiAgIEEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBiZWhhdmlvciBhcyBgemNmLm1ha2VJbnZpdGF0aW9uYC5cbiAqICAgQSBjb250cmFjdCB3aWxsIG5vcm1hbGx5IGp1c3QgZXh0cmFjdCBpdCBmcm9tIGl0cyBvd24gemNmIHVzaW5nIHRoZVxuICogICBhcmd1bWVudCBleHByZXNzaW9uXG4gKiAgIGBgYGpzXG4gKiAgICguLi5hcmdzKSA9PiB6Y2YubWFrZUludml0YXRpb24oLi4uYXJncylcbiAqICAgYGBgXG4gKiAgIFNlZSBvd25hYmxlLWNvdW50ZXIuanMgZm9yIHRoZSBjYW5vbmljYWwgZXhhbXBsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB1S2luZE5hbWVcbiAqICAgVGhlIGBraW5kTmFtZWAgb2YgdGhlIHVuZGVybHlpbmcgZXhvIGNsYXNzXG4gKiBAcGFyYW0ge01OfSB1TWV0aG9kTmFtZXNcbiAqICAgVGhlIG1ldGhvZCBuYW1lcyBvZiB0aGUgdW5kZXJseWluZyBleG8gY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVwcmVzZW50ZWRcbiAqICAgYnkgdHJhbnNwYXJlbnRseS1mb3J3YXJkaW5nIG1ldGhvZHMgb2YgdGhlIHdyYXBwaW5nIG93bmFibGUgb2JqZWN0LlxuICogQHBhcmFtIHtPd25hYmxlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7PFU+KHVuZGVybHlpbmc6IFUpID0+IFBhcnRpYWw8VT4gJiB7bWFrZVRyYW5zZmVySW52aXRhdGlvbjogKCkgPT4gSW52aXRhdGlvbjxVPn19XG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlT3duYWJsZSA9IChcbiAgem9uZSxcbiAgbWFrZUludml0YXRpb24sXG4gIHVLaW5kTmFtZSxcbiAgdU1ldGhvZE5hbWVzLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgY29uc3QgeyB1SW50ZXJmYWNlTmFtZSA9IHVLaW5kTmFtZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgeyByZXZva2UsIG1ha2VSZXZvY2FibGUgfSA9IHByZXBhcmVSZXZvY2FibGVNYWtlcktpdChcbiAgICB6b25lLFxuICAgIHVLaW5kTmFtZSxcbiAgICB1TWV0aG9kTmFtZXMsXG4gICAge1xuICAgICAgdUludGVyZmFjZU5hbWUsXG4gICAgICBleHRyYU1ldGhvZEd1YXJkczoge1xuICAgICAgICBtYWtlVHJhbnNmZXJJbnZpdGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICAgIH0sXG4gICAgICBleHRyYU1ldGhvZHM6IHtcbiAgICAgICAgbWFrZVRyYW5zZmVySW52aXRhdGlvbigpIHtcbiAgICAgICAgICBjb25zdCB7IHVuZGVybHlpbmcgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyByZXZvY2FibGUgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IGN1c3RvbURldGFpbHMgPSB1bmRlcmx5aW5nLmdldEludml0YXRpb25DdXN0b21EZXRhaWxzKCk7XG4gICAgICAgICAgY29uc3QgdHJhbnNmZXJIYW5kbGVyID0gbWFrZVRyYW5zZmVySGFuZGxlcih1bmRlcmx5aW5nKTtcblxuICAgICAgICAgIGNvbnN0IGludml0YXRpb24gPSBtYWtlSW52aXRhdGlvbihcbiAgICAgICAgICAgIHRyYW5zZmVySGFuZGxlcixcbiAgICAgICAgICAgICd0cmFuc2ZlcicsXG4gICAgICAgICAgICBjdXN0b21EZXRhaWxzLFxuICAgICAgICAgICAgVHJhbnNmZXJQcm9wb3NhbFNoYXBlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV2b2tlKHJldm9jYWJsZSk7XG4gICAgICAgICAgcmV0dXJuIGludml0YXRpb247XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgY29uc3QgbWFrZVRyYW5zZmVySGFuZGxlciA9IHpvbmUuZXhvQ2xhc3MoXG4gICAgJ1RyYW5zZmVySGFuZGxlcicsXG4gICAgT2ZmZXJIYW5kbGVySSxcbiAgICB1bmRlcmx5aW5nID0+ICh7XG4gICAgICB1bmRlcmx5aW5nLFxuICAgIH0pLFxuICAgIHtcbiAgICAgIGhhbmRsZShzZWF0KSB7XG4gICAgICAgIGNvbnN0IHsgdW5kZXJseWluZyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgcmV2b2NhYmxlID0gbWFrZVJldm9jYWJsZSh1bmRlcmx5aW5nKTtcbiAgICAgICAgc2VhdC5leGl0KCk7XG4gICAgICAgIHJldHVybiByZXZvY2FibGU7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgY29uc3QgbWFrZU93bmFibGUgPSB1bmRlcmx5aW5nID0+IG1ha2VSZXZvY2FibGUodW5kZXJseWluZyk7XG4gIC8qIFVzaW5nIGF0LXRzLWlnbm9yZSByYXRoZXIgdGhhbiBhdC10cy1leHBlY3QtZXJyb3IgYmVjYXVzZSB0aGUgdnNjb2RlKi9cbiAgLyogdHMgc2VydmVyIHNheXMgaXQgaXMgYW4gZXJyb3IgYnV0IGB5YXJuIGxpbnRgIHNheXMgaXQgaXMgbm90LiovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQqL1xuICAvKiBAdHMtaWdub3JlIFJldHVybiB0eXBlIGlzIG1vcmUgcHJlY2lzZSB0aGFuIHJldm9jYWJsZSBzdXBwb3J0cyovXG4gIHJldHVybiBoYXJkZW4obWFrZU93bmFibGUpO1xufTskaM2PX29uY2UucHJlcGFyZU93bmFibGUocHJlcGFyZU93bmFibGUpO1xuaGFyZGVuKHByZXBhcmVPd25hYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVPd25hYmxlIjpbInByZXBhcmVPd25hYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANnKq1GJNQAAiTUAADkAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdGltZSJdLCJleHBvcnRzIjpbIlByaWNlQXV0aG9yaXR5SSIsIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxFLEZhcixtYWtlUHJvbWlzZUtpdCxBbW91bnRNYXRoLEFtb3VudFNoYXBlLEJyYW5kU2hhcGUsbWFrZVRyYWNlcixtYWtlTm90aWZpZXIsTSxUaW1lc3RhbXBTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXSxbXCJBbW91bnRTaGFwZVwiLFskaM2PX2EgPT4gKEFtb3VudFNoYXBlID0gJGjNj19hKV1dLFtcIkJyYW5kU2hhcGVcIixbJGjNj19hID0+IChCcmFuZFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlTm90aWZpZXJcIixbJGjNj19hID0+IChtYWtlTm90aWZpZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UHJpY2VBdXRob3JpdHksIFByaWNlRGVzY3JpcHRpb24sIFByaWNlUXVvdGUsIFByaWNlUXVvdGVWYWx1ZSwgUHJpY2VRdWVyeSwgUHJpY2VRdW90ZUNyZWF0ZSwgUHJpY2VBdXRob3JpdHlLaXQsIFByaWNlUXVvdGVUcmlnZ2VyLCBNdXRhYmxlUXVvdGUsfSBmcm9tICdAYWdvcmljL3pvZS90b29scy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtOb3RpZmllcn0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gJ0BhZ29yaWMvdGltZSc7XG4gKiBAaW1wb3J0IHtBbW91bnR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtJc3N1ZXJ9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtCcmFuZH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge1Byb21pc2VSZWNvcmR9IGZyb20gJ0BlbmRvL3Byb21pc2Uta2l0JztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG5jb25zdCB0cmFjZSA9IG1ha2VUcmFjZXIoJ1BBJywgZmFsc2UpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBDb21wYXJlQW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50TGltaXRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5cbi8qKiBAdHlwZSB7Q29tcGFyZUFtb3VudH0gKi9cbmNvbnN0IGlzTFQgPSAoYW1vdW50LCBhbW91bnRMaW1pdCkgPT4gIUFtb3VudE1hdGguaXNHVEUoYW1vdW50LCBhbW91bnRMaW1pdCk7XG5cbi8qKiBAdHlwZSB7Q29tcGFyZUFtb3VudH0gKi9cbmNvbnN0IGlzTFRFID0gKGFtb3VudCwgYW1vdW50TGltaXQpID0+IEFtb3VudE1hdGguaXNHVEUoYW1vdW50TGltaXQsIGFtb3VudCk7XG5cbi8qKiBAdHlwZSB7Q29tcGFyZUFtb3VudH0gKi9cbmNvbnN0IGlzR1RFID0gKGFtb3VudCwgYW1vdW50TGltaXQpID0+IEFtb3VudE1hdGguaXNHVEUoYW1vdW50LCBhbW91bnRMaW1pdCk7XG5cbi8qKiBAdHlwZSB7Q29tcGFyZUFtb3VudH0gKi9cbmNvbnN0IGlzR1QgPSAoYW1vdW50LCBhbW91bnRMaW1pdCkgPT4gIUFtb3VudE1hdGguaXNHVEUoYW1vdW50TGltaXQsIGFtb3VudCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIFRyaWdnZXJcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZUNyZWF0ZX0gY3JlYXRlSW5zdGFudFF1b3RlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuXG5jb25zdCBHdWFyZENhbGxBbW91bnRUdXBsZSA9IE0uY2FsbChBbW91bnRTaGFwZSwgQW1vdW50U2hhcGUpLnJldHVybnMoXG4gIE0ucHJvbWlzZSgpLFxuKTtcbiAgICAgICBjb25zdCBQcmljZUF1dGhvcml0eUkgPSBNLmludGVyZmFjZSgnUHJpY2VBdXRob3JpdHknLCB7XG4gIGdldFF1b3RlSXNzdWVyOiBNLmNhbGwoQnJhbmRTaGFwZSwgQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldFRpbWVyU2VydmljZTogTS5jYWxsKEJyYW5kU2hhcGUsIEJyYW5kU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBxdW90ZUdpdmVuOiBNLmNhbGwoQW1vdW50U2hhcGUsIEJyYW5kU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBxdW90ZVdhbnRlZDogTS5jYWxsKEJyYW5kU2hhcGUsIEFtb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgbWFrZVF1b3RlTm90aWZpZXI6IE0uY2FsbChBbW91bnRTaGFwZSwgQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHF1b3RlQXRUaW1lOiBNLmNhbGwoVGltZXN0YW1wU2hhcGUsIEFtb3VudFNoYXBlLCBCcmFuZFNoYXBlKS5yZXR1cm5zKFxuICAgIE0ucHJvbWlzZSgpLFxuICApLFxuICBxdW90ZVdoZW5MVDogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIHF1b3RlV2hlbkxURTogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIHF1b3RlV2hlbkdURTogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIHF1b3RlV2hlbkdUOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgbXV0YWJsZVF1b3RlV2hlbkxUOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgbXV0YWJsZVF1b3RlV2hlbkxURTogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIG11dGFibGVRdW90ZVdoZW5HVEU6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBtdXRhYmxlUXVvdGVXaGVuR1Q6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxufSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7SXNzdWVyPCdzZXQnLCBQcmljZURlc2NyaXB0aW9uPn0gb3B0cy5xdW90ZUlzc3VlclxuICogQHBhcmFtIHtFUmVmPE5vdGlmaWVyPHVua25vd24+Pn0gb3B0cy5ub3RpZmllclxuICogQHBhcmFtIHtFUmVmPFRpbWVyU2VydmljZT59IG9wdHMudGltZXJcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZUNyZWF0ZX0gb3B0cy5jcmVhdGVRdW90ZVxuICogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IG9wdHMuYWN0dWFsQnJhbmRJblxuICogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IG9wdHMuYWN0dWFsQnJhbmRPdXRcbiAqIEByZXR1cm5zIHtQcmljZUF1dGhvcml0eUtpdH1cbiAqLyRozY9fb25jZS5QcmljZUF1dGhvcml0eUkoUHJpY2VBdXRob3JpdHlJKTtcbiAgICAgICBjb25zdCBtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQgPSBvcHRzID0+IHtcbiAgY29uc3Qge1xuICAgIHRpbWVyLFxuICAgIGNyZWF0ZVF1b3RlLFxuICAgIGFjdHVhbEJyYW5kSW4sXG4gICAgYWN0dWFsQnJhbmRPdXQsXG4gICAgcXVvdGVJc3N1ZXIsXG4gICAgbm90aWZpZXIsXG4gIH0gPSBvcHRzO1xuXG4gIGxldCBoYXZlRmlyc3RRdW90ZSA9IGZhbHNlO1xuXG4gIHZvaWQgRShub3RpZmllcilcbiAgICAuZ2V0VXBkYXRlU2luY2UoKVxuICAgIC50aGVuKF8gPT4gKGhhdmVGaXJzdFF1b3RlID0gdHJ1ZSkpO1xuXG4gIC8qKiBAdHlwZSB7U2V0PFRyaWdnZXI+fSAqL1xuICBjb25zdCB0cmlnZ2VycyA9IG5ldyBTZXQoKTtcbiAgY29uc3QgbXV0YWJsZVRyaWdnZXJzID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSB0cmlnZ2VyQ3JlYXRlUXVvdGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG4gIGNvbnN0IGZpcmVUcmlnZ2VycyA9IGFzeW5jIHRyaWdnZXJDcmVhdGVRdW90ZSA9PiB7XG4gICAgaWYgKCFoYXZlRmlyc3RRdW90ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFsuLi50cmlnZ2VycywgLi4uQXJyYXkuZnJvbShtdXRhYmxlVHJpZ2dlcnMudmFsdWVzKCkpXS5tYXAodHJpZ2dlciA9PlxuICAgICAgICB0cmlnZ2VyKHRyaWdnZXJDcmVhdGVRdW90ZSksXG4gICAgICApLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gKiBDcmVhdGUgYSBxdW90ZVdoZW4qIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29tcGFyZUFtb3VudH0gY29tcGFyZUFtb3VudHNGblxuICovXG4gIGNvbnN0IG1ha2VRdW90ZVdoZW5PdXQgPVxuICAgIGNvbXBhcmVBbW91bnRzRm4gPT5cbiAgICAvKipcbiAqIFJldHVybiBhIHF1b3RlIHdoZW4gdHJpZ2dlcldoZW4gaXMgdHJ1ZSBvZiB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50SW4gdGhlIGlucHV0IHZhbHVlIHRvIHRoZSBjYWxjQW1vdW50VHJpZ2dlclxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudE91dExpbWl0IHRoZSB2YWx1ZSB0byBjb21wYXJlIHdpdGggdGhlIG91dHB1dFxuICogb2YgY2FsY0Ftb3VudFRyaWdnZXJcbiAqL1xuICAgIGFzeW5jIChhbW91bnRJbiwgYW1vdW50T3V0TGltaXQpID0+IHtcbiAgICAgIGFtb3VudEluID0gQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgYW1vdW50SW4pO1xuICAgICAgYW1vdW50T3V0TGltaXQgPSBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCwgYW1vdW50T3V0TGltaXQpO1xuXG4gICAgICAvKiogQHR5cGUge1Byb21pc2VSZWNvcmQ8UHJpY2VRdW90ZT59ICovXG4gICAgICBjb25zdCB0cmlnZ2VyUEsgPSBtYWtlUHJvbWlzZUtpdCgpO1xuXG4gICAgICAvKiogQHR5cGUge1ByaWNlUXVvdGVUcmlnZ2VyfSAqL1xuICAgICAgY29uc3QgdHJpZ2dlciA9IGFzeW5jIGNyZWF0ZUluc3RhbnRRdW90ZSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcXVvdGVQID0gY3JlYXRlSW5zdGFudFF1b3RlKGNhbGNBbW91bnRPdXQgPT4ge1xuICAgICAgICAgICAgaWYgKCF0cmlnZ2Vycy5oYXModHJpZ2dlcikpIHtcbiAgICAgICAgICAgICAgLyogQWxyZWFkeSBmaXJlZC4qL1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYW1vdW50T3V0ID0gY2FsY0Ftb3VudE91dChhbW91bnRJbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcGFyZUFtb3VudHNGbihhbW91bnRPdXQsIGFtb3VudE91dExpbWl0KSkge1xuICAgICAgICAgICAgICAvKiBEb24ndCBmaXJlIHRoZSB0cmlnZ2VyIHlldC4qL1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBHZW5lcmF0ZSB0aGUgcXVvdGUuKi9cbiAgICAgICAgICAgIHJldHVybiB7IGFtb3VudEluLCBhbW91bnRPdXQgfTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghcXVvdGVQKSB7XG4gICAgICAgICAgICAvKiBXZSBzaG91bGRuJ3QgcmVzb2x2ZSB5ZXQuKi9cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cmlnZ2Vycy5kZWxldGUodHJpZ2dlcik7XG4gICAgICAgICAgdHJpZ2dlclBLLnJlc29sdmUocXVvdGVQKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8qIFRyaWdnZXIgZmFpbGVkLCBzbyByZWplY3QgYW5kIGRyb3AuKi9cbiAgICAgICAgICB0cmlnZ2VyUEsucmVqZWN0KGUpO1xuICAgICAgICAgIHRyaWdnZXJzLmRlbGV0ZSh0cmlnZ2VyKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJpZ2dlcnMuYWRkKHRyaWdnZXIpO1xuXG4gICAgICAvKiBGaXJlIG5vdywganVzdCBpbiBjYXNlLiovXG4gICAgICBhd2FpdCB0cmlnZ2VyKGNyZWF0ZVF1b3RlKTtcblxuICAgICAgcmV0dXJuIHRyaWdnZXJQSy5wcm9taXNlO1xuICAgIH07XG5cbiAgLyoqXG4gKiBDcmVhdGUgYSBtdXRhYmxlUXVvdGVXaGVuKiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbXBhcmVBbW91bnR9IGNvbXBhcmVBbW91bnRzRm5cbiAqL1xuICBjb25zdCBtYWtlTXV0YWJsZVF1b3RlID1cbiAgICBjb21wYXJlQW1vdW50c0ZuID0+XG4gICAgLyoqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudEluXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudE91dExpbWl0XG4gKi9cbiAgICBhc3luYyAoYW1vdW50SW4sIGFtb3VudE91dExpbWl0KSA9PiB7XG4gICAgICBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLCBhbW91bnRJbik7XG4gICAgICBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCwgYW1vdW50T3V0TGltaXQpO1xuXG4gICAgICAvKiogQHR5cGUge1Byb21pc2VSZWNvcmQ8UHJpY2VRdW90ZT59ICovXG4gICAgICBjb25zdCB0cmlnZ2VyUEsgPSBtYWtlUHJvbWlzZUtpdCgpO1xuXG4gICAgICAvKiogQHR5cGUge011dGFibGVRdW90ZX0gKi9cbiAgICAgIGNvbnN0IG11dGFibGVRdW90ZSA9IEZhcignTXV0YWJsZVF1b3RlJywge1xuICAgICAgICBjYW5jZWw6IGUgPT4gdHJpZ2dlclBLLnJlamVjdChlKSxcbiAgICAgICAgdXBkYXRlTGV2ZWw6IChuZXdBbW91bnRJbiwgbmV3QW1vdW50T3V0TGltaXQpID0+IHtcbiAgICAgICAgICBjb25zdCBjb2VyY2VkQW1vdW50SW4gPSBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLCBuZXdBbW91bnRJbik7XG4gICAgICAgICAgY29uc3QgY29lcmNlZEFtb3VudE91dExpbWl0ID0gQW1vdW50TWF0aC5jb2VyY2UoXG4gICAgICAgICAgICBhY3R1YWxCcmFuZE91dCxcbiAgICAgICAgICAgIG5ld0Ftb3VudE91dExpbWl0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgYW1vdW50SW4gPSBjb2VyY2VkQW1vdW50SW47XG4gICAgICAgICAgYW1vdW50T3V0TGltaXQgPSBjb2VyY2VkQW1vdW50T3V0TGltaXQ7XG4gICAgICAgICAgdm9pZCBmaXJlVHJpZ2dlcnMoY3JlYXRlUXVvdGUpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRQcm9taXNlOiAoKSA9PiB0cmlnZ2VyUEsucHJvbWlzZSxcbiAgICAgIH0pO1xuXG4gICAgICAvKiogQHR5cGUge1ByaWNlUXVvdGVUcmlnZ2VyfSAqL1xuICAgICAgY29uc3QgbXV0YWJsZVRyaWdnZXIgPSBhc3luYyBjcmVhdGVJbnN0YW50UXVvdGUgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHF1b3RlUCA9IGNyZWF0ZUluc3RhbnRRdW90ZShjYWxjQW1vdW50T3V0ID0+IHtcbiAgICAgICAgICAgIGlmICghbXV0YWJsZVRyaWdnZXJzLmhhcyhtdXRhYmxlUXVvdGUpKSB7XG4gICAgICAgICAgICAgIC8qIEFscmVhZHkgZmlyZWQuKi9cbiAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFtb3VudE91dCA9IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pO1xuXG4gICAgICAgICAgICBpZiAoIWNvbXBhcmVBbW91bnRzRm4oYW1vdW50T3V0LCBhbW91bnRPdXRMaW1pdCkpIHtcbiAgICAgICAgICAgICAgLyogRG9uJ3QgZmlyZSB0aGUgbXV0YWJsZVRyaWdnZXIgeWV0LiovXG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIEdlbmVyYXRlIHRoZSBxdW90ZS4qL1xuICAgICAgICAgICAgcmV0dXJuIHsgYW1vdW50SW4sIGFtb3VudE91dCB9O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFxdW90ZVApIHtcbiAgICAgICAgICAgIC8qIFdlIHNob3VsZG4ndCByZXNvbHZlIHlldC4qL1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG11dGFibGVUcmlnZ2Vycy5kZWxldGUobXV0YWJsZVF1b3RlKTtcbiAgICAgICAgICB0cmlnZ2VyUEsucmVzb2x2ZShxdW90ZVApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLyogVHJpZ2dlciBmYWlsZWQsIHNvIHJlamVjdCBhbmQgZHJvcC4qL1xuICAgICAgICAgIHRyaWdnZXJQSy5yZWplY3QoZSk7XG4gICAgICAgICAgbXV0YWJsZVRyaWdnZXJzLmRlbGV0ZShtdXRhYmxlUXVvdGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBtdXRhYmxlVHJpZ2dlcnMuc2V0KG11dGFibGVRdW90ZSwgbXV0YWJsZVRyaWdnZXIpO1xuXG4gICAgICAvKiBGaXJlIG5vdywganVzdCBpbiBjYXNlLiovXG4gICAgICBhd2FpdCBtdXRhYmxlVHJpZ2dlcihjcmVhdGVRdW90ZSk7XG5cbiAgICAgIHJldHVybiBtdXRhYmxlUXVvdGU7XG4gICAgfTtcblxuICAvKipcbiAqIEVuc3VyZSB0aGF0IHRoZSBicmFuZEluL2JyYW5kT3V0IHBhaXIgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kSW5cbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kT3V0XG4gKi9cbiAgY29uc3QgYXNzZXJ0QnJhbmRzID0gKGJyYW5kSW4sIGJyYW5kT3V0KSA9PiB7XG4gICAgYnJhbmRJbiA9PT0gYWN0dWFsQnJhbmRJbiB8fFxuICAgICAgRmFpbGBEZXNpcmVkIGJyYW5kSW4gJHtxKGJyYW5kSW4pfSBtdXN0IG1hdGNoICR7cShhY3R1YWxCcmFuZEluKX1gO1xuICAgIGJyYW5kT3V0ID09PSBhY3R1YWxCcmFuZE91dCB8fFxuICAgICAgRmFpbGBEZXNpcmVkIGJyYW5kT3V0ICR7cShicmFuZE91dCl9IG11c3QgbWF0Y2ggJHtxKGFjdHVhbEJyYW5kT3V0KX1gO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7UHJpY2VBdXRob3JpdHl9ICovXG4gIGNvbnN0IHByaWNlQXV0aG9yaXR5ID0gRmFyKCdQcmljZUF1dGhvcml0eScsIHtcbiAgICBnZXRRdW90ZUlzc3VlcihicmFuZEluLCBicmFuZE91dCkge1xuICAgICAgYXNzZXJ0QnJhbmRzKGJyYW5kSW4sIGJyYW5kT3V0KTtcbiAgICAgIHJldHVybiBxdW90ZUlzc3VlcjtcbiAgICB9LFxuICAgIGdldFRpbWVyU2VydmljZShicmFuZEluLCBicmFuZE91dCkge1xuICAgICAgYXNzZXJ0QnJhbmRzKGJyYW5kSW4sIGJyYW5kT3V0KTtcbiAgICAgIHJldHVybiB0aW1lcjtcbiAgICB9LFxuICAgIG1ha2VRdW90ZU5vdGlmaWVyKGFtb3VudEluLCBicmFuZE91dCkge1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgYW1vdW50SW4pO1xuICAgICAgYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLCBicmFuZE91dCk7XG5cbiAgICAgIC8qIFdyYXAgb3VyIHVuZGVybHlpbmcgbm90aWZpZXIgd2l0aCBzcGVjaWZpYyBxdW90ZXMuKi9cbiAgICAgIGNvbnN0IHNwZWNpZmljQmFzZU5vdGlmaWVyID0gaGFyZGVuKHtcbiAgICAgICAgYXN5bmMgZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvKiBXZSB1c2UgdGhlIHNhbWUgdXBkYXRlQ291bnQgYXMgb3VyIHVuZGVybHlpbmcgbm90aWZpZXIuKi9cbiAgICAgICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG5cbiAgICAgICAgICAvKiBXZSBjcmVhdGUgYSBxdW90ZSBpbmxpbmUuKi9cbiAgICAgICAgICBsZXQgcXVvdGU7XG4gICAgICAgICAgLyogY3JlYXRlUXVvdGUgY2FuIHRocm93IGlmIHByaWNlQXV0aG9yaXR5IGlzIHJlcGxhY2VkLiovXG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcXVvdGUgPSBjcmVhdGVRdW90ZShjYWxjQW1vdW50T3V0ID0+ICh7XG4gICAgICAgICAgICAgIGFtb3VudEluLFxuICAgICAgICAgICAgICBhbW91bnRPdXQ6IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCovXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFxdW90ZSkge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBjcmVhdGVRdW90ZSByZXR1cm5lZCBub3RoaW5nYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHF1b3RlO1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB1cGRhdGVDb3VudDogcmVjb3JkLnVwZGF0ZUNvdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8qKiBAdHlwZSB7Tm90aWZpZXI8UHJpY2VRdW90ZT59ICovXG4gICAgICBjb25zdCBzcGVjaWZpY05vdGlmaWVyID0gRmFyKCdRdW90ZU5vdGlmaWVyJywge1xuICAgICAgICAuLi5tYWtlTm90aWZpZXIoc3BlY2lmaWNCYXNlTm90aWZpZXIpLFxuICAgICAgICAvKiBUT0RPIHN0b3AgZXhwb3NpbmcgYmFzZU5vdGlmaWVyIG1ldGhvZHMgZGlyZWN0bHkuKi9cbiAgICAgICAgLi4uc3BlY2lmaWNCYXNlTm90aWZpZXIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzcGVjaWZpY05vdGlmaWVyO1xuICAgIH0sXG4gICAgYXN5bmMgcXVvdGVHaXZlbihhbW91bnRJbiwgYnJhbmRPdXQpIHtcbiAgICAgIHRyYWNlKCdxdW90ZUdpdmVuJywgYW1vdW50SW4sIGJyYW5kT3V0KTtcbiAgICAgIEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sIGFtb3VudEluKTtcbiAgICAgIGFzc2VydEJyYW5kcyhhbW91bnRJbi5icmFuZCwgYnJhbmRPdXQpO1xuXG4gICAgICBhd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSgpO1xuICAgICAgY29uc3QgcXVvdGUgPSBjcmVhdGVRdW90ZShjYWxjQW1vdW50T3V0ID0+ICh7XG4gICAgICAgIGFtb3VudEluLFxuICAgICAgICBhbW91bnRPdXQ6IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pLFxuICAgICAgfSkpO1xuICAgICAgYXNzZXJ0KHF1b3RlKTtcbiAgICAgIHJldHVybiBxdW90ZTtcbiAgICB9LFxuICAgIGFzeW5jIHF1b3RlV2FudGVkKGJyYW5kSW4sIGFtb3VudE91dCkge1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRPdXQsIGFtb3VudE91dCk7XG4gICAgICBhc3NlcnRCcmFuZHMoYnJhbmRJbiwgYW1vdW50T3V0LmJyYW5kKTtcblxuICAgICAgYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbiAgICAgIGNvbnN0IHF1b3RlID0gY3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQsIGNhbGNBbW91bnRJbikgPT4ge1xuICAgICAgICAvKiBXZSBuZWVkIHRvIGRldGVybWluZSBhbiBhbW91bnRJbiB0aGF0IGd1YXJhbnRlZXMgYXQgbGVhc3QgdGhlIGFtb3VudE91dC4qL1xuICAgICAgICBjb25zdCBhbW91bnRJbiA9IGNhbGNBbW91bnRJbihhbW91bnRPdXQpO1xuICAgICAgICBjb25zdCBhY3R1YWxBbW91bnRPdXQgPSBjYWxjQW1vdW50T3V0KGFtb3VudEluKTtcbiAgICAgICAgQW1vdW50TWF0aC5pc0dURShhY3R1YWxBbW91bnRPdXQsIGFtb3VudE91dCkgfHxcbiAgICAgICAgICBGYWlsYENhbGN1bGF0aW9uIG9mICR7YWN0dWFsQW1vdW50T3V0fSBkaWRuJ3QgY292ZXIgZXhwZWN0ZWQgJHthbW91bnRPdXR9YDtcbiAgICAgICAgcmV0dXJuIHsgYW1vdW50SW4sIGFtb3VudE91dCB9O1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQocXVvdGUpO1xuICAgICAgcmV0dXJuIHF1b3RlO1xuICAgIH0sXG4gICAgYXN5bmMgcXVvdGVBdFRpbWUoZGVhZGxpbmUsIGFtb3VudEluLCBicmFuZE91dCkge1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgYW1vdW50SW4pO1xuICAgICAgYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLCBicmFuZE91dCk7XG5cbiAgICAgIGF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKCk7XG4gICAgICBjb25zdCBxdW90ZVBLID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgIGF3YWl0IEUodGltZXIpLnNldFdha2V1cChcbiAgICAgICAgZGVhZGxpbmUsXG4gICAgICAgIEZhcignd2FrZU9iaicsIHtcbiAgICAgICAgICBhc3luYyB3YWtlKHRpbWVzdGFtcCkge1xuICAgICAgICAgICAgYXdhaXQgbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHF1b3RlUCA9IGNyZWF0ZVF1b3RlKGNhbGNBbW91bnRPdXQgPT4gKHtcbiAgICAgICAgICAgICAgICBhbW91bnRJbixcbiAgICAgICAgICAgICAgICBhbW91bnRPdXQ6IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIC8qIFdlIGRvbid0IHdhaXQgZm9yIHRoZSBxdW90ZSB0byBiZSBhdXRoZW50aWNhdGVkOyByZXNvbHZlKi9cbiAgICAgICAgICAgICAgLyogaW1tZWRpYXRlbHkuKi9cbiAgICAgICAgICAgICAgcXVvdGVQSy5yZXNvbHZlKHF1b3RlUCk7XG4gICAgICAgICAgICAgIGF3YWl0IHF1b3RlUEsucHJvbWlzZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgcXVvdGVQSy5yZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvKiBXYWl0IHVudGlsIHRoZSB3YWtldXAgcGFzc2VzLiovXG4gICAgICByZXR1cm4gcXVvdGVQSy5wcm9taXNlO1xuICAgIH0sXG4gICAgcXVvdGVXaGVuTFQ6IG1ha2VRdW90ZVdoZW5PdXQoaXNMVCksXG4gICAgcXVvdGVXaGVuTFRFOiBtYWtlUXVvdGVXaGVuT3V0KGlzTFRFKSxcbiAgICBxdW90ZVdoZW5HVEU6IG1ha2VRdW90ZVdoZW5PdXQoaXNHVEUpLFxuICAgIHF1b3RlV2hlbkdUOiBtYWtlUXVvdGVXaGVuT3V0KGlzR1QpLFxuICAgIG11dGFibGVRdW90ZVdoZW5MVDogbWFrZU11dGFibGVRdW90ZShpc0xUKSxcbiAgICBtdXRhYmxlUXVvdGVXaGVuTFRFOiBtYWtlTXV0YWJsZVF1b3RlKGlzTFRFKSxcbiAgICBtdXRhYmxlUXVvdGVXaGVuR1Q6IG1ha2VNdXRhYmxlUXVvdGUoaXNHVCksXG4gICAgbXV0YWJsZVF1b3RlV2hlbkdURTogbWFrZU11dGFibGVRdW90ZShpc0dURSksXG4gIH0pO1xuXG4gIHJldHVybiB7IHByaWNlQXV0aG9yaXR5LCBhZG1pbkZhY2V0OiB7IGZpcmVUcmlnZ2VycyB9IH07XG59OyRozY9fb25jZS5tYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQobWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlByaWNlQXV0aG9yaXR5SSI6WyJQcmljZUF1dGhvcml0eUkiXSwibWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0IjpbIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABoH8qu5gsAAOYLAAA1AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbImdldEFtb3VudEluIiwiZ2V0QW1vdW50T3V0IiwiZ2V0UHJpY2VEZXNjcmlwdGlvbiIsImdldFRpbWVzdGFtcCIsIm1ha2VQcmljZVF1b3RlSXNzdWVyIiwidW5pdEFtb3VudCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEFtb3VudE1hdGgsQXNzZXRLaW5kLG1ha2VJc3N1ZXJLaXQsRmFpbCxFLE5hdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV0sW1wiQXNzZXRLaW5kXCIsWyRozY9fYSA9PiAoQXNzZXRLaW5kID0gJGjNj19hKV1dLFtcIm1ha2VJc3N1ZXJLaXRcIixbJGjNj19hID0+IChtYWtlSXNzdWVyS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQcmljZUF1dGhvcml0eSwgUHJpY2VEZXNjcmlwdGlvbiwgUHJpY2VRdW90ZSwgUHJpY2VRdW90ZVZhbHVlLCBQcmljZVF1ZXJ5LH0gZnJvbSAnQGFnb3JpYy96b2UvdG9vbHMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7VGltZXN0YW1wfSBmcm9tICdAYWdvcmljL3RpbWUnO1xuICogQGltcG9ydCB7QnJhbmR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtJc3N1ZXJLaXR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKi9cblxuLyogUHJpY2VBdXRob3JpdGllcyByZXR1cm4gcXVvdGVzIGFzIGEgcGFpciBvZiBhbiBhbW91bnQgYW5kIGEgcGF5bWVudCwgYm90aCovXG4vKiB3aXRoIHRoZSBzYW1lIHZhbHVlLiBUaGUgdW5kZXJseWluZyBhbW91bnQgd3JhcHMgYW1vdW50SW4sIGFtb3VudE91dCwgdGltZXIqL1xuLyogYW5kIHRpbWVzdGFtcC4gVGhlIHBheW1lbnQgaXMgaXNzdWVkIGJ5IHRoZSBxdW90ZUlzc3VlciB0byBzdXBwb3J0IHZlcmFjaXR5Ki9cbi8qIGNoZWNraW5nLiBUaGVzZSBoZWxwZXJzIG1ha2UgaXQgZWFzaWVyIHRvIGV4dHJhY3QgdGhlIGNvbXBvbmVudHMgb2YgdGhlIFF1b3RlKi9cblxuLyoqXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGV9IHF1b3RlXG4gKiBAcmV0dXJucyB7UHJpY2VEZXNjcmlwdGlvbn1cbiAqL1xuICAgICAgIGNvbnN0IGdldFByaWNlRGVzY3JpcHRpb24gPSBxdW90ZSA9PiB7XG4gIHF1b3RlLnF1b3RlQW1vdW50LnZhbHVlLmxlbmd0aCA9PT0gMSB8fFxuICAgIEZhaWxgcXVvdGVBbW91bnQgc2V0IG11c3QgaGF2ZSBvbmUgbWVtYmVyYDtcbiAgcmV0dXJuIHF1b3RlLnF1b3RlQW1vdW50LnZhbHVlWzBdO1xufTtcblxuLyoqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGUgKi8kaM2PX29uY2UuZ2V0UHJpY2VEZXNjcmlwdGlvbihnZXRQcmljZURlc2NyaXB0aW9uKTtcbiAgICAgICBjb25zdCBnZXRBbW91bnRJbiA9IHF1b3RlID0+IGdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLmFtb3VudEluO1xuLyoqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGUgKi8kaM2PX29uY2UuZ2V0QW1vdW50SW4oZ2V0QW1vdW50SW4pO1xuICAgICAgIGNvbnN0IGdldEFtb3VudE91dCA9IHF1b3RlID0+IGdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLmFtb3VudE91dDtcbi8qKiBAdHlwZSB7KHF1b3RlOiBQcmljZVF1b3RlKSA9PiBUaW1lc3RhbXB9ICovJGjNj19vbmNlLmdldEFtb3VudE91dChnZXRBbW91bnRPdXQpO1xuICAgICAgIGNvbnN0IGdldFRpbWVzdGFtcCA9IHF1b3RlID0+IGdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLnRpbWVzdGFtcDtcblxuLyoqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBicmFuZCAqLyRozY9fb25jZS5nZXRUaW1lc3RhbXAoZ2V0VGltZXN0YW1wKTtcbiAgICAgICBjb25zdCB1bml0QW1vdW50ID0gYXN5bmMgYnJhbmQgPT4ge1xuICAvKiBCcmFuZCBtZXRob2RzIGFyZSByZW1vdGUqL1xuICBjb25zdCBkaXNwbGF5SW5mbyA9IGF3YWl0IEUoYnJhbmQpLmdldERpc3BsYXlJbmZvKCk7XG4gIGNvbnN0IGRlY2ltYWxQbGFjZXMgPSBkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzID8/IDA7XG4gIHJldHVybiBBbW91bnRNYXRoLm1ha2UoYnJhbmQsIDEwbiAqKiBOYXQoZGVjaW1hbFBsYWNlcykpO1xufTskaM2PX29uY2UudW5pdEFtb3VudCh1bml0QW1vdW50KTtcbmhhcmRlbih1bml0QW1vdW50KTtcblxuICAgICAgIGNvbnN0IG1ha2VQcmljZVF1b3RlSXNzdWVyID0gKCkgPT5cbiAgLyoqIEB0eXBlIHtJc3N1ZXJLaXQ8J3NldCcsIFByaWNlRGVzY3JpcHRpb24+fSAqLyAoXG4gICAgbWFrZUlzc3VlcktpdCgncXVvdGUnLCBBc3NldEtpbmQuU0VUKVxuICApOyRozY9fb25jZS5tYWtlUHJpY2VRdW90ZUlzc3VlcihtYWtlUHJpY2VRdW90ZUlzc3Vlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRQcmljZURlc2NyaXB0aW9uIjpbImdldFByaWNlRGVzY3JpcHRpb24iXSwiZ2V0QW1vdW50SW4iOlsiZ2V0QW1vdW50SW4iXSwiZ2V0QW1vdW50T3V0IjpbImdldEFtb3VudE91dCJdLCJnZXRUaW1lc3RhbXAiOlsiZ2V0VGltZXN0YW1wIl0sInVuaXRBbW91bnQiOlsidW5pdEFtb3VudCJdLCJtYWtlUHJpY2VRdW90ZUlzc3VlciI6WyJtYWtlUHJpY2VRdW90ZUlzc3VlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABb0apFYykAAGMpAAAzAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJSZWNvcmRlcktpdFNoYXBlIiwiZGVmaW5lRVJlY29yZGVyS2l0IiwiZGVmaW5lUmVjb3JkZXJLaXQiLCJwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzIiwicHJlcGFyZVJlY29yZGVyIiwicHJlcGFyZVJlY29yZGVyS2l0IiwicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgU3RvcmFnZU5vZGVTaGFwZSxwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQsbWFrZUZha2VNYXJzaGFsbGVyLG1ha2VGYWtlU3RvcmFnZSxtdXN0TWF0Y2gsTSxtYWtlU2NhbGFyQmlnTWFwU3RvcmUscHJlcGFyZUV4b0NsYXNzLEZhaWwsRTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIlN0b3JhZ2VOb2RlU2hhcGVcIixbJGjNj19hID0+IChTdG9yYWdlTm9kZVNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanNcIiwgW1tcIm1ha2VGYWtlTWFyc2hhbGxlclwiLFskaM2PX2EgPT4gKG1ha2VGYWtlTWFyc2hhbGxlciA9ICRozY9fYSldXSxbXCJtYWtlRmFrZVN0b3JhZ2VcIixbJGjNj19hID0+IChtYWtlRmFrZVN0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm4sIEVSZW1vdGUsIFJlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtFTWFyc2hhbGxlcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMnO1xuICogQGltcG9ydCB7UHVibGlzaEtpdH0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJztcbiAqIEBpbXBvcnQge1N0b3JhZ2VOb2RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4vKipcbiAqIFJlY29yZGVycyBzdXBwb3J0IHB1Ymxpc2hpbmcgZGF0YSB0byB2c3RvcmFnZS5cbiAqXG4gKiBgUmVjb3JkZXJgIGlzIHNpbWlsYXIgdG8gYFB1Ymxpc2hlcmAgKGluIHRoYXQgdGhleSBzZW5kIG91dCBkYXRhKSBidXQgaGFzIGRpZmZlcmVudCBzaWduYXR1cmVzOlxuICogLSBtZXRob2RzIGFyZSBhc3luYyBiZWNhdXNlIHRoZXkgYXdhaXQgcmVtb3RlIGNhbGxzIHRvIE1hcnNoYWxsZXIgYW5kIFN0b3JhZ2VOb2RlXG4gKiAtIG1ldGhvZCBuYW1lcyBjb252ZXkgdGhlIGR1cmFiaWxpdHlcbiAqIC0gb21pdHMgZmFpbCgpXG4gKiAtIGFkZHMgZ2V0U3RvcmFnZU5vZGUoKSBmcm9tIGl0cyBkdXJhYmxlIHN0YXRlXG4gKlxuICogT3RoZXIgbmFtZXMgc3VjaCBhcyBTdG9yZWRQdWJsaXNoZXIgb3IgQ2hhaW5TdG9yYWdlUHVibGlzaGVyIHdlcmUgY29uc2lkZXJlZCwgYnV0IGZvdW5kIHRvIGJlIHNvbWV0aW1lcyBjb25mdXNlZCB3aXRoICpkdXJhYmlsaXR5KiwgYW5vdGhlciB0cmFpdCBvZiB0aGlzIGNsYXNzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7IGdldFN0b3JhZ2VOb2RlKCk6IFJlbW90ZTxTdG9yYWdlTm9kZT4sIGdldFN0b3JhZ2VQYXRoKCk6IFByb21pc2U8c3RyaW5nPiwgd3JpdGUodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+LCB3cml0ZUZpbmFsKHZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPiB9fSBSZWNvcmRlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQaWNrPFB1Ymxpc2hLaXQ8VD4sICdzdWJzY3JpYmVyJz4gJiB7IHJlY29yZGVyOiBSZWNvcmRlcjxUPiB9fSBSZWNvcmRlcktpdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQaWNrPFB1Ymxpc2hLaXQ8VD4sICdzdWJzY3JpYmVyJz4gJiB7IHJlY29yZGVyUDogRVJlZjxSZWNvcmRlcjxUPj4gfX0gRXZlbnR1YWxSZWNvcmRlcktpdFxuICovXG5cbi8qKlxuICogV3JhcCBhIFB1Ymxpc2hlciB0byByZWNvcmQgYWxsIHRoZSB2YWx1ZXMgdG8gY2hhaW4gc3RvcmFnZS5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVSZWNvcmRlciA9IChiYWdnYWdlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGNvbnN0IG1ha2VSZWNvcmRlciA9IHByZXBhcmVFeG9DbGFzcyhcbiAgICBiYWdnYWdlLFxuICAgICdSZWNvcmRlcicsXG4gICAgTS5pbnRlcmZhY2UoJ1JlY29yZGVyJywge1xuICAgICAgZ2V0U3RvcmFnZU5vZGU6IE0uY2FsbCgpLnJldHVybnMoU3RvcmFnZU5vZGVTaGFwZSksXG4gICAgICBnZXRTdG9yYWdlUGF0aDogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoLyogc3RyaW5nICovKSksXG4gICAgICB3cml0ZTogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgICAgd3JpdGVGaW5hbDogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIH0pLFxuICAgIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDxUPlsncHVibGlzaGVyJ119IHB1Ymxpc2hlclxuICogQHBhcmFtIHtSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtUeXBlZFBhdHRlcm48YW55Pn0gW3ZhbHVlU2hhcGVdXG4gKi9cbiAgICAoXG4gICAgICBwdWJsaXNoZXIsXG4gICAgICBzdG9yYWdlTm9kZSxcbiAgICAgIHZhbHVlU2hhcGUgPSAvKiogQHR5cGUge1R5cGVkUGF0dGVybjxhbnk+fSAqLyAoTS5hbnkoKSksXG4gICAgKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbG9zZWQ6IGZhbHNlLFxuICAgICAgICBwdWJsaXNoZXIsXG4gICAgICAgIHN0b3JhZ2VOb2RlLFxuICAgICAgICBzdG9yYWdlUGF0aDogLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovICh1bmRlZmluZWQpLFxuICAgICAgICB2YWx1ZVNoYXBlLFxuICAgICAgfTtcbiAgICB9LFxuICAgIHtcbiAgICAgIGdldFN0b3JhZ2VOb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdG9yYWdlTm9kZTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAqIE1lbW9pemVzIHRoZSByZW1vdGUgY2FsbCB0byB0aGUgc3RvcmFnZSBub2RlXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAqL1xuICAgICAgYXN5bmMgZ2V0U3RvcmFnZVBhdGgoKSB7XG4gICAgICAgIGNvbnN0IHsgc3RvcmFnZVBhdGg6IGhlbGRQYXRoIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAvKiBlbmQgc3luY2hyb25vdXMgcHJlbHVkZSovXG4gICAgICAgIGF3YWl0IG51bGw7XG4gICAgICAgIGlmIChoZWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGhlbGRQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCBFKHRoaXMuc3RhdGUuc3RvcmFnZU5vZGUpLmdldFBhdGgoKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5zdG9yYWdlUGF0aCA9IHBhdGg7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICogTWFyc2hhbGxzIGJlZm9yZSB3cml0aW5nIHRvIHN0b3JhZ2Ugb3IgcHVibGlzaGVyIHRvIGhlbHAgZW5zdXJlIHRoZSB0d28gc3RyZWFtcyBtYXRjaC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICBhc3luYyB3cml0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCB7IGNsb3NlZCwgcHVibGlzaGVyLCBzdG9yYWdlTm9kZSwgdmFsdWVTaGFwZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgIWNsb3NlZCB8fCBGYWlsYGNhbm5vdCB3cml0ZSB0byBjbG9zZWQgcmVjb3JkZXJgO1xuICAgICAgICBtdXN0TWF0Y2godmFsdWUsIHZhbHVlU2hhcGUpO1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gYXdhaXQgRShtYXJzaGFsbGVyKS50b0NhcERhdGEodmFsdWUpO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICAgIGF3YWl0IEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKHNlcmlhbGl6ZWQpO1xuXG4gICAgICAgIC8qIGJlbG93IGhlcmUgZGlmZmVycyBmcm9tIHdyaXRlRmluYWwoKSovXG4gICAgICAgIHJldHVybiBwdWJsaXNoZXIucHVibGlzaCh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgLyoqXG4gKiBMaWtlIGB3cml0ZWAgYnV0IHByZXZlbnRzIGZ1dHVyZSB3cml0ZXMgYW5kIHRlcm1pbmF0ZXMgdGhlIHB1Ymxpc2hlci5cbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICBhc3luYyB3cml0ZUZpbmFsKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgY2xvc2VkLCBwdWJsaXNoZXIsIHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAhY2xvc2VkIHx8IEZhaWxgY2Fubm90IHdyaXRlIHRvIGNsb3NlZCByZWNvcmRlcmA7XG4gICAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSk7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgICAgYXdhaXQgRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG5cbiAgICAgICAgLyogYmVsb3cgaGVyZSBkaWZmZXJzIGZyb20gd3JpdGUoKSovXG4gICAgICAgIHRoaXMuc3RhdGUuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hlci5maW5pc2godmFsdWUpO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBtYWtlUmVjb3JkZXI7XG59OyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXIocHJlcGFyZVJlY29yZGVyKTtcbmhhcmRlbihwcmVwYXJlUmVjb3JkZXIpO1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlUmVjb3JkZXI+fSBNYWtlUmVjb3JkZXIgKi9cblxuLyoqXG4gKiBgbWFrZVJlY29yZGVyS2l0YCBpcyBzdWl0YWJsZSBmb3IgbWFraW5nIGEgZHVyYWJsZSBgUmVjb3JkZXJLaXRgIHdoaWNoIGNhbiBiZSBoZWxkIGluIEV4byBzdGF0ZS5cbiAqXG4gKiBAc2VlIHtkZWZpbmVFUmVjb3JkZXJLaXR9XG4gKlxuICogQHBhcmFtIHt7bWFrZVJlY29yZGVyOiBNYWtlUmVjb3JkZXIsIG1ha2VEdXJhYmxlUHVibGlzaEtpdDogUmV0dXJuVHlwZTx0eXBlb2YgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Pn19IG1ha2Vyc1xuICovXG4gICAgICAgY29uc3QgZGVmaW5lUmVjb3JkZXJLaXQgPSAoeyBtYWtlUmVjb3JkZXIsIG1ha2VEdXJhYmxlUHVibGlzaEtpdCB9KSA9PiB7XG4gIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7VHlwZWRQYXR0ZXJuPFQ+fSBbdmFsdWVTaGFwZV1cbiAqIEByZXR1cm5zIHtSZWNvcmRlcktpdDxUPn1cbiAqL1xuICBjb25zdCBtYWtlUmVjb3JkZXJLaXQgPSAoc3RvcmFnZU5vZGUsIHZhbHVlU2hhcGUpID0+IHtcbiAgICBjb25zdCB7IHN1YnNjcmliZXIsIHB1Ymxpc2hlciB9ID0gbWFrZUR1cmFibGVQdWJsaXNoS2l0KCk7XG4gICAgY29uc3QgcmVjb3JkZXIgPSBtYWtlUmVjb3JkZXIocHVibGlzaGVyLCBzdG9yYWdlTm9kZSwgdmFsdWVTaGFwZSk7XG4gICAgcmV0dXJuIGhhcmRlbih7IHN1YnNjcmliZXIsIHJlY29yZGVyIH0pO1xuICB9O1xuICByZXR1cm4gbWFrZVJlY29yZGVyS2l0O1xufTtcbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgZGVmaW5lUmVjb3JkZXJLaXQ+fSBNYWtlUmVjb3JkZXJLaXQgKi9cblxuLyoqXG4gKiBgbWFrZUVSZWNvcmRlcktpdGAgaXMgZm9yIGNsb3N1cmVzIHRoYXQgbXVzdCByZXR1cm4gYSBgc3Vic2NyaWJlcmAgc3luY2hyb25vdXNseSBidXQgY2FuIGRlZmVyIHRoZSBgcmVjb3JkZXJgLlxuICpcbiAqIEBzZWUge2RlZmluZVJlY29yZGVyS2l0fVxuICpcbiAqIEBwYXJhbSB7e21ha2VSZWNvcmRlcjogTWFrZVJlY29yZGVyLCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQ6IFJldHVyblR5cGU8dHlwZW9mIHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdD59fSBtYWtlcnNcbiAqLyRozY9fb25jZS5kZWZpbmVSZWNvcmRlcktpdChkZWZpbmVSZWNvcmRlcktpdCk7XG4gICAgICAgY29uc3QgZGVmaW5lRVJlY29yZGVyS2l0ID0gKHsgbWFrZVJlY29yZGVyLCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQgfSkgPT4ge1xuICAvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVBcbiAqIEBwYXJhbSB7VHlwZWRQYXR0ZXJuPFQ+fSBbdmFsdWVTaGFwZV1cbiAqIEByZXR1cm5zIHtFdmVudHVhbFJlY29yZGVyS2l0PFQ+fVxuICovXG4gIGNvbnN0IG1ha2VFUmVjb3JkZXJLaXQgPSAoc3RvcmFnZU5vZGVQLCB2YWx1ZVNoYXBlKSA9PiB7XG4gICAgY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VEdXJhYmxlUHVibGlzaEtpdCgpO1xuICAgIGNvbnN0IHJlY29yZGVyUCA9IEUud2hlbihzdG9yYWdlTm9kZVAsIHN0b3JhZ2VOb2RlID0+XG4gICAgICBtYWtlUmVjb3JkZXIocHVibGlzaGVyLCBzdG9yYWdlTm9kZSwgdmFsdWVTaGFwZSksXG4gICAgKTtcbiAgICByZXR1cm4geyBzdWJzY3JpYmVyLCByZWNvcmRlclAgfTtcbiAgfTtcbiAgcmV0dXJuIG1ha2VFUmVjb3JkZXJLaXQ7XG59OyRozY9fb25jZS5kZWZpbmVFUmVjb3JkZXJLaXQoZGVmaW5lRVJlY29yZGVyS2l0KTtcbmhhcmRlbihkZWZpbmVFUmVjb3JkZXJLaXQpO1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBkZWZpbmVFUmVjb3JkZXJLaXQ+fSBNYWtlRVJlY29yZGVyS2l0ICovXG5cbi8qKlxuICogQ29udmVuaWVuY2Ugd3JhcHBlciB0byBwcmVwYXJlIHRoZSBEdXJhYmxlUHVibGlzaEtpdCBhbmQgUmVjb3JkZXIga2luZHMuXG4gKiBOb3RlIHRoYXQgYmVjYXVzZSBwcmVwYXJlUmVjb3JkZXIoKSBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBwZXIgYmFnZ2FnZSxcbiAqIHRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFuIEV2ZW50dWFsUmVjb3JkZXJLaXQuXG4gKiBXaGVuIHRoZXJlIGlzLCBwcmVwYXJlIHRoZSBraW5kcyBzZXBhcmF0ZWx5IGFuZCBwYXNzIHRvIHRoZSBraXQgZGVmaW5lcnMuXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUmVjb3JkZXJLaXQgPSAoYmFnZ2FnZSwgbWFyc2hhbGxlcikgPT4ge1xuICBjb25zdCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQgPSBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICAnRHVyYWJsZSBQdWJsaXNoIEtpdCcsXG4gICk7XG4gIGNvbnN0IG1ha2VSZWNvcmRlciA9IHByZXBhcmVSZWNvcmRlcihiYWdnYWdlLCBtYXJzaGFsbGVyKTtcbiAgcmV0dXJuIGRlZmluZVJlY29yZGVyS2l0KHsgbWFrZUR1cmFibGVQdWJsaXNoS2l0LCBtYWtlUmVjb3JkZXIgfSk7XG59O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIHdyYXBwZXIgZm9yIER1cmFibGVQdWJsaXNoS2l0IGFuZCBSZWNvcmRlciBraW5kcy5cbiAqXG4gKiBOQjogdGhpcyBkZWZpbmVzIHR3byBkdXJhYmxlIGtpbmRzLiBNdXN0IGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgcGVyIGJhZ2dhZ2UuXG4gKlxuICogYG1ha2VSZWNvcmRlcktpdGAgaXMgc3VpdGFibGUgZm9yIG1ha2luZyBhIGR1cmFibGUgYFJlY29yZGVyS2l0YCB3aGljaCBjYW4gYmUgaGVsZCBpbiBFeG8gc3RhdGUuXG4gKiBgbWFrZUVSZWNvcmRlcktpdGAgaXMgZm9yIGNsb3N1cmVzIHRoYXQgbXVzdCByZXR1cm4gYSBgc3Vic2NyaWJlcmAgc3luY2hyb25vdXNseSBidXQgY2FuIGRlZmVyIHRoZSBgcmVjb3JkZXJgLlxuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICovJGjNj19vbmNlLnByZXBhcmVSZWNvcmRlcktpdChwcmVwYXJlUmVjb3JkZXJLaXQpO1xuICAgICAgIGNvbnN0IHByZXBhcmVSZWNvcmRlcktpdE1ha2VycyA9IChiYWdnYWdlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGNvbnN0IG1ha2VEdXJhYmxlUHVibGlzaEtpdCA9IHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChcbiAgICBiYWdnYWdlLFxuICAgICdEdXJhYmxlIFB1Ymxpc2ggS2l0JyxcbiAgKTtcbiAgY29uc3QgbWFrZVJlY29yZGVyID0gcHJlcGFyZVJlY29yZGVyKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpO1xuXG4gIGNvbnN0IG1ha2VSZWNvcmRlcktpdCA9IGRlZmluZVJlY29yZGVyS2l0KHtcbiAgICBtYWtlUmVjb3JkZXIsXG4gICAgbWFrZUR1cmFibGVQdWJsaXNoS2l0LFxuICB9KTtcbiAgY29uc3QgbWFrZUVSZWNvcmRlcktpdCA9IGRlZmluZUVSZWNvcmRlcktpdCh7XG4gICAgbWFrZVJlY29yZGVyLFxuICAgIG1ha2VEdXJhYmxlUHVibGlzaEtpdCxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQsXG4gICAgbWFrZVJlY29yZGVyLFxuICAgIG1ha2VSZWNvcmRlcktpdCxcbiAgICBtYWtlRVJlY29yZGVyS2l0LFxuICB9O1xufTtcblxuLyoqXG4gKiBGb3IgdXNlIGluIHRlc3RzXG4gKi8kaM2PX29uY2UucHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKHByZXBhcmVSZWNvcmRlcktpdE1ha2Vycyk7XG4gICAgICAgY29uc3QgcHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyA9ICgpID0+IHtcbiAgY29uc3QgYmFnZ2FnZSA9IG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnbW9jayByZWNvcmRlciBiYWdnYWdlJyk7XG4gIGNvbnN0IG1hcnNoYWxsZXIgPSBtYWtlRmFrZU1hcnNoYWxsZXIoKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5wcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMoYmFnZ2FnZSwgbWFyc2hhbGxlciksXG4gICAgc3RvcmFnZU5vZGU6IG1ha2VGYWtlU3RvcmFnZSgnbW9jayByZWNvcmRlciBzdG9yYWdlJyksXG4gIH07XG59OyRozY9fb25jZS5wcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzKHByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMpO1xuXG4gICAgICAgY29uc3QgUmVjb3JkZXJLaXRTaGFwZSA9IHtcbiAgcmVjb3JkZXI6IE0ucmVtb3RhYmxlKCksXG4gIHN1YnNjcmliZXI6IE0ucmVtb3RhYmxlKCksXG59OyRozY9fb25jZS5SZWNvcmRlcktpdFNoYXBlKFJlY29yZGVyS2l0U2hhcGUpO1xuaGFyZGVuKFJlY29yZGVyS2l0U2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVJlY29yZGVyIjpbInByZXBhcmVSZWNvcmRlciJdLCJkZWZpbmVSZWNvcmRlcktpdCI6WyJkZWZpbmVSZWNvcmRlcktpdCJdLCJkZWZpbmVFUmVjb3JkZXJLaXQiOlsiZGVmaW5lRVJlY29yZGVyS2l0Il0sInByZXBhcmVSZWNvcmRlcktpdCI6WyJwcmVwYXJlUmVjb3JkZXJLaXQiXSwicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIjpbInByZXBhcmVSZWNvcmRlcktpdE1ha2VycyJdLCJwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzIjpbInByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMiXSwiUmVjb3JkZXJLaXRTaGFwZSI6WyJSZWNvcmRlcktpdFNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACivpPrsBAAA7AQAADcAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VTdGF0ZU1hY2hpbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXV1dXSk7XG5cbi8qIGFsbG93ZWRUcmFuc2l0aW9ucyBpcyBhbiBhcnJheSBvZiBhcnJheXMgd2hpY2ggZ2V0cyB0dXJuZWQgaW50byBhXG4gKiBtYXAuIFRoZSBtYXAgbWFwcyBzdHJpbmcgc3RhdGVzIHRvIGFuIGFycmF5IG9mIHBvdGVudGlhbCBuZXh0XG4gKiBzdGF0ZXMuIEZvciBleGFtcGxlLFxuICogY29uc3QgYWxsb3dlZFRyYW5zaXRpb25zID0gW1xuIFsnb3BlbicsIFsnY2xvc2VkJ11dLFxuIFsnY2xvc2VkJywgW11dLFxuICogXTtcbiovXG5jb25zdCBtYWtlU3RhdGVNYWNoaW5lID0gKGluaXRpYWxTdGF0ZSwgYWxsb3dlZFRyYW5zaXRpb25zQXJyYXkpID0+IHtcbiAgbGV0IHN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICBjb25zdCBhbGxvd2VkVHJhbnNpdGlvbnMgPSBuZXcgTWFwKGFsbG93ZWRUcmFuc2l0aW9uc0FycmF5KTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgY2FuVHJhbnNpdGlvblRvOiBuZXh0U3RhdGUgPT5cbiAgICAgIGFsbG93ZWRUcmFuc2l0aW9ucy5nZXQoc3RhdGUpLmluY2x1ZGVzKG5leHRTdGF0ZSksXG4gICAgdHJhbnNpdGlvblRvOiBuZXh0U3RhdGUgPT4ge1xuICAgICAgYXNzZXJ0KGFsbG93ZWRUcmFuc2l0aW9ucy5nZXQoc3RhdGUpLmluY2x1ZGVzKG5leHRTdGF0ZSkpO1xuICAgICAgc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgfSxcbiAgICBnZXRTdGF0dXM6IF8gPT4gc3RhdGUsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVN0YXRlTWFjaGluZShtYWtlU3RhdGVNYWNoaW5lKTtcbmhhcmRlbihtYWtlU3RhdGVNYWNoaW5lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdGF0ZU1hY2hpbmUiOlsibWFrZVN0YXRlTWFjaGluZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACNGVQXBgYAAAYGAAA1AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImNhbGN1bGF0ZU1lZGlhbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUeXBlZE1hdGhcbiAqIEBwcm9wZXJ0eSB7KGE6IFQsIGI6IFQpID0+IFR9IGFkZFxuICogQHByb3BlcnR5IHsoYTogVCwgYjogYmlnaW50KSA9PiBUfSBkaXZpZGVcbiAqIEBwcm9wZXJ0eSB7KGE6IFQsIGI6IFQpID0+IGJvb2xlYW59IGlzR1RFXG4gKi9cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG1lZGlhbiBvZiBhIHNldCBvZiBzYW1wbGVzXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7QXJyYXk8VD59IHNhbXBsZXMgdGhlIGlucHV0IG1lYXN1cmVtZW50c1xuICogQHBhcmFtIHtUeXBlZE1hdGg8VD59IG1hdGhcbiAqIEByZXR1cm5zIHtUIHwgdW5kZWZpbmVkfSB0aGUgbWVkaWFuICh1bmRlZmluZWQgaWYgbm8gc2FtcGxlcylcbiAqL1xuICAgICAgIGNvbnN0IGNhbGN1bGF0ZU1lZGlhbiA9IChzYW1wbGVzLCBtYXRoKSA9PiB7XG4gIGNvbnN0IHNvcnRlZCA9IHNhbXBsZXMuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmICghbWF0aC5pc0dURShhLCBiKSkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gZWxzZSBpZiAoIW1hdGguaXNHVEUoYiwgYSkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSk7XG5cbiAgaWYgKHNvcnRlZC5sZW5ndGggPT09IDApIHtcbiAgICAvKiBObyB2YWxpZCBzYW1wbGVzLCBkb24ndCByZXBvcnQgYW55dGhpbmcuKi9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHNvcnRlZC5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgLyogT2RkIGxlbmd0aCwganVzdCBwaWNrIHRoZSBtaWRkbGUgZWxlbWVudC4qL1xuICAgIHJldHVybiBzb3J0ZWRbKHNvcnRlZC5sZW5ndGggLSAxKSAvIDJdO1xuICB9XG5cbiAgLyogRXZlbiBsZW5ndGgsIHRha2UgdGhlIG1lYW4gb2YgdGhlIHR3byBtaWRkbGUgdmFsdWVzLiovXG4gIGNvbnN0IHNlY29uZEluZGV4ID0gc29ydGVkLmxlbmd0aCAvIDI7XG4gIGNvbnN0IHN1bSA9IG1hdGguYWRkKHNvcnRlZFtzZWNvbmRJbmRleCAtIDFdLCBzb3J0ZWRbc2Vjb25kSW5kZXhdKTtcbiAgcmV0dXJuIG1hdGguZGl2aWRlKHN1bSwgMm4pO1xufTskaM2PX29uY2UuY2FsY3VsYXRlTWVkaWFuKGNhbGN1bGF0ZU1lZGlhbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYWxjdWxhdGVNZWRpYW4iOlsiY2FsY3VsYXRlTWVkaWFuIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHvWAkrpAwAA6QMAADkAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvdGVzdEppZ0hlbHBlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VKaWdLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyoqXG4gKiBAaW1wb3J0IHtTZXRUZXN0SmlnfSBmcm9tICcuLi9jb250cmFjdEZhY2V0L3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFtUPVJlY29yZDxzdHJpbmcsIHVua25vd24+XVxuICovXG4gICAgICAgY29uc3QgbWFrZUppZ0tpdCA9ICgpID0+IHtcbiAgLyoqIEB0eXBlIHsoKCkgPT4gVCkgfCB1bmRlZmluZWR9ICovXG4gIGxldCB0ZXN0Rm47XG5cbiAgLyoqIEB0eXBlIHtTZXRUZXN0SmlnPFQ+fSAqL1xuICBjb25zdCBzZXRUZXN0SmlnID0gZm4gPT4ge1xuICAgIHRlc3RGbiA9IGZuO1xuICB9O1xuXG4gIC8qKiBAcmV0dXJucyB7VCB8IHVuZGVmaW5lZH0gKi9cbiAgY29uc3QgZ2V0VGVzdEppZyA9ICgpID0+IHRlc3RGbj8uKCk7XG5cbiAgcmV0dXJuIHsgc2V0VGVzdEppZywgZ2V0VGVzdEppZyB9O1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBbVD1SZWNvcmQ8c3RyaW5nLCB1bmtub3duPl1cbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlSmlnS2l0PFQ+Pn0gVGVzdEppZ0tpdFxuICovJGjNj19vbmNlLm1ha2VKaWdLaXQobWFrZUppZ0tpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSmlnS2l0IjpbIm1ha2VKaWdLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYwjL1L8JAAC/CQAAMQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC90b3BpY3MuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJQdWJsaWNUb3BpY1NoYXBlIiwiU3Vic2NyaWJlclNoYXBlIiwiVG9waWNzUmVjb3JkU2hhcGUiLCJtYWtlUmVjb3JkZXJUb3BpYyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFN1YnNjcmliZXJTaGFwZSxNLEU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIixbJGjNj19hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaM2PX2EpLCRozY9fbGl2ZVtcIlN1YnNjcmliZXJTaGFwZVwiXV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgIGNvbnN0IFB1YmxpY1RvcGljU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAgc3Vic2NyaWJlcjogU3Vic2NyaWJlclNoYXBlLFxuICAgIHN0b3JhZ2VQYXRoOiBNLm9yKE0ucHJvbWlzZSgvKiBzdHJpbmcgKi8pLCBNLnN0cmluZygpKSxcbiAgfSxcbiAgeyBkZXNjcmlwdGlvbjogTS5zdHJpbmcoKSB9LFxuKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gVCB0b3BpYyB2YWx1ZVxuICogQHR5cGVkZWYge3tcbiAqICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gKiAgIHN1YnNjcmliZXI6IFN1YnNjcmliZXI8VD4sXG4gKiAgIHN0b3JhZ2VQYXRoOiBFUmVmPHN0cmluZz4sXG4gKiB9fSBQdWJsaWNUb3BpY1xuICovXG5cbi8qKlxuICogQSB7UHVibGljVG9waWN9IGluIHdoaWNoIHRoZSBgc3RvcmFnZVBhdGhgIGlzIGFsd2F5cyBhIHJlc29sdmVkIHN0cmluZyBhbmQgdGhlIGBzdWJzY3JpYmVyIGlzIHJlbW90ZS5cbiAqXG4gKiBVc2VmdWwgd2hlbiB3b3JraW5nIHdpdGggVm93cyBhbmQgYXN5bmMtZmxvdy5cbiAqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gVCB0b3BpYyB2YWx1ZVxuICogQHR5cGVkZWYge3tcbiAqICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gKiAgIHN1YnNjcmliZXI6IFJlbW90ZTxTdWJzY3JpYmVyPFQ+PixcbiAqICAgc3RvcmFnZVBhdGg6IHN0cmluZyxcbiAqIH19IFJlc29sdmVkUHVibGljVG9waWNcbiAqLyRozY9fb25jZS5QdWJsaWNUb3BpY1NoYXBlKFB1YmxpY1RvcGljU2hhcGUpO1xuXG4gICAgICAgY29uc3QgVG9waWNzUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKE0uc3RyaW5nKCksIFB1YmxpY1RvcGljU2hhcGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFt0b3BpY05hbWU6IHN0cmluZ106IFB1YmxpY1RvcGljPHVua25vd24+LFxuICogfX0gVG9waWNzUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBbdG9waWNOYW1lOiBzdHJpbmddOiBSZXNvbHZlZFB1YmxpY1RvcGljPHVua25vd24+LFxuICogfX0gUmVzb2x2ZWRUb3BpY3NSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwYXJhbSB7UmVjb3JkZXJLaXQ8VD4gfCBFdmVudHVhbFJlY29yZGVyS2l0PFQ+fSByZWNvcmRlcktpdFxuICogQHJldHVybnMge1B1YmxpY1RvcGljPFQ+fVxuICovJGjNj19vbmNlLlRvcGljc1JlY29yZFNoYXBlKFRvcGljc1JlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBtYWtlUmVjb3JkZXJUb3BpYyA9IChkZXNjcmlwdGlvbiwgcmVjb3JkZXJLaXQpID0+IHtcbiAgY29uc3QgcmVjUCA9XG4gICAgJ3JlY29yZGVyJyBpbiByZWNvcmRlcktpdCA/IHJlY29yZGVyS2l0LnJlY29yZGVyIDogcmVjb3JkZXJLaXQucmVjb3JkZXJQO1xuICByZXR1cm4ge1xuICAgIGRlc2NyaXB0aW9uLFxuICAgIHN1YnNjcmliZXI6IHJlY29yZGVyS2l0LnN1YnNjcmliZXIsXG4gICAgc3RvcmFnZVBhdGg6IEUocmVjUCkuZ2V0U3RvcmFnZVBhdGgoKSxcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VSZWNvcmRlclRvcGljKG1ha2VSZWNvcmRlclRvcGljKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7IlN1YnNjcmliZXJTaGFwZSI6WyJTdWJzY3JpYmVyU2hhcGUiLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQdWJsaWNUb3BpY1NoYXBlIjpbIlB1YmxpY1RvcGljU2hhcGUiXSwiVG9waWNzUmVjb3JkU2hhcGUiOlsiVG9waWNzUmVjb3JkU2hhcGUiXSwibWFrZVJlY29yZGVyVG9waWMiOlsibWFrZVJlY29yZGVyVG9waWMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwa5TcJM9AACTPQAANQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsIi4vYXRvbWljVHJhbnNmZXIuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRJc3N1ZXJLZXl3b3JkcyIsImFzc2VydE5hdEFzc2V0S2luZCIsImFzc2VydFByb3Bvc2FsU2hhcGUiLCJkZWZhdWx0QWNjZXB0YW5jZU1zZyIsImRlcG9zaXRUb1NlYXQiLCJkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyIsImZpdFByb3Bvc2FsU2hhcGUiLCJtYXBLZXl3b3JkcyIsIm9mZmVyVG8iLCJzYXRpc2ZpZXMiLCJzYXZlQWxsSXNzdWVycyIsInN3YXAiLCJzd2FwRXhhY3QiLCJ3aXRoZHJhd0Zyb21TZWF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQXNzZXRLaW5kLGZyb21VbmlxdWVFbnRyaWVzLGtleUVRLG11c3RNYXRjaCxGYWlsLEUsbWFrZVByb21pc2VLaXQsc2F0aXNmaWVzV2FudCxhdG9taWNUcmFuc2Zlcixmcm9tT25seSx0b09ubHk7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFzc2V0S2luZFwiLFskaM2PX2EgPT4gKEFzc2V0S2luZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc1wiLCBbW1wic2F0aXNmaWVzV2FudFwiLFskaM2PX2EgPT4gKHNhdGlzZmllc1dhbnQgPSAkaM2PX2EpXV1dXSxbXCIuL2F0b21pY1RyYW5zZmVyLmpzXCIsIFtbXCJhdG9taWNUcmFuc2ZlclwiLFskaM2PX2EgPT4gKGF0b21pY1RyYW5zZmVyID0gJGjNj19hKV1dLFtcImZyb21Pbmx5XCIsWyRozY9fYSA9PiAoZnJvbU9ubHkgPSAkaM2PX2EpXV0sW1widG9Pbmx5XCIsWyRozY9fYSA9PiAodG9Pbmx5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1BhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge0Ftb3VudEtleXdvcmRSZWNvcmQsIENvbnRyYWN0TWV0YSwgSW52aXRhdGlvbiwgSXNzdWVyS2V5d29yZFJlY29yZCwgS2V5d29yZCwgUGF5bWVudFBLZXl3b3JkUmVjb3JkLCBQcm9wb3NhbCwgUHJvcG9zYWxSZWNvcmQsIFVzZXJTZWF0LCBaQ0YsIFpDRlNlYXR9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0tleXdvcmRLZXl3b3JkUmVjb3JkLCBNYXBLZXl3b3JkcywgUmV2ZXJzZSwgU3dhcCwgU3dhcEV4YWN0fSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0FsbG9jYXRpb259IGZyb20gJy4uL2NvbnRyYWN0RmFjZXQvdHlwZXMudHMnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbiAgICAgICBjb25zdCBkZWZhdWx0QWNjZXB0YW5jZU1zZyA9IGBUaGUgb2ZmZXIgaGFzIGJlZW4gYWNjZXB0ZWQuIE9uY2UgdGhlIGNvbnRyYWN0IGhhcyBiZWVuIGNvbXBsZXRlZCwgcGxlYXNlIGNoZWNrIHlvdXIgcGF5b3V0YDskaM2PX29uY2UuZGVmYXVsdEFjY2VwdGFuY2VNc2coZGVmYXVsdEFjY2VwdGFuY2VNc2cpO1xuXG5jb25zdCBnZXRLZXlzU29ydGVkID0gb2JqID0+IGhhcmRlbihSZWZsZWN0Lm93bktleXMob2JqIHx8IHt9KS5zb3J0KCkpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0SXNzdWVyS2V5d29yZHMgPSAoemNmLCBleHBlY3RlZCkgPT4ge1xuICBjb25zdCB7IGlzc3VlcnMgfSA9IHpjZi5nZXRUZXJtcygpO1xuICBjb25zdCBhY3R1YWwgPSBnZXRLZXlzU29ydGVkKGlzc3VlcnMpO1xuICBleHBlY3RlZCA9IFsuLi5leHBlY3RlZF07IC8qIGluIGNhc2UgaGFyZGVuZWQqL1xuICBleHBlY3RlZC5zb3J0KCk7XG4gIGtleUVRKGFjdHVhbCwgaGFyZGVuKGV4cGVjdGVkKSkgfHxcbiAgICBGYWlsYGtleXdvcmRzOiAke2FjdHVhbH0gd2VyZSBub3QgYXMgZXhwZWN0ZWQ6ICR7ZXhwZWN0ZWR9YDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWmNmU2VhdFBhcnRpYWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvcG9zYWxSZWNvcmR9IGdldFByb3Bvc2FsXG4gKiBAcHJvcGVydHkgeygpID0+IEFsbG9jYXRpb259IGdldEN1cnJlbnRBbGxvY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGFuIHVwZGF0ZSB0byBjdXJyZW50QWxsb2NhdGlvbiBzYXRpc2ZpZXNcbiAqIHByb3Bvc2FsLndhbnQuIE5vdGUgdGhhdCB0aGlzIGlzIGhhbGYgb2YgdGhlIG9mZmVyIHNhZmV0eVxuICogY2hlY2s7IHdoZXRoZXIgdGhlIGFsbG9jYXRpb24gY29uc3RpdHV0ZXMgYSByZWZ1bmQgaXMgbm90XG4gKiBjaGVja2VkLiBUaGUgdXBkYXRlIGlzIG1lcmdlZCB3aXRoIGN1cnJlbnRBbGxvY2F0aW9uXG4gKiAodXBkYXRlJ3MgdmFsdWVzIHByZXZhaWxpbmcgaWYgdGhlIGtleXdvcmRzIGFyZSB0aGUgc2FtZSlcbiAqIHRvIHByb2R1Y2UgdGhlIG5ld0FsbG9jYXRpb24uIFRoZSByZXR1cm4gdmFsdWUgaXMgMCBmb3JcbiAqIGZhbHNlIGFuZCAxIGZvciB0cnVlLiBXaGVuIG11bHRpcGxlcyBhcmUgaW50cm9kdWNlZCwgYW55XG4gKiBwb3NpdGl2ZSByZXR1cm4gdmFsdWUgd2lsbCBtZWFuIHRydWUuXG4gKlxuICogQHBhcmFtIHthbnl9IF9pZ25vcmVkIG5vIGxvbmdlciB1c2VkLlxuICogQHBhcmFtIHtaY2ZTZWF0UGFydGlhbH0gc2VhdFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSB1cGRhdGVcbiAqIEByZXR1cm5zIHswfDF9XG4gKi8kaM2PX29uY2UuYXNzZXJ0SXNzdWVyS2V5d29yZHMoYXNzZXJ0SXNzdWVyS2V5d29yZHMpO1xuICAgICAgIGNvbnN0IHNhdGlzZmllcyA9IChfaWdub3JlZCwgc2VhdCwgdXBkYXRlKSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRBbGxvY2F0aW9uID0gc2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpO1xuICBjb25zdCBuZXdBbGxvY2F0aW9uID0geyAuLi5jdXJyZW50QWxsb2NhdGlvbiwgLi4udXBkYXRlIH07XG4gIGNvbnN0IHByb3Bvc2FsID0gc2VhdC5nZXRQcm9wb3NhbCgpO1xuICByZXR1cm4gc2F0aXNmaWVzV2FudChwcm9wb3NhbCwgbmV3QWxsb2NhdGlvbik7XG59O1xuXG4vKiogQHR5cGUge1N3YXB9ICovJGjNj19vbmNlLnNhdGlzZmllcyhzYXRpc2ZpZXMpO1xuICAgICAgIGNvbnN0IHN3YXAgPSAoemNmLCBsZWZ0U2VhdCwgcmlnaHRTZWF0KSA9PiB7XG4gIHRyeSB7XG4gICAgemNmLmF0b21pY1JlYXJyYW5nZShcbiAgICAgIGhhcmRlbihbXG4gICAgICAgIFtyaWdodFNlYXQsIGxlZnRTZWF0LCBsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnRdLFxuICAgICAgICBbbGVmdFNlYXQsIHJpZ2h0U2VhdCwgcmlnaHRTZWF0LmdldFByb3Bvc2FsKCkud2FudF0sXG4gICAgICBdKSxcbiAgICApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsZWZ0U2VhdC5mYWlsKGVycik7XG4gICAgcmlnaHRTZWF0LmZhaWwoZXJyKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBsZWZ0U2VhdC5leGl0KCk7XG4gIHJpZ2h0U2VhdC5leGl0KCk7XG4gIHJldHVybiBkZWZhdWx0QWNjZXB0YW5jZU1zZztcbn07XG5cbi8qKiBAdHlwZSB7U3dhcEV4YWN0fSAqLyRozY9fb25jZS5zd2FwKHN3YXApO1xuICAgICAgIGNvbnN0IHN3YXBFeGFjdCA9ICh6Y2YsIGxlZnRTZWF0LCByaWdodFNlYXQpID0+IHtcbiAgdHJ5IHtcbiAgICB6Y2YuYXRvbWljUmVhcnJhbmdlKFxuICAgICAgaGFyZGVuKFtcbiAgICAgICAgZnJvbU9ubHkocmlnaHRTZWF0LCByaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS5naXZlKSxcbiAgICAgICAgZnJvbU9ubHkobGVmdFNlYXQsIGxlZnRTZWF0LmdldFByb3Bvc2FsKCkuZ2l2ZSksXG5cbiAgICAgICAgdG9Pbmx5KGxlZnRTZWF0LCBsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnQpLFxuICAgICAgICB0b09ubHkocmlnaHRTZWF0LCByaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KSxcbiAgICAgIF0pLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxlZnRTZWF0LmZhaWwoZXJyKTtcbiAgICByaWdodFNlYXQuZmFpbChlcnIpO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGxlZnRTZWF0LmV4aXQoKTtcbiAgcmlnaHRTZWF0LmV4aXQoKTtcbiAgcmV0dXJuIGRlZmF1bHRBY2NlcHRhbmNlTXNnO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiBFeHBlY3RlZFJlY29yZFxuICogQHByb3BlcnR5IHtSZWNvcmQ8S2V5d29yZCwgbnVsbD59IFt3YW50XVxuICogQHByb3BlcnR5IHtSZWNvcmQ8S2V5d29yZCwgbnVsbD59IFtnaXZlXVxuICogQHByb3BlcnR5IHtQYXJ0aWFsPFJlY29yZDxrZXlvZiBQcm9wb3NhbFJlY29yZFsnZXhpdCddLCBudWxsPj59IFtleGl0XVxuICovXG5cbi8qKlxuICogQ2hlY2sgdGhlIHNlYXQncyBwcm9wb3NhbCBhZ2FpbnN0IGBwcm9wb3NhbFNoYXBlYC5cbiAqIElmIHRoZSBjbGllbnQgc3VibWl0cyBhbiBvZmZlciB3aGljaCBkb2VzIG5vdCBtYXRjaFxuICogdGhlc2UgZXhwZWN0YXRpb25zLCB0aGUgc2VhdCB3aWxsIGJlIGV4aXRlZCAoYW5kIHBheW1lbnRzIHJlZnVuZGVkKS5cbiAqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7UGF0dGVybn0gcHJvcG9zYWxTaGFwZVxuICovJGjNj19vbmNlLnN3YXBFeGFjdChzd2FwRXhhY3QpO1xuICAgICAgIGNvbnN0IGZpdFByb3Bvc2FsU2hhcGUgPSAoc2VhdCwgcHJvcG9zYWxTaGFwZSkgPT5cbiAgLyogVE9ETyByZW1vdmUgdGhpcyBoYXJkZW4sIG9ibGlnYXRpbmcgb3VyIGNhbGxlciB0byBoYXJkZW4uKi9cbiAgbXVzdE1hdGNoKHNlYXQuZ2V0UHJvcG9zYWwoKSwgaGFyZGVuKHByb3Bvc2FsU2hhcGUpLCAncHJvcG9zYWwnKTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc2VhdCdzIHByb3Bvc2FsIGFnYWluc3QgYW4gYGV4cGVjdGVkYCByZWNvcmQgdGhhdCBzYXlzXG4gKiB3aGF0IFwic2hhcGVcIiBvZiBwcm9wb3NhbCBpcyBhY2NlcHRhYmxlLlxuICpcbiAqIE5vdGUgdGhhdCBieSBvdXIgY3VycmVudCB0ZXJtaW5vbG9neSwgdGhpcyBmdW5jdGlvbiBpcyBtaXNuYW1lZCBiZWNhdXNlXG4gKiB3ZSB1c2VcbiAqIFtcIlNoYXBlXCIgdG8gcmVmZXIgdG8gcGF0dGVybnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9ibG9iL21hc3Rlci9wYWNrYWdlcy9zdG9yZS9zcmMvdHlwZXMuanMjTDU2LUw3NCksXG4gKiBhbmQgdGhlIGBleHBlY3RlZGAgYXJndW1lbnQgaXMgbm90IHN1Y2ggYSBwYXR0ZXJuLiBSYXRoZXIgaXQgaXMgYW4gYWQtaG9jXG4gKiBwYXR0ZXJuLWxpa2Ugc3BlY2lhbCBjYXNlIHJlY29yZCB0aGF0IGlzIGRpZmZlcmVudCBhbmQgbXVjaCBsZXNzIGV4cHJlc3NpdmUuXG4gKlxuICogVGhpcyBFeHBlY3RlZFJlY29yZCBpcyBsaWtlIGEgUHJvcG9zYWwsIGJ1dCB0aGUgYW1vdW50cyBpbiAnd2FudCdcbiAqIGFuZCAnZ2l2ZScgc2hvdWxkIGJlIG51bGw7IHRoZSBleGl0IGNsYXVzZSBzaG91bGQgc3BlY2lmeSBhIHJ1bGUgd2l0aFxuICogbnVsbCBjb250ZW50cy4gSWYgdGhlIGNsaWVudCBzdWJtaXRzIGFuIG9mZmVyIHdoaWNoIGRvZXMgbm90IG1hdGNoXG4gKiB0aGVzZSBleHBlY3RhdGlvbnMsIHRoZSBzZWF0IHdpbGwgYmUgZXhpdGVkIChhbmQgcGF5bWVudHMgcmVmdW5kZWQpLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBvcHRpb25hbCBgcHJvcG9zYWxTaGFwZWAgYXJndW1lbnQgdG8gYG1ha2VJbnZpdGF0aW9uYCB3aXRoXG4gKiBhIGdlbnVpbmUgcGF0dGVybi5cbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtFeHBlY3RlZFJlY29yZH0gZXhwZWN0ZWRcbiAqLyRozY9fb25jZS5maXRQcm9wb3NhbFNoYXBlKGZpdFByb3Bvc2FsU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydFByb3Bvc2FsU2hhcGUgPSAoc2VhdCwgZXhwZWN0ZWQpID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihleHBlY3RlZCwgJ29iamVjdCcpO1xuICAhQXJyYXkuaXNBcnJheShleHBlY3RlZCkgfHwgRmFpbGBFeHBlY3RlZCBtdXN0IGJlIGFuIG5vbi1hcnJheSBvYmplY3RgO1xuICBjb25zdCBhc3NlcnRWYWx1ZXNOdWxsID0gZSA9PiB7XG4gICAgaWYgKGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKGUpKSB7XG4gICAgICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgICAgICAgRmFpbGBUaGUgdmFsdWUgb2YgdGhlIGV4cGVjdGVkIHJlY29yZCBtdXN0IGJlIG51bGwgYnV0IHdhcyAke3ZhbHVlfWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qIEFzc2VydCB2YWx1ZXMgb2YgdGhlIGV4cGVjdGVkIHJlY29yZCBhcmUgYWxsIG51bGwuIFdlIGRvIG5vdCovXG4gIC8qIGNoZWNrIHRoZSB2YWx1ZXMgb2YgdGhlIGFjdHVhbCBwcm9wb3NhbC4qL1xuICBhc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLmdpdmUpO1xuICBhc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLndhbnQpO1xuICBhc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLmV4aXQpO1xuXG4gIGNvbnN0IGFjdHVhbCA9IHNlYXQuZ2V0UHJvcG9zYWwoKTtcbiAgY29uc3QgYXNzZXJ0S2V5cyA9IChhLCBlKSA9PiB7XG4gICAgaWYgKGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5RVEoZ2V0S2V5c1NvcnRlZChhKSwgZ2V0S2V5c1NvcnRlZChlKSkgfHxcbiAgICAgICAgRmFpbGBhY3R1YWwgJHthfSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkICR7ZX1gO1xuICAgIH1cbiAgfTtcbiAgYXNzZXJ0S2V5cyhhY3R1YWwuZ2l2ZSwgZXhwZWN0ZWQuZ2l2ZSk7XG4gIGFzc2VydEtleXMoYWN0dWFsLndhbnQsIGV4cGVjdGVkLndhbnQpO1xuICBhc3NlcnRLZXlzKGFjdHVhbC5leGl0LCBleHBlY3RlZC5leGl0KTtcbn07XG5cbi8qIEdpdmVuIGEgYnJhbmQsIGFzc2VydCB0aGF0IGJyYW5kIGlzIEFzc2V0S2luZC5OQVQuICovJGjNj19vbmNlLmFzc2VydFByb3Bvc2FsU2hhcGUoYXNzZXJ0UHJvcG9zYWxTaGFwZSk7XG4gICAgICAgY29uc3QgYXNzZXJ0TmF0QXNzZXRLaW5kID0gKHpjZiwgYnJhbmQpID0+IHtcbiAgemNmLmdldEFzc2V0S2luZChicmFuZCkgPT09IEFzc2V0S2luZC5OQVQgfHxcbiAgICBGYWlsYGJyYW5kIG11c3QgYmUgQXNzZXRLaW5kLk5BVGA7XG59OyRozY9fb25jZS5hc3NlcnROYXRBc3NldEtpbmQoYXNzZXJ0TmF0QXNzZXRLaW5kKTtcblxuICAgICAgIGNvbnN0IGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnID0gYERlcG9zaXQgYW5kIHJlYWxsb2NhdGlvbiBzdWNjZXNzZnVsLmA7XG5cbi8qKlxuICogRGVwb3NpdCBwYXltZW50cyBzdWNoIHRoYXQgdGhlaXIgYW1vdW50cyBhcmUgcmVhbGxvY2F0ZWQgdG8gYSBzZWF0LlxuICogVGhlIGBhbW91bnRzYCBhbmQgYHBheW1lbnRzYCByZWNvcmRzIG11c3QgaGF2ZSBjb3JyZXNwb25kaW5nXG4gKiBrZXl3b3Jkcy5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHJlY2lwaWVudFNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYW1vdW50c1xuICogQHBhcmFtIHtQYXltZW50UEtleXdvcmRSZWNvcmR9IHBheW1lbnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBgRGVwb3NpdCBhbmQgcmVhbGxvY2F0aW9uIHN1Y2Nlc3NmdWwuYFxuICovJGjNj19vbmNlLmRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKTtcbiAgICAgICBjb25zdCBkZXBvc2l0VG9TZWF0ID0gYXN5bmMgKHpjZiwgcmVjaXBpZW50U2VhdCwgYW1vdW50cywgcGF5bWVudHMpID0+IHtcbiAgIXJlY2lwaWVudFNlYXQuaGFzRXhpdGVkKCkgfHwgRmFpbGBUaGUgcmVjaXBpZW50U2VhdCBjYW5ub3QgaGF2ZSBleGl0ZWQuYDtcblxuICAvKiBXZSB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBvZmZlciB0byBiZSBhYmxlIHRvIGVzY3JvdyBvdXIgcGF5bWVudHMqL1xuICAvKiB3aXRoIFpvZS4qL1xuICBjb25zdCByZWFsbG9jYXRlQWZ0ZXJEZXBvc2l0ID0gdGVtcFNlYXQgPT4ge1xuICAgIC8qIEFmdGVyIHRoZSBhc3NldHMgYXJlIGRlcG9zaXRlZCwgcmVhbGxvY2F0ZSB0aGVtIG9udG8gdGhlIHJlY2lwaWVudCBzZWF0IGFuZCovXG4gICAgLyogZXhpdCB0aGUgdGVtcG9yYXJ5IHNlYXQuIE5vdGUgdGhhdCB0aGUgb2ZmZXJSZXN1bHQgaXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzKi9cbiAgICAvKiBmdW5jdGlvbiwgc28gdGhpcyBzeW5jaHJvbm91cyB0cmFkZSBtdXN0IGhhcHBlbiBiZWZvcmUgdGhlKi9cbiAgICAvKiBvZmZlclJlc3VsdCByZXNvbHZlcy4qL1xuICAgIGF0b21pY1RyYW5zZmVyKHpjZiwgdGVtcFNlYXQsIHJlY2lwaWVudFNlYXQsIGFtb3VudHMpO1xuICAgIHRlbXBTZWF0LmV4aXQoKTtcbiAgICByZXR1cm4gZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2c7XG4gIH07XG4gIGNvbnN0IGludml0YXRpb24gPSB6Y2YubWFrZUludml0YXRpb24oXG4gICAgcmVhbGxvY2F0ZUFmdGVyRGVwb3NpdCxcbiAgICAndGVtcG9yYXJ5IHNlYXQgZm9yIGRlcG9zaXQnLFxuICApO1xuICBjb25zdCBwcm9wb3NhbCA9IGhhcmRlbih7IGdpdmU6IGFtb3VudHMgfSk7XG4gIGhhcmRlbihwYXltZW50cyk7XG4gIC8qIFRvIGVzY3JvdyB0aGUgcGF5bWVudCwgd2UgbXVzdCBnZXQgdGhlIFpvZSBTZXJ2aWNlIGZhY2V0IGFuZCovXG4gIC8qIG1ha2UgYW4gb2ZmZXIqL1xuICBjb25zdCB6b2UgPSB6Y2YuZ2V0Wm9lU2VydmljZSgpO1xuICBjb25zdCB0ZW1wVXNlclNlYXQgPSBFKHpvZSkub2ZmZXIoaW52aXRhdGlvbiwgcHJvcG9zYWwsIHBheW1lbnRzKTtcbiAgLyogVGhpcyB3aWxsIGJlIGEgcHJvbWlzZSBmb3IgdGhlIHN0cmluZzogYERlcG9zaXQgYW5kIHJlYWxsb2NhdGlvbiovXG4gIC8qIHN1Y2Nlc3NmdWwuYCBJdCB3aWxsIG9ubHkgZnVsZmlsbCBhZnRlciB0aGUgYXNzZXRzIGhhdmUgYmVlbiovXG4gIC8qIHN1Y2Nlc3NmdWxseSByZWFsbG9jYXRlZCB0byB0aGUgcmVjaXBpZW50IHNlYXQuKi9cbiAgcmV0dXJuIEUodGVtcFVzZXJTZWF0KS5nZXRPZmZlclJlc3VsdCgpO1xufTtcblxuLyoqXG4gKiBXaXRoZHJhdyBwYXltZW50cyBmcm9tIGEgc2VhdC4gTm90ZSB0aGF0IHdpdGhkcmF3aW5nIHRoZSBhbW91bnRzIG9mXG4gKiB0aGUgcGF5bWVudHMgbXVzdCBub3QgYW5kIGNhbm5vdCB2aW9sYXRlIG9mZmVyIHNhZmV0eSBmb3IgdGhlIHNlYXQuIFRoZVxuICogYGFtb3VudHNgIGFuZCBgcGF5bWVudHNgIHJlY29yZHMgbXVzdCBoYXZlIGNvcnJlc3BvbmRpbmcga2V5d29yZHMuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFtb3VudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnRQS2V5d29yZFJlY29yZD59XG4gKi8kaM2PX29uY2UuZGVwb3NpdFRvU2VhdChkZXBvc2l0VG9TZWF0KTtcbiAgICAgICBjb25zdCB3aXRoZHJhd0Zyb21TZWF0ID0gYXN5bmMgKHpjZiwgc2VhdCwgYW1vdW50cykgPT4ge1xuICAhc2VhdC5oYXNFeGl0ZWQoKSB8fCBGYWlsYFRoZSBzZWF0IGNhbm5vdCBoYXZlIGV4aXRlZC5gO1xuICBjb25zdCB7IHpjZlNlYXQ6IHRlbXBTZWF0LCB1c2VyU2VhdDogdGVtcFVzZXJTZWF0UCB9ID0gemNmLm1ha2VFbXB0eVNlYXRLaXQoKTtcbiAgYXRvbWljVHJhbnNmZXIoemNmLCBzZWF0LCB0ZW1wU2VhdCwgYW1vdW50cyk7XG4gIHRlbXBTZWF0LmV4aXQoKTtcbiAgcmV0dXJuIEUodGVtcFVzZXJTZWF0UCkuZ2V0UGF5b3V0cygpO1xufTtcblxuLyoqXG4gKiBTYXZlIGFsbCBvZiB0aGUgaXNzdWVycyBpbiBhbiBpc3N1ZXJzS2V5d29yZFJlY29yZCB0byBaQ0YsIHVzaW5nXG4gKiB0aGUgbWV0aG9kIGB6Y2Yuc2F2ZUlzc3VlcmAuIFRoaXMgZG9lcyBub3QgZXJyb3IgaWYgYW55IG9mIHRoZSBrZXl3b3Jkc1xuICogYWxyZWFkeSBleGlzdC4gSWYgdGhlIGtleXdvcmQgaXMgYWxyZWFkeSBwcmVzZW50LCBpdCBpcyBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7SXNzdWVyS2V5d29yZFJlY29yZH0gaXNzdWVyS2V5d29yZFJlY29yZCBJc3N1ZXJzIHRvIHNhdmUgdG9cbiAqIFpDRlxuICovJGjNj19vbmNlLndpdGhkcmF3RnJvbVNlYXQod2l0aGRyYXdGcm9tU2VhdCk7XG4gICAgICAgY29uc3Qgc2F2ZUFsbElzc3VlcnMgPSBhc3luYyAoemNmLCBpc3N1ZXJLZXl3b3JkUmVjb3JkID0gaGFyZGVuKHt9KSkgPT4ge1xuICBjb25zdCB7IGlzc3VlcnMgfSA9IHpjZi5nZXRUZXJtcygpO1xuICBjb25zdCBpc3N1ZXJzUFNhdmVkID0gT2JqZWN0LmVudHJpZXMoaXNzdWVyS2V5d29yZFJlY29yZCkubWFwKFxuICAgIChba2V5d29yZCwgaXNzdWVyXSkgPT4ge1xuICAgICAgLyogSWYgdGhlIGtleXdvcmQgZG9lcyBub3QgeWV0IGV4aXN0LCBhZGQgaXQgYW5kIHRoZSovXG4gICAgICAvKiBhc3NvY2lhdGVkIGlzc3Vlci4qL1xuICAgICAgaWYgKGlzc3VlcnNba2V5d29yZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gemNmLnNhdmVJc3N1ZXIoaXNzdWVyLCBrZXl3b3JkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGlzc3VlcnNQU2F2ZWQpO1xufTtcblxuLyoqIEB0eXBlIHtNYXBLZXl3b3Jkc30gKi8kaM2PX29uY2Uuc2F2ZUFsbElzc3VlcnMoc2F2ZUFsbElzc3VlcnMpO1xuICAgICAgIGNvbnN0IG1hcEtleXdvcmRzID0gKGtleXdvcmRSZWNvcmQgPSB7fSwga2V5d29yZE1hcHBpbmcpID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBmcm9tVW5pcXVlRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGtleXdvcmRSZWNvcmQpLm1hcCgoW2tleXdvcmQsIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoa2V5d29yZE1hcHBpbmdba2V5d29yZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBba2V5d29yZCwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBba2V5d29yZE1hcHBpbmdba2V5d29yZF0sIHZhbHVlXTtcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG59O1xuLyoqIEB0eXBlIHtSZXZlcnNlfSAqLyRozY9fb25jZS5tYXBLZXl3b3JkcyhtYXBLZXl3b3Jkcyk7XG5jb25zdCByZXZlcnNlID0gKGtleXdvcmRSZWNvcmQgPSB7fSkgPT4ge1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGZyb21VbmlxdWVFbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoa2V5d29yZFJlY29yZCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFt2YWx1ZSwga2V5XSksXG4gICAgKSxcbiAgKTtcbn07XG5cbi8qKlxuICogTWFrZSBhbiBvZmZlciB0byBhbm90aGVyIGNvbnRyYWN0IGluc3RhbmNlIChsYWJlbGVkIGNvbnRyYWN0QiBiZWxvdyksXG4gKiB3aXRoZHJhd2luZyB0aGUgcGF5bWVudHMgZm9yIHRoZSBvZmZlciBmcm9tIGEgc2VhdCBpbiB0aGUgY3VycmVudFxuICogY29udHJhY3QgaW5zdGFuY2UgKGNvbnRyYWN0QSkgYW5kIGRlcG9zaXRpbmcgdGhlIHBheW91dHMgaW4gYW5vdGhlclxuICogc2VhdCBpbiB0aGUgY3VycmVudCBjb250cmFjdCBpbnN0YW5jZSAoY29udHJhY3RBKS5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiAgIFpvZSBDb250cmFjdCBGYWNldCBmb3IgY29udHJhY3RBXG4gKlxuICogQHBhcmFtIHtFUmVmPEludml0YXRpb248UmVzdWx0LCBBcmdzPj59IGludml0YXRpb25cbiAqICAgSW52aXRhdGlvbiB0byBjb250cmFjdEJcbiAqXG4gKiBAcGFyYW0ge0tleXdvcmRLZXl3b3JkUmVjb3JkIHwgdW5kZWZpbmVkfSBrZXl3b3JkTWFwcGluZ1xuICogICBNYXBwaW5nIG9mIGtleXdvcmRzIHVzZWQgaW4gY29udHJhY3RBIHRvIGtleXdvcmRzIHRvIGJlIHVzZWQgaW5cbiAqICAgY29udHJhY3RCLiBOb3RlIHRoYXQgdGhlIHBhdGh3YXkgdG8gZGVwb3NpdCB0aGUgcGF5b3V0IGJhY2sgdG9cbiAqICAgY29udHJhY3RBIHJldmVyc2VzIHRoaXMgbWFwcGluZy5cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsfSBwcm9wb3NhbFxuICogICBUaGUgcHJvcG9zYWwgZm9yIHRoZSBvZmZlciB0byBiZSBtYWRlIHRvIGNvbnRyYWN0QlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gZnJvbVNlYXRcbiAqICAgVGhlIHNlYXQgaW4gY29udHJhY3RBIHRvIHRha2UgdGhlIG9mZmVyIHBheW1lbnRzIGZyb20uXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBbdG9TZWF0XVxuICogICBUaGUgc2VhdCBpbiBjb250cmFjdEEgdG8gZGVwb3NpdCB0aGUgcGF5b3V0IG9mIHRoZSBvZmZlciB0by5cbiAqICAgSWYgYHRvU2VhdGAgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGRlZmF1bHRzIHRvIHRoZSBgZnJvbVNlYXRgLlxuICpcbiAqIEBwYXJhbSB7QXJnc30gW29mZmVyQXJnc11cbiAqICAgQWRkaXRpb25hbCBjb250cmFjdC1zcGVjaWZpYyBvcHRpb25hbCBhcmd1bWVudHMgaW4gYSByZWNvcmQuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8e3VzZXJTZWF0UHJvbWlzZTogUHJvbWlzZTxVc2VyU2VhdDxSZXN1bHQ+PiwgZGVwb3NpdGVkOiBQcm9taXNlPEFtb3VudEtleXdvcmRSZWNvcmQ+fT59XG4gKiAgIEEgcHJvbWlzZSBmb3IgdGhlIHVzZXJTZWF0IGZvciB0aGUgb2ZmZXIgdG8gdGhlIG90aGVyIGNvbnRyYWN0LCBhbmQgYVxuICogICBwcm9taXNlIChgZGVwb3NpdGVkYCkgd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcGF5b3V0IGZvciB0aGUgb2ZmZXIgaGFzIGJlZW5cbiAqICAgZGVwb3NpdGVkIHRvIHRoZSBgdG9TZWF0YC5cbiAqICAgQW55IGZhaWx1cmVzIG9mIHRoZSBpbnZpdGF0aW9uIHdpbGwgYmUgcmV0dXJuZWQgYnkgYHVzZXJTZWF0UHJvbWlzZS5nZXRPZmZlclJlc3VsdCgpYC5cbiAqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gQXJncyBPZmZlciBhcmdzXG4gKiBAdGVtcGxhdGUge29iamVjdH0gUmVzdWx0IE9mZmVyIHJlc3VsdFxuICovXG4gICAgICAgY29uc3Qgb2ZmZXJUbyA9IGFzeW5jIChcbiAgemNmLFxuICBpbnZpdGF0aW9uLFxuICBrZXl3b3JkTWFwcGluZyxcbiAgcHJvcG9zYWwsXG4gIGZyb21TZWF0LFxuICB0b1NlYXQsXG4gIG9mZmVyQXJncyxcbikgPT4ge1xuICBpZiAoa2V5d29yZE1hcHBpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIGtleXdvcmRNYXBwaW5nID0gaGFyZGVuKHt9KTtcbiAgfVxuXG4gIGNvbnN0IGRlZmluZWRUb1NlYXQgPSB0b1NlYXQgIT09IHVuZGVmaW5lZCA/IHRvU2VhdCA6IGZyb21TZWF0O1xuXG4gIGNvbnN0IHpvZSA9IHpjZi5nZXRab2VTZXJ2aWNlKCk7XG4gIGNvbnN0IG1hcHBpbmdSZXZlcnNlZCA9IHJldmVyc2Uoa2V5d29yZE1hcHBpbmcpO1xuXG4gIGNvbnN0IG5ld0tleXdvcmRzID1cbiAgICBwcm9wb3NhbCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IG1hcEtleXdvcmRzKHByb3Bvc2FsLmdpdmUsIG1hcHBpbmdSZXZlcnNlZClcbiAgICAgIDogaGFyZGVuKHt9KTtcblxuICAvKiB0aGUgcHJvcG9zYWwgaXMgaW4gdGhlIG90aGVyIGNvbnRyYWN0J3Mga2V5d29yZHMsIGJ1dCB3ZSB3YW50IHRvKi9cbiAgLyogdXNlIGBwcm9wb3NhbC5naXZlYCB0byB3aXRoZHJhdyovXG4gIGNvbnN0IHBheW1lbnRzID0gYXdhaXQgd2l0aGRyYXdGcm9tU2VhdCh6Y2YsIGZyb21TZWF0LCBuZXdLZXl3b3Jkcyk7XG5cbiAgLyogTWFwIHRvIHRoZSBvdGhlciBjb250cmFjdCdzIGtleXdvcmRzKi9cbiAgY29uc3QgcGF5bWVudHNGb3JPdGhlckNvbnRyYWN0ID0gbWFwS2V5d29yZHMocGF5bWVudHMsIGtleXdvcmRNYXBwaW5nKTtcblxuICBjb25zdCB1c2VyU2VhdFByb21pc2UgPSBFKHpvZSkub2ZmZXIoXG4gICAgaW52aXRhdGlvbixcbiAgICBwcm9wb3NhbCxcbiAgICBwYXltZW50c0Zvck90aGVyQ29udHJhY3QsXG4gICAgb2ZmZXJBcmdzLFxuICApO1xuXG4gIGNvbnN0IGRlcG9zaXRlZFByb21pc2VLaXQgPSBtYWtlUHJvbWlzZUtpdCgpO1xuXG4gIGNvbnN0IGRvRGVwb3NpdCA9IGFzeW5jIHBheW91dFBheW1lbnRzID0+IHtcbiAgICAvKiBhZnRlciBnZXRQYXlvdXRzKCksIGdldEZpbmFsQWxsb2NhdGlvbigpIHJlc29sdmVzIHByb21wdGx5LiovXG4gICAgY29uc3QgYW1vdW50cyA9IGF3YWl0IEUodXNlclNlYXRQcm9taXNlKS5nZXRGaW5hbEFsbG9jYXRpb24oKTtcblxuICAgIC8qIE1hcCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250cmFjdCdzIGtleXdvcmRzKi9cbiAgICBjb25zdCBtYXBwZWRBbW91bnRzID0gbWFwS2V5d29yZHMoYW1vdW50cywgbWFwcGluZ1JldmVyc2VkKTtcbiAgICBjb25zdCBtYXBwZWRQYXltZW50cyA9IG1hcEtleXdvcmRzKHBheW91dFBheW1lbnRzLCBtYXBwaW5nUmV2ZXJzZWQpO1xuICAgIGF3YWl0IGRlcG9zaXRUb1NlYXQoemNmLCBkZWZpbmVkVG9TZWF0LCBtYXBwZWRBbW91bnRzLCBtYXBwZWRQYXltZW50cyk7XG4gICAgZGVwb3NpdGVkUHJvbWlzZUtpdC5yZXNvbHZlKG1hcHBlZEFtb3VudHMpO1xuICB9O1xuXG4gIHZvaWQgRSh1c2VyU2VhdFByb21pc2UpLmdldFBheW91dHMoKS50aGVuKGRvRGVwb3NpdCk7XG5cbiAgLyogVE9ETyByZW5hbWUgcmV0dXJuIGtleTsgdXNlclNlYXRQcm9taXNlIGlzIGEgcmVtb3RlIFVzZXJTZWF0Ki9cbiAgcmV0dXJuIGhhcmRlbih7IHVzZXJTZWF0UHJvbWlzZSwgZGVwb3NpdGVkOiBkZXBvc2l0ZWRQcm9taXNlS2l0LnByb21pc2UgfSk7XG59OyRozY9fb25jZS5vZmZlclRvKG9mZmVyVG8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciOlsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciXSwiYXNzZXJ0SXNzdWVyS2V5d29yZHMiOlsiYXNzZXJ0SXNzdWVyS2V5d29yZHMiXSwic2F0aXNmaWVzIjpbInNhdGlzZmllcyJdLCJzd2FwIjpbInN3YXAiXSwic3dhcEV4YWN0IjpbInN3YXBFeGFjdCJdLCJmaXRQcm9wb3NhbFNoYXBlIjpbImZpdFByb3Bvc2FsU2hhcGUiXSwiYXNzZXJ0UHJvcG9zYWxTaGFwZSI6WyJhc3NlcnRQcm9wb3NhbFNoYXBlIl0sImFzc2VydE5hdEFzc2V0S2luZCI6WyJhc3NlcnROYXRBc3NldEtpbmQiXSwiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciOlsiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciXSwiZGVwb3NpdFRvU2VhdCI6WyJkZXBvc2l0VG9TZWF0Il0sIndpdGhkcmF3RnJvbVNlYXQiOlsid2l0aGRyYXdGcm9tU2VhdCJdLCJzYXZlQWxsSXNzdWVycyI6WyJzYXZlQWxsSXNzdWVycyJdLCJtYXBLZXl3b3JkcyI6WyJtYXBLZXl3b3JkcyJdLCJvZmZlclRvIjpbIm9mZmVyVG8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAdP0S0hLAABISwAAJQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3RpbWUiXSwiZXhwb3J0cyI6WyJBZG1pbkZhY2V0SSIsIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSIsIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiLCJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSIsIkJ1bmRsZUNhcFNoYXBlIiwiQnVuZGxlU2hhcGUiLCJFbXB0eVByb3Bvc2FsU2hhcGUiLCJFeGl0T2JqZWN0SSIsIkV4aXRPYmplY3RTaGFwZSIsIkZlZU1pbnRBY2Nlc3NTaGFwZSIsIkZ1bGxQcm9wb3NhbFNoYXBlIiwiSGFuZGxlSSIsIkhhbmRsZU9mZmVySSIsIkluc3RhbGxhdGlvblNoYXBlIiwiSW5zdGFuY2VBZG1pbkkiLCJJbnN0YW5jZUFkbWluU2hhcGUiLCJJbnN0YW5jZUhhbmRsZVNoYXBlIiwiSW5zdGFuY2VSZWNvcmRTaGFwZSIsIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0IiwiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSIsIkludml0YXRpb25IYW5kbGVTaGFwZSIsIkludml0YXRpb25TaGFwZSIsIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSIsIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJSZWNvcmRTaGFwZSIsIktleXdvcmRTaGFwZSIsIk9mZmVySGFuZGxlckkiLCJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSIsIlByaWNlUXVvdGVTaGFwZSIsIlByb3Bvc2FsU2hhcGUiLCJTZWF0RGF0YVNoYXBlIiwiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiLCJTZWF0U2hhcGUiLCJUZXJtc1NoYXBlIiwiVGltZXJTaGFwZSIsIlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlIiwiWm9lTWludEkiLCJab2VNaW50U2hhcGUiLCJab2VTZXJ2aWNlSSIsIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCIsImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIiwiaXNPbkRlbWFuZEV4aXRSdWxlIiwiaXNXYWl2ZWRFeGl0UnVsZSIsIm1ha2VIYW5kbGVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEFtb3VudFNoYXBlLEFzc2V0S2luZFNoYXBlLEJyYW5kU2hhcGUsRGlzcGxheUluZm9TaGFwZSxJc3N1ZXJLaXRTaGFwZSxJc3N1ZXJTaGFwZSxQYXltZW50U2hhcGUsU3Vic2NyaWJlclNoYXBlLE0sVGltZXN0YW1wU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudFNoYXBlXCIsWyRozY9fYSA9PiAoQW1vdW50U2hhcGUgPSAkaM2PX2EpXV0sW1wiQXNzZXRLaW5kU2hhcGVcIixbJGjNj19hID0+IChBc3NldEtpbmRTaGFwZSA9ICRozY9fYSldXSxbXCJCcmFuZFNoYXBlXCIsWyRozY9fYSA9PiAoQnJhbmRTaGFwZSA9ICRozY9fYSldXSxbXCJEaXNwbGF5SW5mb1NoYXBlXCIsWyRozY9fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRozY9fYSldXSxbXCJJc3N1ZXJLaXRTaGFwZVwiLFskaM2PX2EgPT4gKElzc3VlcktpdFNoYXBlID0gJGjNj19hKV1dLFtcIklzc3VlclNoYXBlXCIsWyRozY9fYSA9PiAoSXNzdWVyU2hhcGUgPSAkaM2PX2EpXV0sW1wiUGF5bWVudFNoYXBlXCIsWyRozY9fYSA9PiAoUGF5bWVudFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsWyRozY9fYSA9PiAoU3Vic2NyaWJlclNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7VHlwZWRQYXR0ZXJufSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0FmdGVyRGVhZGxpbmVFeGl0UnVsZSwgSW5zdGFsbGF0aW9uLCBab2VJc3N1ZXJSZWNvcmR9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0V4aXRSdWxlLCBJbnZpdGF0aW9uLCBJbnZpdGF0aW9uSGFuZGxlLCBXYWl2ZWRFeGl0UnVsZX0gZnJvbSAnLi90eXBlcy1pbmRleC5qcyc7XG4gKiBAaW1wb3J0IHtJbnZpdGF0aW9uRGV0YWlsc30gZnJvbSAnLi90eXBlcy1pbmRleC5qcyc7XG4gKi9cblxuLyoga2V5d29yZHMgaGF2ZSBhbiBpbml0aWFsIGNhcCovXG4gICAgICAgY29uc3QgS2V5d29yZFNoYXBlID0gTS5zdHJpbmcoKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48SW52aXRhdGlvbkhhbmRsZT59ICovJGjNj19vbmNlLktleXdvcmRTaGFwZShLZXl3b3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IEludml0YXRpb25IYW5kbGVTaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uSGFuZGxlJyk7XG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxJbnZpdGF0aW9uPn0gKi8kaM2PX29uY2UuSW52aXRhdGlvbkhhbmRsZVNoYXBlKEludml0YXRpb25IYW5kbGVTaGFwZSk7XG4gICAgICAgY29uc3QgSW52aXRhdGlvblNoYXBlID0gTS5yZW1vdGFibGUoJ0ludml0YXRpb24nKTskaM2PX29uY2UuSW52aXRhdGlvblNoYXBlKEludml0YXRpb25TaGFwZSk7XG4gICAgICAgY29uc3QgSW5zdGFuY2VIYW5kbGVTaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnN0YW5jZUhhbmRsZScpO1xuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48SW5zdGFsbGF0aW9uPn0gKi8kaM2PX29uY2UuSW5zdGFuY2VIYW5kbGVTaGFwZShJbnN0YW5jZUhhbmRsZVNoYXBlKTtcbiAgICAgICBjb25zdCBJbnN0YWxsYXRpb25TaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKTskaM2PX29uY2UuSW5zdGFsbGF0aW9uU2hhcGUoSW5zdGFsbGF0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IFNlYXRTaGFwZSA9IE0ucmVtb3RhYmxlKCdTZWF0Jyk7JGjNj19vbmNlLlNlYXRTaGFwZShTZWF0U2hhcGUpO1xuXG4gICAgICAgY29uc3QgQW1vdW50S2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsIEFtb3VudFNoYXBlKTskaM2PX29uY2UuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoXG4gIEtleXdvcmRTaGFwZSxcbiAgTS5wYXR0ZXJuKCksXG4pOyRozY9fb25jZS5BbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihcbiAgS2V5d29yZFNoYXBlLFxuICBNLmVyZWYoUGF5bWVudFNoYXBlKSxcbik7JGjNj19vbmNlLlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKEtleXdvcmRTaGFwZSwgSXNzdWVyU2hhcGUpOyRozY9fb25jZS5Jc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihcbiAgS2V5d29yZFNoYXBlLFxuICBNLmVyZWYoSXNzdWVyU2hhcGUpLFxuKTskaM2PX29uY2UuSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZShJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLCBCcmFuZFNoYXBlKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48Wm9lSXNzdWVyUmVjb3JkPn0gKi8kaM2PX29uY2UuQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IElzc3VlclJlY29yZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGJyYW5kOiBCcmFuZFNoYXBlLFxuICAgIGlzc3VlcjogSXNzdWVyU2hhcGUsXG4gICAgYXNzZXRLaW5kOiBBc3NldEtpbmRTaGFwZSxcbiAgfSxcbiAgeyBkaXNwbGF5SW5mbzogRGlzcGxheUluZm9TaGFwZSB9LFxuKTskaM2PX29uY2UuSXNzdWVyUmVjb3JkU2hhcGUoSXNzdWVyUmVjb3JkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgVGVybXNTaGFwZSA9IHtcbiAgaXNzdWVyczogSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlLFxuICBicmFuZHM6IEJyYW5kS2V5d29yZFJlY29yZFNoYXBlLFxufTskaM2PX29uY2UuVGVybXNTaGFwZShUZXJtc1NoYXBlKTtcbmhhcmRlbihUZXJtc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IEluc3RhbmNlUmVjb3JkU2hhcGUgPSB7XG4gIGluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uU2hhcGUsXG4gIGluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxuICB0ZXJtczogTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSxcbn07JGjNj19vbmNlLkluc3RhbmNlUmVjb3JkU2hhcGUoSW5zdGFuY2VSZWNvcmRTaGFwZSk7XG5oYXJkZW4oSW5zdGFuY2VSZWNvcmRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBIYW5kbGVJID0gTS5pbnRlcmZhY2UoJ0hhbmRsZScsIHt9KTskaM2PX29uY2UuSGFuZGxlSShIYW5kbGVJKTtcblxuICAgICAgIGNvbnN0IG1ha2VIYW5kbGVTaGFwZSA9IG5hbWUgPT4gTS5yZW1vdGFibGUoYCR7bmFtZX1IYW5kbGVgKTskaM2PX29uY2UubWFrZUhhbmRsZVNoYXBlKG1ha2VIYW5kbGVTaGFwZSk7XG4gICAgICAgY29uc3QgVGltZXJTaGFwZSA9IG1ha2VIYW5kbGVTaGFwZSgndGltZXInKTtcblxuLyoqXG4gKiBBZnRlciBkZWZhdWx0cyBhcmUgZmlsbGVkIGluXG4gKlxuICogQHNlZSB7UHJvcG9zYWxSZWNvcmR9IHR5cGVcbiAqLyRozY9fb25jZS5UaW1lclNoYXBlKFRpbWVyU2hhcGUpO1xuICAgICAgIGNvbnN0IEZ1bGxQcm9wb3NhbFNoYXBlID0ge1xuICB3YW50OiBBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlLFxuICBnaXZlOiBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4gIC8qIFRvIGFjY2VwdCBvbmx5IG9uZSwgd2UgY291bGQgdXNlIE0ub3IgcmF0aGVyIHRoYW4gTS5zcGxpdFJlY29yZCwqL1xuICAvKiBidXQgdGhlIGVycm9yIG1lc3NhZ2VzIHdvdWxkIGhhdmUgYmVlbiB3b3JzZS4gUmF0aGVyLCovXG4gIC8qIGNsZWFuUHJvcG9zYWwncyBhc3NlcnRFeGl0IGNoZWNrcyB0aGF0IHRoZXJlJ3MgZXhhY3RseSBvbmUuKi9cbiAgZXhpdDogTS5zcGxpdFJlY29yZChcbiAgICB7fSxcbiAgICB7XG4gICAgICBvbkRlbWFuZDogbnVsbCxcbiAgICAgIHdhaXZlZDogbnVsbCxcbiAgICAgIGFmdGVyRGVhZGxpbmU6IHtcbiAgICAgICAgdGltZXI6IE0uZXJlZihUaW1lclNoYXBlKSxcbiAgICAgICAgZGVhZGxpbmU6IFRpbWVzdGFtcFNoYXBlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHt9LFxuICApLFxufTskaM2PX29uY2UuRnVsbFByb3Bvc2FsU2hhcGUoRnVsbFByb3Bvc2FsU2hhcGUpO1xuaGFyZGVuKEZ1bGxQcm9wb3NhbFNoYXBlKTtcblxuLyoqIEBzZWUge1Byb3Bvc2FsfSB0eXBlICovXG4gICAgICAgY29uc3QgUHJvcG9zYWxTaGFwZSA9IE0uc3BsaXRSZWNvcmQoe30sIEZ1bGxQcm9wb3NhbFNoYXBlLCB7fSk7JGjNj19vbmNlLlByb3Bvc2FsU2hhcGUoUHJvcG9zYWxTaGFwZSk7XG5cbiAgICAgICBjb25zdCBFbXB0eVByb3Bvc2FsU2hhcGUgPSBNLnNwbGl0UmVjb3JkKHtcbiAgZ2l2ZToge30sXG4gIHdhbnQ6IHt9LFxuICBleGl0OiB7IG9uRGVtYW5kOiBudWxsIH0sXG59KTskaM2PX29uY2UuRW1wdHlQcm9wb3NhbFNoYXBlKEVtcHR5UHJvcG9zYWxTaGFwZSk7XG5cbiAgICAgICBjb25zdCBpc09uRGVtYW5kRXhpdFJ1bGUgPSBleGl0ID0+IHtcbiAgY29uc3QgW2V4aXRLZXldID0gT2JqZWN0LmtleXMoZXhpdCk7XG4gIHJldHVybiBleGl0S2V5ID09PSAnb25EZW1hbmQnO1xufTskaM2PX29uY2UuaXNPbkRlbWFuZEV4aXRSdWxlKGlzT25EZW1hbmRFeGl0UnVsZSk7XG5oYXJkZW4oaXNPbkRlbWFuZEV4aXRSdWxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKiBAcmV0dXJucyB7ZXhpdCBpcyBXYWl2ZWRFeGl0UnVsZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzV2FpdmVkRXhpdFJ1bGUgPSBleGl0ID0+IHtcbiAgY29uc3QgW2V4aXRLZXldID0gT2JqZWN0LmtleXMoZXhpdCk7XG4gIHJldHVybiBleGl0S2V5ID09PSAnd2FpdmVkJztcbn07JGjNj19vbmNlLmlzV2FpdmVkRXhpdFJ1bGUoaXNXYWl2ZWRFeGl0UnVsZSk7XG5oYXJkZW4oaXNXYWl2ZWRFeGl0UnVsZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgQWZ0ZXJEZWFkbGluZUV4aXRSdWxlfVxuICovXG4gICAgICAgY29uc3QgaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUgPSBleGl0ID0+IHtcbiAgY29uc3QgW2V4aXRLZXldID0gT2JqZWN0LmtleXMoZXhpdCk7XG4gIHJldHVybiBleGl0S2V5ID09PSAnYWZ0ZXJEZWFkbGluZSc7XG59OyRozY9fb25jZS5pc0FmdGVyRGVhZGxpbmVFeGl0UnVsZShpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSk7XG5oYXJkZW4oaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxJbnZpdGF0aW9uRGV0YWlscz59ICovXG4gICAgICAgY29uc3QgSW52aXRhdGlvbkVsZW1lbnRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoe1xuICBkZXNjcmlwdGlvbjogTS5zdHJpbmcoKSxcbiAgaGFuZGxlOiBJbnZpdGF0aW9uSGFuZGxlU2hhcGUsXG4gIGluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxuICBpbnN0YWxsYXRpb246IEluc3RhbGxhdGlvblNoYXBlLFxufSk7JGjNj19vbmNlLkludml0YXRpb25FbGVtZW50U2hhcGUoSW52aXRhdGlvbkVsZW1lbnRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBPZmZlckhhbmRsZXJJID0gTS5pbnRlcmZhY2UoJ09mZmVySGFuZGxlcicsIHtcbiAgaGFuZGxlOiBNLmNhbGwoU2VhdFNoYXBlKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpLFxufSk7JGjNj19vbmNlLk9mZmVySGFuZGxlckkoT2ZmZXJIYW5kbGVySSk7XG5cbiAgICAgICBjb25zdCBTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSA9IE0uYXJyYXlPZih7XG4gIHNlYXRIYW5kbGU6IFNlYXRTaGFwZSxcbiAgYWxsb2NhdGlvbjogQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxufSk7JGjNj19vbmNlLlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFpvZU1pbnRTaGFwZSA9IE0ucmVtb3RhYmxlKCdab2VNaW50Jyk7JGjNj19vbmNlLlpvZU1pbnRTaGFwZShab2VNaW50U2hhcGUpO1xuICAgICAgIGNvbnN0IFpvZU1pbnRJID0gTS5pbnRlcmZhY2UoJ1pvZU1pbnQnLCB7XG4gIGdldElzc3VlclJlY29yZDogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJSZWNvcmRTaGFwZSksXG4gIG1pbnRBbmRFc2Nyb3c6IE0uY2FsbChBbW91bnRTaGFwZSkucmV0dXJucygpLFxuICB3aXRoZHJhd0FuZEJ1cm46IE0uY2FsbChBbW91bnRTaGFwZSkucmV0dXJucygpLFxufSk7JGjNj19vbmNlLlpvZU1pbnRJKFpvZU1pbnRJKTtcblxuICAgICAgIGNvbnN0IEZlZU1pbnRBY2Nlc3NTaGFwZSA9IE0ucmVtb3RhYmxlKCdGZWVNaW50QWNjZXNzJyk7JGjNj19vbmNlLkZlZU1pbnRBY2Nlc3NTaGFwZShGZWVNaW50QWNjZXNzU2hhcGUpO1xuXG4gICAgICAgY29uc3QgRXhpdE9iamVjdEkgPSBNLmludGVyZmFjZSgnRXhpdCBPYmplY3QnLCB7XG4gIGV4aXQ6IE0uY2FsbCgpLnJldHVybnMoKSxcbn0pOyRozY9fb25jZS5FeGl0T2JqZWN0SShFeGl0T2JqZWN0SSk7XG5cbiAgICAgICBjb25zdCBFeGl0T2JqZWN0U2hhcGUgPSBNLnJlbW90YWJsZSgnRXhpdE9iaicpOyRozY9fb25jZS5FeGl0T2JqZWN0U2hhcGUoRXhpdE9iamVjdFNoYXBlKTtcbiAgICAgICBjb25zdCBJbnN0YW5jZUFkbWluU2hhcGUgPSBNLnJlbW90YWJsZSgnSW5zdGFuY2VBZG1pbicpOyRozY9fb25jZS5JbnN0YW5jZUFkbWluU2hhcGUoSW5zdGFuY2VBZG1pblNoYXBlKTtcbiAgICAgICBjb25zdCBJbnN0YW5jZUFkbWluSSA9IE0uaW50ZXJmYWNlKCdJbnN0YW5jZUFkbWluJywge1xuICBtYWtlSW52aXRhdGlvbjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSwgTS5zdHJpbmcoKSlcbiAgICAub3B0aW9uYWwoTS5yZWNvcmQoKSwgTS5wYXR0ZXJuKCkpXG4gICAgLnJldHVybnMoSW52aXRhdGlvblNoYXBlKSxcbiAgc2F2ZUlzc3VlcjogTS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSwgS2V5d29yZFNoYXBlKS5yZXR1cm5zKFxuICAgIElzc3VlclJlY29yZFNoYXBlLFxuICApLFxuICBtYWtlTm9Fc2Nyb3dTZWF0OiBNLmNhbGwoXG4gICAgQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuICAgIFByb3Bvc2FsU2hhcGUsXG4gICAgRXhpdE9iamVjdFNoYXBlLFxuICAgIFNlYXRTaGFwZSxcbiAgKS5yZXR1cm5zKFNlYXRTaGFwZSksXG4gIGV4aXRBbGxTZWF0czogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbiAgZmFpbEFsbFNlYXRzOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBleGl0U2VhdDogTS5jYWxsKFNlYXRTaGFwZSwgTS5hbnkoKSkucmV0dXJucygpLFxuICBmYWlsU2VhdDogTS5jYWxsKFNlYXRTaGFwZSwgTS5hbnkoKSkucmV0dXJucygpLFxuICBtYWtlWm9lTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSlcbiAgICAub3B0aW9uYWwoXG4gICAgICBBc3NldEtpbmRTaGFwZSxcbiAgICAgIERpc3BsYXlJbmZvU2hhcGUsXG4gICAgICBNLnNwbGl0UmVjb3JkKHt9LCB7IGVsZW1lbnRTaGFwZTogTS5wYXR0ZXJuKCkgfSksXG4gICAgKVxuICAgIC5yZXR1cm5zKE0ucmVtb3RhYmxlKCd6b2VNaW50JykpLFxuICByZWdpc3RlckZlZU1pbnQ6IE0uY2FsbChLZXl3b3JkU2hhcGUsIEZlZU1pbnRBY2Nlc3NTaGFwZSkucmV0dXJucyhcbiAgICBNLnJlbW90YWJsZSgnZmVlTWludCcpLFxuICApLFxuICByZXBsYWNlQWxsb2NhdGlvbnM6IE0uY2FsbChTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSkucmV0dXJucygpLFxuICBzdG9wQWNjZXB0aW5nT2ZmZXJzOiBNLmNhbGwoKS5yZXR1cm5zKCksXG4gIHNldE9mZmVyRmlsdGVyOiBNLmNhbGwoTS5hcnJheU9mKE0uc3RyaW5nKCkpKS5yZXR1cm5zKCksXG4gIGdldE9mZmVyRmlsdGVyOiBNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG4gIGdldEV4aXRTdWJzY3JpYmVyOiBNLmNhbGwoU2VhdFNoYXBlKS5yZXR1cm5zKFN1YnNjcmliZXJTaGFwZSksXG4gIGlzQmxvY2tlZDogTS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICByZXBhaXJDb250cmFjdENvbXBsZXRpb25XYXRjaGVyOiBNLmNhbGwoKS5yZXR1cm5zKCksXG59KTskaM2PX29uY2UuSW5zdGFuY2VBZG1pbkkoSW5zdGFuY2VBZG1pbkkpO1xuXG4gICAgICAgY29uc3QgSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQgPSB7XG4gIGluc3RhbmNlU3RvcmFnZU1hbmFnZXI6IE0uaW50ZXJmYWNlKCdJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyJywge1xuICAgIGdldFRlcm1zOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSkpLFxuICAgIGdldElzc3VlcnM6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbiAgICBnZXRCcmFuZHM6IE0uY2FsbCgpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuICAgIGdldEluc3RhbGxhdGlvbjogTS5jYWxsKCkucmV0dXJucyhJbnN0YWxsYXRpb25TaGFwZSksXG4gICAgZ2V0SW52aXRhdGlvbklzc3VlcjogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5cbiAgICBzYXZlSXNzdWVyOiBNLmNhbGwoSXNzdWVyU2hhcGUsIEtleXdvcmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgbWFrZVpvZU1pbnQ6IE0uY2FsbChLZXl3b3JkU2hhcGUpXG4gICAgICAub3B0aW9uYWwoXG4gICAgICAgIEFzc2V0S2luZFNoYXBlLFxuICAgICAgICBEaXNwbGF5SW5mb1NoYXBlLFxuICAgICAgICBNLnNwbGl0UmVjb3JkKHt9LCB7IGVsZW1lbnRTaGFwZTogTS5wYXR0ZXJuKCkgfSksXG4gICAgICApXG4gICAgICAucmV0dXJucyhNLmVyZWYoWm9lTWludFNoYXBlKSksXG4gICAgcmVnaXN0ZXJGZWVNaW50OiBNLmNhbGwoS2V5d29yZFNoYXBlLCBGZWVNaW50QWNjZXNzU2hhcGUpLnJldHVybnMoXG4gICAgICBNLnJlbW90YWJsZSgnZmVlTWludCcpLFxuICAgICksXG4gICAgZ2V0SW5zdGFuY2VSZWNvcmQ6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VSZWNvcmRTaGFwZSksXG4gICAgZ2V0SXNzdWVyUmVjb3JkczogTS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoSXNzdWVyUmVjb3JkU2hhcGUpKSxcbiAgICBnZXRXaXRoZHJhd0ZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdXaXRoZHJhd0ZhY2V0JykpLFxuICAgIGluaXRJbnN0YW5jZUFkbWluOiBNLmNhbGwoXG4gICAgICBJbnN0YW5jZUhhbmRsZVNoYXBlLFxuICAgICAgTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKSxcbiAgICApLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIGRlbGV0ZUluc3RhbmNlQWRtaW46IE0uY2FsbChJbnN0YW5jZUFkbWluU2hhcGUpLnJldHVybnMoKSxcbiAgICBtYWtlSW52aXRhdGlvbjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSwgTS5zdHJpbmcoKSlcbiAgICAgIC5vcHRpb25hbChNLnJlY29yZCgpLCBNLnBhdHRlcm4oKSlcbiAgICAgIC5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG4gICAgZ2V0Um9vdDogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbiAgICBnZXRBZG1pbk5vZGU6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpKSxcbiAgfSksXG4gIHdpdGhkcmF3RmFjZXQ6IE0uaW50ZXJmYWNlKCdXaXRoZHJhd0ZhY2V0Jywge1xuICAgIHdpdGhkcmF3UGF5bWVudHM6IE0uY2FsbChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG4gICAgICBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgICApLFxuICB9KSxcbiAgaGVscGVyczogTS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXIgaGVscGVyJywge1xuICAgIHdyYXBJc3N1ZXJLaXRXaXRoWm9lTWludDogTS5jYWxsKFxuICAgICAgS2V5d29yZFNoYXBlLFxuICAgICAgSXNzdWVyS2l0U2hhcGUsXG4gICAgICBNLnJlbW90YWJsZSgnYWRtaW5Ob2RlJyksXG4gICAgKS5yZXR1cm5zKFpvZU1pbnRTaGFwZSksXG4gIH0pLFxufTskaM2PX29uY2UuSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQoSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuaGFyZGVuKEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuICAgICAgIGNvbnN0IEJ1bmRsZUNhcFNoYXBlID0gTS5yZW1vdGFibGUoJ2J1bmRsZUNhcCcpOyRozY9fb25jZS5CdW5kbGVDYXBTaGFwZShCdW5kbGVDYXBTaGFwZSk7XG4gICAgICAgY29uc3QgQnVuZGxlU2hhcGUgPSBNLmFuZChcbiAgTS5zcGxpdFJlY29yZCh7IG1vZHVsZUZvcm1hdDogTS5hbnkoKSB9KSxcbiAgTS5yZWNvcmRPZihNLnN0cmluZygpLCBNLnN0cmluZyh7IHN0cmluZ0xlbmd0aExpbWl0OiBJbmZpbml0eSB9KSksXG4pOyRozY9fb25jZS5CdW5kbGVTaGFwZShCdW5kbGVTaGFwZSk7XG5cbiAgICAgICBjb25zdCBVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHsgaW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb25TaGFwZSB9LFxuICB7XG4gICAgYnVuZGxlOiBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0uc3RyaW5nKHsgc3RyaW5nTGVuZ3RoTGltaXQ6IEluZmluaXR5IH0pKSxcbiAgICBidW5kbGVDYXA6IEJ1bmRsZUNhcFNoYXBlLFxuICAgIGJ1bmRsZUlEOiBNLnN0cmluZygpLFxuICB9LFxuICB7fSxcbik7JGjNj19vbmNlLlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlKFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IFpvZVN0b3JhZ2VNYW5hZ2VySUtpdCA9IHtcbiAgem9lU2VydmljZURhdGFBY2Nlc3M6IE0uaW50ZXJmYWNlKCdab2VTZXJ2aWNlIGRhdGFBY2Nlc3MnLCB7XG4gICAgZ2V0VGVybXM6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSkpLFxuICAgIGdldElzc3VlcnM6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgZ2V0QnJhbmRzOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgZ2V0SW5zdGFsbGF0aW9uOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICAgIE0uZXJlZihNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpLFxuICAgICksXG4gICAgZ2V0SW52aXRhdGlvbklzc3VlcjogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5cbiAgICBnZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246IE0uY2FsbChJbnN0YWxsYXRpb25TaGFwZSkucmV0dXJucyhcbiAgICAgIE0uZXJlZihNLnN0cmluZygpKSxcbiAgICApLFxuICAgIGluc3RhbGxCdW5kbGU6IE0uY2FsbChCdW5kbGVTaGFwZSlcbiAgICAgIC5vcHRpb25hbChNLnN0cmluZygpKVxuICAgICAgLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIGluc3RhbGxCdW5kbGVJRDogTS5jYWxsKE0uc3RyaW5nKCkpXG4gICAgICAub3B0aW9uYWwoTS5zdHJpbmcoKSlcbiAgICAgIC5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblxuICAgIGdldFB1YmxpY0ZhY2V0OiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICAgIE0uZXJlZihNLnJlbW90YWJsZSgnUHVibGljRmFjZXQnKSksXG4gICAgKSxcbiAgICBnZXRPZmZlckZpbHRlcjogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbiAgICBnZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICAgIE0ub3B0KE0ucGF0dGVybigpKSxcbiAgICApLFxuICB9KSxcbiAgbWFrZU9mZmVyQWNjZXNzOiBNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBtYWtlT2ZmZXIgYWNjZXNzJywge1xuICAgIGdldEFzc2V0S2luZEJ5QnJhbmQ6IE0uY2FsbChCcmFuZFNoYXBlKS5yZXR1cm5zKEFzc2V0S2luZFNoYXBlKSxcbiAgICBnZXRJbnN0YW5jZUFkbWluOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICAgIE0ucmVtb3RhYmxlKCdpbnN0YW5jZUFkbWluJyksXG4gICAgKSxcbiAgICBnZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICAgIE0ub3B0KE0ucGF0dGVybigpKSxcbiAgICApLFxuICAgIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuICAgIGRlcG9zaXRQYXltZW50czogTS5jYWxsKFByb3Bvc2FsU2hhcGUsIFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5wcm9taXNlKCksXG4gICAgKSxcbiAgfSksXG4gIHN0YXJ0SW5zdGFuY2VBY2Nlc3M6IE0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIHN0YXJ0SW5zdGFuY2UgYWNjZXNzJywge1xuICAgIG1ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyOiBNLmNhbGwoXG4gICAgICBJbnN0YWxsYXRpb25TaGFwZSxcbiAgICAgIE0uYW55KCksXG4gICAgICBJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLFxuICAgICAgSW5zdGFuY2VIYW5kbGVTaGFwZSxcbiAgICAgIE0ub3IoQnVuZGxlQ2FwU2hhcGUsIEJ1bmRsZVNoYXBlKSxcbiAgICAgIE0uc3RyaW5nKCksXG4gICAgKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICB1bndyYXBJbnN0YWxsYXRpb246IE0uY2FsbFdoZW4oTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSkucmV0dXJucyhcbiAgICAgIFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlLFxuICAgICksXG4gIH0pLFxuICBpbnZpdGF0aW9uSXNzdWVyQWNjZXNzOiBNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBpbnZpdGF0aW9uSXNzdWVyJywge1xuICAgIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuICB9KSxcbn07JGjNj19vbmNlLlpvZVN0b3JhZ2VNYW5hZ2VySUtpdChab2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuaGFyZGVuKFpvZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5cbiAgICAgICBjb25zdCBab2VTZXJ2aWNlSSA9IE0uaW50ZXJmYWNlKCdab2VTZXJ2aWNlJywge1xuICBpbnN0YWxsOiBNLmNhbGwoTS5hbnkoKSkub3B0aW9uYWwoTS5zdHJpbmcoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGluc3RhbGxCdW5kbGVJRDogTS5jYWxsKE0uc3RyaW5nKCkpLm9wdGlvbmFsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBzdGFydEluc3RhbmNlOiBNLmNhbGwoTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSlcbiAgICAub3B0aW9uYWwoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSwgTS5yZWNvcmQoKSwgTS5yZWNvcmQoKSwgTS5zdHJpbmcoKSlcbiAgICAucmV0dXJucyhNLnByb21pc2UoKSksXG4gIG9mZmVyOiBNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpXG4gICAgLm9wdGlvbmFsKFByb3Bvc2FsU2hhcGUsIFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlLCBNLmFueSgpKVxuICAgIC5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblxuICBnZXRPZmZlckZpbHRlcjogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIE0uYXJyYXlPZihNLnN0cmluZygpKSxcbiAgKSxcbiAgZ2V0SW52aXRhdGlvbklzc3VlcjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldEZlZUlzc3VlcjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldEJyYW5kczogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIEJyYW5kS2V5d29yZFJlY29yZFNoYXBlLFxuICApLFxuICBnZXRJc3N1ZXJzOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlLFxuICApLFxuICBnZXRQdWJsaWNGYWNldDogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpLFxuICApLFxuICBnZXRUZXJtczogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuICBnZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZTogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIE0uZXJlZihNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpLFxuICApLFxuICBnZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YWxsYXRpb25TaGFwZSkpLnJldHVybnMoXG4gICAgTS5lcmVmKE0uc3RyaW5nKCkpLFxuICApLFxuXG4gIGdldEluc3RhbGxhdGlvbjogTS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0SW5zdGFuY2U6IE0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldENvbmZpZ3VyYXRpb246IE0uY2FsbCgpLnJldHVybnMoe1xuICAgIGZlZUlzc3VlckNvbmZpZzoge1xuICAgICAgbmFtZTogTS5zdHJpbmcoKSxcbiAgICAgIGFzc2V0S2luZDogJ25hdCcsXG4gICAgICBkaXNwbGF5SW5mbzogRGlzcGxheUluZm9TaGFwZSxcbiAgICB9LFxuICB9KSxcbiAgZ2V0SW52aXRhdGlvbkRldGFpbHM6IE0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLmFueSgpKSxcbiAgZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgTS5vcHQoTS5wYXR0ZXJuKCkpLFxuICApLFxufSk7JGjNj19vbmNlLlpvZVNlcnZpY2VJKFpvZVNlcnZpY2VJKTtcblxuICAgICAgIGNvbnN0IEFkbWluRmFjZXRJID0gTS5pbnRlcmZhY2UoJ1pjZkFkbWluRmFjZXQnLCB7XG4gIGdldFZhdFNodXRkb3duUHJvbWlzZTogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHJlc3RhcnRDb250cmFjdDogTS5jYWxsKCkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHVwZ3JhZGVDb250cmFjdDogTS5jYWxsKE0uc3RyaW5nKCkpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICB0ZXJtaW5hdGVDb250cmFjdDogTS5jYWxsKE0uZXJyb3IoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG59KTskaM2PX29uY2UuQWRtaW5GYWNldEkoQWRtaW5GYWNldEkpO1xuXG4gICAgICAgY29uc3QgU2VhdERhdGFTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBwcm9wb3NhbDogUHJvcG9zYWxTaGFwZSxcbiAgICBpbml0aWFsQWxsb2NhdGlvbjogQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuICAgIHNlYXRIYW5kbGU6IFNlYXRTaGFwZSxcbiAgfSxcbiAge1xuICAgIG9mZmVyQXJnczogTS5hbnkoKSxcbiAgfSxcbik7JGjNj19vbmNlLlNlYXREYXRhU2hhcGUoU2VhdERhdGFTaGFwZSk7XG5cbiAgICAgICBjb25zdCBIYW5kbGVPZmZlckkgPSBNLmludGVyZmFjZSgnSGFuZGxlT2ZmZXInLCB7XG4gIGhhbmRsZU9mZmVyOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLCBTZWF0RGF0YVNoYXBlKS5yZXR1cm5zKHtcbiAgICBvZmZlclJlc3VsdFByb21pc2U6IE0ucHJvbWlzZSgpLFxuICAgIGV4aXRPYmo6IEV4aXRPYmplY3RTaGFwZSxcbiAgfSksXG59KTskaM2PX29uY2UuSGFuZGxlT2ZmZXJJKEhhbmRsZU9mZmVySSk7XG5cbiAgICAgICBjb25zdCBQcmljZVF1b3RlU2hhcGUgPSB7XG4gIHF1b3RlQW1vdW50OiBBbW91bnRTaGFwZSxcbiAgcXVvdGVQYXltZW50OiBNLmVyZWYoUGF5bWVudFNoYXBlKSxcbn07JGjNj19vbmNlLlByaWNlUXVvdGVTaGFwZShQcmljZVF1b3RlU2hhcGUpO1xuaGFyZGVuKFByaWNlUXVvdGVTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJLZXl3b3JkU2hhcGUiOlsiS2V5d29yZFNoYXBlIl0sIkludml0YXRpb25IYW5kbGVTaGFwZSI6WyJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiXSwiSW52aXRhdGlvblNoYXBlIjpbIkludml0YXRpb25TaGFwZSJdLCJJbnN0YW5jZUhhbmRsZVNoYXBlIjpbIkluc3RhbmNlSGFuZGxlU2hhcGUiXSwiSW5zdGFsbGF0aW9uU2hhcGUiOlsiSW5zdGFsbGF0aW9uU2hhcGUiXSwiU2VhdFNoYXBlIjpbIlNlYXRTaGFwZSJdLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIl0sIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSJdLCJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSI6WyJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSJdLCJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSI6WyJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJSZWNvcmRTaGFwZSI6WyJJc3N1ZXJSZWNvcmRTaGFwZSJdLCJUZXJtc1NoYXBlIjpbIlRlcm1zU2hhcGUiXSwiSW5zdGFuY2VSZWNvcmRTaGFwZSI6WyJJbnN0YW5jZVJlY29yZFNoYXBlIl0sIkhhbmRsZUkiOlsiSGFuZGxlSSJdLCJtYWtlSGFuZGxlU2hhcGUiOlsibWFrZUhhbmRsZVNoYXBlIl0sIlRpbWVyU2hhcGUiOlsiVGltZXJTaGFwZSJdLCJGdWxsUHJvcG9zYWxTaGFwZSI6WyJGdWxsUHJvcG9zYWxTaGFwZSJdLCJQcm9wb3NhbFNoYXBlIjpbIlByb3Bvc2FsU2hhcGUiXSwiRW1wdHlQcm9wb3NhbFNoYXBlIjpbIkVtcHR5UHJvcG9zYWxTaGFwZSJdLCJpc09uRGVtYW5kRXhpdFJ1bGUiOlsiaXNPbkRlbWFuZEV4aXRSdWxlIl0sImlzV2FpdmVkRXhpdFJ1bGUiOlsiaXNXYWl2ZWRFeGl0UnVsZSJdLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSI6WyJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSJdLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIjpbIkludml0YXRpb25FbGVtZW50U2hhcGUiXSwiT2ZmZXJIYW5kbGVySSI6WyJPZmZlckhhbmRsZXJJIl0sIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIjpbIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIl0sIlpvZU1pbnRTaGFwZSI6WyJab2VNaW50U2hhcGUiXSwiWm9lTWludEkiOlsiWm9lTWludEkiXSwiRmVlTWludEFjY2Vzc1NoYXBlIjpbIkZlZU1pbnRBY2Nlc3NTaGFwZSJdLCJFeGl0T2JqZWN0SSI6WyJFeGl0T2JqZWN0SSJdLCJFeGl0T2JqZWN0U2hhcGUiOlsiRXhpdE9iamVjdFNoYXBlIl0sIkluc3RhbmNlQWRtaW5TaGFwZSI6WyJJbnN0YW5jZUFkbWluU2hhcGUiXSwiSW5zdGFuY2VBZG1pbkkiOlsiSW5zdGFuY2VBZG1pbkkiXSwiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiXSwiQnVuZGxlQ2FwU2hhcGUiOlsiQnVuZGxlQ2FwU2hhcGUiXSwiQnVuZGxlU2hhcGUiOlsiQnVuZGxlU2hhcGUiXSwiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiOlsiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiXSwiWm9lU3RvcmFnZU1hbmFnZXJJS2l0IjpbIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJab2VTZXJ2aWNlSSI6WyJab2VTZXJ2aWNlSSJdLCJBZG1pbkZhY2V0SSI6WyJBZG1pbkZhY2V0SSJdLCJTZWF0RGF0YVNoYXBlIjpbIlNlYXREYXRhU2hhcGUiXSwiSGFuZGxlT2ZmZXJJIjpbIkhhbmRsZU9mZmVySSJdLCJQcmljZVF1b3RlU2hhcGUiOlsiUHJpY2VRdW90ZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANn0k7SWAQAAlgEAAB4AAABAYWdvcmljL3pvbmUtdjAuMi4yL2R1cmFibGUuanN7ImltcG9ydHMiOlsiLi9zcmMvZHVyYWJsZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2R1cmFibGUuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZHVyYWJsZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACAMlLK2hMAANoTAAAiAAAAQGFnb3JpYy96b25lLXYwLjIuMi9zcmMvZHVyYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvYmFzZS16b25lIl0sImV4cG9ydHMiOlsibWFrZUR1cmFibGVab25lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxGYXIsaXNQYXNzYWJsZSxjYW5CZUR1cmFibGUsbWFrZVNjYWxhck1hcFN0b3JlLHByZXBhcmVFeG8scHJlcGFyZUV4b0NsYXNzLHByZXBhcmVFeG9DbGFzc0tpdCxwcm92aWRlRHVyYWJsZU1hcFN0b3JlLHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUscHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUscHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsd2F0Y2hQcm9taXNlLGtleXMsbWFrZU9uY2VLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVcIixbJGjNj19hID0+IChpc1Bhc3NhYmxlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiY2FuQmVEdXJhYmxlXCIsWyRozY9fYSA9PiAoY2FuQmVEdXJhYmxlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4byA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlTWFwU3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlU2V0U3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZVNldFN0b3JlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSA9ICRozY9fYSldXSxbXCJ3YXRjaFByb21pc2VcIixbJGjNj19hID0+ICh3YXRjaFByb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2Jhc2Utem9uZVwiLCBbW1wiYWdvcmljVmF0RGF0YUtleXNcIixbJGjNj19hID0+IChrZXlzID0gJGjNj19hKV1dLFtcIm1ha2VPbmNlS2l0XCIsWyRozY9fYSA9PiAobWFrZU9uY2VLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnLi9pbmRleC5qcyc7XG4gKiBAaW1wb3J0IHtTdG9yZXN9IGZyb20gJy4vaW5kZXguanMnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICovXG5cbi8qKlxuICogQSB2YXJpYW50IG9mIGBjYW5CZUR1cmFibGVgIHRoYXQgcmV0dXJucyBgZmFsc2VgIGluc3RlYWQgb2YgZXZlciB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNTdG9yYWJsZSA9IHNwZWNpbWVuID0+IGlzUGFzc2FibGUoc3BlY2ltZW4pICYmIGNhbkJlRHVyYWJsZShzcGVjaW1lbik7XG5oYXJkZW4oaXNTdG9yYWJsZSk7XG5cbi8qKlxuICogQHBhcmFtIHsoKSA9PiBCYWdnYWdlfSBnZXRCYWdnYWdlXG4gKi9cbmNvbnN0IGF0dGFjaER1cmFibGVTdG9yZXMgPSBnZXRCYWdnYWdlID0+IHtcbiAgLyoqIEB0eXBlIHtab25lWydtYXBTdG9yZSddfSAqL1xuICBjb25zdCBtYXBTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGJhZ2dhZ2UgPSBnZXRCYWdnYWdlKCk7XG4gICAgY29uc3QgcmV0ID0gcHJvdmlkZUR1cmFibGVNYXBTdG9yZShiYWdnYWdlLCBsYWJlbCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcbiAgLyoqIEB0eXBlIHtab25lWydzZXRTdG9yZSddfSAqL1xuICBjb25zdCBzZXRTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT5cbiAgICBwcm92aWRlRHVyYWJsZVNldFN0b3JlKGdldEJhZ2dhZ2UoKSwgbGFiZWwsIG9wdGlvbnMpO1xuICAvKiogQHR5cGUge1pvbmVbJ3dlYWtTZXRTdG9yZSddfSAqL1xuICBjb25zdCB3ZWFrU2V0U3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+XG4gICAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUoZ2V0QmFnZ2FnZSgpLCBsYWJlbCwgb3B0aW9ucyk7XG4gIC8qKiBAdHlwZSB7Wm9uZVsnd2Vha01hcFN0b3JlJ119ICovXG4gIGNvbnN0IHdlYWtNYXBTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT5cbiAgICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShnZXRCYWdnYWdlKCksIGxhYmVsLCBvcHRpb25zKTtcblxuICAvKiogQHR5cGUge1N0b3Jlc30gKi9cbiAgcmV0dXJuIEZhcignZHVyYWJsZVN0b3JlcycsIHtcbiAgICBkZXRhY2hlZDogKCkgPT4gZGV0YWNoZWREdXJhYmxlU3RvcmVzLFxuICAgIGlzU3RvcmFibGUsXG4gICAgbWFwU3RvcmUsXG4gICAgc2V0U3RvcmUsXG4gICAgd2Vha01hcFN0b3JlLFxuICAgIHdlYWtTZXRTdG9yZSxcbiAgfSk7XG59O1xuXG4vKiogQHR5cGUge1N0b3Jlc30gKi9cbmNvbnN0IGRldGFjaGVkRHVyYWJsZVN0b3JlcyA9IGF0dGFjaER1cmFibGVTdG9yZXMoKCkgPT5cbiAgbWFrZVNjYWxhck1hcFN0b3JlKCdkZXRhY2hlZCcpLFxuKTtcblxuLyoqXG4gKiBDcmVhdGUgYSB6b25lIHdob3NlIG9iamVjdHMgcGVyc2lzdCBiZXR3ZWVuIEFnb3JpYyB2YXQgdXBncmFkZXMuXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VMYWJlbF1cbiAqIEByZXR1cm5zIHtab25lfVxuICovXG4gICAgICAgY29uc3QgbWFrZUR1cmFibGVab25lID0gKGJhZ2dhZ2UsIGJhc2VMYWJlbCA9ICdkdXJhYmxlWm9uZScpID0+IHtcbiAgYmFnZ2FnZSB8fCBGYWlsYGJhZ2dhZ2UgcmVxdWlyZWRgO1xuXG4gIGNvbnN0IGF0dGFjaGVkU3RvcmVzID0gYXR0YWNoRHVyYWJsZVN0b3JlcygoKSA9PiBiYWdnYWdlKTtcblxuICBjb25zdCB7IG1ha2VPbmNlLCB3cmFwUHJvdmlkZXIgfSA9IG1ha2VPbmNlS2l0KFxuICAgIGJhc2VMYWJlbCxcbiAgICBhdHRhY2hlZFN0b3JlcyxcbiAgICBiYWdnYWdlLFxuICApO1xuXG4gIC8qKiBAdHlwZSB7Wm9uZVsnZXhvQ2xhc3MnXX0gKi9cbiAgY29uc3QgZXhvQ2xhc3MgPSAoLi4uYXJncykgPT4gcHJlcGFyZUV4b0NsYXNzKGJhZ2dhZ2UsIC4uLmFyZ3MpO1xuICAvKiogQHR5cGUge1pvbmVbJ2V4b0NsYXNzS2l0J119ICovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgLS0gaGFwcGVucyBvbmx5IGludGVncmF0aW5nIHdpdGggRW5kbyBtYXN0ZXIqL1xuICAvKiBAdHMtaWdub3JlIEZJWE1FIGluIEVuZG8qL1xuICBjb25zdCBleG9DbGFzc0tpdCA9ICguLi5hcmdzKSA9PiBwcmVwYXJlRXhvQ2xhc3NLaXQoYmFnZ2FnZSwgLi4uYXJncyk7XG4gIC8qKiBAdHlwZSB7Wm9uZVsnZXhvJ119ICovXG4gIGNvbnN0IGV4byA9ICguLi5hcmdzKSA9PiBwcmVwYXJlRXhvKGJhZ2dhZ2UsIC4uLmFyZ3MpO1xuXG4gIGNvbnN0IHN1YlpvbmVTdG9yZSA9IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5tYXBTdG9yZSwga2V5cy56b25lKTtcblxuICAvKiogQHR5cGUge1pvbmVbJ3N1YlpvbmUnXX0gKi9cbiAgY29uc3Qgc3ViWm9uZSA9IChsYWJlbCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgLyoqIEB0eXBlIHtCYWdnYWdlfSAqL1xuICAgIGNvbnN0IHN1YkJhZ2dhZ2UgPSBzdWJab25lU3RvcmUobGFiZWwsIG9wdGlvbnMpO1xuICAgIHJldHVybiBtYWtlRHVyYWJsZVpvbmUoc3ViQmFnZ2FnZSwgYCR7YmFzZUxhYmVsfS4ke2xhYmVsfWApO1xuICB9O1xuXG4gIHJldHVybiBGYXIoJ2R1cmFibGVab25lJywge1xuICAgIGV4bzogd3JhcFByb3ZpZGVyKGV4bywga2V5cy5leG8pLFxuICAgIGV4b0NsYXNzOiB3cmFwUHJvdmlkZXIoZXhvQ2xhc3MsIGtleXMuZXhvQ2xhc3MpLFxuICAgIGV4b0NsYXNzS2l0OiB3cmFwUHJvdmlkZXIoZXhvQ2xhc3NLaXQsIGtleXMuZXhvQ2xhc3NLaXQpLFxuICAgIHN1YlpvbmUsXG5cbiAgICBtYWtlT25jZSxcbiAgICB3YXRjaFByb21pc2UsXG4gICAgZGV0YWNoZWQ6IGF0dGFjaGVkU3RvcmVzLmRldGFjaGVkLFxuICAgIGlzU3RvcmFibGU6IGF0dGFjaGVkU3RvcmVzLmlzU3RvcmFibGUsXG5cbiAgICBtYXBTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLm1hcFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgICBzZXRTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLnNldFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgICB3ZWFrTWFwU3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy53ZWFrTWFwU3RvcmUsIGtleXMuc3RvcmUpLFxuICAgIHdlYWtTZXRTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLndlYWtTZXRTdG9yZSwga2V5cy5zdG9yZSksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUR1cmFibGVab25lKG1ha2VEdXJhYmxlWm9uZSk7XG5oYXJkZW4obWFrZUR1cmFibGVab25lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VEdXJhYmxlWm9uZSI6WyJtYWtlRHVyYWJsZVpvbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1jhUAsUBAADFAQAAHwAAAEBlbmRvL2NhY2hlLW1hcC12MS4xLjAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvY2FjaGVtYXAuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9jYWNoZW1hcC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2NhY2hlbWFwLmpzIjpbWyJtYWtlQ2FjaGVNYXBLaXQiLCJtYWtlQ2FjaGVNYXBLaXQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIGV7vwmJwAAJicAACYAAABAZW5kby9jYWNoZS1tYXAtdjEuMS4wL3NyYy9jYWNoZW1hcC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZUNhY2hlTWFwS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG4vKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbmNvbnN0IHsgRXJyb3IsIFR5cGVFcnJvciwgV2Vha01hcCB9ID0gZ2xvYmFsVGhpcztcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgeyBwYXJzZSwgc3RyaW5naWZ5IH0gPSBKU09OO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG5jb25zdCB7IGlzU2FmZUludGVnZXIgfSA9IE51bWJlcjtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgeyB0b1N0cmluZ1RhZzogdG9TdHJpbmdUYWdTeW1ib2wgfSA9IFN5bWJvbDtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG5jb25zdCBVTktOT1dOX0tFWSA9IFN5bWJvbCgnVU5LTk9XTl9LRVknKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyBvYmplY3QgPyB7IC1yZWFkb25seSBbSyBpbiBrZXlvZiBUXTogVFtLXSB9IDogbmV2ZXJ9IFdyaXRhYmxlRGVlcFxuICogICBJbnRlbnRpb25hbGx5IGxpbWl0ZWQgdG8gbG9jYWwgbmVlZHM7IHJlZmVyIHRvXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0IGlmIGluc3VmZmljaWVudC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlXG4gKiBAcGFyYW0gezxVLD4obmFtZTogc3RyaW5nLCB2YWx1ZTogVSkgPT4gVX0gW3Jldml2ZXJdXG4gKiBAcmV0dXJucyB7V3JpdGFibGVEZWVwPFQ+fVxuICovXG5jb25zdCBkZWVwQ29weUpzb25hYmxlID0gKHZhbHVlLCByZXZpdmVyKSA9PiB7XG4gIGNvbnN0IGVuY29kZWQgPSBzdHJpbmdpZnkodmFsdWUpO1xuICBjb25zdCBkZWNvZGVkID0gcGFyc2UoZW5jb2RlZCwgcmV2aXZlcik7XG4gIHJldHVybiBkZWNvZGVkO1xufTtcblxuY29uc3QgZnJlZXppbmdSZXZpdmVyID0gKF9uYW1lLCB2YWx1ZSkgPT4gZnJlZXplKHZhbHVlKTtcblxuLyoqIEB0eXBlIHs8VCw+KHZhbHVlOiBUKSA9PiBUfSAqL1xuY29uc3QgZGVlcENvcHlBbmRGcmVlemVKc29uYWJsZSA9IHZhbHVlID0+XG4gIGRlZXBDb3B5SnNvbmFibGUodmFsdWUsIGZyZWV6aW5nUmV2aXZlcik7XG5cbi8qKlxuICogQSBjYWNoZSBvZiBib3VuZGVkIHNpemUsIGltcGxlbWVudGluZyB0aGUgV2Vha01hcCBpbnRlcmZhY2UgYnV0IGhvbGRpbmcga2V5c1xuICogc3Ryb25nbHkgaWYgY3JlYXRlZCB3aXRoIGEgbm9uLXdlYWsgYG1ha2VNYXBgIG9wdGlvbiBvZlxuICoge0BsaW5rIG1ha2VDYWNoZU1hcEtpdH0uXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAdHlwZWRlZiB7UGljazxNYXA8SywgVj4sIEV4Y2x1ZGU8a2V5b2YgV2Vha01hcDxXZWFrS2V5LCAqPiwgJ3NldCc+PiAmIHtzZXQ6IChrZXk6IEssIHZhbHVlOiBWKSA9PiBXZWFrTWFwQVBJPEssIFY+fX0gV2Vha01hcEFQSVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAdHlwZWRlZiB7V2Vha01hcEFQSTxLLCBWPiAmICh7Y2xlYXI/OiB1bmRlZmluZWR9IHwgUGljazxNYXA8SywgVj4sICdjbGVhcic+KX0gU2luZ2xlRW50cnlNYXBcbiAqL1xuXG4vKipcbiAqIEEgY2VsbCBvZiBhIGRvdWJseS1saW5rZWQgcmluZyAoY2lyY3VsYXIgbGlzdCkgZm9yIGEgY2FjaGUgbWFwLlxuICogSW5zdGFuY2VzIGFyZSBub3QgZnJvemVuLCBhbmQgc28gc2hvdWxkIGJlIGNsb3NlbHkgZW5jYXBzdWxhdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYge29iamVjdH0gQ2FjaGVNYXBDZWxsXG4gKiBAcHJvcGVydHkge251bWJlcn0gaWQgZm9yIGRlYnVnZ2luZ1xuICogQHByb3BlcnR5IHtDYWNoZU1hcENlbGw8SywgVj59IG5leHRcbiAqIEBwcm9wZXJ0eSB7Q2FjaGVNYXBDZWxsPEssIFY+fSBwcmV2XG4gKiBAcHJvcGVydHkge1NpbmdsZUVudHJ5TWFwPEssIFY+fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7Q2FjaGVNYXBDZWxsPEssIFY+fSBwcmV2XG4gKiBAcGFyYW0ge251bWJlcn0gaWRcbiAqIEBwYXJhbSB7U2luZ2xlRW50cnlNYXA8SywgVj59IGRhdGFcbiAqIEByZXR1cm5zIHtDYWNoZU1hcENlbGw8SywgVj59XG4gKi9cbmNvbnN0IGFwcGVuZE5ld0NlbGwgPSAocHJldiwgaWQsIGRhdGEpID0+IHtcbiAgY29uc3QgbmV4dCA9IHByZXY/Lm5leHQ7XG4gIGNvbnN0IGNlbGwgPSB7IGlkLCBuZXh0LCBwcmV2LCBkYXRhIH07XG4gIHByZXYubmV4dCA9IGNlbGw7XG4gIG5leHQucHJldiA9IGNlbGw7XG4gIHJldHVybiBjZWxsO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7Q2FjaGVNYXBDZWxsPEssIFY+fSBjZWxsXG4gKiBAcGFyYW0ge0NhY2hlTWFwQ2VsbDxLLCBWPn0gcHJldlxuICogQHBhcmFtIHtDYWNoZU1hcENlbGw8SywgVj59IFtuZXh0XVxuICovXG5jb25zdCBtb3ZlQ2VsbEFmdGVyID0gKGNlbGwsIHByZXYsIG5leHQgPSBwcmV2Lm5leHQpID0+IHtcbiAgaWYgKGNlbGwgPT09IHByZXYgfHwgY2VsbCA9PT0gbmV4dCkgcmV0dXJuOyAvKiBhbHJlYWR5IGluIHBvc2l0aW9uKi9cblxuICAvKiBTcGxpY2Ugb3V0IGNlbGwuKi9cbiAgY29uc3QgeyBwcmV2OiBvbGRQcmV2LCBuZXh0OiBvbGROZXh0IH0gPSBjZWxsO1xuICBvbGRQcmV2Lm5leHQgPSBvbGROZXh0O1xuICBvbGROZXh0LnByZXYgPSBvbGRQcmV2O1xuXG4gIC8qIFNwbGljZSBpbiBjZWxsIGFmdGVyIHByZXYuKi9cbiAgY2VsbC5wcmV2ID0gcHJldjtcbiAgY2VsbC5uZXh0ID0gbmV4dDtcbiAgcHJldi5uZXh0ID0gY2VsbDtcbiAgbmV4dC5wcmV2ID0gY2VsbDtcbn07XG5cbi8qKlxuICogQ2xlYXIgb3V0IGEgY2VsbCB0byBwcmVwYXJlIGl0IGZvciBmdXR1cmUgdXNlLiBJdHMgbWFwIGlzIHByZXNlcnZlZCB3aGVuXG4gKiBwb3NzaWJsZSwgYnV0IG11c3QgaW5zdGVhZCBiZSByZXBsYWNlZCBpZiB0aGUgYXNzb2NpYXRlZCBrZXkgaXMgbm90IGtub3duLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtDYWNoZU1hcENlbGw8SywgVj59IGNlbGxcbiAqIEBwYXJhbSB7SyB8IFVOS05PV05fS0VZfSBvbGRLZXlcbiAqIEBwYXJhbSB7KCkgPT4gU2luZ2xlRW50cnlNYXA8SywgVj59IFttYWtlTWFwXSByZXF1aXJlZCB3aGVuIHRoZSBrZXkgaXMgdW5rbm93blxuICovXG5jb25zdCByZXNldENlbGwgPSAoY2VsbCwgb2xkS2V5LCBtYWtlTWFwKSA9PiB7XG4gIGlmIChvbGRLZXkgIT09IFVOS05PV05fS0VZKSB7XG4gICAgY2VsbC5kYXRhLmRlbGV0ZShvbGRLZXkpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoY2VsbC5kYXRhLmNsZWFyKSB7XG4gICAgY2VsbC5kYXRhLmNsZWFyKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8qIFdlYWtNYXAgaW5zdGFuY2VzIG11c3QgYmUgcmVwbGFjZWQgd2hlbiB0aGUga2V5IGlzIHVua25vd24uKi9cbiAgaWYgKCFtYWtlTWFwKSB7XG4gICAgdGhyb3cgRXJyb3IoJ2ludGVybmFsOiBtYWtlTWFwIGlzIHJlcXVpcmVkIHdpdGggVU5LTk9XTl9LRVknKTtcbiAgfVxuICBjZWxsLmRhdGEgPSBtYWtlTWFwKCk7XG59O1xuXG5jb25zdCB6ZXJvTWV0cmljcyA9IGZyZWV6ZSh7XG4gIHRvdGFsUXVlcnlDb3VudDogMCxcbiAgdG90YWxIaXRDb3VudDogMFxuICAvKiBUT0RPPyovXG4gIC8qICogbWV0aG9kLXNwZWNpZmljIGNvdW50cyovXG4gIC8qICogbGl2ZVRvdWNoU3RhdHMvZXZpY3RlZFRvdWNoU3RhdHMgeyBjb3VudCwgc3VtLCBtZWFuLCBtaW4sIG1heCB9Ki9cbiAgLyogKiBwNTAvcDkwL3A5NS9wOTkgdmlhIEJlbi1IYWltL1RvbS1Ub3Ygc3RyZWFtaW5nIGhpc3RvZ3JhbXMqL1xufSk7XG4vKiogQHR5cGVkZWYge3R5cGVvZiB6ZXJvTWV0cmljc30gQ2FjaGVNYXBNZXRyaWNzICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtNYXBDb25zdHJ1Y3RvciB8IFdlYWtNYXBDb25zdHJ1Y3Rvcn0gW0M9V2Vha01hcENvbnN0cnVjdG9yXVxuICogQHRlbXBsYXRlIHtQYXJhbWV0ZXJzPEluc3RhbmNlVHlwZTxDPlsnc2V0J10+WzBdfSBbSz1QYXJhbWV0ZXJzPEluc3RhbmNlVHlwZTxDPlsnc2V0J10+WzBdXVxuICogQHRlbXBsYXRlIHt1bmtub3dufSBbVj11bmtub3duXVxuICogQHR5cGVkZWYge29iamVjdH0gQ2FjaGVNYXBLaXRcbiAqIEBwcm9wZXJ0eSB7V2Vha01hcEFQSTxLLCBWPn0gY2FjaGVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQ2FjaGVNYXBNZXRyaWNzfSBnZXRNZXRyaWNzXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBib3VuZGVkLXNpemUgY2FjaGUgaGF2aW5nIFdlYWtNYXAtY29tcGF0aWJsZVxuICogYGhhc2AvYGdldGAvYHNldGAvYGRlbGV0ZWAgbWV0aG9kcywgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIFNFUyAoc3BlY2lmaWNhbGx5XG4gKiBgYXNzZXJ0YCBlcnJvciBub3RlcykuXG4gKiBLZXkgdmFsaWRpdHksIGNvbXBhcmlzb24sIGFuZCByZWZlcmVudGlhbCBzdHJlbmd0aCBhcmUgY29udHJvbGxlZCBieSB0aGVcbiAqIGBtYWtlTWFwYCBvcHRpb24sIHdoaWNoIGRlZmF1bHRzIHRvIGBXZWFrTWFwYCBidXQgY2FuIGJlIHNldCB0byBhbnkgcHJvZHVjZXJcbiAqIG9mIG9iamVjdHMgd2l0aCB0aG9zZSBtZXRob2RzIChlLmcuLCB1c2luZyBgTWFwYCBhbGxvd3MgZm9yIGFyYml0cmFyeSBrZXlzXG4gKiB3aGljaCB3aWxsIGJlIHN0cm9uZ2x5IGhlbGQpLlxuICogQ2FjaGUgZXZpY3Rpb24gcG9saWN5IGlzIG5vdCBjdXJyZW50bHkgY29uZmlndXJhYmxlLCBidXQgc3RyaXZlcyBmb3IgYSBoaXRcbiAqIHJhdGlvIGF0IGxlYXN0IGFzIGdvb2QgYXNcbiAqIFtMUlVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhY2hlX3JlcGxhY2VtZW50X3BvbGljaWVzI0xSVSkgKGUuZy4sIGl0XG4gKiBtaWdodCBiZVxuICogW0NMT0NLXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYWdlX3JlcGxhY2VtZW50X2FsZ29yaXRobSNDbG9jaylcbiAqIG9yIFtTSUVWRV0oaHR0cHM6Ly9zaWV2ZWNhY2hlLmNvbS8pKS5cbiAqXG4gKiBAdGVtcGxhdGUge01hcENvbnN0cnVjdG9yIHwgV2Vha01hcENvbnN0cnVjdG9yfSBbQz1XZWFrTWFwQ29uc3RydWN0b3JdXG4gKiBAdGVtcGxhdGUge1BhcmFtZXRlcnM8SW5zdGFuY2VUeXBlPEM+WydzZXQnXT5bMF19IFtLPVBhcmFtZXRlcnM8SW5zdGFuY2VUeXBlPEM+WydzZXQnXT5bMF1dXG4gKiBAdGVtcGxhdGUge3Vua25vd259IFtWPXVua25vd25dXG4gKiBAcGFyYW0ge251bWJlcn0gY2FwYWNpdHlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7QyB8ICgoKSA9PiBTaW5nbGVFbnRyeU1hcDxLLCBWPil9IFtvcHRpb25zLm1ha2VNYXBdXG4gKiBAcmV0dXJucyB7Q2FjaGVNYXBLaXQ8QywgSywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ2FjaGVNYXBLaXQgPSAoY2FwYWNpdHksIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoIWlzU2FmZUludGVnZXIoY2FwYWNpdHkpIHx8IGNhcGFjaXR5IDwgMCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcbiAgICAgICdjYXBhY2l0eSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIHNhZmUgaW50ZWdlciBudW1iZXIgPD0gMioqNTMgLSAxJyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGUgezxWLD4oKSA9PiBTaW5nbGVFbnRyeU1hcDxLLCBWPn1cbiAqL1xuICBjb25zdCBtYWtlTWFwID0gKE1heWJlQ3RvciA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IqL1xuICAgICAgTWF5YmVDdG9yKCk7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovIChNYXliZUN0b3IpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciovXG4gICAgICBjb25zdCBjb25zdHJ1Y3ROZXdNYXAgPSAoKSA9PiBuZXcgTWF5YmVDdG9yKCk7XG4gICAgICByZXR1cm4gY29uc3RydWN0TmV3TWFwO1xuICAgIH1cbiAgfSkob3B0aW9ucy5tYWtlTWFwID8/IFdlYWtNYXApO1xuICBjb25zdCB0YWcgPVxuICAgIC8qKiBAdHlwZSB7YW55fSAqLyAobWFrZU1hcCgpKS5jbGVhciA9PT0gdW5kZWZpbmVkXG4gICAgICA/ICdXZWFrQ2FjaGVNYXAnXG4gICAgICA6ICdDYWNoZU1hcCc7XG5cbiAgLyoqIEB0eXBlIHtXZWFrTWFwQVBJPEssIENhY2hlTWFwQ2VsbDxLLCBWPj59ICovXG4gIGNvbnN0IGtleVRvQ2VsbCA9IG1ha2VNYXAoKTtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciB0aGlzIHNlbnRpbmVsIGhlYWQgaXMgc3BlY2lhbCovXG4gIGNvbnN0IGhlYWQgPSAvKiogQHR5cGUge0NhY2hlTWFwQ2VsbDxLLCBWPn0gKi8gKHtcbiAgICBpZDogMCxcbiAgICAvKiBuZXh0IGFuZCBwcmV2IGFyZSBlc3RhYmxpc2hlZCBiZWxvdyBhcyBzZWxmLXJlZmVyZW50aWFsLiovXG4gICAgbmV4dDogdW5kZWZpbmVkLFxuICAgIHByZXY6IHVuZGVmaW5lZCxcbiAgICBkYXRhOiB7XG4gICAgICBoYXM6ICgpID0+IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ2ludGVybmFsOiBzZW50aW5lbCBoZWFkIGNlbGwgaGFzIG5vIGRhdGEnKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG4gIGhlYWQubmV4dCA9IGhlYWQ7XG4gIGhlYWQucHJldiA9IGhlYWQ7XG4gIGxldCBjZWxsQ291bnQgPSAwO1xuXG4gIGNvbnN0IG1ldHJpY3MgPSBkZWVwQ29weUpzb25hYmxlKHplcm9NZXRyaWNzKTtcbiAgY29uc3QgZ2V0TWV0cmljcyA9ICgpID0+IGRlZXBDb3B5QW5kRnJlZXplSnNvbmFibGUobWV0cmljcyk7XG5cbiAgLyoqXG4gKiBUb3VjaGluZyBtb3ZlcyBhIGNlbGwgdG8gZmlyc3QgcG9zaXRpb24gc28gTFJVIGV2aWN0aW9uIGNhbiB0YXJnZXQgdGhlIGxhc3RcbiAqIGNlbGwgKGBoZWFkLnByZXZgKS5cbiAqXG4gKiBAdHlwZSB7KGtleTogSykgPT4gKENhY2hlTWFwQ2VsbDxLLCBWPiB8IHVuZGVmaW5lZCl9XG4gKi9cbiAgY29uc3QgdG91Y2hLZXkgPSBrZXkgPT4ge1xuICAgIG1ldHJpY3MudG90YWxRdWVyeUNvdW50ICs9IDE7XG4gICAgY29uc3QgY2VsbCA9IGtleVRvQ2VsbC5nZXQoa2V5KTtcbiAgICBpZiAoIWNlbGw/LmRhdGEuaGFzKGtleSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBtZXRyaWNzLnRvdGFsSGl0Q291bnQgKz0gMTtcbiAgICBtb3ZlQ2VsbEFmdGVyKGNlbGwsIGhlYWQpO1xuICAgIHJldHVybiBjZWxsO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBWPlsnaGFzJ119ICovXG4gIGNvbnN0IGhhcyA9IGtleSA9PiB7XG4gICAgY29uc3QgY2VsbCA9IHRvdWNoS2V5KGtleSk7XG4gICAgcmV0dXJuIGNlbGwgIT09IHVuZGVmaW5lZDtcbiAgfTtcbiAgZnJlZXplKGhhcyk7XG5cbiAgLyoqIEB0eXBlIHtXZWFrTWFwQVBJPEssIFY+WydnZXQnXX0gKi9cbiAgY29uc3QgZ2V0ID0ga2V5ID0+IHtcbiAgICBjb25zdCBjZWxsID0gdG91Y2hLZXkoa2V5KTtcbiAgICByZXR1cm4gY2VsbD8uZGF0YS5nZXQoa2V5KTtcbiAgfTtcbiAgZnJlZXplKGdldCk7XG5cbiAgLyoqIEB0eXBlIHtXZWFrTWFwQVBJPEssIFY+WydzZXQnXX0gKi9cbiAgY29uc3Qgc2V0ID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICBsZXQgY2VsbCA9IHRvdWNoS2V5KGtleSk7XG4gICAgaWYgKGNlbGwpIHtcbiAgICAgIGNlbGwuZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uO1xuICAgIH1cblxuICAgIGlmIChjZWxsQ291bnQgPCBjYXBhY2l0eSkge1xuICAgICAgLyogQWRkIGFuZCB1c2UgYSBuZXcgY2VsbCBhdCBmaXJzdCBwb3NpdGlvbi4qL1xuICAgICAgY2VsbCA9IGFwcGVuZE5ld0NlbGwoaGVhZCwgY2VsbENvdW50ICsgMSwgbWFrZU1hcCgpKTtcbiAgICAgIGNlbGxDb3VudCArPSAxOyAvKiBpbnRlbnRpb25hbGx5IGZvbGxvd3MgY2VsbCBjcmVhdGlvbiovXG4gICAgICBjZWxsLmRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoY2FwYWNpdHkgPiAwKSB7XG4gICAgICAvKiBSZXVzZSB0aGUgY3VycmVudCB0YWlsLCBtb3ZpbmcgaXQgdG8gZmlyc3QgcG9zaXRpb24uKi9cbiAgICAgIGNlbGwgPSBoZWFkLnByZXY7XG4gICAgICByZXNldENlbGwoLyoqIEB0eXBlIHthbnl9ICovIChjZWxsKSwgVU5LTk9XTl9LRVksIG1ha2VNYXApO1xuICAgICAgY2VsbC5kYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICAgIG1vdmVDZWxsQWZ0ZXIoY2VsbCwgaGVhZCk7XG4gICAgfVxuXG4gICAgLyogRG9uJ3QgZXN0YWJsaXNoIHRoaXMgZW50cnkgdW50aWwgcHJpb3Igc3RlcHMgc3VjY2VlZC4qL1xuICAgIGlmIChjZWxsKSBrZXlUb0NlbGwuc2V0KGtleSwgY2VsbCk7XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIHJldHVybiBpbXBsZW1lbnRhdGlvbjtcbiAgfTtcbiAgZnJlZXplKHNldCk7XG5cbiAgLyogXCJkZWxldGVcIiBpcyBhIGtleXdvcmQuKi9cbiAgY29uc3QgeyBkZWxldGU6IGRlbGV0ZUVudHJ5IH0gPSB7XG4gICAgLyoqIEB0eXBlIHtXZWFrTWFwQVBJPEssIFY+WydkZWxldGUnXX0gKi9cbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBjb25zdCBjZWxsID0ga2V5VG9DZWxsLmdldChrZXkpO1xuICAgICAgaWYgKCFjZWxsPy5kYXRhLmhhcyhrZXkpKSB7XG4gICAgICAgIGtleVRvQ2VsbC5kZWxldGUoa2V5KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgbW92ZUNlbGxBZnRlcihjZWxsLCBoZWFkLnByZXYpO1xuICAgICAgcmVzZXRDZWxsKGNlbGwsIGtleSk7XG4gICAgICBrZXlUb0NlbGwuZGVsZXRlKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9O1xuICBmcmVlemUoZGVsZXRlRW50cnkpO1xuXG4gIGNvbnN0IGltcGxlbWVudGF0aW9uID0gLyoqIEB0eXBlIHtXZWFrTWFwQVBJPEssIFY+fSAqLyAoe1xuICAgIGhhcyxcbiAgICBnZXQsXG4gICAgc2V0LFxuICAgIGRlbGV0ZTogZGVsZXRlRW50cnksXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL2NoZWNrLXR5cGVzKi9cbiAgICBbLyoqIEB0eXBlIHt0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnfSAqLyAodG9TdHJpbmdUYWdTeW1ib2wpXTogdGFnLFxuICB9KTtcbiAgZnJlZXplKGltcGxlbWVudGF0aW9uKTtcblxuICBjb25zdCBraXQgPSB7IGNhY2hlOiBpbXBsZW1lbnRhdGlvbiwgZ2V0TWV0cmljcyB9O1xuICByZXR1cm4gZnJlZXplKGtpdCk7XG59OyRozY9fb25jZS5tYWtlQ2FjaGVNYXBLaXQobWFrZUNhY2hlTWFwS2l0KTtcbmZyZWV6ZShtYWtlQ2FjaGVNYXBLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUNhY2hlTWFwS2l0IjpbIm1ha2VDYWNoZU1hcEtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABvUSGPYQsAAGELAAAsAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvYXBwbHktbGFiZWxpbmctZXJyb3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiLi90aHJvdy1sYWJlbGVkLmpzIl0sImV4cG9ydHMiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxpc1Byb21pc2UsdGhyb3dMYWJlbGVkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi90aHJvdy1sYWJlbGVkLmpzXCIsIFtbXCJ0aHJvd0xhYmVsZWRcIixbJGjNj19hID0+ICh0aHJvd0xhYmVsZWQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBDYWxscyBgZnVuYyguLi5hcmdzKWAsIGJ1dCBhbm5vdGF0aW5nIGFueSBmYWlsdXJlIGVycm9yIHdpdGggYGxhYmVsYC5cbiAqXG4gKiBJZiBgbGFiZWxgIGlzIG9taXR0ZWQgb3IgYHVuZGVmaW5lZGAsIHRoZW4gdGhpcyBpcyBlcXVpdmFsZW50IHRvXG4gKiBgZnVuYyguLi5hcmdzKS5cbiAqXG4gKiBPdGhlcndpc2UsIGlmIGl0IHN1Y2Nlc3NmdWxseSByZXR1cm5zIGEgbm9uLXByb21pc2UsIHRoYXQgbm9uLXByb21pc2UgaXNcbiAqIHJldHVybmVkLlxuICpcbiAqIElmIGl0IHRocm93cywgcmV0aHJvdyBhIHNpbWlsYXIgZXJyb3Igd2hvc2UgbWVzc2FnZSBpc1xuICogYGBganNcbiAqIGAke2xhYmVsfTogJHtvcmlnaW5hbE1lc3NhZ2V9YFxuICogYGBgXG4gKiBUaGF0IHdheSwgaW4gYW4gZXJyb3IgaGFwcGVucyBkZWVwIHdpdGhpbiBhIHN0YWNrIG9mIGNhbGxzIHRvXG4gKiBgYXBwbHlMYWJlbGluZ0Vycm9yYCwgdGhlIHJlc3VsdGluZyBlcnJvciB3aWxsIHNob3cgdGhlIHN0YWNrIG9mIGxhYmVscy5cbiAqXG4gKiBJZiBpdCByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiBgYXBwbHlMYWJlbGluZ0Vycm9yYCBjYW5ub3QgdGVsbCB1bnRpbCB0aGF0XG4gKiBwcm9taXNlIHNldHRsZXMgd2hldGhlciBpdCByZXByZXNlbnRzIGEgc3VjY2VzcyBvciBmYWlsdXJlLiBTbyBpdCBpbW1lZGlhdGVseVxuICogcmV0dXJucyBhIG5ldyBwcm9taXNlLiBJZiB0aGUgb3JpZ2luYWwgcHJvbWlzZSBmdWxmaWxscywgdGhlbiB0aGVcbiAqIGZ1bGZpbGxtZW50IGlzIHByb3BhZ2F0ZWQgdG8gdGhlIHJldHVybmVkIHByb21pc2UuXG4gKlxuICogSWYgdGhlIHByb21pc2UgcmVqZWN0cyB3aXRoIGFuIGVycm9yLCB0aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzXG4gKiByZWplY3RlZCB3aXRoIGEgc2ltaWxhciBwcm9taXNlLCBwcmVmaXhlZCB3aXRoIHRoZSBsYWJlbCBpbiB0aGF0IHNhbWUgd2F5LlxuICpcbiAqIEB0ZW1wbGF0ZSBBLFJcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gUn0gZnVuY1xuICogQHBhcmFtIHtBW119IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge1J9XG4gKi9cbiAgICAgICBjb25zdCBhcHBseUxhYmVsaW5nRXJyb3IgPSAoZnVuYywgYXJncywgbGFiZWwgPSB1bmRlZmluZWQpID0+IHtcbiAgaWYgKGxhYmVsID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZnVuYyguLi5hcmdzKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICB0cnkge1xuICAgIHJlc3VsdCA9IGZ1bmMoLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93TGFiZWxlZChlcnIsIGxhYmVsKTtcbiAgfVxuICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAvKiBDYW5ub3QgYmUgYXQtdHMtZXhwZWN0LWVycm9yIGJlY2F1c2UgdGhlcmUgaXMgbm8gdHlwZSBlcnJvciBsb2NhbGx5LiovXG4gICAgLyogUmF0aGVyLCBhIHR5cGUgZXJyb3Igb25seSBhcyBpbXBvcnRlZCBpbnRvIGV4by4qL1xuICAgIC8qIEB0cy1pZ25vcmUgSWYgcmVzdWx0IGlzIGEgcmVqZWN0ZWQgcHJvbWlzZSwgdGhpcyB3aWxsKi9cbiAgICAvKiByZXR1cm4gYSBwcm9taXNlIHdpdGggYSBkaWZmZXJlbnQgcmVqZWN0aW9uIHJlYXNvbi4gQnV0IHRoaXMqL1xuICAgIC8qIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCovXG4gICAgLyogd2hpY2ggaXMgY29vbCBmb3IgYSBwcm9taXNlIHRoYXQgd2lsbCBuZXZlciBmdWxmbGwuKi9cbiAgICAvKiBCdXQgVHlwZVNjcmlwdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGlzIHdpbGwgb25seSBoYXBwZW4qL1xuICAgIC8qIHdoZW4gYHJlc3VsdGAgd2FzIGEgcmVqZWN0ZWQgcHJvbWlzZS4gSW4gb25seSB0aGlzIGNhc2UgYFJgKi9cbiAgICAvKiBzaG91bGQgYWxyZWFkeSBhbGxvdyBgUHJvbWlzZTxuZXZlcj5gIGFzIGEgc3VidHlwZS4qL1xuICAgIHJldHVybiBFLndoZW4ocmVzdWx0LCB1bmRlZmluZWQsIHJlYXNvbiA9PiB0aHJvd0xhYmVsZWQocmVhc29uLCBsYWJlbCkpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07JGjNj19vbmNlLmFwcGx5TGFiZWxpbmdFcnJvcihhcHBseUxhYmVsaW5nRXJyb3IpO1xuaGFyZGVuKGFwcGx5TGFiZWxpbmdFcnJvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhcHBseUxhYmVsaW5nRXJyb3IiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEj4QsrdBQAA3QUAACsAAABAZW5kby9jb21tb24tdjEuMi4xMy9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImZyb21VbmlxdWVFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBUaHJvd3MgaWYgbXVsdGlwbGUgZW50cmllcyB1c2UgdGhlIHNhbWUgcHJvcGVydHkgbmFtZS4gT3RoZXJ3aXNlIGFjdHNcbiAqIGxpa2UgYE9iamVjdC5mcm9tRW50cmllc2AgYnV0IGhhcmRlbnMgdGhlIHJlc3VsdC5cbiAqIFVzZSBpdCB0byBwcm90ZWN0IGZyb20gcHJvcGVydHkgbmFtZXMgY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEBwYXJhbSB7SXRlcmFibGU8cmVhZG9ubHkgW1Byb3BlcnR5S2V5LCBUXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7IFtrOiBzdHJpbmddOiBUOyB9fVxuICovXG4gICAgICAgY29uc3QgZnJvbVVuaXF1ZUVudHJpZXMgPSBhbGxFbnRyaWVzID0+IHtcbiAgY29uc3QgZW50cmllc0FycmF5ID0gWy4uLmFsbEVudHJpZXNdO1xuICBjb25zdCByZXN1bHQgPSBoYXJkZW4oZnJvbUVudHJpZXMoZW50cmllc0FycmF5KSk7XG4gIGlmIChvd25LZXlzKHJlc3VsdCkubGVuZ3RoID09PSBlbnRyaWVzQXJyYXkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKTtcbiAgZm9yIChjb25zdCBbbmFtZSwgX10gb2YgZW50cmllc0FycmF5KSB7XG4gICAgaWYgKG5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgRmFpbGBjb2xsaXNpb24gb24gcHJvcGVydHkgbmFtZSAke3EobmFtZSl9OiAke2VudHJpZXNBcnJheX1gO1xuICAgIH1cbiAgICBuYW1lcy5hZGQobmFtZSk7XG4gIH1cbiAgdGhyb3cgRmFpbGBpbnRlcm5hbDogZmFpbGVkIHRvIGNyZWF0ZSBvYmplY3QgZnJvbSB1bmlxdWUgZW50cmllc2A7XG59OyRozY9fb25jZS5mcm9tVW5pcXVlRW50cmllcyhmcm9tVW5pcXVlRW50cmllcyk7XG5oYXJkZW4oZnJvbVVuaXF1ZUVudHJpZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAt5VT7iUIAAAlCAAAJQAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL2lkZW50LWNoZWNrZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlkZW50Q2hlY2tlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBUT0RPIENvbXBsZXRlIG1pZ3JhdGlvbiBvZiBDaGVja2VyIHR5cGUgZnJvbSBAZW5kby9wYXNzLXN0eWxlIHRvIEBlbmRvL2NvbW1vbiovXG4vKiBieSBoYXZpbmcgQGVuZG8vcGFzcy1zdHlsZSwgYW5kIGV2ZXJ5b25lIGVsc2Ugd2hvIG5lZWRzIGl0LCBpbXBvcnQgaXQgZnJvbSovXG4vKiBgQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNgLiovXG4vKipcbiAqIEBjYWxsYmFjayBDaGVja2VyXG4gKiBJbnRlcm5hbCB0byBhIHVzZWZ1bCBwYXR0ZXJuIGZvciB3cml0aW5nIGNoZWNraW5nIGxvZ2ljXG4gKiAoYSBcImNoZWNrRm9vXCIgZnVuY3Rpb24pIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGEgcHJlZGljYXRlXG4gKiAoYW4gXCJpc0Zvb1wiIGZ1bmN0aW9uKSBvciBhIHZhbGlkYXRvciAoYW4gXCJhc3NlcnRGb29cIiBmdW5jdGlvbikuXG4gKlxuICogICAgKiBBIHByZWRpY2F0ZSBpZGVhbGx5IG9ubHkgcmV0dXJucyBgdHJ1ZWAgb3IgYGZhbHNlYCBhbmQgcmFyZWx5IHRocm93cy5cbiAqICAgICogQSB2YWxpZGF0b3IgdGhyb3dzIGFuIGluZm9ybWF0aXZlIGRpYWdub3N0aWMgd2hlbiB0aGUgcHJlZGljYXRlXG4gKiAgICAgIHdvdWxkIGhhdmUgcmV0dXJuZWQgYGZhbHNlYCwgYW5kIHNpbXBseSByZXR1cm5zIGB1bmRlZmluZWRgIG5vcm1hbGx5XG4gKiAgICAgIHdoZW4gdGhlIHByZWRpY2F0ZSB3b3VsZCBoYXZlIHJldHVybmVkIGB0cnVlYC5cbiAqICAgICogVGhlIGludGVybmFsIGNoZWNraW5nIGZ1bmN0aW9uIHRoYXQgdGhleSBzaGFyZSBpcyBwYXJhbWV0ZXJpemVkIGJ5IGFcbiAqICAgICAgYENoZWNrZXJgIHRoYXQgZGV0ZXJtaW5lcyBob3cgdG8gcHJvY2VlZCB3aXRoIGEgZmFpbHVyZSBjb25kaXRpb24uXG4gKiAgICAgIFByZWRpY2F0ZXMgcGFzcyBpbiBhbiBpZGVudGl0eSBmdW5jdGlvbiBhcyBjaGVja2VyLiBWYWxpZGF0b3JzXG4gKiAgICAgIHBhc3MgaW4gYGFzc2VydENoZWNrZXJgIHdoaWNoIGlzIGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCBgYXNzZXJ0YC5cbiAqXG4gKiBTZWUgdGhlIHZhcmlvdXMgdXNlcyBmb3IgZ29vZCBleGFtcGxlcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY29uZFxuICogQHBhcmFtIHtJTVBPUlQoJ3NlcycpLkRldGFpbHN9IFtkZXRhaWxzXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBJbiB0aGUgYGFzc2VydEZvb2AvYGlzRm9vYC9gY2hlY2tGb29gIHBhdHRlcm4sIGBjaGVja0Zvb2AgaGFzIGEgYGNoZWNrYFxuICogcGFyYW1ldGVyIG9mIHR5cGUgYENoZWNrZXJgLiBgYXNzZXJ0Rm9vYCBjYWxscyBgY2hlY2tGb29gIHBhc3Nlc1xuICogYGFzc2VydENoZWNrZXJgIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaXNGb29gIHBhc3NlcyBgaWRlbnRDaGVja2VyYFxuICogYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpZGVudENoZWNrZXJgIGFjdHMgcHJlY2lzZWx5IGxpa2UgYW5cbiAqIGlkZW50aXR5IGZ1bmN0aW9uLCBidXQgaXMgdHlwZWQgYXMgYSBgQ2hlY2tlcmAgdG8gaW5kaWNhdGUgaXRzXG4gKiBpbnRlbmRlZCB1c2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbiAgICAgICBjb25zdCBpZGVudENoZWNrZXIgPSAoY29uZCwgX2RldGFpbHMpID0+IGNvbmQ7JGjNj19vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZGVudENoZWNrZXIiOlsiaWRlbnRDaGVja2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGGv/Gq4BAAAuAQAACcAAABAZW5kby9jb21tb24tdjEuMi4xMy9saXN0LWRpZmZlcmVuY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImxpc3REaWZmZXJlbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qKlxuICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIGVsZW1lbnRzIHByZXNlbnQgaW4gdGhlIGBsZWZ0TGlzdGAgYW5kIG5vdFxuICogaW4gdGhlIGByaWdodExpc3RgLiBSZXR1cm4gaW4gdGhlIG9yZGVyIG9mIHRoZWlyIGFwcGVhcmFuY2UgaW4gYGxlZnRMaXN0YC5cbiAqIFVzZXMgdGhlIGNvbXBhcmlzb24gYnVpbHQgaW50byBgU2V0YCBtZW1iZXJzaGlwIChTYW1lVmFsdWVaZXJvKVxuICogd2hpY2ggaXMgbGlrZSBKYXZhU2NyaXB0J3MgYD09PWAgZXhjZXB0IHRoYXQgaXQganVkZ2VzIGFueSBgTmFOYCB0b1xuICogYmUgdGhlIHNhbWUgYXMgYW55IGBOYU5gIGFuZCBpdCBqdWRnZXMgYDBgIHRvIGJlIHRoZSBzYW1lIGEgYC0wYC5cbiAqXG4gKiBUaGlzIGlzIG9mdGVuIHVzZWQgb24gbGlzdHMgb2YgbmFtZXMgdGhhdCBzaG91bGQgbWF0Y2gsIGluIG9yZGVyIHRvIGdlbmVyYXRlXG4gKiB1c2VmdWwgZGlhZ25vc3RpY3MgYWJvdXQgdGhlIHVubWF0Y2hlZCBuYW1lcy5cbiAqXG4gKiBAdGVtcGxhdGUge2FueX0gVlxuICogQHBhcmFtIHtWW119IGxlZnRMaXN0XG4gKiBAcGFyYW0ge1ZbXX0gcmlnaHRMaXN0XG4gKi9cbiAgICAgICBjb25zdCBsaXN0RGlmZmVyZW5jZSA9IChsZWZ0TGlzdCwgcmlnaHRMaXN0KSA9PiB7XG4gIGNvbnN0IHJpZ2h0U2V0ID0gbmV3IFNldChyaWdodExpc3QpO1xuICByZXR1cm4gbGVmdExpc3QuZmlsdGVyKGVsZW1lbnQgPT4gIXJpZ2h0U2V0LmhhcyhlbGVtZW50KSk7XG59OyRozY9fb25jZS5saXN0RGlmZmVyZW5jZShsaXN0RGlmZmVyZW5jZSk7XG5oYXJkZW4obGlzdERpZmZlcmVuY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibGlzdERpZmZlcmVuY2UiOlsibGlzdERpZmZlcmVuY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJexd93kEAAB5BAAAKwAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtYXJyYXktaXRlcmF0b3IuanN7ImltcG9ydHMiOlsiLi9tYWtlLWl0ZXJhdG9yLmpzIl0sImV4cG9ydHMiOlsibWFrZUFycmF5SXRlcmF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlSXRlcmF0b3I7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtaXRlcmF0b3IuanNcIiwgW1tcIm1ha2VJdGVyYXRvclwiLFskaM2PX2EgPT4gKG1ha2VJdGVyYXRvciA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogQSBgaGFyZGVuYGluZyBhbmFsb2cgb2YgQXJyYXkucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0uXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0FycmF5PFQ+fSBhcnJcbiAqIEByZXR1cm5zIHtJdGVyYWJsZUl0ZXJhdG9yPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUFycmF5SXRlcmF0b3IgPSBhcnIgPT4ge1xuICBjb25zdCB7IGxlbmd0aCB9ID0gYXJyO1xuICBsZXQgaSA9IDA7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4ge1xuICAgIC8qKiBAdHlwZSB7VH0gKi9cbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgIHZhbHVlID0gYXJyW2ldO1xuICAgICAgaSArPSAxO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZSB9KTtcbiAgICB9XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdGVybWluYWwgdmFsdWUgZG9lc24ndCBtYXR0ZXIqL1xuICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZSB9KTtcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQXJyYXlJdGVyYXRvcihtYWtlQXJyYXlJdGVyYXRvcik7XG5oYXJkZW4obWFrZUFycmF5SXRlcmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFycmF5SXRlcmF0b3IiOlsibWFrZUFycmF5SXRlcmF0b3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXTavegYDAAAGAwAAJQAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtaXRlcmF0b3IuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VJdGVyYXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKipcbiAqIE1ha2VzIGEgb25lLXNob3QgaXRlcmFibGUgaXRlcmF0b3IgZnJvbSBhIHByb3ZpZGVkIGBuZXh0YCBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmF0b3JSZXN1bHQ8VD59IG5leHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZUl0ZXJhdG9yPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUl0ZXJhdG9yID0gbmV4dCA9PiB7XG4gIGNvbnN0IGl0ZXIgPSBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiBpdGVyLFxuICAgIG5leHQsXG4gIH0pO1xuICByZXR1cm4gaXRlcjtcbn07JGjNj19vbmNlLm1ha2VJdGVyYXRvcihtYWtlSXRlcmF0b3IpO1xuaGFyZGVuKG1ha2VJdGVyYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSXRlcmF0b3IiOlsibWFrZUl0ZXJhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHbnqxlvCgAAbwoAACIAAABAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWFwLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJvYmplY3RNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Y29uc3QgeyBlbnRyaWVzLCBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZlxuICogYW4gYXJyYXkgdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsXG4gKiBgb2JqZWN0TWFwYCB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgc3RyaW5nLW5hbWVkIG93biBlbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBUeXBpY2FsIHVzYWdlIGFwcGxpZXMgYG9iamVjdE1hcGAgdG8gYSBDb3B5UmVjb3JkLCBpLmUuLFxuICogYW4gb2JqZWN0IGZvciB3aGljaCBgcGFzc1N0eWxlT2Yob3JpZ2luYWwpID09PSAnY29weVJlY29yZCdgLiBGb3IgdGhlc2UsXG4gKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgZWRnZSBjYXNlcyBhcmlzZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgQ29weVJlY29yZFxuICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnR5IG5hbWVzLCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBtYXBwZWQgZm9ybSBvZlxuICogdGhlIG9yaWdpbmFsJ3MgdmFsdWVzLlxuICpcbiAqIFdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBhIENvcHlSZWNvcmQsIHNvbWUgZWRnZSBjYXNlcyB0byBiZSBhd2FyZSBvZlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogT25seSB0aGUgc3RyaW5nLW5hbWVkIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsXG4gKiAgICAgIGFyZSBtYXBwZWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIGBPYmplY3QuZW50cmllc2BcbiAqICAgICAgd2lsbCBjYXVzZSBpdHMgYGdldHRlcmAgdG8gYmUgY2FsbGVkIGFuZCB3aWxsIHVzZSB0aGUgcmVzdWx0aW5nXG4gKiAgICAgIHZhbHVlLlxuICogICAgKiBObyBtYXR0ZXIgd2hldGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgd2FzIGFuIGFjY2Vzc29yLCB3cml0YWJsZSxcbiAqICAgICAgb3IgY29uZmlndXJhYmxlLCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiAgICAgIG5vbi13cml0YWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgZGF0YSBwcm9wZXJ0aWVzLlxuICogICAgKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IG1heSBoYXZlIGluaGVyaXRlZCBmcm9tLCBhbmRcbiAqICAgICAgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgc3BlY2lhbCBraW5kIG9mIG9iamVjdCBzdWNoIGFzIGFuIGFycmF5LFxuICogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IGluaGVyaXRpbmcgZGlyZWN0bHlcbiAqICAgICAgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYW5kIHdob3NlIHN0YXRlIGlzIG9ubHkgdGhlc2UgbmV3IG1hcHBlZFxuICogICAgICBvd24gcHJvcGVydGllcy5cbiAqXG4gKiBXaXRoIHRoZXNlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIG5vdCBhIENvcHlSZWNvcmQsXG4gKiBpZiBhbGwgdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogYSBDb3B5UmVjb3JkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gT1xuICogQHRlbXBsYXRlIFIgbWFwIHJlc3VsdFxuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHBhcmFtIHsodmFsdWU6IE9ba2V5b2YgT10sIGtleToga2V5b2YgTykgPT4gUn0gbWFwRm5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8a2V5b2YgTywgUj59XG4gKi9cbiAgICAgICBjb25zdCBvYmplY3RNYXAgPSAob3JpZ2luYWwsIG1hcEZuKSA9PiB7XG4gIGNvbnN0IGVudHMgPSBlbnRyaWVzKG9yaWdpbmFsKTtcbiAgY29uc3QgbWFwRW50cyA9IGVudHMubWFwKFxuICAgIChbaywgdl0pID0+IC8qKiBAdHlwZSB7W2tleW9mIE8sIFJdfSAqLyAoW2ssIG1hcEZuKHYsIGspXSksXG4gICk7XG4gIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxrZXlvZiBPLCBSPn0gKi8gKGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSkpO1xufTskaM2PX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im9iamVjdE1hcCI6WyJvYmplY3RNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqJog2jsJAAA7CQAAJwAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL29iamVjdC1tZXRhLW1hcC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsib2JqZWN0TWV0YU1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtjb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGNyZWF0ZSwgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBMaWtlIGBvYmplY3RNYXBgLCBidXQgYXQgdGhlIHJlZmxlY3RpdmUgbGV2ZWwgb2YgcHJvcGVydHkgZGVzY3JpcHRvcnNcbiAqIHJhdGhlciB0aGFuIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBFeGNlcHQgZm9yIGhhcmRlbmluZywgdGhlIGVkZ2UgY2FzZSBiZWhhdmlvciBpcyBtb3N0bHkgdGhlIG9wcG9zaXRlIG9mXG4gKiB0aGUgYG9iamVjdE1hcGAgZWRnZSBjYXNlcy5cbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIEFsbCBvd24gcHJvcGVydGllcyBvZiB0aGUgb3JpZ2luYWwgYXJlIG1hcHBlZCwgZXZlbiBpZiBzeW1ib2wtbmFtZWRcbiAqICAgICAgb3Igbm9uLWVudW1lcmFibGUuXG4gKiAgICAqIElmIGFueSBvZiB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyB3ZXJlIGFjY2Vzc29ycywgdGhlIGRlc2NyaXB0b3JcbiAqICAgICAgY29udGFpbmluZyB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXJlIGdpdmVuIHRvIGBtZXRhTWFwRm5gLlxuICogICAgKiBUaGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIGFyZSBhY2NvcmRpbmcgdG8gdGhlIGRlc2NyaXB0b3JzXG4gKiAgICAgIHJldHVybmVkIGJ5IGBtZXRhTWFwRm5gLlxuICogICAgKiBUaGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IHdob3NlIHN0YXRlIGlzXG4gKiAgICAgIG9ubHkgdGhlc2UgbWFwcGVkIG93biBwcm9wZXJ0aWVzLiBJdCB3aWxsIGluaGVyaXQgZnJvbSB0aGUgdGhpcmRcbiAqICAgICAgYXJndW1lbnQgaWYgcHJvdmlkZWQsIGRlZmF1bHRpbmcgdG8gYE9iamVjdC5wcm90b3R5cGVgIGlmIG9taXR0ZWQuXG4gKlxuICogQmVjYXVzZSBhIHByb3BlcnR5IGRlc2NyaXB0b3IgaXMgZGlzdGluY3QgZnJvbSBgdW5kZWZpbmVkYCwgd2UgYnVuZGxlXG4gKiBtYXBwaW5nIGFuZCBmaWx0ZXJpbmcgdG9nZXRoZXIuIFdoZW4gdGhlIGBtZXRhTWFwRm5gIHJldHVybnMgYHVuZGVmaW5lZGAsXG4gKiB0aGF0IHByb3BlcnR5IGlzIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBhbnk+fSBPXG4gKiBAcGFyYW0ge099IG9yaWdpbmFsXG4gKiBAcGFyYW0geyhcbiAqICAgZGVzYzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8T1trZXlvZiBPXT4sXG4gKiAgIGtleToga2V5b2YgT1xuICogKSA9PiAoUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkKX0gbWV0YU1hcEZuXG4gKiBAcGFyYW0ge2FueX0gW3Byb3RvXVxuICogQHJldHVybnMge2FueX1cbiAqL1xuICAgICAgIGNvbnN0IG9iamVjdE1ldGFNYXAgPSAoXG4gIG9yaWdpbmFsLFxuICBtZXRhTWFwRm4sXG4gIHByb3RvID0gT2JqZWN0LnByb3RvdHlwZSxcbikgPT4ge1xuICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob3JpZ2luYWwpO1xuICBjb25zdCBrZXlzID0gb3duS2V5cyhvcmlnaW5hbCk7XG5cbiAgY29uc3QgZGVzY0VudHJpZXMgPSAvKiogQHR5cGUge1tQcm9wZXJ0eUtleSxQcm9wZXJ0eURlc2NyaXB0b3JdW119ICovIChcbiAgICBrZXlzXG4gICAgICAubWFwKGtleSA9PiBba2V5LCBtZXRhTWFwRm4oZGVzY3Nba2V5XSwga2V5KV0pXG4gICAgICAuZmlsdGVyKChbX2tleSwgb3B0RGVzY10pID0+IG9wdERlc2MgIT09IHVuZGVmaW5lZClcbiAgKTtcbiAgcmV0dXJuIGhhcmRlbihjcmVhdGUocHJvdG8sIGZyb21FbnRyaWVzKGRlc2NFbnRyaWVzKSkpO1xufTskaM2PX29uY2Uub2JqZWN0TWV0YU1hcChvYmplY3RNZXRhTWFwKTtcbmhhcmRlbihvYmplY3RNZXRhTWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im9iamVjdE1ldGFNYXAiOlsib2JqZWN0TWV0YU1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADYs0GCmQUAAJkFAAAlAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvdGhyb3ctbGFiZWxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJ0aHJvd0xhYmVsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEdpdmVuIGFuIGVycm9yIGBpbm5lckVycmAgYW5kIGEgYGxhYmVsYCwgdGhyb3dzIGEgc2ltaWxhclxuICogZXJyb3Igd2hvc2UgbWVzc2FnZSBzdHJpbmcgaXMgYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YC5cbiAqIFNlZSBgYXBwbHlMYWJlbGluZ0Vycm9yYCBmb3IgdGhlIG1vdGl2YXRpbmcgdXNlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGlubmVyRXJyXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxhYmVsXG4gKiBAcGFyYW0ge0lNUE9SVCgnc2VzJykuR2VuZXJpY0Vycm9yQ29uc3RydWN0b3J9IFtlcnJDb25zdHJ1Y3Rvcl1cbiAqIEBwYXJhbSB7SU1QT1JUKCdzZXMnKS5Bc3NlcnRNYWtlRXJyb3JPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuICAgICAgIGNvbnN0IHRocm93TGFiZWxlZCA9IChcbiAgaW5uZXJFcnIsXG4gIGxhYmVsLFxuICBlcnJDb25zdHJ1Y3RvciA9IHVuZGVmaW5lZCxcbiAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAodHlwZW9mIGxhYmVsID09PSAnbnVtYmVyJykge1xuICAgIGxhYmVsID0gYFske2xhYmVsfV1gO1xuICB9XG4gIGNvbnN0IG91dGVyRXJyID0gbWFrZUVycm9yKFxuICAgIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAsXG4gICAgZXJyQ29uc3RydWN0b3IsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgYW5ub3RhdGVFcnJvcihvdXRlckVyciwgWGBDYXVzZWQgYnkgJHtpbm5lckVycn1gKTtcbiAgdGhyb3cgb3V0ZXJFcnI7XG59OyRozY9fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidGhyb3dMYWJlbGVkIjpbInRocm93TGFiZWxlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA0oqGpogEAAKIBAAAiAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2Vudi1vcHRpb25zLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALwBM4I4FgAAOBYAACwAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExL3NyYy9lbnYtb3B0aW9ucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyIsImdldEVudmlyb25tZW50T3B0aW9uIiwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCIsIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLWNoZWNrKi9cblxuLyogYEBlbmRvL2Vudi1vcHRpb25zYCBuZWVkcyB0byBiZSBpbXBvcnRlZCBxdWl0ZSBlYXJseSwgYW5kIHNvIHNob3VsZCovXG4vKiBhdm9pZCBpbXBvcnRpbmcgZnJvbSBzZXMgb3IgYW55dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHNlcy4qL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG4vKiBQcmVsdWRlIG9mIGNoZWFwIGdvb2QgLSBlbm91Z2ggaW1pdGF0aW9ucyBvZiB0aGluZ3Mgd2UnZCB1c2Ugb3IqL1xuLyogZG8gZGlmZmVyZW50bHkgaWYgd2UgY291bGQgZGVwZW5kIG9uIHNlcyovXG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgbG9jYWxUaGlzID0gZ2xvYmFsVGhpcztcblxuY29uc3QgeyBPYmplY3QsIFJlZmxlY3QsIEFycmF5LCBTdHJpbmcsIEpTT04sIEVycm9yIH0gPSBsb2NhbFRoaXM7XG5jb25zdCB7IGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcblxuLyogU2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gdGhlIG9uZSBpbiBzZXMnIGNvbW1vbnMuanMgZXZlbiB0aG91Z2ggaXQqL1xuLyogdXNlcyB0aGUgb3RoZXIgdGVjaG5pcXVlLiovXG5jb25zdCB1bmN1cnJ5VGhpcyA9XG4gIGZuID0+XG4gIChyZWNlaXZlciwgLi4uYXJncykgPT5cbiAgICBhcHBseShmbiwgcmVjZWl2ZXIsIGFyZ3MpO1xuY29uc3QgYXJyYXlQdXNoID0gdW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuY29uc3QgYXJyYXlJbmNsdWRlcyA9IHVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyk7XG5jb25zdCBzdHJpbmdTcGxpdCA9IHVuY3VycnlUaGlzKFN0cmluZy5wcm90b3R5cGUuc3BsaXQpO1xuXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IEZhaWwgPSAobGl0ZXJhbHMsIC4uLmFyZ3MpID0+IHtcbiAgbGV0IG1zZyA9IGxpdGVyYWxzWzBdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBtc2cgPSBgJHttc2d9JHthcmdzW2ldfSR7bGl0ZXJhbHNbaSArIDFdfWA7XG4gIH1cbiAgdGhyb3cgRXJyb3IobXNnKTtcbn07XG5cbi8qIGVuZCBwcmVsdWRlKi9cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBgbWFrZUVudmlyb25tZW50Q2FwdG9yYCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZ2V0dGluZyBlbnZpcm9ubWVudFxuICogdmFyaWFibGVzLCBpZiB0aGV5IGFyZSBuZWVkZWQsIGFuZCBhIHdheSB0byBjYXRhbG9nIHRoZSBuYW1lcyBvZiBhbGxcbiAqIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3ZXJlIGNhcHR1cmVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhR2xvYmFsXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtkcm9wTmFtZXNdIERlZmF1bHRzIHRvIGZhbHNlLiBJZiB0cnVlLCBkb24ndCB0cmFja1xuICogbmFtZXMgdXNlZC5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbnZpcm9ubWVudENhcHRvciA9IChhR2xvYmFsLCBkcm9wTmFtZXMgPSBmYWxzZSkgPT4ge1xuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMgPSBbXTtcblxuICAvKipcbiAqIEdldHMgYW4gZW52aXJvbm1lbnQgb3B0aW9uIGJ5IG5hbWUgYW5kIHJldHVybnMgdGhlIG9wdGlvbiB2YWx1ZSBvciB0aGVcbiAqIGdpdmVuIGRlZmF1bHQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0U2V0dGluZ1xuICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdE90aGVyVmFsdWVzXVxuICogSWYgcHJvdmlkZWQsIHRoZSBvcHRpb24gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBvciBtYXRjaCBgZGVmYXVsdFNldHRpbmdgLlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbiA9IChcbiAgICBvcHRpb25OYW1lLFxuICAgIGRlZmF1bHRTZXR0aW5nLFxuICAgIG9wdE90aGVyVmFsdWVzID0gdW5kZWZpbmVkLFxuICApID0+IHtcbiAgICB0eXBlb2Ygb3B0aW9uTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWUgJHtxKG9wdGlvbk5hbWUpfSBtdXN0IGJlIGEgc3RyaW5nLmA7XG4gICAgdHlwZW9mIGRlZmF1bHRTZXR0aW5nID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gZGVmYXVsdCBzZXR0aW5nICR7cShcbiAgICAgICAgZGVmYXVsdFNldHRpbmcsXG4gICAgICApfSBtdXN0IGJlIGEgc3RyaW5nLmA7XG5cbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBsZXQgc2V0dGluZyA9IGRlZmF1bHRTZXR0aW5nO1xuICAgIGNvbnN0IGdsb2JhbFByb2Nlc3MgPSBhR2xvYmFsLnByb2Nlc3MgfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGdsb2JhbEVudiA9XG4gICAgICAodHlwZW9mIGdsb2JhbFByb2Nlc3MgPT09ICdvYmplY3QnICYmIGdsb2JhbFByb2Nlc3MuZW52KSB8fCB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxFbnYgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAob3B0aW9uTmFtZSBpbiBnbG9iYWxFbnYpIHtcbiAgICAgICAgaWYgKCFkcm9wTmFtZXMpIHtcbiAgICAgICAgICBhcnJheVB1c2goY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzLCBvcHRpb25OYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IGdsb2JhbEVudltvcHRpb25OYW1lXTtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwqL1xuICAgICAgICB0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZWQgJHtxKFxuICAgICAgICAgICAgb3B0aW9uTmFtZSxcbiAgICAgICAgICApfSwgaWYgcHJlc2VudCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUsIGdvdCAke3EoXG4gICAgICAgICAgICBvcHRpb25WYWx1ZSxcbiAgICAgICAgICApfWA7XG4gICAgICAgIHNldHRpbmcgPSBvcHRpb25WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgb3B0T3RoZXJWYWx1ZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgc2V0dGluZyA9PT0gZGVmYXVsdFNldHRpbmcgfHxcbiAgICAgIGFycmF5SW5jbHVkZXMob3B0T3RoZXJWYWx1ZXMsIHNldHRpbmcpIHx8XG4gICAgICBGYWlsYFVucmVjb2duaXplZCAke3Eob3B0aW9uTmFtZSl9IHZhbHVlICR7cShcbiAgICAgICAgc2V0dGluZyxcbiAgICAgICl9LiBFeHBlY3RlZCBvbmUgb2YgJHtxKFtkZWZhdWx0U2V0dGluZywgLi4ub3B0T3RoZXJWYWx1ZXNdKX1gO1xuICAgIHJldHVybiBzZXR0aW5nO1xuICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFtUPXN0cmluZ11cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG4gIGNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QgPSBvcHRpb25OYW1lID0+IHtcbiAgICBjb25zdCBvcHRpb24gPSBnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCAnJyk7XG4gICAgcmV0dXJuIGZyZWV6ZShvcHRpb24gPT09ICcnID8gW10gOiBzdHJpbmdTcGxpdChvcHRpb24sICcsJykpO1xuICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gW1Q9c3RyaW5nXVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEBwYXJhbSB7VH0gZWxlbWVudFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9IChvcHRpb25OYW1lLCBlbGVtZW50KSA9PlxuICAgIGFycmF5SW5jbHVkZXMoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdChvcHRpb25OYW1lKSwgZWxlbWVudCk7XG5cbiAgY29uc3QgZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzID0gKCkgPT4ge1xuICAgIHJldHVybiBmcmVlemUoWy4uLmNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lc10pO1xuICB9O1xuICBmcmVlemUoZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzKTtcblxuICByZXR1cm4gZnJlZXplKHtcbiAgICBnZXRFbnZpcm9ubWVudE9wdGlvbixcbiAgICBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0LFxuICAgIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG4gICAgZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VFbnZpcm9ubWVudENhcHRvcihtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuZnJlZXplKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG5cbi8qKlxuICogRm9yIHRoZSBzaW1wbGUgY2FzZSwgd2hlcmUgdGhlIGdsb2JhbCBpbiBxdWVzdGlvbiBpcyBgZ2xvYmFsVGhpc2AgYW5kIG5vXG4gKiByZXBvcnRpbmcgb2Ygb3B0aW9uIG5hbWVzIGlzIGRlc2lyZWQuXG4gKi9cbiAgICAgICBjb25zdCB7XG4gIGdldEVudmlyb25tZW50T3B0aW9uLFxuICBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0LFxuICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxufSA9IG1ha2VFbnZpcm9ubWVudENhcHRvcihsb2NhbFRoaXMsIHRydWUpOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbihnZXRFbnZpcm9ubWVudE9wdGlvbik7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7JGjNj19vbmNlLmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sImdldEVudmlyb25tZW50T3B0aW9uIjpbImdldEVudmlyb25tZW50T3B0aW9uIl0sImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiOlsiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCJdLCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAamZ24mQNAABkDQAAHQAAAEBlbmRvL2Vycm9ycy12MS4yLjEzL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJGYWlsIiwiWCIsImFubm90YXRlRXJyb3IiLCJhc3NlcnQiLCJiIiwiYmFyZSIsIm1ha2VFcnJvciIsIm5vdGUiLCJxIiwicXVvdGUiLCJyZWRhY3RlZCIsInRocm93UmVkYWN0ZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogZ2xvYmFsIGdsb2JhbFRoaXMgKi9cbi8qIFRoaXMgbW9kdWxlIGFzc3VtZXMgdGhlIGV4aXN0ZW5jZSBvZiBhIG5vbi1zdGFuZGFyZCBgYXNzZXJ0YCBob3N0IG9iamVjdC4qL1xuLyogU0VTIHZlcnNpb24gMC4xMS4wIGludHJvZHVjZXMgdGhpcyBnbG9iYWwgb2JqZWN0IGFuZCBlbnRhbmdsZXMgaXQqL1xuLyogd2l0aCB0aGUgYGNvbnNvbGVgIGhvc3Qgb2JqZWN0IGluIHNjb3BlIHdoZW4gaXQgaW5pdGlhbGl6ZXMsKi9cbi8qIGFsbG93aW5nIGVycm9ycywgcGFydGljdWxhcmx5IGFzc2VydGlvbiBlcnJvcnMsIHRvIGhpZGUgdGhlaXIgXCJkZXRhaWxzXCIqL1xuLyogZnJvbSBjYWxsZXJzIHRoYXQgbWlnaHQgY2F0Y2ggdGhvc2UgZXJyb3JzLCB0aGVuIHJldmVhbCB0aGVtIHRvIHRoZSovXG4vKiB1bmRlcmx5aW5nIGNvbnNvbGUuKi9cbi8qIFRvIHRoZSBleHRlbnQgdGhhdCB0aGlzIGBjb25zb2xlYCBpcyBjb25zaWRlcmVkIGEgcmVzb3VyY2UsKi9cbi8qIHRoaXMgbW9kdWxlIG11c3QgYmUgY29uc2lkZXJlZCBhIHJlc291cmNlIG1vZHVsZS4qL1xuXG4vKiBUaGUgYXNzZXJ0aW9ucyByZS1leHBvcnRlZCBoZXJlIGFyZSBkZWZpbmVkIGluKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL0hFQUQvcGFja2FnZXMvc2VzL3NyYy9lcnJvci9hc3NlcnQuanMqL1xuXG5jb25zdCBnbG9iYWxBc3NlcnQgPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuaWYgKGdsb2JhbEFzc2VydCA9PT0gdW5kZWZpbmVkKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BlbmRvL2Vycm9ycydgLFxuICApO1xufVxuXG5jb25zdCBtaXNzaW5nID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFtcbiAgJ3R5cGVvZicsXG4gICdlcnJvcicsXG4gICdmYWlsJyxcbiAgJ2VxdWFsJyxcbiAgJ3N0cmluZycsXG4gICdub3RlJyxcbiAgJ2RldGFpbHMnLFxuICAnRmFpbCcsXG4gICdxdW90ZScsXG4gIC8qIEFzIG9mIDIwMjQtMDIsIHRoZSBBZ29yaWMgY2hhaW4ncyBib290c3RyYXAgdmF0IHJ1bnMgd2l0aCBhIHZlcnNpb24gb2YgU0VTIHRoYXQqL1xuICAvKiBwcmVkYXRlcyBhZGRpdGlvbiBvZiB0aGUgJ2JhcmUnIG1ldGhvZCwgc28gd2UgbXVzdCB0b2xlcmF0ZSBpdHMgYWJzZW5jZSBhbmQgZmFsbCovXG4gIC8qIGJhY2sgdG8gcXVvdGUgYmVoYXZpb3IgaW4gdGhhdCBlbnZpcm9ubWVudCAoc2VlIGJlbG93KS4qL1xuICAvKiAnYmFyZScsKi9cbiAgJ21ha2VBc3NlcnQnLFxuXSkuZmlsdGVyKG5hbWUgPT4gZ2xvYmFsQXNzZXJ0W25hbWVdID09PSB1bmRlZmluZWQpO1xuaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICB0aHJvdyBFcnJvcihcbiAgICBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0IG1ldGhvZHMgJHttaXNzaW5nLmpvaW4oXG4gICAgICAnLCAnLFxuICAgICl9YCxcbiAgKTtcbn1cblxuLyogVGhlIGdsb2JhbCBhc3NlcnQgbWl4ZWQgYXNzZXJ0aW9ucyBhbmQgdXRpbGl0eSBmdW5jdGlvbnMuKi9cbi8qIFRoaXMgbW9kdWxlIHNwbGl0cyB0aGVtIGFwYXJ0Ki9cbi8qIGFuZCBhbHNvIHVwZGF0ZXMgdGhlIG5hbWVzIG9mIHRoZSB1dGlsaXR5IGZ1bmN0aW9ucy4qL1xuY29uc3Qge1xuICBiYXJlLFxuICBkZXRhaWxzOiByZWRhY3RlZCxcbiAgZXJyb3I6IG1ha2VFcnJvcixcbiAgRmFpbDogdGhyb3dSZWRhY3RlZCxcbiAgbWFrZUFzc2VydDogX29taXR0ZWRNYWtlQXNzZXJ0LFxuICBub3RlLFxuICBxdW90ZSxcbiAgLi4uYXNzZXJ0aW9uc1xufSA9IGdsb2JhbEFzc2VydDtcbi8qKiBAdHlwZSB7SU1QT1JUKFwic2VzXCIpLkFzc2VydGlvbkZ1bmN0aW9ucyB9ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIG1pc3NpbmcgcHJvcGVydGllcyBhc3NpZ25lZCBuZXh0Ki8kaM2PX29uY2UucmVkYWN0ZWQocmVkYWN0ZWQpOyRozY9fb25jZS5tYWtlRXJyb3IobWFrZUVycm9yKTskaM2PX29uY2UudGhyb3dSZWRhY3RlZCh0aHJvd1JlZGFjdGVkKTskaM2PX29uY2Uubm90ZShub3RlKTskaM2PX29uY2UucXVvdGUocXVvdGUpO1xuY29uc3QgYXNzZXJ0ID0gKHZhbHVlLCBvcHREZXRhaWxzLCBlcnJDb250cnVjdG9yLCBvcHRpb25zKSA9PlxuICBnbG9iYWxBc3NlcnQodmFsdWUsIG9wdERldGFpbHMsIGVyckNvbnRydWN0b3IsIG9wdGlvbnMpOyRozY9fb25jZS5hc3NlcnQoYXNzZXJ0KTtcbk9iamVjdC5hc3NpZ24oYXNzZXJ0LCBhc3NlcnRpb25zKTtcblxuLyogQXMgb2YgMjAyNC0wMiwgdGhlIEFnb3JpYyBjaGFpbidzIGJvb3RzdHJhcCB2YXQgcnVucyB3aXRoIGEgdmVyc2lvbiBvZiBTRVMqL1xuLyogdGhhdCBwcmVkYXRlcyB0aGUgYWRkaXRpb24gb2YgdGhlICdiYXJlJyBtZXRob2QsIHNvIHdlIG11c3QgZmFsbCBiYWNrIHRvKi9cbi8qIHF1b3RlIGJlaGF2aW9yIGZvciB0aGF0IGVudmlyb25tZW50LiovXG5jb25zdCBiYXJlT3JRdW90ZSA9IGJhcmUgfHwgcXVvdGU7XG5cbi8qIFhYWCBtb2R1bGUgZXhwb3J0cyBmYWlsIGlmIHRoZXNlIGFyZW4ndCBpbiBzY29wZSovXG4vKiogQGltcG9ydCB7QXNzZXJ0TWFrZUVycm9yT3B0aW9ucywgRGV0YWlscywgR2VuZXJpY0Vycm9yQ29uc3RydWN0b3J9IGZyb20gJ3NlcycgKi8kaM2PX29uY2UuYmFyZU9yUXVvdGUoYmFyZU9yUXVvdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVkYWN0ZWQiOlsicmVkYWN0ZWQiXSwiWCI6WyJyZWRhY3RlZCJdLCJtYWtlRXJyb3IiOlsibWFrZUVycm9yIl0sInRocm93UmVkYWN0ZWQiOlsidGhyb3dSZWRhY3RlZCJdLCJGYWlsIjpbInRocm93UmVkYWN0ZWQiXSwibm90ZSI6WyJub3RlIl0sImFubm90YXRlRXJyb3IiOlsibm90ZSJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sImFzc2VydCI6WyJhc3NlcnQiXSwiYmFyZSI6WyJiYXJlT3JRdW90ZSJdLCJiIjpbImJhcmVPclF1b3RlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANPpRggQRwAAEEcAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIiwiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHRyYWNrVHVybnMsbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLFskaM2PX2EgPT4gKHRyYWNrVHVybnMgPSAkaM2PX2EpXV1dXSxbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cblxuY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSwgRmFpbCwgZXJyb3I6IG1ha2VFcnJvciB9ID0gYXNzZXJ0O1xuY29uc3QgeyBhc3NpZ24sIGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEBpbXBvcnQgeyBIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yLCBSZW1vdGFibGVCcmFuZCwgQ2FsbGFibGUsIFNldHRsZXIgfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCBvblNlbmQgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fU0VORF9CUkVBS1BPSU5UUycpO1xuXG4vKiogQHR5cGUge1Byb3h5SGFuZGxlcjxhbnk+fSAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlciA9IHtcbiAgc2V0KF90YXJnZXQsIF9wcm9wLCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGlzRXh0ZW5zaWJsZShfdGFyZ2V0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBzZXRQcm90b3R5cGVPZihfdGFyZ2V0LCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KF90YXJnZXQsIF9wcm9wKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxufTtcblxuLyogRSBQcm94eSBoYW5kbGVycyBwcmV0ZW5kIHRoYXQgYW55IHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgdGFyZ2V0IGFuZCByZXR1cm5zKi9cbi8qIGEgZnVuY3Rpb24gZm9yIHRoZWlyIHZhbHVlLiBXaGlsZSB0aGlzIGZ1bmN0aW9uIGlzIFwiYm91bmRcIiBieSBjb250ZXh0LCBpdCBpcyovXG4vKiBtZWFudCB0byBiZSBjYWxsZWQgYXMgYSBtZXRob2QuIEZvciB0aGF0IHJlYXNvbiwgdGhlIHJldHVybmVkIGZ1bmN0aW9uKi9cbi8qIGluY2x1ZGVzIGEgY2hlY2sgdGhhdCB0aGUgYHRoaXNgIGFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBpbml0aWFsKi9cbi8qIHJlY2VpdmVyIHdoZW4gdGhlIGZ1bmN0aW9uIHdhcyByZXRyaWV2ZWQuKi9cbi8qIEUgUHJveHkgaGFuZGxlcnMgYWxzbyBmb3J3YXJkIGRpcmVjdCBjYWxscyB0byB0aGUgdGFyZ2V0IGluIGNhc2UgdGhlIHJlbW90ZSovXG4vKiBpcyBhIGZ1bmN0aW9uIGluc3RlYWQgb2YgYW4gb2JqZWN0LiBObyBzdWNoIHJlY2VpdmVyIGNoZWNrcyBhcmUgbmVjZXNzYXJ5IGluKi9cbi8qIHRoYXQgY2FzZS4qL1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRSh4KS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcmVjaXBpZW50IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcjx1bmtub3duPn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbiAgICAgICAgICAvKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuICAgICAgICAgIC8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4gICAgICAgICAgLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuICAgICAgICAgIC8qKiBAdHlwZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPHVua25vd24+fSAqL1xuICAgICAgICAgIFtwcm9wZXJ0eUtleV0oLi4uYXJncykge1xuICAgICAgICAgICAgaWYgKHRoaXMgIT09IHJlY2VpdmVyKSB7XG4gICAgICAgICAgICAgIC8qIFJlamVjdCB0aGUgYXN5bmMgZnVuY3Rpb24gY2FsbCovXG4gICAgICAgICAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgICAgICAgbWFrZUVycm9yKFxuICAgICAgICAgICAgICAgICAgWGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShwcm9wZXJ0eUtleSl9XCIgbWV0aG9kIG9mIEUoJHtxKFxuICAgICAgICAgICAgICAgICAgICByZWNpcGllbnQsXG4gICAgICAgICAgICAgICAgICApfSlgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICAgICAgICAgICAgZGVidWdnZXI7IC8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbiAgICAgICAgICAgICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIG1ldGhvZC1jYWxsKi9cbiAgICAgICAgICAgICAgLyogbWVzc2FnZSwqL1xuICAgICAgICAgICAgICAvKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuICAgICAgICAgICAgICAvKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QocmVjaXBpZW50LCBwcm9wZXJ0eUtleSwgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovXG4gICAgICAgIH1bcHJvcGVydHlLZXldLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIGFyZ0FycmF5ID0gW10pID0+IHtcbiAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgICAgIGRlYnVnZ2VyOyAvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4gICAgICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBmdW5jdGlvbi1jYWxsIG1lc3NhZ2UsKi9cbiAgICAgICAgLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbiAgICAgICAgLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuICAgICAgfVxuICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LCBhcmdBcnJheSk7XG4gICAgfSxcbiAgICBoYXM6IChfdGFyZ2V0LCBfcCkgPT4ge1xuICAgICAgLyogV2UganVzdCBwcmV0ZW5kIGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUuc2VuZE9ubHkoeClcbiAqIEl0IGlzIGEgdmFyaWFudCBvbiB0aGUgRSh4KSBQcm94eSBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7YW55fSByZWNpcGllbnQgQW55IHZhbHVlIHBhc3NlZCB0byBFLnNlbmRPbmx5KHgpXG4gKiBAcGFyYW0ge0hhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyPHVua25vd24+fSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyID0gKHJlY2lwaWVudCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgIHJldHVybiBoYXJkZW4oXG4gICAgICAgIHtcbiAgICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4gICAgICAgICAgLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbiAgICAgICAgICAvKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuICAgICAgICAgIC8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbiAgICAgICAgICAvKiogQHR5cGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gdW5kZWZpbmVkfSAqL1xuICAgICAgICAgIFtwcm9wZXJ0eUtleV0oLi4uYXJncykge1xuICAgICAgICAgICAgLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG4gICAgICAgICAgICB0aGlzID09PSByZWNlaXZlciB8fFxuICAgICAgICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgICApfVwiIG1ldGhvZCBvZiBFLnNlbmRPbmx5KCR7cShyZWNpcGllbnQpfSlgO1xuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuICAgICAgICAgICAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgbWV0aG9kLWNhbGwqL1xuICAgICAgICAgICAgICAvKiBtZXNzYWdlLCovXG4gICAgICAgICAgICAgIC8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4gICAgICAgICAgICAgIC8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkocmVjaXBpZW50LCBwcm9wZXJ0eUtleSwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdzQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICAgICAgZGVidWdnZXI7IC8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbiAgICAgICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIGZ1bmN0aW9uLWNhbGwgbWVzc2FnZSwqL1xuICAgICAgICAvKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuICAgICAgICAvKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gICAgICB9XG4gICAgICBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkocmVjaXBpZW50LCBhcmdzQXJyYXkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFLmdldCh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHthbnl9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLmdldCh4KVxuICogQHBhcmFtIHtIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcjx1bmtub3duPn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVHZXRQcm94eUhhbmRsZXIgPSAoeCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBoYXM6IChfdGFyZ2V0LCBfcHJvcCkgPT4gdHJ1ZSxcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiBIYW5kbGVkUHJvbWlzZS5nZXQoeCwgcHJvcCksXG4gIH0pO1xuXG4vKipcbiAqIGBmcmVlemVgIGJ1dCBub3QgYGhhcmRlbmAgdGhlIHByb3h5IHRhcmdldCBzbyBpdCByZW1haW5zIHRyYXBwaW5nLlxuICogVGh1cywgaXQgc2hvdWxkIG5vdCBiZSBzaGFyZWQgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvZG9jcy9wcmVwYXJpbmctZm9yLXN0YWJpbGl6ZS5tZFxuICovXG5jb25zdCBmdW5jVGFyZ2V0ID0gZnJlZXplKCgpID0+IHt9KTtcblxuLyoqXG4vKipcbiAqIGBmcmVlemVgIGJ1dCBub3QgYGhhcmRlbmAgdGhlIHByb3h5IHRhcmdldCBzbyBpdCByZW1haW5zIHRyYXBwaW5nLlxuICogVGh1cywgaXQgc2hvdWxkIG5vdCBiZSBzaGFyZWQgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvZG9jcy9wcmVwYXJpbmctZm9yLXN0YWJpbGl6ZS5tZFxuICovXG5jb25zdCBvYmpUYXJnZXQgPSBmcmVlemUoeyBfX3Byb3RvX186IG51bGwgfSk7XG5cbi8qKlxuICogQHBhcmFtIHtIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICovXG5jb25zdCBtYWtlRSA9IEhhbmRsZWRQcm9taXNlID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBhc3NpZ24oXG4gICAgICAvKipcbiAqIEUoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gY2FsbCBhcmJpdHJhcnkgbWV0aG9kcy4gRWFjaCBvZiB0aGVzZVxuICogbWV0aG9kIGNhbGxzIHJldHVybnMgYSBwcm9taXNlLiBUaGUgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBvbiB3aGF0ZXZlclxuICogJ3gnIGRlc2lnbmF0ZXMgKG9yIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogQW4gZXhhbXBsZSBjYWxsIHdvdWxkIGJlXG4gKlxuICogRSh6b2UpLmluc3RhbGwoYnVuZGxlKVxuICogICAudGhlbihpbnN0YWxsYXRpb25IYW5kbGUgPT4geyAuLi4gfSlcbiAqICAgLmNhdGNoKGVyciA9PiB7IC4uLiB9KTtcbiAqXG4gKiAgU2VlIGh0dHBzOi8vZW5kb2pzLmdpdGh1Yi5pby9lbmRvL2Z1bmN0aW9ucy9fZW5kb19mYXIuRS5odG1sIGZvciBkZXRhaWxzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBtZXRob2QvZnVuY3Rpb24gY2FsbFxuICogQHJldHVybnMge0VDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICovXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCB0eXBlZGVmKi9cbiAgICAgIHggPT4gbmV3IFByb3h5KGZ1bmNUYXJnZXQsIG1ha2VFUHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG4gICAgICB7XG4gICAgICAgIC8qKlxuICogRS5nZXQoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gZ2V0IGFyYml0cmFyeSBwcm9wZXJ0aWVzLlxuICogRWFjaCBvZiB0aGVzZSBwcm9wZXJ0aWVzIHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgcHJvcGVydHkuICBUaGUgcHJvbWlzZVxuICogdmFsdWUgd2lsbCBiZSB0aGUgcHJvcGVydHkgZmV0Y2hlZCBmcm9tIHdoYXRldmVyICd4JyBkZXNpZ25hdGVzIChvclxuICogcmVzb2x2ZXMgdG8pIGluIGEgZnV0dXJlIHR1cm4sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgcHJvcGVydHkgZ2V0XG4gKiBAcmV0dXJucyB7RUdldHRlcnM8TG9jYWxSZWNvcmQ8VD4+fSBwcm9wZXJ0eSBnZXQgcHJveHlcbiAqIEByZWFkb25seVxuICovXG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIHR5cGVkZWYqL1xuICAgICAgICBnZXQ6IHggPT4gbmV3IFByb3h5KG9ialRhcmdldCwgbWFrZUVHZXRQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcblxuICAgICAgICAvKipcbiAqIEUucmVzb2x2ZSh4KSBjb252ZXJ0cyB4IHRvIGEgaGFuZGxlZCBwcm9taXNlLiBJdCBpc1xuICogc2hvcnRoYW5kIGZvciBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgaGFuZGxlZCBwcm9taXNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gaGFuZGxlZCBwcm9taXNlIGZvciB4XG4gKiBAcmVhZG9ubHlcbiAqL1xuICAgICAgICByZXNvbHZlOiBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlLFxuXG4gICAgICAgIC8qKlxuICogRS5zZW5kT25seSByZXR1cm5zIGEgcHJveHkgc2ltaWxhciB0byBFLCBidXQgZm9yIHdoaWNoIHRoZSByZXN1bHRzXG4gKiBhcmUgaWdub3JlZCAodW5kZWZpbmVkIGlzIHJldHVybmVkKS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgbWV0aG9kL2Z1bmN0aW9uIGNhbGxcbiAqIEByZXR1cm5zIHtFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbiAgICAgICAgc2VuZE9ubHk6IHggPT5cbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCB0eXBlZGVmKi9cbiAgICAgICAgICBuZXcgUHJveHkoZnVuY1RhcmdldCwgbWFrZUVTZW5kT25seVByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuXG4gICAgICAgIC8qKlxuICogRS53aGVuKHgsIHJlcywgcmVqKSBpcyBlcXVpdmFsZW50IHRvXG4gKiBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4ocmVzLCByZWopXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVSA9IFRdXG4gKiBAcGFyYW0ge1R8UHJvbWlzZUxpa2U8VD59IHggdmFsdWUgdG8gY29udmVydCB0byBhIGhhbmRsZWQgcHJvbWlzZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IEVSZWY8VT59IFtvbmZ1bGZpbGxlZF1cbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiBFUmVmPFU+fSBbb25yZWplY3RlZF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFU+fVxuICogQHJlYWRvbmx5XG4gKi9cbiAgICAgICAgd2hlbjogKHgsIG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSA9PlxuICAgICAgICAgIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihcbiAgICAgICAgICAgIC4uLnRyYWNrVHVybnMoW29uZnVsZmlsbGVkLCBvbnJlamVjdGVkXSksXG4gICAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgKSxcbiAgKTtcbn07XG5cbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxtYWtlRT59IEVQcm94eSAqL1xuXG4vKipcbiAqIERlY2xhcmUgYW4gb2JqZWN0IHRoYXQgaXMgcG90ZW50aWFsbHkgYSBmYXIgcmVmZXJlbmNlIG9mIHR5cGUgUHJpbWFyeSB3aG9zZVxuICogYXV4aWxsaWFyeSBkYXRhIGhhcyB0eXBlIExvY2FsLiAgVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBjb25zdW1lcnMgb2ZcbiAqIEZhciBvYmplY3RzIGluIGFyZ3VtZW50cyBhbmQgZGVjbGFyYXRpb25zOyB0aGUgb25seSBjcmVhdG9ycyBvZiBGYXIgb2JqZWN0c1xuICogYXJlIGRpc3RyaWJ1dGVkIG9iamVjdCBjcmVhdG9yIGNvbXBvbmVudHMgbGlrZSB0aGUgYEZhcmAgb3IgYFJlbW90YWJsZWBcbiAqIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgUHJpbWFyeSBUaGUgdHlwZSBvZiB0aGUgcHJpbWFyeSByZWZlcmVuY2UuXG4gKiBAdGVtcGxhdGUgW0xvY2FsPURhdGFPbmx5PFByaW1hcnk+XSBUaGUgbG9jYWwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0LlxuICogQHR5cGVkZWYge0VSZWY8TG9jYWwgJiBSZW1vdGFibGVCcmFuZDxMb2NhbCwgUHJpbWFyeT4+fSBGYXJSZWZcbiAqL1xuXG4vKipcbiAqIGBEYXRhT25seTxUPmAgbWVhbnMgdG8gcmV0dXJuIGEgcmVjb3JkIHR5cGUgYFQyYCBjb25zaXN0aW5nIG9ubHkgb2ZcbiAqIHByb3BlcnRpZXMgdGhhdCBhcmUgKm5vdCogZnVuY3Rpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIHRvIGJlIGZpbHRlcmVkLlxuICogQHR5cGVkZWYge09taXQ8VCwgRmlsdGVyZWRLZXlzPFQsIENhbGxhYmxlPj59IERhdGFPbmx5XG4gKi9cblxuLyoqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMxMzk0fVxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQcm9taXNlTGlrZTxUPiB8IFR9IEVSZWZcbiAqIERlY2xhcmUgdGhhdCBgVGAgbWF5IG9yIG1heSBub3QgYmUgYSBQcm9taXNlLiAgVGhpcyBzaG91bGQgYmUgdXNlZCBvbmx5IGZvclxuICogY29uc3VtZXJzIG9mIGFyZ3VtZW50cyBhbmQgZGVjbGFyYXRpb25zOyByZXR1cm4gdmFsdWVzIHNob3VsZCBzcGVjaWZpY2FsbHkgYmVcbiAqIGBQcm9taXNlPFQ+YCBvciBgVGAgaXRzZWxmLlxuICovXG5cbi8qKlxuICogVGhlIGF3YWl0ZWQgcmV0dXJuIHR5cGUgb2YgYSBmdW5jdGlvbi5cbiAqIEZvciB0aGUgZXZlbnR1YWwgcmVzdWx0IG9mIGFuIEUgY2FsbCwgQHNlZSB7RVJlc3VsdH0gb3IgQHNlZSB7RUNhbGxhYmxlUmV0dXJufVxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBpbmZlciBSID8gQXdhaXRlZDxSPiA6IG5ldmVyfSBFUmV0dXJuXG4gKi9cblxuLyoqXG4gKiBBbiBldmVudHVhbCB2YWx1ZSB3aGVyZSByZW1vdGFibGUgb2JqZWN0cyBhcmUgcmVjdXJzaXZlbHkgbWFwcGVkIHRvIFJlbW90ZSB0eXBlc1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QXdhaXRlZDxUPn0gRVJlc3VsdFxuICovXG5cbi8qKlxuICogRXhwZXJpbWVudGFsIHR5cGUgbWFwcGluZyByZW1vdGFibGUgb2JqZWN0cyB0byBSZW1vdGUgdHlwZXNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgMCBleHRlbmRzICgxICYgVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgVCBpcyBhbnlcbiAqICAgICA/IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBhbnkgdHlwZSB0aHJvdWdoIHRoZSByZXN1bHRcbiAqICAgICA6IFQgZXh0ZW5kcyBSZW1vdGFibGVCcmFuZDxpbmZlciBMLCBpbmZlciBQPiAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIFJlbW90YWJsZVxuICogICAgICAgPyAoUCB8IFJlbW90YWJsZUJyYW5kPEwsIFA+KSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXAgaXQgdG8gaXRzIFwibWF5YmUgcmVtb3RlXCIgZm9ybSAocHJpbWFyeSBiZWhhdmlvciBvciByZW1vdGFibGUgcHJlc2VuY2UpXG4gKiAgICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPiAgICAgICAgICAgICAgICAgICAgIC8vIElmIFQgaXMgYSBwcm9taXNlXG4gKiAgICAgICAgID8gUHJvbWlzZTxFQXdhaXRlZFJlc3VsdDxBd2FpdGVkPFQ+Pj4gICAgICAgICAgICAgIC8vIG1hcCBpdHMgcmVzb2x1dGlvblxuICogICAgICAgICA6IFQgZXh0ZW5kcyAobnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBzeW1ib2wgfCBiaWdpbnQgfCBDYWxsYWJsZSkgLy8gSW50ZXJzZWN0aW9ucyBvZiB0aGVzZSB0eXBlcyB3aXRoIG9iamVjdHMgYXJlIG5vdCBtYXBwZWRcbiAqICAgICAgICAgICA/IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbWl0aXZlcyBhbmQgbm9uLXJlbW90YWJsZSBmdW5jdGlvbnMgYXJlIHBhc3NlZC10aHJvdWdoXG4gKiAgICAgICAgICAgOiBUIGV4dGVuZHMgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gKiAgICAgICAgICAgICA/IHsgW1AgaW4ga2V5b2YgVF06IEVBd2FpdGVkUmVzdWx0PFRbUF0+OyB9ICAgIC8vIG90aGVyIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgY29weSBkYXRhIGFuZCBwcm9wZXJ0aWVzIG1hcHBlZFxuICogICAgICAgICAgICAgOiBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIGFueXRoaW5nIHdhc24ndCBjb3ZlcmVkLCBmYWxsYmFjayB0byBwYXNzLXRocm91Z2hcbiAqICl9IEVBd2FpdGVkUmVzdWx0XG4gKi9cblxuLyoqXG4gKiBUaGUgQHNlZSB7RVJlc3VsdH0gcmV0dXJuIHR5cGUgb2YgYSByZW1vdGUgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gVFxuICogQHR5cGVkZWYgeyhcbiAqICAgMCBleHRlbmRzICgxICYgVCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIFQgaXMgYW55XG4gKiAgICAgPyBhbnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wYWdhdGUgdGhlIGFueSB0eXBlIHRocm91Z2ggdGhlIHJlc3VsdFxuICogICAgIDogVCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gaW5mZXIgUiAgLy8gRWxzZSBpbmZlciB0aGUgcmV0dXJuIHR5cGVcbiAqICAgICAgID8gRVJlc3VsdDxSPiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHRoZSBmdXR1cmUsIG1hcCB0aGUgZXZlbnR1YWwgcmVzdWx0XG4gKiAgICAgICA6IG5ldmVyXG4gKiApfSBFQ2FsbGFibGVSZXR1cm5cbiAqL1xuXG4vKiBUT0RPOiBGaWd1cmUgb3V0IGEgd2F5IHRvIG1hcCBnZW5lcmljIGNhbGxhYmxlIHJldHVybiB0eXBlcywgb3IgYXQgbGVhc3QgYmV0dGVyIGRldGVjdCB0aGVtLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy82MTgzOC4gV2l0aG91dCB0aGF0LCBgRShzdGFydEdvdmVybmVkVXBncmFkYWJsZSlgKi9cbi8qIGluIGFnb3JpYy1zZGsgZG9lc24ndCBwcm9wYWdhdGUgdGhlIHN0YXJ0IGZ1bmN0aW9uIHR5cGUuKi9cbi8qKlxuICogTWFwcyBhIGNhbGxhYmxlIHRvIGl0cyByZW1vdGVseSBjYWxsZWQgdHlwZVxuICpcbiAqIEB0ZW1wbGF0ZSB7Q2FsbGFibGV9IFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgICBSZXR1cm5UeXBlPFQ+IGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT4gICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBjYWxsYWJsZSByZXR1cm5zIGEgcHJvbWlzZVxuICogICAgICA/IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnlwYXNzIG1hcHBpbmcgdG8gbWFpbnRhaW4gYW55IGdlbmVyaWNcbiAqICAgICAgOiAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTxFQ2FsbGFibGVSZXR1cm48VD4+IC8vIE1hcCBpdCBhbnl3YXkgdG8gZW5zdXJlIHByb21pc2UgcmV0dXJuIHR5cGVcbiAqICl9IEVDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUW1BdPlxuICogICAgIDogbmV2ZXI7XG4gKiB9fSBFTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT5cbiAqICAgICA/IFRbUF1cbiAqICAgICA6IFByb21pc2U8QXdhaXRlZDxUW1BdPj47XG4gKiB9fSBFR2V0dGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDYWxsYWJsZX0gVFxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBQcm9taXNlPHZvaWQ+fSBFU2VuZE9ubHlDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/IEVTZW5kT25seUNhbGxhYmxlPFRbUF0+XG4gKiAgICAgOiBuZXZlcjtcbiAqIH19IEVTZW5kT25seU1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/IEVTZW5kT25seUNhbGxhYmxlPFQ+ICYgRVNlbmRPbmx5TWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICAgICA6IDAgZXh0ZW5kcyAoMSAmIFQpXG4gKiAgICAgICA/IG5ldmVyXG4gKiAgICAgICA6IEVTZW5kT25seU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gRUNhbGxhYmxlPFQ+ICYgRU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiAgICAgOiAwIGV4dGVuZHMgKDEgJiBUKVxuICogICAgICAgPyBuZXZlclxuICogICAgICAgOiBFTWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICl9IEVDYWxsYWJsZU9yTWV0aG9kc1xuICovXG5cbi8qKlxuICogUmV0dXJuIGEgdW5pb24gb2YgcHJvcGVydHkgbmFtZXMvc3ltYm9scy9udW1iZXJzIFAgZm9yIHdoaWNoIHRoZSByZWNvcmQgZWxlbWVudCBUW1BdJ3MgdHlwZSBleHRlbmRzIFUuXG4gKlxuICogR2l2ZW4gY29uc3QgeCA9IHsgYTogMTIzLCBiOiAnaGVsbG8nLCBjOiA0MiwgNDk6ICgpID0+IHt9LCA1MzogNjcgfSxcbiAqXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIG51bWJlcj4gaXMgdGhlIHR5cGUgJ2EnIHwgJ2MnIHwgNTMuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIHN0cmluZz4gaXMgdGhlIHR5cGUgJ2InLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCA0MiB8IDY3PiBpcyB0aGUgdHlwZSAnYycgfCA1My5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgYm9vbGVhbj4gaXMgdGhlIHR5cGUgbmV2ZXIuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAdHlwZWRlZiB7eyBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIFUgPyBQIDogbmV2ZXI7IH1ba2V5b2YgVF19IEZpbHRlcmVkS2V5c1xuICovXG5cbi8qKlxuICogYFBpY2tDYWxsYWJsZTxUPmAgbWVhbnMgdG8gcmV0dXJuIGEgc2luZ2xlIHJvb3QgY2FsbGFibGUgb3IgYSByZWNvcmQgdHlwZVxuICogY29uc2lzdGluZyBvbmx5IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgZnVuY3Rpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBSZXR1cm5UeXBlPFQ+ICAgICAgICAgICAgICAgICAgICAgLy8gYSByb290IGNhbGxhYmxlLCBubyBtZXRob2RzXG4gKiAgICAgOiBQaWNrPFQsIEZpbHRlcmVkS2V5czxULCBDYWxsYWJsZT4+ICAgICAgICAgIC8vIGFueSBjYWxsYWJsZSBtZXRob2RzXG4gKiApfSBQaWNrQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIGBSZW1vdGVGdW5jdGlvbnM8VD5gIG1lYW5zIHRvIHJldHVybiB0aGUgZnVuY3Rpb25zIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlbW90ZWx5IGNhbGxhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj4gICAvLyBpZiBhIGdpdmVuIFQgaXMgc29tZSByZW1vdGUgaW50ZXJmYWNlIFJcbiAqICAgICA/IFBpY2tDYWxsYWJsZTxSPiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIGNhbGxhYmxlIHByb3BlcnRpZXMgb2YgUlxuICogICAgIDogVCBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+ICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlmIFQgaXMgYSBwcm9taXNlXG4gKiAgICAgICA/IFJlbW90ZUZ1bmN0aW9uczxVPiAgICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2Ugb24gdGhlIHJlc29sdmVkIHZhbHVlIG9mIFRcbiAqICAgICAgIDogVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCByZXR1cm4gVFxuICogKX0gUmVtb3RlRnVuY3Rpb25zXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+XG4gKiAgICAgPyBMXG4gKiAgICAgOiBUIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT5cbiAqICAgICA/IExvY2FsUmVjb3JkPFU+XG4gKiAgICAgOiBUXG4gKiApfSBMb2NhbFJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtSID0gdW5rbm93bl1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHByb21pc2U6IFByb21pc2U8Uj47XG4gKiAgIHNldHRsZXI6IFNldHRsZXI8Uj47XG4gKiB9fSBFUHJvbWlzZUtpdFxuICovXG5cbi8qKlxuICogRGVjbGFyZSBhIG5lYXIgb2JqZWN0IHRoYXQgbXVzdCBvbmx5IGJlIGludm9rZWQgd2l0aCBFLCBldmVuIGxvY2FsbHkuICBJdFxuICogc3VwcG9ydHMgdGhlIGBUYCBpbnRlcmZhY2UgYnV0IGFkZGl0aW9uYWxseSBwZXJtaXRzIGBUYCdzIG1ldGhvZHMgdG8gcmV0dXJuXG4gKiBgUHJvbWlzZUxpa2VgcyBldmVuIGlmIGBUYCBkZWNsYXJlcyB0aGVtIGFzIG9ubHkgc3luY2hyb25vdXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IEVSZWY8QXdhaXRlZDxFT25seTxSZXR1cm5UeXBlPFQ+Pj4+XG4gKiAgICAgOiBUIGV4dGVuZHMgUmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZT5cbiAqICAgICA/IHtcbiAqICAgICAgICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBDYWxsYWJsZVxuICogICAgICAgICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VFtLXT4pID0+IEVSZWY8QXdhaXRlZDxFT25seTxSZXR1cm5UeXBlPFRbS10+Pj4+XG4gKiAgICAgICAgICAgOiBUW0tdO1xuICogICAgICAgfVxuICogICAgIDogVFxuICogKX0gRU9ubHlcbiAqLyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHOVMVJyFAAAchQAACcAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbG9jYWwuanN7ImltcG9ydHMiOlsiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZ2V0TWV0aG9kTmFtZXMiLCJsb2NhbEFwcGx5RnVuY3Rpb24iLCJsb2NhbEFwcGx5TWV0aG9kIiwibG9jYWxHZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBnZXRQcm90b3R5cGVPZiwgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5LCBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG5jb25zdCBudHlwZW9mID0gc3BlY2ltZW4gPT4gKHNwZWNpbWVuID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHNwZWNpbWVuKTtcblxuY29uc3Qgb25EZWxpdmVyeSA9IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcignRU5ET19ERUxJVkVSWV9CUkVBS1BPSU5UUycpO1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCBgaXNQcmltaXRpdmVgIHRoYXQncyBjdXJyZW50bHkgaW4gYEBlbmRvL3Bhc3Mtc3R5bGVgLlxuICogTGF5ZXJpbmcgY29uc3RyYWludHMgbWFrZSB0aGlzIHRyaWNreSwgd2hpY2ggaXMgd2h5IHdlIGhhdmVuJ3QgeWV0IGZpZ3VyZWRcbiAqIG91dCBob3cgdG8gZG8gdGhpcy5cbiAqXG4gKiBAdHlwZSB7KHZhbDogdW5rbm93bikgPT4gdmFsIGlzICh1bmRlZmluZWRcbiAqIHwgbnVsbFxuICogfCBib29sZWFuXG4gKiB8IG51bWJlclxuICogfCBiaWdpbnRcbiAqIHwgc3RyaW5nXG4gKiB8IHN5bWJvbCl9XG4gKi9cbmNvbnN0IGlzUHJpbWl0aXZlID0gdmFsID0+XG4gICF2YWwgfHwgKHR5cGVvZiB2YWwgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwgIT09ICdmdW5jdGlvbicpO1xuXG4vKipcbiAqIFByaW9yaXRpemUgc3ltYm9scyBhcyBlYXJsaWVyIHRoYW4gc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGFcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYlxuICogQHJldHVybnMgey0xIHwgMCB8IDF9XG4gKi9cbmNvbnN0IGNvbXBhcmVTdHJpbmdpZmllZCA9IChhLCBiKSA9PiB7XG4gIGlmICh0eXBlb2YgYSA9PT0gdHlwZW9mIGIpIHtcbiAgICBjb25zdCBsZWZ0ID0gU3RyaW5nKGEpO1xuICAgIGNvbnN0IHJpZ2h0ID0gU3RyaW5nKGIpO1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG4gICAgcmV0dXJuIGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA+IHJpZ2h0ID8gMSA6IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBhID09PSAnc3ltYm9sJykge1xuICAgIGFzc2VydCh0eXBlb2YgYiA9PT0gJ3N0cmluZycpO1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBhc3NlcnQodHlwZW9mIGEgPT09ICdzdHJpbmcnKTtcbiAgYXNzZXJ0KHR5cGVvZiBiID09PSAnc3ltYm9sJyk7XG4gIHJldHVybiAxO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRNZXRob2ROYW1lcyA9IHZhbCA9PiB7XG4gIGxldCBsYXllciA9IHZhbDtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KCk7IC8qIFNldCB0byBkZWR1cGxpY2F0ZSovXG4gIHdoaWxlIChsYXllciAhPT0gbnVsbCAmJiBsYXllciAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIC8qIGJlIHRvbGVyYW50IG9mIG5vbi1vYmplY3RzKi9cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSkge1xuICAgICAgLyogSW4gY2FzZSBhIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGEgbm9uLW1ldGhvZCwqL1xuICAgICAgLyogdGVzdCBgdmFsW25hbWVdYCByYXRoZXIgdGhhbiBgbGF5ZXJbbmFtZV1gKi9cbiAgICAgIGlmICh0eXBlb2YgdmFsW25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG5hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzUHJpbWl0aXZlKHZhbCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsYXllciA9IGdldFByb3RvdHlwZU9mKGxheWVyKTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFsuLi5uYW1lc10uc29ydChjb21wYXJlU3RyaW5naWZpZWQpKTtcbn07XG4vKiBUaGUgdG9wIGxldmVsIG9mIHRoZSBldmVudHVhbCBzZW5kIG1vZHVsZXMgY2FuIGJlIGV2YWx1YXRlZCBiZWZvcmUqL1xuLyogc2VzIGNyZWF0ZXMgYGhhcmRlbmAsIGFuZCBzbyBjYW5ub3QgcmVseSBvbiBgaGFyZGVuYCBhdCB0b3AgbGV2ZWwuKi8kaM2PX29uY2UuZ2V0TWV0aG9kTmFtZXMoZ2V0TWV0aG9kTmFtZXMpO1xuZnJlZXplKGdldE1ldGhvZE5hbWVzKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlGdW5jdGlvbiA9IChyZWNpcGllbnQsIGFyZ3MpID0+IHtcbiAgdHlwZW9mIHJlY2lwaWVudCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGBDYW5ub3QgaW52b2tlIHRhcmdldCBhcyBhIGZ1bmN0aW9uOyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgIGRlYnVnZ2VyOyAvKiBTVEVQIElOVE8gQVBQTFkqL1xuICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIHRoaXMgZGVsaXZlcnkgb2YgYW4gZXZlbnR1YWwgZnVuY3Rpb24gY2FsbCovXG4gICAgLyogc28gdGhhdCB5b3UgY2FuIHN0ZXAgKmludG8qIHRoZSBmb2xsb3dpbmcgYGFwcGx5YCBpbiBvcmRlciB0byBzZWUgdGhlKi9cbiAgICAvKiBmdW5jdGlvbiBjYWxsIGFzIGl0IGhhcHBlbnMuIE9yIHN0ZXAgKm92ZXIqIHRvIHNlZSB3aGF0IGhhcHBlbnMqL1xuICAgIC8qIGFmdGVyIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybnMuKi9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShyZWNpcGllbnQsIHVuZGVmaW5lZCwgYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5sb2NhbEFwcGx5RnVuY3Rpb24obG9jYWxBcHBseUZ1bmN0aW9uKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlNZXRob2QgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lLCBhcmdzKSA9PiB7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHwgbWV0aG9kTmFtZSA9PT0gbnVsbCkge1xuICAgIC8qIEJhc2UgY2FzZTsgYm90dG9tIG91dCB0byBhcHBseSBmdW5jdGlvbnMuKi9cbiAgICByZXR1cm4gbG9jYWxBcHBseUZ1bmN0aW9uKHJlY2lwaWVudCwgYXJncyk7XG4gIH1cbiAgaWYgKHJlY2lwaWVudCA9PT0gdW5kZWZpbmVkIHx8IHJlY2lwaWVudCA9PT0gbnVsbCkge1xuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGBDYW5ub3QgZGVsaXZlciAke3EobWV0aG9kTmFtZSl9IHRvIHRhcmdldDsgdHlwZW9mIHRhcmdldCBpcyAke3EoXG4gICAgICAgIG50eXBlb2YocmVjaXBpZW50KSxcbiAgICAgICl9YCxcbiAgICAgIFR5cGVFcnJvcixcbiAgICApO1xuICB9XG4gIGNvbnN0IGZuID0gcmVjaXBpZW50W21ldGhvZE5hbWVdO1xuICBpZiAoZm4gPT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGB0YXJnZXQgaGFzIG5vIG1ldGhvZCAke3EobWV0aG9kTmFtZSl9LCBoYXMgJHtxKFxuICAgICAgICBnZXRNZXRob2ROYW1lcyhyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZnR5cGUgPSBudHlwZW9mKGZuKTtcbiAgdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nIHx8XG4gICAgRmFpbGBpbnZva2VkIG1ldGhvZCAke3EobWV0aG9kTmFtZSl9IGlzIG5vdCBhIGZ1bmN0aW9uOyBpdCBpcyBhICR7cShcbiAgICAgIGZ0eXBlLFxuICAgICl9YDtcbiAgaWYgKG9uRGVsaXZlcnkgJiYgb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgbWV0aG9kTmFtZSkpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgIGRlYnVnZ2VyOyAvKiBTVEVQIElOVE8gQVBQTFkqL1xuICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIHRoaXMgZGVsaXZlcnkgb2YgYW4gZXZlbnR1YWwgbWV0aG9kIGNhbGwqL1xuICAgIC8qIHNvIHRoYXQgeW91IGNhbiBzdGVwICppbnRvKiB0aGUgZm9sbG93aW5nIGBhcHBseWAgaW4gb3JkZXIgdG8gc2VlIHRoZSovXG4gICAgLyogbWV0aG9kIGNhbGwgYXMgaXQgaGFwcGVucy4gT3Igc3RlcCAqb3ZlciogdG8gc2VlIHdoYXQgaGFwcGVucyovXG4gICAgLyogYWZ0ZXIgdGhlIG1ldGhvZCBjYWxsIHJldHVybnMuKi9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShmbiwgcmVjaXBpZW50LCBhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmxvY2FsQXBwbHlNZXRob2QobG9jYWxBcHBseU1ldGhvZCk7XG5cbiAgICAgICBjb25zdCBsb2NhbEdldCA9ICh0LCBrZXkpID0+IHRba2V5XTskaM2PX29uY2UubG9jYWxHZXQobG9jYWxHZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwibG9jYWxBcHBseUZ1bmN0aW9uIjpbImxvY2FsQXBwbHlGdW5jdGlvbiJdLCJsb2NhbEFwcGx5TWV0aG9kIjpbImxvY2FsQXBwbHlNZXRob2QiXSwibG9jYWxHZXQiOlsibG9jYWxHZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAh3iIufQYAAD0GAAANQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBoYXNPd24sIGZyZWV6ZSwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCAnKid9IE1hdGNoU3RyaW5nVGFnXG4gKiAgIEEgc3RhciBgJyonYCBtYXRjaGVzIGFueSByZWNpcGllbnQuIE90aGVyd2lzZSwgdGhlIHN0cmluZyBpc1xuICogICBtYXRjaGVkIGFnYWluc3QgdGhlIHZhbHVlIG9mIGEgcmVjaXBpZW50J3MgYEBAdG9TdHJpbmdUYWdgXG4gKiAgIGFmdGVyIHN0cmlwcGluZyBvdXQgYW55IGxlYWRpbmcgYCdBbGxlZ2VkOiAnYCBvciBgJ0RlYnVnTmFtZTogJ2BcbiAqICAgcHJlZml4LiBGb3Igb2JqZWN0cyBkZWZpbmVkIHdpdGggYEZhcmAgdGhpcyBpcyB0aGUgZmlyc3QgYXJndW1lbnQsXG4gKiAgIGtub3duIGFzIHRoZSBgZmFyTmFtZWAuIEZvciBleG9zLCB0aGlzIGlzIHRoZSB0YWcuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZyB8ICcqJ30gTWF0Y2hNZXRob2ROYW1lXG4gKiAgIEEgc3RhciBgJyonYCBtYXRjaGVzIGFueSBtZXRob2QgbmFtZS4gT3RoZXJ3aXNlLCB0aGUgc3RyaW5nIGlzXG4gKiAgIG1hdGNoZWQgYWdhaW5zdCB0aGUgbWV0aG9kIG5hbWUuIEN1cnJlbnRseSwgdGhpcyBpcyBvbmx5IGFuIGV4YWN0IG1hdGNoLlxuICogICBIb3dldmVyLCBiZXdhcmUgdGhhdCB3ZSBtYXkgaW50cm9kdWNlIGEgc3RyaW5nIHN5bnRheCBmb3JcbiAqICAgc3ltYm9sIG1ldGhvZCBuYW1lcy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7bnVtYmVyIHwgJyonfSBNYXRjaENvdW50ZG93blxuICogICBBIHN0YXIgYCcqJ2Agd2lsbCBhbHdheXMgYnJlYWtwb2ludC4gT3RoZXJ3aXNlLCB0aGUgc3RyaW5nXG4gKiAgIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4gT25jZSB0aGF0IGlzIHplcm8sIGFsd2F5cyBicmVha3BvaW50LlxuICogICBPdGhlcndpc2UgZGVjcmVtZW50IGJ5IG9uZSBlYWNoIHRpbWUgaXQgbWF0Y2hlcyB1bnRpbCBpdCByZWFjaGVzIHplcm8uXG4gKiAgIEluIG90aGVyIHdvcmRzLCB0aGUgY291bnRkb3duIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZlxuICogICBicmVha3BvaW50IG9jY3VycmVuY2VzIHRvIHNraXAgYmVmb3JlIGFjdHVhbGx5IGJyZWFrcG9pbnRpbmcuXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBleHRlcm5hbCBKU09OIHJlcHJlc2VudGF0aW9uLCBpbiB3aGljaFxuICogLSB0aGUgb3V0ZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgY2xhc3MtbGlrZSB0YWcgb3IgJyonLFxuICogLSB0aGUgaW5uZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgbWV0aG9kIG5hbWUgb3IgJyonLFxuICogLSB0aGUgdmFsdWUgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciBjb3VudGRvd24gb3IgJyonLlxuICpcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8TWF0Y2hTdHJpbmdUYWcsIFJlY29yZDxNYXRjaE1ldGhvZE5hbWUsIE1hdGNoQ291bnRkb3duPj59IE1lc3NhZ2VCcmVha3BvaW50c1xuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgaW50ZXJuYWwgSlNPTiByZXByZXNlbnRhdGlvbiwgaW4gd2hpY2hcbiAqIC0gdGhlIG91dGVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIG1ldGhvZCBuYW1lIG9yICcqJyxcbiAqIC0gdGhlIGlubmVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIGNsYXNzLWxpa2UgdGFnIG9yICcqJyxcbiAqIC0gdGhlIHZhbHVlIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgY291bnRkb3duIG9yICcqJy5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPE1hdGNoTWV0aG9kTmFtZSwgUmVjb3JkPE1hdGNoU3RyaW5nVGFnLCBNYXRjaENvdW50ZG93bj4+fSBCcmVha3BvaW50VGFibGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXG4gKiBAcHJvcGVydHkgeygpID0+IE1lc3NhZ2VCcmVha3BvaW50c30gZ2V0QnJlYWtwb2ludHNcbiAqIEBwcm9wZXJ0eSB7KG5ld0JyZWFrcG9pbnRzPzogTWVzc2FnZUJyZWFrcG9pbnRzKSA9PiB2b2lkfSBzZXRCcmVha3BvaW50c1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlY2lwaWVudDogb2JqZWN0LFxuICogICBtZXRob2ROYW1lOiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWRcbiAqICkgPT4gYm9vbGVhbn0gc2hvdWxkQnJlYWtwb2ludFxuICovXG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMge3ZhbCBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+fVxuICovXG5jb25zdCBpc0pTT05SZWNvcmQgPSB2YWwgPT5cbiAgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cbi8qKlxuICogUmV0dXJuIGB0YWdgIGFmdGVyIHN0cmlwcGluZyBvZmYgYW55IGAnQWxsZWdlZDogJ2Agb3IgYCdEZWJ1Z05hbWU6ICdgXG4gKiBwcmVmaXggaWYgcHJlc2VudC5cbiAqIGBgYGpzXG4gKiBzaW1wbGlmeVRhZygnQWxsZWdlZDogbW9vbGEgaXNzdWVyJykgPT09ICdtb29sYSBpc3N1ZXInXG4gKiBgYGBcbiAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBzdWNoIHByZWZpeGVzLCBvbmx5IHRoZSBvdXRlciBvbmUgaXMgcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzaW1wbGlmeVRhZyA9IHRhZyA9PiB7XG4gIGZvciAoY29uc3QgcHJlZml4IG9mIFsnQWxsZWdlZDogJywgJ0RlYnVnTmFtZTogJ10pIHtcbiAgICBpZiAodGFnLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgcmV0dXJuIHRhZy5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhZztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEByZXR1cm5zIHtNZXNzYWdlQnJlYWtwb2ludFRlc3RlciB8IHVuZGVmaW5lZH1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9IG9wdGlvbk5hbWUgPT4ge1xuICBsZXQgYnJlYWtwb2ludHMgPSBKU09OLnBhcnNlKGdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsICdudWxsJykpO1xuXG4gIGlmIChicmVha3BvaW50cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQHR5cGUge0JyZWFrcG9pbnRUYWJsZX0gKi9cbiAgbGV0IGJyZWFrcG9pbnRzVGFibGU7XG5cbiAgY29uc3QgZ2V0QnJlYWtwb2ludHMgPSAoKSA9PiBicmVha3BvaW50cztcbiAgZnJlZXplKGdldEJyZWFrcG9pbnRzKTtcblxuICBjb25zdCBzZXRCcmVha3BvaW50cyA9IChuZXdCcmVha3BvaW50cyA9IGJyZWFrcG9pbnRzKSA9PiB7XG4gICAgaXNKU09OUmVjb3JkKG5ld0JyZWFrcG9pbnRzKSB8fFxuICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbiB0byBiZSBhIEpTT04gYnJlYWtwb2ludHMgcmVjb3JkYDtcblxuICAgIC8qKiBAdHlwZSB7QnJlYWtwb2ludFRhYmxlfSAqL1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY29uZnVzZWQgYnkgX19wcm90b19fKi9cbiAgICBjb25zdCBuZXdCcmVha3BvaW50c1RhYmxlID0geyBfX3Byb3RvX186IG51bGwgfTtcblxuICAgIGZvciAoY29uc3QgW3RhZywgbWV0aG9kQlBzXSBvZiBlbnRyaWVzKG5ld0JyZWFrcG9pbnRzKSkge1xuICAgICAgdGFnID09PSBzaW1wbGlmeVRhZyh0YWcpIHx8XG4gICAgICAgIEZhaWxgSnVzdCB1c2Ugc2ltcGxlIHRhZyAke3Eoc2ltcGxpZnlUYWcodGFnKSl9IHJhdGhlciB0aGFuICR7cSh0YWcpfWA7XG4gICAgICBpc0pTT05SZWNvcmQobWV0aG9kQlBzKSB8fFxuICAgICAgICBGYWlsYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKFxuICAgICAgICAgIHRhZyxcbiAgICAgICAgKX0gdG8gYmUgYSBKU09OIG1ldGhvZHMgYnJlYWtwb2ludHMgcmVjb3JkYDtcbiAgICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIGNvdW50XSBvZiBlbnRyaWVzKG1ldGhvZEJQcykpIHtcbiAgICAgICAgY291bnQgPT09ICcqJyB8fFxuICAgICAgICAgICh0eXBlb2YgY291bnQgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICBOdW1iZXIuaXNTYWZlSW50ZWdlcihjb3VudCkgJiZcbiAgICAgICAgICAgIGNvdW50ID49IDApIHx8XG4gICAgICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cSh0YWcpfS4ke3EoXG4gICAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgICl9IHRvIGJlIFwiKlwiIG9yIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgO1xuXG4gICAgICAgIGNvbnN0IGNsYXNzQlBzID0gaGFzT3duKG5ld0JyZWFrcG9pbnRzVGFibGUsIG1ldGhvZE5hbWUpXG4gICAgICAgICAgPyBuZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdXG4gICAgICAgICAgOiAobmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXSA9IHtcbiAgICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBjb25mdXNlZCBieSBfX3Byb3RvX18qL1xuICAgICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50O1xuICAgICAgfVxuICAgIH1cbiAgICBicmVha3BvaW50cyA9IG5ld0JyZWFrcG9pbnRzO1xuICAgIGJyZWFrcG9pbnRzVGFibGUgPSBuZXdCcmVha3BvaW50c1RhYmxlO1xuICB9O1xuICBmcmVlemUoc2V0QnJlYWtwb2ludHMpO1xuXG4gIGNvbnN0IHNob3VsZEJyZWFrcG9pbnQgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lKSA9PiB7XG4gICAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fCBtZXRob2ROYW1lID09PSBudWxsKSB7XG4gICAgICAvKiBUT0RPIGVuYWJsZSBmdW5jdGlvbiBicmVha3BvaW50aW5nKi9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NCUHMgPSBicmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdIHx8IGJyZWFrcG9pbnRzVGFibGVbJyonXTtcbiAgICBpZiAoY2xhc3NCUHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgdGFnID0gc2ltcGxpZnlUYWcocmVjaXBpZW50W1N5bWJvbC50b1N0cmluZ1RhZ10pO1xuICAgIGxldCBjb3VudCA9IGNsYXNzQlBzW3RhZ107XG4gICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhZyA9ICcqJztcbiAgICAgIGNvdW50ID0gY2xhc3NCUHNbdGFnXTtcbiAgICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSAnKicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhc3NlcnQodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJyAmJiBjb3VudCA+PSAxKTtcbiAgICBjbGFzc0JQc1t0YWddID0gY291bnQgLSAxO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgZnJlZXplKHNob3VsZEJyZWFrcG9pbnQpO1xuXG4gIGNvbnN0IGJyZWFrcG9pbnRUZXN0ZXIgPSBmcmVlemUoe1xuICAgIGdldEJyZWFrcG9pbnRzLFxuICAgIHNldEJyZWFrcG9pbnRzLFxuICAgIHNob3VsZEJyZWFrcG9pbnQsXG4gIH0pO1xuICBicmVha3BvaW50VGVzdGVyLnNldEJyZWFrcG9pbnRzKCk7XG4gIHJldHVybiBicmVha3BvaW50VGVzdGVyO1xufTskaM2PX29uY2UubWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG5mcmVlemUobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciI6WyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKRNV2dYFAADWBQAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9uby1zaGltLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyIsIi4vZXhwb3J0cy5qcyJdLCJleHBvcnRzIjpbIkUiLCJIYW5kbGVkUHJvbWlzZSJdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZUU7JGjNj19pbXBvcnRzKFtbXCIuL0UuanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChtYWtlRSA9ICRozY9fYSldXV1dLFtcIi4vZXhwb3J0cy5qc1wiLCBbXV1dKTtcblxuLyogWFhYIG1vZHVsZSBleHBvcnRzIGZvciBIYW5kbGVkUHJvbWlzZSBmYWlsIGlmIHRoZXNlIGFyZW4ndCBpbiBzY29wZSovXG4vKiogQGltcG9ydCB7SGFuZGxlciwgSGFuZGxlZEV4ZWN1dG9yfSBmcm9tICcuL2hhbmRsZWQtcHJvbWlzZS5qcycgKi9cbi8qKiBAaW1wb3J0IHtFQ2FsbGFibGVPck1ldGhvZHMsIEVHZXR0ZXJzLCBFUmVmLCBFUmVtb3RlRnVuY3Rpb25zLCBFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kcywgTG9jYWxSZWNvcmQsIFJlbW90ZUZ1bmN0aW9uc30gZnJvbSAnLi9FLmpzJyAqL1xuXG5jb25zdCBocCA9IEhhbmRsZWRQcm9taXNlO1xuXG4vKipcbiAqIEUoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gY2FsbCBhcmJpdHJhcnkgbWV0aG9kcy4gRWFjaCBvZiB0aGVzZSBtZXRob2QgY2FsbHMgcmV0dXJucyBhIHByb21pc2UuXG4gKiBUaGUgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBvbiB3aGF0ZXZlciAneCcgZGVzaWduYXRlcyAob3IgcmVzb2x2ZXMgdG8pIGluIGEgZnV0dXJlIHR1cm4sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBFLmdldCh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBnZXQgYXJiaXRyYXJ5IHByb3BlcnRpZXMuIEVhY2ggb2YgdGhlc2UgcHJvcGVydGllcyByZXR1cm5zIGFcbiAqIHByb21pc2UgZm9yIHRoZSBwcm9wZXJ0eS4gIFRoZSBwcm9taXNlIHZhbHVlIHdpbGwgYmUgdGhlIHByb3BlcnR5IGZldGNoZWQgZnJvbSB3aGF0ZXZlciAneCcgZGVzaWduYXRlcyAob3JcbiAqIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogRS53aGVuKHgsIHJlcywgcmVqKSBpcyBlcXVpdmFsZW50IHRvIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihyZXMsIHJlailcbiAqLyRozY9fb25jZS5ocChocCk7XG4gICAgICAgY29uc3QgRSA9IG1ha2VFKGhwKTskaM2PX29uY2UuRShFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAzKKSOVxIAAFcSAAAtAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXSxbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyogTk9URTogV2UgY2FuJ3QgaW1wb3J0IHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3QgaW4gc2NvcGUgYmVmb3JlIGxvY2tkb3duLiovXG4vKiBXZSBhbHNvIGNhbm5vdCBjdXJyZW50bHkgaW1wb3J0IHRoZW0gYmVjYXVzZSBpdCB3b3VsZCBjcmVhdGUgYSBjeWNsaWMqL1xuLyogZGVwZW5kZW5jeSwgdGhvdWdoIHRoaXMgaXMgbW9yZSBlYXNpbHkgZml4ZWQuKi9cbi8qIGltcG9ydCB7IGFzc2VydCwgWCwgRmFpbCB9IGZyb20gJ0BlbmRvL2Vycm9ycyc7Ki9cbi8qIFNlZSBhbHNvIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOTUxNSovXG5cbi8qIFdBUk5JTkc6IEdsb2JhbCBNdXRhYmxlIFN0YXRlISovXG4vKiBUaGlzIHN0YXRlIGlzIGNvbW11bmljYXRlZCB0byBgYXNzZXJ0YCB0aGF0IG1ha2VzIGl0IGF2YWlsYWJsZSB0byB0aGUqL1xuLyogY2F1c2FsIGNvbnNvbGUsIHdoaWNoIGFmZmVjdHMgdGhlIGNvbnNvbGUgbG9nIG91dHB1dC4gTm9ybWFsbHkgd2UqL1xuLyogcmVnYXJkIHRoZSBhYmlsaXR5IHRvIHNlZSBjb25zb2xlIGxvZyBvdXRwdXQgYXMgYSBtZXRhLWxldmVsIHByaXZpbGVnZSovXG4vKiBhbmFsb2dvdXMgdG8gdGhlIGFiaWxpdHkgdG8gZGVidWcuIEFzaWRlIGZyb20gdGhhdCwgdGhpcyBtb2R1bGUgc2hvdWxkKi9cbi8qIG5vdCBoYXZlIGFueSBvYnNlcnZhYmx5IG11dGFibGUgc3RhdGUuKi9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm4gPSAwO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFID0gZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcygnREVCVUcnLCAndHJhY2stdHVybnMnKTtcblxuLyogVHJhY2stdHVybnMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIGJlIGVuYWJsZWQgYnkgYW4gZW52aXJvbm1lbnQqL1xuLyogb3B0aW9uLiovXG5jb25zdCBFTkFCTEVEID1cbiAgLyoqIEB0eXBlIHsnZGlzYWJsZWQnIHwgJ2VuYWJsZWQnfSAqL1xuICAoZ2V0RW52aXJvbm1lbnRPcHRpb24oJ1RSQUNLX1RVUk5TJywgJ2Rpc2FibGVkJywgWydlbmFibGVkJ10pKSA9PT0gJ2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvdXQgb2YgdHJhY2tUdXJucygpIHRvIGRpc2NvdXJhZ2UgdGhlKi9cbi8qIGNsb3N1cmVzIGZyb20gaG9sZGluZyBvbnRvICdhcmdzJyBvciAnZnVuYycgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LCovXG4vKiB3aGljaCB3ZSd2ZSBzZWVuIGNhdXNlIEhhbmRsZWRQcm9taXNlIGFyZ3VtZW50cyB0byBiZSByZXRhaW5lZCBmb3IqL1xuLyogYSBzdXJwcmlzaW5nbHkgbG9uZyB0aW1lLiovXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGUgPSBkZXRhaWxzTm90ZSA9PiByZWFzb24gPT4ge1xuICBpZiAocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKHJlYXNvbiwgZGV0YWlsc05vdGUpO1xuICB9XG4gIGlmIChWRVJCT1NFKSB7XG4gICAgY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJywgcmVhc29uKTtcbiAgfVxufTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uID1cbiAgKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkgPT5cbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBoaWRkZW5QcmlvckVycm9yID0gc2VuZGluZ0Vycm9yO1xuICAgIGhpZGRlbkN1cnJlbnRUdXJuICs9IDE7XG4gICAgaGlkZGVuQ3VycmVudEV2ZW50ID0gMDtcbiAgICB0cnkge1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMoLi4uYXJncyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5hc3NlcnQubm90ZShcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIFhgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChWRVJCT1NFKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUk9XTiB0byB0b3Agb2YgZXZlbnQgbG9vcCcsIGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLyogTXVzdCBjYXB0dXJlIHRoaXMgbm93LCBub3Qgd2hlbiB0aGUgY2F0Y2ggdHJpZ2dlcnMuKi9cbiAgICAgIGNvbnN0IGRldGFpbHNOb3RlID0gWGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaGlkZGVuUHJpb3JFcnJvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMsIHJldHVybnMgYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMgd2hvc2VcbiAqIGB0aGlzYC1mcmVlIGNhbGwgYmVoYXZpb3JzIGFyZSBub3Qgb2JzZXJ2YWJseSBkaWZmZXJlbnQgdG8gdGhvc2UgdGhhdFxuICogY2Fubm90IHNlZSBjb25zb2xlIG91dHB1dC4gVGhlIG9ubHkgcHVycG9zZSBpcyB0byBjYXVzZSBhZGRpdGlvbmFsXG4gKiBpbmZvcm1hdGlvbiB0byBhcHBlYXIgb24gdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIGNhbGwgdG8gYHRyYWNrVHVybnNgIGlzIGl0c2VsZiBhIHNlbmRpbmcgZXZlbnQsIHRoYXQgb2NjdXJzIGluIHNvbWUgY2FsbFxuICogc3RhY2sgaW4gc29tZSB0dXJuIG51bWJlciBhdCBzb21lIGV2ZW50IG51bWJlciB3aXRoaW4gdGhhdCB0dXJuLiBFYWNoIGNhbGxcbiAqIHRvIGFueSBvZiB0aGUgcmV0dXJuZWQgYFR1cm5TdGFydEZuYHMgaXMgYSByZWNlaXZpbmcgZXZlbnQgdGhhdCBiZWdpbnMgYSBuZXdcbiAqIHR1cm4uIFRoaXMgc2VuZGluZyBldmVudCBjYXVzZWQgZWFjaCBvZiB0aG9zZSByZWNlaXZpbmcgZXZlbnRzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBAcGFyYW0ge1R9IGZ1bmNzXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuICAgICAgIGNvbnN0IHRyYWNrVHVybnMgPSBmdW5jcyA9PiB7XG4gIGlmICghRU5BQkxFRCB8fCB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWdsb2JhbFRoaXMuYXNzZXJ0KSB7XG4gICAgcmV0dXJuIGZ1bmNzO1xuICB9XG4gIGNvbnN0IHsgZGV0YWlsczogWCwgbm90ZTogYW5ub3RhdGVFcnJvciB9ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbiAgaGlkZGVuQ3VycmVudEV2ZW50ICs9IDE7XG4gIGNvbnN0IHNlbmRpbmdFcnJvciA9IEVycm9yKFxuICAgIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgKTtcbiAgaWYgKGhpZGRlblByaW9yRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFubm90YXRlRXJyb3Ioc2VuZGluZ0Vycm9yLCBYYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKFxuICAgIGZ1bmNzLm1hcChmdW5jID0+IGZ1bmMgJiYgd3JhcEZ1bmN0aW9uKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkpXG4gICk7XG59O1xuXG4vKipcbiAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgaXMgbm90IHRoaXMtc2Vuc2l0aXZlLCBleHBlY3RlZCB0byBiZSBjYWxsZWQgYXRcbiAqIGJvdHRvbSBvZiBzdGFjayB0byBzdGFydCBhIG5ldyB0dXJuLlxuICpcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKi8kaM2PX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvdXRpbHMuanN7ImltcG9ydHMiOlsiLi9zcmMvbG9jYWwuanMiLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9sb2NhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2xvY2FsLmpzIjpbWyJnZXRNZXRob2ROYW1lcyIsImdldE1ldGhvZE5hbWVzIl1dLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjpbWyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiLCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANxF2aNgAgAAYAIAABoAAABAZW5kby9leG8tdjEuNS4xMi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9leG8tbWFrZXJzLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzIl0sImV4cG9ydHMiOltudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL2V4by1tYWtlcnMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9leG8tbWFrZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvZ2V0LWludGVyZmFjZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2dldC1pbnRlcmZhY2UuanMiOltbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiLCJHRVRfSU5URVJGQUNFX0dVQVJEIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACxkxD/ECAAABAgAAAjAAAAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by1tYWtlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyIsIi4vZXhvLXRvb2xzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzc0tpdCIsImluaXRFbXB0eSIsIm1ha2VFeG8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyxGYWlsLHEsZGVmZW5kUHJvdG90eXBlLGRlZmVuZFByb3RvdHlwZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLFskaM2PX2EgPT4gKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9leG8tdG9vbHMuanNcIiwgW1tcImRlZmVuZFByb3RvdHlwZVwiLFskaM2PX2EgPT4gKGRlZmVuZFByb3RvdHlwZSA9ICRozY9fYSldXSxbXCJkZWZlbmRQcm90b3R5cGVLaXRcIixbJGjNj19hID0+IChkZWZlbmRQcm90b3R5cGVLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7QW1wbGlmeSwgRXhvQ2xhc3NLaXRNZXRob2RzLCBFeG9DbGFzc01ldGhvZHMsIEZhckNsYXNzT3B0aW9ucywgR3VhcmRlZCwgR3VhcmRlZEtpdCwgRXhvQ2xhc3NJbnRlcmZhY2VHdWFyZEtpdCwgSXNJbnN0YW5jZSwgS2l0Q29udGV4dCwgRXhvQ2xhc3NJbnRlcmZhY2VHdWFyZCwgTWV0aG9kcywgRmFjZXROYW1lfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCB7IGNyZWF0ZSwgc2VhbCwgZnJlZXplLCBkZWZpbmVQcm9wZXJ0eSwgdmFsdWVzIH0gPSBPYmplY3Q7XG5cbi8qIFR1cm4gb24gdG8gZ2l2ZSBlYWNoIGV4byBpbnN0YW5jZSBpdHMgb3duIHRvU3RyaW5nVGFnIHZhbHVlLiovXG5jb25zdCBMQUJFTF9JTlNUQU5DRVMgPSBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKCdERUJVRycsICdsYWJlbC1pbnN0YW5jZXMnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHByb3RvXG4gKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VDb3VudFxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0IG1ha2VTZWxmID0gKHByb3RvLCBpbnN0YW5jZUNvdW50KSA9PiB7XG4gIGNvbnN0IHNlbGYgPSBjcmVhdGUocHJvdG8pO1xuICBpZiAoTEFCRUxfSU5TVEFOQ0VTKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoc2VsZiwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICB2YWx1ZTogYCR7cHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXX0jJHtpbnN0YW5jZUNvdW50fWAsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbihzZWxmKTtcbn07XG5cbmNvbnN0IGVtcHR5UmVjb3JkID0gaGFyZGVuKHt9KTtcblxuLyoqXG4gKiBXaGVuIGNhbGxpbmcgYGRlZmluZUR1cmFibGVLaW5kYCBhbmRcbiAqIGl0cyBzaWJsaW5ncywgdXNlZCBhcyB0aGUgYGluaXRgIGZ1bmN0aW9uIGFyZ3VtZW50IHRvIGluZGljYXRlIHRoYXQgdGhlXG4gKiBzdGF0ZSByZWNvcmQgb2YgdGhlICh2aXJ0dWFsL2R1cmFibGUpIGluc3RhbmNlcyBvZiB0aGUga2luZC9leG9DbGFzc1xuICogc2hvdWxkIGJlIGVtcHR5LCBhbmQgdGhhdCB0aGUgcmV0dXJuZWQgbWFrZXIgZnVuY3Rpb24gc2hvdWxkIGhhdmUgemVyb1xuICogcGFyYW1ldGVycy5cbiAqXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbiAgICAgICBjb25zdCBpbml0RW1wdHkgPSAoKSA9PiBlbXB0eVJlY29yZDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJIGluaXQgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gTSBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0V4b0NsYXNzSW50ZXJmYWNlR3VhcmQ8TT4gfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7RXhvQ2xhc3NNZXRob2RzPE0sIEk+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxJTVBPUlQoJy4vdHlwZXMuanMnKS5DbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPiwgTT4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZDxNPn1cbiAqLyRozY9fb25jZS5pbml0RW1wdHkoaW5pdEVtcHR5KTtcbiAgICAgICBjb25zdCBkZWZpbmVFeG9DbGFzcyA9IChcbiAgdGFnLFxuICBpbnRlcmZhY2VHdWFyZCxcbiAgaW5pdCxcbiAgbWV0aG9kcyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGhhcmRlbihtZXRob2RzKTtcbiAgY29uc3Qge1xuICAgIGZpbmlzaCA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlQW1wbGlmaWVyID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3RlciA9IHVuZGVmaW5lZCxcbiAgfSA9IG9wdGlvbnM7XG4gIHJlY2VpdmVBbXBsaWZpZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgIEZhaWxgT25seSBmYWNldHMgb2YgYW4gZXhvIGNsYXNzIGtpdCBjYW4gYmUgYW1wbGlmaWVkICR7cSh0YWcpfWA7XG5cbiAgLyoqIEB0eXBlIHtXZWFrTWFwPE0sIElNUE9SVCgnLi90eXBlcy5qcycpLkNsYXNzQ29udGV4dDxSZXR1cm5UeXBlPEk+LCBNPj59ICovXG4gIGNvbnN0IGNvbnRleHRNYXAgPSBuZXcgV2Vha01hcCgpO1xuICBjb25zdCBwcm90byA9IGRlZmVuZFByb3RvdHlwZShcbiAgICB0YWcsXG4gICAgc2VsZiA9PiAvKiogQHR5cGUge2FueX0gKi8gKGNvbnRleHRNYXAuZ2V0KHNlbGYpKSxcbiAgICBtZXRob2RzLFxuICAgIHRydWUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICk7XG4gIGxldCBpbnN0YW5jZUNvdW50ID0gMDtcbiAgLyoqXG4gKiBAcGFyYW0gIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKi9cbiAgY29uc3QgbWFrZUluc3RhbmNlID0gKC4uLmFyZ3MpID0+IHtcbiAgICAvKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG4gICAgY29uc3Qgc3RhdGUgPSBzZWFsKGluaXQoLi4uYXJncykpO1xuICAgIGluc3RhbmNlQ291bnQgKz0gMTtcbiAgICBjb25zdCBzZWxmID0gbWFrZVNlbGYocHJvdG8sIGluc3RhbmNlQ291bnQpO1xuXG4gICAgLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuICAgIC8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sTT59ICovXG4gICAgY29uc3QgY29udGV4dCA9IGZyZWV6ZSh7IHN0YXRlLCBzZWxmIH0pO1xuICAgIGNvbnRleHRNYXAuc2V0KHNlbGYsIGNvbnRleHQpO1xuICAgIGlmIChmaW5pc2gpIHtcbiAgICAgIGZpbmlzaChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgaWYgKHJlY2VpdmVJbnN0YW5jZVRlc3Rlcikge1xuICAgIC8qKiBAdHlwZSB7SXNJbnN0YW5jZX0gKi9cbiAgICBjb25zdCBpc0luc3RhbmNlID0gKGV4bywgZmFjZXROYW1lID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBmYWNldE5hbWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYGZhY2V0TmFtZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYW4gZXhvIGNsYXNzIGtpdDogJHtxKFxuICAgICAgICAgIHRhZyxcbiAgICAgICAgKX0gaGFzIG5vIGZhY2V0ICR7cShmYWNldE5hbWUpfWA7XG4gICAgICByZXR1cm4gY29udGV4dE1hcC5oYXMoZXhvKTtcbiAgICB9O1xuICAgIGhhcmRlbihpc0luc3RhbmNlKTtcbiAgICByZWNlaXZlSW5zdGFuY2VUZXN0ZXIoaXNJbnN0YW5jZSk7XG4gIH1cblxuICByZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZSk7XG59OyRozY9fb25jZS5kZWZpbmVFeG9DbGFzcyhkZWZpbmVFeG9DbGFzcyk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3MpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gRiBmYWNldCBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0V4b0NsYXNzSW50ZXJmYWNlR3VhcmRLaXQ8Rj4gfCB1bmRlZmluZWQgfSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge0V4b0NsYXNzS2l0TWV0aG9kczxGLCBJPn0gbWV0aG9kc0tpdFxuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8XG4gKiAgIEtpdENvbnRleHQ8UmV0dXJuVHlwZTxJPiwgR3VhcmRlZEtpdDxGPj4sXG4gKiAgIEd1YXJkZWRLaXQ8Rj5cbiAqID59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiBHdWFyZGVkS2l0PEY+fVxuICovXG4gICAgICAgY29uc3QgZGVmaW5lRXhvQ2xhc3NLaXQgPSAoXG4gIHRhZyxcbiAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gIGluaXQsXG4gIG1ldGhvZHNLaXQsXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBoYXJkZW4obWV0aG9kc0tpdCk7XG4gIGNvbnN0IHtcbiAgICBmaW5pc2ggPSB1bmRlZmluZWQsXG4gICAgcmVjZWl2ZUFtcGxpZmllciA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlSW5zdGFuY2VUZXN0ZXIgPSB1bmRlZmluZWQsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBjb250ZXh0TWFwS2l0ID0gb2JqZWN0TWFwKG1ldGhvZHNLaXQsICgpID0+IG5ldyBXZWFrTWFwKCkpO1xuICBjb25zdCBnZXRDb250ZXh0S2l0ID0gb2JqZWN0TWFwKFxuICAgIGNvbnRleHRNYXBLaXQsXG4gICAgY29udGV4dE1hcCA9PiBmYWNldCA9PiBjb250ZXh0TWFwLmdldChmYWNldCksXG4gICk7XG4gIGNvbnN0IHByb3RvdHlwZUtpdCA9IGRlZmVuZFByb3RvdHlwZUtpdChcbiAgICB0YWcsXG4gICAgZ2V0Q29udGV4dEtpdCxcbiAgICBtZXRob2RzS2l0LFxuICAgIHRydWUsXG4gICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICk7XG4gIGxldCBpbnN0YW5jZUNvdW50ID0gMDtcbiAgLyoqXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqL1xuICBjb25zdCBtYWtlSW5zdGFuY2VLaXQgPSAoLi4uYXJncykgPT4ge1xuICAgIC8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbiAgICBjb25zdCBzdGF0ZSA9IHNlYWwoaW5pdCguLi5hcmdzKSk7XG4gICAgLyogRG9uJ3QgZnJlZXplIGNvbnRleHQgdW50aWwgd2UgYWRkIGZhY2V0cyovXG4gICAgLyoqIEB0eXBlIHt7IHN0YXRlOiBSZXR1cm5UeXBlPEk+LCBmYWNldHM6IGFueSB9fSAqL1xuICAgIGNvbnN0IGNvbnRleHQgPSB7IHN0YXRlLCBmYWNldHM6IG51bGwgfTtcbiAgICBpbnN0YW5jZUNvdW50ICs9IDE7XG4gICAgY29uc3QgZmFjZXRzID0gb2JqZWN0TWFwKHByb3RvdHlwZUtpdCwgKHByb3RvLCBmYWNldE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHNlbGYgPSBtYWtlU2VsZihwcm90bywgaW5zdGFuY2VDb3VudCk7XG4gICAgICBjb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV0uc2V0KHNlbGYsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSk7XG4gICAgY29udGV4dC5mYWNldHMgPSBmYWNldHM7XG4gICAgLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuICAgIGZyZWV6ZShjb250ZXh0KTtcbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICBmaW5pc2goY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiAvKiogQHR5cGUge0d1YXJkZWRLaXQ8Rj59ICovIChjb250ZXh0LmZhY2V0cyk7XG4gIH07XG5cbiAgaWYgKHJlY2VpdmVBbXBsaWZpZXIpIHtcbiAgICAvKiogQHR5cGUge0FtcGxpZnl9ICovXG4gICAgY29uc3QgYW1wbGlmeSA9IGV4b0ZhY2V0ID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29udGV4dE1hcCBvZiB2YWx1ZXMoY29udGV4dE1hcEtpdCkpIHtcbiAgICAgICAgaWYgKGNvbnRleHRNYXAuaGFzKGV4b0ZhY2V0KSkge1xuICAgICAgICAgIGNvbnN0IHsgZmFjZXRzIH0gPSBjb250ZXh0TWFwLmdldChleG9GYWNldCk7XG4gICAgICAgICAgcmV0dXJuIGZhY2V0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgRmFpbGBNdXN0IGJlIGEgZmFjZXQgb2YgJHtxKHRhZyl9OiAke2V4b0ZhY2V0fWA7XG4gICAgfTtcbiAgICBoYXJkZW4oYW1wbGlmeSk7XG4gICAgcmVjZWl2ZUFtcGxpZmllcihhbXBsaWZ5KTtcbiAgfVxuXG4gIGlmIChyZWNlaXZlSW5zdGFuY2VUZXN0ZXIpIHtcbiAgICAvKiogQHR5cGUge0lzSW5zdGFuY2V9ICovXG4gICAgY29uc3QgaXNJbnN0YW5jZSA9IChleG9GYWNldCwgZmFjZXROYW1lID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoZmFjZXROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcyhjb250ZXh0TWFwS2l0KS5zb21lKGNvbnRleHRNYXAgPT5cbiAgICAgICAgICBjb250ZXh0TWFwLmhhcyhleG9GYWNldCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhc3NlcnQudHlwZW9mKGZhY2V0TmFtZSwgJ3N0cmluZycpO1xuICAgICAgY29uc3QgY29udGV4dE1hcCA9IGNvbnRleHRNYXBLaXRbZmFjZXROYW1lXTtcbiAgICAgIGNvbnRleHRNYXAgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYGV4byBjbGFzcyBraXQgJHtxKHRhZyl9IGhhcyBubyBmYWNldCBuYW1lZCAke3EoZmFjZXROYW1lKX1gO1xuICAgICAgcmV0dXJuIGNvbnRleHRNYXAuaGFzKGV4b0ZhY2V0KTtcbiAgICB9O1xuICAgIGhhcmRlbihpc0luc3RhbmNlKTtcbiAgICByZWNlaXZlSW5zdGFuY2VUZXN0ZXIoaXNJbnN0YW5jZSk7XG4gIH1cblxuICByZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZUtpdCk7XG59OyRozY9fb25jZS5kZWZpbmVFeG9DbGFzc0tpdChkZWZpbmVFeG9DbGFzc0tpdCk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3NLaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJTVBPUlQoJ0BlbmRvL3BhdHRlcm5zJykuSW50ZXJmYWNlR3VhcmQ8e1xuICogICBbTSBpbiBrZXlvZiBUXTogSU1QT1JUKCdAZW5kby9wYXR0ZXJucycpLk1ldGhvZEd1YXJkXG4gKiB9PiB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmQgQ0FWRUFUOiBzdGF0aWMgdHlwaW5nIGRvZXMgbm90IHlldCBzdXBwb3J0IGBjYWxsV2hlbmAgdHJhbnNmb3JtYXRpb25cbiAqIEBwYXJhbSB7VH0gbWV0aG9kc1xuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2xhc3NDb250ZXh0PHt9LFQ+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7R3VhcmRlZDxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFeG8gPSAodGFnLCBpbnRlcmZhY2VHdWFyZCwgbWV0aG9kcywgb3B0aW9ucyA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBtYWtlSW5zdGFuY2UgPSBkZWZpbmVFeG9DbGFzcyhcbiAgICB0YWcsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdEVtcHR5LFxuICAgIG1ldGhvZHMsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgcmV0dXJuIG1ha2VJbnN0YW5jZSgpO1xufTskaM2PX29uY2UubWFrZUV4byhtYWtlRXhvKTtcbmhhcmRlbihtYWtlRXhvKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImluaXRFbXB0eSI6WyJpbml0RW1wdHkiXSwiZGVmaW5lRXhvQ2xhc3MiOlsiZGVmaW5lRXhvQ2xhc3MiXSwiZGVmaW5lRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRXhvQ2xhc3NLaXQiXSwibWFrZUV4byI6WyJtYWtlRXhvIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABWj/usuRgAALkYAACIAAABAZW5kby9leG8tdjEuNS4xMi9zcmMvZXhvLXRvb2xzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9lcnJvcnMiLCIuL2dldC1pbnRlcmZhY2UuanMiXSwiZXhwb3J0cyI6WyJkZWZlbmRQcm90b3R5cGUiLCJkZWZlbmRQcm90b3R5cGVLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLGdldFJlbW90YWJsZU1ldGhvZE5hbWVzLHRvVGhyb3dhYmxlLEZhcixtdXN0TWF0Y2gsTSxpc0F3YWl0QXJnR3VhcmQsaXNSYXdHdWFyZCxnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCxnZXRNZXRob2RHdWFyZFBheWxvYWQsZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkLGdldENvcHlNYXBFbnRyaWVzLGxpc3REaWZmZXJlbmNlLG9iamVjdE1hcCxxLEZhaWwsR0VUX0lOVEVSRkFDRV9HVUFSRDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChnZXRSZW1vdGFibGVNZXRob2ROYW1lcyA9ICRozY9fYSldXSxbXCJ0b1Rocm93YWJsZVwiLFskaM2PX2EgPT4gKHRvVGhyb3dhYmxlID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiaXNBd2FpdEFyZ0d1YXJkXCIsWyRozY9fYSA9PiAoaXNBd2FpdEFyZ0d1YXJkID0gJGjNj19hKV1dLFtcImlzUmF3R3VhcmRcIixbJGjNj19hID0+IChpc1Jhd0d1YXJkID0gJGjNj19hKV1dLFtcImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV0sW1wiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZUd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXSxbXCJnZXRDb3B5TWFwRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyaWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbW1wibGlzdERpZmZlcmVuY2VcIixbJGjNj19hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9nZXQtaW50ZXJmYWNlLmpzXCIsIFtbXCJHRVRfSU5URVJGQUNFX0dVQVJEXCIsWyRozY9fYSA9PiAoR0VUX0lOVEVSRkFDRV9HVUFSRCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UmVtb3RhYmxlTWV0aG9kTmFtZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VHdWFyZCwgTWV0aG9kLCBNZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRQYXlsb2FkLCBEZWZhdWx0R3VhcmRUeXBlfSBmcm9tICdAZW5kby9wYXR0ZXJucydcbiAqIEBpbXBvcnQge0NsYXNzQ29udGV4dCwgQ29udGV4dFByb3ZpZGVyLCBGYWNldE5hbWUsIEtpdENvbnRleHQsIEtpdENvbnRleHRQcm92aWRlciwgTWF0Y2hDb25maWcsIE1ldGhvZHN9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtHZXRJbnRlcmZhY2VHdWFyZH0gZnJvbSAnLi9nZXQtaW50ZXJmYWNlLmpzJztcbiAqL1xuXG5jb25zdCB7IGFwcGx5LCBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBkZWZpbmVQcm9wZXJ0aWVzLCBmcm9tRW50cmllcywgaGFzT3duIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQSBtZXRob2QgZ3VhcmQsIGZvciBpbmNsdXNpb24gaW4gYW4gaW50ZXJmYWNlIGd1YXJkLCB0aGF0IGRvZXMgbm90XG4gKiBlbmZvcmNlIGFueSBjb25zdHJhaW50cyBvZiBpbmNvbWluZyBhcmd1bWVudHMgb3IgcmV0dXJuIHJlc3VsdHMuXG4gKi9cbmNvbnN0IFJhd01ldGhvZEd1YXJkID0gTS5jYWxsKCkucmVzdChNLnJhdygpKS5yZXR1cm5zKE0ucmF3KCkpO1xuXG5jb25zdCBSRURBQ1RFRF9SQVdfQVJHID0gJzxyZWRhY3RlZCByYXcgYXJnPic7XG5cbi8qKlxuICogQSBtZXRob2QgZ3VhcmQsIGZvciBpbmNsdXNpb24gaW4gYW4gaW50ZXJmYWNlIGd1YXJkLCB0aGF0IGVuZm9yY2VzIG9ubHkgdGhhdFxuICogYWxsIGFyZ3VtZW50cyBhcmUgcGFzc2FibGUgYW5kIHRoYXQgdGhlIHJlc3VsdCBpcyBwYXNzYWJsZS4gKEluIGZhciBjbGFzc2VzLFxuICogXCJhbnlcIiBtZWFucyBhbnkgKnBhc3NhYmxlKi4pIFRoaXMgaXMgdGhlIGxlYXN0IHBvc3NpYmxlIG5vbi1yYXdcbiAqIGVuZm9yY2VtZW50IGZvciBhIG1ldGhvZCBndWFyZCwgYW5kIGlzIGltcGxpZWQgYnkgYWxsIG90aGVyXG4gKiBub24tcmF3IG1ldGhvZCBndWFyZHMuXG4gKi9cbmNvbnN0IFBhc3NhYmxlTWV0aG9kR3VhcmQgPSBNLmNhbGwoKS5yZXN0KE0uYW55KCkpLnJldHVybnMoTS5hbnkoKSk7XG5cbi8qKlxuICogQHBhcmFtIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZVtdfSBzeW5jQXJnc1xuICogQHBhcmFtIHtNYXRjaENvbmZpZ30gbWF0Y2hDb25maWdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGVbXX0gUmV0dXJucyB0aGUgYXJncyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHJhdyBtZXRob2QuXG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNBcmdzID0gKHN5bmNBcmdzLCBtYXRjaENvbmZpZywgbGFiZWwgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3Qge1xuICAgIGRlY2xhcmVkTGVuLFxuICAgIGhhc1Jlc3RBcmdHdWFyZCxcbiAgICByZXN0QXJnR3VhcmRJc1JhdyxcbiAgICBwYXJhbXNQYXR0ZXJuLFxuICAgIHJlZGFjdGVkSW5kaWNlcyxcbiAgfSA9IG1hdGNoQ29uZmlnO1xuXG4gIC8qIFVzZSBzeW5jQXJncyBpZiBwb3NzaWJsZSwgYnV0IGNvcHkgaXQgd2hlbiBuZWNlc3NhcnkgdG8gaW1wbGVtZW50Ki9cbiAgLyogcmVkYWN0aW9ucy4qL1xuICBsZXQgbWF0Y2hhYmxlQXJncyA9IHN5bmNBcmdzO1xuICBpZiAocmVzdEFyZ0d1YXJkSXNSYXcgJiYgc3luY0FyZ3MubGVuZ3RoID4gZGVjbGFyZWRMZW4pIHtcbiAgICBjb25zdCByZXN0TGVuID0gc3luY0FyZ3MubGVuZ3RoIC0gZGVjbGFyZWRMZW47XG4gICAgY29uc3QgcmVkYWN0ZWRSZXN0ID0gQXJyYXkocmVzdExlbikuZmlsbChSRURBQ1RFRF9SQVdfQVJHKTtcbiAgICBtYXRjaGFibGVBcmdzID0gWy4uLnN5bmNBcmdzLnNsaWNlKDAsIGRlY2xhcmVkTGVuKSwgLi4ucmVkYWN0ZWRSZXN0XTtcbiAgfSBlbHNlIGlmIChcbiAgICByZWRhY3RlZEluZGljZXMubGVuZ3RoID4gMCAmJlxuICAgIHJlZGFjdGVkSW5kaWNlc1swXSA8IHN5bmNBcmdzLmxlbmd0aFxuICApIHtcbiAgICAvKiBDb3B5IHRoZSBhcmd1bWVudHMgYXJyYXksIGF2b2lkaW5nIGhhcmRlbmluZyB0aGUgcmVkYWN0ZWQgb25lcyAod2hpY2ggYXJlKi9cbiAgICAvKiB0cml2aWFsbHkgbWF0Y2hlZCB1c2luZyBSRURBQ1RFRF9SQVdfQVJHIGFzIGEgc2VudGluZWwgdmFsdWUpLiovXG4gICAgbWF0Y2hhYmxlQXJncyA9IFsuLi5zeW5jQXJnc107XG4gIH1cblxuICBmb3IgKGNvbnN0IGkgb2YgcmVkYWN0ZWRJbmRpY2VzKSB7XG4gICAgaWYgKGkgPj0gbWF0Y2hhYmxlQXJncy5sZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBtYXRjaGFibGVBcmdzW2ldID0gUkVEQUNURURfUkFXX0FSRztcbiAgfVxuXG4gIG11c3RNYXRjaChoYXJkZW4obWF0Y2hhYmxlQXJncyksIHBhcmFtc1BhdHRlcm4sIGxhYmVsKTtcblxuICBpZiAoaGFzUmVzdEFyZ0d1YXJkKSB7XG4gICAgcmV0dXJuIHN5bmNBcmdzO1xuICB9XG4gIHN5bmNBcmdzLmxlbmd0aCA8PSBkZWNsYXJlZExlbiB8fFxuICAgIEZhaWxgJHtxKGxhYmVsKX0gYWNjZXB0cyBhdCBtb3N0ICR7cShkZWNsYXJlZExlbil9IGFyZ3VtZW50cywgbm90ICR7cShcbiAgICAgIHN5bmNBcmdzLmxlbmd0aCxcbiAgICApfTogJHtzeW5jQXJnc31gO1xuICByZXR1cm4gc3luY0FyZ3M7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgYSBtZXRob2QgZ3VhcmQgdG8gYSBtYXRjaCBjb25maWcgZm9yIG1vcmUgZWZmaWNpZW50IHBlci1jYWxsXG4gKiBleGVjdXRpb24uICBUaGlzIGlzIGEgb25lLXRpbWUgY29udmVyc2lvbiwgc28gaXQncyBPSyB0byBiZSBzbG93LlxuICpcbiAqIE1vc3Qgb2YgdGhlIHdvcmsgaXMgZG9uZSB0byBkZXRlY3QgYE0ucmF3KClgIHNvIHRoYXQgd2UgYnVpbGQgYSBtYXRjaCBwYXR0ZXJuXG4gKiBhbmQgbWV0YWRhdGEgaW5zdGVhZCBvZiBkb2luZyB0aGlzIGluIHRoZSBob3QgcGF0aC5cbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmRQYXlsb2FkfSBtZXRob2RHdWFyZFBheWxvYWRcbiAqIEByZXR1cm5zIHtNYXRjaENvbmZpZ31cbiAqL1xuY29uc3QgYnVpbGRNYXRjaENvbmZpZyA9IG1ldGhvZEd1YXJkUGF5bG9hZCA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcmdHdWFyZHMsXG4gICAgb3B0aW9uYWxBcmdHdWFyZHMgPSBbXSxcbiAgICByZXN0QXJnR3VhcmQsXG4gIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG5cbiAgY29uc3QgbWF0Y2hhYmxlQXJnR3VhcmRzID0gWy4uLmFyZ0d1YXJkcywgLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG4gIGNvbnN0IHJlZGFjdGVkSW5kaWNlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoYWJsZUFyZ0d1YXJkcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChpc1Jhd0d1YXJkKG1hdGNoYWJsZUFyZ0d1YXJkc1tpXSkpIHtcbiAgICAgIG1hdGNoYWJsZUFyZ0d1YXJkc1tpXSA9IFJFREFDVEVEX1JBV19BUkc7XG4gICAgICByZWRhY3RlZEluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cblxuICAvKiBQYXNzIHRocm91Z2ggcmF3IHJlc3QgYXJndW1lbnRzIHdpdGhvdXQgbWF0Y2hpbmcuKi9cbiAgbGV0IG1hdGNoYWJsZVJlc3RBcmdHdWFyZCA9IHJlc3RBcmdHdWFyZDtcbiAgaWYgKGlzUmF3R3VhcmQobWF0Y2hhYmxlUmVzdEFyZ0d1YXJkKSkge1xuICAgIG1hdGNoYWJsZVJlc3RBcmdHdWFyZCA9IE0uYXJyYXlPZihSRURBQ1RFRF9SQVdfQVJHKTtcbiAgfVxuICBjb25zdCBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQgPSBoYXJkZW4oe1xuICAgIC4uLm1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICBhcmdHdWFyZHM6IG1hdGNoYWJsZUFyZ0d1YXJkcy5zbGljZSgwLCBhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICBvcHRpb25hbEFyZ0d1YXJkczogbWF0Y2hhYmxlQXJnR3VhcmRzLnNsaWNlKGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgIHJlc3RBcmdHdWFyZDogbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkLFxuICB9KTtcblxuICBjb25zdCBwYXJhbXNQYXR0ZXJuID0gTS5zcGxpdEFycmF5KFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZC5hcmdHdWFyZHMsXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLm9wdGlvbmFsQXJnR3VhcmRzLFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZC5yZXN0QXJnR3VhcmQsXG4gICk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgZGVjbGFyZWRMZW46IG1hdGNoYWJsZUFyZ0d1YXJkcy5sZW5ndGgsXG4gICAgaGFzUmVzdEFyZ0d1YXJkOiByZXN0QXJnR3VhcmQgIT09IHVuZGVmaW5lZCxcbiAgICByZXN0QXJnR3VhcmRJc1JhdzogcmVzdEFyZ0d1YXJkICE9PSBtYXRjaGFibGVSZXN0QXJnR3VhcmQsXG4gICAgcGFyYW1zUGF0dGVybixcbiAgICByZWRhY3RlZEluZGljZXMsXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHsocmVwcmVzZW50YXRpdmU6IGFueSkgPT4gQ2xhc3NDb250ZXh0IHwgS2l0Q29udGV4dH0gZ2V0Q29udGV4dFxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZFBheWxvYWR9IG1ldGhvZEd1YXJkUGF5bG9hZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcmV0dXJucyB7TWV0aG9kfVxuICovXG5jb25zdCBkZWZlbmRTeW5jTWV0aG9kID0gKFxuICBnZXRDb250ZXh0LFxuICBiZWhhdmlvck1ldGhvZCxcbiAgbWV0aG9kR3VhcmRQYXlsb2FkLFxuICBsYWJlbCxcbikgPT4ge1xuICBjb25zdCB7IHJldHVybkd1YXJkIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG4gIGNvbnN0IGlzUmF3UmV0dXJuID0gaXNSYXdHdWFyZChyZXR1cm5HdWFyZCk7XG4gIGNvbnN0IG1hdGNoQ29uZmlnID0gYnVpbGRNYXRjaENvbmZpZyhtZXRob2RHdWFyZFBheWxvYWQpO1xuICBjb25zdCB7IHN5bmNNZXRob2QgfSA9IHtcbiAgICAvKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbiAgICBzeW5jTWV0aG9kKC4uLnN5bmNBcmdzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dCh0aGlzKTtcbiAgICAgICAgLyogT25seSBoYXJkZW4gYXJncyBhbmQgcmV0dXJuIHZhbHVlIGlmIG5vdCBkZWFsaW5nIHdpdGggYSByYXcgdmFsdWUgZ3VhcmQuKi9cbiAgICAgICAgY29uc3QgcmVhbEFyZ3MgPSBkZWZlbmRTeW5jQXJncyhzeW5jQXJncywgbWF0Y2hDb25maWcsIGxhYmVsKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBwbHkoYmVoYXZpb3JNZXRob2QsIGNvbnRleHQsIHJlYWxBcmdzKTtcbiAgICAgICAgaWYgKCFpc1Jhd1JldHVybikge1xuICAgICAgICAgIG11c3RNYXRjaChoYXJkZW4ocmVzdWx0KSwgcmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKHRocm93blRoaW5nKSB7XG4gICAgICAgIHRocm93IHRvVGhyb3dhYmxlKHRocm93blRoaW5nKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICByZXR1cm4gc3luY01ldGhvZDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtNZXRob2RHdWFyZFBheWxvYWR9IG1ldGhvZEd1YXJkUGF5bG9hZFxuICovXG5jb25zdCBkZXN5bmMgPSBtZXRob2RHdWFyZFBheWxvYWQgPT4ge1xuICBjb25zdCB7XG4gICAgYXJnR3VhcmRzLFxuICAgIG9wdGlvbmFsQXJnR3VhcmRzID0gW10sXG4gICAgcmVzdEFyZ0d1YXJkLFxuICB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICAhaXNBd2FpdEFyZ0d1YXJkKHJlc3RBcmdHdWFyZCkgfHxcbiAgICBGYWlsYFJlc3QgYXJncyBtYXkgbm90IGJlIGF3YWl0ZWQ6ICR7cmVzdEFyZ0d1YXJkfWA7XG4gIGNvbnN0IHJhd0FyZ0d1YXJkcyA9IFsuLi5hcmdHdWFyZHMsIC4uLm9wdGlvbmFsQXJnR3VhcmRzXTtcblxuICBjb25zdCBhd2FpdEluZGV4ZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXdBcmdHdWFyZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBhcmdHdWFyZCA9IHJhd0FyZ0d1YXJkc1tpXTtcbiAgICBpZiAoaXNBd2FpdEFyZ0d1YXJkKGFyZ0d1YXJkKSkge1xuICAgICAgcmF3QXJnR3VhcmRzW2ldID0gZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoYXJnR3VhcmQpLmFyZ0d1YXJkO1xuICAgICAgYXdhaXRJbmRleGVzLnB1c2goaSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgYXdhaXRJbmRleGVzLFxuICAgIHJhd01ldGhvZEd1YXJkUGF5bG9hZDoge1xuICAgICAgLi4ubWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgICAgYXJnR3VhcmRzOiByYXdBcmdHdWFyZHMuc2xpY2UoMCwgYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgICBvcHRpb25hbEFyZ0d1YXJkczogcmF3QXJnR3VhcmRzLnNsaWNlKGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgIH0sXG4gIH07XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7KHJlcHJlc2VudGF0aXZlOiBhbnkpID0+IENsYXNzQ29udGV4dCB8IEtpdENvbnRleHR9IGdldENvbnRleHRcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmRQYXlsb2FkfSBtZXRob2RHdWFyZFBheWxvYWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICovXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZCA9IChcbiAgZ2V0Q29udGV4dCxcbiAgYmVoYXZpb3JNZXRob2QsXG4gIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgbGFiZWwsXG4pID0+IHtcbiAgY29uc3QgeyByZXR1cm5HdWFyZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBjb25zdCBpc1Jhd1JldHVybiA9IGlzUmF3R3VhcmQocmV0dXJuR3VhcmQpO1xuXG4gIGNvbnN0IHsgYXdhaXRJbmRleGVzLCByYXdNZXRob2RHdWFyZFBheWxvYWQgfSA9IGRlc3luYyhtZXRob2RHdWFyZFBheWxvYWQpO1xuICBjb25zdCBtYXRjaENvbmZpZyA9IGJ1aWxkTWF0Y2hDb25maWcocmF3TWV0aG9kR3VhcmRQYXlsb2FkKTtcblxuICBjb25zdCB7IGFzeW5jTWV0aG9kIH0gPSB7XG4gICAgLyogTm90ZSBwdXJwb3NlZnVsIHVzZSBvZiBgdGhpc2AgYW5kIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4gICAgYXN5bmNNZXRob2QoLi4uYXJncykge1xuICAgICAgY29uc3QgYXdhaXRMaXN0ID0gW107XG4gICAgICBmb3IgKGNvbnN0IGkgb2YgYXdhaXRJbmRleGVzKSB7XG4gICAgICAgIGlmIChpID49IGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXRMaXN0LnB1c2goYXJnc1tpXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwID0gUHJvbWlzZS5hbGwoYXdhaXRMaXN0KTtcbiAgICAgIGNvbnN0IHN5bmNBcmdzID0gWy4uLmFyZ3NdO1xuICAgICAgY29uc3QgcmVzdWx0UCA9IEUud2hlbihcbiAgICAgICAgcCxcbiAgICAgICAgLyoqIEBwYXJhbSB7YW55W119IGF3YWl0ZWRBcmdzICovIGF3YWl0ZWRBcmdzID0+IHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF3YWl0ZWRBcmdzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgICBzeW5jQXJnc1thd2FpdEluZGV4ZXNbal1dID0gYXdhaXRlZEFyZ3Nbal07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIEdldCB0aGUgY29udGV4dCBhZnRlciBhbGwgd2FpdGluZyBpbiBjYXNlIHdlIGV2ZXIgZG8gcmV2b2NhdGlvbiovXG4gICAgICAgICAgLyogYnkgcmVtb3ZpbmcgdGhlIGNvbnRleHQgZW50cnkuIEF2b2lkIFRPQ1RUT1UhKi9cbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dCh0aGlzKTtcbiAgICAgICAgICBjb25zdCByZWFsQXJncyA9IGRlZmVuZFN5bmNBcmdzKHN5bmNBcmdzLCBtYXRjaENvbmZpZywgbGFiZWwpO1xuICAgICAgICAgIHJldHVybiBhcHBseShiZWhhdmlvck1ldGhvZCwgY29udGV4dCwgcmVhbEFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBFLndoZW4ocmVzdWx0UCwgZnVsZmlsbG1lbnQgPT4ge1xuICAgICAgICBpZiAoIWlzUmF3UmV0dXJuKSB7XG4gICAgICAgICAgbXVzdE1hdGNoKGhhcmRlbihmdWxmaWxsbWVudCksIHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxmaWxsbWVudDtcbiAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PlxuICAgICAgICAvKiBEb25lIGlzIGEgY2hhaW5lZCBgLmNhdGNoYCByYXRoZXIgdGhhbiBhbiBvblJlamVjdGVkIGNsYXVzZSBvZiB0aGUqL1xuICAgICAgICAvKiBgRS53aGVuYCBhYm92ZSBpbiBjYXNlIHRoZSBgbXVzdE1hdGNoYCB0aHJvd3MuKi9cbiAgICAgICAgUHJvbWlzZS5yZWplY3QodG9UaHJvd2FibGUocmVhc29uKSksXG4gICAgICApO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiBhc3luY01ldGhvZDtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7KHJlcHJlc2VudGF0aXZlOiBhbnkpID0+IENsYXNzQ29udGV4dCB8IEtpdENvbnRleHR9IGdldENvbnRleHRcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqL1xuY29uc3QgZGVmZW5kTWV0aG9kID0gKGdldENvbnRleHQsIGJlaGF2aW9yTWV0aG9kLCBtZXRob2RHdWFyZCwgbGFiZWwpID0+IHtcbiAgY29uc3QgbWV0aG9kR3VhcmRQYXlsb2FkID0gZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKG1ldGhvZEd1YXJkKTtcbiAgY29uc3QgeyBjYWxsS2luZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBpZiAoY2FsbEtpbmQgPT09ICdzeW5jJykge1xuICAgIHJldHVybiBkZWZlbmRTeW5jTWV0aG9kKFxuICAgICAgZ2V0Q29udGV4dCxcbiAgICAgIGJlaGF2aW9yTWV0aG9kLFxuICAgICAgbWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgICAgbGFiZWwsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoY2FsbEtpbmQgPT09ICdhc3luYycpO1xuICAgIHJldHVybiBkZWZlbmRBc3luY01ldGhvZChcbiAgICAgIGdldENvbnRleHQsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGxhYmVsLFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFRhZ1xuICogQHBhcmFtIHtDb250ZXh0UHJvdmlkZXJ9IGNvbnRleHRQcm92aWRlclxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqL1xuY29uc3QgYmluZE1ldGhvZCA9IChcbiAgbWV0aG9kVGFnLFxuICBjb250ZXh0UHJvdmlkZXIsXG4gIGJlaGF2aW9yTWV0aG9kLFxuICBtZXRob2RHdWFyZCxcbikgPT4ge1xuICBhc3NlcnQudHlwZW9mKGJlaGF2aW9yTWV0aG9kLCAnZnVuY3Rpb24nKTtcblxuICAvKipcbiAqIEBwYXJhbSB7YW55fSByZXByZXNlbnRhdGl2ZVxuICogQHJldHVybnMge0NsYXNzQ29udGV4dCB8IEtpdENvbnRleHR9XG4gKi9cbiAgY29uc3QgZ2V0Q29udGV4dCA9IHJlcHJlc2VudGF0aXZlID0+IHtcbiAgICByZXByZXNlbnRhdGl2ZSB8fFxuICAgICAgLyogc2VwYXJhdGUgbGluZSB0byBlYXNlIGJyZWFrcG9pbnRpbmcqL1xuICAgICAgRmFpbGBNZXRob2QgJHttZXRob2RUYWd9IGNhbGxlZCB3aXRob3V0ICd0aGlzJyBvYmplY3RgO1xuICAgIGNvbnN0IGNvbnRleHQgPSBjb250ZXh0UHJvdmlkZXIocmVwcmVzZW50YXRpdmUpO1xuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEZhaWxgJHtxKFxuICAgICAgICBtZXRob2RUYWcsXG4gICAgICApfSBtYXkgb25seSBiZSBhcHBsaWVkIHRvIGEgdmFsaWQgaW5zdGFuY2U6ICR7cmVwcmVzZW50YXRpdmV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH07XG5cbiAgY29uc3QgbWV0aG9kID0gZGVmZW5kTWV0aG9kKFxuICAgIGdldENvbnRleHQsXG4gICAgYmVoYXZpb3JNZXRob2QsXG4gICAgbWV0aG9kR3VhcmQsXG4gICAgbWV0aG9kVGFnLFxuICApO1xuXG4gIGRlZmluZVByb3BlcnRpZXMobWV0aG9kLCB7XG4gICAgbmFtZTogeyB2YWx1ZTogbWV0aG9kVGFnIH0sXG4gICAgbGVuZ3RoOiB7IHZhbHVlOiBiZWhhdmlvck1ldGhvZC5sZW5ndGggfSxcbiAgfSk7XG4gIHJldHVybiBtZXRob2Q7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFJlbW90YWJsZU1ldGhvZE5hbWUsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0NvbnRleHRQcm92aWRlcn0gY29udGV4dFByb3ZpZGVyXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkPHsgW00gaW4ga2V5b2YgVF06IE1ldGhvZEd1YXJkIH0+fSBbaW50ZXJmYWNlR3VhcmRdXG4gKi9cbiAgICAgICBjb25zdCBkZWZlbmRQcm90b3R5cGUgPSAoXG4gIHRhZyxcbiAgY29udGV4dFByb3ZpZGVyLFxuICBiZWhhdmlvck1ldGhvZHMsXG4gIHRoaXNmdWxNZXRob2RzID0gZmFsc2UsXG4gIGludGVyZmFjZUd1YXJkID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGNvbnN0IHByb3RvdHlwZSA9IHt9O1xuICBjb25zdCBtZXRob2ROYW1lcyA9IGdldFJlbW90YWJsZU1ldGhvZE5hbWVzKGJlaGF2aW9yTWV0aG9kcykuZmlsdGVyKFxuICAgIC8qIEJ5IGlnbm9yaW5nIGFueSBtZXRob2QgdGhhdCBzZWVtcyB0byBiZSBhIGNvbnN0cnVjdG9yLCB3ZSBjYW4gdXNlIGEqL1xuICAgIC8qIGNsYXNzLnByb3RvdHlwZSBhcyBhIGJlaGF2aW9yTWV0aG9kcy4qL1xuICAgIGtleSA9PiB7XG4gICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY29uc3RydWN0b3IgPSBiZWhhdmlvck1ldGhvZHMuY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gIShcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlICYmXG4gICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9PT0gY29uc3RydWN0b3JcbiAgICAgICk7XG4gICAgfSxcbiAgKTtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8UmVtb3RhYmxlTWV0aG9kTmFtZSwgTWV0aG9kR3VhcmQ+IHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgbWV0aG9kR3VhcmRzO1xuICAvKiogQHR5cGUge0RlZmF1bHRHdWFyZFR5cGV9ICovXG4gIGxldCBkZWZhdWx0R3VhcmRzO1xuICBpZiAoaW50ZXJmYWNlR3VhcmQpIHtcbiAgICBjb25zdCB7XG4gICAgICBpbnRlcmZhY2VOYW1lLFxuICAgICAgbWV0aG9kR3VhcmRzOiBtZyxcbiAgICAgIHN5bWJvbE1ldGhvZEd1YXJkcyxcbiAgICAgIHNsb3BweSxcbiAgICAgIGRlZmF1bHRHdWFyZHM6IGRnID0gc2xvcHB5ID8gJ3Bhc3NhYmxlJyA6IGRlZmF1bHRHdWFyZHMsXG4gICAgfSA9IGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChpbnRlcmZhY2VHdWFyZCk7XG4gICAgbWV0aG9kR3VhcmRzID0gaGFyZGVuKHtcbiAgICAgIC4uLm1nLFxuICAgICAgLi4uKHN5bWJvbE1ldGhvZEd1YXJkcyAmJlxuICAgICAgICBmcm9tRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyhzeW1ib2xNZXRob2RHdWFyZHMpKSksXG4gICAgfSk7XG4gICAgZGVmYXVsdEd1YXJkcyA9IGRnO1xuICAgIHtcbiAgICAgIGNvbnN0IG1ldGhvZEd1YXJkTmFtZXMgPSBvd25LZXlzKG1ldGhvZEd1YXJkcyk7XG4gICAgICBjb25zdCB1bmltcGxlbWVudGVkID0gbGlzdERpZmZlcmVuY2UobWV0aG9kR3VhcmROYW1lcywgbWV0aG9kTmFtZXMpO1xuICAgICAgdW5pbXBsZW1lbnRlZC5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgRmFpbGBtZXRob2RzICR7cSh1bmltcGxlbWVudGVkKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gICAgICBpZiAoZGVmYXVsdEd1YXJkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHVuZ3VhcmRlZCA9IGxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLCBtZXRob2RHdWFyZE5hbWVzKTtcbiAgICAgICAgdW5ndWFyZGVkLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgIEZhaWxgbWV0aG9kcyAke3EodW5ndWFyZGVkKX0gbm90IGd1YXJkZWQgYnkgJHtxKGludGVyZmFjZU5hbWUpfWA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIG1ldGhvZE5hbWVzKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBiZWhhdmlvck1ldGhvZHNbcHJvcF07XG4gICAgY29uc3QgeyBzaGlmdGVkTWV0aG9kIH0gPSB7XG4gICAgICBzaGlmdGVkTWV0aG9kKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGJlaGF2aW9yTWV0aG9kID0gdGhpc2Z1bE1ldGhvZHMgPyBvcmlnaW5hbE1ldGhvZCA6IHNoaWZ0ZWRNZXRob2Q7XG4gICAgLyogVE9ETyBzb21lIHRvb2wgZG9lcyBub3QgeWV0IHVuZGVyc3RhbmQgdGhlIGA/LltgIHN5bnRheCovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzIyNDcjZGlzY3Vzc2lvbl9yMTU4MzcyNDQyNCovXG4gICAgbGV0IG1ldGhvZEd1YXJkID0gbWV0aG9kR3VhcmRzICYmIG1ldGhvZEd1YXJkc1twcm9wXTtcbiAgICBpZiAoIW1ldGhvZEd1YXJkKSB7XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRHdWFyZHMpIHtcbiAgICAgICAgY2FzZSB1bmRlZmluZWQ6IHtcbiAgICAgICAgICBpZiAodGhpc2Z1bE1ldGhvZHMpIHtcbiAgICAgICAgICAgIG1ldGhvZEd1YXJkID0gUGFzc2FibGVNZXRob2RHdWFyZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWV0aG9kR3VhcmQgPSBSYXdNZXRob2RHdWFyZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncGFzc2FibGUnOiB7XG4gICAgICAgICAgbWV0aG9kR3VhcmQgPSBQYXNzYWJsZU1ldGhvZEd1YXJkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Jhdyc6IHtcbiAgICAgICAgICBtZXRob2RHdWFyZCA9IFJhd01ldGhvZEd1YXJkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBkZWZhdWx0R3VhcmRzICR7cShkZWZhdWx0R3VhcmRzKX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByb3RvdHlwZVtwcm9wXSA9IGJpbmRNZXRob2QoXG4gICAgICBgSW4gJHtxKHByb3ApfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuICAgICAgY29udGV4dFByb3ZpZGVyLFxuICAgICAgYmVoYXZpb3JNZXRob2QsXG4gICAgICBtZXRob2RHdWFyZCxcbiAgICApO1xuICB9XG5cbiAgaWYgKCFoYXNPd24ocHJvdG90eXBlLCBHRVRfSU5URVJGQUNFX0dVQVJEKSkge1xuICAgIGNvbnN0IGdldEludGVyZmFjZUd1YXJkTWV0aG9kID0ge1xuICAgICAgW0dFVF9JTlRFUkZBQ0VfR1VBUkRdKCkge1xuICAgICAgICAvKiBOb3RlOiBNYXkgYmUgYHVuZGVmaW5lZGAqL1xuICAgICAgICByZXR1cm4gaW50ZXJmYWNlR3VhcmQ7XG4gICAgICB9LFxuICAgIH1bR0VUX0lOVEVSRkFDRV9HVUFSRF07XG4gICAgcHJvdG90eXBlW0dFVF9JTlRFUkZBQ0VfR1VBUkRdID0gYmluZE1ldGhvZChcbiAgICAgIGBJbiAke3EoR0VUX0lOVEVSRkFDRV9HVUFSRCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG4gICAgICBjb250ZXh0UHJvdmlkZXIsXG4gICAgICBnZXRJbnRlcmZhY2VHdWFyZE1ldGhvZCxcbiAgICAgIFBhc3NhYmxlTWV0aG9kR3VhcmQsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBGYXIodGFnLCAvKiogQHR5cGUge1QgJiBHZXRJbnRlcmZhY2VHdWFyZDxUPn0gKi8gKHByb3RvdHlwZSkpO1xufTskaM2PX29uY2UuZGVmZW5kUHJvdG90eXBlKGRlZmVuZFByb3RvdHlwZSk7XG5oYXJkZW4oZGVmZW5kUHJvdG90eXBlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxGYWNldE5hbWUsIE1ldGhvZHM+fSBGXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge3sgW0sgaW4ga2V5b2YgRl06IEtpdENvbnRleHRQcm92aWRlciB9fSBjb250ZXh0UHJvdmlkZXJLaXRcbiAqIEBwYXJhbSB7Rn0gYmVoYXZpb3JNZXRob2RzS2l0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7eyBbSyBpbiBrZXlvZiBGXTogSW50ZXJmYWNlR3VhcmQ8UmVjb3JkPGtleW9mIEZbS10sIE1ldGhvZEd1YXJkPj4gfX0gW2ludGVyZmFjZUd1YXJkS2l0XVxuICovXG4gICAgICAgY29uc3QgZGVmZW5kUHJvdG90eXBlS2l0ID0gKFxuICB0YWcsXG4gIGNvbnRleHRQcm92aWRlcktpdCxcbiAgYmVoYXZpb3JNZXRob2RzS2l0LFxuICB0aGlzZnVsTWV0aG9kcyA9IGZhbHNlLFxuICBpbnRlcmZhY2VHdWFyZEtpdCA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBmYWNldE5hbWVzID0gb3duS2V5cyhiZWhhdmlvck1ldGhvZHNLaXQpLnNvcnQoKTtcbiAgZmFjZXROYW1lcy5sZW5ndGggPiAxIHx8IEZhaWxgQSBtdWx0aS1mYWNldCBvYmplY3QgbXVzdCBoYXZlIG11bHRpcGxlIGZhY2V0c2A7XG4gIGlmIChpbnRlcmZhY2VHdWFyZEtpdCkge1xuICAgIGNvbnN0IGludGVyZmFjZU5hbWVzID0gb3duS2V5cyhpbnRlcmZhY2VHdWFyZEtpdCk7XG4gICAgY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcyA9IGxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsIGludGVyZmFjZU5hbWVzKTtcbiAgICBleHRyYUludGVyZmFjZU5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gICAgY29uc3QgZXh0cmFGYWNldE5hbWVzID0gbGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsIGZhY2V0TmFtZXMpO1xuICAgIGV4dHJhRmFjZXROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbm90IGd1YXJkZWQgYnkgaW50ZXJmYWNlc2A7XG4gIH1cbiAgY29uc3QgY29udGV4dE1hcE5hbWVzID0gb3duS2V5cyhjb250ZXh0UHJvdmlkZXJLaXQpO1xuICBjb25zdCBleHRyYUNvbnRleHROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsIGNvbnRleHRNYXBOYW1lcyk7XG4gIGV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gIGNvbnN0IGV4dHJhRmFjZXROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGNvbnRleHRNYXBOYW1lcywgZmFjZXROYW1lcyk7XG4gIGV4dHJhRmFjZXROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG1pc3NpbmcgY29udGV4dHNgO1xuICBjb25zdCBwcm90b0tpdCA9IG9iamVjdE1hcChiZWhhdmlvck1ldGhvZHNLaXQsIChiZWhhdmlvck1ldGhvZHMsIGZhY2V0TmFtZSkgPT5cbiAgICBkZWZlbmRQcm90b3R5cGUoXG4gICAgICBgJHt0YWd9ICR7U3RyaW5nKGZhY2V0TmFtZSl9YCxcbiAgICAgIGNvbnRleHRQcm92aWRlcktpdFtmYWNldE5hbWVdLFxuICAgICAgYmVoYXZpb3JNZXRob2RzLFxuICAgICAgdGhpc2Z1bE1ldGhvZHMsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCAmJiBpbnRlcmZhY2VHdWFyZEtpdFtmYWNldE5hbWVdLFxuICAgICksXG4gICk7XG4gIHJldHVybiBwcm90b0tpdDtcbn07JGjNj19vbmNlLmRlZmVuZFByb3RvdHlwZUtpdChkZWZlbmRQcm90b3R5cGVLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMkl2jYLBQAACwUAACYAAABAZW5kby9leG8tdjEuNS4xMi9zcmMvZ2V0LWludGVyZmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiR0VUX0lOVEVSRkFDRV9HVUFSRCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIEBpbXBvcnQge1JlbW90YWJsZU1ldGhvZE5hbWV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICovXG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGF1dG9tYXRpY2FsbHkgYWRkZWQgZGVmYXVsdCBtZXRhLW1ldGhvZCBmb3JcbiAqIG9idGFpbmluZyBhbiBleG8ncyBpbnRlcmZhY2UsIGlmIGl0IGhhcyBvbmUuXG4gKlxuICogSW50ZW5kZWQgdG8gYmUgc2ltaWxhciB0byBgR0VUX01FVEhPRF9OQU1FU2AgZnJvbSBgQGVuZG8vcGFzcy1zdHlsZWAuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE4MDkjZGlzY3Vzc2lvbl9yMTM4ODA1MjQ1NFxuICpcbiAqIEJld2FyZSB0aGF0IGFuIGV4bydzIGludGVyZmFjZSBjYW4gY2hhbmdlIGFjcm9zcyBhbiB1cGdyYWRlLFxuICogc28gcmVtb3RlcyB0aGF0IGNhY2hlIGl0IGNhbiBiZWNvbWUgc3RhbGUuXG4gKi9cbiAgICAgICBjb25zdCBHRVRfSU5URVJGQUNFX0dVQVJEID0gJ19fZ2V0SW50ZXJmYWNlR3VhcmRfXyc7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UmVtb3RhYmxlTWV0aG9kTmFtZSwgQ2FsbGFibGVGdW5jdGlvbj59IE1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtHRVRfSU5URVJGQUNFX0dVQVJEXT86ICgpID0+XG4gKiAgICAgSU1QT1JUKCdAZW5kby9wYXR0ZXJucycpLkludGVyZmFjZUd1YXJkPHtcbiAqICAgICAgIFtLIGluIGtleW9mIE1dOiBJTVBPUlQoJ0BlbmRvL3BhdHRlcm5zJykuTWV0aG9kR3VhcmRcbiAqICAgICB9PiB8IHVuZGVmaW5lZFxuICogfX0gR2V0SW50ZXJmYWNlR3VhcmRcbiAqLyRozY9fb25jZS5HRVRfSU5URVJGQUNFX0dVQVJEKEdFVF9JTlRFUkZBQ0VfR1VBUkQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiR0VUX0lOVEVSRkFDRV9HVUFSRCI6WyJHRVRfSU5URVJGQUNFX0dVQVJEIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAAB4AAABAZW5kby9leG8tdjEuNS4xMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAIAAAAEBlbmRvL2Zhci12MS4xLjE0L3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKkm1lCYAgAAmAIAAB4AAABAZW5kby9mYXItdjEuMS4xNC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIixudWxsXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAZW5kby9ldmVudHVhbC1zZW5kIjpbWyJFIiwiRSJdXSwiQGVuZG8vcGFzcy1zdHlsZSI6W1siRmFyIiwiRmFyIl0sWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl0sWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1Rn/ZBwgAAAcIAAAdAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vc3JjL3JhbmtPcmRlci5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImNvbXBhcmVCeUNvZGVQb2ludHMiLCJjb21wYXJlQnlDb2RlUG9pbnRzIiwibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwicGFyc2UiLCJwYXJzZSIsInBhc3NhYmxlQXNKdXN0aW4iLCJwYXNzYWJsZUFzSnVzdGluIixudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanNcIiwgW11dLFtcIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9yYW5rT3JkZXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjpbWyJRQ0xBU1MiLCJRQ0xBU1MiXV0sIi4vc3JjL21hcnNoYWwuanMiOltbIm1ha2VNYXJzaGFsIiwibWFrZU1hcnNoYWwiXV0sIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjpbWyJzdHJpbmdpZnkiLCJzdHJpbmdpZnkiXSxbInBhcnNlIiwicGFyc2UiXV0sIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjpbWyJkZWNvZGVUb0p1c3RpbiIsImRlY29kZVRvSnVzdGluIl0sWyJwYXNzYWJsZUFzSnVzdGluIiwicGFzc2FibGVBc0p1c3RpbiJdLFsicXAiLCJxcCJdXSwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOltbIm1ha2VQYXNzYWJsZUtpdCIsIm1ha2VQYXNzYWJsZUtpdCJdLFsibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIl0sWyJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiXSxbImlzRW5jb2RlZFJlbW90YWJsZSIsImlzRW5jb2RlZFJlbW90YWJsZSJdLFsiemVyb1BhZCIsInplcm9QYWQiXSxbInJlY29yZE5hbWVzIiwicmVjb3JkTmFtZXMiXSxbInJlY29yZFZhbHVlcyIsInJlY29yZFZhbHVlcyJdXSwiLi9zcmMvcmFua09yZGVyLmpzIjpbWyJjb21wYXJlTnVtZXJpY3MiLCJjb21wYXJlTnVtZXJpY3MiXSxbImNvbXBhcmVCeUNvZGVQb2ludHMiLCJjb21wYXJlQnlDb2RlUG9pbnRzIl0sWyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCJdLFsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayJdLFsiaXNSYW5rU29ydGVkIiwiaXNSYW5rU29ydGVkIl0sWyJzb3J0QnlSYW5rIiwic29ydEJ5UmFuayJdLFsiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUFudGlSYW5rIl0sWyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il0sWyJnZXRQYXNzU3R5bGVDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIl0sWyJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaW50ZXJzZWN0UmFua0NvdmVycyJdLFsidW5pb25SYW5rQ292ZXJzIiwidW5pb25SYW5rQ292ZXJzIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJkZWVwbHlGdWxmaWxsZWQiLCJkZWVwbHlGdWxmaWxsZWQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGC/aqjJfQAAyX0AACoAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VQYXNzYWJsZUtpdCIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLGlzRXJyb3JMaWtlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsYixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJiXCIsWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IGZyb21FbnRyaWVzLCBpcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCovXG5jb25zdCByQzAgPSAvW1xceDAwLVxceDFGXS87XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdWZmaXggb2YgYSBzdHJpbmcgc3RhcnRpbmcgYXQgYSBwYXJ0aWN1bGFyIGluZGV4LlxuICogVGhpcyBib3RoIGV4cHJlc3NlcyBpbnRlbnQgYW5kIHBvdGVudGlhbGx5IGF2b2lkcyBzbG93IGBzdWJzdHJpbmdgIGluIFhTLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBnZXRTdWZmaXggPSAoc3RyLCBpbmRleCkgPT4gKGluZGV4ID09PSAwID8gc3RyIDogc3RyLnN1YnN0cmluZyhpbmRleCkpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkLCB3ZSBoYXZlIG9ubHlcbiAqIHN0cmluZy1uYW1lZCBvd24gcHJvcGVydGllcy4gYHJlY29yZE5hbWVzYCByZXR1cm5zIHRob3NlIG5hbWUgKnJldmVyc2UqXG4gKiBzb3J0ZWQsIGJlY2F1c2UgdGhhdCdzIGhvdyByZWNvcmRzIGFyZSBjb21wYXJlZCwgZW5jb2RlZCwgYW5kIHNvcnRlZC5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG4gICAgICAgY29uc3QgcmVjb3JkTmFtZXMgPSByZWNvcmQgPT5cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI2MCNkaXNjdXNzaW9uX3IxMDAzNjU3MjQ0Ki9cbiAgLyogY29tcGFyZXMgdHdvIHdheXMgb2YgcmV2ZXJzZSBzb3J0aW5nLCBhbmQgc2hvd3MgdGhhdCBgLnNvcnQoKS5yZXZlcnNlKClgKi9cbiAgLyogaXMgY3VycmVudGx5IGZhc3RlciBvbiBNb2RkYWJsZSBYUywgd2hpbGUgdGhlIG90aGVyIHdheSwqL1xuICAvKiBgLnNvcnQocmV2ZXJzZUNvbXBhcmF0b3IpYCwgaXMgZmFzdGVyIG9uIHY4LiBXZSBjdXJyZW50bHkgY2FyZSBtb3JlIGFib3V0Ki9cbiAgLyogWFMgcGVyZm9ybWFuY2UsIHNvIHdlIHJldmVyc2Ugc29ydCB1c2luZyBgLnNvcnQoKS5yZXZlcnNlKClgLiovXG4gIGhhcmRlbigvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAob3duS2V5cyhyZWNvcmQpKS5zb3J0KCkucmV2ZXJzZSgpKTskaM2PX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuaGFyZGVuKHJlY29yZE5hbWVzKTtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCBhbmQgYG5hbWVzYCBpcyBgcmVjb3JkTmFtZXMocmVjb3JkKWAsXG4gKiByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge1RbXX1cbiAqL1xuICAgICAgIGNvbnN0IHJlY29yZFZhbHVlcyA9IChyZWNvcmQsIG5hbWVzKSA9PlxuICBoYXJkZW4obmFtZXMubWFwKG5hbWUgPT4gcmVjb3JkW25hbWVdKSk7JGjNj19vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbmNvbnN0IHplcm9lcyA9IEFycmF5KDE2KVxuICAuZmlsbCh1bmRlZmluZWQpXG4gIC5tYXAoKF8sIGkpID0+ICcwJy5yZXBlYXQoaSkpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gblxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCB6ZXJvUGFkID0gKG4sIHNpemUpID0+IHtcbiAgY29uc3QgblN0ciA9IGAke259YDtcbiAgY29uc3QgZmlsbExlbiA9IHNpemUgLSBuU3RyLmxlbmd0aDtcbiAgaWYgKGZpbGxMZW4gPT09IDApIHJldHVybiBuU3RyO1xuICBhc3NlcnQoZmlsbExlbiA+IDAgJiYgZmlsbExlbiA8IHplcm9lcy5sZW5ndGgpO1xuICByZXR1cm4gYCR7emVyb2VzW2ZpbGxMZW5dfSR7blN0cn1gO1xufTskaM2PX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLyogVGhpcyBpcyB0aGUgSmF2YVNjcmlwdCBhbmFsb2cgdG8gYSBDIHVuaW9uOiBhIHdheSB0byBtYXAgYmV0d2VlbiBhIGZsb2F0IGFzIGEqL1xuLyogbnVtYmVyIGFuZCB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgZmxvYXQgYXMgYSBidWZmZXIgZnVsbCBvZiBieXRlcy4gIE5vdGUqL1xuLyogdGhhdCB0aGUgbXV0YXRpb24gb2Ygc3RhdGljIHN0YXRlIGhlcmUgbWFrZXMgdGhpcyBpbnZhbGlkIEplc3NpZSBjb2RlLCBidXQqL1xuLyogZG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgdGhlIG51Z2F0b3J5IGFuZCBncmF0dWl0b3VzIGFsbG9jYXRpb25zIHRoYXQgd291bGQqL1xuLyogaGFwcGVuIGV2ZXJ5IHRpbWUgeW91IGRvIGEgY29udmVyc2lvbiAtLSBhbmQgaW4gcHJhY3RpY2FsIHRlcm1zIGl0J3Mgc2FmZSovXG4vKiBiZWNhdXNlIHdlIHB1dCB0aGUgdmFsdWUgaW4gb25lIHNpZGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgdGFrZSBpdCBvdXQgdGhlKi9cbi8qIG90aGVyOyB0aGVyZSBpcyBubyBhY3R1YWwgc3RhdGUgcmV0YWluZWQgaW4gdGhlIGNsYXNzaWMgc2Vuc2UgYW5kIHRodXMgbm8qL1xuLyogcmUtZW50cmFuY3kgaXNzdWUuKi9cbmNvbnN0IGFzTnVtYmVyID0gbmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cyA9IG5ldyBCaWdVaW50NjRBcnJheShhc051bWJlci5idWZmZXIpO1xuXG4vKiBKYXZhU2NyaXB0IG51bWJlcnMgYXJlIGVuY29kZWQgYnkgb3V0cHV0dGluZyB0aGUgYmFzZS0xNiovXG4vKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmluYXJ5IHZhbHVlIG9mIHRoZSB1bmRlcmx5aW5nIElFRUUgZmxvYXRpbmcgcG9pbnQqL1xuLyogcmVwcmVzZW50YXRpb24uICBGb3IgbmVnYXRpdmUgdmFsdWVzLCBhbGwgYml0cyBvZiB0aGlzIHJlcHJlc2VudGF0aW9uIGFyZSovXG4vKiBjb21wbGVtZW50ZWQgcHJpb3IgdG8gdGhlIGJhc2UtMTYgY29udmVyc2lvbiwgd2hpbGUgZm9yIHBvc2l0aXZlIHZhbHVlcywgdGhlKi9cbi8qIHNpZ24gYml0IGlzIGNvbXBsZW1lbnRlZC4gIFRoaXMgZW5zdXJlcyBib3RoIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYmVmb3JlKi9cbi8qIHBvc2l0aXZlIHZhbHVlcyBhbmQgdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBhY2NvcmRpbmcgdG8gdGhlaXIgbmVnYXRpdmUqL1xuLyogbWFnbml0dWRlIHJhdGhlciB0aGFuIHRoZWlyIHBvc2l0aXZlIG1hZ25pdHVkZS4gIFRoaXMgcmVzdWx0cyBpbiBhbiBBU0NJSSovXG4vKiBlbmNvZGluZyB3aG9zZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWVyaWMgc29ydCBvcmRlciovXG4vKiBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLiovXG5cbi8qIFRPRE8gQ2hvb3NlIHRoZSBzYW1lIGNhbm9uaWNhbCBOYU4gZW5jb2RpbmcgdGhhdCBjb3NtV2FzbSBhbmQgZXdhc20gY2hvc2UuKi9cbmNvbnN0IENhbm9uaWNhbE5hTkJpdHMgPSAnZmZmODAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpbmFyeTY0ID0gbiA9PiB7XG4gIC8qIE5vcm1hbGl6ZSAtMCB0byAwIGFuZCBOYU4gdG8gYSBjYW5vbmljYWwgZW5jb2RpbmcqL1xuICBpZiAoaXMobiwgLTApKSB7XG4gICAgbiA9IDA7XG4gIH0gZWxzZSBpZiAoaXMobiwgTmFOKSkge1xuICAgIHJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuICB9XG4gIGFzTnVtYmVyWzBdID0gbjtcbiAgbGV0IGJpdHMgPSBhc0JpdHNbMF07XG4gIGlmIChuIDwgMCkge1xuICAgIGJpdHMgXj0gMHhmZmZmZmZmZmZmZmZmZmZmbjtcbiAgfSBlbHNlIHtcbiAgICBiaXRzIF49IDB4ODAwMDAwMDAwMDAwMDAwMG47XG4gIH1cbiAgcmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLCAxNil9YDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF1cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZUJpbmFyeTY0ID0gKGVuY29kZWQsIHNraXAgPSAwKSA9PiB7XG4gIGVuY29kZWQuY2hhckF0KHNraXApID09PSAnZicgfHwgRmFpbGBFbmNvZGVkIG51bWJlciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBiaXRzID0gQmlnSW50KGAweCR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKX1gKTtcbiAgaWYgKGVuY29kZWQuY2hhckF0KHNraXAgKyAxKSA8ICc4Jykge1xuICAgIGJpdHMgXj0gMHhmZmZmZmZmZmZmZmZmZmZmbjtcbiAgfSBlbHNlIHtcbiAgICBiaXRzIF49IDB4ODAwMDAwMDAwMDAwMDAwMG47XG4gIH1cbiAgYXNCaXRzWzBdID0gYml0cztcbiAgY29uc3QgcmVzdWx0ID0gYXNOdW1iZXJbMF07XG4gICFpcyhyZXN1bHQsIC0wKSB8fFxuICAgIEZhaWxgVW5leHBlY3RlZCBuZWdhdGl2ZSB6ZXJvOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBFbmNvZGUgYSBKYXZhU2NyaXB0IGJpZ2ludCB1c2luZyBhIHZhcmlhbnQgb2YgRWxpYXMgZGVsdGEgY29kaW5nLCB3aXRoIGFuXG4gKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGFcbiAqIHNlY29uZCBjb21wb25lbnQgZm9yIHRoZSBkZWNpbWFsIGRpZ2l0IGNvdW50LCBhbmQgYSB0aGlyZCBjb21wb25lbnQgZm9yIHRoZVxuICogZGVjaW1hbCBkaWdpdHMgcHJlY2VkZWQgYnkgYSBncmF0dWl0b3VzIHNlcGFyYXRpbmcgY29sb24uXG4gKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlXG4gKiBudW1lcmljIHNvcnQgb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycywgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVuYXJ5XG4gKiBwcmVmaXggYXJlIGRpZmZlcmVudCBmb3IgbmVnYXRpdmUgdmFsdWVzICh0eXBlIFwiblwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2ZcbiAqIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlXG4gKiBcInBcIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIFwiflwicyBbd2hpY2ggc29ydCBhZnRlciBkZWNpbWFsIGRpZ2l0c10pIGFuZFxuICogZWFjaCBkZWNpbWFsIGRpZ2l0IG9mIHRoZSBlbmNvZGluZyBmb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIGl0c1xuICogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieVxuICogKmRlc2NlbmRpbmcqIGFic29sdXRlIHZhbHVlKS5cbiAqXG4gKiBAcGFyYW0ge2JpZ2ludH0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmlnSW50ID0gbiA9PiB7XG4gIGNvbnN0IGFicyA9IG4gPCAwbiA/IC1uIDogbjtcbiAgY29uc3QgbkRpZ2l0cyA9IGFicy50b1N0cmluZygpLmxlbmd0aDtcbiAgY29uc3QgbERpZ2l0cyA9IG5EaWdpdHMudG9TdHJpbmcoKS5sZW5ndGg7XG4gIGlmIChuIDwgMG4pIHtcbiAgICByZXR1cm4gYG4ke1xuICAgICAgLyogQSBcIiNcIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbiAgICAgIC8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbiAgICAgICcjJy5yZXBlYXQobERpZ2l0cyAtIDEpXG4gICAgfSR7XG4gICAgICAvKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgY291bnQgb2YgZGlnaXRzLiovXG4gICAgICAoMTAgKiogbERpZ2l0cyAtIG5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywgJzAnKVxuICAgIH06JHtcbiAgICAgIC8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBkaWdpdHMuKi9cbiAgICAgICgxMG4gKiogQmlnSW50KG5EaWdpdHMpICsgbikudG9TdHJpbmcoKS5wYWRTdGFydChuRGlnaXRzLCAnMCcpXG4gICAgfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGBwJHtcbiAgICAgIC8qIEEgXCJ+XCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4gICAgICAvKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4gICAgICAnficucmVwZWF0KGxEaWdpdHMgLSAxKVxuICAgIH0ke1xuICAgICAgLyogVGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuICAgICAgbkRpZ2l0c1xuICAgIH06JHtcbiAgICAgIC8qIFRoZSBkaWdpdHMuKi9cbiAgICAgIG5cbiAgICB9YDtcbiAgfVxufTtcblxuY29uc3QgckJpZ0ludFBheWxvYWQgPSAvKFswLTldKykoOihbMC05XSskfCl8KS9zO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5jb25zdCBkZWNvZGVCaWdJbnQgPSBlbmNvZGVkID0+IHtcbiAgY29uc3QgdHlwZVByZWZpeCA9IGVuY29kZWQuY2hhckF0KDApOyAvKiBmYXN0ZXIgdGhhbiBlbmNvZGVkWzBdKi9cbiAgdHlwZVByZWZpeCA9PT0gJ3AnIHx8XG4gICAgdHlwZVByZWZpeCA9PT0gJ24nIHx8XG4gICAgRmFpbGBFbmNvZGVkIGJpZ2ludCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbiAgY29uc3Qge1xuICAgIGluZGV4OiBsRGlnaXRzLFxuICAgIDE6IHNuRGlnaXRzLFxuICAgIDI6IHRhaWwsXG4gICAgMzogZGlnaXRzLFxuICB9ID0gZW5jb2RlZC5tYXRjaChyQmlnSW50UGF5bG9hZCkgfHwgRmFpbGBEaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbiAgc25EaWdpdHMubGVuZ3RoID09PSBsRGlnaXRzIHx8XG4gICAgRmFpbGBVbmFyeS1wcmVmaXhlZCBkZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IG5EaWdpdHMgPSBwYXJzZUludChzbkRpZ2l0cywgMTApO1xuICBpZiAodHlwZVByZWZpeCA9PT0gJ24nKSB7XG4gICAgLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuICAgIC8qIGxpa2UgXCJuMDpcIiBhbmQgXCJuMDA64oCmXCIgYW5kIFwibjkxOuKAplwiIHRocm91Z2ggXCJuOTk64oCmXCI/Ki9cbiAgICBuRGlnaXRzID0gMTAgKiogLyoqIEB0eXBlIHtudW1iZXJ9ICovIChsRGlnaXRzKSAtIG5EaWdpdHM7XG4gIH1cblxuICB0YWlsLmNoYXJBdCgwKSA9PT0gJzonIHx8IEZhaWxgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgZGlnaXRzLmxlbmd0aCA9PT0gbkRpZ2l0cyB8fFxuICAgIEZhaWxgRml4ZWQtbGVuZ3RoIGRpZ2l0IHNlcXVlbmNlIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IG4gPSBCaWdJbnQoZGlnaXRzKTtcbiAgaWYgKHR5cGVQcmVmaXggPT09ICduJykge1xuICAgIC8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbiAgICAvKiBsaWtlIFwibjk6MFwiIGFuZCBcIm44OjAwXCIgYW5kIFwibjg6OTFcIiB0aHJvdWdoIFwibjg6OTlcIj8qL1xuICAgIG4gPSAtKDEwbiAqKiBCaWdJbnQobkRpZ2l0cykgLSBuKTtcbiAgfVxuXG4gIHJldHVybiBuO1xufTtcblxuLyoqXG4gKiBBIHNwYXJzZSBhcnJheSBmb3Igd2hpY2ggZXZlcnkgcHJlc2VudCBpbmRleCBtYXBzIGEgY29kZSBwb2ludCBpbiB0aGUgQVNDSUlcbiAqIHJhbmdlIHRvIGEgY29ycmVzcG9uZGluZyBlc2NhcGUgc2VxdWVuY2UuXG4gKlxuICogRXNjYXBlcyBhbGwgY2hhcmFjdGVycyBmcm9tIFUrMDAwMCBOVUxMIHRvIFUrMDAxRiBJTkZPUk1BVElPTiBTRVBBUkFUT1IgT05FXG4gKiBsaWtlIGAhPGNoYXJhY3RlciBvZmZzZXQgYnkgMHgyMT5gIHRvIGF2b2lkIEpTT04uc3RyaW5naWZ5IGV4cGFuc2lvbiBhc1xuICogYFxcdUhISEhgLCBhbmQgc3BlY2lhbGx5IGVzY2FwZXMgVSswMDIwIFNQQUNFICh0aGUgYXJyYXkgZWxlbWVudCB0ZXJtaW5hdG9yKVxuICogYXMgYCFfYCBhbmQgVSswMDIxIEVYQ0xBTUFUSU9OIE1BUksgKHRoZSBlc2NhcGUgcHJlZml4KSBhcyBgIXxgIChib3RoIGNob3NlblxuICogZm9yIHZpc3VhbCBhcHByb3hpbWF0aW9uKS5cbiAqIFJlbGF0aXZlIGxleGljb2dyYXBoaWMgb3JkZXJpbmcgaXMgcHJlc2VydmVkIGJ5IHRoaXMgbWFwcGluZyBvZiBhbnkgY2hhcmFjdGVyXG4gKiBhdCBvciBiZWZvcmUgYCFgIGluIHRoZSBjb250aWd1b3VzIHJhbmdlIFsweDAwLi4weDIxXSB0byBhIHJlc3BlY3RpdmVcbiAqIGNoYXJhY3RlciBpbiBbMHgyMS4uMHg0MCwgMHg1RiwgMHg3Q10gcHJlY2VkZWQgYnkgYCFgICh3aGljaCBpcyBpdHNlbGYgaW4gdGhlXG4gKiByZXBsYWNlZCByYW5nZSkuXG4gKiBTaW1pbGFybHksIGVzY2FwZXMgYF5gIGFzIGBfQGAgYW5kIGBfYCBhcyBgX19gIGJlY2F1c2UgYF5gIGluZGljYXRlcyB0aGVcbiAqIHN0YXJ0IG9mIGFuIGVuY29kZWQgYXJyYXkuXG4gKlxuICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gKi9cbmNvbnN0IHN0cmluZ0VzY2FwZXMgPSBBcnJheSgweDIyKVxuICAuZmlsbCh1bmRlZmluZWQpXG4gIC5tYXAoKF8sIGNwKSA9PiB7XG4gICAgc3dpdGNoIChTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKSkge1xuICAgICAgY2FzZSAnICc6XG4gICAgICAgIHJldHVybiAnIV8nO1xuICAgICAgY2FzZSAnISc6XG4gICAgICAgIHJldHVybiAnIXwnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGAhJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNwICsgMHgyMSl9YDtcbiAgICB9XG4gIH0pO1xuc3RyaW5nRXNjYXBlc1snXicuY2hhckNvZGVBdCgwKV0gPSAnX0AnO1xuc3RyaW5nRXNjYXBlc1snXycuY2hhckNvZGVBdCgwKV0gPSAnX18nO1xuXG4vKipcbiAqIEVuY29kZXMgYSBzdHJpbmcgd2l0aCBlc2NhcGUgc2VxdWVuY2VzIGZvciB1c2UgaW4gdGhlIFwiY29tcGFjdE9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhzdHI6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4ID0gc3RyID0+XG4gIHN0ci5yZXBsYWNlKC9bXFwwLSFeX10vZywgY2ggPT4gc3RyaW5nRXNjYXBlc1tjaC5jaGFyQ29kZUF0KDApXSk7XG5cbi8qKlxuICogRGVjb2RlcyBhIHN0cmluZyBmcm9tIHRoZSBcImNvbXBhY3RPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXggPSBlbmNvZGVkID0+IHtcbiAgcmV0dXJuIGVuY29kZWQucmVwbGFjZSgvKFtcXDAtIV9dKSgufFxcbik/L2csIChlc2MsIHByZWZpeCwgc3VmZml4KSA9PiB7XG4gICAgc3dpdGNoIChlc2MpIHtcbiAgICAgIGNhc2UgJyFfJzpcbiAgICAgICAgcmV0dXJuICcgJztcbiAgICAgIGNhc2UgJyF8JzpcbiAgICAgICAgcmV0dXJuICchJztcbiAgICAgIGNhc2UgJ19AJzpcbiAgICAgICAgcmV0dXJuICdeJztcbiAgICAgIGNhc2UgJ19fJzpcbiAgICAgICAgcmV0dXJuICdfJztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgY2ggPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHN1ZmZpeCk7XG4gICAgICAgIC8qIFRoZSByYW5nZSBvZiB2YWxpZCBgIWAtZXNjYXBlIHN1ZmZpeGVzIGlzIFsoMHgwMCsweDIxKS4uKDB4MUYrMHgyMSldLCBpLmUuKi9cbiAgICAgICAgLyogWzB4MjEuLjB4NDBdIChVKzAwMjEgRVhDTEFNQVRJT04gTUFSSyB0byBVKzAwNDAgQ09NTUVSQ0lBTCBBVCkuKi9cbiAgICAgICAgKHByZWZpeCA9PT0gJyEnICYmIHN1ZmZpeCAhPT0gdW5kZWZpbmVkICYmIGNoID49ICchJyAmJiBjaCA8PSAnQCcpIHx8XG4gICAgICAgICAgRmFpbGBpbnZhbGlkIHN0cmluZyBlc2NhcGU6ICR7cShlc2MpfWA7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoLmNoYXJDb2RlQXQoMCkgLSAweDIxKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBUcml2aWFsbHkgaWRlbnRpdHktZW5jb2RlcyBhIHN0cmluZyBmb3IgdXNlIGluIHRoZSBcImxlZ2FjeU9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhzdHI6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXggPSBzdHIgPT4gc3RyO1xuXG4vKipcbiAqIFRyaXZpYWxseSBpZGVudGl0eS1kZWNvZGVzIGEgc3RyaW5nIGZyb20gdGhlIFwibGVnYWN5T3JkZXJlZFwiIGZvcm1hdC5cbiAqXG4gKiBAdHlwZSB7KGVuY29kZWQ6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXggPSBlbmNvZGVkID0+IGVuY29kZWQ7XG5cbi8qKlxuICogRW5jb2RlcyBhbiBhcnJheSBpbnRvIGEgc2VxdWVuY2Ugb2YgZW5jb2RlZCBlbGVtZW50cyBmb3IgdXNlIGluIHRoZSBcImNvbXBhY3RPcmRlcmVkXCJcbiAqIGZvcm1hdCwgZWFjaCB0ZXJtaW5hdGVkIGJ5IGEgc3BhY2UgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIGVzY2FwZWQgcmFuZ2UgaW5cbiAqIFwiY29tcGFjdE9yZGVyZWRcIiBlbmNvZGVkIHN0cmluZ3MpLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gYXJyYXlcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBzdHJpbmd9IGVuY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydeJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGNoYXJzLnB1c2goZW5jLCAnICcpO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9IGRlY29kZVBhc3NhYmxlXG4gKiBAcGFyYW0ge251bWJlcn0gW3NraXBdXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RBcnJheSA9IChlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgLyogU2NhbiBlbmNvZGVkIHJhdGhlciB0aGFuIGl0cyB0YWlsIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbiAgbGV0IG5leHRJbmRleCA9IHNraXAgKyAxO1xuICBsZXQgY3VycmVudEVsZW1lbnRTdGFydCA9IHNraXAgKyAxO1xuICBmb3IgKGNvbnN0IHsgMDogY2gsIGluZGV4OiBpIH0gb2YgZW5jb2RlZC5tYXRjaEFsbCgvW1xcXiBdL2cpKSB7XG4gICAgY29uc3QgaW5kZXggPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGkpO1xuICAgIGlmIChpbmRleCA8PSBza2lwKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHNraXApIHtcbiAgICAgICAgY2ggPT09ICdeJyB8fCBGYWlsYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gJ14nKSB7XG4gICAgICAvKiBUaGlzIGlzIHRoZSBzdGFydCBvZiBhIG5lc3RlZCBhcnJheS4qL1xuICAgICAgLyogVE9ETzogU2luY2UgdGhlIHN5bnRheCBvZiBuZXN0ZWQgYXJyYXlzIG11c3QgYmUgdmFsaWRhdGVkIGFzIHBhcnQgb2YqL1xuICAgICAgLyogZGVjb2RpbmcgdGhlIG91dGVyIG9uZSwgY29uc2lkZXIgZGVjb2RpbmcgdGhlbSBoZXJlIGludG8gYSBzaGFyZWQgY2FjaGUqL1xuICAgICAgLyogcmF0aGVyIHRoYW4gZGlzY2FyZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciBjb250ZW50cyB1bnRpbCB0aGUgbGF0ZXIqL1xuICAgICAgLyogZGVjb2RlUGFzc2FibGUuKi9cbiAgICAgIGRlcHRoICs9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIFRoaXMgaXMgYSB0ZXJtaW5hdGVkIGVsZW1lbnQuKi9cbiAgICAgIGlmIChpbmRleCA9PT0gbmV4dEluZGV4KSB7XG4gICAgICAgIC8qIEEgdGVybWluYXRvciBhZnRlciBgW2Agb3IgYW4gYW5vdGhlciB0ZXJtaW5hdG9yIGluZGljYXRlcyB0aGF0IGFuIGFycmF5IGlzIGRvbmUuKi9cbiAgICAgICAgZGVwdGggLT0gMTtcbiAgICAgICAgZGVwdGggPj0gMCB8fFxuICAgICAgICAgIC8qIHByZXR0aWVyLWlnbm9yZSovXG4gICAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGFycmF5IGVsZW1lbnQgdGVybWluYXRvcjogJHtlbmNvZGVkLnNsaWNlKHNraXAsIGluZGV4ICsgMil9YDtcbiAgICAgIH1cbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAvKiBXZSBoYXZlIGEgY29tcGxldGUgZWxlbWVudCBvZiB0aGUgdG9wbW9zdCBhcnJheS4qL1xuICAgICAgICBlbGVtZW50cy5wdXNoKFxuICAgICAgICAgIGRlY29kZVBhc3NhYmxlKGVuY29kZWQuc2xpY2UoY3VycmVudEVsZW1lbnRTdGFydCwgaW5kZXgpKSxcbiAgICAgICAgKTtcbiAgICAgICAgY3VycmVudEVsZW1lbnRTdGFydCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogQWR2YW5jZSB0aGUgaW5kZXguKi9cbiAgICBuZXh0SW5kZXggPSBpbmRleCArIDE7XG4gIH1cbiAgZGVwdGggPT09IDAgfHwgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIG5leHRJbmRleCA9PT0gZW5jb2RlZC5sZW5ndGggfHxcbiAgICBGYWlsYHVudGVybWluYXRlZCBhcnJheSBlbGVtZW50OiAke2dldFN1ZmZpeChcbiAgICAgIGVuY29kZWQsXG4gICAgICBjdXJyZW50RWxlbWVudFN0YXJ0LFxuICAgICl9YDtcbiAgcmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBvcmlnaW5hbCBhcnJheSBlbmNvZGluZywgd2hpY2ggZXNjYXBlcyBhbGwgZW5jb2RlZCBhcnJheVxuICogZWxlbWVudHMgcmF0aGVyIHRoYW4ganVzdCBzdHJpbmdzIChgXFx1MDAwMGAgYXMgdGhlIGVsZW1lbnQgdGVybWluYXRvciBhbmRcbiAqIGBcXHUwMDAxYCBhcyB0aGUgZXNjYXBlIHByZWZpeCBmb3IgYFxcdTAwMDBgIG9yIGBcXHUwMDAxYCkuXG4gKiBUaGlzIG5lY2Vzc2l0YXRlZCBhbiB1bmRlc2lyYWJsZSBhbW91bnQgb2YgaXRlcmF0aW9uIGFuZCBleHBhbnNpb247IHNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI2MCNkaXNjdXNzaW9uX3I5NjAzNjk4MjZcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGFycmF5XG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gc3RyaW5nfSBlbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydbJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGZvciAoY29uc3QgYyBvZiBlbmMpIHtcbiAgICAgIGlmIChjID09PSAnXFx1MDAwMCcgfHwgYyA9PT0gJ1xcdTAwMDEnKSB7XG4gICAgICAgIGNoYXJzLnB1c2goJ1xcdTAwMDEnKTtcbiAgICAgIH1cbiAgICAgIGNoYXJzLnB1c2goYyk7XG4gICAgfVxuICAgIGNoYXJzLnB1c2goJ1xcdTAwMDAnKTtcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJyk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfSBkZWNvZGVQYXNzYWJsZVxuICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5jb25zdCBkZWNvZGVMZWdhY3lBcnJheSA9IChlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgY29uc3QgZWxlbUNoYXJzID0gW107XG4gIC8qIFVzZSBhIHN0cmluZyBpdGVyYXRvciB0byBhdm9pZCBzbG93IGluZGV4ZWQgYWNjZXNzIGluIFhTLiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG4gIGxldCBzdGlsbFRvU2tpcCA9IHNraXAgKyAxO1xuICBsZXQgaW5Fc2NhcGUgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBjIG9mIGVuY29kZWQpIHtcbiAgICBpZiAoc3RpbGxUb1NraXAgPiAwKSB7XG4gICAgICBzdGlsbFRvU2tpcCAtPSAxO1xuICAgICAgaWYgKHN0aWxsVG9Ta2lwID09PSAwKSB7XG4gICAgICAgIGMgPT09ICdbJyB8fCBGYWlsYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbkVzY2FwZSkge1xuICAgICAgYyA9PT0gJ1xcdTAwMDAnIHx8XG4gICAgICAgIGMgPT09ICdcXHUwMDAxJyB8fFxuICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjfWA7XG4gICAgICBlbGVtQ2hhcnMucHVzaChjKTtcbiAgICB9IGVsc2UgaWYgKGMgPT09ICdcXHUwMDAwJykge1xuICAgICAgY29uc3QgZW5jb2RlZEVsZW1lbnQgPSBlbGVtQ2hhcnMuam9pbignJyk7XG4gICAgICBlbGVtQ2hhcnMubGVuZ3RoID0gMDtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG4gICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xcdTAwMDEnKSB7XG4gICAgICBpbkVzY2FwZSA9IHRydWU7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWUqL1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1DaGFycy5wdXNoKGMpO1xuICAgIH1cbiAgICBpbkVzY2FwZSA9IGZhbHNlO1xuICB9XG4gICFpbkVzY2FwZSB8fCBGYWlsYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGVsZW1DaGFycy5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYGVuY29kaW5nIHRlcm1pbmF0ZWQgZWFybHk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0J5dGVBcnJheX0gYnl0ZUFycmF5XG4gKiBAcGFyYW0geyhieXRlQXJyYXk6IEJ5dGVBcnJheSkgPT4gc3RyaW5nfSBfZW5jb2RlUGFzc2FibGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJ5dGVBcnJheSA9IChieXRlQXJyYXksIF9lbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAvKiBUT0RPIGltcGxlbWVudCovXG4gIEZhaWxgZW5jb2RlUGFzc2FibGUoYnl0ZUFycmF5KSBub3QgeWV0IGltcGxlbWVudGVkOiAke2J5dGVBcnJheX1gO1xuICByZXR1cm4gJyc7IC8qIEp1c3QgZm9yIHRoZSB0eXBlKi9cbn07XG5cbmNvbnN0IGVuY29kZVJlY29yZCA9IChyZWNvcmQsIGVuY29kZUFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICBjb25zdCBuYW1lcyA9IHJlY29yZE5hbWVzKHJlY29yZCk7XG4gIGNvbnN0IHZhbHVlcyA9IHJlY29yZFZhbHVlcyhyZWNvcmQsIG5hbWVzKTtcbiAgcmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLCB2YWx1ZXNdKSwgZW5jb2RlUGFzc2FibGUpfWA7XG59O1xuXG5jb25zdCBkZWNvZGVSZWNvcmQgPSAoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBhc3NlcnQoZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICcoJyk7XG4gIC8qIFNraXAgdGhlIFwiKFwiIGluc2lkZSBgZGVjb2RlQXJyYXlgIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbiAgY29uc3QgdW56aXBwZWRFbnRyaWVzID0gZGVjb2RlQXJyYXkoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgKyAxKTtcbiAgdW56aXBwZWRFbnRyaWVzLmxlbmd0aCA9PT0gMiB8fFxuICAgIEZhaWxgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgW2tleXMsIHZhbHNdID0gdW56aXBwZWRFbnRyaWVzO1xuXG4gIChwYXNzU3R5bGVPZihrZXlzKSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICBwYXNzU3R5bGVPZih2YWxzKSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICBrZXlzLmxlbmd0aCA9PT0gdmFscy5sZW5ndGggJiZcbiAgICBrZXlzLmV2ZXJ5KGtleSA9PiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykpIHx8XG4gICAgRmFpbGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IG1hcEVudHJpZXMgPSBrZXlzLm1hcCgoa2V5LCBpKSA9PiBba2V5LCB2YWxzW2ldXSk7XG4gIGNvbnN0IHJlY29yZCA9IGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG4gIGFzc2VydFJlY29yZChyZWNvcmQsICdkZWNvZGVkIHJlY29yZCcpO1xuICByZXR1cm4gcmVjb3JkO1xufTtcblxuY29uc3QgZW5jb2RlVGFnZ2VkID0gKHRhZ2dlZCwgZW5jb2RlQXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PlxuICBgOiR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtnZXRUYWcodGFnZ2VkKSwgdGFnZ2VkLnBheWxvYWRdKSwgZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZCA9IChlbmNvZGVkLCBkZWNvZGVBcnJheSwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJzonKTtcbiAgLyogU2tpcCB0aGUgXCI6XCIgaW5zaWRlIGBkZWNvZGVBcnJheWAgdG8gYXZvaWQgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy4qL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuICBjb25zdCB0YWdnZWRQYXlsb2FkID0gZGVjb2RlQXJyYXkoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgKyAxKTtcbiAgdGFnZ2VkUGF5bG9hZC5sZW5ndGggPT09IDIgfHxcbiAgICBGYWlsYGV4cGVjdGVkIHRhZyxwYXlsb2FkIHBhaXI6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IFt0YWcsIHBheWxvYWRdID0gdGFnZ2VkUGF5bG9hZDtcbiAgcGFzc1N0eWxlT2YodGFnKSA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVSZW1vdGFibGUgPSAodW5zYWZlRW5jb2RlUmVtb3RhYmxlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVSZW1vdGFibGUgPSAociwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVJlbW90YWJsZShyLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAncicpIHx8XG4gICAgICBGYWlsYFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ1JlbW90YWJsZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVJlbW90YWJsZTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVQcm9taXNlID0gKHVuc2FmZUVuY29kZVByb21pc2UsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSAocCwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVByb21pc2UocCwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJz8nKSB8fFxuICAgICAgRmFpbGBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtlbmNvZGluZ31gO1xuICAgIHZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCAnUHJvbWlzZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVByb21pc2U7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlRXJyb3IgPSAodW5zYWZlRW5jb2RlRXJyb3IsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gKGVyciwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZUVycm9yKGVyciwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJyEnKSB8fFxuICAgICAgRmFpbGBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ0Vycm9yJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlRXJyb3I7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZU9iamVjdCxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVFcnJvcl1cbiAqIEBwcm9wZXJ0eSB7J2xlZ2FjeU9yZGVyZWQnIHwgJ2NvbXBhY3RPcmRlcmVkJ30gW2Zvcm1hdF1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7KHN0cjogc3RyaW5nKSA9PiBzdHJpbmd9IGVuY29kZVN0cmluZ1N1ZmZpeFxuICogQHBhcmFtIHsoYXJyOiB1bmtub3duW10sIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZykgPT4gc3RyaW5nfSBlbmNvZGVBcnJheVxuICogQHBhcmFtIHtSZXF1aXJlZDxFbmNvZGVPcHRpb25zPiAmIHt2ZXJpZnlFbmNvZGluZz86IChlbmNvZGVkOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcpID0+IHZvaWR9fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7KHA6IFBhc3NhYmxlKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IG1ha2VJbm5lckVuY29kZSA9IChlbmNvZGVTdHJpbmdTdWZmaXgsIGVuY29kZUFycmF5LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGU6IHVuc2FmZUVuY29kZVJlbW90YWJsZSxcbiAgICBlbmNvZGVQcm9taXNlOiB1bnNhZmVFbmNvZGVQcm9taXNlLFxuICAgIGVuY29kZUVycm9yOiB1bnNhZmVFbmNvZGVFcnJvcixcbiAgICB2ZXJpZnlFbmNvZGluZyA9ICgpID0+IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW5jb2RlUmVtb3RhYmxlID0gbWFrZUVuY29kZVJlbW90YWJsZShcbiAgICB1bnNhZmVFbmNvZGVSZW1vdGFibGUsXG4gICAgdmVyaWZ5RW5jb2RpbmcsXG4gICk7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSBtYWtlRW5jb2RlUHJvbWlzZSh1bnNhZmVFbmNvZGVQcm9taXNlLCB2ZXJpZnlFbmNvZGluZyk7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gbWFrZUVuY29kZUVycm9yKHVuc2FmZUVuY29kZUVycm9yLCB2ZXJpZnlFbmNvZGluZyk7XG5cbiAgY29uc3QgaW5uZXJFbmNvZGUgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4gICAgICAvKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuICAgICAgLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbiAgICAgIC8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuICAgICAgLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuICAgICAgLyoqL1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4gICAgICAvKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4gICAgICAvKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbiAgICAgIC8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbiAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgIH1cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOiB7XG4gICAgICAgIHJldHVybiAndic7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiAneic7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIHJldHVybiBgcyR7ZW5jb2RlU3RyaW5nU3VmZml4KHBhc3NhYmxlKX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYm9vbGVhbic6IHtcbiAgICAgICAgcmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVJlbW90YWJsZShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVByb21pc2UocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgLyogU3RyaW5ncyBhbmQgc3ltYm9scyBzaGFyZSBlbmNvZGluZyBsb2dpYy4qL1xuICAgICAgICBjb25zdCBuYW1lID0gbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgIHJldHVybiBgeSR7ZW5jb2RlU3RyaW5nU3VmZml4KG5hbWUpfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVBcnJheShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQnl0ZUFycmF5KHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlUmVjb3JkKHBhc3NhYmxlLCBlbmNvZGVBcnJheSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLCBlbmNvZGVBcnJheSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYGEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sbGVjdGlvbiBwYXNzYWJsZWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW5uZXJFbmNvZGU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGVPYmplY3R9IFtkZWNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvcl1cbiAqL1xuXG5jb25zdCBsaWJlcmFsRGVjb2RlcnMgPSAvKiogQHR5cGUge1JlcXVpcmVkPERlY29kZU9wdGlvbnM+fSAqLyAoXG4gIC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHtcbiAgICBkZWNvZGVSZW1vdGFibGU6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZVByb21pc2U6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZUVycm9yOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgfSlcbik7XG5cbi8qKlxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBzdHJpbmd9IGRlY29kZVN0cmluZ1N1ZmZpeFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nLCBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGUsIHNraXA/OiBudW1iZXIpID0+IHVua25vd25bXX0gZGVjb2RlQXJyYXlcbiAqIEBwYXJhbSB7UmVxdWlyZWQ8RGVjb2RlT3B0aW9ucz59IG9wdGlvbnNcbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogc3RyaW5nLCBza2lwPzogbnVtYmVyKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWFrZUlubmVyRGVjb2RlID0gKGRlY29kZVN0cmluZ1N1ZmZpeCwgZGVjb2RlQXJyYXksIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH0gPSBvcHRpb25zO1xuICAvKiogQHR5cGUgeyhlbmNvZGVkOiBzdHJpbmcsIHNraXA/OiBudW1iZXIpID0+IFBhc3NhYmxlfSAqL1xuICBjb25zdCBpbm5lckRlY29kZSA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICAgIHN3aXRjaCAoZW5jb2RlZC5jaGFyQXQoc2tpcCkpIHtcbiAgICAgIGNhc2UgJ3YnOiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY2FzZSAneic6IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2YnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3MnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdiJzoge1xuICAgICAgICBjb25zdCBzdWJzdHJpbmcgPSBnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpO1xuICAgICAgICBpZiAoc3Vic3RyaW5nID09PSAndHJ1ZScpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzdHJpbmcgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBleHBlY3RlZCBlbmNvZGVkIGJvb2xlYW4gdG8gYmUgXCJidHJ1ZVwiIG9yIFwiYmZhbHNlXCI6ICR7c3Vic3RyaW5nfWA7XG4gICAgICB9XG4gICAgICBjYXNlICduJzpcbiAgICAgIGNhc2UgJ3AnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaWdJbnQoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3InOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVSZW1vdGFibGUoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICc/Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUHJvbWlzZShnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVFcnJvcihnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3knOiB7XG4gICAgICAgIC8qIFN0cmluZ3MgYW5kIHN5bWJvbHMgc2hhcmUgZGVjb2RpbmcgbG9naWMuKi9cbiAgICAgICAgY29uc3QgbmFtZSA9IGRlY29kZVN0cmluZ1N1ZmZpeChnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpKTtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1snOlxuICAgICAgY2FzZSAnXic6IHtcbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUeXBlICd1bmtub3duW10nIGlzIG5vdCBQYXNzYWJsZSovXG4gICAgICAgIHJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICcoJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICc6Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW5uZXJEZWNvZGU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhc3NhYmxlS2l0XG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8bWFrZUlubmVyRW5jb2RlPn0gZW5jb2RlUGFzc2FibGVcbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTxtYWtlSW5uZXJEZWNvZGU+fSBkZWNvZGVQYXNzYWJsZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zICYgRGVjb2RlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UGFzc2FibGVLaXR9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUGFzc2FibGVLaXQgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGUgPSAociwgXykgPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyfWAsXG4gICAgZW5jb2RlUHJvbWlzZSA9IChwLCBfKSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwfWAsXG4gICAgZW5jb2RlRXJyb3IgPSAoZXJyLCBfKSA9PiBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWAsXG4gICAgZm9ybWF0ID0gJ2xlZ2FjeU9yZGVyZWQnLFxuXG4gICAgZGVjb2RlUmVtb3RhYmxlID0gKGVuY29kaW5nLCBfKSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gICAgZGVjb2RlUHJvbWlzZSA9IChlbmNvZGluZywgXykgPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YCxcbiAgICBkZWNvZGVFcnJvciA9IChlbmNvZGluZywgXykgPT4gRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gIH0gPSBvcHRpb25zO1xuXG4gIC8qKiBAdHlwZSB7UGFzc2FibGVLaXRbJ2VuY29kZVBhc3NhYmxlJ119ICovXG4gIGxldCBlbmNvZGVQYXNzYWJsZTtcbiAgY29uc3QgZW5jb2RlT3B0aW9ucyA9IHsgZW5jb2RlUmVtb3RhYmxlLCBlbmNvZGVQcm9taXNlLCBlbmNvZGVFcnJvciwgZm9ybWF0IH07XG4gIGlmIChmb3JtYXQgPT09ICdjb21wYWN0T3JkZXJlZCcpIHtcbiAgICBjb25zdCBsaWJlcmFsRGVjb2RlID0gbWFrZUlubmVyRGVjb2RlKFxuICAgICAgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbiAgICAgIGRlY29kZUNvbXBhY3RBcnJheSxcbiAgICAgIGxpYmVyYWxEZWNvZGVycyxcbiAgICApO1xuICAgIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gICAgY29uc3QgdmVyaWZ5RW5jb2RpbmcgPSAoZW5jb2RpbmcsIGxhYmVsKSA9PiB7XG4gICAgICAhZW5jb2RpbmcubWF0Y2gockMwKSB8fFxuICAgICAgICBGYWlsYCR7YihcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgKX0gZW5jb2RpbmcgbXVzdCBub3QgY29udGFpbiBhIEMwIGNvbnRyb2wgY2hhcmFjdGVyOiAke2VuY29kaW5nfWA7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlQ29tcGFjdEFycmF5KGBediAke2VuY29kaW5nfSB2IGAsIGxpYmVyYWxEZWNvZGUpO1xuICAgICAgKGlzQXJyYXkoZGVjb2RlZCkgJiZcbiAgICAgICAgZGVjb2RlZC5sZW5ndGggPT09IDMgJiZcbiAgICAgICAgZGVjb2RlZFswXSA9PT0gbnVsbCAmJlxuICAgICAgICBkZWNvZGVkWzJdID09PSBudWxsKSB8fFxuICAgICAgICBGYWlsYCR7YihsYWJlbCl9IGVuY29kaW5nIG11c3QgYmUgZW1iZWRkYWJsZTogJHtlbmNvZGluZ31gO1xuICAgIH07XG4gICAgY29uc3QgZW5jb2RlQ29tcGFjdCA9IG1ha2VJbm5lckVuY29kZShcbiAgICAgIGVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBlbmNvZGVDb21wYWN0QXJyYXksXG4gICAgICB7IC4uLmVuY29kZU9wdGlvbnMsIHZlcmlmeUVuY29kaW5nIH0sXG4gICAgKTtcbiAgICBlbmNvZGVQYXNzYWJsZSA9IHBhc3NhYmxlID0+IGB+JHtlbmNvZGVDb21wYWN0KHBhc3NhYmxlKX1gO1xuICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2xlZ2FjeU9yZGVyZWQnKSB7XG4gICAgZW5jb2RlUGFzc2FibGUgPSBtYWtlSW5uZXJFbmNvZGUoXG4gICAgICBlbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG4gICAgICBlbmNvZGVMZWdhY3lBcnJheSxcbiAgICAgIGVuY29kZU9wdGlvbnMsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBmb3JtYXQ6ICR7cShmb3JtYXQpfWA7XG4gIH1cblxuICBjb25zdCBkZWNvZGVPcHRpb25zID0geyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH07XG4gIGNvbnN0IGRlY29kZUNvbXBhY3QgPSBtYWtlSW5uZXJEZWNvZGUoXG4gICAgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbiAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgZGVjb2RlT3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZGVjb2RlTGVnYWN5ID0gbWFrZUlubmVyRGVjb2RlKFxuICAgIGRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCxcbiAgICBkZWNvZGVMZWdhY3lBcnJheSxcbiAgICBkZWNvZGVPcHRpb25zLFxuICApO1xuICBjb25zdCBkZWNvZGVQYXNzYWJsZSA9IGVuY29kZWQgPT4ge1xuICAgIC8qIEEgbGVhZGluZyBcIn5cIiBpbmRpY2F0ZXMgdGhlIHYyIGVuY29kaW5nICh3aXRoIGVzY2FwaW5nIGluIHN0cmluZ3MgcmF0aGVyIHRoYW4gYXJyYXlzKS4qL1xuICAgIC8qIFNraXAgaXQgaW5zaWRlIGBkZWNvZGVDb21wYWN0YCB0byBhdm9pZCBzbG93IGBzdWJzdHJpbmdgIGluIFhTLiovXG4gICAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbiAgICBpZiAoZW5jb2RlZC5jaGFyQXQoMCkgPT09ICd+Jykge1xuICAgICAgcmV0dXJuIGRlY29kZUNvbXBhY3QoZW5jb2RlZCwgMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVMZWdhY3koZW5jb2RlZCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IGVuY29kZVBhc3NhYmxlLCBkZWNvZGVQYXNzYWJsZSB9KTtcbn07JGjNj19vbmNlLm1ha2VQYXNzYWJsZUtpdChtYWtlUGFzc2FibGVLaXQpO1xuaGFyZGVuKG1ha2VQYXNzYWJsZUtpdCk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXNzYWJsZUtpdFsnZW5jb2RlUGFzc2FibGUnXX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbmNvZGVQYXNzYWJsZSA9IGVuY29kZU9wdGlvbnMgPT4ge1xuICBjb25zdCB7IGVuY29kZVBhc3NhYmxlIH0gPSBtYWtlUGFzc2FibGVLaXQoZW5jb2RlT3B0aW9ucyk7XG4gIHJldHVybiBlbmNvZGVQYXNzYWJsZTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVQYXNzYWJsZShtYWtlRW5jb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXNzYWJsZUtpdFsnZGVjb2RlUGFzc2FibGUnXX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWNvZGVQYXNzYWJsZSA9IGRlY29kZU9wdGlvbnMgPT4ge1xuICBjb25zdCB7IGRlY29kZVBhc3NhYmxlIH0gPSBtYWtlUGFzc2FibGVLaXQoZGVjb2RlT3B0aW9ucyk7XG4gIHJldHVybiBkZWNvZGVQYXNzYWJsZTtcbn07JGjNj19vbmNlLm1ha2VEZWNvZGVQYXNzYWJsZShtYWtlRGVjb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5cbiAgICAgICBjb25zdCBpc0VuY29kZWRSZW1vdGFibGUgPSBlbmNvZGVkID0+IGVuY29kZWQuY2hhckF0KDApID09PSAncic7JGjNj19vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZSB7UmVjb3JkPFBhc3NTdHlsZSwgc3RyaW5nPn1cbiAqIFRoZSBzaW5nbGUgcHJlZml4IGNoYXJhY3RlcnMgdG8gYmUgdXNlZCBmb3IgZWFjaCBQYXNzU3R5bGUgY2F0ZWdvcnkuXG4gKiBgYmlnaW50YCBpcyBhIHR3by1jaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2UgZWFjaCBvZiB0aG9zZSBjaGFyYWN0ZXJzXG4gKiBpbmRpdmlkdWFsbHkgaXMgYSB2YWxpZCBiaWdpbnQgcHJlZml4IChgbmAgZm9yIFwibmVnYXRpdmVcIiBhbmQgYHBgIGZvclxuICogXCJwb3NpdGl2ZVwiKSwgYW5kIGNvcHlBcnJheSBpcyBhIHR3by1jaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2Ugb25lIGVuY29kaW5nXG4gKiBwcmVmaXhlcyBhcnJheXMgd2l0aCBgW2Agd2hpbGUgdGhlIG90aGVyIHVzZXMgYF5gICh3aGljaCBpcyBwcm9oaWJpdGVkIGZyb21cbiAqIGFwcGVhcmluZyBpbiBhbiBlbmNvZGVkIHN0cmluZykuXG4gKiBUaGUgb3JkZXJpbmcgb2YgdGhlc2UgcHJlZml4ZXMgaXMgdGhlIHNhbWUgYXMgdGhlIHJhbmtPcmRlcmluZyBvZiB0aGVpclxuICogcmVzcGVjdGl2ZSBQYXNzU3R5bGVzLCBhbmQgcmFua09yZGVyLmpzIGltcG9ydHMgdGhlIHRhYmxlIGZvciB0aGlzIHB1cnBvc2UuXG4gKlxuICogSW4gYWRkaXRpb24sIGB8YCBpcyB0aGUgcmVtb3RhYmxlLT5vcmRpbmFsIG1hcHBpbmcgcHJlZml4OlxuICogVGhpcyBpcyBub3QgdXNlZCBpbiBjb3ZlcnMgYnV0IGl0IGlzXG4gKiByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBOb3RlIHRoYXQgdGhlIHByZWZpeCBpcyA+IGFueVxuICogcHJlZml4IHVzZWQgYnkgYW55IGNvdmVyIHNvIHRoYXQgb3JkaW5hbCBtYXBwaW5nIGtleXMgYXJlIGFsd2F5cyBvdXRzaWRlXG4gKiB0aGUgcmFuZ2Ugb2YgdmFsaWQgY29sbGVjdGlvbiBlbnRyeSBrZXlzLlxuICovXG4gICAgICAgY29uc3QgcGFzc1N0eWxlUHJlZml4ZXMgPSB7XG4gIGVycm9yOiAnIScsXG4gIGNvcHlSZWNvcmQ6ICcoJyxcbiAgdGFnZ2VkOiAnOicsXG4gIHByb21pc2U6ICc/JyxcbiAgY29weUFycmF5OiAnW14nLFxuICBieXRlQXJyYXk6ICdhJyxcbiAgYm9vbGVhbjogJ2InLFxuICBudW1iZXI6ICdmJyxcbiAgYmlnaW50OiAnbnAnLFxuICByZW1vdGFibGU6ICdyJyxcbiAgc3RyaW5nOiAncycsXG4gIG51bGw6ICd2JyxcbiAgc3ltYm9sOiAneScsXG4gIC8qIEJlY2F1c2UgQXJyYXkucHJvdG90eXBlLnNvcnQgcHV0cyB1bmRlZmluZWQgdmFsdWVzIGF0IHRoZSBlbmQgd2l0aG91dCovXG4gIC8qIHBhc3NpbmcgdGhlbSB0byBhIGNvbXBhcmlzb24gZnVuY3Rpb24sIHVuZGVmaW5lZCBNVVNUIGJlIHRoZSBsYXN0Ki9cbiAgLyogY2F0ZWdvcnkuKi9cbiAgdW5kZWZpbmVkOiAneicsXG59OyRozY9fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsIG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVByZWZpeGVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VQYXNzYWJsZUtpdCI6WyJtYWtlUGFzc2FibGVLaXQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1cJzuhdEAAAXRAAAKwAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGlzUHJpbWl0aXZlLGdldFRhZyxhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFgsRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc2FibGUsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZScgKi9cbi8qKiBAaW1wb3J0IHtFbmNvZGluZywgRW5jb2RpbmdVbmlvbn0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgZGVmaW5lUHJvcGVydGllcyxcbiAgaXMsXG4gIGVudHJpZXMsXG4gIGZyb21FbnRyaWVzLFxuICBmcmVlemUsXG4gIGhhc093bixcbn0gPSBPYmplY3Q7XG5cbi8qKlxuICogU3BlY2lhbCBwcm9wZXJ0eSBuYW1lIHRoYXQgaW5kaWNhdGVzIGFuIGVuY29kaW5nIHRoYXQgbmVlZHMgc3BlY2lhbFxuICogZGVjb2RpbmcuXG4gKi9cbmNvbnN0IFFDTEFTUyA9ICdAcWNsYXNzJzskaM2PX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nICYgb2JqZWN0fSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7ZW5jb2RlZCBpcyBFbmNvZGluZ1VuaW9ufVxuICovXG5jb25zdCBoYXNRQ2xhc3MgPSBlbmNvZGVkID0+IGhhc093bihlbmNvZGVkLCBRQ0xBU1MpO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBxY2xhc3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzID0gKGVuY29kZWQsIHFjbGFzcykgPT5cbiAgIWlzUHJpbWl0aXZlKGVuY29kZWQpICYmXG4gICFpc0FycmF5KGVuY29kZWQpICYmXG4gIGhhc1FDbGFzcyhlbmNvZGVkKSAmJlxuICBlbmNvZGVkW1FDTEFTU10gPT09IHFjbGFzcztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb0NhcERhdGFPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGVPYmplY3QsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlRXJyb3JUb0NhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9IHJlbSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IHByb20gPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEgPSBlcnIgPT4gRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvQ2FwRGF0YU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IEVuY29kaW5nfVxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVRvQ2FwRGF0YSA9IChlbmNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG4gICAgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuICAgIGVuY29kZUVycm9yVG9DYXBEYXRhID0gZG9udEVuY29kZUVycm9yVG9DYXBEYXRhLFxuICB9ID0gZW5jb2RlT3B0aW9ucztcblxuICAvKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHthbnl9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb0NhcERhdGFgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9DYXBEYXRhYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuICBjb25zdCBlbmNvZGVUb0NhcERhdGFSZWN1ciA9IHBhc3NhYmxlID0+IHtcbiAgICAvKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbiAgICAvKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgYXMgW1FDTEFTU10gY29tcG9zaXRlcy4qL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAndW5kZWZpbmVkJyB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICAvKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFzc2FibGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdOYU4nIH07XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdJbmZpbml0eScgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICctSW5maW5pdHknIH07XG4gICAgICAgIH1cbiAgICAgICAgLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xuICAgICAgICByZXR1cm4gaXMocGFzc2FibGUsIC0wKSA/IDAgOiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ2JpZ2ludCcsXG4gICAgICAgICAgZGlnaXRzOiBTdHJpbmcocGFzc2FibGUpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAnc3ltYm9sJyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgaWYgKGhhc093bihwYXNzYWJsZSwgUUNMQVNTKSkge1xuICAgICAgICAgIC8qIEhpbGJlcnQgaG90ZWwqL1xuICAgICAgICAgIGNvbnN0IHsgW1FDTEFTU106IHFjbGFzc1ZhbHVlLCAuLi5yZXN0IH0gPSBwYXNzYWJsZTtcbiAgICAgICAgICAvKiogQHR5cGUge0VuY29kaW5nfSAqL1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIFtRQ0xBU1NdOiAnaGlsYmVydCcsXG4gICAgICAgICAgICBvcmlnaW5hbDogZW5jb2RlVG9DYXBEYXRhUmVjdXIocWNsYXNzVmFsdWUpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKG93bktleXMocmVzdCkubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIC8qIFdlIGhhcmRlbiB0aGUgZW50aXJlIGNhcERhdGEgZW5jb2RpbmcgYmVmb3JlIHdlIHJldHVybiBpdC4qL1xuICAgICAgICAgICAgLyogYGVuY29kZVRvQ2FwRGF0YWAgcmVxdWlyZXMgdGhhdCBpdHMgaW5wdXQgYmUgUGFzc2FibGUsIGFuZCovXG4gICAgICAgICAgICAvKiB0aGVyZWZvcmUgaGFyZGVuZWQuKi9cbiAgICAgICAgICAgIC8qIFRoZSBgZnJlZXplYCBoZXJlIGlzIG5lZWRlZCBhbnl3YXksIGJlY2F1c2UgdGhlIGByZXN0YCBpcyovXG4gICAgICAgICAgICAvKiBmcmVzaGx5IGNvbnN0cnVjdGVkIGJ5IHRoZSBgLi4uYCBhYm92ZSwgYW5kIHdlJ3JlIHVzaW5nIGl0Ki9cbiAgICAgICAgICAgIC8qIGFzIGltcHV0IGluIGFub3RoZXIgY2FsbCB0byBgZW5jb2RlVG9DYXBEYXRhYC4qL1xuICAgICAgICAgICAgcmVzdWx0LnJlc3QgPSBlbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4gICAgICAgIC8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4gICAgICAgIC8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG4gICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoXG4gICAgICAgICAgbmFtZXMubWFwKG5hbWUgPT4gW25hbWUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgLyogVE9ETyBpbXBsZW1lbnQqL1xuICAgICAgICB0aHJvdyBGYWlsYG1hcnNhbCBvZiBieXRlQXJyYXkgbm90IHlldCBpbXBsZW1lbnRlZDogJHtwYXNzYWJsZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAndGFnZ2VkJyxcbiAgICAgICAgICB0YWc6IGdldFRhZyhwYXNzYWJsZSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9DYXBEYXRhUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdzbG90JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICAvKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICBRQ0xBU1MsXG4gICAgICAgICl9ICR7cSgnc2xvdCcpfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnc2xvdCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICBRQ0xBU1MsXG4gICAgICAgICAgJ3Nsb3QnLFxuICAgICAgICApfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdlcnJvcicpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgWGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGVuY29kZVRvQ2FwRGF0YSA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbiAgICAgIC8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4gICAgICAvKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuICAgICAgLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4gICAgICAvKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4gICAgICAvKiovXG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbiAgICAgIC8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbiAgICAgIC8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuICAgICAgLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuICAgICAgcmV0dXJuIGhhcmRlbihlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YSk7XG59OyRozY9fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlT2JqZWN0KX0gW2RlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlT2JqZWN0KX0gW2RlY29kZVByb21pc2VGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbUNhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhID0gc2xvdEVuY29kaW5nID0+XG4gIEZhaWxgcmVtb3RhYmxlIG9yIHByb21pc2UgdW5leHBlY3RlZDogJHtzbG90RW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhID0gZXJyb3JFbmNvZGluZyA9PlxuICBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2hcbiAqIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvblxuICogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmVcbiAqIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuXG4gKlxuICogVGhpcyBzZWVtcyBsaWtlIHRoZSBiZXN0IHN0YXJ0aW5nIHBvaW50IHRvIGluY3JlbWVudGFsbHkgZXZvbHZlIHRvIGFuXG4gKiBBUEkgd2hlcmUgdGhlc2UgY2FuIHJlbGlhYmx5IGRpZmZlci5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzRcbiAqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgPSBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhLFxuICB9ID0gZGVjb2RlT3B0aW9ucztcblxuICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9PT0gZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIHx8XG4gICAgRmFpbGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEsXG4gICAgKX0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuICAvKipcbiAqIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbWF5IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBganNvbkVuY29kZWRgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb0NhcERhdGFgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21DYXBEYXRhYCBjYW5ub3QgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21DYXBEYXRhYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGpzb25FbmNvZGVkIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuICBjb25zdCBkZWNvZGVGcm9tQ2FwRGF0YSA9IGpzb25FbmNvZGVkID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUoanNvbkVuY29kZWQpKSB7XG4gICAgICAvKiBwcmltaXRpdmVzIHBhc3MgdGhyb3VnaCovXG4gICAgICByZXR1cm4ganNvbkVuY29kZWQ7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KGpzb25FbmNvZGVkKSkge1xuICAgICAgcmV0dXJuIGpzb25FbmNvZGVkLm1hcChlbmNvZGVkVmFsID0+IGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpKTtcbiAgICB9IGVsc2UgaWYgKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpIHtcbiAgICAgIGNvbnN0IHFjbGFzcyA9IGpzb25FbmNvZGVkW1FDTEFTU107XG4gICAgICB0eXBlb2YgcWNsYXNzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBGYWlsYGludmFsaWQgJHtxKFFDTEFTUyl9IHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbiAgICAgIHN3aXRjaCAocWNsYXNzKSB7XG4gICAgICAgIC8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ05hTic6IHtcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0luZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICctSW5maW5pdHknOiB7XG4gICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIHR5cGVvZiBkaWdpdHMgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbiAgICAgICAgICByZXR1cm4gQmlnSW50KGRpZ2l0cyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIC8qIERlcHJlY2F0ZWQgcWNsYXNzLiBUT0RPIG1ha2UgY29uZGl0aW9uYWwqL1xuICAgICAgICAgIC8qIG9uIGVudmlyb25tZW50IHZhcmlhYmxlLiBFdmVudHVhbGx5IHJlbW92ZSwgYnV0IGFmdGVyIGNvbmZpZGVudCovXG4gICAgICAgICAgLyogdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBzdXBwb3J0ZWQgc2VuZGVycy4qL1xuICAgICAgICAgIC8qKi9cbiAgICAgICAgICByZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIHJldHVybiBtYWtlVGFnZ2VkKHRhZywgZGVjb2RlRnJvbUNhcERhdGEocGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Nsb3QnOiB7XG4gICAgICAgICAgLyogU2VlIG5vdGUgYWJvdmUgYWJvdXQgaG93IHRoZSBjdXJyZW50IGVuY29kaW5nIGNhbm5vdCByZWxpYWJseSovXG4gICAgICAgICAgLyogZGlzdGluZ3Vpc2ggd2hpY2ggd2Ugc2hvdWxkIGNhbGwsIHNvIGluIHRoZSBub24tZGVmYXVsdCBjYXNlKi9cbiAgICAgICAgICAvKiBib3RoIG11c3QgYmUgdGhlIHNhbWUgYW5kIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHdlIGNhbGwuKi9cbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG4gICAgICAgICAgICBqc29uRW5jb2RlZCxcbiAgICAgICAgICAgIGRlY29kZUZyb21DYXBEYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLyogQkVXQVJFOiBjYXBkYXRhIGRvZXMgbm90IGNoZWNrIHRoYXQgYGRlY29kZWRgIGlzKi9cbiAgICAgICAgICAvKiBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUsIHNpbmNlIHRoYXQgd291bGQgYnJlYWsgc29tZSovXG4gICAgICAgICAgLyogY2FwZGF0YSBjbGllbnRzLiBXZSBhcmUgZGVwcmVjYXRpbmcgY2FwZGF0YSwgYW5kIHRoZXNlIGNsaWVudHMqL1xuICAgICAgICAgIC8qIHdpbGwgbmVlZCB0byB1cGRhdGUgYmVmb3JlIHN3aXRjaGluZyB0byBzbWFsbGNhcHMuKi9cbiAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbiAgICAgICAgICAgIGpzb25FbmNvZGVkLFxuICAgICAgICAgICAgZGVjb2RlRnJvbUNhcERhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlT2YoZGVjb2RlZCkgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICBoYXNPd24oanNvbkVuY29kZWQsICdvcmlnaW5hbCcpIHx8XG4gICAgICAgICAgICBGYWlsYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4gICAgICAgICAgLyogRG9uJ3QgaGFyZGVuIHNpbmNlIHdlJ3JlIG5vdCBkb25lIG11dGF0aW5nIGl0Ki9cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IFtRQ0xBU1NdOiBkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCkgfTtcbiAgICAgICAgICBpZiAoaGFzT3duKGpzb25FbmNvZGVkLCAncmVzdCcpKSB7XG4gICAgICAgICAgICBjb25zdCBpc05vbkVtcHR5T2JqZWN0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIHJlc3QgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgIHJlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPj0gMTtcbiAgICAgICAgICAgIGlmICghaXNOb25FbXB0eU9iamVjdCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdE9iaiA9IGRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuICAgICAgICAgICAgLyogVE9ETyByZWFsbHkgc2hvdWxkIGFzc2VydCB0aGF0IGBwYXNzU3R5bGVPZihyZXN0KWAgaXMqL1xuICAgICAgICAgICAgLyogYCdjb3B5UmVjb3JkJ2AgYnV0IHdlJ2QgaGF2ZSB0byBoYXJkZW4gaXQgYW5kIGl0IGlzIHRvbyovXG4gICAgICAgICAgICAvKiBlYXJseSB0byBkbyB0aGF0LiovXG4gICAgICAgICAgICAhaGFzT3duKHJlc3RPYmosIFFDTEFTUykgfHxcbiAgICAgICAgICAgICAgRmFpbGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUaGlzIGlzIHRoZSBlcnJvciBjYXNlIHdlJ3JlIHRlc3RpbmcgZm9yKi9cbiAgICAgICAgY2FzZSAnaWJpZCc6IHtcbiAgICAgICAgICB0aHJvdyBGYWlsYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxuICAgICAgICAgICAgcWNsYXNzLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICBYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcbiAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydCh0eXBlb2YganNvbkVuY29kZWQgPT09ICdvYmplY3QnICYmIGpzb25FbmNvZGVkICE9PSBudWxsKTtcbiAgICAgIGNvbnN0IGRlY29kZUVudHJ5ID0gKFtuYW1lLCBlbmNvZGVkVmFsXSkgPT4ge1xuICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBGYWlsYFByb3BlcnR5ICR7cShuYW1lKX0gb2YgJHtqc29uRW5jb2RlZH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgIHJldHVybiBbbmFtZSwgZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGRlY29kZWRFbnRyaWVzID0gZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbiAgICAgIHJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbn07JGjNj19vbmNlLm1ha2VEZWNvZGVGcm9tQ2FwRGF0YShtYWtlRGVjb2RlRnJvbUNhcERhdGEpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAANU1+O9EUAAPRFAAAtAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsZ2V0VGFnLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc2FibGUsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZScgKi9cbi8qIEZJWE1FIGRlZmluZSBhY3R1YWwgdHlwZXMqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nICovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBpcywgZW50cmllcywgZnJvbUVudHJpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuXG5jb25zdCBCQU5HID0gJyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIID0gJy0nLmNoYXJDb2RlQXQoMCk7XG5cbi8qKlxuICogQW4gYGVuY29kZVRvU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhIHBhc3NhYmxlIGFuZCByZXR1cm5zIGFcbiAqIEpTT04tcmVwcmVzZW50YWJsZSBvYmplY3QgKGkuZS4sIHJvdW5kLXRyaXBwaW5nIGl0IHRocm91Z2hcbiAqIGBKU09OLnN0cmluZ2lmeWAgYW5kIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlcGxhY2VycyBvciByZXZpdmVyc1xuICogcmV0dXJucyBhbiBlcXVpdmFsZW50IHN0cnVjdHVyZSBleGNlcHQgZm9yIG9iamVjdCBpZGVudGl0eSkuXG4gKiBXZSBjYWxsIHRoaXMgcmVwcmVzZW50YXRpb24gYSBTbWFsbGNhcHMgRW5jb2RpbmcuXG4gKlxuICogQSBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYXMgYXJndW1lbnQgd2hhdCBpdFxuICogKmFzc3VtZXMqIGlzIHRoZSByZXN1bHQgb2YgYSBwbGFpbiBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXNvbHZlci4gSXQgdGhlblxuICogbXVzdCB2YWxpZGF0ZSB0aGF0IGl0IGlzIGEgdmFsaWQgU21hbGxjYXBzIEVuY29kaW5nLCBhbmQgaWYgaXQgaXMsXG4gKiByZXR1cm4gYSBjb3JyZXNwb25kaW5nIHBhc3NhYmxlLlxuICpcbiAqIFNtYWxsY2FwcyBjb25zaWRlcnMgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiBgIWAgKGFzY2lpIGNvZGUgMzMsIEJBTkcpXG4gKiBhbmQgYC1gIChhc2NpaSBjb2RlIDQ1LCBEQVNIKSB0byBiZSBzcGVjaWFsIHByZWZpeGVzIGFsbG93aW5nXG4gKiByZXByZXNlbnRhdGlvbiBvZiBKU09OLWluY29tcGF0aWJsZSBkYXRhIHVzaW5nIHN0cmluZ3MuXG4gKiBUaGVzZSBjaGFyYWN0ZXJzLCBpbiBvcmRlciwgYXJlIGAhXCIjJCUmJygpKissLWBcbiAqIE9mIHRoZXNlLCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgKiBgIWAgLSBlc2NhcGVkIHN0cmluZ1xuICogICogYCtgIC0gbm9uLW5lZ2F0aXZlIGJpZ2ludFxuICogICogYC1gIC0gbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgI2AgLSBtYW5pZmVzdCBjb25zdGFudFxuICogICogYCVgIC0gc3ltYm9sXG4gKiAgKiBgJGAgLSByZW1vdGFibGVcbiAqICAqIGAmYCAtIHByb21pc2VcbiAqXG4gKiBBbGwgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIChgXCInKCkqLGApIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cbiAqXG4gKiBUaGUgbWFuaWZlc3QgY29uc3RhbnRzIHRoYXQgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIGZvciB2YWx1ZXM6XG4gKiAgKiBgI3VuZGVmaW5lZGBcbiAqICAqIGAjTmFOYFxuICogICogYCNJbmZpbml0eWBcbiAqICAqIGAjLUluZmluaXR5YFxuICpcbiAqIGFuZCBmb3IgcHJvcGVydHkgbmFtZXMgYW5hbG9nb3VzIHRvIGNhcGRhdGEgQHFjbGFzczpcbiAqICAqIGAjdGFnYFxuICogICogYCNlcnJvcmBcbiAqXG4gKiBBbGwgb3RoZXIgZW5jb2RlZCBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGAjYCBhcmUgcmVzZXJ2ZWQgZm9yXG4gKiBmdXR1cmUgdXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkU3RyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc3RhcnRzU3BlY2lhbCA9IGVuY29kZWRTdHIgPT4ge1xuICBpZiAoZW5jb2RlZFN0ciA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyogY2hhckNvZGVBdCgwKSBhbmQgbnVtYmVyIGNvbXBhcmUgaXMgYSBiaXQgZmFzdGVyLiovXG4gIGNvbnN0IGNvZGUgPSBlbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB5b2RhKi9cbiAgcmV0dXJuIEJBTkcgPD0gY29kZSAmJiBjb2RlIDw9IERBU0g7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlT2JqZWN0LFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IHJlbSA9PlxuICBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gcHJvbSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzID0gZXJyID0+XG4gIEZhaWxgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7cShlcnIpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogZW5jb2RlT3B0aW9ucyBpcyBhY3R1YWxseSBvcHRpb25hbCwgYnV0IG5vdCBtYXJrZWQgYXMgc3VjaCB0byB3b3JrIGFyb3VuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDI4NlxuICpcbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ31cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9IChlbmNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuICAgIGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG4gICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzLFxuICB9ID0gZW5jb2RlT3B0aW9ucztcblxuICBjb25zdCBhc3NlcnRFbmNvZGVkRXJyb3IgPSBlbmNvZGluZyA9PiB7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ29iamVjdCcgJiYgaGFzT3duKGVuY29kaW5nLCAnI2Vycm9yJykpIHx8XG4gICAgICBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKFxuICAgICAgICBlbmNvZGluZyxcbiAgICAgICl9YDtcbiAgICAvKiBBc3NlcnQgdGhhdCB0aGUgI2Vycm9yIHByb3BlcnR5IGRlY29kZXMgdG8gYSBzdHJpbmcuKi9cbiAgICBjb25zdCBtZXNzYWdlID0gZW5jb2RpbmdbJyNlcnJvciddO1xuICAgICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICghc3RhcnRzU3BlY2lhbChtZXNzYWdlKSB8fCBtZXNzYWdlLmNoYXJBdCgwKSA9PT0gJyEnKSkgfHxcbiAgICAgIEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gIH07XG5cbiAgLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7YW55fSBwYXNzYWJsZVxuICogQHJldHVybnMge1NtYWxsY2Fwc0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9TbWFsbGNhcHNgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9TbWFsbGNhcHNgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG4gIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4gICAgLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGludG8gc21hbGxjYXBzIHN0cmluZ3MuKi9cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6IHtcbiAgICAgICAgLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIGlmIChzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSkge1xuICAgICAgICAgIC8qIFN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGEgc3BlY2lhbCBjaGFyIGFyZSBxdW90ZWQgd2l0aCBgIWAuKi9cbiAgICAgICAgICAvKiBTaW5jZSBgIWAgaXMgaXRzZWxmIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIHRoaXMgdHJpdmlhbGx5IGRvZXMqL1xuICAgICAgICAgIC8qIHRoZSBIaWxiZXJ0IGhvdGVsLiBBbHNvLCBzaW5jZSB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSovXG4gICAgICAgICAgLyogYSBjb250aW51b3VzIHN1YnJhbmdlIG9mIGFzY2lpLCB0aGlzIHF1b3RpbmcgaXMgc29ydC1vcmRlciovXG4gICAgICAgICAgLyogcHJlc2VydmluZy4qL1xuICAgICAgICAgIHJldHVybiBgISR7cGFzc2FibGV9YDtcbiAgICAgICAgfVxuICAgICAgICAvKiBBbGwgb3RoZXIgc3RyaW5ncyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG4gICAgICAgIHJldHVybiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgcmV0dXJuICcjdW5kZWZpbmVkJztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSkge1xuICAgICAgICAgIHJldHVybiAnI05hTic7XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuICcjSW5maW5pdHknO1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gJyMtSW5maW5pdHknO1xuICAgICAgICB9XG4gICAgICAgIC8qIFBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGVsc2UsIHJlcGxhY2luZyAtMCB3aXRoIDAuKi9cbiAgICAgICAgcmV0dXJuIGlzKHBhc3NhYmxlLCAtMCkgPyAwIDogcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIGNvbnN0IHN0ciA9IFN0cmluZyhwYXNzYWJsZSk7XG4gICAgICAgIHJldHVybiAvKiogQHR5cGUge2JpZ2ludH0gKi8gKHBhc3NhYmxlKSA8IDBuID8gc3RyIDogYCske3N0cn1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSkpO1xuICAgICAgICByZXR1cm4gYCUke25hbWV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIC8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4gICAgICAgIC8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4gICAgICAgIC8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG4gICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoXG4gICAgICAgICAgbmFtZXMubWFwKG5hbWUgPT4gW1xuICAgICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbiAgICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pLFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgICAvKiBUT0RPIGltcGxlbWVudCovXG4gICAgICAgIHRocm93IEZhaWxgbWFyc2FsIG9mIGJ5dGVBcnJheSBub3QgeWV0IGltcGxlbWVudGVkOiAke3Bhc3NhYmxlfWA7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgJyN0YWcnOiBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKGdldFRhZyhwYXNzYWJsZSkpLFxuICAgICAgICAgIHBheWxvYWQ6IGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzKFxuICAgICAgICAgIHBhc3NhYmxlLFxuICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyAmJiByZXN1bHQuY2hhckF0KDApID09PSAnJCcpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PT0gJyYnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgICAgYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb1NtYWxsY2FwcyA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbiAgICAgIC8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4gICAgICAvKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuICAgICAgLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4gICAgICAvKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4gICAgICAvKiovXG4gICAgICAvKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbiAgICAgIC8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbiAgICAgIC8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuICAgICAgLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuICAgICAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSxcbiAgICAgICk7XG4gICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlT2JqZWN0fSBbZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbVNtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IFNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gKGRlY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuICAgIGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzID0gZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuICAgIGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyA9IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHMsXG4gIH0gPSBkZWNvZGVPcHRpb25zO1xuXG4gIC8qKlxuICogYGRlY29kZUZyb21TbWFsbGNhcHNgIG1heSByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGVuY29kaW5nYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9TbWFsbGNhcHNgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21TbWFsbGNhcHNgIGNhbm5vdCByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge1NtYWxsY2Fwc0VuY29kaW5nfSBlbmNvZGluZyBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbiAgY29uc3QgZGVjb2RlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+IHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBlbmNvZGluZykge1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgaWYgKCFzdGFydHNTcGVjaWFsKGVuY29kaW5nKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjID0gZW5jb2RpbmcuY2hhckF0KDApO1xuICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICBjYXNlICchJzoge1xuICAgICAgICAgICAgLyogdW4taGlsYmVydC1pZnkgdGhlIHN0cmluZyovXG4gICAgICAgICAgICByZXR1cm4gZW5jb2Rpbmcuc2xpY2UoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyUnOiB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kaW5nLnNsaWNlKDEpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnIyc6IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgICAgICAgY2FzZSAnI3VuZGVmaW5lZCc6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJyNOYU4nOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjSW5maW5pdHknOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJyMtSW5maW5pdHknOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICAgICAgICBYYHVua25vd24gY29uc3RhbnQgXCIke3EoZW5jb2RpbmcpfVwiYCxcbiAgICAgICAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJysnOlxuICAgICAgICAgIGNhc2UgJy0nOiB7XG4gICAgICAgICAgICByZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJCc6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG4gICAgICAgICAgICAgIGVuY29kaW5nLFxuICAgICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8qIEB0cy1pZ25vcmUgWFhYIFNtYWxsQ2Fwc0VuY29kaW5nKi9cbiAgICAgICAgICAgIGlmIChwYXNzU3R5bGVPZihyZXN1bHQpICE9PSAncmVtb3RhYmxlJykge1xuICAgICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyYnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyhcbiAgICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKHJlc3VsdCkgIT09ICdwcm9taXNlJykge1xuICAgICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBTcGVjaWFsIGNoYXIgJHtxKFxuICAgICAgICAgICAgICBjLFxuICAgICAgICAgICAgKX0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgICAgaWYgKGVuY29kaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXJyYXkoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nLm1hcCh2YWwgPT4gZGVjb2RlRnJvbVNtYWxsY2Fwcyh2YWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd24oZW5jb2RpbmcsICcjdGFnJykpIHtcbiAgICAgICAgICBjb25zdCB7ICcjdGFnJzogdGFnLCBwYXlsb2FkLCAuLi5yZXN0IH0gPSBlbmNvZGluZztcbiAgICAgICAgICB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBGYWlsYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQoXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duKGVuY29kaW5nLCAnI2Vycm9yJykpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG4gICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwYXNzU3R5bGVPZihyZXN1bHQpID09PSAnZXJyb3InIHx8XG4gICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke3Jlc3VsdH1gO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNvZGVFbnRyeSA9IChbZW5jb2RlZE5hbWUsIGVuY29kZWRWYWxdKSA9PiB7XG4gICAgICAgICAgdHlwZW9mIGVuY29kZWROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBQcm9wZXJ0eSBuYW1lICR7cShcbiAgICAgICAgICAgICAgZW5jb2RlZE5hbWUsXG4gICAgICAgICAgICApfSBvZiAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICBlbmNvZGVkTmFtZS5jaGFyQXQoMCkgIT09ICcjJyB8fFxuICAgICAgICAgICAgRmFpbGBVbnJlY29nbml6ZWQgcmVjb3JkIHR5cGUgJHtxKGVuY29kZWROYW1lKX06ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICBjb25zdCBuYW1lID0gZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkTmFtZSk7XG4gICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYERlY29kZWQgcHJvcGVydHkgbmFtZSAke25hbWV9IGZyb20gJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgcmV0dXJuIFtuYW1lLCBkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWRWYWwpXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZGVjb2RlZEVudHJpZXMgPSBlbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICBYYGludGVybmFsOiB1bnJlY29nbml6ZWQgSlNPTiB0eXBlb2YgJHtxKFxuICAgICAgICAgICAgdHlwZW9mIGVuY29kaW5nLFxuICAgICAgICAgICl9OiAke2VuY29kaW5nfWAsXG4gICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQnQV6b5CAAC+QgAAKgAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiIsInBhc3NhYmxlQXNKdXN0aW4iLCJxcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsWCxGYWlsLE5hdCxnZXRFcnJvckNvbnN0cnVjdG9yLGlzUHJpbWl0aXZlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsUUNMQVNTLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLFskaM2PX2EgPT4gKFFDTEFTUyA9ICRozY9fYSldXV1dLFtcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1N0cmluZ2FibGVQYXlsb2FkfSBmcm9tICdzZXMnO1xuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7RW5jb2Rpbmd9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IHN0cmluZ2lmeTogcXVvdGUgfSA9IEpTT047XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5kZW50ZXJcbiAqIEBwcm9wZXJ0eSB7KG9wZW5CcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gb3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7KHRva2VuOiBzdHJpbmcpID0+IG51bWJlcn0gbmV4dFxuICogQHByb3BlcnR5IHsoY2xvc2VCcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gY2xvc2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBkb25lXG4gKi9cblxuLyoqXG4gKiBHZW5lcm91cyB3aGl0ZXNwYWNlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyID0gKCkgPT4ge1xuICBjb25zdCBzdHJpbmdzID0gW107XG4gIGxldCBsZXZlbCA9IDA7XG4gIGxldCBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgY29uc3QgbGluZSA9ICgpID0+IHtcbiAgICBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgICByZXR1cm4gc3RyaW5ncy5wdXNoKCdcXG4nLCAnICAnLnJlcGVhdChsZXZlbCkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBvcGVuOiBvcGVuQnJhY2tldCA9PiB7XG4gICAgICBsZXZlbCArPSAxO1xuICAgICAgaWYgKG5lZWRTcGFjZSkge1xuICAgICAgICBzdHJpbmdzLnB1c2goJyAnKTtcbiAgICAgIH1cbiAgICAgIG5lZWRTcGFjZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gICAgfSxcbiAgICBsaW5lLFxuICAgIG5leHQ6IHRva2VuID0+IHtcbiAgICAgIGlmIChuZWVkU3BhY2UgJiYgdG9rZW4gIT09ICcsJyAmJiB0b2tlbiAhPT0gJyknKSB7XG4gICAgICAgIHN0cmluZ3MucHVzaCgnICcpO1xuICAgICAgfVxuICAgICAgbmVlZFNwYWNlID0gdHJ1ZTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuICAgIH0sXG4gICAgY2xvc2U6IGNsb3NlQnJhY2tldCA9PiB7XG4gICAgICBhc3NlcnQobGV2ZWwgPj0gMSk7XG4gICAgICBsZXZlbCAtPSAxO1xuICAgICAgbGluZSgpO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuICAgIH0sXG4gICAgZG9uZTogKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKGxldmVsLCAwKTtcbiAgICAgIHJldHVybiBzdHJpbmdzLmpvaW4oJycpO1xuICAgIH0sXG4gIH0pO1xufTtcblxuLyoqXG4gKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Ygb25lIHRva2VuIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlclxuICogb2YgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGlzIHBhdHRlcm4sIHRoZW4gdGhlIHR3byB0b2tlbnMgbXVzdCBiZVxuICogc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgdG8gcHJlc2VydmUgdGhlaXIgbWVhbmluZy4gT3RoZXJ3aXNlIHRoZVxuICogd2hpdGVzcGFjZSBpbiB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBUaGUgYDwhYCBhbmQgYC0+YCBjYXNlcyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGZvcm1hdGlvbiBvZiBhblxuICogaHRtbC1saWtlIGNvbW1lbnQuIEkgZG9uJ3QgdGhpbmsgdGhlIGRvdWJsZSBhbmdsZSBicmFja2V0cyBhcmUgYWN0dWFsbHlcbiAqIG5lZWRlZCBidXQgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgaXQgZW5vdWdoIHRvIHJlbW92ZSB0aGVtLlxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybiA9IC9eKD86XFx3XFx3fDw8fD4+fFxcK1xcK3wtLXw8IXwtPikkLztcblxuLyoqXG4gKiBNaW5pbXVtIHdoaXRlc3BhY2UgbmVlZGVkIHRvIHByZXNldmUgbWVhbmluZy5cbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyID0gKCkgPT4ge1xuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBzdHJpbmdzID0gW107XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG4gICAgbGluZTogKCkgPT4gc3RyaW5ncy5sZW5ndGgsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMgLS0gZXJyb3IqL1xuICAgICAgICBpZiAobGFzdC5sZW5ndGggPj0gMSAmJiB0b2tlbi5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIGNvbnN0IHBhaXIgPSBgJHtsYXN0W2xhc3QubGVuZ3RoIC0gMV19JHt0b2tlblswXX1gO1xuICAgICAgICAgIGlmIChiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKSB7XG4gICAgICAgICAgICBzdHJpbmdzLnB1c2goJyAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuICAgIH0sXG4gICAgY2xvc2U6IGNsb3NlQnJhY2tldCA9PiB7XG4gICAgICBpZiAoc3RyaW5ncy5sZW5ndGggPj0gMSAmJiBzdHJpbmdzW3N0cmluZ3MubGVuZ3RoIC0gMV0gPT09ICcsJykge1xuICAgICAgICBzdHJpbmdzLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuICAgIH0sXG4gICAgZG9uZTogKCkgPT4gc3RyaW5ncy5qb2luKCcnKSxcbiAgfSk7XG59O1xuXG5jb25zdCBpZGVudFBhdHRlcm4gPSAvXlthLXpBLVpdXFx3KiQvO1xuaGFyZGVuKGlkZW50UGF0dGVybik7XG5jb25zdCBBdEF0UHJlZml4UGF0dGVybiA9IC9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGRJbmRlbnRcbiAqIEBwYXJhbSB7YW55W119IFtzbG90c11cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZVRvSnVzdGluID0gKGVuY29kaW5nLCBzaG91bGRJbmRlbnQgPSBmYWxzZSwgc2xvdHMgPSBbXSkgPT4ge1xuICAvKipcbiAqIFRoZSBmaXJzdCBwYXNzIGRvZXMgc29tZSBpbnB1dCB2YWxpZGF0aW9uLlxuICogSXRzIGNvbnRyb2wgZmxvdyBzaG91bGQgbWlycm9yIGByZWN1cmAgYXMgY2xvc2VseSBhcyBwb3NzaWJsZVxuICogYW5kIHRoZSB0d28gc2hvdWxkIGJlIG1haW50YWluZWQgdG9nZXRoZXIuIFRoZXkgbXVzdCB2aXNpdCBldmVyeXRoaW5nXG4gKiBpbiB0aGUgc2FtZSBvcmRlci5cbiAqXG4gKiBUT0RPIG5vdyB0aGF0IGliaWRzIGFyZSBnb25lLCB3ZSBzaG91bGQgZm9sZCB0aGlzIGJhY2sgdG9nZXRoZXIgaW50b1xuICogb25lIHZhbGlkYXRpbmcgcGFzcy5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuICBjb25zdCBwcmVwYXJlID0gcmF3VHJlZSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKHJhd1RyZWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuICAgIGFzc2VydC50eXBlb2YocmF3VHJlZSwgJ29iamVjdCcpO1xuICAgIGFzc2VydChyYXdUcmVlICE9PSBudWxsKTtcbiAgICBpZiAoUUNMQVNTIGluIHJhd1RyZWUpIHtcbiAgICAgIGNvbnN0IHFjbGFzcyA9IHJhd1RyZWVbUUNMQVNTXTtcbiAgICAgIHR5cGVvZiBxY2xhc3MgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIEZhaWxgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgdHlwZW9mIGRpZ2l0cyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgIGFzc2VydC50eXBlb2Yoc3ltLCAnc3ltYm9sJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHRhZywgJ3N0cmluZycpO1xuICAgICAgICAgIHByZXBhcmUocGF5bG9hZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Nsb3QnOiB7XG4gICAgICAgICAgY29uc3QgeyBpbmRleCwgaWZhY2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuICAgICAgICAgIE5hdChpbmRleCk7XG4gICAgICAgICAgaWYgKGlmYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YoaWZhY2UsICdzdHJpbmcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICAnb3JpZ2luYWwnIGluIHJhd1RyZWUgfHxcbiAgICAgICAgICAgIEZhaWxgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xuICAgICAgICAgIHByZXBhcmUob3JpZ2luYWwpO1xuICAgICAgICAgIGlmICgncmVzdCcgaW4gcmF3VHJlZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FycmF5KHJlc3QpKSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChRQ0xBU1MgaW4gcmVzdCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgZW5jb2RpbmcgJHtyZXN0fSBtdXN0IG5vdCBjb250YWluICR7cShRQ0xBU1MpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmVzdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgRmFpbGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICAgICAgcHJlcGFyZShyZXN0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbiAgICAgICAgICB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGFzc2VydC5mYWlsKFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJhd1RyZWUpKSB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcmF3VHJlZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgcHJlcGFyZShyYXdUcmVlW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJhd1RyZWUpO1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBGYWlsYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICB9XG4gICAgICAgIHByZXBhcmUocmF3VHJlZVtuYW1lXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VJbmRlbnRlciA9IHNob3VsZEluZGVudCA/IG1ha2VZZXNJbmRlbnRlciA6IG1ha2VOb0luZGVudGVyO1xuICBsZXQgb3V0ID0gbWFrZUluZGVudGVyKCk7XG5cbiAgLyoqXG4gKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFzcyByZWN1cnNpb24gYWZ0ZXIgdGhlIGZpcnN0IHBhc3MgYHByZXBhcmVgLlxuICogVGhlIGZpcnN0IHBhc3MgZGlkIHNvbWUgaW5wdXQgdmFsaWRhdGlvbiBzb1xuICogaGVyZSB3ZSBjYW4gc2FmZWx5IGFzc3VtZSBldmVyeXRoaW5nIHRob3NlIHRoaW5ncyBhcmUgdmFsaWRhdGVkLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgY29uc3QgZGVjb2RlID0gcmF3VHJlZSA9PiB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICByZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gIH07XG5cbiAgY29uc3QgZGVjb2RlUHJvcGVydHkgPSAobmFtZSwgdmFsdWUpID0+IHtcbiAgICBvdXQubGluZSgpO1xuICAgIGlmIChuYW1lID09PSAnX19wcm90b19fJykge1xuICAgICAgLyogSmF2YVNjcmlwdCBpbnRlcnByZXRzIGB7X19wcm90b19fOiB4LCAuLi59YCovXG4gICAgICAvKiBhcyBtYWtpbmcgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgeGAsIHdoZXJlYXMqL1xuICAgICAgLyogaW4gSlNPTiBpdCBpcyBzaW1wbHkgYSBwcm9wZXJ0eSBuYW1lLiBQcmVzZXJ2ZSB0aGUqL1xuICAgICAgLyogSlNPTiBtZWFuaW5nLiovXG4gICAgICBvdXQubmV4dChgW1wiX19wcm90b19fXCJdOmApO1xuICAgIH0gZWxzZSBpZiAoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIG91dC5uZXh0KGAke25hbWV9OmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubmV4dChgJHtxdW90ZShuYW1lKX06YCk7XG4gICAgfVxuICAgIGRlY29kZSh2YWx1ZSk7XG4gICAgb3V0Lm5leHQoJywnKTtcbiAgfTtcblxuICAvKipcbiAqIE1vZGVsZWQgYWZ0ZXIgYGZ1bGxSZXZpdmVgIGluIG1hcnNoYWwuanNcbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gIGNvbnN0IHJlY3VyID0gcmF3VHJlZSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKHJhd1RyZWUpKSB7XG4gICAgICAvKiBwcmltaXRpdmVzIGdldCBxdW90ZWQqL1xuICAgICAgcmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiAgICB9XG4gICAgLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG4gICAgYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCAnb2JqZWN0Jyk7XG4gICAgYXNzZXJ0KHJhd1RyZWUgIT09IG51bGwpO1xuICAgIGlmIChRQ0xBU1MgaW4gcmF3VHJlZSkge1xuICAgICAgY29uc3QgcWNsYXNzID0gcmF3VHJlZVtRQ0xBU1NdO1xuICAgICAgYXNzZXJ0LnR5cGVvZihxY2xhc3MsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4gICAgICAvKiBTd2l0Y2hpbmcgb24gYGVuY29kZWRbUUNMQVNTXWAgKG9yIGFueXRoaW5nIGxlc3MgZGlyZWN0LCBsaWtlKi9cbiAgICAgIC8qIGBxY2xhc3NgKSBkb2VzIG5vdCBkaXNjcmltaW5hdGUgcmF3VHJlZSBpbiB0eXBlc2NyaXB0QDQuMi4zIGFuZCovXG4gICAgICAvKiBlYXJsaWVyLiovXG4gICAgICBzd2l0Y2ggKHJhd1RyZWVbJ0BxY2xhc3MnXSkge1xuICAgICAgICAvKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdOYU4nOlxuICAgICAgICBjYXNlICdJbmZpbml0eSc6XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICAvKiBUaGVpciBxY2xhc3MgaXMgdGhlaXIgZXhwcmVzc2lvbiBzb3VyY2UuKi9cbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQocWNsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihkaWdpdHMsICdzdHJpbmcnKTtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYCR7QmlnSW50KGRpZ2l0cyl9bmApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICAvKiBUT0RPIGRlcHJlY2F0ZWQuIEV2ZW50dWFsbHkgcmVtb3ZlLiovXG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgIGFzc2VydC50eXBlb2Yoc3ltLCAnc3ltYm9sJyk7XG4gICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZE5hbWUgPSBuYW1lRm9yUGFzc2FibGVTeW1ib2woc3ltKTtcbiAgICAgICAgICBpZiAocmVnaXN0ZXJlZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBBdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuICAgICAgICAgICAgYXNzZXJ0KG1hdGNoICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgYXNzZXJ0KFN5bWJvbFtzdWZmaXhdID09PSBzeW0pO1xuICAgICAgICAgICAgYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgcGFzc2FibGVTeW1ib2xGb3JOYW1lKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgb3V0Lm5leHQoYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfWApO1xuICAgICAgICAgIG91dC5uZXh0KCcsJyk7XG4gICAgICAgICAgZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dCgnKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICBjb25zdCB7IGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKE5hdChyYXdUcmVlLmluZGV4KSk7XG4gICAgICAgICAgY29uc3QgbmVzdGVkUmVuZGVyID0gYXJnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9sZE91dCA9IG91dDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIG91dCA9IG1ha2VOb0luZGVudGVyKCk7XG4gICAgICAgICAgICAgIGRlY29kZShhcmcpO1xuICAgICAgICAgICAgICByZXR1cm4gb3V0LmRvbmUoKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIG91dCA9IG9sZE91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpbmRleCA8IHNsb3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRTbG90ID0gbmVzdGVkUmVuZGVyKHNsb3RzW2luZGV4XSk7XG4gICAgICAgICAgICByZXR1cm4gaWZhY2UgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IG91dC5uZXh0KGBzbG90VG9WYWwoJHtyZW5kZXJlZFNsb3R9KWApXG4gICAgICAgICAgICAgIDogb3V0Lm5leHQoYHNsb3RUb1ZhbCgke3JlbmRlcmVkU2xvdH0sJHtuZXN0ZWRSZW5kZXIoaWZhY2UpfSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGlmYWNlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0pYClcbiAgICAgICAgICAgIDogb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0sJHtuZXN0ZWRSZW5kZXIoaWZhY2UpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBvdXQub3BlbigneycpO1xuICAgICAgICAgIGRlY29kZVByb3BlcnR5KFFDTEFTUywgb3JpZ2luYWwpO1xuICAgICAgICAgIGlmICgncmVzdCcgaW4gcmF3VHJlZSkge1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihyZXN0LCAnb2JqZWN0Jyk7XG4gICAgICAgICAgICBhc3NlcnQocmVzdCAhPT0gbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmVzdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IEZhaWxgUHJvcGVydHkgbmFtZSAke3EoXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICl9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVjb2RlUHJvcGVydHkobmFtZSwgcmVzdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgY2F1c2UgPSB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcnMgPSB1bmRlZmluZWQsXG4gICAgICAgICAgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgY2F1c2UgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgRmFpbGBlcnJvciBjYXVzZSBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICBuYW1lICE9PSBgQWdncmVnYXRlRXJyb3JgIHx8XG4gICAgICAgICAgICBGYWlsYEFnZ3JlZ2F0ZUVycm9yIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIGVycm9ycyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYGVycm9yIGVycm9ycyBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICBYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcbiAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJhd1RyZWUpKSB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcmF3VHJlZTtcbiAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dC5uZXh0KCdbXScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0Lm9wZW4oJ1snKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIG91dC5saW5lKCk7XG4gICAgICAgICAgZGVjb2RlKHJhd1RyZWVbaV0pO1xuICAgICAgICAgIG91dC5uZXh0KCcsJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnXScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiByYXdUcmVlIGlzIGFuIGBFbmNvZGluZ1JlY29yZGAgd2hpY2ggb25seSBoYXMgc3RyaW5nIGtleXMsKi9cbiAgICAgIC8qIGJ1dCBzaW5jZSBvd25LZXlzIGlzIG5vdCBnZW5lcmljLCBpdCBjYW4ndCBwcm9wYWdhdGUgdGhhdCovXG4gICAgICBjb25zdCBuYW1lcyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChvd25LZXlzKHJhd1RyZWUpKTtcbiAgICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dC5uZXh0KCd7fScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0Lm9wZW4oJ3snKTtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgZGVjb2RlUHJvcGVydHkobmFtZSwgcmF3VHJlZVtuYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnfScpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcHJlcGFyZShlbmNvZGluZyk7XG4gIGRlY29kZShlbmNvZGluZyk7XG4gIHJldHVybiBvdXQuZG9uZSgpO1xufTskaM2PX29uY2UuZGVjb2RlVG9KdXN0aW4oZGVjb2RlVG9KdXN0aW4pO1xuaGFyZGVuKGRlY29kZVRvSnVzdGluKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzaG91bGRJbmRlbnRdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG4gICAgICAgY29uc3QgcGFzc2FibGVBc0p1c3RpbiA9IChwYXNzYWJsZSwgc2hvdWxkSW5kZW50ID0gdHJ1ZSkgPT4ge1xuICBsZXQgc2xvdENvdW50ID0gMDtcbiAgLyogVXNpbmcgcG9zdC1pbmNyZW1lbnQgYmVsb3cgb25seSBzbyB0aGF0IHRoZSBpbmRleGVzIHN0YXJ0IGF0IHplcm8qL1xuICAvKiBhbmQgdGhlIGBzbG90Q291bnRgIHZhcmlhYmxlIGNhbiBiZSBpbml0aWFsaXplZCB0byBgMGAgcmF0aGVyIHRoYW4qL1xuICAvKiBgLTFgLiovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG4gIGNvbnN0IGNvbnZlcnRWYWxUb1Nsb3QgPSB2YWwgPT4gYHMke3Nsb3RDb3VudCsrfWA7XG4gIGNvbnN0IHsgdG9DYXBEYXRhIH0gPSBtYWtlTWFyc2hhbChjb252ZXJ0VmFsVG9TbG90KTtcbiAgY29uc3QgeyBib2R5LCBzbG90cyB9ID0gdG9DYXBEYXRhKHBhc3NhYmxlKTtcbiAgY29uc3QgZW5jb2RlZCA9IEpTT04ucGFyc2UoYm9keSk7XG4gIHJldHVybiBkZWNvZGVUb0p1c3RpbihlbmNvZGVkLCBzaG91bGRJbmRlbnQsIHNsb3RzKTtcbn07JGjNj19vbmNlLnBhc3NhYmxlQXNKdXN0aW4ocGFzc2FibGVBc0p1c3Rpbik7XG5oYXJkZW4ocGFzc2FibGVBc0p1c3Rpbik7XG5cbi8qIFRoZSBleGFtcGxlIGJlbG93IGlzIHRoZSBgcGF0dDFgIHRlc3QgY2FzZSBmcm9tIGBxcC1vbi1wYXR0ZXJuLnRlc3QuanNgLiovXG4vKiBQbGVhc2UgY28tbWFpbnRhaW4gdGhlIGZvbGxvd2luZyBkb2MtY29tbWVudCBhbmQgdGhhdCB0ZXN0IG1vZHVsZS4qL1xuLyoqXG4gKiBgcXBgIGZvciBxdW90ZSBwYXNzYWJsZSBhcyBhIHF1YXNpLXF1b3RlZCBKdXN0aW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBCb3RoIGBxYCBmcm9tIGBAZW5kby9lcnJvcnNgIGFuZCB0aGlzIGBxcGAgZnJvbSBgQGVuZG8vbWFyc2hhbGAgY2FuXG4gKiBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggYEZhaWxgLCBgWGAsIGV0YyBmcm9tIGBAZW5kby9lcnJvcnNgIHRvIG1hcmtcbiAqIGEgc3Vic3RpdHV0aW9uIHZhbHVlIHRvIGJlIGJvdGhcbiAqIC0gdmlzdWFsbHkgcXVvdGVkIGluIHNvbWUgdXNlZnVsIG1hbm5lclxuICogLSB1bnJlZGFjdGVkXG4gKlxuICogRGlmZmVyZW5jZXM6XG4gKiAtIGdpdmVuIGEgcGF0dGVybiBgTS5hbmQoTS5ndGUoLTEwMCksIE0ubHRlKDEwMCkpYCxcbiAqICAgYGBganNcbiAqICAgYCR7cShwYXR0KX1gXG4gKiAgIGBgYFxuICogICBwcm9kdWNlcyBgXCJbbWF0Y2g6YW5kXVwiYCwgd2hlcmVhc1xuICogICBgYGBqc1xuICogICBgJHtxcChwYXR0KX1gXG4gKiAgIGBgYFxuICogICBwcm9kdWNlcyBxdWFzaS1xdW90ZXMgSnVzdGluIG9mIHdoYXQgd291bGQgYmUgcGFzc2VkOlxuICogICBgYGBqc1xuICogICBgbWFrZVRhZ2dlZChcIm1hdGNoOmFuZFwiLCBbXG4gKiAgICAgbWFrZVRhZ2dlZChcIm1hdGNoOmd0ZVwiLCAtMTAwKSxcbiAqICAgICBtYWtlVGFnZ2VkKFwibWF0Y2g6bHRlXCIsIDEwMCksXG4gKiAgIF0pYFxuICogICBgYGBcbiAqIC0gYHFgIGlzIGxhenksIG1pbmltaXppbmcgdGhlIGNvc3QgZm9yIHVzaW5nIGl0IGluIGFuIGVycm9yIHRoYXQncyBuZXZlclxuICogICBsb2dnZWQuIFVuZm9ydHVuYXRlbHksIGR1ZSB0byBsYXllcmluZyBjb25zdHJhaW50cywgYHFwYCBpcyBub3RcbiAqICAgbGF6eSwgYWx3YXlzIHJlbmRlcmluZyB0byBxdWFzaS1xdW90ZWQgSnVzdGluIGltbWVkaWF0ZWx5LlxuICpcbiAqIFNpbmNlIEp1c3RpbiBpcyBhIHN1YnNldCBvZiBIYXJkZW5lZEpTLCBuZWl0aGVyIHRoZSBuYW1lIGBxcGAgbm9yIHRoZVxuICogcmVuZGVyZWQgZm9ybSBuZWVkIHRvIG1ha2UgY2xlYXIgdGhhdCB0aGUgcmVuZGVyZWQgZm9ybSBpcyBpbiBKdXN0aW4gcmF0aGVyXG4gKiB0aGFuIEhhcmRlbmVkSlMuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF5bG9hZFxuICogQHJldHVybnMge1N0cmluZ2FibGVQYXlsb2FkfVxuICovXG4gICAgICAgY29uc3QgcXAgPSBwYXlsb2FkID0+IGBcXGAke3Bhc3NhYmxlQXNKdXN0aW4oaGFyZGVuKHBheWxvYWQpLCB0cnVlKX1cXGBgOyRozY9fb25jZS5xcChxcCk7XG5oYXJkZW4ocXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXSwicGFzc2FibGVBc0p1c3RpbiI6WyJwYXNzYWJsZUFzSnVzdGluIl0sInFwIjpbInFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKtxgfihCQAAoQkAAC0AAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZScgKi9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3QgPSB2YWwgPT5cbiAgRmFpbGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbCA9IChzbG90LCBfaWZhY2UpID0+XG4gIEZhaWxgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdHMgJHtzbG90fWA7XG5cbmNvbnN0IGJhZEFycmF5SGFuZGxlciA9IGhhcmRlbih7XG4gIGdldDogKF90YXJnZXQsIG5hbWUsIF9yZWNlaXZlcikgPT4ge1xuICAgIGlmIChuYW1lID09PSAnbGVuZ3RoJykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbiAgICB0aHJvdyBGYWlsYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3QgcG9zaXRpb25zICR7bmFtZX1gO1xuICB9LFxufSk7XG5cbi8qKlxuICogYGZyZWV6ZWAgYnV0IG5vdCBgaGFyZGVuYCB0aGUgcHJveHkgdGFyZ2V0IHNvIGl0IHJlbWFpbnMgdHJhcHBpbmcuXG4gKiBUaHVzLCBpdCBzaG91bGQgbm90IGJlIHNoYXJlZCBvdXRzaWRlIHRoaXMgbW9kdWxlLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9kb2NzL3ByZXBhcmluZy1mb3Itc3RhYmlsaXplLm1kXG4gKi9cbmNvbnN0IGFycmF5VGFyZ2V0ID0gZnJlZXplKC8qKiBAdHlwZSB7YW55W119ICovIChbXSkpO1xuY29uc3QgYmFkQXJyYXkgPSBuZXcgUHJveHkoYXJyYXlUYXJnZXQsIGJhZEFycmF5SGFuZGxlcik7XG5cbmNvbnN0IHsgc2VyaWFsaXplLCB1bnNlcmlhbGl6ZSB9ID0gbWFrZU1hcnNoYWwoXG4gIGRvTm90Q29udmVydFZhbFRvU2xvdCxcbiAgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxuICB7XG4gICAgZXJyb3JUYWdnaW5nOiAnb2ZmJyxcbiAgICAvKiBUT0RPIGZpeCB0ZXN0cyB0byB3b3JrcyB3aXRoIHNtYWxsY2Fwcy4qL1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdjYXBkYXRhJyxcbiAgfSxcbik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzdHJpbmdpZnkgPSB2YWwgPT4gc2VyaWFsaXplKHZhbCkuYm9keTskaM2PX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IHBhcnNlID0gc3RyID0+XG4gIHVuc2VyaWFsaXplKFxuICAgIC8qIGBmcmVlemVgIGJ1dCBub3QgYGhhcmRlbmAgc2luY2UgdGhlIGBiYWRBcnJheWAgcHJveHkgYW5kIGl0cyB0YXJnZXQqL1xuICAgIC8qIG11c3QgcmVtYWluIHRyYXBwaW5nLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvZG9jcy9wcmVwYXJpbmctZm9yLXN0YWJpbGl6ZS5tZCovXG4gICAgZnJlZXplKHtcbiAgICAgIGJvZHk6IHN0cixcbiAgICAgIHNsb3RzOiBiYWRBcnJheSxcbiAgICB9KSxcbiAgKTskaM2PX29uY2UucGFyc2UocGFyc2UpO1xuaGFyZGVuKHBhcnNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZViFtXw/AAB8PwAAIwAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsdG9QYXNzYWJsZUVycm9yLFgsRmFpbCxxLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yLG9iamVjdE1hcCxRQ0xBU1MsbWFrZUVuY29kZVRvQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbUNhcERhdGEsbWFrZURlY29kZUZyb21TbWFsbGNhcHMsbWFrZUVuY29kZVRvU21hbGxjYXBzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZU9mXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaM2PX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1widG9QYXNzYWJsZUVycm9yXCIsWyRozY9fYSA9PiAodG9QYXNzYWJsZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLFskaM2PX2EgPT4gKFFDTEFTUyA9ICRozY9fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsWyRozY9fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRozY9fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIixbJGjNj19hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLFskaM2PX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjNj19hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLFskaM2PX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvbnZlcnRTbG90VG9WYWwsIENvbnZlcnRWYWxUb1Nsb3QsIEZyb21DYXBEYXRhLCBNYWtlTWFyc2hhbE9wdGlvbnMsIFRvQ2FwRGF0YX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgUGFzc2FibGVDYXAsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VTcGVjfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0VuY29kaW5nfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCB7IGRlZmluZVByb3BlcnRpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqIEB0eXBlIHtDb252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm4gPSB4ID0+IHg7XG4vKiogQHR5cGUge0NvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbiA9ICh4LCBfKSA9PiB4O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBTbG90XG4gKiBAcGFyYW0ge0NvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IFtjb252ZXJ0VmFsVG9TbG90XVxuICogQHBhcmFtIHtDb252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBbY29udmVydFNsb3RUb1ZhbF1cbiAqIEBwYXJhbSB7TWFrZU1hcnNoYWxPcHRpb25zfSBvcHRpb25zXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWFyc2hhbCA9IChcbiAgY29udmVydFZhbFRvU2xvdCA9IGRlZmF1bHRWYWxUb1Nsb3RGbixcbiAgY29udmVydFNsb3RUb1ZhbCA9IGRlZmF1bHRTbG90VG9WYWxGbixcbiAge1xuICAgIGVycm9yVGFnZ2luZyA9ICdvbicsXG4gICAgbWFyc2hhbE5hbWUgPSAnYW5vbi1tYXJzaGFsJyxcbiAgICAvKiBUT0RPIFRlbXBvcmFyeSBoYWNrLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc4MCovXG4gICAgZXJyb3JJZE51bSA9IDEwMDAwLFxuICAgIC8qIFdlIHByZWZlciB0aGF0IHRoZSBjYWxsZXIgaW5zdGVhZCBsb2cgdG8gc29tZXdoZXJlIGhpZGRlbiovXG4gICAgLyogdG8gYmUgcmV2ZWFsZWQgd2hlbiBjb3JyZWxhdGluZyB3aXRoIHRoZSByZWNlaXZlZCBlcnJvci4qL1xuICAgIG1hcnNoYWxTYXZlRXJyb3IgPSBlcnIgPT5cbiAgICAgIGNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJywgZXJyKSxcbiAgICAvKiBEZWZhdWx0IHRvICdjYXBkYXRhJyBiZWNhdXNlIGl0IHdhcyBpbXBsZW1lbnRlZCBmaXJzdC4qL1xuICAgIC8qIFNvbWV0aW1lcywgb250b2dlbnkgZG9lcyByZWNhcGl0dWxhdGUgcGh5bG9nZW55IDspKi9cbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0ID0gJ2NhcGRhdGEnLFxuICB9ID0ge30sXG4pID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihtYXJzaGFsTmFtZSwgJ3N0cmluZycpO1xuICBlcnJvclRhZ2dpbmcgPT09ICdvbicgfHxcbiAgICBlcnJvclRhZ2dpbmcgPT09ICdvZmYnIHx8XG4gICAgRmFpbGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gO1xuICBjb25zdCBuZXh0RXJyb3JJZCA9ICgpID0+IHtcbiAgICBlcnJvcklkTnVtICs9IDE7XG4gICAgcmV0dXJuIGBlcnJvcjoke21hcnNoYWxOYW1lfSMke2Vycm9ySWROdW19YDtcbiAgfTtcblxuICAvKipcbiAqIEB0eXBlIHtUb0NhcERhdGE8U2xvdD59XG4gKi9cbiAgY29uc3QgdG9DYXBEYXRhID0gcm9vdCA9PiB7XG4gICAgY29uc3Qgc2xvdHMgPSBbXTtcbiAgICAvKiBtYXBzIHZhbCAocHJvbWlzZSBvciByZW1vdGFibGUpIHRvIGluZGV4IG9mIHNsb3RzW10qL1xuICAgIGNvbnN0IHNsb3RNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGVDYXB9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7e2luZGV4OiBudW1iZXIsIHJlcGVhdDogYm9vbGVhbn19XG4gKi9cbiAgICBjb25zdCBlbmNvZGVTbG90Q29tbW9uID0gcGFzc2FibGUgPT4ge1xuICAgICAgbGV0IGluZGV4ID0gc2xvdE1hcC5nZXQocGFzc2FibGUpO1xuICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyogVE9ETyBhc3NlcnQgdGhhdCBpdCdzIHRoZSBzYW1lIGlmYWNlIGFzIGJlZm9yZSovXG4gICAgICAgIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGluZGV4LCByZXBlYXQ6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIGluZGV4ID0gc2xvdHMubGVuZ3RoO1xuICAgICAgY29uc3Qgc2xvdCA9IGNvbnZlcnRWYWxUb1Nsb3QocGFzc2FibGUpO1xuICAgICAgc2xvdHMucHVzaChzbG90KTtcbiAgICAgIHNsb3RNYXAuc2V0KHBhc3NhYmxlLCBpbmRleCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgaW5kZXgsIHJlcGVhdDogZmFsc2UgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gaXNFcnJvckxpa2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gdW5rbm93bn0gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fVxuICovXG4gICAgY29uc3QgZW5jb2RlRXJyb3JDb21tb24gPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVuY29kZVJlY3VyKGAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCAnc3RyaW5nJyk7XG4gICAgICBjb25zdCBuYW1lID0gZW5jb2RlUmVjdXIoYCR7ZXJyLm5hbWV9YCk7XG4gICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgIC8qIFRPRE8gTXVzdCBlbmNvZGUgYGNhdXNlYCwgYGVycm9yc2AsIGJ1dCovXG4gICAgICAvKiBvbmx5IG9uY2UgYWxsIHBvc3NpYmxlIGNvdW50ZXJwYXJ0eSBkZWNvZGVycyBhcmUgdG9sZXJhbnQgb2YqL1xuICAgICAgLyogcmVjZWl2aW5nIHRoZW0uKi9cbiAgICAgIGlmIChlcnJvclRhZ2dpbmcgPT09ICdvbicpIHtcbiAgICAgICAgLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4gICAgICAgIC8qIGJlIHVzZWZ1bCB0byBsb2cgdGhlIHN0YWNrIGxvY2FsbHkgc28gc29tZW9uZSB3aG8gaGFzKi9cbiAgICAgICAgLyogcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdGhlIHRocm93aW5nIFZhdCBjYW4gY29ycmVsYXRlKi9cbiAgICAgICAgLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4gICAgICAgIC8qIHN1bW1hcnkuIElmIHdlIGRvIHRoYXQsIHdlIGNvdWxkIGFsbG9jYXRlIHNvbWUgcmFuZG9tKi9cbiAgICAgICAgLyogaWRlbnRpZmllciBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbWVzc2FnZSwgdG8gaGVscCovXG4gICAgICAgIC8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG4gICAgICAgIGNvbnN0IGVycm9ySWQgPSBlbmNvZGVSZWN1cihuZXh0RXJyb3JJZCgpKTtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihlcnJvcklkLCAnc3RyaW5nJyk7XG4gICAgICAgIGFubm90YXRlRXJyb3IoZXJyLCBYYFNlbnQgYXMgJHtlcnJvcklkfWApO1xuICAgICAgICBtYXJzaGFsU2F2ZUVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBlcnJvcklkLCBtZXNzYWdlLCBuYW1lIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IG1lc3NhZ2UsIG5hbWUgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChzZXJpYWxpemVCb2R5Rm9ybWF0ID09PSAnY2FwZGF0YScpIHtcbiAgICAgIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZUNhcH0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG4gICAgICBjb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhID0gKHBhc3NhYmxlLCBpZmFjZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCByZXBlYXQgfSA9IGVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4gICAgICAgIGlmIChyZXBlYXQgPT09IHRydWUgfHwgaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ3Nsb3QnLCBpbmRleCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdzbG90JywgaWZhY2UsIGluZGV4IH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvKiogQHR5cGUgeyhwcm9taXNlOiBSZW1vdGFibGVPYmplY3QsIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nKSA9PiBFbmNvZGluZ30gKi9cbiAgICAgIGNvbnN0IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9ICh2YWwsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvQ2FwRGF0YSh2YWwsIGdldEludGVyZmFjZU9mKHZhbCkpO1xuXG4gICAgICAvKiogQHR5cGUgeyhwcm9taXNlOiBQcm9taXNlLCBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZykgPT4gRW5jb2Rpbmd9ICovXG4gICAgICBjb25zdCBlbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gKHByb21pc2UsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvQ2FwRGF0YShwcm9taXNlKTtcblxuICAgICAgLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ30gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuICAgICAgY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGEgPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgICBjb25zdCBlcnJEYXRhID0gZW5jb2RlRXJyb3JDb21tb24oZXJyLCBlbmNvZGVSZWN1cik7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ2Vycm9yJywgLi4uZXJyRGF0YSB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVRvQ2FwRGF0YSA9IG1ha2VFbmNvZGVUb0NhcERhdGEoe1xuICAgICAgICBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG4gICAgICAgIGVuY29kZVByb21pc2VUb0NhcERhdGEsXG4gICAgICAgIGVuY29kZUVycm9yVG9DYXBEYXRhLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUb0NhcERhdGEocm9vdCk7XG4gICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgc2xvdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHNlcmlhbGl6ZUJvZHlGb3JtYXQgPT09ICdzbWFsbGNhcHMnKSB7XG4gICAgICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7UGFzc2FibGVDYXB9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbiAgICAgIGNvbnN0IGVuY29kZVNsb3RUb1NtYWxsY2FwcyA9IChwcmVmaXgsIHBhc3NhYmxlLCBpZmFjZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCByZXBlYXQgfSA9IGVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4gICAgICAgIC8qIFRPRE8gZXhwbG9yZSByZW1vdmluZyB0aGlzIHNwZWNpYWwgY2FzZSovXG4gICAgICAgIGlmIChyZXBlYXQgPT09IHRydWUgfHwgaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSAocmVtb3RhYmxlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcsIHJlbW90YWJsZSwgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IChwcm9taXNlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb1NtYWxsY2FwcygnJicsIHByb21pc2UpO1xuXG4gICAgICBjb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgICAgY29uc3QgZXJyRGF0YSA9IGVuY29kZUVycm9yQ29tbW9uKGVyciwgZW5jb2RlUmVjdXIpO1xuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLnJlc3QgfSA9IGVyckRhdGE7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyAnI2Vycm9yJzogbWVzc2FnZSwgLi4ucmVzdCB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzID0gbWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbiAgICAgICAgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG4gICAgICAgIGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbiAgICAgICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgLyogVmFsaWQgSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhIHZhbGlkIHNpZ25hbCovXG4gICAgICAgIC8qIGluZGljYXRpbmcgc21hbGxjYXBzIGZvcm1hdC4qL1xuICAgICAgICBib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuICAgICAgICBzbG90cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGUgYHRocm93YCBpcyBhIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQWRkZWQgZm9yIGNvbmZ1c2VkIGxpbnRlcnMuKi9cbiAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlRnVsbFJldml2ZSA9IHNsb3RzID0+IHtcbiAgICAvKiogQHR5cGUge01hcDxudW1iZXIsIFJlbW90YWJsZU9iamVjdCB8IFByb21pc2U+fSAqL1xuICAgIGNvbnN0IHZhbE1hcCA9IG5ldyBNYXAoKTtcblxuICAgIC8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1JlbW90YWJsZU9iamVjdCB8IFByb21pc2V9XG4gKi9cbiAgICBjb25zdCBkZWNvZGVTbG90Q29tbW9uID0gc2xvdERhdGEgPT4ge1xuICAgICAgY29uc3QgeyBpZmFjZSA9IHVuZGVmaW5lZCwgaW5kZXgsIC4uLnJlc3QgfSA9IHNsb3REYXRhO1xuICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGVuY29kZWQgc2xvdCBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuICAgICAgY29uc3QgZXh0YW50ID0gdmFsTWFwLmdldChpbmRleCk7XG4gICAgICBpZiAoZXh0YW50KSB7XG4gICAgICAgIHJldHVybiBleHRhbnQ7XG4gICAgICB9XG4gICAgICAvKiBUT0RPIFNFQ1VSSVRZIEhBWkFSRDogbXVzdCBlbmZvY2UgdGhhdCByZW1vdGFibGUgdnMgcHJvbWlzZSovXG4gICAgICAvKiBpcyBhY2NvcmRpbmcgdG8gdGhlIGVuY29kZWQgc3RyaW5nLiovXG4gICAgICBjb25zdCBzbG90ID0gc2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbiAgICAgIGNvbnN0IHZhbCA9IGNvbnZlcnRTbG90VG9WYWwoc2xvdCwgaWZhY2UpO1xuICAgICAgdmFsTWFwLnNldChpbmRleCwgdmFsKTtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcblxuICAgIC8qKlxuICogQHBhcmFtIHt7XG4gKiAgIGVycm9ySWQ/OiBzdHJpbmcsXG4gKiAgIG1lc3NhZ2U6IHN0cmluZyxcbiAqICAgbmFtZTogc3RyaW5nLFxuICogICBjYXVzZTogdW5rbm93bixcbiAqICAgZXJyb3JzOiB1bmtub3duLFxuICogfX0gZXJyRGF0YVxuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IGRlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbiAgICBjb25zdCBkZWNvZGVFcnJvckNvbW1vbiA9IChlcnJEYXRhLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBlcnJvcklkID0gdW5kZWZpbmVkLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBjYXVzZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgZXJyb3JzID0gdW5kZWZpbmVkLFxuICAgICAgICAuLi5yZXN0XG4gICAgICB9ID0gZXJyRGF0YTtcbiAgICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8yMDUyKi9cbiAgICAgIC8qIGNhcERhdGEgZG9lcyBub3QgdHJhbnNmb3JtIHN0cmluZ3MuIFRoZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgY2FsbHMqL1xuICAgICAgLyogdG8gYGRlY29kZVJlY3VyYCBhcmUgZm9yIHJldXNlIGJ5IG90aGVyIGVuY29kaW5ncyB0aGF0IGRvLCovXG4gICAgICAvKiBzdWNoIGFzIHNtYWxsY2Fwcy4qL1xuICAgICAgY29uc3QgZE5hbWUgPSBkZWNvZGVSZWN1cihuYW1lKTtcbiAgICAgIGNvbnN0IGRNZXNzYWdlID0gZGVjb2RlUmVjdXIobWVzc2FnZSk7XG4gICAgICAvKiBlcnJvcklkIGlzIGEgbGF0ZSBhZGRpdGlvbiBzbyBiZSB0b2xlcmFudCBvZiBpdHMgYWJzZW5jZS4qL1xuICAgICAgY29uc3QgZEVycm9ySWQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGVycm9ySWQgJiYgZGVjb2RlUmVjdXIoZXJyb3JJZCkpO1xuICAgICAgaWYgKHR5cGVvZiBkTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRNZXNzYWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSkgfHwgRXJyb3I7XG4gICAgICBjb25zdCBlcnJvck5hbWUgPVxuICAgICAgICBkRXJyb3JJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgICA6IGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgIHNhbml0aXplOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBpZiAoY2F1c2UpIHtcbiAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGRlY29kZVJlY3VyKGNhdXNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgb3B0aW9ucy5lcnJvcnMgPSBkZWNvZGVSZWN1cihlcnJvcnMpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3RXJyb3IgPSBtYWtlRXJyb3IoZE1lc3NhZ2UsIGVyckNvbnN0cnVjdG9yLCBvcHRpb25zKTtcbiAgICAgIC8qIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGRlY29kZVJlY3VyIHJlc3QncyBwcm9wZXJ0eSBuYW1lcy4qL1xuICAgICAgLyogVGhpcyB3b3VsZCBiZSBpbmNvbnNpc3RlbnQgd2l0aCBzbWFsbGNhcHMnIGV4cGVjdGVkIGhhbmRsaW5nLCovXG4gICAgICAvKiBidXQgaXMgZmluZSBoZXJlIHNpbmNlIGl0IGlzIG9ubHkgdXNlZCBmb3IgYGFubm90YXRlRXJyb3JgLCovXG4gICAgICAvKiB3aGljaCBpcyBmb3IgZGlhZ25vc3RpYyBpbmZvIHRoYXQgaXMgb3RoZXJ3aXNlIHVub2JzZXJ2YWJsZS4qL1xuICAgICAgY29uc3QgZGVzY3MgPSBvYmplY3RNYXAocmVzdCwgZGF0YSA9PiAoe1xuICAgICAgICB2YWx1ZTogZGVjb2RlUmVjdXIoZGF0YSksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB9KSk7XG4gICAgICBkZWZpbmVQcm9wZXJ0aWVzKHJhd0Vycm9yLCBkZXNjcyk7XG4gICAgICBoYXJkZW4ocmF3RXJyb3IpO1xuICAgICAgcmV0dXJuIHRvUGFzc2FibGVFcnJvcihyYXdFcnJvcik7XG4gICAgfTtcblxuICAgIC8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuICAgIC8qIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvbiovXG4gICAgLyogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUqL1xuICAgIC8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0Ki9cbiAgICBjb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSA9IChyYXdUcmVlLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgW1FDTEFTU106IF8sIC4uLnNsb3REYXRhIH0gPSByYXdUcmVlO1xuICAgICAgcmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuICAgIH07XG5cbiAgICBjb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhID0gKHJhd1RyZWUsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7IFtRQ0xBU1NdOiBfLCAuLi5lcnJEYXRhIH0gPSByYXdUcmVlO1xuICAgICAgcmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbUNhcERhdGEgPSBtYWtlRGVjb2RlRnJvbUNhcERhdGEoe1xuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE6IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgICAgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOiBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICAgIGRlY29kZUVycm9yRnJvbUNhcERhdGEsXG4gICAgfSk7XG5cbiAgICBjb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMgPSBwcmVmaXggPT4ge1xuICAgICAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nRW5jb2RpbmdcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBfZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtSZW1vdGFibGVPYmplY3QgfCBQcm9taXNlfVxuICovXG4gICAgICByZXR1cm4gKHN0cmluZ0VuY29kaW5nLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KHN0cmluZ0VuY29kaW5nLmNoYXJBdCgwKSA9PT0gcHJlZml4KTtcbiAgICAgICAgLyogc2xvdHM6ICRzbG90SW5kZXguaWZhY2Ugb3IgJHNsb3RJbmRleCovXG4gICAgICAgIGNvbnN0IGkgPSBzdHJpbmdFbmNvZGluZy5pbmRleE9mKCcuJyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsIGkgPCAwID8gdW5kZWZpbmVkIDogaSkpO1xuICAgICAgICAvKiBpIDwgMCBtZWFucyB0aGVyZSB3YXMgbm8gaWZhY2UgaW5jbHVkZWQuKi9cbiAgICAgICAgY29uc3QgaWZhY2UgPSBpIDwgMCA/IHVuZGVmaW5lZCA6IHN0cmluZ0VuY29kaW5nLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIGRlY29kZVNsb3RDb21tb24oeyBpZmFjZSwgaW5kZXggfSk7XG4gICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJCcpO1xuICAgIGNvbnN0IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzID0gbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCcmJyk7XG5cbiAgICBjb25zdCBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgPSAoZW5jb2RpbmcsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7ICcjZXJyb3InOiBtZXNzYWdlLCAuLi5yZXN0RXJyRGF0YSB9ID0gZW5jb2Rpbmc7XG4gICAgICAhaGFzT3duKHJlc3RFcnJEYXRhLCAnbWVzc2FnZScpIHx8XG4gICAgICAgIEZhaWxgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG4gICAgICByZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oeyBtZXNzYWdlLCAuLi5yZXN0RXJyRGF0YSB9LCBkZWNvZGVSZWN1cik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyh7XG4gICAgICAvKiBAdHMtaWdub3JlIFhYWCBTbWFsbENhcHNFbmNvZGluZyovXG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuICAgICAgLyogQHRzLWlnbm9yZSBYWFggU21hbGxDYXBzRW5jb2RpbmcqL1xuICAgICAgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG4gICAgICBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGFyZGVuKHsgcmV2aXZlRnJvbUNhcERhdGEsIHJldml2ZUZyb21TbWFsbGNhcHMgfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBAdHlwZSB7RnJvbUNhcERhdGE8U2xvdD59XG4gKi9cbiAgY29uc3QgZnJvbUNhcERhdGEgPSBkYXRhID0+IHtcbiAgICBjb25zdCB7IGJvZHksIHNsb3RzIH0gPSBkYXRhO1xuICAgIHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG4gICAgaXNBcnJheShkYXRhLnNsb3RzKSB8fFxuICAgICAgRmFpbGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguc2xvdHMgYXJlIG5vdCBBcnJheSlgO1xuICAgIGNvbnN0IHsgcmV2aXZlRnJvbUNhcERhdGEsIHJldml2ZUZyb21TbWFsbGNhcHMgfSA9IG1ha2VGdWxsUmV2aXZlKHNsb3RzKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIC8qIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYW4gdW5hbWJpZ3VvdXMgc2lnbmFsLiovXG4gICAgaWYgKGJvZHkuY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgIGNvbnN0IHNtYWxsY2Fwc0JvZHkgPSBib2R5LnNsaWNlKDEpO1xuICAgICAgY29uc3QgZW5jb2RpbmcgPSBoYXJkZW4oSlNPTi5wYXJzZShzbWFsbGNhcHNCb2R5KSk7XG4gICAgICByZXN1bHQgPSBoYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByYXdUcmVlID0gaGFyZGVuKEpTT04ucGFyc2UoYm9keSkpO1xuICAgICAgcmVzdWx0ID0gaGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiAgICB9XG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNyovXG4gICAgLyogd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZml4ZWQgb25jZSB3ZSd2ZSBjb21wbGV0ZWQgdGhlIHN3aXRjaCovXG4gICAgLyogdG8gc21hbGxjYXBzLiovXG4gICAgYXNzZXJ0UGFzc2FibGUocmVzdWx0KTtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtQYXNzYWJsZUNhcH0gKi8gKHJlc3VsdCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgdG9DYXBEYXRhLFxuICAgIGZyb21DYXBEYXRhLFxuXG4gICAgLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki9cbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHRvQ2FwRGF0YSAqL1xuICAgIHNlcmlhbGl6ZTogdG9DYXBEYXRhLFxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUNhcERhdGEgKi9cbiAgICB1bnNlcmlhbGl6ZTogZnJvbUNhcERhdGEsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZU1hcnNoYWwobWFrZU1hcnNoYWwpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcnNoYWwiOlsibWFrZU1hcnNoYWwiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgaK+MehZAADoWQAAJQAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9yYW5rT3JkZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiLi9lbmNvZGVQYXNzYWJsZS5qcyJdLCJleHBvcnRzIjpbIkZ1bGxSYW5rQ292ZXIiLCJhc3NlcnRSYW5rU29ydGVkIiwiY29tcGFyYXRvck1pcnJvckltYWdlIiwiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVOdW1lcmljcyIsImNvbXBhcmVSYW5rIiwiY292ZXJlZEVudHJpZXMiLCJnZXRJbmRleENvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaXNSYW5rU29ydGVkIiwibWFrZUNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsInNvcnRCeVJhbmsiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRlbnYsRmFpbCxxLGdldFRhZyxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0ZW52ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlUHJlZml4ZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGUsIFBhc3NTdHlsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqIEBpbXBvcnQge0Z1bGxDb21wYXJlLCBQYXJ0aWFsQ29tcGFyZSwgUGFydGlhbENvbXBhcmlzb24sIFJhbmtDb21wYXJlLCBSYW5rQ29tcGFyaXNvbiwgUmFua0NvdmVyfSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbmNvbnN0IHsgaXNOYU46IE51bWJlcklzTmFOIH0gPSBOdW1iZXI7XG5jb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzLCBzZXRQcm90b3R5cGVPZiwgaXMgfSA9IE9iamVjdDtcblxuY29uc3QgRU5ET19SQU5LX1NUUklOR1MgPSBnZXRlbnYoJ0VORE9fUkFOS19TVFJJTkdTJywgJ3V0ZjE2LWNvZGUtdW5pdC1vcmRlcicsIFtcbiAgJ3VuaWNvZGUtY29kZS1wb2ludC1vcmRlcicsXG4gICdlcnJvci1pZi1vcmRlci1jaG9pY2UtbWF0dGVycycsXG5dKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5rQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZ1bGxDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tudW1iZXIsIG51bWJlcl19IEluZGV4Q292ZXJcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24gdXNlZCBieSBKYXZhU2NyaXB0J3MgTWFwIGFuZCBTZXRcbiAqIGFic3RyYWN0aW9ucywgd2hlcmUgTmFOIGlzIHRoZSBzYW1lIGFzIE5hTiBhbmQgLTAgaXMgdGhlIHNhbWUgYXNcbiAqIDAuIE1hcnNoYWwgc2VyaWFsaXplcyAtMCBhcyB6ZXJvLCBzbyB0aGUgc2VtYW50aWNzIG9mIG91ciBkaXN0cmlidXRlZFxuICogb2JqZWN0IHN5c3RlbSBkb2VzIG5vdCBkaXN0aW5ndWlzaCAwIGZyb20gLTAuXG4gKlxuICogYHNhbWVWYWx1ZVplcm9gIGlzIHRoZSBFY21hU2NyaXB0IHNwZWMgbmFtZSBmb3IgdGhpcyBlcXVhbGl0eSBjb21wYXJpc29uLFxuICogYnV0IFRPRE8gd2UgbmVlZCBhIGJldHRlciBuYW1lIGZvciB0aGUgQVBJLlxuICpcbiAqIEBwYXJhbSB7YW55fSB4XG4gKiBAcGFyYW0ge2FueX0geVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHNhbWVWYWx1ZVplcm8gPSAoeCwgeSkgPT4geCA9PT0geSB8fCBpcyh4LCB5KTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gbGVmdFxuICogQHBhcmFtIHthbnl9IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cbmNvbnN0IHRyaXZpYWxDb21wYXJhdG9yID0gKGxlZnQsIHJpZ2h0KSA9PlxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnksIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xuICBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPT09IHJpZ2h0ID8gMCA6IDE7XG5oYXJkZW4odHJpdmlhbENvbXBhcmF0b3IpO1xuXG4vKiBBcHBhcmVudGx5IGVzbGludCBjb25mdXNlZCBhYm91dCB3aGV0aGVyIHRoZSBmdW5jdGlvbiBjYW4gZXZlciBleGl0Ki9cbi8qIHdpdGhvdXQgYW4gZXhwbGljaXQgcmV0dXJuLiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrKi9cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGxlZnRcbiAqIEBwYXJhbSB7c3RyaW5nfSByaWdodFxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG4gICAgICAgY29uc3QgY29tcGFyZUJ5Q29kZVBvaW50cyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICBjb25zdCBsZWZ0SXRlciA9IGxlZnRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICBjb25zdCByaWdodEl0ZXIgPSByaWdodFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IHZhbHVlOiBsZWZ0Q2hhciB9ID0gbGVmdEl0ZXIubmV4dCgpO1xuICAgIGNvbnN0IHsgdmFsdWU6IHJpZ2h0Q2hhciB9ID0gcmlnaHRJdGVyLm5leHQoKTtcbiAgICBpZiAobGVmdENoYXIgPT09IHVuZGVmaW5lZCAmJiByaWdodENoYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChsZWZ0Q2hhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiBsZWZ0IGlzIGEgcHJlZml4IG9mIHJpZ2h0LiovXG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChyaWdodENoYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLyogcmlnaHQgaXMgYSBwcmVmaXggb2YgbGVmdC4qL1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGNvbnN0IGxlZnRDb2RlcG9pbnQgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGxlZnRDaGFyLmNvZGVQb2ludEF0KDApKTtcbiAgICBjb25zdCByaWdodENvZGVwb2ludCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmlnaHRDaGFyLmNvZGVQb2ludEF0KDApKTtcbiAgICBpZiAobGVmdENvZGVwb2ludCA8IHJpZ2h0Q29kZXBvaW50KSByZXR1cm4gLTE7XG4gICAgaWYgKGxlZnRDb2RlcG9pbnQgPiByaWdodENvZGVwb2ludCkgcmV0dXJuIDE7XG4gIH1cbn07JGjNj19vbmNlLmNvbXBhcmVCeUNvZGVQb2ludHMoY29tcGFyZUJ5Q29kZVBvaW50cyk7XG5oYXJkZW4oY29tcGFyZUJ5Q29kZVBvaW50cyk7XG5cbi8qKlxuICogQ29tcGFyZSB0d28gc2FtZS10eXBlIG51bWVyaWMgdmFsdWVzLCByZXR1cm5pbmcgcmVzdWx0cyBjb25zaXN0ZW50IHdpdGhcbiAqIGBjb21wYXJlUmFua2AncyBcInJhbmsgb3JkZXJcIiAoaS5lLiwgdHJlYXRpbmcgYm90aCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgemVyb1xuICogYXMgZXF1YWwgYW5kIHBsYWNpbmcgTmFOIGFzIHNlbGYtZXF1YWwgYWZ0ZXIgYWxsIG90aGVyIG51bWJlcnMpLlxuICpcbiAqIEB0ZW1wbGF0ZSB7bnVtYmVyIHwgYmlnaW50fSBUXG4gKiBAcGFyYW0ge1R9IGxlZnRcbiAqIEBwYXJhbSB7VH0gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuICAgICAgIGNvbnN0IGNvbXBhcmVOdW1lcmljcyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG4gIGlmIChsZWZ0IDwgcmlnaHQpIHJldHVybiAtMTtcbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xuICBpZiAobGVmdCA+IHJpZ2h0KSByZXR1cm4gMTtcbiAgaWYgKE51bWJlcklzTmFOKGxlZnQpID09PSBOdW1iZXJJc05hTihyaWdodCkpIHJldHVybiAwO1xuICBpZiAoTnVtYmVySXNOYU4ocmlnaHQpKSByZXR1cm4gLTE7XG4gIGFzc2VydChOdW1iZXJJc05hTihsZWZ0KSk7XG4gIHJldHVybiAxO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPFBhc3NTdHlsZSwgeyBpbmRleDogbnVtYmVyLCBjb3ZlcjogUmFua0NvdmVyIH0+fSBQYXNzU3R5bGVSYW5rc1JlY29yZFxuICovJGjNj19vbmNlLmNvbXBhcmVOdW1lcmljcyhjb21wYXJlTnVtZXJpY3MpO1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcyA9IC8qKiBAdHlwZSB7UGFzc1N0eWxlUmFua3NSZWNvcmR9ICovIChcbiAgZnJvbUVudHJpZXMoXG4gICAgZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbiAgICAgIC8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LCBhc3N1bWluZyB0aGF0IGFsbCBwcmVmaXhlcyBhcmUqL1xuICAgICAgLyogbGltaXRlZCB0byB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIChVKzAwMDAgdGhyb3VnaCBVK0ZGRkYpIGFuZCovXG4gICAgICAvKiB0aHVzIGNvbnRhaW4gb25seSBjb2RlIHVuaXRzIHRoYXQgYXJlIGVxdWl2YWxlbnQgdG8gY29kZSBwb2ludHMuKi9cbiAgICAgIC8qIEluIHByYWN0aWNlLCB0aGV5IGFyZSBlbnRpcmVseSBwcmludGFibGUgQVNDSUkqL1xuICAgICAgLyogKDB4MjAgU1BBQ0UgdGhyb3VnaCAweDdFIFRJTERFKS4qL1xuICAgICAgLnNvcnQoKFtfbGVmdFN0eWxlLCBsZWZ0UHJlZml4ZXNdLCBbX3JpZ2h0U3R5bGUsIHJpZ2h0UHJlZml4ZXNdKSA9PiB7XG4gICAgICAgIHJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0UHJlZml4ZXMsIHJpZ2h0UHJlZml4ZXMpO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKFtwYXNzU3R5bGUsIHByZWZpeGVzXSwgaW5kZXgpID0+IHtcbiAgICAgICAgLyogVmVyaWZ5IHRoYXQgYHByZWZpeGVzYCBpcyBzb3J0ZWQsIGFuZCBjb3ZlciBhbGwgc3RyaW5ncyB0aGF0IHN0YXJ0Ki9cbiAgICAgICAgLyogd2l0aCBhbnkgb2YgaXRzIGNoYXJhY3RlcnMsIGkuZS4qL1xuICAgICAgICAvKiBhbGwgcyBzdWNoIHRoYXQgcHJlZml4ZXMuYXQoMCkg4omkIHMgPCBzdWNjZXNzb3IocHJlZml4ZXMuYXQoLTEpKS4qL1xuICAgICAgICBwcmVmaXhlcyA9PT0gcHJlZml4ZXMuc3BsaXQoJycpLnNvcnQoKS5qb2luKCcnKSB8fFxuICAgICAgICAgIEZhaWxgdW5zb3J0ZWQgcHJlZml4ZXMgZm9yIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7cShwcmVmaXhlcyl9YDtcbiAgICAgICAgY29uc3QgY292ZXIgPSBbXG4gICAgICAgICAgcHJlZml4ZXMuY2hhckF0KDApLFxuICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUocHJlZml4ZXMuY2hhckNvZGVBdChwcmVmaXhlcy5sZW5ndGggLSAxKSArIDEpLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gW3Bhc3NTdHlsZSwgeyBpbmRleCwgY292ZXIgfV07XG4gICAgICB9KSxcbiAgKVxuKTtcbnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVJhbmtzLCBudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qKlxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKlxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuICAgICAgIGNvbnN0IGdldFBhc3NTdHlsZUNvdmVyID0gcGFzc1N0eWxlID0+IHBhc3NTdHlsZVJhbmtzW3Bhc3NTdHlsZV0uY292ZXI7JGjNj19vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZCA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsUmFua0NvbXBhcmU+fVxuICovXG5jb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2VzID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhcnRpYWxDb21wYXJlfSBbY29tcGFyZVJlbW90YWJsZXNdXG4gKiBBIGNvbXBhcmF0b3IgZm9yIGFzc2lnbmluZyBhbiBpbnRlcm5hbCBvcmRlciB0byByZW1vdGFibGVzLlxuICogSXQgZGVmYXVsdHMgdG8gYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zIGBOYU5gLCBtZWFuaW5nIHRoYXQgYWxsXG4gKiByZW1vdGFibGVzIGFyZSBpbmNvbXBhcmFibGUgYW5kIHNob3VsZCB0aWUgZm9yIHRoZSBzYW1lIHJhbmsgYnlcbiAqIHNob3J0LWNpcmN1aXRpbmcgd2l0aG91dCBmdXJ0aGVyIHJlZmluZW1lbnQgKGUuZy4sIG5vdCBvbmx5IGFyZSBgcjFgIGFuZCBgcjJgXG4gKiB0aWVkLCBidXQgc28gYXJlIGBbcjEsIDBdYCBhbmQgYFtyMiwgXCJ4XCJdYCkuXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmF0b3JLaXR9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29tcGFyYXRvcktpdCA9IChjb21wYXJlUmVtb3RhYmxlcyA9IChfeCwgX3kpID0+IE5hTikgPT4ge1xuICAvKiogQHR5cGUge1BhcnRpYWxDb21wYXJlfSAqL1xuICBjb25zdCBjb21wYXJhdG9yID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgaWYgKHNhbWVWYWx1ZVplcm8obGVmdCwgcmlnaHQpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgbGVmdFN0eWxlID0gcGFzc1N0eWxlT2YobGVmdCk7XG4gICAgY29uc3QgcmlnaHRTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0KTtcbiAgICBpZiAobGVmdFN0eWxlICE9PSByaWdodFN0eWxlKSB7XG4gICAgICByZXR1cm4gY29tcGFyZU51bWVyaWNzKFxuICAgICAgICBwYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxuICAgICAgICBwYXNzU3R5bGVSYW5rc1tyaWdodFN0eWxlXS5pbmRleCxcbiAgICAgICk7XG4gICAgfVxuICAgIC8qIGVzbGludC1kaXNhYmxlIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMgLS1cbiAqIFdlIGtub3cgYGxlZnRgIGFuZCBgcmlnaHRgIGFyZSBjb21wYXJhYmxlLlxuICovXG4gICAgc3dpdGNoIChsZWZ0U3R5bGUpIHtcbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIC8qIEZvciBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIGFsbCBtZW1iZXJzIG9mIHRoYXQgcGFzc1N0eWxlIGFyZSB0aWVkKi9cbiAgICAgICAgLyogZm9yIHRoZSBzYW1lIHJhbmsuKi9cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgLyogV2l0aGluIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgdGhlIHJhbmsgb3JkZXJpbmcgYWdyZWVzIHdpdGgqL1xuICAgICAgICAvKiBKYXZhU2NyaXB0J3MgcmVsYXRpb25hbCBvcGVyYXRvcnMgYDxgIGFuZCBgPmAuKi9cbiAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgc3dpdGNoIChFTkRPX1JBTktfU1RSSU5HUykge1xuICAgICAgICAgIGNhc2UgJ3V0ZjE2LWNvZGUtdW5pdC1vcmRlcic6IHtcbiAgICAgICAgICAgIHJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3VuaWNvZGUtY29kZS1wb2ludC1vcmRlcic6IHtcbiAgICAgICAgICAgIHJldHVybiBjb21wYXJlQnlDb2RlUG9pbnRzKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnZXJyb3ItaWYtb3JkZXItY2hvaWNlLW1hdHRlcnMnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQxID0gdHJpdmlhbENvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0MiA9IGNvbXBhcmVCeUNvZGVQb2ludHMobGVmdCwgcmlnaHQpO1xuICAgICAgICAgICAgcmVzdWx0MSA9PT0gcmVzdWx0MiB8fFxuICAgICAgICAgICAgICBGYWlsYENvbXBhcmlzb25zIGRpZmZlcmVkOiAke2xlZnR9IHZzICR7cmlnaHR9LCAke3EocmVzdWx0MSl9IHZzICR7cShyZXN1bHQyKX1gO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHRocm93IEZhaWxgVW5leHBlY3RlZCBFTkRPX1JBTktfU1RSSU5HUyAke3EoRU5ET19SQU5LX1NUUklOR1MpfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKFxuICAgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbiAgICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2wocmlnaHQpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICByZXR1cm4gY29tcGFyZU51bWVyaWNzKGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIC8qIExleGljb2dyYXBoaWMgYnkgaW52ZXJzZSBzb3J0ZWQgb3JkZXIgb2YgcHJvcGVydHkgbmFtZXMsIHRoZW4qL1xuICAgICAgICAvKiBsZXhpY29ncmFwaGljIGJ5IGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoYXQgc2FtZSBpbnZlcnNlKi9cbiAgICAgICAgLyogb3JkZXIgb2YgdGhlaXIgcHJvcGVydHkgbmFtZXMuIENvbXBhcmluZyBuYW1lcyBieSB0aGVtc2VsdmVzIGZpcnN0LCovXG4gICAgICAgIC8qIGFsbCByZWNvcmRzIHdpdGggdGhlIGV4YWN0IHNhbWUgc2V0IG9mIHByb3BlcnR5IG5hbWVzIHNvcnQgbmV4dCB0byovXG4gICAgICAgIC8qIGVhY2ggb3RoZXIgaW4gYSByYW5rLXNvcnQgb2YgY29weVJlY29yZHMuKi9cblxuICAgICAgICAvKiBUaGUgY29weVJlY29yZCBpbnZhcmlhbnRzIGVuZm9yY2VkIGJ5IHBhc3NTdHlsZU9mIGVuc3VyZSB0aGF0Ki9cbiAgICAgICAgLyogYWxsIHRoZSBwcm9wZXJ0eSBuYW1lcyBhcmUgc3RyaW5ncy4gV2UgbmVlZCB0aGUgcmV2ZXJzZSBzb3J0ZWQgb3JkZXIqL1xuICAgICAgICAvKiBvZiB0aGVzZSBuYW1lcywgd2hpY2ggd2UgdGhlbiBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5LiBUaGlzIGVuc3VyZXMqL1xuICAgICAgICAvKiB0aGF0IGlmIHRoZSBuYW1lcyBvZiByZWNvcmQgWCBhcmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHJlY29yZCBZLCovXG4gICAgICAgIC8qIHRoZW4gcmVjb3JkIFggd2lsbCBoYXZlIGFuIGVhcmxpZXIgcmFuayBhbmQgc29ydCB0byB0aGUgbGVmdCBvZiBZLiovXG4gICAgICAgIGNvbnN0IGxlZnROYW1lcyA9IHJlY29yZE5hbWVzKGxlZnQpO1xuICAgICAgICBjb25zdCByaWdodE5hbWVzID0gcmVjb3JkTmFtZXMocmlnaHQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdE5hbWVzLCByaWdodE5hbWVzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVmdFZhbHVlcyA9IHJlY29yZFZhbHVlcyhsZWZ0LCBsZWZ0TmFtZXMpO1xuICAgICAgICBjb25zdCByaWdodFZhbHVlcyA9IHJlY29yZFZhbHVlcyhyaWdodCwgcmlnaHROYW1lcyk7XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnRWYWx1ZXMsIHJpZ2h0VmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLyogTGV4aWNvZ3JhcGhpYyovXG4gICAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0W2ldLCByaWdodFtpXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIHdlcmUgdGllZCwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuICAgICAgICAvKiBJZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBoYXMgYW4gZWFybGllciByYW5rIHRoYW4gWS4qL1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgLyogQnl0ZUFycmF5cyBjb21wYXJlIGJ5IHNob3J0bGV4LiovXG4gICAgICAgIC8qIC0gZmlyc3QsIGlmIHRoZXkgYXJlIG9mIHVuZXF1YWwgbGVuZ3RoLCB0aGVuIHRoZSBzaG9ydGVyIGlzIGxlc3MuKi9cbiAgICAgICAgLyogLSB0aGVuLCBhbW9uZyBieXRlQXJyYXlzIG9mIGVxdWFsIGxlbmd0aCwgYnkgbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uKi9cbiAgICAgICAgLyogb2YgdGhlaXIgYnl0ZXMgaW4gYXNjZW5kaW5nIG9yZGVyLiovXG4gICAgICAgIGNvbnN0IHsgYnl0ZUxlbmd0aDogbGVmdExlbiB9ID0gbGVmdDtcbiAgICAgICAgY29uc3QgeyBieXRlTGVuZ3RoOiByaWdodExlbiB9ID0gcmlnaHQ7XG4gICAgICAgIGlmIChsZWZ0TGVuIDwgcmlnaHRMZW4pIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlZnRMZW4gPiByaWdodExlbikge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQWNjb3VudCBmb3IgZ2FwcyBpbiB0aGUgQGVuZG8vaW1tdXRhYmxlLWFycmF5YnVmZmVyIHNoaW0uKi9cbiAgICAgICAgY29uc3QgbGVmdEFycmF5ID1cbiAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YobGVmdCkgPT09IEFycmF5QnVmZmVyLnByb3RvdHlwZVxuICAgICAgICAgICAgPyBuZXcgVWludDhBcnJheShsZWZ0KVxuICAgICAgICAgICAgOiBuZXcgVWludDhBcnJheShsZWZ0LnNsaWNlKDApKTtcbiAgICAgICAgY29uc3QgcmlnaHRBcnJheSA9XG4gICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHJpZ2h0KSA9PT0gQXJyYXlCdWZmZXIucHJvdG90eXBlXG4gICAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KHJpZ2h0KVxuICAgICAgICAgICAgOiBuZXcgVWludDhBcnJheShyaWdodC5zbGljZSgwKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVmdExlbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgbGVmdEJ5dGUgPSBsZWZ0QXJyYXlbaV07XG4gICAgICAgICAgY29uc3QgcmlnaHRCeXRlID0gcmlnaHRBcnJheVtpXTtcbiAgICAgICAgICBpZiAobGVmdEJ5dGUgPCByaWdodEJ5dGUpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGxlZnRCeXRlID4gcmlnaHRCeXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIC8qIExleGljb2dyYXBoaWMgYnkgYFtTeW1ib2wudG9TdHJpbmdUYWddYCB0aGVuIGAucGF5bG9hZGAuKi9cbiAgICAgICAgY29uc3QgbGFiZWxDb21wID0gY29tcGFyYXRvcihnZXRUYWcobGVmdCksIGdldFRhZyhyaWdodCkpO1xuICAgICAgICBpZiAobGFiZWxDb21wICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGxhYmVsQ29tcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQsIHJpZ2h0LnBheWxvYWQpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgfTtcblxuICAvKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuICBjb25zdCBvdXRlckNvbXBhcmF0b3IgPSAoeCwgeSkgPT5cbiAgICAvKiBXaGVuIHRoZSBpbm5lciBjb21wYXJhdG9yIHJldHVybnMgTmFOIHRvIGluZGljYXRlIGluY29tcGFyYWJpbGl0eSwqL1xuICAgIC8qIHJlcGxhY2UgdGhhdCB3aXRoIDAgdG8gaW5kaWNhdGUgYSB0aWUuKi9cbiAgICAvKiogQHR5cGUge0V4Y2x1ZGU8UGFydGlhbENvbXBhcmlzb24sIE5hTj59ICovIChjb21wYXJhdG9yKHgsIHkpIHx8IDApO1xuXG4gIC8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG4gIGNvbnN0IGFudGlDb21wYXJhdG9yID0gKHgsIHkpID0+IG91dGVyQ29tcGFyYXRvcih5LCB4KTtcblxuICBtZW1vT2ZTb3J0ZWQuc2V0KG91dGVyQ29tcGFyYXRvciwgbmV3IFdlYWtTZXQoKSk7XG4gIG1lbW9PZlNvcnRlZC5zZXQoYW50aUNvbXBhcmF0b3IsIG5ldyBXZWFrU2V0KCkpO1xuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChvdXRlckNvbXBhcmF0b3IsIGFudGlDb21wYXJhdG9yKTtcbiAgY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoYW50aUNvbXBhcmF0b3IsIG91dGVyQ29tcGFyYXRvcik7XG5cbiAgcmV0dXJuIGhhcmRlbih7IGNvbXBhcmF0b3I6IG91dGVyQ29tcGFyYXRvciwgYW50aUNvbXBhcmF0b3IgfSk7XG59O1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmU9fVxuICovJGjNj19vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbiAgICAgICBjb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2UgPSBjb21wYXJhdG9yID0+XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRozY9fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbiAgICAgICBjb25zdCBpc1JhbmtTb3J0ZWQgPSAocGFzc2FibGVzLCBjb21wYXJlKSA9PiB7XG4gIGNvbnN0IHN1Yk1lbW9PZlNvcnRlZCA9IG1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG4gIGFzc2VydChzdWJNZW1vT2ZTb3J0ZWQgIT09IHVuZGVmaW5lZCk7XG4gIGlmIChzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBhc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKSA9PT0gJ2NvcHlBcnJheScpO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IHBhc3NhYmxlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChjb21wYXJlKHBhc3NhYmxlc1tpIC0gMV0sIHBhc3NhYmxlc1tpXSkgPj0gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UmFua1NvcnRlZCA9IChzb3J0ZWQsIGNvbXBhcmUpID0+XG4gIGlzUmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpIHx8XG4gIC8qIFRPRE8gYXNzZXJ0IG9uIGJ1ZyBjb3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi4gRml4LiovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gIEZhaWxgTXVzdCBiZSByYW5rIHNvcnRlZDogJHtzb3J0ZWR9IHZzICR7c29ydEJ5UmFuayhzb3J0ZWQsIGNvbXBhcmUpfWA7JGjNj19vbmNlLmFzc2VydFJhbmtTb3J0ZWQoYXNzZXJ0UmFua1NvcnRlZCk7XG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG4gICAgICAgY29uc3Qgc29ydEJ5UmFuayA9IChwYXNzYWJsZXMsIGNvbXBhcmUpID0+IHtcbiAgLyoqIEB0eXBlIHtUW119IG11dGFibGUgZm9yIGluLXBsYWNlIHNvcnRpbmcsIGJ1dCB3aXRoIGhhcmRlbmVkIGVsZW1lbnRzICovXG4gIGxldCB1bnNvcnRlZDtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSkge1xuICAgIGhhcmRlbihwYXNzYWJsZXMpO1xuICAgIC8qIENhbGxpbmcgaXNSYW5rU29ydGVkIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGdldCBtZW1vaXplZCBmb3IqL1xuICAgIC8qIHRoaXMgYGNvbXBhcmVgIGZ1bmN0aW9uIGV2ZW4gaWYgaXQgd2FzIGFscmVhZHkgbWVtb2l6ZWQgZm9yIGEgZGlmZmVyZW50Ki9cbiAgICAvKiBgY29tcGFyZWAgZnVuY3Rpb24uKi9cbiAgICBpZiAoaXNSYW5rU29ydGVkKHBhc3NhYmxlcywgY29tcGFyZSkpIHtcbiAgICAgIHJldHVybiBwYXNzYWJsZXM7XG4gICAgfVxuICAgIHVuc29ydGVkID0gWy4uLnBhc3NhYmxlc107XG4gIH0gZWxzZSB7XG4gICAgdW5zb3J0ZWQgPSBBcnJheS5mcm9tKHBhc3NhYmxlcywgaGFyZGVuKTtcbiAgfVxuICBjb25zdCBzb3J0ZWQgPSB1bnNvcnRlZC5zb3J0KGNvbXBhcmUpO1xuICAvKiBGb3IgcmV2ZXJzZSBjb21wYXJpc29uLCBtb3ZlIGB1bmRlZmluZWRgIHZhbHVlcyBmcm9tIHRoZSBlbmQgdG8gdGhlIHN0YXJ0LiovXG4gIC8qIE5vdGUgdGhhdCBwYXNzU3R5bGVQcmVmaXhlcyAoQHNlZSB7QGxpbmsgLi9lbmNvZGVQYXNzYWJsZS5qc30pIE1VU1QgTk9UKi9cbiAgLyogc29ydCBhbnkgY2F0ZWdvcnkgYWZ0ZXIgYHVuZGVmaW5lZGAuKi9cbiAgaWYgKGNvbXBhcmUodHJ1ZSwgdW5kZWZpbmVkKSA+IDApIHtcbiAgICBsZXQgaSA9IHNvcnRlZC5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChpID49IDAgJiYgc29ydGVkW2ldID09PSB1bmRlZmluZWQpIGkgLT0gMTtcbiAgICBjb25zdCBuID0gc29ydGVkLmxlbmd0aCAtIGkgLSAxO1xuICAgIGlmIChuID4gMCAmJiBuIDwgc29ydGVkLmxlbmd0aCkge1xuICAgICAgc29ydGVkLmNvcHlXaXRoaW4obiwgMCk7XG4gICAgICBzb3J0ZWQuZmlsbCgvKiogQHR5cGUge1R9ICovICh1bmRlZmluZWQpLCAwLCBuKTtcbiAgICB9XG4gIH1cbiAgaGFyZGVuKHNvcnRlZCk7XG4gIGNvbnN0IHN1Yk1lbW9PZlNvcnRlZCA9IG1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG4gIGFzc2VydChzdWJNZW1vT2ZTb3J0ZWQgIT09IHVuZGVmaW5lZCk7XG4gIHN1Yk1lbW9PZlNvcnRlZC5hZGQoc29ydGVkKTtcbiAgcmV0dXJuIHNvcnRlZDtcbn07JGjNj19vbmNlLnNvcnRCeVJhbmsoc29ydEJ5UmFuayk7XG5oYXJkZW4oc29ydEJ5UmFuayk7XG5cbi8qKlxuICogU2VlXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfc2VhcmNoX2FsZ29yaXRobSNQcm9jZWR1cmVfZm9yX2ZpbmRpbmdfdGhlX2xlZnRtb3N0X2VsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcGFyYW0geyhcImxlZnRNb3N0XCIgfCBcInJpZ2h0TW9zdFwiKT19IGJpYXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJhbmtTZWFyY2ggPSAoc29ydGVkLCBjb21wYXJlLCBrZXksIGJpYXMgPSAnbGVmdE1vc3QnKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgbGV0IGxlZnQgPSAwO1xuICBsZXQgcmlnaHQgPSBzb3J0ZWQubGVuZ3RoO1xuICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7XG4gICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcbiAgICBjb25zdCBjb21wID0gY29tcGFyZShzb3J0ZWRbbV0sIGtleSk7XG4gICAgaWYgKGNvbXAgPD0gLTEgfHwgKGNvbXAgPT09IDAgJiYgYmlhcyA9PT0gJ3JpZ2h0TW9zdCcpKSB7XG4gICAgICBsZWZ0ID0gbSArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChjb21wID49IDEgfHwgKGNvbXAgPT09IDAgJiYgYmlhcyA9PT0gJ2xlZnRNb3N0JykpO1xuICAgICAgcmlnaHQgPSBtO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYmlhcyA9PT0gJ2xlZnRNb3N0JyA/IGxlZnQgOiByaWdodCAtIDE7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuICAgICAgIGNvbnN0IGdldEluZGV4Q292ZXIgPSAoc29ydGVkLCBjb21wYXJlLCBbbGVmdEtleSwgcmlnaHRLZXldKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgY29uc3QgbGVmdEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIGxlZnRLZXksICdsZWZ0TW9zdCcpO1xuICBjb25zdCByaWdodEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIHJpZ2h0S2V5LCAncmlnaHRNb3N0Jyk7XG4gIHJldHVybiBbbGVmdEluZGV4LCByaWdodEluZGV4XTtcbn07JGjNj19vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qKiBAdHlwZSB7UmFua0NvdmVyfSAqL1xuICAgICAgIGNvbnN0IEZ1bGxSYW5rQ292ZXIgPSBoYXJkZW4oWycnLCAneyddKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqLyRozY9fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuICAgICAgIGNvbnN0IGNvdmVyZWRFbnRyaWVzID0gKHNvcnRlZCwgW2xlZnRJbmRleCwgcmlnaHRJbmRleF0pID0+IHtcbiAgLyoqIEB0eXBlIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fSAqL1xuICBjb25zdCBpdGVyYWJsZSA9IGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gbGVmdEluZGV4O1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAoaSA8PSByaWdodEluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc29ydGVkW2ldO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlOiBbaSwgZWxlbWVudF0sIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1R9IGFcbiAqIEBwYXJhbSB7VH0gYlxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0IG1heFJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPj0gMCA/IGEgOiBiKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1R9IGFcbiAqIEBwYXJhbSB7VH0gYlxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0IG1pblJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPD0gMCA/IGEgOiBiKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbiAgICAgICBjb25zdCB1bmlvblJhbmtDb3ZlcnMgPSAoY29tcGFyZSwgY292ZXJzKSA9PiB7XG4gIC8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG4gIGNvbnN0IHVuaW9uUmFua0NvdmVyUGFpciA9IChbbGVmdEEsIHJpZ2h0QV0sIFtsZWZ0QiwgcmlnaHRCXSkgPT4gW1xuICAgIG1pblJhbmsoY29tcGFyZSwgbGVmdEEsIGxlZnRCKSxcbiAgICBtYXhSYW5rKGNvbXBhcmUsIHJpZ2h0QSwgcmlnaHRCKSxcbiAgXTtcbiAgcmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLCBbJ3snLCAnJ10pO1xufTskaM2PX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbiAgICAgICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJzID0gKGNvbXBhcmUsIGNvdmVycykgPT4ge1xuICAvKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyID0gKFtsZWZ0QSwgcmlnaHRBXSwgW2xlZnRCLCByaWdodEJdKSA9PiBbXG4gICAgbWF4UmFuayhjb21wYXJlLCBsZWZ0QSwgbGVmdEIpLFxuICAgIG1pblJhbmsoY29tcGFyZSwgcmlnaHRBLCByaWdodEIpLFxuICBdO1xuICByZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLCBbJycsICd7J10pO1xufTskaM2PX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuICAgICAgIGNvbnN0IHsgY29tcGFyYXRvcjogY29tcGFyZVJhbmssIGFudGlDb21wYXJhdG9yOiBjb21wYXJlQW50aVJhbmsgfSA9XG4gIG1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29tcGFyYXRvciBraXQgaW4gd2hpY2ggcmVtb3RhYmxlcyBhcmUgZnVsbHkgb3JkZXJlZFxuICogYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGZpcnN0IHNlZW4gYnkgKnRoaXMqIGNvbXBhcmF0b3Iga2l0LlxuICogQkVXQVJFOiBUaGlzIGlzIG9ic2VydmFibGUgbXV0YWJsZSBzdGF0ZSwgc28gc3VjaCBhIGNvbXBhcmF0b3Iga2l0XG4gKiBzaG91bGQgbmV2ZXIgYmUgc2hhcmVkIGFtb25nIHN1YnN5c3RlbXMgdGhhdCBzaG91bGQgbm90IGJlIGFibGVcbiAqIHRvIGNvbW11bmljYXRlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG9yZGVyIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3Igc3RvcmVcbiAqIG9yZGVyaW5nLCBzaW5jZSBpdCBoYXMgbm8gbWVtb3J5IG9mIGRlbGV0ZWQga2V5cy5cbiAqXG4gKiBUaGVzZSBmdWxsIG9yZGVyIGNvbXBhcmF0b3Iga2l0IGlzIHN0cmljdGx5IG1vcmUgcHJlY2lzZSB0aGF0IHRoZVxuICogcmFuayBvcmRlciBjb21wYXJhdG9yIGtpdHMgYWJvdmUuIEFzIGEgcmVzdWx0LCBhbnkgYXJyYXkgd2hpY2ggaXNcbiAqIHNvcnRlZCBieSBzdWNoIGEgZnVsbCBvcmRlciB3aWxsIHBhc3MgdGhlIGlzUmFua1NvcnRlZCB0ZXN0IHdpdGhcbiAqIGEgY29ycmVzcG9uZGluZyByYW5rIG9yZGVyLlxuICpcbiAqIEFuIGFycmF5IHdoaWNoIGlzIHNvcnRlZCBieSBhICpmcmVzaCogZnVsbCBvcmRlciBjb21wYXJhdG9yLCBpLmUuLFxuICogb25lIHRoYXQgaGFzIG5vdCB5ZXQgc2VlbiBhbnkgcmVtb3RhYmxlcywgd2lsbCBvZiBjb3Vyc2UgcmVtYWluXG4gKiBzb3J0ZWQgYnkgYWNjb3JkaW5nIHRvICp0aGF0KiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IuIEFuIGFycmF5ICpvZlxuICogc2NhbGFycyogc29ydGVkIGJ5IGEgZnJlc2ggZnVsbCBvcmRlciB3aWxsIHJlbWFpbiBzb3J0ZWQgZXZlblxuICogYWNjb3JkaW5nIHRvIGEgbmV3IGZyZXNoIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgc2luY2UgaXQgd2lsbCBzZWVcbiAqIHRoZSByZW1vdGFibGVzIGluIHRoZSBzYW1lIG9yZGVyIGFnYWluLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzXG4gKiBub3QgdHJ1ZSBvZiBhcnJheXMgb2YgcGFzc2FibGVzIGluIGdlbmVyYWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFuPX0gbG9uZ0xpdmVkXG4gKiBAcmV0dXJucyB7RnVsbENvbXBhcmF0b3JLaXR9XG4gKi8kaM2PX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRozY9fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbiAgICAgICBjb25zdCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9IChsb25nTGl2ZWQgPSBmYWxzZSkgPT4ge1xuICBsZXQgbnVtU2VlbiA9IDA7XG4gIC8qIFdoZW4gZHluYW1pY2FsbHkgY3JlYXRlZCB3aXRoIHNob3J0IGxpZmV0aW1lcyAodGhlIGRlZmF1bHQpIGEgV2Vha01hcCovXG4gIC8qIHdvdWxkIHBlcmZvcm0gcG9vcmx5LCBhbmQgdGhlIGxlYWsgY3JlYXRlZCBieSBhIE1hcCBvbmx5IGxhc3RzIGFzIGxvbmcqL1xuICAvKiBhcyB0aGUgTWFwLiovXG4gIGNvbnN0IE1hcENvbnN0cnVjdG9yID0gbG9uZ0xpdmVkID8gV2Vha01hcCA6IE1hcDtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuICBjb25zdCB0YWcgPSByID0+IHtcbiAgICBpZiAoc2Vlbi5oYXMocikpIHtcbiAgICAgIHJldHVybiBzZWVuLmdldChyKTtcbiAgICB9XG4gICAgbnVtU2VlbiArPSAxO1xuICAgIHNlZW4uc2V0KHIsIG51bVNlZW4pO1xuICAgIHJldHVybiBudW1TZWVuO1xuICB9O1xuICBjb25zdCBjb21wYXJlUmVtb3RhYmxlcyA9ICh4LCB5KSA9PiBjb21wYXJlUmFuayh0YWcoeCksIHRhZyh5KSk7XG4gIHJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG59OyRozY9fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29tcGFyZUJ5Q29kZVBvaW50cyI6WyJjb21wYXJlQnlDb2RlUG9pbnRzIl0sImNvbXBhcmVOdW1lcmljcyI6WyJjb21wYXJlTnVtZXJpY3MiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4xDdI0kMAABJDAAAHQAAAEBlbmRvL25hdC12NS4xLjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsJ25hbWUnLHt2YWx1ZTpcImlzTmF0XCJ9KTskaM2PX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsJ25hbWUnLHt2YWx1ZTpcIk5hdFwifSk7JGjNj19vbmNlLk5hdChOYXQpOy8qIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiovXG4vKiBDb3B5cmlnaHQgKEMpIDIwMTggQWdvcmljKi9cbi8qKi9cbi8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ki9cbi8qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4qL1xuLyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ki9cbi8qKi9cbi8qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCovXG4vKiovXG4vKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlKi9cbi8qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywqL1xuLyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuKi9cbi8qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQqL1xuLyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuKi9cblxuLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBJcyBgYWxsZWdlZE51bWAgYSBudW1iZXIgaW4gdGhlIFtjb250aWd1b3VzIHJhbmdlIG9mIGV4YWN0bHkgYW5kXG4gKiB1bmFtYmlndW91c2x5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiAgbmF0dXJhbCBudW1iZXJzIChub24tbmVnYXRpdmUgaW50ZWdlcnMpP1xuICpcbiAqIFRvIHF1YWxpZnkgYGFsbGVnZWROdW1gIG11c3QgZWl0aGVyIGJlIGFcbiAqIG5vbi1uZWdhdGl2ZSBgYmlnaW50YCwgb3IgYSBub24tbmVnYXRpdmUgYG51bWJlcmAgcmVwcmVzZW50aW5nIGFuIGludGVnZXJcbiAqIHdpdGhpbiByYW5nZSBvZiBbaW50ZWdlcnMgc2FmZWx5IHJlcHJlc2VudGFibGUgaW5cbiAqIGZsb2F0aW5nIHBvaW50XShodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc3NhZmVpbnRlZ2VyKS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKSB7XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gYWxsZWdlZE51bSA+PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkgJiYgYWxsZWdlZE51bSA+PSAwO1xufVxuXG4vKipcbiAqIElmIGBhbGxlZ2VkTnVtYmVyYCBwYXNzZXMgdGhlIGBpc05hdGAgdGVzdCwgdGhlbiByZXR1cm4gaXQgYXMgYSBiaWdpbnQuXG4gKiBPdGhlcndpc2UgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gKlxuICogSWYgYGFsbGVnZWROdW1gIGlzIG5laXRoZXIgYSBiaWdpbnQgbm9yIGEgbnVtYmVyLCBgTmF0YCB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaXMgbm90IGEgW3NhZmVseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXIsIGBOYXRgIHRocm93cyBhIGBSYW5nZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaXQgaXMgY29udmVydGVkIHRvIGEgYmlnaW50IGlmIG5lY2Vzc2FyeSBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSkge1xuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdiaWdpbnQnKSB7XG4gICAgaWYgKGFsbGVnZWROdW0gPCAwbikge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuICAgIH1cbiAgICByZXR1cm4gYWxsZWdlZE51bTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuICAgIH1cbiAgICBpZiAoYWxsZWdlZE51bSA8IDApIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiAgfVxuXG4gIHRocm93IFR5cGVFcnJvcihcbiAgICBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCxcbiAgKTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzTmF0IjpbImlzTmF0Il0sIk5hdCI6WyJOYXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbm7eczYLAAA2CwAAIAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvZXJyb3IuanMiLCIuL3NyYy9yZW1vdGFibGUuanMiLCIuL3NyYy9zeW1ib2wuanMiLCIuL3NyYy9zdHJpbmcuanMiLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhciIsIkZhciIsImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIiwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiLCJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIiwiaXNPYmplY3QiLCJpc09iamVjdCIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvaXRlci1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXJyb3IuanNcIiwgW11dLFtcIi4vc3JjL3JlbW90YWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvc3ltYm9sLmpzXCIsIFtdXSxbXCIuL3NyYy9zdHJpbmcuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZU9mLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlVGFnZ2VkLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlLWZhci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2l0ZXItaGVscGVycy5qcyI6W1sibWFwSXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLFsiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSJdXSwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOltbIlBBU1NfU1RZTEUiLCJQQVNTX1NUWUxFIl0sWyJpc09iamVjdCIsImlzT2JqZWN0Il0sWyJpc1ByaW1pdGl2ZSIsImlzUHJpbWl0aXZlIl0sWyJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q2hlY2tlciJdLFsiZ2V0VGFnIiwiZ2V0VGFnIl0sWyJoYXNPd25Qcm9wZXJ0eU9mIiwiaGFzT3duUHJvcGVydHlPZiJdXSwiLi9zcmMvZXJyb3IuanMiOltbImdldEVycm9yQ29uc3RydWN0b3IiLCJnZXRFcnJvckNvbnN0cnVjdG9yIl0sWyJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIl1dLCIuL3NyYy9yZW1vdGFibGUuanMiOltbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXSxbImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIiwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiXV0sIi4vc3JjL3N5bWJvbC5qcyI6W1siYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLFsiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiXSxbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLFsicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sWyJ1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIl1dLCIuL3NyYy9zdHJpbmcuanMiOltbImlzV2VsbEZvcm1lZFN0cmluZyIsImlzV2VsbEZvcm1lZFN0cmluZyJdLFsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciXSxbImFzc2VydFBhc3NhYmxlU3RyaW5nIiwiYXNzZXJ0UGFzc2FibGVTdHJpbmciXV0sIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjpbWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl0sWyJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZSJdLFsiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSJdLFsidG9QYXNzYWJsZUVycm9yIiwidG9QYXNzYWJsZUVycm9yIl0sWyJ0b1Rocm93YWJsZSIsInRvVGhyb3dhYmxlIl1dLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIjpbWyJtYWtlVGFnZ2VkIiwibWFrZVRhZ2dlZCJdXSwiLi9zcmMvbWFrZS1mYXIuanMiOltbIlJlbW90YWJsZSIsIlJlbW90YWJsZSJdLFsiRmFyIiwiRmFyIl0sWyJUb0ZhckZ1bmN0aW9uIiwiVG9GYXJGdW5jdGlvbiJdLFsiR0VUX01FVEhPRF9OQU1FUyIsIkdFVF9NRVRIT0RfTkFNRVMiXV0sIi4vc3JjL3R5cGVHdWFyZHMuanMiOltbImFzc2VydFJlY29yZCIsImFzc2VydFJlY29yZCJdLFsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5Il0sWyJhc3NlcnRSZW1vdGFibGUiLCJhc3NlcnRSZW1vdGFibGUiXSxbImlzUmVtb3RhYmxlIiwiaXNSZW1vdGFibGUiXSxbImlzUmVjb3JkIiwiaXNSZWNvcmQiXSxbImlzQ29weUFycmF5IiwiaXNDb3B5QXJyYXkiXSxbImlzQXRvbSIsImlzQXRvbSJdLFsiYXNzZXJ0QXRvbSIsImFzc2VydEF0b20iXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE6FbiMVDQAAFQ0AACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvYnl0ZUFycmF5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIkJ5dGVBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NTdHlsZUhlbHBlcn0gZnJvbSAnLi9pbnRlcm5hbC10eXBlcy5qcyc7XG4gKi9cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMsIGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vKiBEZXRlY3RzIHRoZSBwcmVzZW5jZSBvZiBhIGltbXV0YWJsZSBBcnJheUJ1ZmZlciBzdXBwb3J0IGluIHRoZSB1bmRlcmx5aW5nKi9cbi8qIHBsYXRmb3JtIGFuZCBwcm92aWRlcyBlaXRoZXIgc3VpdGFibGUgdmFsdWVzIGZyb20gdGhhdCBpbXBsZW1lbnRhdGlvbiBvciovXG4vKiB2YWx1ZXMgdGhhdCB3aWxsIGNvbnNpc3RlbnRseSBkZW55IHRoYXQgaW1tdXRhYmxlIEFycmF5QnVmZmVycyBleGlzdC4qL1xuY29uc3QgYWRhcHRJbW11dGFibGVBcnJheUJ1ZmZlciA9ICgpID0+IHtcbiAgY29uc3QgYW5BcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcblxuICAvKiBPbiBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBzbGljZVRvSW1tdXRhYmxlLCBwYXNzLXN0eWxlIGJ5dGVBcnJheSovXG4gIC8qIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZC4qL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIFRPRE8gVGhpcyBlcnJvciB3aWxsIGJlIGFkZHJlc3NlZCB3aGVuIHVwZGF0aW5nKi9cbiAgLyogVHlwZVNjcmlwdCdzIG5hdGl2ZSB0eXBlcyB0byBhIHZlcnNpb24gcmVjb2duaXppbmcgdGhlIHVwY29taW5nIHN0YW5kYXJkLiovXG4gIGlmIChhbkFycmF5QnVmZmVyLnNsaWNlVG9JbW11dGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZTogbnVsbCxcbiAgICAgIGltbXV0YWJsZUdldHRlcjogKCkgPT4gZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgVE9ETyBUaGlzIGVycm9yIHdpbGwgYmUgYWRkcmVzc2VkIHdoZW4gdXBkYXRpbmcqL1xuICAvKiBUeXBlU2NyaXB0J3MgbmF0aXZlIHR5cGVzIHRvIGEgdmVyc2lvbiByZWNvZ25pemluZyB0aGUgdXBjb21pbmcgc3RhbmRhcmQuKi9cbiAgY29uc3QgYW5JbW11dGFibGVBcnJheUJ1ZmZlciA9IGFuQXJyYXlCdWZmZXIuc2xpY2VUb0ltbXV0YWJsZSgpO1xuXG4gIC8qKlxuICogQXMgcHJvcG9zZWQsIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyBgQXJyYXlCdWZmZXIucHJvdG90eXBlYC4gQXMgc2hpbW1lZCxcbiAqIHRoaXMgd2lsbCBiZSBhIGhpZGRlbiBpbnRyaW5zaWMgdGhhdCBpbmhlcml0cyBmcm9tIGBBcnJheUJ1ZmZlci5wcm90b3R5cGVgLlxuICogRWl0aGVyIHdheSwgZ2V0IHRoaXMgaW4gYSB3YXkgdGhhdCB3ZSBjYW4gdHJ1c3QgaXQgYWZ0ZXIgbG9ja2Rvd24sIGFuZFxuICogcmVxdWlyZSB0aGF0IGFsbCBpbW11dGFibGUgQXJyYXlCdWZmZXJzIGRpcmVjdGx5IGluaGVyaXQgZnJvbSBpdC5cbiAqL1xuICBjb25zdCBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGFuSW1tdXRhYmxlQXJyYXlCdWZmZXIpO1xuXG4gIGNvbnN0IGltbXV0YWJsZUdldHRlciA9IC8qKiBAdHlwZSB7KHRoaXM6IEFycmF5QnVmZmVyKSA9PiBib29sZWFufSAqLyAoXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IHRoZSBkZXNjaXB0b3IgaXMgdGhlcmUuKi9cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUsICdpbW11dGFibGUnKS5nZXRcbiAgKTtcblxuICByZXR1cm4geyBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSwgaW1tdXRhYmxlR2V0dGVyIH07XG59O1xuXG5jb25zdCB7IGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlLCBpbW11dGFibGVHZXR0ZXIgfSA9XG4gIGFkYXB0SW1tdXRhYmxlQXJyYXlCdWZmZXIoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG4gICAgICAgY29uc3QgQnl0ZUFycmF5SGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAnYnl0ZUFycmF5JyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT5cbiAgICAoY2FuZGlkYXRlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgJiZcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgVE9ETyBIb3cgZG8gSSBhZGQgaXQgdG8gdGhlIEFycmF5QnVmZmVyIHR5cGU/Ki9cbiAgICAgIGNhbmRpZGF0ZS5pbW11dGFibGUpIHx8XG4gICAgKCEhY2hlY2sgJiYgY2hlY2soZmFsc2UsIFhgSW1tdXRhYmxlIEFycmF5QnVmZmVyIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSksXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBfcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkgPT09IGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlIHx8XG4gICAgICBhc3NlcnQuZmFpbChYYE1hbGZvcm1lZCBCeXRlQXJyYXkgJHtjYW5kaWRhdGV9YCwgVHlwZUVycm9yKTtcbiAgICBhcHBseShpbW11dGFibGVHZXR0ZXIsIGNhbmRpZGF0ZSwgW10pIHx8XG4gICAgICBGYWlsYE11c3QgYmUgYW4gaW1tdXRhYmxlIEFycmF5QnVmZmVyOiAke2NhbmRpZGF0ZX1gO1xuICAgIG93bktleXMoY2FuZGlkYXRlKS5sZW5ndGggPT09IDAgfHxcbiAgICAgIGFzc2VydC5mYWlsKFxuICAgICAgICBYYEJ5dGVBcnJheXMgbXVzdCBub3QgaGF2ZSBvd24gcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCxcbiAgICAgICAgVHlwZUVycm9yLFxuICAgICAgKTtcbiAgfSxcbn0pOyRozY9fb25jZS5CeXRlQXJyYXlIZWxwZXIoQnl0ZUFycmF5SGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJ5dGVBcnJheUhlbHBlciI6WyJCeXRlQXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmae90ggIAAAICAAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsYXNzZXJ0Q2hlY2tlcixnZXRPd25EYXRhRGVzY3JpcHRvcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5LCBwcm90b3R5cGU6IGFycmF5UHJvdG90eXBlIH0gPSBBcnJheTtcblxuLyoqXG4gKlxuICogQHR5cGUge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IENvcHlBcnJheUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2NvcHlBcnJheScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gICAgaXNBcnJheShjYW5kaWRhdGUpIHx8XG4gICAgKCEhY2hlY2sgJiYgY2hlY2soZmFsc2UsIFhgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBhcnJheVByb3RvdHlwZSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBNYWxmb3JtZWQgYXJyYXk6ICR7Y2FuZGlkYXRlfWAsIFR5cGVFcnJvcik7XG4gICAgLyogU2luY2Ugd2UncmUgYWxyZWFkeSBlbnN1cmVkIGNhbmRpZGF0ZSBpcyBhbiBhcnJheSwgaXQgc2hvdWxkIG5vdCBiZSovXG4gICAgLyogcG9zc2libGUgZm9yIHRoZSBmb2xsb3dpbmcgZ2V0IHRvIGZhaWwuKi9cbiAgICBjb25zdCBsZW4gPSAvKiogQHR5cGUge251bWJlcn0gKi8gKFxuICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCAnbGVuZ3RoJywgZmFsc2UsIGFzc2VydENoZWNrZXIpLnZhbHVlXG4gICAgKTtcbiAgICAvKiBWYWxpZGF0ZSB0aGF0IGVhY2ggaW5kZXggcHJvcGVydHkgaXMgb3duL2RhdGEvZW51bWVyYWJsZSovXG4gICAgLyogYW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlIGlzIHJlY3Vyc2l2ZWx5IHBhc3NhYmxlLiovXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgcGFzc1N0eWxlT2ZSZWN1cihcbiAgICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCBpLCB0cnVlLCBhc3NlcnRDaGVja2VyKS52YWx1ZSxcbiAgICAgICk7XG4gICAgfVxuICAgIC8qIEV4cGVjdCBvbmUga2V5IHBlciBpbmRleCBwbHVzIG9uZSBmb3IgJ2xlbmd0aCcuKi9cbiAgICBvd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoID09PSBsZW4gKyAxIHx8XG4gICAgICBhc3NlcnQuZmFpbChYYEFycmF5cyBtdXN0IG5vdCBoYXZlIG5vbi1pbmRleGVzOiAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICB9LFxufSk7JGjNj19vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABHL7odZwsAAGcLAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiQ29weVJlY29yZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydENoZWNrZXIsZ2V0T3duRGF0YURlc2NyaXB0b3IsQ1gsY2FuQmVNZXRob2Q7JGjNj19pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiY2FuQmVNZXRob2RcIixbJGjNj19hID0+IChjYW5CZU1ldGhvZCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja09iamVjdFByb3RvdHlwZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIHJldHVybiAoXG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge1Byb3BlcnR5S2V5fSBrZXlcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja1Byb3BlcnR5Q2FuQmVWYWxpZCA9IChjYW5kaWRhdGUsIGtleSwgdmFsdWUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIHJldHVybiAoXG4gICAgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBSZWNvcmRzIGNhbiBvbmx5IGhhdmUgc3RyaW5nLW5hbWVkIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICghY2FuQmVNZXRob2QodmFsdWUpIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICAvKiBUT0RPOiBVcGRhdGUgbWVzc2FnZSBub3cgdGhhdCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIFwiaW1wbGljaXQgUmVtb3RhYmxlXCIuKi9cbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSlcbiAgKTtcbn07XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBDb3B5UmVjb3JkSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAnY29weVJlY29yZCcsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hlY2tPYmplY3RQcm90b3R5cGUoY2FuZGlkYXRlLCBjaGVjaykgJiZcbiAgICAgIC8qIFJlamVjdCBhbnkgY2FuZGlkYXRlIHdpdGggYSBzeW1ib2wta2V5ZWQgcHJvcGVydHkgb3IgbWV0aG9kLWxpa2UgcHJvcGVydHkqL1xuICAgICAgLyogKHN1Y2ggaW5wdXQgaXMgcG90ZW50aWFsbHkgYSBSZW1vdGFibGUpLiovXG4gICAgICBvd25LZXlzKGNhbmRpZGF0ZSkuZXZlcnkoa2V5ID0+XG4gICAgICAgIGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkKGNhbmRpZGF0ZSwga2V5LCBjYW5kaWRhdGVba2V5XSwgY2hlY2spLFxuICAgICAgKVxuICAgICk7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgLyogVmFsaWRhdGUgdGhhdCBlYWNoIG93biBwcm9wZXJ0eSBoYXMgYSByZWN1cnNpdmVseSBwYXNzYWJsZSBhc3NvY2lhdGVkKi9cbiAgICAvKiB2YWx1ZSAod2UgYWxyZWFkeSBrbm93IGZyb20gY2FuQmVWYWxpZCB0aGF0IHRoZSBvdGhlciBjb25zdHJhaW50cyBhcmUqL1xuICAgIC8qIHNhdGlzZmllZCkuKi9cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKSB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBnZXRPd25EYXRhRGVzY3JpcHRvcihcbiAgICAgICAgY2FuZGlkYXRlLFxuICAgICAgICBuYW1lLFxuICAgICAgICB0cnVlLFxuICAgICAgICBhc3NlcnRDaGVja2VyLFxuICAgICAgKTtcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpO1xuICAgIH1cbiAgfSxcbn0pOyRozY9fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ46wtPYGQAA2BkAAC4AAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxLEUsaXNQcm9taXNlLGdldFRhZyxwYXNzU3R5bGVPZixtYWtlVGFnZ2VkLGlzQXRvbTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiLi9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiaXNBdG9tXCIsWyRozY9fYSA9PiAoaXNBdG9tID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVCcmFuZH0gZnJvbSAnQGVuZG8vZXZlbnR1YWwtc2VuZCc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgQnl0ZUFycmF5LCBDb3B5UmVjb3JkLCBDb3B5QXJyYXksIENvcHlUYWdnZWQsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQ3VycmVudGx5IGNvcGllZCBmcm9tIEBhZ29yaWMvaW50ZXJuYWwgdXRpbHMuanMuXG4gKiBUT0RPIFNob3VsZCBtaWdyYXRlIGhlcmUgYW5kIHRoZW4sIGlmIG5lZWRlZCwgcmVleHBvcnRlZCB0aGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3sgW0tleVR5cGUgaW4ga2V5b2YgVF06IFRbS2V5VHlwZV0gfSAmIHt9fSBTaW1wbGlmeSBmbGF0dGVuIHRoZVxuICogICB0eXBlIG91dHB1dCB0byBpbXByb3ZlIHR5cGUgaGludHMgc2hvd24gaW4gZWRpdG9yc1xuICogICBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3NpbXBsaWZ5LmQudHNcbiAqL1xuXG4vKipcbiAqIEN1cnJlbnRseSBjb3BpZWQgZnJvbSBAYWdvcmljL2ludGVybmFsIHV0aWxzLmpzLlxuICogVE9ETyBTaG91bGQgbWlncmF0ZSBoZXJlIGFuZCB0aGVuLCBpZiBuZWVkZWQsIHJlZXhwb3J0ZWQgdGhlcmUuXG4gKlxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQ3VycmVudGx5IGNvcGllZCBmcm9tIEBhZ29yaWMvaW50ZXJuYWwgdXRpbHMuanMuXG4gKiBUT0RPIFNob3VsZCBtaWdyYXRlIGhlcmUgYW5kIHRoZW4sIGlmIG5lZWRlZCwgcmVleHBvcnRlZCB0aGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIENhbGxhYmxlID8gVFtLXSA6IERlZXBseUF3YWl0ZWQ8VFtLXT47XG4gKiB9fSBEZWVwbHlBd2FpdGVkT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBDdXJyZW50bHkgY29waWVkIGZyb20gQGFnb3JpYy9pbnRlcm5hbCB1dGlscy5qcy5cbiAqIFRPRE8gU2hvdWxkIG1pZ3JhdGUgaGVyZSBhbmQgdGhlbiwgaWYgbmVlZGVkLCByZWV4cG9ydGVkIHRoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzIFByb21pc2VMaWtlPGFueT5cbiAqICAgICA/IEF3YWl0ZWQ8VD5cbiAqICAgICA6IFQgZXh0ZW5kcyAoUmVtb3RhYmxlQnJhbmQ8YW55LCBhbnk+IHwgUmVtb3RhYmxlT2JqZWN0KVxuICogICAgICAgPyBUXG4gKiAgICAgICA6IFQgZXh0ZW5kcyB7fVxuICogICAgICAgICA/IFNpbXBsaWZ5PERlZXBseUF3YWl0ZWRPYmplY3Q8VD4+XG4gKiAgICAgICAgIDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogR2l2ZW4gYSBQYXNzYWJsZSBgdmFsYCB3aG9zZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIG1heSBjb250YWluIGxlYWZcbiAqIHByb21pc2VzLCByZXR1cm4gYSBwcm9taXNlIGZvciBhIHJlcGxhY2VtZW50IFBhc3NhYmxlLFxuICogd2hlcmUgdGhhdCByZXBsYWNlbWVudCBpcyAqZGVlcGx5IGZ1bGZpbGxlZCosIGkuZS4sIGl0c1xuICogcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFueSBwcm9taXNlcy5cbiAqXG4gKiBUaGlzIGlzIGEgZGVlcCBmb3JtIG9mIGBQcm9taXNlLmFsbGAgc3BlY2lhbGl6ZWQgZm9yIFBhc3NhYmxlcy4gRm9yIGVhY2hcbiAqIGVuY291bnRlcmVkIHByb21pc2UsIHJlcGxhY2UgaXQgd2l0aCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtIG9mXG4gKiBpdHMgZnVsZmlsbG1lbnQuXG4gKiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIHJlamVjdCwgdGhlbiB0aGUgcHJvbWlzZSBmb3IgdGhlIHJlcGxhY2VtZW50XG4gKiByZWplY3RzLiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIG5ldmVyIHNldHRsZSwgdGhlbiB0aGUgcHJvbWlzZSBmb3JcbiAqIHRoZSByZXBsYWNlbWVudCBuZXZlciBzZXR0bGVzLlxuICpcbiAqIElmIHRoZSByZXBsYWNlbWVudCB3b3VsZCBub3QgYmUgUGFzc2FibGUsIGkuZS4sIGlmIGB2YWxgIGlzIG5vdFxuICogUGFzc2FibGUsIG9yIGlmIGFueSBvZiB0aGUgdHJhbnNpdGl2ZSBwcm9taXNlcyBmdWxmaWxsIHRvIHNvbWV0aGluZ1xuICogdGhhdCBpcyBub3QgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIHByb21pc2UgcmVqZWN0cy5cbiAqXG4gKiBJZiBgdmFsYCBvciBpdHMgcGFydHMgYXJlIG5vbi1rZXkgUGFzc2FibGVzIG9ubHkgKmJlY2F1c2UqIHRoZXkgY29udGFpblxuICogcHJvbWlzZXMsIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm1zIG9mIHZhbCBvciBpdHMgcGFydHMgbWF5IGJlIGtleXMuIFRoaXNcbiAqIGlzIGZvciB0aGUgaGlnaGVyIFwiQGVuZG8vcGF0dGVybnNcIiBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0byBkZXRlcm1pbmUsXG4gKiBiZWNhdXNlIGl0IGRlZmluZXMgdGhlIGBLZXlgIG5vdGlvbiBpbiBxdWVzdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVD1QYXNzYWJsZV1cbiAqIEBwYXJhbSB7VH0gdmFsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxEZWVwbHlBd2FpdGVkPFQ+Pn1cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBseUZ1bGZpbGxlZCA9IGFzeW5jIHZhbCA9PiB7XG4gIC8qIFRPRE8gRmlndXJlIG91dCB3aHkgd2UgbmVlZCB0aGVzZSBhdC1leHBlY3QtZXJyb3IgZGlyZWN0aXZlcyBiZWxvdyovXG4gIC8qIGFuZCBmaXggaWYgcG9zc2libGUuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xMjU3IG1heSBiZSByZWxldmFudC4qL1xuXG4gIC8qIElmIGB2YWxgIGlzIG5vdCBQYXNzYWJsZSwgYGlzQXRvbWAgd2lsbCByZXR1cm4gZmFsc2UgcmF0aGVyIHRoYW4qL1xuICAvKiB0aHJvd2luZy4qL1xuICBpZiAoaXNBdG9tKHZhbCkpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtEZWVwbHlBd2FpdGVkPFQ+fSAqLyAodmFsKTtcbiAgfVxuICAvKiBpZiBgdmFsYCBpcyBhIHByb21pc2UgYnV0IG5vdCBhIHBhc3NhYmxlIHByb21pc2UsIGZvciBleGFtcGxlLCovXG4gIC8qIGJlY2F1c2UgaXQgaXMgbm90IGhhcmRlbmVkLCBgaXNQcm9taXNlYCB3aWxsIHJldHVybiB0cnVlLCB3aGljaCBpcyovXG4gIC8qIG9rIGhlcmUgYmFjYXVzZSB3ZSB1bndyYXAgaXQgdG8gaXRzIHNldHRsZW1lbnQgYW5kIGRpc3BlbnNlIHdpdGggdGhlKi9cbiAgLyogcHJvbWlzZSovXG4gIGlmIChpc1Byb21pc2UodmFsKSkge1xuICAgIHJldHVybiBFLndoZW4odmFsLCBub25wID0+IGRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gIH1cbiAgLyogSWYgYHZhbGAgaXMgYW55IG90aGVyIG5vbi1QYXNzYWJsZSwgdGhlIGBwYXNzU3R5bGVPZih2YWwpYCB3aWxsIHRocm93LiovXG4gIC8qIFNvIHRoaXMgZXhlbXB0aW9uIGZvciBub24tUGFzc2FibGUgcHJvbWlzZXMgaXMgb25seSBmb3IgdGhlIHRvcC1sZXZlbC4qL1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICBjb25zdCByZWMgPSAvKiogQHR5cGUge0NvcHlSZWNvcmR9ICovICh2YWwpO1xuICAgICAgY29uc3QgbmFtZXMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAob3duS2V5cyhyZWMpKTtcbiAgICAgIGNvbnN0IHZhbFBzID0gbmFtZXMubWFwKG5hbWUgPT4gZGVlcGx5RnVsZmlsbGVkKHJlY1tuYW1lXSkpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwgdmFscyA9PlxuICAgICAgICBoYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsIGkpID0+IFtuYW1lc1tpXSwgY10pKSksXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICBjb25zdCBhcnIgPSAvKiogQHR5cGUge0NvcHlBcnJheX0gKi8gKHZhbCk7XG4gICAgICBjb25zdCB2YWxQcyA9IGFyci5tYXAocCA9PiBkZWVwbHlGdWxmaWxsZWQocCkpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwgdmFscyA9PiBoYXJkZW4odmFscykpO1xuICAgIH1cbiAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICBjb25zdCBieXRlQXJyYXkgPSAvKiogQHR5cGUge0J5dGVBcnJheX0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHZhbCkpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gYnl0ZUFycmF5O1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICBjb25zdCB0Z2QgPSAvKiogQHR5cGUge0NvcHlUYWdnZWR9ICovICh2YWwpO1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHRnZCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHRnZC5wYXlsb2FkKSwgcGF5bG9hZCA9PlxuICAgICAgICBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZCksXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICBjb25zdCByZW0gPSAvKiogQHR5cGUge1JlbW90YWJsZU9iamVjdH0gKi8gKHZhbCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiByZW07XG4gICAgfVxuICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgY29uc3QgZXJyID0gLyoqIEB0eXBlIHtFcnJvcn0gKi8gKHZhbCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0RlZXBseUF3YWl0ZWQ8VD4nKi9cbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICBjb25zdCBwcm9tID0gLyoqIEB0eXBlIHtQcm9taXNlfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAodmFsKSk7XG4gICAgICByZXR1cm4gRS53aGVuKHByb20sIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLCBUeXBlRXJyb3IpO1xuICAgIH1cbiAgfVxufTskaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAassmRs0dAADNHQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge0NoZWNrZXIsIFBhc3NTdHlsZSwgUGFzc1N0eWxlT2Z9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGhhc093biwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKiBUT0RPOiBNYWludGVuYW5jZSBoYXphcmQ6IENvb3JkaW5hdGUgd2l0aCB0aGUgbGlzdCBvZiBlcnJvcnMgaW4gdGhlIFNFUyovXG4vKiB3aGlsZWxpc3QuKi9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzID0gbmV3IE1hcChcbiAgLyogQ2FzdCBiZWNhdXNlIG90aGVyd2lzZSBUUyBpcyBjb25mdXNlZCBieSBBZ2dyZWdhdGVFcnJvciovXG4gIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8yMDQyI2Rpc2N1c3Npb25fcjE0ODQ5MzMwMjgqL1xuICAvKiogQHR5cGUge0FycmF5PFtzdHJpbmcsIElNUE9SVCgnc2VzJykuR2VuZXJpY0Vycm9yQ29uc3RydWN0b3JdPn0gKi9cbiAgKFtcbiAgICBbJ0Vycm9yJywgRXJyb3JdLFxuICAgIFsnRXZhbEVycm9yJywgRXZhbEVycm9yXSxcbiAgICBbJ1JhbmdlRXJyb3InLCBSYW5nZUVycm9yXSxcbiAgICBbJ1JlZmVyZW5jZUVycm9yJywgUmVmZXJlbmNlRXJyb3JdLFxuICAgIFsnU3ludGF4RXJyb3InLCBTeW50YXhFcnJvcl0sXG4gICAgWydUeXBlRXJyb3InLCBUeXBlRXJyb3JdLFxuICAgIFsnVVJJRXJyb3InLCBVUklFcnJvcl1cblxuICAgIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvNTUwKi9cbiAgICAvKiBUbyBhY2NvbW1vZGF0ZSBwbGF0Zm9ybXMgcHJpb3IgdG8gQWdncmVnYXRlRXJyb3IsIHdlIGNvbW1lbnQgb3V0IHRoZSovXG4gICAgLyogZm9sbG93aW5nIGxpbmUgYW5kIGluc3RlYWQgY29uZGl0aW9uYWxseSBhZGQgaXQgdG8gdGhlIG1hcCBiZWxvdy4qL1xuICAgIC8qIFsnQWdncmVnYXRlRXJyb3InLCBBZ2dyZWdhdGVFcnJvcl0sKi9cbiAgXSksXG4pO1xuXG5pZiAodHlwZW9mIEFnZ3JlZ2F0ZUVycm9yICE9PSAndW5kZWZpbmVkJykge1xuICAvKiBDb25kaXRpb25hbCwgdG8gYWNjb21tb2RhdGUgcGxhdGZvcm1zIHByaW9yIHRvIEFnZ3JlZ2F0ZUVycm9yKi9cbiAgZXJyb3JDb25zdHJ1Y3RvcnMuc2V0KCdBZ2dyZWdhdGVFcnJvcicsIEFnZ3JlZ2F0ZUVycm9yKTtcbn1cblxuLyoqXG4gKiBCZWNhdXNlIHRoZSBlcnJvciBjb25zdHJ1Y3RvciByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGJlXG4gKiBgQWdncmVnYXRlRXJyb3JgLCB3aGljaCBoYXMgZGlmZmVyZW50IGNvbnN0cnVjdGlvbiBwYXJhbWV0ZXJzXG4gKiBmcm9tIHRoZSBvdGhlciBlcnJvciBjb25zdHJ1Y3RvcnMsIGRvIG5vdCB1c2UgaXQgZGlyZWN0bHkgdG8gdHJ5XG4gKiB0byBtYWtlIGFuIGVycm9yIGluc3RhbmNlLiBSYXRoZXIsIHVzZSBgbWFrZUVycm9yYCB3aGljaCBlbmNhcHN1bGF0ZXNcbiAqIHRoaXMgbm9uLXVuaWZvcm1pdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtJTVBPUlQoJ3NlcycpLkdlbmVyaWNFcnJvckNvbnN0cnVjdG9yIHwgdW5kZWZpbmVkfVxuICovXG4gICAgICAgY29uc3QgZ2V0RXJyb3JDb25zdHJ1Y3RvciA9IG5hbWUgPT4gZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRozY9fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8qIFRPRE86IE5lZWQgYSBiZXR0ZXIgdGVzdCB0aGFuIGluc3RhbmNlb2YqL1xuICByZXR1cm4gKFxuICAgIGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yIHx8XG4gICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYEVycm9yIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKVxuICApO1xufTtcbmhhcmRlbihjaGVja0Vycm9yTGlrZSk7XG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIFZhbGlkYXRpbmcgZXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUgcmFpc2VzIGEgdGVuc2lvbiBiZXR3ZWVuIHNlY3VyaXR5XG4gKiB2cyBwcmVzZXJ2aW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIEZvciBlcnJvcnMsIHdlIG5lZWQgdG8gcmVtZW1iZXJcbiAqIHRoZSBlcnJvciBpdHNlbGYgZXhpc3RzIHRvIGhlbHAgdXMgZGlhZ25vc2UgYSBidWcgdGhhdCdzIGxpa2VseSBtb3JlXG4gKiBwcmVzc2luZyB0aGFuIGEgdmFsaWRpdHkgYnVnIGluIHRoZSBlcnJvciBpdHNlbGYuIFRodXMsIHdoZW5ldmVyIGl0IGlzIHNhZmVcbiAqIHRvIGRvIHNvLCB3ZSBwcmVmZXIgdG8gbGV0IHRoZSBlcnJvci1saWtlIHRlc3Qgc3VjY2VlZCBhbmQgdG8gY291Y2ggdGhlc2VcbiAqIGNvbXBsYWludHMgYXMgbm90ZXMgb24gdGhlIGVycm9yLlxuICpcbiAqIFRvIHJlc29sdmUgdGhpcywgc3VjaCBhIG1hbGZvcm1lZCBlcnJvciBvYmplY3Qgd2lsbCBzdGlsbCBwYXNzXG4gKiBgaXNFcnJvckxpa2VgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3AgbGV2ZWwgZXJyb3IgdG8gcmVwb3J0IGZyb20sXG4gKiBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBpc0Vycm9yTGlrZSA9IGNhbmRpZGF0ZSA9PiBjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUpOyRozY9fb25jZS5pc0Vycm9yTGlrZShpc0Vycm9yTGlrZSk7XG5oYXJkZW4oaXNFcnJvckxpa2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wTmFtZVxuICogQHBhcmFtIHtQcm9wZXJ0eURlc2NyaXB0b3J9IGRlc2NcbiAqIEBwYXJhbSB7KHZhbDogYW55KSA9PiBQYXNzU3R5bGV9IHBhc3NTdHlsZU9mUmVjdXJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9IChcbiAgcHJvcE5hbWUsXG4gIGRlc2MsXG4gIHBhc3NTdHlsZU9mUmVjdXIsXG4gIGNoZWNrID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGlmIChkZXNjLmVudW1lcmFibGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgcHJvcE5hbWUsXG4gICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtkZXNjfWBcbiAgICApO1xuICB9XG4gIGlmICghaGFzT3duKGRlc2MsICd2YWx1ZScpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBkYXRhIHByb3BlcnR5OiAke2Rlc2N9YFxuICAgICk7XG4gIH1cbiAgY29uc3QgeyB2YWx1ZSB9ID0gZGVzYztcbiAgc3dpdGNoIChwcm9wTmFtZSkge1xuICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgIGNhc2UgJ3N0YWNrJzoge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt2YWx1ZX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAnY2F1c2UnOiB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgcmV0dXJuIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKHZhbHVlLCBwYXNzU3R5bGVPZlJlY3VyLCBjaGVjayk7XG4gICAgfVxuICAgIGNhc2UgJ2Vycm9ycyc6IHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgcGFzc1N0eWxlT2ZSZWN1cih2YWx1ZSkgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIGNvcHlBcnJheTogJHt2YWx1ZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUuZXZlcnkoZXJyID0+XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVyciwgcGFzc1N0eWxlT2ZSZWN1ciwgY2hlY2spLFxuICAgICAgKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiAoXG4gICAgISFjaGVjayAmJlxuICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciBoYXMgZXh0cmEgdW5wYXNzZWQgcHJvcGVydHkgJHtxKHByb3BOYW1lKX1gXG4gICk7XG59OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyk7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0geyh2YWw6IGFueSkgPT4gUGFzc1N0eWxlfSBwYXNzU3R5bGVPZlJlY3VyXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAoXG4gIGNhbmRpZGF0ZSxcbiAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgY2hlY2sgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKCFjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUsIGNoZWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG4gIGNvbnN0IHsgbmFtZSB9ID0gcHJvdG87XG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbiAgaWYgKGVyckNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQgfHwgZXJyQ29uc3RydWN0b3IucHJvdG90eXBlICE9PSBwcm90bykge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2ssXG4gICAgICApYFBhc3NhYmxlIEVycm9yIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICBpZiAoISgnbWVzc2FnZScgaW4gZGVzY3MpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKFxuICAgICAgICBjaGVjayxcbiAgICAgIClgUGFzc2FibGUgRXJyb3IgbXVzdCBoYXZlIGFuIG93biBcIm1lc3NhZ2VcIiBzdHJpbmcgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXMoZGVzY3MpLmV2ZXJ5KChbcHJvcE5hbWUsIGRlc2NdKSA9PlxuICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKFxuICAgICAgcHJvcE5hbWUsXG4gICAgICBkZXNjLFxuICAgICAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgICAgIGNoZWNrLFxuICAgICksXG4gICk7XG59OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBFcnJvckhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2Vycm9yJyxcblxuICBjYW5CZVZhbGlkOiBjaGVja0Vycm9yTGlrZSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+XG4gICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyLCBhc3NlcnRDaGVja2VyKSxcbn0pOyRozY9fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAewaKenwJAAB8CQAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGFzIG1hbnkgZWxlbWVudHMgYXMgdGhlIGBiYXNlSXRlcmF0b3JgIGFuZFxuICogaGF2ZSB0aGUgc2FtZSB0ZXJtaW5hdGlvbiAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlIG9yIGZhaWx1cmVcbiAqIHJlYXNvbi4gQnV0IHRoZSBub24tZmluYWwgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBub24tZmluYWxcbiAqIHZhbHVlcyBmcm9tIGBiYXNlSXRlcmF0b3JgIGFzIHRyYW5zZm9ybWVkIGJ5IGBmdW5jYC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxVXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBVfSBmdW5jXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VT59XG4gKi9cbiAgICAgICBjb25zdCBtYXBJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIGZ1bmMpID0+XG4gIC8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG4gIEZhcignbWFwcGVkIGl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBiYXNlSXRlcmF0b3IgPSBiYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgcmV0dXJuIEZhcignbWFwcGVkIGl0ZXJhdG9yJywge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyB2YWx1ZTogYmFzZVZhbHVlLCBkb25lIH0gPSBiYXNlSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZG9uZSA/IGJhc2VWYWx1ZSA6IGZ1bmMoYmFzZVZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWUsIGRvbmUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTskaM2PX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuaGFyZGVuKG1hcEl0ZXJhYmxlKTtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhIHN1YnNldCBvZiB0aGUgbm9uLWZpbmFsIHZhbHVlcyBmcm9tIHRoZVxuICogYGJhc2VJdGVyYXRvcmAgLS0tIHRob3NlIGZvciB3aGljaCBgcHJlZCh2YWx1ZSlgIHdhcyB0cnV0aHkuIFRoZSByZXN1bHRcbiAqIGhhcyB0aGUgc2FtZSB0ZXJtaW5hdGlvbiBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZVxuICogb3IgZmFpbHVyZSByZWFzb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IGJvb2xlYW59IHByZWRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuICAgICAgIGNvbnN0IGZpbHRlckl0ZXJhYmxlID0gKGJhc2VJdGVyYWJsZSwgcHJlZCkgPT5cbiAgLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbiAgRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZUl0ZXJhdG9yID0gYmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIHJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJywge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGlmIChkb25lIHx8IHByZWQodmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7JGjNj19vbmNlLmZpbHRlckl0ZXJhYmxlKGZpbHRlckl0ZXJhYmxlKTtcbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSJdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAChJ4zJ9CUAAPQlAAAnAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL21ha2UtZmFyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJHRVRfTUVUSE9EX05BTUVTIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldE1ldGhvZE5hbWVzLHEsRmFpbCxhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChnZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJhc3NlcnRJZmFjZVwiLFskaM2PX2EgPT4gKGFzc2VydElmYWNlID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZU9mXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaM2PX2EpXV0sW1wiUmVtb3RhYmxlSGVscGVyXCIsWyRozY9fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtSZW1vdGFibGVCcmFuZH0gZnJvbSAnQGVuZG8vZXZlbnR1YWwtc2VuZCcgKi9cbi8qKiBAaW1wb3J0IHtJbnRlcmZhY2VTcGVjLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IHsgcHJvdG90eXBlOiBmdW5jdGlvblByb3RvdHlwZSB9ID0gRnVuY3Rpb247XG5jb25zdCB7XG4gIGdldFByb3RvdHlwZU9mLFxuICBzZXRQcm90b3R5cGVPZixcbiAgY3JlYXRlLFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG59ID0gT2JqZWN0O1xuXG4vKipcbiAqIE5vdyB0aGF0IHRoZSByZW1vdGFibGVQcm90byBkb2VzIG5vdCBwcm92aWRlIGl0cyBvd24gYHRvU3RyaW5nYCBtZXRob2QsXG4gKiBlbnN1cmUgaXQgYWx3YXlzIGluaGVyaXRzIGZyb20gc29tZXRoaW5nLiBUaGUgb3JpZ2luYWwgcHJvdG90eXBlIG9mXG4gKiBgcmVtb3RhYmxlYCBpZiB0aGVyZSB3YXMgb25lLCBvciBgT2JqZWN0LnByb3RvdHlwZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZW1vdGFibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cbmNvbnN0IG1ha2VSZW1vdGFibGVQcm90byA9IChyZW1vdGFibGUsIGlmYWNlKSA9PiB7XG4gIGxldCBvbGRQcm90byA9IGdldFByb3RvdHlwZU9mKHJlbW90YWJsZSk7XG4gIGlmICh0eXBlb2YgcmVtb3RhYmxlID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChvbGRQcm90byA9PT0gbnVsbCkge1xuICAgICAgb2xkUHJvdG8gPSBvYmplY3RQcm90b3R5cGU7XG4gICAgfVxuICAgIG9sZFByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICAgIEZhaWxgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJlbW90YWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9sZFByb3RvICE9PSBudWxsIHx8XG4gICAgICBGYWlsYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xuICAgIG9sZFByb3RvID09PSBmdW5jdGlvblByb3RvdHlwZSB8fFxuICAgICAgZ2V0UHJvdG90eXBlT2Yob2xkUHJvdG8pID09PSBmdW5jdGlvblByb3RvdHlwZSB8fFxuICAgICAgRmFpbGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuICB9IGVsc2Uge1xuICAgIEZhaWxgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuICB9XG4gIHJldHVybiBoYXJkZW4oXG4gICAgY3JlYXRlKG9sZFByb3RvLCB7XG4gICAgICBbUEFTU19TVFlMRV06IHsgdmFsdWU6ICdyZW1vdGFibGUnIH0sXG4gICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogeyB2YWx1ZTogaWZhY2UgfSxcbiAgICB9KSxcbiAgKTtcbn07XG5cbmNvbnN0IGFzc2VydENhbkJlUmVtb3RhYmxlID0gY2FuZGlkYXRlID0+XG4gIFJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAdGVtcGxhdGUge0ludGVyZmFjZVNwZWN9IElcbiAqIEBwYXJhbSB7SX0gW2lmYWNlXSBUaGUgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gZm9yXG4gKiB0aGUgcmVtb3RhYmxlLiBGb3Igbm93LCBhIHN0cmluZyBpZmFjZSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aFxuICogXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCIsIHRvIHNlcnZlIGFzIHRoZSBhbGxlZ2VkIG5hbWUuIE1vcmVcbiAqIGdlbmVyYWwgaWZhY2VzIGFyZSBub3QgeWV0IGltcGxlbWVudGVkLiBUaGlzIGlzIHRlbXBvcmFyeS4gV2UgaW5jbHVkZSB0aGVcbiAqIFwiQWxsZWdlZFwiIG9yIFwiRGVidWdOYW1lXCIgYXMgYSByZW1pbmRlciB0aGF0IHdlIGRvIG5vdCB5ZXQgaGF2ZSBTd2luZ1NldFxuICogb3IgQ29tbXMgVmF0XG4gKiBzdXBwb3J0IGZvciBlbnN1cmluZyB0aGlzIGlzIGFjY29yZGluZyB0byB0aGUgdmF0IGhvc3RpbmcgdGhlIG9iamVjdC5cbiAqIEN1cnJlbnRseSwgQWxpY2UgY2FuIHRlbGwgQm9iIGFib3V0IENhcm9sLCB3aGVyZSBWYXRBIChvbiBBbGljZSdzIGJlaGFsZilcbiAqIG1pc3JlcHJlc2VudHMgQ2Fyb2wncyBgaWZhY2VgLiBWYXRCIGFuZCB0aGVyZWZvcmUgQm9iIHdpbGwgdGhlbiBzZWVcbiAqIENhcm9sJ3MgYGlmYWNlYCBhcyBtaXNyZXByZXNlbnRlZCBieSBWYXRBLlxuICogQHBhcmFtIHt1bmRlZmluZWR9IFtwcm9wc10gQ3VycmVudGx5IG1heSBvbmx5IGJlIHVuZGVmaW5lZC5cbiAqIFRoYXQgcGxhbiBpcyB0aGF0IG93bi1wcm9wZXJ0aWVzIGFyZSBjb3BpZWQgdG8gdGhlIHJlbW90YWJsZVxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlXSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICogQHJldHVybnMge1QgJiBSZW1vdGFibGVPYmplY3Q8ST4gJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59fSByZW1vdGFibGUsIG1vZGlmaWVkIGZvciBkZWJ1Z2dhYmlsaXR5XG4gKi9cbiAgICAgICBjb25zdCBSZW1vdGFibGUgPSAoXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgSSBjb3VsZCBoYXZlIGRpZmZlcmVudCBzdWJ0eXBlIHRoYW4gc3RyaW5nKi9cbiAgaWZhY2UgPSAnUmVtb3RhYmxlJyxcbiAgcHJvcHMgPSB1bmRlZmluZWQsXG4gIHJlbW90YWJsZSA9IC8qKiBAdHlwZSB7VH0gKi8gKHt9KSxcbikgPT4ge1xuICBhc3NlcnRJZmFjZShpZmFjZSk7XG4gIGFzc2VydChpZmFjZSk7XG4gIC8qIFRPRE86IFdoZW4gaWZhY2UgaXMgcmljaGVyIHRoYW4ganVzdCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhbGxlZ2VkTmFtZSovXG4gIC8qIGluIGEgZGlmZmVyZW50IHdheS4qL1xuICBwcm9wcyA9PT0gdW5kZWZpbmVkIHx8IEZhaWxgUmVtb3RhYmxlIHByb3BzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgJHtwcm9wc31gO1xuXG4gIC8qIEZhaWwgZmFzdDogY2hlY2sgdGhhdCB0aGUgdW5tb2RpZmllZCBvYmplY3QgaXMgYWJsZSB0byBiZWNvbWUgYSBSZW1vdGFibGUuKi9cbiAgYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuICAvKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgbWFya2VkLiovXG4gICEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpIHx8XG4gICAgRmFpbGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxuICAgICAgcmVtb3RhYmxlW1BBU1NfU1RZTEVdLFxuICAgICl9YDtcbiAgLyogYGlzRnJvemVuYCBhbHdheXMgcmV0dXJucyB0cnVlIHdpdGggYSBmYWtlIGBoYXJkZW5gLCBidXQgd2Ugd2FudCB0aGF0IGNhc2UqL1xuICAvKiB0byBzdWNjZWVkIGFueXdheS4gRmFraW5nIGBoYXJkZW5gIGlzIG9ubHkgY29ycmVjdG5lc3MgcHJlc2VydmluZyovXG4gIC8qIGlmIHRoZSBjb2RlIGluIHF1ZXN0aW9uIGNvbnRhaW5zIG5vIGJ1Z3MgdGhhdCB0aGUgcmVhbCBgaGFyZGVuYCB3b3VsZCovXG4gIC8qIGhhdmUgY2F1Z2h0LiovXG4gIC8qIEB0cy1pZ25vcmUgYGlzRmFrZWAgcHVycG9zZWx5IG5vdCBpbiB0aGUgdHlwZSovXG4gIGhhcmRlbi5pc0Zha2UgfHxcbiAgICAvKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgZnJvemVuLiovXG4gICAgIWlzRnJvemVuKHJlbW90YWJsZSkgfHxcbiAgICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuICBjb25zdCByZW1vdGFibGVQcm90byA9IG1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsIGlmYWNlKTtcblxuICAvKiBUYWtlIGEgc3RhdGljIGNvcHkgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgYXMgZGF0YSBwcm9wZXJ0aWVzLiovXG4gIC8qIGNvbnN0IHByb3BEZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoeyAuLi5wcm9wcyB9KTsqL1xuICBjb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjayA9IHRhcmdldCA9PiB7XG4gICAgLyogZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BEZXNjcyk7Ki9cbiAgICBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHJlbW90YWJsZVByb3RvKTtcbiAgICBoYXJkZW4odGFyZ2V0KTtcbiAgICBhc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuICB9O1xuXG4gIC8qIEZhaWwgZmFzdDogY2hlY2sgYSBmcmVzaCByZW1vdGFibGUgdG8gc2VlIGlmIG91ciBydWxlcyBmaXQuKi9cbiAgbXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4gIC8qIEFjdHVhbGx5IGZpbmlzaCB0aGUgbmV3IHJlbW90YWJsZS4qL1xuICBtdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4gIC8qIENPTU1JVFRFRCEqL1xuICAvKiBXZSdyZSBjb21taXR0ZWQsIHNvIGtlZXAgdGhlIGludGVyZmFjZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4qL1xuICBhc3NlcnQoaWZhY2UgIT09IHVuZGVmaW5lZCk7IC8qIFRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweSovXG4gIHJldHVybiAvKiogQHR5cGUge2FueX0gKi8gKHJlbW90YWJsZSk7XG59OyRozY9fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBhdXRvbWF0aWNhbGx5IGFkZGVkIGRlZmF1bHQgbWV0YS1tZXRob2QgZm9yIG9idGFpbmluZyBhXG4gKiBsaXN0IG9mIGFsbCBtZXRob2RzIG9mIGFuIG9iamVjdCBkZWNsYXJlZCB3aXRoIGBGYXJgLCBvciBhbiBvYmplY3QgdGhhdFxuICogaW5oZXJpdHMgZnJvbSBhbiBvYmplY3QgZGVjbGFyZWQgd2l0aCBgRmFyYC5cbiAqXG4gKiBNb2RlbGVkIG9uIGBHRVRfSU5URVJGQUNFX0dVQVJEYCBmcm9tIGBAZW5kby9leG9gLlxuICpcbiAqIFRPRE8gTmFtZSB0byBiZSBiaWtlc2hlZC4gUGVyaGFwcyBldmVuIHdoZXRoZXIgaXQgaXMgYVxuICogc3RyaW5nIG9yIHN5bWJvbCB0byBiZSBiaWtlc2hlZC4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xODA5I2Rpc2N1c3Npb25fcjEzODgwNTI0NTRcbiAqXG4gKiBIQVpBUkQ6IEJld2FyZSB0aGF0IGFuIGV4bydzIGludGVyZmFjZSBjYW4gY2hhbmdlIGFjcm9zcyBhbiB1cGdyYWRlLFxuICogc28gcmVtb3RlcyB0aGF0IGNhY2hlIGl0IGNhbiBiZWNvbWUgc3RhbGUuXG4gKi9cbiAgICAgICBjb25zdCBHRVRfTUVUSE9EX05BTUVTID0gJ19fZ2V0TWV0aG9kTmFtZXNfXyc7XG5cbi8qKlxuICogTm90ZSB0aGF0IGBnZXRNZXRob2ROYW1lc01ldGhvZGAgaXMgYSB0aGlzZnVsIG1ldGhvZCEgSXQgbXVzdCBiZSBzbyB0aGF0XG4gKiBpdCB3b3JrcyBhcyBleHBlY3RlZCB3aXRoIGZhci1vYmplY3QgaW5oZXJpdGFuY2UuXG4gKlxuICogQHJldHVybnMgeyhzdHJpbmd8c3ltYm9sKVtdfVxuICovJGjNj19vbmNlLkdFVF9NRVRIT0RfTkFNRVMoR0VUX01FVEhPRF9OQU1FUyk7XG5jb25zdCBnZXRNZXRob2ROYW1lc01ldGhvZCA9IGhhcmRlbih7XG4gIFtHRVRfTUVUSE9EX05BTUVTXSgpIHtcbiAgICByZXR1cm4gZ2V0TWV0aG9kTmFtZXModGhpcyk7XG4gIH0sXG59KVtHRVRfTUVUSE9EX05BTUVTXTtcblxuY29uc3QgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yID0gaGFyZGVuKHtcbiAgdmFsdWU6IGdldE1ldGhvZE5hbWVzTWV0aG9kLFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgd3JpdGFibGU6IGZhbHNlLFxufSk7XG5cbi8qKlxuICogTWFyayBhbiBvYmplY3QgdG8gYmUgZXhwb3NlZCBmb3IgcmVtb3RlIGludGVyYWN0aW9uXG4gKiBhbmQgZ2l2ZSBpdCBhIHN1Z2dlc3RpdmUgaW50ZXJmYWNlIG5hbWUgZm9yIGRlYnVnZ2luZy5cbiAqXG4gKiBBbGwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IGhhdmUgdG8gYmUgbWV0aG9kcywgbm90IGRhdGEuXG4gKlxuICogVGhlIG9iamVjdCBtdXN0IG5vdCBiZSBoYXJkZW5lZCBiZWZvcmUgaXQgaXMgbWFya2VkLlxuICogSXQgd2lsbCBiZSBoYXJkZW5lZCBhZnRlciBtYXJraW5nLlxuICpcbiAqIEZvciBmYXIgb2JqZWN0cyAoYXMgb3Bwb3NlZCB0byBmYXIgZnVuY3Rpb25zKSwgYWxzbyBhZGRzXG4gKiBgX19nZXRNZXRob2ROYW1lc19fYCBtZXRob2QgdGhhdCByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgbWV0aG9kIG5hbWVzLFxuICogaWYgdGhlcmUgaXMgbm90IHlldCBhbnkgbWV0aG9kIG5hbWVkIGBfX2dldE1ldGhvZE5hbWVzX19gLlxuICpcbiAqIEBleGFtcGxlXG4gKiBGYXIoJ0VtcGxveWVlJywgeyBnZXRNYW5hZ2VyIH0pXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSBUaGlzIG5hbWUgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCBgQWxsZWdlZDogYFxuICogZm9yIG5vdyB0byBmb3JtIHRoZSBgUmVtb3RhYmxlYCBgaWZhY2VgIGFyZ3VtZW50LlxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlXSBUaGUgb2JqZWN0IHRvIGJlIG1hcmtlZCBhcyByZW1vdGFibGVcbiAqL1xuICAgICAgIGNvbnN0IEZhciA9IChmYXJOYW1lLCByZW1vdGFibGUgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgciA9IHJlbW90YWJsZSA9PT0gdW5kZWZpbmVkID8gLyoqIEB0eXBlIHtUfSAqLyAoe30pIDogcmVtb3RhYmxlO1xuICBpZiAodHlwZW9mIHIgPT09ICdvYmplY3QnICYmICEoR0VUX01FVEhPRF9OQU1FUyBpbiByKSkge1xuICAgIC8qIFRoaXMgdGVzdCBleGNsdWRlcyBmYXIgZnVuY3Rpb25zLCBzaW5jZSB3ZSBjdXJyZW50bHkgY29uc2lkZXIgdGhlbSovXG4gICAgLyogdG8gb25seSBoYXZlIGEgY2FsbC1iZWhhdmlvciwgd2l0aCBubyBjYWxsYWJsZSBtZXRob2RzLiovXG4gICAgLyogQmV3YXJlOiBNdXRhdGVzIHRoZSBpbnB1dCBhcmd1bWVudCEgQnV0IGBSZW1vdGFibGVgKi9cbiAgICAvKiAqIHJlcXVpcmVzIHRoZSBvYmplY3QgdG8gYmUgbXV0YWJsZSovXG4gICAgLyogKiBkb2VzIGZ1cnRoZXIgbXV0YXRpb25zLCovXG4gICAgLyogKiBoYXJkZW5zIHRoZSBtdXRhdGVkIG9iamVjdCBiZWZvcmUgcmV0dXJuaW5nIGl0LiovXG4gICAgLyogc28gdGhpcyBtdXRhdGlvbiBpcyBub3QgdW5wcmVjZWRlbnRlZC4gQnV0IGl0IGlzIHN1cnByaXNpbmchKi9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgR0VUX01FVEhPRF9OQU1FUywgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yKTtcbiAgfVxuICByZXR1cm4gUmVtb3RhYmxlKGBBbGxlZ2VkOiAke2Zhck5hbWV9YCwgdW5kZWZpbmVkLCByKTtcbn07JGjNj19vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qKlxuICogQ29lcmNlIGBmdW5jYCB0byBhIGZhciBmdW5jdGlvbiB0aGF0IHByZXNlcnZlcyBpdHMgY2FsbCBiZWhhdmlvci5cbiAqIElmIGl0IGlzIGFscmVhZHkgYSBmYXIgZnVuY3Rpb24sIHJldHVybiBpdC4gT3RoZXJ3aXNlIG1ha2UgYW5kIHJldHVybiBhXG4gKiBuZXcgZmFyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCBmb3J3YXJkcyBjYWxscyB0byBpdC4gVGhpc1xuICogd29ya3MgZXZlbiBpZiBgZnVuY2AgaXMgYWxyZWFkeSBmcm96ZW4uIGBUb0ZhckZ1bmN0aW9uYCBpcyB0byBiZSB1c2VkXG4gKiB3aGVuIHRoZSBmdW5jdGlvbiBjb21lcyBmcm9tIGVsc2V3aGVyZSB1bmRlciBsZXNzIGNvbnRyb2wuIEZvciBmdW5jdGlvbnNcbiAqIHlvdSBhdXRob3IgaW4gcGxhY2UsIGJldHRlciB0byB1c2UgYEZhcmAgb24gdGhlaXIgZnVuY3Rpb24gbGl0ZXJhbCBkaXJlY3RseS5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBGXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSB0byBiZSB1c2VkIG9ubHkgaWYgYGZ1bmNgIGlzIG5vdCBhbHJlYWR5IGFcbiAqIGZhciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Rn0gZnVuY1xuICogQHJldHVybnMge0YgJiBSZW1vdGFibGVPYmplY3QgJiBSZW1vdGFibGVCcmFuZDx7fSwgRj59XG4gKi9cbiAgICAgICBjb25zdCBUb0ZhckZ1bmN0aW9uID0gKGZhck5hbWUsIGZ1bmMpID0+IHtcbiAgaWYgKGdldEludGVyZmFjZU9mKGZ1bmMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNoZWNrZWQgY2FzdCovXG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBkaWZmZXJlbnQgc3VidHlwZSovXG4gIHJldHVybiBGYXIoZmFyTmFtZSwgKC4uLmFyZ3MpID0+IGZ1bmMoLi4uYXJncykpO1xufTskaM2PX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiR0VUX01FVEhPRF9OQU1FUyI6WyJHRVRfTUVUSE9EX05BTUVTIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJxSYGmDBQAAgwUAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLENvcHlUYWdnZWR9IGZyb20gJy4vdHlwZXMuanMnXG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFRcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFBcbiAqIEBwYXJhbSB7VH0gdGFnXG4gKiBAcGFyYW0ge1B9IHBheWxvYWRcbiAqIEByZXR1cm5zIHtDb3B5VGFnZ2VkPFQsUD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlVGFnZ2VkID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyB8fFxuICAgIEZhaWxgVGhlIHRhZyBvZiBhIHRhZ2dlZCByZWNvcmQgbXVzdCBiZSBhIHN0cmluZzogJHt0YWd9YDtcbiAgYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBjcmVhdGUob2JqZWN0UHJvdG90eXBlLCB7XG4gICAgICBbUEFTU19TVFlMRV06IHsgdmFsdWU6ICd0YWdnZWQnIH0sXG4gICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogeyB2YWx1ZTogdGFnIH0sXG4gICAgICBwYXlsb2FkOiB7IHZhbHVlOiBwYXlsb2FkLCBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgfSksXG4gICk7XG59OyRozY9fb25jZS5tYWtlVGFnZ2VkKG1ha2VUYWdnZWQpO1xuaGFyZGVuKG1ha2VUYWdnZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHwl6v3qIQAA6iEAADAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiQ1giLCJQQVNTX1NUWUxFIiwiYXNzZXJ0Q2hlY2tlciIsImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0T3duRGF0YURlc2NyaXB0b3IiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1ByaW1pdGl2ZSIsImlzVHlwZWRBcnJheSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDaGVja2VyLCBQYXNzU3R5bGUsIEpTUHJpbWl0aXZlfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBwcm90b3R5cGU6IGZ1bmN0aW9uUHJvdG90eXBlIH0gPSBGdW5jdGlvbjtcbmNvbnN0IHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBnZXRQcm90b3R5cGVPZixcbiAgaGFzT3duLFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG59ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgdG9TdHJpbmdUYWc6IHRvU3RyaW5nVGFnU3ltYm9sIH0gPSBTeW1ib2w7XG5cbmNvbnN0IHR5cGVkQXJyYXlQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICB0eXBlZEFycmF5UHJvdG90eXBlLFxuICB0b1N0cmluZ1RhZ1N5bWJvbCxcbik7XG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcgPSB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnID09PSAnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYE9iamVjdC5oYXNPd25gIGluc3RlYWRcbiAqL1xuICAgICAgIGNvbnN0IGhhc093blByb3BlcnR5T2YgPSBoYXNPd247XG5cbi8qKlxuICogQHR5cGUgeyh2YWw6IHVua25vd24pID0+IHZhbCBpcyBKU1ByaW1pdGl2ZX1cbiAqLyRozY9fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuICAgICAgIGNvbnN0IGlzUHJpbWl0aXZlID0gdmFsID0+XG4gIC8qIFNhZmVyIHdvdWxkIGJlIGBPYmplY3QodmFsKSAhPT0gdmFsYCBidXQgaXMgdG9vIGV4cGVuc2l2ZSBvbiBYUy4qL1xuICAvKiBTbyBpbnN0ZWFkIHdlIHVzZSB0aGlzIGFkaG9jIHNldCBvZiB0eXBlIHRlc3RzLiBCdXQgdGhpcyBpcyBub3Qgc2FmZSBpbiovXG4gIC8qIHRoZSBmYWNlIG9mIHBvc3NpYmxlIGV2b2x1dGlvbiBvZiB0aGUgbGFuZ3VhZ2UuIEJld2FyZSEqL1xuICAhdmFsIHx8ICh0eXBlb2YgdmFsICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsICE9PSAnZnVuY3Rpb24nKTskaM2PX29uY2UuaXNQcmltaXRpdmUoaXNQcmltaXRpdmUpO1xuaGFyZGVuKGlzUHJpbWl0aXZlKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgYCFpc1ByaW1pdGl2ZWAgaW5zdGVhZFxuICogQHR5cGUgeyh2YWw6IHVua25vd24pID0+IHZhbCBpcyAoRnVuY3Rpb24gfCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPil9XG4gKi9cbiAgICAgICBjb25zdCBpc09iamVjdCA9IHZhbCA9PlxuICAvKiBTYWZlciB3b3VsZCBiZSBgT2JqZWN0KHZhbCkgLT09IHZhbGAgYnV0IGlzIHRvbyBleHBlbnNpdmUgb24gWFMuKi9cbiAgLyogU28gaW5zdGVhZCB3ZSB1c2UgdGhpcyBhZGhvYyBzZXQgb2YgdHlwZSB0ZXN0cy4gQnV0IHRoaXMgaXMgbm90IHNhZmUgaW4qL1xuICAvKiB0aGUgZmFjZSBvZiBwb3NzaWJsZSBldm9sdXRpb24gb2YgdGhlIGxhbmd1YWdlLiBCZXdhcmUhKi9cbiAgISF2YWwgJiYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpOyRozY9fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKipcbiAqIER1cGxpY2F0ZXMgcGFja2FnZXMvc2VzL3NyYy9tYWtlLWhhcmRlbmVyLmpzIHRvIGF2b2lkIGEgZGVwZW5kZW5jeS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9iamVjdFxuICovXG4gICAgICAgY29uc3QgaXNUeXBlZEFycmF5ID0gb2JqZWN0ID0+IHtcbiAgLyogVGhlIG9iamVjdCBtdXN0IHBhc3MgYSBicmFuZCBjaGVjayBvciB0b1N0cmluZ1RhZyB3aWxsIHJldHVybiB1bmRlZmluZWQuKi9cbiAgY29uc3QgdGFnID0gYXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLCBvYmplY3QsIFtdKTtcbiAgcmV0dXJuIHRhZyAhPT0gdW5kZWZpbmVkO1xufTskaM2PX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuLyoqXG4gKiBXZSBjYXN0IG91ciBgU3ltYm9sLmZvcigpYCB0byBhIHN0cmluZyBjb25zdGFudCBoZXJlIHRvIGF2b2lkIGV4cG9zaW5nIHRoZVxuICogYHVuaXF1ZSBzeW1ib2xgIHR5cGUgcHVibGljbHkuICBUaGUgY2FzdCBkb2Vzbid0IGNoYW5nZSBhbnkgcnVudGltZVxuICogYmVoYXZpb3IuLi4gaXQncyBzdGlsbCBhY3R1YWxseSBhIHN5bWJvbC5cbiAqXG4gKiBXaXRob3V0IHRoaXMgd29ya2Fyb3VuZCwgd2UndmUgb2JzZXJ2ZWQgZXJyb3JzIHdoZW4gdXNpbmdcbiAqIGB0eXBlc2NyaXB0QDUuOS4zYCdzIGB0c2NgIHRvIGdlbmVyYXRlIGRlY2xhcmF0aW9uIGZpbGVzICguZC50cykgZm9yXG4gKiBjb25zdW1lcnMgb2YgbW9kdWxlcyB0aGF0IGltcG9ydCBgUEFTU19TVFlMRWA6XG4gKiBAZXhhbXBsZVxuICogICBlcnJvciBUUzkwMDY6IERlY2xhcmF0aW9uIGVtaXQgZm9yIHRoaXMgZmlsZSByZXF1aXJlcyB1c2luZyBwcml2YXRlIG5hbWVcbiAqICAgJ1BBU1NfU1RZTEUnIGZyb20gbW9kdWxlICcuLi4vQGVuZG8vcGFzcy1zdHlsZS9zcmMvdHlwZXNcIicuIEFuIGV4cGxpY2l0XG4gKiAgIHR5cGUgYW5ub3RhdGlvbiBtYXkgdW5ibG9jayBkZWNsYXJhdGlvbiBlbWl0LlxuICovXG4gICAgICAgY29uc3QgUEFTU19TVFlMRSA9IC8qKiBAdHlwZSB7J1N5bWJvbChwYXNzU3R5bGUpJ30gKi8gKFxuICAvKiogQHR5cGUge3Vua25vd259ICovIChTeW1ib2wuZm9yKCdwYXNzU3R5bGUnKSlcbik7XG5cbi8qKlxuICogQmVsb3cgd2UgaGF2ZSBhIHNlcmllcyBvZiBwcmVkaWNhdGUgZnVuY3Rpb25zIGFuZCB0aGVpciAoY3VycmllZCkgYXNzZXJ0aW9uXG4gKiBmdW5jdGlvbnMuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGFzc2VydGlvbiBmdW5jdGlvbiBpcyBqdXN0IHRvIGFzc2VydCB0aGF0XG4gKiB0aGUgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUgZnVuY3Rpb24gd291bGQgaGF2ZSByZXR1cm5lZCB0cnVlLiBCdXQgaXRcbiAqIHJlcHJvZHVjZXMgdGhlIGludGVybmFsIHRlc3RzIHNvIGZhaWx1cmVzIGNhbiBnaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi8kaM2PX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbiAgICAgICBjb25zdCBhc3NlcnRDaGVja2VyID0gKGNvbmQsIGRldGFpbHMpID0+IHtcbiAgYXNzZXJ0KGNvbmQsIGRldGFpbHMpO1xuICByZXR1cm4gdHJ1ZTtcbn07JGjNj19vbmNlLmFzc2VydENoZWNrZXIoYXNzZXJ0Q2hlY2tlcik7XG5oYXJkZW4oYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogUmV0dXJucyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIGZ1bmN0aW9uIHRvIGZhaWwgdGhlIHByb3ZpZGVkIENoZWNrZXIgd2l0aCBkZXRhaWxzLlxuICogVGhlIG5hbWUgbXVzdCBiZSBzaG9ydCBmb3IgZXJnb25vbWljIGlubGluZSB1c2UgYXMgaW46XG4gKiBgYGBcbiAqIHJldHVybiBjaGVja0NvbmRpdGlvbiguLi4pIHx8ICghIWNoZWNrICYmIENYKGNoZWNrKWAuLi5gKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuICAgICAgIGNvbnN0IENYID0gY2hlY2sgPT4ge1xuICBjb25zdCByZWplY3QgPSAoVCwgLi4uc3VicykgPT4gY2hlY2soZmFsc2UsIFgoVCwgLi4uc3VicykpO1xuICByZXR1cm4gcmVqZWN0O1xufTskaM2PX29uY2UuQ1goQ1gpO1xuaGFyZGVuKENYKTtcblxuLyoqXG4gKiBWZXJpZmllcyB0aGUgcHJlc2VuY2UgYW5kIGVudW1lcmFiaWxpdHkgb2YgYW4gb3duIGRhdGEgcHJvcGVydHlcbiAqIGFuZCByZXR1cm5zIGl0cyBkZXNjcmlwdG9yLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxzeW1ib2x9IHByb3BOYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEJlRW51bWVyYWJsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfVxuICovXG4gICAgICAgY29uc3QgZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAoXG4gIGNhbmRpZGF0ZSxcbiAgcHJvcE5hbWUsXG4gIHNob3VsZEJlRW51bWVyYWJsZSxcbiAgY2hlY2ssXG4pID0+IHtcbiAgY29uc3QgZGVzYyA9IC8qKiBAdHlwZSB7UHJvcGVydHlEZXNjcmlwdG9yfSAqLyAoXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgcHJvcE5hbWUpXG4gICk7XG4gIHJldHVybiAoZGVzYyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYCR7cShwcm9wTmFtZSl9IHByb3BlcnR5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoaGFzT3duKGRlc2MsICd2YWx1ZScpIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IG5vdCBiZSBhbiBhY2Nlc3NvciBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKHNob3VsZEJlRW51bWVyYWJsZVxuICAgICAgPyBkZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKVxuICAgICAgOiAhZGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKVxuICAgID8gZGVzY1xuICAgIDogLyoqIEB0eXBlIHtQcm9wZXJ0eURlc2NyaXB0b3J9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh1bmRlZmluZWQpKTtcbn07JGjNj19vbmNlLmdldE93bkRhdGFEZXNjcmlwdG9yKGdldE93bkRhdGFEZXNjcmlwdG9yKTtcbmhhcmRlbihnZXRPd25EYXRhRGVzY3JpcHRvcik7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBUXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZWQ8YW55LCBUPn0gdGFnUmVjb3JkXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuICAgICAgIGNvbnN0IGdldFRhZyA9IHRhZ1JlY29yZCA9PiB0YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaM2PX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuICAgICAgIGNvbnN0IGNoZWNrUGFzc1N0eWxlID0gKG9iaiwgcGFzc1N0eWxlLCBleHBlY3RlZFBhc3NTdHlsZSwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICBwYXNzU3R5bGUgPT09IGV4cGVjdGVkUGFzc1N0eWxlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShwYXNzU3R5bGUpfTogJHtvYmp9YClcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZCA9IGNoZWNrUHJvdG8gPT4ge1xuICAvKipcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlZDxhbnksIGFueT59IHRhZ1JlY29yZFxuICogQHBhcmFtIHtQYXNzU3R5bGV9IGV4cGVjdGVkUGFzc1N0eWxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrVGFnUmVjb3JkID0gKHRhZ1JlY29yZCwgZXhwZWN0ZWRQYXNzU3R5bGUsIGNoZWNrKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICghaXNQcmltaXRpdmUodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIChpc0Zyb3plbih0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICAoIWlzQXJyYXkodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJiBDWChjaGVjaylgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIGNoZWNrUGFzc1N0eWxlKFxuICAgICAgICB0YWdSZWNvcmQsXG4gICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKHRhZ1JlY29yZCwgUEFTU19TVFlMRSwgZmFsc2UsIGNoZWNrKS52YWx1ZSxcbiAgICAgICAgZXhwZWN0ZWRQYXNzU3R5bGUsXG4gICAgICAgIGNoZWNrLFxuICAgICAgKSAmJlxuICAgICAgKHR5cGVvZiBnZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsIFN5bWJvbC50b1N0cmluZ1RhZywgZmFsc2UsIGNoZWNrKVxuICAgICAgICAudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICBjaGVja1Byb3RvKHRhZ1JlY29yZCwgZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSwgY2hlY2spXG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG59O1xuXG4gICAgICAgY29uc3QgY2hlY2tUYWdSZWNvcmQgPSBtYWtlQ2hlY2tUYWdSZWNvcmQoXG4gICh2YWwsIHByb3RvLCBjaGVjaykgPT5cbiAgICBwcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKSxcbik7JGjNj19vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbiAgICAgICBjb25zdCBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gICAgcHJvdG8gPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgKHByb3RvICE9PSBudWxsICYmIGdldFByb3RvdHlwZU9mKHByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUpIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWAsXG4gICAgICApKSxcbik7JGjNj19vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNQcmltaXRpdmUiOlsiaXNQcmltaXRpdmUiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sIkNYIjpbIkNYIl0sImdldE93bkRhdGFEZXNjcmlwdG9yIjpbImdldE93bkRhdGFEZXNjcmlwdG9yIl0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACYCjrdiPwAAYj8AACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2J5dGVBcnJheS5qcyIsIi4vY29weVJlY29yZC5qcyIsIi4vdGFnZ2VkLmpzIiwiLi9lcnJvci5qcyIsIi4vcmVtb3RhYmxlLmpzIiwiLi9zeW1ib2wuanMiLCIuL3NhZmUtcHJvbWlzZS5qcyIsIi4vc3RyaW5nLmpzIl0sImV4cG9ydHMiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZSIsImlzUGFzc2FibGUiLCJwYXNzU3R5bGVPZiIsInRvUGFzc2FibGVFcnJvciIsInRvVGhyb3dhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaXNQcm9taXNlLFgsRmFpbCxxLGFubm90YXRlRXJyb3IsbWFrZUVycm9yLGlzUHJpbWl0aXZlLGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLGFzc2VydENoZWNrZXIsQ29weUFycmF5SGVscGVyLEJ5dGVBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyxjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcixnZXRFcnJvckNvbnN0cnVjdG9yLGlzRXJyb3JMaWtlLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZSxhc3NlcnRQYXNzYWJsZVN0cmluZzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsWyRozY9fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vYnl0ZUFycmF5LmpzXCIsIFtbXCJCeXRlQXJyYXlIZWxwZXJcIixbJGjNj19hID0+IChCeXRlQXJyYXlIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIixbJGjNj19hID0+IChDb3B5UmVjb3JkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLFskaM2PX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsWyRozY9fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2NcIixbJGjNj19hID0+IChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9ICRozY9fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclwiLFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsWyRozY9fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIixbJGjNj19hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vc3RyaW5nLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN0cmluZ1wiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3RyaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge0NvcHlBcnJheSwgQ29weVJlY29yZCwgQ29weVRhZ2dlZCwgUGFzc2FibGV9IGZyb20gJy4vdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge1Bhc3NTdHlsZU9mfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzRnJvemVuLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQYXNzU3R5bGUsIFBhc3NTdHlsZUhlbHBlcj59IEhlbHBlcnNSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnNcbiAqIEByZXR1cm5zIHtIZWxwZXJzUmVjb3JkfVxuICovXG5jb25zdCBtYWtlSGVscGVyVGFibGUgPSBwYXNzU3R5bGVIZWxwZXJzID0+IHtcbiAgY29uc3QgSGVscGVyVGFibGUgPSB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGNvcHlBcnJheTogdW5kZWZpbmVkLFxuICAgIGJ5dGVBcnJheTogdW5kZWZpbmVkLFxuICAgIGNvcHlSZWNvcmQ6IHVuZGVmaW5lZCxcbiAgICB0YWdnZWQ6IHVuZGVmaW5lZCxcbiAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgIHJlbW90YWJsZTogdW5kZWZpbmVkLFxuICB9O1xuICBmb3IgKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKSB7XG4gICAgY29uc3QgeyBzdHlsZU5hbWUgfSA9IGhlbHBlcjtcbiAgICBzdHlsZU5hbWUgaW4gSGVscGVyVGFibGUgfHwgRmFpbGBVbnJlY29nbml6ZWQgaGVscGVyOiAke3Eoc3R5bGVOYW1lKX1gO1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgRmFpbGBjb25mbGljdGluZyBoZWxwZXJzIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gPSBoZWxwZXI7XG4gIH1cbiAgZm9yIChjb25zdCBzdHlsZU5hbWUgb2Ygb3duS2V5cyhIZWxwZXJUYWJsZSkpIHtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIEZhaWxgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gIH1cblxuICByZXR1cm4gLyoqIEB0eXBlIHtIZWxwZXJzUmVjb3JkfSAqLyAoXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoaGFyZGVuKEhlbHBlclRhYmxlKSlcbiAgKTtcbn07XG5cbi8qKlxuICogVGhlIGBhc3NlcnRSZXN0VmFsaWRgIGFzc3VtZXMgdGhhdCB0aGUgYGNhbkJlVmFsaWRgIGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAqIENvbnRleHRzIHdoZXJlIHdlIGNhbm5vdCBhc3N1bWUgdGhhdCBzaG91bGQgY2FsbCBgYXNzZXJ0VmFsaWRgIGluc3RlYWQsXG4gKiB3aGljaCBjaGVja3MgYm90aCBjb25kaXRpb25zIGluIHRoZSByaWdodCBvcmRlci5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcn0gaGVscGVyXG4gKiBAcGFyYW0ge2FueX0gY2FuZGlkYXRlXG4gKiBAcGFyYW0geyh2YWw6IGFueSkgPT4gUGFzc1N0eWxlfSBwYXNzU3R5bGVPZlJlY3VyXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgYXNzZXJ0VmFsaWQgPSAoaGVscGVyLCBjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgaGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKTtcbiAgaGVscGVyLmFzc2VydFJlc3RWYWxpZChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzIFRoZSBwYXNzU3R5bGVIZWxwZXJzIHRvIHJlZ2lzdGVyLFxuICogaW4gcHJpb3JpdHkgb3JkZXIuXG4gKiBOT1RFIFRoZXNlIG11c3QgYWxsIGJlIFwidHJ1c3RlZFwiLFxuICogY29tcGxldGUsIGFuZCBub24tY29sbGlkaW5nLiBgbWFrZVBhc3NTdHlsZU9mYCBtYXkgKmFzc3VtZSogdGhhdCBlYWNoIGhlbHBlclxuICogZG9lcyB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvLiBgbWFrZVBhc3NTdHlsZU9mYCBpcyBub3QgdHJ5aW5nIHRvIGRlZmVuZFxuICogaXRzZWxmIGFnYWluc3QgbWFsaWNpb3VzIGhlbHBlcnMsIHRob3VnaCBpdCBkb2VzIGRlZmVuZCBhZ2FpbnN0IHNvbWVcbiAqIGFjY2lkZW50cy5cbiAqIEByZXR1cm5zIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgbWFrZVBhc3NTdHlsZU9mID0gcGFzc1N0eWxlSGVscGVycyA9PiB7XG4gIGNvbnN0IEhlbHBlclRhYmxlID0gbWFrZUhlbHBlclRhYmxlKHBhc3NTdHlsZUhlbHBlcnMpO1xuICBjb25zdCByZW1vdGFibGVIZWxwZXIgPSBIZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbiAgLyoqXG4gKiBQdXJlbHkgZm9yIHBlcmZvcm1hbmNlLiBIb3dldmVyIGl0IGlzIG11dGFibGUgc3RhdGljIHN0YXRlLCBhbmRcbiAqIGl0IGRvZXMgaGF2ZSBzb21lIG9ic2VydmFiaWxpdHkgb24gcHJveGllcy4gVE9ETyBuZWVkIHRvIGFzc2Vzc1xuICogd2hldGhlciB0aGlzIGNyZWF0ZXMgYSBzdGF0aWMgY29tbXVuaWNhdGlvbnMgY2hhbm5lbC5cbiAqXG4gKiBwYXNzU3R5bGVPZiBkb2VzIGEgZnVsbCByZWN1cnNpdmUgd2FsayBvZiBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoYXQgdGhleSBhcmUgYWN5Y2xpYy4gSW4gYWRkaXRpb25cbiAqIGl0IGlzIHVzZWQgYnkgb3RoZXIgYWxnb3JpdGhtcyB0byByZWN1cnNpdmVseSB3YWxrIHRoZXNlIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgc28gd2l0aG91dCB0aGlzIGNhY2hlLCB0aGVzZSBhbGdvcml0aG1zIGNvdWxkIGJlXG4gKiBPKE4qKjIpIG9yIHdvcnNlLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwPFdlYWtLZXksIFBhc3NTdHlsZT59XG4gKi9cbiAgY29uc3QgcGFzc1N0eWxlTWVtbyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgY29uc3QgcGFzc1N0eWxlT2YgPSBwYXNzYWJsZSA9PiB7XG4gICAgLyogRXZlbiB3aGVuIGEgV2Vha1NldCBpcyBjb3JyZWN0LCB3aGVuIHRoZSBzZXQgaGFzIGEgc2hvcnRlciBsaWZldGltZSovXG4gICAgLyogdGhhbiBpdHMga2V5cywgd2UgcHJlZmVyIGEgU2V0IGR1ZSB0byBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiovXG4gICAgLyogdHJhZGVvZmZzLiovXG4gICAgY29uc3QgaW5Qcm9ncmVzcyA9IG5ldyBTZXQoKTtcblxuICAgIGNvbnN0IHBhc3NTdHlsZU9mUmVjdXIgPSBpbm5lciA9PiB7XG4gICAgICBjb25zdCBpbm5lcklzT2JqZWN0ID0gIWlzUHJpbWl0aXZlKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGlubmVyU3R5bGUgPSBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gICAgICAgIGlmIChpbm5lclN0eWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGlubmVyU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgIWluUHJvZ3Jlc3MuaGFzKGlubmVyKSB8fFxuICAgICAgICAgIEZhaWxgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG4gICAgICAgIGluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIHBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLCBwYXNzU3R5bGUpO1xuICAgICAgICBpblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFzc1N0eWxlO1xuICAgIH07XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZkludGVybmFsID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgdHlwZXN0ciA9IHR5cGVvZiBpbm5lcjtcbiAgICAgIHN3aXRjaCAodHlwZXN0cikge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIHJldHVybiB0eXBlc3RyO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN0cmluZyhpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgICAgICBpZiAoaW5uZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNGcm96ZW4oaW5uZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgLyogVHlwZWRBcnJheXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGluIGhhcmRlbigpKi9cbiAgICAgICAgICAgICAgLyogYW5kIGEgY29ycmVzcG9uZGluZyBzcGVjaWFsIGVycm9yIG1lc3NhZ2UgaGVyZS4qL1xuICAgICAgICAgICAgICBpc1R5cGVkQXJyYXkoaW5uZXIpXG4gICAgICAgICAgICAgICAgPyBYYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYFxuICAgICAgICAgICAgICAgIDogWGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1Byb21pc2UoaW5uZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnRTYWZlUHJvbWlzZShpbm5lcik7XG4gICAgICAgICAgICByZXR1cm4gJ3Byb21pc2UnO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0eXBlb2YgaW5uZXIudGhlbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuICAgICAgICAgIGNvbnN0IHBhc3NTdHlsZVRhZyA9IGlubmVyW1BBU1NfU1RZTEVdO1xuICAgICAgICAgIGlmIChwYXNzU3R5bGVUYWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihwYXNzU3R5bGVUYWcsICdzdHJpbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IGhlbHBlciA9IEhlbHBlclRhYmxlW3Bhc3NTdHlsZVRhZ107XG4gICAgICAgICAgICBoZWxwZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICBGYWlsYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZChoZWxwZXIsIGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICAgIHJldHVybiAvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi8gKHBhc3NTdHlsZVRhZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpIHtcbiAgICAgICAgICAgIGlmIChoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpIHtcbiAgICAgICAgICAgICAgaGVscGVyLmFzc2VydFJlc3RWYWxpZChpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICAgIHJldHVybiBoZWxwZXIuc3R5bGVOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NlcnRWYWxpZChyZW1vdGFibGVIZWxwZXIsIGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICByZXR1cm4gJ3JlbW90YWJsZSc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOiB7XG4gICAgICAgICAgaXNGcm96ZW4oaW5uZXIpIHx8XG4gICAgICAgICAgICBGYWlsYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xuICAgICAgICAgIHR5cGVvZiBpbm5lci50aGVuICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICBGYWlsYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG4gICAgICAgICAgYXNzZXJ0VmFsaWQocmVtb3RhYmxlSGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgcmV0dXJuICdyZW1vdGFibGUnO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChYYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsIFR5cGVFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbn07XG5cbiAgICAgICBjb25zdCBQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCA9IFN5bWJvbC5mb3IoJ0BlbmRvIHBhc3NTdHlsZU9mJyk7XG5cbi8qKlxuICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIHByb3BlcnR5IG9uIHRoZSBnbG9iYWwsXG4gKiB0aGVuIHByZXN1bWFibHkgaXQgd2FzIGVuZG93ZWQgZm9yIHVzIGJ5IGxpdmVzbG90cyB3aXRoIGEgYHBhc3NTdHlsZU9mYFxuICogZnVuY3Rpb24sIHNvIHdlIHNob3VsZCB1c2UgYW5kIGV4cG9ydCB0aGF0IG9uZSBpbnN0ZWFkLlxuICogT3RoZXIgc29mdHdhcmUgbWF5IGhhdmUgbGVmdCBpdCBmb3IgdXMgaGVyZSxcbiAqIGJ1dCBpdCB3b3VsZCByZXF1aXJlIHdyaXRlIGFjY2VzcyB0byBvdXIgZ2xvYmFsLCBvciB0aGUgYWJpbGl0eSB0b1xuICogcHJvdmlkZSBlbmRvd21lbnRzIHRvIG91ciBnbG9iYWwsIGJvdGggb2Ygd2hpY2ggc2VlbXMgYWRlcXVhdGUgYXMgYSB0ZXN0IG9mXG4gKiB3aGV0aGVyIGl0IGlzIGF1dGhvcml6ZWQgdG8gc2VydmUgdGhlIHNhbWUgcm9sZSBhcyBsaXZlc2xvdHMuXG4gKlxuICogTk9URSBIQVpBUkQ6IFRoaXMgdXNlIGJ5IGxpdmVzbG90cyBkb2VzIHJlbHkgb24gYHBhc3NTdHlsZU9mYCBiZWluZ1xuICogZGV0ZXJtaW5pc3RpYy4gSWYgaXQgaXMgbm90LCB0aGVuIGluIGEgbGl2ZXNsb3QtbGlrZSB2aXJ0dWFsaXplZFxuICogZW52aXJvbm1lbnQsIGl0IGNhbiBiZSB1c2VkIHRvIGRldGVjdCBHQy5cbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi8kaM2PX29uY2UuUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2woUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wpO1xuICAgICAgIGNvbnN0IHBhc3NTdHlsZU9mID1cbiAgKGdsb2JhbFRoaXMgJiYgZ2xvYmFsVGhpc1tQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbF0pIHx8XG4gIG1ha2VQYXNzU3R5bGVPZihbXG4gICAgQ29weUFycmF5SGVscGVyLFxuICAgIEJ5dGVBcnJheUhlbHBlcixcbiAgICBDb3B5UmVjb3JkSGVscGVyLFxuICAgIFRhZ2dlZEhlbHBlcixcbiAgICBFcnJvckhlbHBlcixcbiAgICBSZW1vdGFibGVIZWxwZXIsXG4gIF0pOyRozY9fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cbiAgICAgICBjb25zdCBhc3NlcnRQYXNzYWJsZSA9IHZhbCA9PiB7XG4gIHBhc3NTdHlsZU9mKHZhbCk7IC8qIHRocm93cyBpZiB2YWwgaXMgbm90IGEgcGFzc2FibGUqL1xufTskaM2PX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcblxuLyoqXG4gKiBJcyBgc3BlY2ltZW5gIFBhc3NhYmxlPyBUaGlzIHJldHVybnMgdHJ1ZSBpZmYgYHBhc3NTdHlsZU9mKHNwZWNpbWVuKWBcbiAqIHJldHVybnMgYSBzdHJpbmcuIFRoaXMgcmV0dXJucyBgZmFsc2VgIGlmZiBgcGFzc1N0eWxlT2Yoc3BlY2ltZW4pYCB0aHJvd3MuXG4gKiBVbmRlciBubyBub3JtYWwgY2lyY3Vtc3RhbmNlIHNob3VsZCBgaXNQYXNzYWJsZShzcGVjaW1lbilgIHRocm93LlxuICpcbiAqIFRPRE8gRGVwcmVjYXRlIGFuZCB1bHRpbWF0ZWx5IGRlbGV0ZSBAYWdvcmljL2Jhc2Utem9uZSdzIGBpc1Bhc3NhYmxlJyBpblxuICogZmF2b3Igb2YgdGhpcyBvbmUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8yMDk2XG4gKlxuICogVE9ETyBpbXBsZW1lbnQgYW4gaXNQYXNzYWJsZSB0aGF0IGRvZXMgbm90IHJlbHkgb24gdHJ5L2NhdGNoLlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IGEgc3RhbmRpbiB1bnRpbCB0aGVuLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMjA5NlxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge3NwZWNpbWVuIGlzIFBhc3NhYmxlfVxuICovXG4gICAgICAgY29uc3QgaXNQYXNzYWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgdHJ5IHtcbiAgICAvKiBJbiBmYWN0LCBpdCBuZXZlciByZXR1cm5zIHVuZGVmaW5lZC4gSXQgZWl0aGVyIHJldHVybnMgYSovXG4gICAgLyogc3RyaW5nIG9yIHRocm93cy4qL1xuICAgIHJldHVybiBwYXNzU3R5bGVPZihzcGVjaW1lbikgIT09IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTskaM2PX29uY2UuaXNQYXNzYWJsZShpc1Bhc3NhYmxlKTtcbmhhcmRlbihpc1Bhc3NhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtQcm9wZXJ0eURlc2NyaXB0b3J9IGRlc2NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAobmFtZSwgZGVzYykgPT5cbiAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MobmFtZSwgZGVzYywgcGFzc1N0eWxlT2YpO1xuXG4vKipcbiAqIEFmdGVyIGhhcmRlbmluZywgaWYgYGVycmAgaXMgYSBwYXNzYWJsZSBlcnJvciwgcmV0dXJuIGl0LlxuICpcbiAqIE90aGVyd2lzZSwgcmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpY1xuICogaW5mbyBvZiB0aGUgb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBUT0RPIEFkb3B0IGEgbW9yZSBmbGV4aWJsZSBub3Rpb24gb2YgcGFzc2FibGUgZXJyb3IsIGluIHdoaWNoXG4gKiBhIHBhc3NhYmxlIGVycm9yIGNhbiBjb250YWluIG90aGVyIG93biBkYXRhIHByb3BlcnRpZXMgd2l0aFxuICogdGhyb3dhYmxlIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuICAgICAgIGNvbnN0IHRvUGFzc2FibGVFcnJvciA9IGVyciA9PiB7XG4gIGhhcmRlbihlcnIpO1xuICBpZiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoZXJyLCBwYXNzU3R5bGVPZikpIHtcbiAgICByZXR1cm4gZXJyO1xuICB9XG4gIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gZXJyO1xuICBjb25zdCB7IGNhdXNlOiBjYXVzZURlc2MsIGVycm9yczogZXJyb3JzRGVzYyB9ID1cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGVycik7XG4gIGxldCBjYXVzZTtcbiAgbGV0IGVycm9ycztcbiAgaWYgKGNhdXNlRGVzYyAmJiBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2NhdXNlJywgY2F1c2VEZXNjKSkge1xuICAgIGNhdXNlID0gY2F1c2VEZXNjLnZhbHVlO1xuICB9XG4gIGlmIChlcnJvcnNEZXNjICYmIGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnZXJyb3JzJywgZXJyb3JzRGVzYykpIHtcbiAgICBlcnJvcnMgPSBlcnJvcnNEZXNjLnZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKGAke25hbWV9YCkgfHwgRXJyb3I7XG4gIGNvbnN0IG5ld0Vycm9yID0gbWFrZUVycm9yKGAke21lc3NhZ2V9YCwgZXJyQ29uc3RydWN0b3IsIHtcbiAgICAvKiBAdHMtaWdub3JlIEFzc3VtaW5nIGNhdXNlIGlzIEVycm9yIHwgdW5kZWZpbmVkKi9cbiAgICBjYXVzZSxcbiAgICBlcnJvcnMsXG4gIH0pO1xuICAvKiBTdGlsbCBuZWVkZWQsIGJlY2F1c2UgYG1ha2VFcnJvcmAgb25seSBkb2VzIGEgc2hhbGxvdyBmcmVlemUuKi9cbiAgaGFyZGVuKG5ld0Vycm9yKTtcbiAgLyogRXZlbiB0aGUgY2xlYW5lZCB1cCBlcnJvciBjb3B5LCBpZiBzZW50IHRvIHRoZSBjb25zb2xlLCBzaG91bGQqL1xuICAvKiBjYXVzZSBoaWRkZW4gZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBvZiB0aGUgb3JpZ2luYWwgZXJyb3IqL1xuICAvKiB0byBiZSBsb2dnZWQuKi9cbiAgYW5ub3RhdGVFcnJvcihuZXdFcnJvciwgWGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbiAgcGFzc1N0eWxlT2YobmV3RXJyb3IpID09PSAnZXJyb3InIHx8XG4gICAgRmFpbGBFeHBlY3RlZCAke25ld0Vycm9yfSB0byBiZSBhIHBhc3NhYmxlIGVycm9yYDtcbiAgcmV0dXJuIG5ld0Vycm9yO1xufTskaM2PX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcblxuLyoqXG4gKiBBZnRlciBoYXJkZW5pbmcsIGlmIGBzcGVjaW1lbmAgaXMgdGhyb3dhYmxlLCByZXR1cm4gaXQuXG4gKiBBIHNwZWNpbWVuIGlzIHRocm93YWJsZSBpZmYgaXQgaXMgUGFzc2FibGUgYW5kIGNvbnRhaW5zIG5vIFBhc3NhYmxlQ2FwcyxcbiAqIGkuZS4sIG5vIFJlbW90YWJsZXMgb3IgUHJvbWlzZXMuXG4gKiBJT1csIGlmIGl0IGNvbnRhaW5zIG9ubHkgY29weS1kYXRhIGFuZCBwYXNzYWJsZSBlcnJvcnMuXG4gKlxuICogT3RoZXJ3aXNlLCBpZiBgc3BlY2ltZW5gIGlzICphbG1vc3QqIHRocm93YWJsZSwgZm9yIGV4YW1wbGUsIGl0IGlzXG4gKiBhbiBlcnJvciB0aGF0IGNhbiBiZSBtYWRlIHRocm93YWJsZSBieSBgdG9QYXNzYWJsZUVycm9yYCwgdGhlblxuICogcmV0dXJuIGBzcGVjaW1lbmAgY29udmVydGVkIHRvIGEgdGhyb3dhYmxlLlxuICpcbiAqIE90aGVyd2lzZSwgdGhyb3cgYSBkaWFnbm9zdGljIGluZGljYXRpbmcgYSBmYWlsdXJlIHRvIGNvZXJjZS5cbiAqXG4gKiBUaGlzIGlzIGluIHN1cHBvcnQgb2YgdGhlIGV4byBib3VuZGFyeSB0aHJvd2luZyBvbmx5IHRocm93YWJsZXMsIHRvIGVhc2VcbiAqIHNlY3VyaXR5IHJldmlldy5cbiAqXG4gKiBUT0RPIEFkb3B0IGEgbW9yZSBmbGV4aXRibGUgbm90aW9uIG9mIHRocm93YWJsZSwgaW4gd2hpY2hcbiAqIGRhdGEgY29udGFpbmVycyBjb250YWluaW5nIG5vbi1wYXNzYWJsZSBlcnJvcnMgY2FuIHRoZW1zZWx2ZXMgYmUgY29lcmNlZFxuICogdG8gdGhyb3dhYmxlIGJ5IGNvZXJjaW5nIHRvIGEgc2ltaWxhciBjb250YWluZXJzIGNvbnRhaW5pbmdcbiAqIHRoZSByZXN1bHRzIG9mIGNvZXJjaW5nIHRob3NlIGVycm9ycyB0byBwYXNzYWJsZSBlcnJvcnMuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHJldHVybnMge1Bhc3NhYmxlPG5ldmVyLCBFcnJvcj59XG4gKi9cbiAgICAgICBjb25zdCB0b1Rocm93YWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgaGFyZGVuKHNwZWNpbWVuKTtcbiAgaWYgKGlzRXJyb3JMaWtlKHNwZWNpbWVuKSkge1xuICAgIHJldHVybiB0b1Bhc3NhYmxlRXJyb3IoLyoqIEB0eXBlIHtFcnJvcn0gKi8gKHNwZWNpbWVuKSk7XG4gIH1cbiAgaWYgKCFpc1ByaW1pdGl2ZShzcGVjaW1lbikpIHtcbiAgICAvKiBOb3RlIHRoYXQgdGhpcyBzdGVwIHdpbGwgZmFpbCBpZiBgc3BlY2ltZW5gIHdvdWxkIGJlIGEgcGFzc2FibGUgY29udGFpbmVyKi9cbiAgICAvKiBleGNlcHQgdGhhdCBpdCBjb250YWlucyBub24tcGFzc2FibGUgZXJyb3JzIHRoYXQgY291bGQgYmUgY29udmVydGVkLiovXG4gICAgLyogVGhpcyB3aWxsIG5lZWQgdG8gYmUgZml4ZWQgdG8gZG8gdGhlIFRPRE8gYWJvdmUuKi9cbiAgICBjb25zdCBwYXNzU3R5bGUgPSAvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi8gKHBhc3NTdHlsZU9mKHNwZWNpbWVuKSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAvKiogQHR5cGUge0NvcHlBcnJheX0gKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgZWxlbWVudCA9PT0gdG9UaHJvd2FibGUoZWxlbWVudCkgfHxcbiAgICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZWxlbWVudH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgY29uc3QgcmVjID0gLyoqIEB0eXBlIHtDb3B5UmVjb3JkfSAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMocmVjKSkge1xuICAgICAgICAgIHZhbCA9PT0gdG9UaHJvd2FibGUodmFsKSB8fFxuICAgICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHt2YWx9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgY29uc3QgdGcgPSAvKiogQHR5cGUge0NvcHlUYWdnZWR9ICovIChzcGVjaW1lbik7XG4gICAgICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gdGc7XG4gICAgICAgIHBheWxvYWQgPT09IHRvVGhyb3dhYmxlKHBheWxvYWQpIHx8XG4gICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtwYXlsb2FkfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVyID0gLyoqIEB0eXBlIHtFcnJvcn0gKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZXIgPT09IHRvVGhyb3dhYmxlKGVyKSB8fFxuICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZXJ9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgQSAke3EocGFzc1N0eWxlKX0gaXMgbm90IHRocm93YWJsZTogJHtzcGVjaW1lbn1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gLyoqIEB0eXBlIHtQYXNzYWJsZTxuZXZlcixuZXZlcj59ICovIChzcGVjaW1lbik7XG59OyRozY9fb25jZS50b1Rocm93YWJsZSh0b1Rocm93YWJsZSk7XG5oYXJkZW4odG9UaHJvd2FibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiXSwicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXSwiaXNQYXNzYWJsZSI6WyJpc1Bhc3NhYmxlIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXSwidG9UaHJvd2FibGUiOlsidG9UaHJvd2FibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+5yfsjAuAAAwLgAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImNhbkJlTWV0aG9kIiwiZ2V0SW50ZXJmYWNlT2YiLCJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxnZXRNZXRob2ROYW1lcyxhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc1ByaW1pdGl2ZSxnZXRUYWcsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChnZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsWyRozY9fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaM2PX2EpXV0sW1wiY2hlY2tGdW5jdGlvblRhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSAkaM2PX2EpXV0sW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q2hlY2tlciwgUmVtb3RhYmxlTWV0aG9kTmFtZX0gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge0ludGVyZmFjZVNwZWMsIFBhc3NTdHlsZWR9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVPYmplY3R9IGZyb20gJy4vdHlwZXMuanMnXG4gKi9cblxuLyoqXG4gKiBGb3IgYSBmdW5jdGlvbiB0byBiZSBhIHZhbGlkIG1ldGhvZCwgaXQgbXVzdCBub3QgYmUgcGFzc2FibGUuXG4gKiBPdGhlcndpc2UsIHdlIHJpc2sgY29uZnVzaW5nIHBhc3MtYnktY29weSBkYXRhIGNhcnJ5aW5nXG4gKiBmYXIgZnVuY3Rpb25zIHdpdGggYXR0ZW1wdHMgYXQgZmFyIG9iamVjdHMgd2l0aCBtZXRob2RzLlxuICpcbiAqIFRPRE8gSEFaQVJEIEJlY2F1c2Ugd2UgY2hlY2sgdGhpcyBvbiB0aGUgd2F5IHRvIGhhcmRlbmluZyBhIHJlbW90YWJsZSxcbiAqIHdlIGNhbm5vdCB5ZXQgY2hlY2sgdGhhdCBgZnVuY2AgaXMgaGFyZGVuZWQuIEhvd2V2ZXIsIHdpdGhvdXRcbiAqIGRvaW5nIHNvLCBpdCdzIGluaGVyaXRhbmNlIG1pZ2h0IGNoYW5nZSBhZnRlciB0aGUgYFBBU1NfU1RZTEVgXG4gKiBjaGVjayBiZWxvdy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gZnVuY1xuICogQHJldHVybnMge2Z1bmMgaXMgQ2FsbGFibGVGdW5jdGlvbn1cbiAqL1xuICAgICAgIGNvbnN0IGNhbkJlTWV0aG9kID0gZnVuYyA9PlxuICB0eXBlb2YgZnVuYyA9PT0gJ2Z1bmN0aW9uJyAmJiAhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjNj19vbmNlLmNhbkJlTWV0aG9kKGNhbkJlTWV0aG9kKTtcbmhhcmRlbihjYW5CZU1ldGhvZCk7XG5cbi8qIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8yODg0Ki9cbi8qIEFic3RyYWN0IG91dCBjYW5CZU1ldGhvZE5hbWUgc28gbGF0ZXIgUFJzIGFncmVlIG9uIG1ldGhvZCBuYW1lIHJlc3RyaWN0aW9ucy4qL1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBrZXlcbiAqIEByZXR1cm5zIHtrZXkgaXMgUmVtb3RhYmxlTWV0aG9kTmFtZX1cbiAqL1xuY29uc3QgY2FuQmVNZXRob2ROYW1lID0ga2V5ID0+XG4gIC8qIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBrZXkgPT09ICdzeW1ib2wnOyovXG4gIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBrZXkgPT09ICdzeW1ib2wnIHx8IHR5cGVvZiBrZXkgPT09ICdudW1iZXInO1xuaGFyZGVuKGNhbkJlTWV0aG9kTmFtZSk7XG5cbi8qKlxuICogVXNlcyB0aGUgYGdldE1ldGhvZE5hbWVzYCBmcm9tIHRoZSBldmVudHVhbC1zZW5kIGxldmVsIG9mIGFic3RyYWN0aW9uIHRoYXRcbiAqIGRvZXMgbm90IGtub3cgYW55dGhpbmcgYWJvdXQgcmVtb3RhYmxlcy5cbiAqXG4gKiBDdXJyZW50bHksIGp1c3QgYWxpYXMgYGdldE1ldGhvZE5hbWVzYCBidXQgdGhpcyBhYnN0cmFjdGlvbiBleGlzdHMgc29cbiAqIGEgZnV0dXJlIFBSIGNhbiBlbmZvcmNlIHJlc3RyaWN0aW9ucyBvbiBtZXRob2QgbmFtZXMgb2YgcmVtb3RhYmxlcy5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHJldHVybnMge1JlbW90YWJsZU1ldGhvZE5hbWVbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldFJlbW90YWJsZU1ldGhvZE5hbWVzID0gYmVoYXZpb3JNZXRob2RzID0+XG4gIGdldE1ldGhvZE5hbWVzKGJlaGF2aW9yTWV0aG9kcyk7JGjNj19vbmNlLmdldFJlbW90YWJsZU1ldGhvZE5hbWVzKGdldFJlbW90YWJsZU1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRSZW1vdGFibGVNZXRob2ROYW1lcyk7XG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7XG4gIGdldFByb3RvdHlwZU9mLFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG4gIGhhc093bixcbn0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2UgPSAoaWZhY2UsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4gICAgKHR5cGVvZiBpZmFjZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpICYmXG4gICAgKGlmYWNlID09PSAnUmVtb3RhYmxlJyB8fFxuICAgICAgaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJykgfHxcbiAgICAgIGlmYWNlLnN0YXJ0c1dpdGgoJ0RlYnVnTmFtZTogJykgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKGNoZWNrKWBGb3Igbm93LCBpZmFjZSAke3EoXG4gICAgICAgICAgaWZhY2UsXG4gICAgICAgICl9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiOyB1bmltcGxlbWVudGVkYCkpXG4gICk7XG59O1xuXG4vKipcbiAqIEFuIGBpZmFjZWAgbXVzdCBiZSBwdXJlLiBSaWdodCBub3cgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hpY2ggaXMgcHVyZS5cbiAqIExhdGVyIHdlIGV4cGVjdCB0byBpbmNsdWRlIHNvbWUgb3RoZXIgdmFsdWVzIHRoYXQgcXVhbGlmeSBhcyBgUHVyZURhdGFgLFxuICogd2hpY2ggaXMgYSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgZW5kaW5nIG9ubHkgaW4gcHJpbWl0aXZlcyBvclxuICogZW1wdHkgcGFzcy1ieS1jb3B5IGNvbXBvc2l0ZXMuIE5vIHJlbW90YWJsZXMsIHByb21pc2VzLCBvciBlcnJvcnMuXG4gKiBXZSAqYXNzdW1lKiBmb3Igbm93IHRoYXQgdGhlIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBjb250YWlucyBub1xuICogcHJveGllcy5cbiAqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRJZmFjZSA9IGlmYWNlID0+IGNoZWNrSWZhY2UoaWZhY2UsIGFzc2VydENoZWNrZXIpOyRozY9fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0IHwgRnVuY3Rpb259IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2YgPSAob3JpZ2luYWwsIGNoZWNrKSA9PiB7XG4gICFpc1ByaW1pdGl2ZShvcmlnaW5hbCkgfHxcbiAgICBGYWlsYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4gIC8qIEEgdmFsaWQgcmVtb3RhYmxlIG9iamVjdCBtdXN0IGluaGVyaXQgZnJvbSBhIFwidGFnIHJlY29yZFwiIC0tIGEqL1xuICAvKiBwbGFpbi1vYmplY3QgcHJvdG90eXBlIGNvbnNpc3Rpbmcgb2Ygb25seSovXG4gIC8qIGEgYFBBU1NfU1RZTEVgIHByb3BlcnR5IHdpdGggdmFsdWUgXCJyZW1vdGFibGVcIiBhbmQgYSBzdWl0YWJsZSBgU3ltYm9sLnRvU3RyaW5nVGFnYCovXG4gIC8qIHByb3BlcnR5LiBUaGUgcmVtb3RhYmxlIGNvdWxkIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZCwgb3IqL1xuICAvKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4gIC8qIGluaGVyaXRzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZC4qL1xuICAvKiovXG4gIC8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuICAvKiB3aXRoIFBBU1NfU1RZTEUgZnJvbSBKU0RvYy4qL1xuICAvKiovXG4gIC8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4gIC8qIFtTeW1ib2wudG9TdHJpbmdUYWddOiBzdHJpbmcsKi9cbiAgLyogfX0qL1xuICAvKiovXG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuICBpZiAoXG4gICAgcHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgIHByb3RvID09PSBudWxsIHx8XG4gICAgcHJvdG8gPT09IEZ1bmN0aW9uLnByb3RvdHlwZVxuICApIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBwcm90b1Byb3RvID0gZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIGlmIChwcm90b1Byb3RvICE9PSBvYmplY3RQcm90b3R5cGUgJiYgcHJvdG9Qcm90byAhPT0gbnVsbCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIHJldHVybiBjaGVja1JlbW90YWJsZShwcm90bywgY2hlY2spO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCAncmVtb3RhYmxlJywgY2hlY2spKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICghY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywgJ3JlbW90YWJsZScsIGNoZWNrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4gIGNvbnN0IHBhc3NTdHlsZUtleSA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKFBBU1NfU1RZTEUpO1xuICBjb25zdCB0YWdLZXkgPSAvKiogQHR5cGUge3Vua25vd259ICovIChTeW1ib2wudG9TdHJpbmdUYWcpO1xuICBjb25zdCB7XG4gICAgLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuICAgIFsvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhc3NTdHlsZUtleSldOiBfcGFzc1N0eWxlRGVzYyxcbiAgICBbLyoqIEB0eXBlIHtzdHJpbmd9ICovICh0YWdLZXkpXTogeyB2YWx1ZTogaWZhY2UgfSxcbiAgICAuLi5yZXN0RGVzY3NcbiAgfSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG4gIHJldHVybiAoXG4gICAgKG93bktleXMocmVzdERlc2NzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiBSZW1vdGFibGUgUHJvdG8gJHtvd25LZXlzKHJlc3REZXNjcyl9YCkpICYmXG4gICAgY2hlY2tJZmFjZShpZmFjZSwgY2hlY2spXG4gICk7XG59O1xuXG4vKipcbiAqIEtlZXAgYSB3ZWFrIHNldCBvZiBjb25maXJtZWQgcmVtb3RhYmxlcyBmb3IgbWFyc2hhbCBwZXJmb3JtYW5jZVxuICogKHdpdGhvdXQgd2hpY2ggd2Ugd291bGQgaW5jdXIgYSByZWR1bmRhbnQgdmVyaWZpY2F0aW9uIGluXG4gKiBnZXRJbnRlcmZhY2VPZikuXG4gKiBXZSBkb24ndCByZW1lbWJlciByZWplY3Rpb25zIGJlY2F1c2UgdGhleSBhcmUgcG9zc2libGUgdG8gY29ycmVjdFxuICogd2l0aCBlLmcuIGBoYXJkZW5gLlxuICpcbiAqIEB0eXBlIHtXZWFrU2V0PFJlbW90YWJsZU9iamVjdD59XG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXMgPSBuZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge3ZhbCBpcyBSZW1vdGFibGVPYmplY3R9XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlID0gKHZhbCwgY2hlY2spID0+IHtcbiAgaWYgKGNvbmZpcm1lZFJlbW90YWJsZXMuaGFzKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzRnJvemVuKHZhbCkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJiBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gXG4gICAgKTtcbiAgfVxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICBpZiAoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCwgY2hlY2spKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrUmVtb3RhYmxlUHJvdG9PZih2YWwsIGNoZWNrKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvbmZpcm1lZFJlbW90YWJsZXMuYWRkKHZhbCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogU2ltcGxlIHNlbWFudGljcywganVzdCB0ZWxsIHdoYXQgaW50ZXJmYWNlIHNwZWMgYSBSZW1vdGFibGUgaGFzLFxuICogb3IgdW5kZWZpbmVkIGlmIG5vdCBkZWVtZWQgdG8gYmUgYSBSZW1vdGFibGUuXG4gKlxuICogQHR5cGUge3tcbiAqIDxUIGV4dGVuZHMgc3RyaW5nPih2YWw6IFBhc3NTdHlsZWQ8YW55LCBUPik6IFQ7XG4gKiAodmFsOiBhbnkpOiBJbnRlcmZhY2VTcGVjIHwgdW5kZWZpbmVkO1xuICogfX1cbiAqL1xuICAgICAgIGNvbnN0IGdldEludGVyZmFjZU9mID0gdmFsID0+IHtcbiAgaWYgKFxuICAgIGlzUHJpbWl0aXZlKHZhbCkgfHxcbiAgICB2YWxbUEFTU19TVFlMRV0gIT09ICdyZW1vdGFibGUnIHx8XG4gICAgIWNoZWNrUmVtb3RhYmxlKHZhbClcbiAgKSB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgcmV0dXJuIGdldFRhZyh2YWwpO1xufTskaM2PX29uY2UuZ2V0SW50ZXJmYWNlT2YoZ2V0SW50ZXJmYWNlT2YpO1xuaGFyZGVuKGdldEludGVyZmFjZU9mKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IFJlbW90YWJsZUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ3JlbW90YWJsZScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCB2YWxpZFR5cGUgPVxuICAgICAgKCFpc1ByaW1pdGl2ZShjYW5kaWRhdGUpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgKCFpc0FycmF5KGNhbmRpZGF0ZSkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBhcnJheXMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgLyogRXZlcnkgb3duIHByb3BlcnR5IChyZWdhcmRsZXNzIG9mIGVudW1lcmFiaWxpdHkpKi9cbiAgICAgIC8qIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHZhbHVlLiovXG4gICAgICByZXR1cm4gb3duS2V5cyhkZXNjcykuZXZlcnkoa2V5ID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvKiBUeXBlY2FzdCBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4gICAgICAgICAgKGhhc093bihkZXNjc1svKiogQHR5cGUge3N0cmluZ30gKi8gKGtleSldLCAndmFsdWUnKSB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICBTdHJpbmcoa2V5KSxcbiAgICAgICAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgKChrZXkgPT09IFN5bWJvbC50b1N0cmluZ1RhZyAmJiBjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLCBjaGVjaykpIHx8XG4gICAgICAgICAgICAoKGNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKSB8fFxuICAgICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICAgICAgICAgICl9IGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICAgICAoa2V5ICE9PSBQQVNTX1NUWUxFIHx8XG4gICAgICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgICAgIENYKGNoZWNrKWBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8qIEZhciBmdW5jdGlvbnMgY2Fubm90IGJlIG1ldGhvZHMsIGFuZCBjYW5ub3QgaGF2ZSBtZXRob2RzLiovXG4gICAgICAvKiBUaGV5IG11c3QgaGF2ZSBleGFjdGx5IGV4cGVjdGVkIGAubmFtZWAgYW5kIGAubGVuZ3RoYCBwcm9wZXJ0aWVzKi9cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbmFtZTogbmFtZURlc2MsXG4gICAgICAgIGxlbmd0aDogbGVuZ3RoRGVzYyxcbiAgICAgICAgLyogQHRzLWlnbm9yZSBUUyBkb2Vzbid0IGxpa2Ugc3ltYm9scyBhcyBjb21wdXRlZCBpbmRleGVzPz8qL1xuICAgICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogdG9TdHJpbmdUYWdEZXNjLFxuICAgICAgICAuLi5yZXN0RGVzY3NcbiAgICAgIH0gPSBkZXNjcztcbiAgICAgIGNvbnN0IHJlc3RLZXlzID0gb3duS2V5cyhyZXN0RGVzY3MpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKChuYW1lRGVzYyAmJiB0eXBlb2YgbmFtZURlc2MudmFsdWUgPT09ICdzdHJpbmcnKSB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChjaGVjaylgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICgobGVuZ3RoRGVzYyAmJiB0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZSA9PT0gJ251bWJlcicpIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgKHRvU3RyaW5nVGFnRGVzYyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKCh0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgICBjaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSwgY2hlY2spKSkgJiZcbiAgICAgICAgKHJlc3RLZXlzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICApYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAhIWNoZWNrICYmIENYKGNoZWNrKWB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWA7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiBjYW5kaWRhdGUgPT4gY2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKSxcblxuICBldmVyeTogKF9wYXNzYWJsZSwgX2ZuKSA9PiB0cnVlLFxufSk7JGjNj19vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiOlsiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiXSwiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACHgA8oUhYAAFIWAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpc1Byb21pc2UscSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKiogQGltcG9ydCB7Q2hlY2tlcn0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBpc0Zyb3plbiwgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvciwgaGFzT3duIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IHRvU3RyaW5nVGFnIH0gPSBTeW1ib2w7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlfSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tQcm9taXNlT3duS2V5cyA9IChwciwgY2hlY2spID0+IHtcbiAgY29uc3Qga2V5cyA9IG93bktleXMocHIpO1xuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gKiBUaGlzIGV4Y2x1ZGVzIHRob3NlIHN5bWJvbC1uYW1lZCBvd24gcHJvcGVydGllcyB0aGF0IGFyZSBhbHNvIGZvdW5kIG9uXG4gKiBgUHJvbWlzZS5wcm90b3R5cGVgLCBzbyB0aGF0IG92ZXJyaWRlcyBvZiB0aGVzZSBwcm9wZXJ0aWVzIGNhbiBiZVxuICogZXhwbGljaXRseSB0b2xlcmF0ZWQgaWYgdGhleSBwYXNzIHRoZSBgY2hlY2tTYWZlT3duS2V5YCBjaGVjayBiZWxvdy5cbiAqIEluIHBhcnRpY3VsYXIsIHdlIHdpc2ggdG8gdG9sZXJhdGVcbiAqICAgKiBBbiBvdmVycmlkaW5nIGB0b1N0cmluZ1RhZ2Agbm9uLWVudW1lcmFibGUgZGF0YSBwcm9wZXJ0eVxuICogICAgIHdpdGggYSBzdHJpbmcgdmFsdWUuXG4gKiAgICogVGhvc2Ugb3duIHByb3BlcnRpZXMgdGhhdCBtaWdodCBiZSBhZGRlZCBieSBOb2RlJ3MgYXN5bmNfaG9va3MuXG4gKi9cbiAgY29uc3QgdW5rbm93bktleXMgPSBrZXlzLmZpbHRlcihcbiAgICBrZXkgPT4gdHlwZW9mIGtleSAhPT0gJ3N5bWJvbCcgfHwgIWhhc093bihQcm9taXNlLnByb3RvdHlwZSwga2V5KSxcbiAgKTtcblxuICBpZiAodW5rbm93bktleXMubGVuZ3RoICE9PSAwKSB7XG4gICAgcmV0dXJuIENYKFxuICAgICAgY2hlY2ssXG4gICAgKWAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWA7XG4gIH1cblxuICAvKipcbiAqIEV4cGxpY2l0bHkgdG9sZXJhdGUgYSBgdG9TdHJpbmdUYWdgIHN5bWJvbC1uYW1lZCBub24tZW51bWVyYWJsZVxuICogZGF0YSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhIHN0cmluZy4gT3RoZXJ3aXNlLCB0b2xlcmF0ZSB0aG9zZVxuICogc3ltYm9sLW5hbWVkIHByb3BlcnRpZXMgdGhhdCBtaWdodCBiZSBhZGRlZCBieSBOb2RlSlMncyBhc3luY19ob29rcyxcbiAqIGlmIHRoZXkgb2JleSB0aGUgZXhwZWN0ZWQgc2FmZXR5IHByb3BlcnRpZXMuXG4gKlxuICogQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCBOb2RlJ3MgYXN5bmNfaG9va3MgY29udGFpbnMgdGhlXG4gKiBmb2xsb3dpbmcgY29kZSwgd2hpY2ggd2UgY2FuIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiAgIHRyYWNrUHJvbWlzZShwcm9taXNlLCBwYXJlbnQpO1xuICogICBjb25zdCBhc3luY0lkID0gcHJvbWlzZVthc3luY19pZF9zeW1ib2xdO1xuICogICBjb25zdCBkZXN0cm95ZWQgPSB7IGRlc3Ryb3llZDogZmFsc2UgfTtcbiAqICAgcHJvbWlzZVtkZXN0cm95ZWRTeW1ib2xdID0gZGVzdHJveWVkO1xuICogICByZWdpc3RlckRlc3Ryb3lIb29rKHByb21pc2UsIGFzeW5jSWQsIGRlc3Ryb3llZCk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGtleVxuICovXG4gIGNvbnN0IGNoZWNrU2FmZU93bktleSA9IGtleSA9PiB7XG4gICAgaWYgKGtleSA9PT0gdG9TdHJpbmdUYWcpIHtcbiAgICAgIC8qIFRPRE8gc2hvdWxkIHdlIGFsc28gZW5mb3JjZSBhbnl0aGluZyBvbiB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZywqL1xuICAgICAgLyogc3VjaCBhcyB0aGF0IGl0IG11c3Qgc3RhcnQgd2l0aCBgJ1Byb21pc2UnYD8qL1xuICAgICAgY29uc3QgdGFnRGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihwciwgdG9TdHJpbmdUYWcpO1xuICAgICAgYXNzZXJ0KHRhZ0Rlc2MgIT09IHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoaGFzT3duKHRhZ0Rlc2MsICd2YWx1ZScpIHx8XG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYE93biBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBkYXRhIHByb3BlcnR5LCBub3QgYW4gYWNjZXNzb3I6ICR7cSh0YWdEZXNjKX1gKSAmJlxuICAgICAgICAodHlwZW9mIHRhZ0Rlc2MudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYE93biBAQHRvU3RyaW5nVGFnIHZhbHVlIG11c3QgYmUgYSBzdHJpbmc6ICR7cSh0YWdEZXNjLnZhbHVlKX1gKSAmJlxuICAgICAgICAoIXRhZ0Rlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAgIENYKGNoZWNrKWBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlOiAke3EodGFnRGVzYyl9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHZhbCA9IHByW2tleV07XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbCAhPT0gbnVsbCAmJlxuICAgICAgaXNGcm96ZW4odmFsKSAmJlxuICAgICAgZ2V0UHJvdG90eXBlT2YodmFsKSA9PT0gT2JqZWN0LnByb3RvdHlwZVxuICAgICkge1xuICAgICAgY29uc3Qgc3ViS2V5cyA9IG93bktleXModmFsKTtcbiAgICAgIGlmIChzdWJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBzdWJLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBzdWJLZXlzWzBdID09PSAnZGVzdHJveWVkJyAmJlxuICAgICAgICB2YWwuZGVzdHJveWVkID09PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQ1goXG4gICAgICBjaGVjayxcbiAgICApYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuICAgICAgU3RyaW5nKGtleSksXG4gICAgKX0gaXMgJHt2YWx9YDtcbiAgfTtcblxuICByZXR1cm4ga2V5cy5ldmVyeShjaGVja1NhZmVPd25LZXkpO1xufTtcblxuLyoqXG4gKiBVbmRlciBIYXJkZW5lZCBKUyBhIHByb21pc2UgaXMgXCJzYWZlXCIgaWYgaXRzIGB0aGVuYCBtZXRob2QgY2FuIGJlIGNhbGxlZFxuICogc3luY2hyb25vdXNseSB3aXRob3V0IGdpdmluZyB0aGUgcHJvbWlzZSBhbiBvcHBvcnR1bml0eSBmb3IgYVxuICogcmVlbnRyYW5jeSBhdHRhY2sgZHVyaW5nIHRoYXQgY2FsbC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzlcbiAqIHJhaXNlcyB0aGUgaXNzdWUgb2YgdGVzdGluZyB0aGF0IGEgc3BlY2ltZW4gaXMgYSBzYWZlIHByb21pc2VcbiAqIHN1Y2ggdGhhdCB0aGUgdGVzdCBhbHNvIGRvZXMgbm90IGdpdmUgdGhlIHNwZWNpbWVuIGFcbiAqIHJlZW50cmFuY3kgb3Bwb3J0dW5pdHkuIFRoYXQgaXMgd2VsbCBiZXlvbmQgdGhlIGFtYml0aW9uIGhlcmUuXG4gKiBUT0RPIFRob3VnaCBpZiB3ZSBmaWd1cmUgb3V0IGEgbmljZSBzb2x1dGlvbiwgaXQgbWlnaHQgYmUgZ29vZCB0b1xuICogdXNlIGl0IGhlcmUgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlID0gKHByLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIChpc0Zyb3plbihwcikgfHwgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSAmJlxuICAgIChpc1Byb21pc2UocHIpIHx8IENYKGNoZWNrKWAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkgJiZcbiAgICAoZ2V0UHJvdG90eXBlT2YocHIpID09PSBQcm9taXNlLnByb3RvdHlwZSB8fFxuICAgICAgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbiAgICAgICAgZ2V0UHJvdG90eXBlT2YocHIpLFxuICAgICAgKX1gKSAmJlxuICAgIGNoZWNrUHJvbWlzZU93bktleXMoLyoqIEB0eXBlIHtQcm9taXNlfSAqLyAocHIpLCBjaGVjaylcbiAgKTtcbn07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbiAgICAgICBjb25zdCBpc1NhZmVQcm9taXNlID0gcHIgPT4gY2hlY2tTYWZlUHJvbWlzZShwciwgeCA9PiB4KTskaM2PX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFNhZmVQcm9taXNlID0gcHIgPT4gY2hlY2tTYWZlUHJvbWlzZShwciwgYXNzZXJ0Q2hlY2tlcik7JGjNj19vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD8qNkH2w8AANsPAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3N0cmluZy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImlzV2VsbEZvcm1lZFN0cmluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qIGtub3cgYWJvdXRgaXNXZWxsRm9ybWVkYCovXG5jb25zdCBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kID0gISFTdHJpbmcucHJvdG90eXBlLmlzV2VsbEZvcm1lZDtcblxuLyoqXG4gKiBJcyB0aGUgYXJndW1lbnQgYSB3ZWxsLWZvcm1lZCBzdHJpbmc/XG4gKlxuICogVW5mb3J0dW5hdGVseSwgdGhlXG4gKiBbc3RhbmRhcmQgYnVpbHQtaW4gYFN0cmluZy5wcm90b3R5cGUuaXNXZWxsRm9ybWVkYF0oaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXMtdXN2LXN0cmluZylcbiAqIGRvZXMgYSBUb1N0cmluZyBvbiBpdHMgaW5wdXQsIGNhdXNpbmcgaXQgdG8ganVkZ2Ugbm9uLXN0cmluZ3MgdG8gYmVcbiAqIHdlbGwtZm9ybWVkIHN0cmluZ3MgaWYgdGhleSBjb2VyY2UgdG8gYSB3ZWxsLWZvcm1lZCBzdHJpbmdzLiBUaGlzXG4gKiByZWNhcGl0dWxhdGVzIHRoZSBtaXN0YWtlIGluIGhhdmluZyB0aGUgZ2xvYmFsIGBpc05hTmAgY29lcmNlIGl0cyBpbnB1dHMsXG4gKiBjYXVzaW5nIGl0IHRvIGp1ZGdlIG5vbi1zdHJpbmcgdG8gYmUgTmFOIGlmIHRoZXkgY29lcmNlIHRvIE5hTi5cbiAqXG4gKiBUaGlzIGBpc1dlbGxGb3JtZWRTdHJpbmdgIGZ1bmN0aW9uIG9ubHkganVkZ2VzIHdlbGwtZm9ybWVkIHN0cmluZ3MgdG8gYmVcbiAqIHdlbGwtZm9ybWVkIHN0cmluZ3MuIEZvciBhbGwgbm9uLXN0cmluZ3MgaXQgcmV0dXJucyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHN0clxuICogQHJldHVybnMge3N0ciBpcyBzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCBpc1dlbGxGb3JtZWRTdHJpbmcgPSBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kXG4gID8gc3RyID0+IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnICYmIHN0ci5pc1dlbGxGb3JtZWQoKVxuICA6IHN0ciA9PiB7XG4gICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaCBvZiBzdHIpIHtcbiAgICAgICAgLyogVGhlIHN0cmluZyBpdGVyYXRvciBpdGVyYXRlcyBieSBVbmljb2RlIGNvZGUgcG9pbnQsIG5vdCovXG4gICAgICAgIC8qIFVURjE2IGNvZGUgdW5pdC4gQnV0IGlmIGl0IGVuY291bnRlcnMgYW4gdW5wYWlyZWQgc3Vycm9nYXRlLCovXG4gICAgICAgIC8qIGl0IHdpbGwgcHJvZHVjZSBpdC4qL1xuICAgICAgICBjb25zdCBjcCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2guY29kZVBvaW50QXQoMCkpO1xuICAgICAgICBpZiAoY3AgPj0gMHhkODAwICYmIGNwIDw9IDB4ZGZmZikge1xuICAgICAgICAgIC8qIEFsbCBzdXJyb2dhdGVzIGFyZSBpbiB0aGlzIHJhbmdlLiBUaGUgc3RyaW5nIGl0ZXJhdG9yIG9ubHkqL1xuICAgICAgICAgIC8qIHByb2R1Y2VzIGEgY2hhcmFjdGVyIGluIHRoaXMgcmFuZ2UgZm9yIHVucGFpcmVkIHN1cnJvZ2F0ZXMsKi9cbiAgICAgICAgICAvKiB3aGljaCBvbmx5IGhhcHBlbnMgaWYgdGhlIHN0cmluZyBpcyBub3Qgd2VsbC1mb3JtZWQuKi9cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07JGjNj19vbmNlLmlzV2VsbEZvcm1lZFN0cmluZyhpc1dlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5cbi8qKlxuICogUmV0dXJucyBub3JtYWxseSB3aGVuIGBpc1dlbGxGb3JtZWRTdHJpbmcoc3RyKWAgd291bGQgcmV0dXJuIHRydWUuXG4gKiBUaHJvd3MgYSBkaWFnbm9zdGljIGVycm9yIHdoZW4gYGlzV2VsbEZvcm1lZFN0cmluZyhzdHIpYCB3b3VsZCByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBzdHJcbiAqIEByZXR1cm5zIHthc3NlcnRzIHN0ciBpcyBzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nID0gc3RyID0+IHtcbiAgaXNXZWxsRm9ybWVkU3RyaW5nKHN0cikgfHwgRmFpbGBFeHBlY3RlZCB3ZWxsLWZvcm1lZCB1bmljb2RlIHN0cmluZzogJHtzdHJ9YDtcbn07JGjNj19vbmNlLmFzc2VydFdlbGxGb3JtZWRTdHJpbmcoYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5cbmNvbnN0IE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRSA9XG4gIGdldEVudmlyb25tZW50T3B0aW9uKCdPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUnLCAnZGlzYWJsZWQnLCBbXG4gICAgJ2VuYWJsZWQnLFxuICBdKSA9PT0gJ2VuYWJsZWQnO1xuXG4vKipcbiAqIEZvciBub3csXG4gKiBpZiBgT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFYCBlbnZpcm9ubWVudCBvcHRpb24gaXMgYCdlbmFibGVkJ2AsXG4gKiB0aGVuIGBhc3NlcnRQYXNzYWJsZVN0cmluZ2AgaXMgdGhlIHNhbWUgYXMgYGFzc2VydFdlbGxGb3JtZWRTdHJpbmdgLlxuICogT3RoZXJ3aXNlIGBhc3NlcnRQYXNzYWJsZVN0cmluZ2AganVzdCBhc3NlcnRzIHRoYXQgYHN0cmAgaXMgYSBzdHJpbmcuXG4gKlxuICogQ3VycmVudGx5LCBgT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFYCBkZWZhdWx0cyB0byBgJ2Rpc2FibGVkJ2BcbiAqIGJlY2F1c2Ugd2UgZG8gbm90IHlldCBrbm93IHRoZSBwZXJmb3JtYW5jZSBpbXBhY3QuIExhdGVyLCBpZiB3ZSBkZWNpZGUgd2VcbiAqIGNhbiBhZmZvcmQgaXQsIHdlJ2xsIGZpcnN0IGNoYW5nZSB0aGUgZGVmYXVsdCB0byBgJ2VuYWJsZWQnYCBhbmQgdWx0aW1hdGVseVxuICogcmVtb3ZlIHRoZSBzd2l0Y2ggYWx0b2dldGhlci4gQmUgcHJlcGFyZWQgZm9yIHRoZXNlIGNoYW5nZXMuXG4gKlxuICogVE9ETyBvbmNlIHRoZSBzd2l0Y2ggaXMgcmVtb3ZlZCwgc2ltcGxpZnkgYGFzc2VydFBhc3NhYmxlU3RyaW5nYCB0b1xuICogc2ltcGx5IGJlIGBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nYC5cbiAqXG4gKiBAcGFyYW0geyB1bmtub3duIH0gc3RyXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzdHIgaXMgc3RyaW5nIH1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3RyaW5nID0gc3RyID0+IHtcbiAgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgfHwgRmFpbGBFeHBlY3RlZCBzdHJpbmcgJHtzdHJ9YDtcbiAgIU9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRSB8fCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKHN0cik7XG59OyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZVN0cmluZyhhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTdHJpbmcpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNXZWxsRm9ybWVkU3RyaW5nIjpbImlzV2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIjpbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciXSwiYXNzZXJ0UGFzc2FibGVTdHJpbmciOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAvc0IsMUAADDFAAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zeW1ib2wuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIFRoZSB3ZWxsIGtub3duIHN5bWJvbHMgYXJlIHN0YXRpYyBzeW1ib2wgdmFsdWVzIG9uIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3Rvci5cbiAqL1xuY29uc3Qgd2VsbEtub3duU3ltYm9sTmFtZXMgPSBuZXcgTWFwKFxuICBvd25LZXlzKFN5bWJvbClcbiAgICAuZmlsdGVyKFxuICAgICAgbmFtZSA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIFN5bWJvbFtuYW1lXSA9PT0gJ3N5bWJvbCcsXG4gICAgKVxuICAgIC5maWx0ZXIobmFtZSA9PiB7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovXG4gICAgICAhbmFtZS5zdGFydHNXaXRoKCdAQCcpIHx8XG4gICAgICAgIEZhaWxgRGlkIG5vdCBleHBlY3QgU3ltYm9sIHRvIGhhdmUgYSBzeW1ib2wtdmFsdWVkIHByb3BlcnR5IG5hbWUgc3RhcnRpbmcgd2l0aCBcIkBAXCIgJHtxKFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICl9YDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pXG4gICAgLyogQHRzLWlnbm9yZSBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqL1xuICAgIC5tYXAobmFtZSA9PiBbU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pLFxuKTtcblxuLyoqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzeW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgaXNQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PlxuICB0eXBlb2Ygc3ltID09PSAnc3ltYm9sJyAmJlxuICAodHlwZW9mIFN5bWJvbC5rZXlGb3Ioc3ltKSA9PT0gJ3N0cmluZycgfHwgd2VsbEtub3duU3ltYm9sTmFtZXMuaGFzKHN5bSkpOyRozY9fb25jZS5pc1Bhc3NhYmxlU3ltYm9sKGlzUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGlzUGFzc2FibGVTeW1ib2wpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSBzeW0gPT5cbiAgaXNQYXNzYWJsZVN5bWJvbChzeW0pIHx8XG4gIEZhaWxgT25seSByZWdpc3RlcmVkIHN5bWJvbHMgb3Igd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZTogJHtxKHN5bSl9YDskaM2PX29uY2UuYXNzZXJ0UGFzc2FibGVTeW1ib2woYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcblxuLyoqXG4gKiBJZiBgc3ltYCBpcyBhIHBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzXG4gKiBzeW1ib2wuIElmIGBzeW1gIGlzIGEgbm9uLXBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuIFNpbmNlIHRoZSByZWdpc3RyYXRpb24gc3RyaW5nIG9mIGEgcmVnaXN0ZXJlZCBzeW1ib2wgY2FuIGJlIGFueVxuICogc3RyaW5nLCBpZiB3ZSBzaW1wbHkgdXNlZCB0aGF0IHRvIGlkZW50aWZ5IHRob3NlIHN5bWJvbHMsIHRoZXJlIHdvdWxkIG5vdFxuICogYmUgYW55IHJlbWFpbmluZyBzdHJpbmdzIGxlZnQgb3ZlciB0byBpZGVudGlmeSB0aGUgd2VsbC1rbm93biBzeW1ib2xzLlxuICogSW5zdGVhZCwgd2UgcmVzZXJ2ZSBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGBcIkBAXCJgIGZvciBwdXJwb3NlcyBvZiB0aGlzXG4gKiBlbmNvZGluZy4gV2UgaWRlbnRpZnkgYSB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiBieSBwcmVmaXhpbmcgdGhlIHByb3BlcnR5IG5hbWUgd2l0aCBgXCJAQFwiYCwgc3VjaCBhcyBgXCJAQGl0ZXJhdG9yXCJgLlxuICogRm9yIHJlZ2lzdGVyZWQgc3ltYm9scyB3aG9zZSBuYW1lIGhhcHBlbnMgdG8gYmVnaW4gd2l0aCBgXCJAQFwiYCwgc3VjaFxuICogYXMgYFN5bWJvbC5mb3IoJ0BAaXRlcmF0b3InKWAgb3IgYFN5bWJvbC5mb3IoJ0BAZm9vJylgLCB3ZSBpZGVudGlmeVxuICogdGhlbSBieSBwcmVmaXhpbmcgdGhlbSB3aXRoIGFuIGV4dHJhIGBcIkBAXCJgLCBzdWNoIGFzXG4gKiBgXCJAQEBAaXRlcmF0b3JcImAgb3IgYFwiQEBAQGZvb1wiYC4gKFRoaXMgaXMgdGhlIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmdcbiAqIHRlY2huaXF1ZS4pXG4gKlxuICogQHBhcmFtIHtzeW1ib2x9IHN5bVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cbiAgICAgICBjb25zdCBuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSBzeW0gPT4ge1xuICBjb25zdCBuYW1lID0gU3ltYm9sLmtleUZvcihzeW0pO1xuICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHdlbGxLbm93blN5bWJvbE5hbWVzLmdldChzeW0pO1xuICB9XG4gIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ0BAJykpIHtcbiAgICByZXR1cm4gYEBAJHtuYW1lfWA7XG4gIH1cbiAgcmV0dXJuIG5hbWU7XG59OyRozY9fb25jZS5uYW1lRm9yUGFzc2FibGVTeW1ib2wobmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCBBdEF0UHJlZml4UGF0dGVybiA9IC9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIElmIGBuYW1lYCBpcyBhIHN0cmluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieVxuICogYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAsIHJldHVybiB0aGUgc3ltYm9sIGFyZ3VtZW50IGl0IHdhcyBwcm9kdWNlZCB0b1xuICogcmVwcmVzZW50LlxuICpcbiAqICAgIElmIGBuYW1lYCBkb2VzIG5vdCBiZWdpbiB3aXRoIGBcIkBAXCJgLCB0aGVuIGp1c3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgcmVnaXN0ZXJlZCBzeW1ib2wsIGBTeW1ib2wuZm9yKG5hbWUpYC5cbiAqICAgIElmIGBuYW1lYCBpcyBgXCJAQFwiYCBmb2xsb3dlZCBieSBhIHdlbGwga25vd24gc3ltYm9sJ3MgcHJvcGVydHkgbmFtZSBvblxuICogICAgICBgU3ltYm9sYCBzdWNoIGBcIkBAaXRlcmF0b3JcIiwgcmV0dXJuIHRoYXQgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhc1xuICogICAgICBgU3ltYm9sLml0ZXJhdG9yYFxuICogICAgSWYgYG5hbWVgIGJlZ2lucyB3aXRoIGBcIkBAQEBcImAgaXQgZW5jb2RlcyB0aGUgcmVnaXN0ZXJlZCBzeW1ib2wgd2hvc2VcbiAqICAgICAgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpbnN0ZWFkLlxuICogICAgT3RoZXJ3aXNlLCBpZiBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGl0IG1heSBlbmNvZGUgYSByZWdpc3RlcmVkIHN5bWJvbFxuICogICAgICBmcm9tIGEgZnV0dXJlIHZlcnNpb24gb2YgSmF2YVNjcmlwdCwgYnV0IGl0IGlzIG5vdCBvbmUgd2UgY2FuIGRlY29kZVxuICogICAgICB5ZXQsIHNvIHRocm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sfVxuICovXG4gICAgICAgY29uc3QgcGFzc2FibGVTeW1ib2xGb3JOYW1lID0gbmFtZSA9PiB7XG4gIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgIEZhaWxgJHtxKG5hbWUpfSBtdXN0IGJlIGEgc3RyaW5nLCBub3QgJHtxKHR5cGVvZiBuYW1lKX1gO1xuICBjb25zdCBtYXRjaCA9IEF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG4gIGlmIChtYXRjaCkge1xuICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgIGlmIChzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgICAgcmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3ltID0gU3ltYm9sW3N1ZmZpeF07XG4gICAgICBpZiAodHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuIHN5bTtcbiAgICAgIH1cbiAgICAgIEZhaWxgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xufTskaM2PX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge3N5bWJvbH1cbiAqL1xuICAgICAgIGNvbnN0IHVucGFzc2FibGVTeW1ib2xGb3JOYW1lID0gbmFtZSA9PiBTeW1ib2wobmFtZSk7JGjNj19vbmNlLnVucGFzc2FibGVTeW1ib2xGb3JOYW1lKHVucGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXLhQ2WQJAABkCQAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90YWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsYXNzZXJ0Q2hlY2tlcixjaGVja1RhZ1JlY29yZCxQQVNTX1NUWUxFLGdldE93bkRhdGFEZXNjcmlwdG9yLGNoZWNrUGFzc1N0eWxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsWyRozY9fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXSxbXCJjaGVja1Bhc3NTdHlsZVwiLFskaM2PX2EgPT4gKGNoZWNrUGFzc1N0eWxlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBUYWdnZWRIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICd0YWdnZWQnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIGNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwgY2FuZGlkYXRlW1BBU1NfU1RZTEVdLCAndGFnZ2VkJywgY2hlY2spLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIGNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwgJ3RhZ2dlZCcsIGFzc2VydENoZWNrZXIpO1xuXG4gICAgLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbiAgICBjb25zdCBwYXNzU3R5bGVLZXkgPSAvKiogQHR5cGUge3Vua25vd259ICovIChQQVNTX1NUWUxFKTtcbiAgICBjb25zdCB0YWdLZXkgPSAvKiogQHR5cGUge3Vua25vd259ICovIChTeW1ib2wudG9TdHJpbmdUYWcpO1xuICAgIGNvbnN0IHtcbiAgICAgIC8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cbiAgICAgIFsvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhc3NTdHlsZUtleSldOiBfcGFzc1N0eWxlRGVzYyxcbiAgICAgIFsvKiogQHR5cGUge3N0cmluZ30gKi8gKHRhZ0tleSldOiBfbGFiZWxEZXNjLFxuICAgICAgcGF5bG9hZDogX3BheWxvYWREZXNjLCAvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuICAgICAgLi4ucmVzdERlc2NzXG4gICAgfSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgICBvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoID09PSAwIHx8XG4gICAgICBGYWlsYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbiAgICAvKiBWYWxpZGF0ZSB0aGF0IHRoZSAncGF5bG9hZCcgcHJvcGVydHkgaXMgb3duL2RhdGEvZW51bWVyYWJsZSovXG4gICAgLyogYW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlIGlzIHJlY3Vyc2l2ZWx5IHBhc3NhYmxlLiovXG4gICAgcGFzc1N0eWxlT2ZSZWN1cihcbiAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgJ3BheWxvYWQnLCB0cnVlLCBhc3NlcnRDaGVja2VyKS52YWx1ZSxcbiAgICApO1xuICB9LFxufSk7JGjNj19vbmNlLlRhZ2dlZEhlbHBlcihUYWdnZWRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGFnZ2VkSGVscGVyIjpbIlRhZ2dlZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC3XT1cJhYAACYWAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbImFzc2VydEF0b20iLCJhc3NlcnRCeXRlQXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0F0b20iLCJpc0J5dGVBcnJheSIsImlzQ29weUFycmF5IiwiaXNSZWNvcmQiLCJpc1JlbW90YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxYLGlkZW50Q2hlY2tlcixwYXNzU3R5bGVPZixhc3NlcnRDaGVja2VyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIixbJGjNj19hID0+IChpZGVudENoZWNrZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvcHlBcnJheSwgQ29weVJlY29yZCwgUGFzc2FibGUsIFJlbW90YWJsZU9iamVjdCwgQnl0ZUFycmF5LCBDaGVja2VyLCBBdG9tfSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIEFLQSBhIFwiY29weUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge2FueX0gYXJyXG4gKiBAcmV0dXJucyB7YXJyIGlzIENvcHlBcnJheTxhbnk+fVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5QXJyYXkgPSBhcnIgPT4gcGFzc1N0eWxlT2YoYXJyKSA9PT0gJ2NvcHlBcnJheSc7JGjNj19vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYmluYXJ5IGRhdGEsIEFLQSBhIFwiYnl0ZUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJcbiAqIEByZXR1cm5zIHthcnIgaXMgQnl0ZUFycmF5fVxuICovXG4gICAgICAgY29uc3QgaXNCeXRlQXJyYXkgPSBhcnIgPT4gcGFzc1N0eWxlT2YoYXJyKSA9PT0gJ2J5dGVBcnJheSc7JGjNj19vbmNlLmlzQnl0ZUFycmF5KGlzQnl0ZUFycmF5KTtcbmhhcmRlbihpc0J5dGVBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBBS0EgYVxuICogXCJjb3B5UmVjb3JkXCIgaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7YW55fSByZWNvcmRcbiAqIEByZXR1cm5zIHtyZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG4gICAgICAgY29uc3QgaXNSZWNvcmQgPSByZWNvcmQgPT4gcGFzc1N0eWxlT2YocmVjb3JkKSA9PT0gJ2NvcHlSZWNvcmQnOyRozY9fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcmVtb3RhYmxlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHJldHVybnMge3JlbW90YWJsZSBpcyBSZW1vdGFibGVPYmplY3R9XG4gKi9cbiAgICAgICBjb25zdCBpc1JlbW90YWJsZSA9IHJlbW90YWJsZSA9PiBwYXNzU3R5bGVPZihyZW1vdGFibGUpID09PSAncmVtb3RhYmxlJzskaM2PX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gYXJyXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnIgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRDb3B5QXJyYXkgPSAoYXJyLCBvcHROYW1lT2ZBcnJheSA9ICdBbGxlZ2VkIGFycmF5JykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihhcnIpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5QXJyYXknIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2Fycn0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBhcnJheSwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFyclxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZBcnJheVxuICogQHJldHVybnMge2Fzc2VydHMgYXJyIGlzIEJ5dGVBcnJheX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEJ5dGVBcnJheSA9IChhcnIsIG9wdE5hbWVPZkFycmF5ID0gJ0FsbGVnZWQgYnl0ZUFycmF5JykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihhcnIpO1xuICBwYXNzU3R5bGUgPT09ICdieXRlQXJyYXknIHx8XG4gICAgRmFpbGAke3EoXG4gICAgICBvcHROYW1lT2ZBcnJheSxcbiAgICApfSAke2Fycn0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBiaW5hcnkgZGF0YSwgbm90ICR7cShwYXNzU3R5bGUpfWA7XG59OyRozY9fb25jZS5hc3NlcnRCeXRlQXJyYXkoYXNzZXJ0Qnl0ZUFycmF5KTtcbmhhcmRlbihhc3NlcnRCeXRlQXJyYXkpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZWNvcmRcbiAqIEBwYXJhbSB7YW55fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVjb3JkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UmVjb3JkID0gKHJlY29yZCwgb3B0TmFtZU9mUmVjb3JkID0gJ0FsbGVnZWQgcmVjb3JkJykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZWNvcmQpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5UmVjb3JkJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZW1vdGFibGVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlbW90YWJsZSBpcyBSZW1vdGFibGVPYmplY3R9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRSZW1vdGFibGUgPSAoXG4gIHJlbW90YWJsZSxcbiAgb3B0TmFtZU9mUmVtb3RhYmxlID0gJ0FsbGVnZWQgcmVtb3RhYmxlJyxcbikgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZW1vdGFibGUpO1xuICBwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsIE5vdCBuZWNlc3NhcmlseSBwYXNzYWJsZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ZhbCBpcyBBdG9tfVxuICovXG5jb25zdCBjaGVja0F0b20gPSAodmFsLCBjaGVjaykgPT4ge1xuICBsZXQgcGFzc1N0eWxlO1xuICB0cnkge1xuICAgIHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAoXG4gICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICBjaGVjayhmYWxzZSwgWGBOb3QgZXZlbiBQYXNzYWJsZTogJHtxKGVycil9OiAke3ZhbH1gKVxuICAgICk7XG4gIH1cbiAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgIGNhc2UgJ251bGwnOlxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnYmlnaW50JzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ2J5dGVBcnJheSc6XG4gICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgLyogVGhlIEF0b21TdHlsZSBjYXNlcyovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLyogVGhlIG90aGVyIFBhc3NTdHlsZSBjYXNlcyovXG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICAgIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhbiBhdG9tOiAke3ZhbH1gKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMge3ZhbCBpcyBBdG9tfVxuICovXG4gICAgICAgY29uc3QgaXNBdG9tID0gdmFsID0+IGNoZWNrQXRvbSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQXRvbShpc0F0b20pO1xuaGFyZGVuKGlzQXRvbSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWwgaXMgQXRvbX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEF0b20gPSB2YWwgPT4ge1xuICBjaGVja0F0b20odmFsLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEF0b20oYXNzZXJ0QXRvbSk7XG5oYXJkZW4oYXNzZXJ0QXRvbSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlBcnJheSI6WyJpc0NvcHlBcnJheSJdLCJpc0J5dGVBcnJheSI6WyJpc0J5dGVBcnJheSJdLCJpc1JlY29yZCI6WyJpc1JlY29yZCJdLCJpc1JlbW90YWJsZSI6WyJpc1JlbW90YWJsZSJdLCJhc3NlcnRDb3B5QXJyYXkiOlsiYXNzZXJ0Q29weUFycmF5Il0sImFzc2VydEJ5dGVBcnJheSI6WyJhc3NlcnRCeXRlQXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl0sImlzQXRvbSI6WyJpc0F0b20iXSwiYXNzZXJ0QXRvbSI6WyJhc3NlcnRBdG9tIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdU2S3O8OAADvDgAAHgAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIiwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIiwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIiwiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyIsIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiLCIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImJhZ1VuaW9uIiwiYmFnVW5pb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiLCJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiLCJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSIsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvcHlTZXQuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weUJhZy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanNcIiwgW11dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbImlzQ29weVNldCIsImlzQ29weVNldCJdLFsiYXNzZXJ0Q29weVNldCIsImFzc2VydENvcHlTZXQiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbImlzQ29weUJhZyIsImlzQ29weUJhZyJdLFsiYXNzZXJ0Q29weUJhZyIsImFzc2VydENvcHlCYWciXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbImlzQ29weU1hcCIsImlzQ29weU1hcCJdLFsiYXNzZXJ0Q29weU1hcCIsImFzc2VydENvcHlNYXAiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXV0sIi4vc3JjL2tleXMvY29weVNldC5qcyI6W1siY29lcmNlVG9FbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiXV0sIi4vc3JjL2tleXMvY29weUJhZy5qcyI6W1siY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIl1dLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjpbWyJiYWdDb21wYXJlIiwiYmFnQ29tcGFyZSJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl1dLCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOltbImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzSXNTdXBlcnNldCJdLFsiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50Il0sWyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0NvbXBhcmUiXSxbImVsZW1lbnRzVW5pb24iLCJlbGVtZW50c1VuaW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSxbImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSxbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLFsic2V0SXNTdXBlcnNldCIsInNldElzU3VwZXJzZXQiXSxbInNldElzRGlzam9pbnQiLCJzZXRJc0Rpc2pvaW50Il0sWyJzZXRVbmlvbiIsInNldFVuaW9uIl0sWyJzZXREaXNqb2ludFVuaW9uIiwic2V0RGlzam9pbnRVbmlvbiJdLFsic2V0SW50ZXJzZWN0aW9uIiwic2V0SW50ZXJzZWN0aW9uIl0sWyJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRTdWJ0cmFjdCJdXSwiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIjpbWyJiYWdJc1N1cGVyYmFnIiwiYmFnSXNTdXBlcmJhZyJdLFsiYmFnVW5pb24iLCJiYWdVbmlvbiJdLFsiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSW50ZXJzZWN0aW9uIl0sWyJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnRGlzam9pbnRTdWJ0cmFjdCJdXSwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIjpbWyJNIiwiTSJdLFsiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIl0sWyJpc1BhdHRlcm4iLCJpc1BhdHRlcm4iXSxbImFzc2VydFBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIl0sWyJtYXRjaGVzIiwibWF0Y2hlcyJdLFsibXVzdE1hdGNoIiwibXVzdE1hdGNoIl0sWyJpc0F3YWl0QXJnR3VhcmQiLCJpc0F3YWl0QXJnR3VhcmQiXSxbImFzc2VydEF3YWl0QXJnR3VhcmQiLCJhc3NlcnRBd2FpdEFyZ0d1YXJkIl0sWyJpc1Jhd0d1YXJkIiwiaXNSYXdHdWFyZCJdLFsiYXNzZXJ0UmF3R3VhcmQiLCJhc3NlcnRSYXdHdWFyZCJdLFsiYXNzZXJ0TWV0aG9kR3VhcmQiLCJhc3NlcnRNZXRob2RHdWFyZCJdLFsiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCJdLFsia2luZE9mIiwia2luZE9mIl0sWyJjb250YWluZXJIYXNTcGxpdCIsImNvbnRhaW5lckhhc1NwbGl0Il1dLCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIjpbWyJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCIsImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIl0sWyJnZXRNZXRob2RHdWFyZFBheWxvYWQiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiXSxbImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCJdLFsiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyIsImdldEludGVyZmFjZU1ldGhvZEtleXMiXV0sIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOltbImxpc3REaWZmZXJlbmNlIiwibGlzdERpZmZlcmVuY2UiXV0sIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjpbWyJvYmplY3RNYXAiLCJvYmplY3RNYXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKohA+kLSAAAC0gAACoAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY2hlY2tLZXkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIi4vY29weVNldC5qcyIsIi4vY29weUJhZy5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weVNldCIsImFzc2VydEtleSIsImFzc2VydFNjYWxhcktleSIsImNoZWNrQ29weUJhZyIsImNoZWNrQ29weU1hcCIsImNoZWNrQ29weVNldCIsImNoZWNrS2V5IiwiY2hlY2tTY2FsYXJLZXkiLCJjb3B5TWFwS2V5U2V0IiwiZXZlcnlDb3B5QmFnRW50cnkiLCJldmVyeUNvcHlNYXBLZXkiLCJldmVyeUNvcHlNYXBWYWx1ZSIsImV2ZXJ5Q29weVNldEtleSIsImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cnlBcnJheSIsImdldENvcHlNYXBLZXlzIiwiZ2V0Q29weU1hcFZhbHVlcyIsImdldENvcHlTZXRLZXlzIiwiaXNDb3B5QmFnIiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwiaXNLZXkiLCJpc1NjYWxhcktleSIsIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weU1hcCIsIm1ha2VDb3B5U2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxLEZhaWwsaWRlbnRDaGVja2VyLGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGlzQXRvbSxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxjaGVja0VsZW1lbnRzLG1ha2VTZXRPZkVsZW1lbnRzLGNoZWNrQmFnRW50cmllcyxtYWtlQmFnT2ZFbnRyaWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIixbJGjNj19hID0+IChpZGVudENoZWNrZXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaXNBdG9tXCIsWyRozY9fYSA9PiAoaXNBdG9tID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIixbJGjNj19hID0+IChjaGVja0VsZW1lbnRzID0gJGjNj19hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsWyRozY9fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLFskaM2PX2EgPT4gKGNoZWNrQmFnRW50cmllcyA9ICRozY9fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsWyRozY9fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBBdG9tLCBDaGVja2VyfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICogQGltcG9ydCB7Q29weUJhZywgQ29weU1hcCwgQ29weVNldCwgS2V5LCBTY2FsYXJLZXl9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLyBBdG9tIGFuZCBTY2FsYXIga2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja1NjYWxhcktleSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChpc0F0b20odmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIGlmIChwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIHNjYWxhciBrZXk6ICR7dmFsfWApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7dmFsIGlzIFNjYWxhcktleX1cbiAqLyRozY9fb25jZS5jaGVja1NjYWxhcktleShjaGVja1NjYWxhcktleSk7XG4gICAgICAgY29uc3QgaXNTY2FsYXJLZXkgPSB2YWwgPT4gY2hlY2tTY2FsYXJLZXkodmFsLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc1NjYWxhcktleShpc1NjYWxhcktleSk7XG5oYXJkZW4oaXNTY2FsYXJLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Fzc2VydHMgdmFsIGlzIFNjYWxhcktleX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFNjYWxhcktleSA9IHZhbCA9PiB7XG4gIGNoZWNrU2NhbGFyS2V5KHZhbCwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRTY2FsYXJLZXkoYXNzZXJ0U2NhbGFyS2V5KTtcbmhhcmRlbihhc3NlcnRTY2FsYXJLZXkpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgS2V5IGRvZXMgbm90IHNhdGlzZnkgV2Vha0tleSovXG4vKiogQHR5cGUge1dlYWtTZXQ8S2V5Pn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgS2V5IGRvZXMgbm90IHNhdGlzZnkgV2Vha0tleSovXG5jb25zdCBrZXlNZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja0tleSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChpc0F0b20odmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICBpZiAoa2V5TWVtby5oYXModmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrS2V5SW50ZXJuYWwodmFsLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICAvKiBEb24ndCBjYWNoZSB0aGUgdW5kZWZpbmVkIGNhc2VzLCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkIGFnYWluKi9cbiAgICAvKiB3aXRoIGBhc3NlcnRDaGVja2VyYCBpdCdsbCB0aHJvdyBhIGRpYWdub3N0aWMgYWdhaW4qL1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgIGtleU1lbW8uYWRkKHZhbCk7XG4gIH1cbiAgLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBtZW1vaXplIGEgbmVnYXRpdmUganVkZ2VtZW50LCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkKi9cbiAgLyogYWdhaW4gd2l0aCBhIGNoZWNrZXIsIGl0IHdpbGwgc3RpbGwgcHJvZHVjZSBhIHVzZWZ1bCBkaWFnbm9zdGljLiovXG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0tleShjaGVja0tleSk7XG5oYXJkZW4oY2hlY2tLZXkpO1xuXG4vKipcbiAqIEB0eXBlIHt7XG4gKiAgICh2YWw6IFBhc3NhYmxlKTogdmFsIGlzIEtleTtcbiAqICAgKHZhbDogYW55KTogYm9vbGVhbjtcbiAqIH19XG4gKi9cbiAgICAgICBjb25zdCBpc0tleSA9IHZhbCA9PiBjaGVja0tleSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzS2V5KGlzS2V5KTtcbmhhcmRlbihpc0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtLZXl9IHZhbFxuICogQHJldHVybnMge2Fzc2VydHMgdmFsIGlzIEtleX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEtleSA9IHZhbCA9PiB7XG4gIGNoZWNrS2V5KHZhbCwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRLZXkoYXNzZXJ0S2V5KTtcbmhhcmRlbihhc3NlcnRLZXkpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlTZXQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weVNldCBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PENvcHlTZXQ+fSAqL1xuY29uc3QgY29weVNldE1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrQ29weVNldCA9IChzLCBjaGVjaykgPT4ge1xuICBpZiAoY29weVNldE1lbW8uaGFzKHMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID1cbiAgICAoKHBhc3NTdHlsZU9mKHMpID09PSAndGFnZ2VkJyAmJiBnZXRUYWcocykgPT09ICdjb3B5U2V0JykgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYE5vdCBhIGNvcHlTZXQ6ICR7c31gKSkgJiZcbiAgICBjaGVja0VsZW1lbnRzKHMucGF5bG9hZCwgY2hlY2spICYmXG4gICAgY2hlY2tLZXkocy5wYXlsb2FkLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBjb3B5U2V0TWVtby5hZGQocyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmNoZWNrQ29weVNldChjaGVja0NvcHlTZXQpO1xuaGFyZGVuKGNoZWNrQ29weVNldCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNcbiAqIEByZXR1cm5zIHtzIGlzIENvcHlTZXR9XG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlTZXQgPSBzID0+IGNoZWNrQ29weVNldChzLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0NvcHlTZXQoaXNDb3B5U2V0KTtcbmhhcmRlbihpc0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5U2V0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzIGlzIENvcHlTZXR9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5U2V0fSAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlTZXQgPSBzID0+IHtcbiAgY2hlY2tDb3B5U2V0KHMsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weVNldChhc3NlcnRDb3B5U2V0KTtcbmhhcmRlbihhc3NlcnRDb3B5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weVNldEtleXMgPSBzID0+IHtcbiAgYXNzZXJ0Q29weVNldChzKTtcbiAgcmV0dXJuIHMucGF5bG9hZDtcbn07JGjNj19vbmNlLmdldENvcHlTZXRLZXlzKGdldENvcHlTZXRLZXlzKTtcbmhhcmRlbihnZXRDb3B5U2V0S2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlTZXRLZXkgPSAocywgZm4pID0+XG4gIGdldENvcHlTZXRLZXlzKHMpLmV2ZXJ5KChrZXksIGluZGV4KSA9PiBmbihrZXksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weVNldEtleShldmVyeUNvcHlTZXRLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weVNldEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb3B5U2V0ID0gZWxlbWVudEl0ZXIgPT4ge1xuICBjb25zdCByZXN1bHQgPSBtYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50SXRlcik7XG4gIGFzc2VydENvcHlTZXQocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLm1ha2VDb3B5U2V0KG1ha2VDb3B5U2V0KTtcbmhhcmRlbihtYWtlQ29weVNldCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weUJhZyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5QmFnIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weUJhZz59ICovXG5jb25zdCBjb3B5QmFnTWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tDb3B5QmFnID0gKGIsIGNoZWNrKSA9PiB7XG4gIGlmIChjb3B5QmFnTWVtby5oYXMoYikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCByZXN1bHQgPVxuICAgICgocGFzc1N0eWxlT2YoYikgPT09ICd0YWdnZWQnICYmIGdldFRhZyhiKSA9PT0gJ2NvcHlCYWcnKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgTm90IGEgY29weUJhZzogJHtifWApKSAmJlxuICAgIGNoZWNrQmFnRW50cmllcyhiLnBheWxvYWQsIGNoZWNrKSAmJlxuICAgIGNoZWNrS2V5KGIucGF5bG9hZCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weUJhZ01lbW8uYWRkKGIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlCYWcoY2hlY2tDb3B5QmFnKTtcbmhhcmRlbihjaGVja0NvcHlCYWcpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBiXG4gKiBAcmV0dXJucyB7YiBpcyBDb3B5QmFnfVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5QmFnID0gYiA9PiBjaGVja0NvcHlCYWcoYiwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNDb3B5QmFnKGlzQ29weUJhZyk7XG5oYXJkZW4oaXNDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2Fzc2VydHMgYiBpcyBDb3B5QmFnfVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weUJhZ30gKi9cbiAgICAgICBjb25zdCBhc3NlcnRDb3B5QmFnID0gYiA9PiB7XG4gIGNoZWNrQ29weUJhZyhiLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydENvcHlCYWcoYXNzZXJ0Q29weUJhZyk7XG5oYXJkZW4oYXNzZXJ0Q29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHJldHVybnMge0NvcHlCYWc8Sz5bJ3BheWxvYWQnXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlCYWdFbnRyaWVzID0gYiA9PiB7XG4gIGFzc2VydENvcHlCYWcoYik7XG4gIHJldHVybiBiLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRDb3B5QmFnRW50cmllcyhnZXRDb3B5QmFnRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weUJhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0NvcHlCYWc8Sz59IGJcbiAqIEBwYXJhbSB7KGVudHJ5OiBbSywgYmlnaW50XSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgZXZlcnlDb3B5QmFnRW50cnkgPSAoYiwgZm4pID0+XG4gIGdldENvcHlCYWdFbnRyaWVzKGIpLmV2ZXJ5KChlbnRyeSwgaW5kZXgpID0+IGZuKGVudHJ5LCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlCYWdFbnRyeShldmVyeUNvcHlCYWdFbnRyeSk7XG5oYXJkZW4oZXZlcnlDb3B5QmFnRW50cnkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUNvcHlCYWcgPSBiYWdFbnRyeUl0ZXIgPT4ge1xuICBjb25zdCByZXN1bHQgPSBtYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJ5SXRlcik7XG4gIGFzc2VydENvcHlCYWcocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLm1ha2VDb3B5QmFnKG1ha2VDb3B5QmFnKTtcbmhhcmRlbihtYWtlQ29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzID0gZWxlbWVudEl0ZXIgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4gIGNvbnN0IGZ1bGxDb21wYXJlID0gbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcbiAgY29uc3Qgc29ydGVkID0gc29ydEJ5UmFuayhlbGVtZW50SXRlciwgZnVsbENvbXBhcmUpO1xuICAvKiogQHR5cGUge1tLLGJpZ2ludF1bXX0gKi9cbiAgY29uc3QgZW50cmllcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZC5sZW5ndGg7ICkge1xuICAgIGNvbnN0IGsgPSBzb3J0ZWRbaV07XG4gICAgbGV0IGogPSBpICsgMTtcbiAgICB3aGlsZSAoaiA8IHNvcnRlZC5sZW5ndGggJiYgZnVsbENvbXBhcmUoaywgc29ydGVkW2pdKSA9PT0gMCkge1xuICAgICAgaiArPSAxO1xuICAgIH1cbiAgICBlbnRyaWVzLnB1c2goW2ssIEJpZ0ludChqIC0gaSldKTtcbiAgICBpID0gajtcbiAgfVxuICByZXR1cm4gbWFrZUNvcHlCYWcoZW50cmllcyk7XG59OyRozY9fb25jZS5tYWtlQ29weUJhZ0Zyb21FbGVtZW50cyhtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5oYXJkZW4obWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlNYXAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weU1hcCdzIGtleXMgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5TWFwPn0gKi9cbmNvbnN0IGNvcHlNYXBNZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gbVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja0NvcHlNYXAgPSAobSwgY2hlY2spID0+IHtcbiAgaWYgKGNvcHlNYXBNZW1vLmhhcyhtKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghKHBhc3NTdHlsZU9mKG0pID09PSAndGFnZ2VkJyAmJiBnZXRUYWcobSkgPT09ICdjb3B5TWFwJykpIHtcbiAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgTm90IGEgY29weU1hcDogJHttfWApO1xuICB9XG4gIGNvbnN0IHsgcGF5bG9hZCB9ID0gbTtcbiAgaWYgKHBhc3NTdHlsZU9mKHBheWxvYWQpICE9PSAnY29weVJlY29yZCcpIHtcbiAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IGJlIGEgcmVjb3JkOiAke219YCk7XG4gIH1cbiAgY29uc3QgeyBrZXlzLCB2YWx1ZXMsIC4uLnJlc3QgfSA9IHBheWxvYWQ7XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgKG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IG9ubHkgaGF2ZSAua2V5cyBhbmQgLnZhbHVlczogJHttfWAsXG4gICAgICApKSAmJlxuICAgIGNoZWNrRWxlbWVudHMoa2V5cywgY2hlY2spICYmXG4gICAgY2hlY2tLZXkoa2V5cywgY2hlY2spICYmXG4gICAgKHBhc3NTdHlsZU9mKHZhbHVlcykgPT09ICdjb3B5QXJyYXknIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBBIGNvcHlNYXAncyAudmFsdWVzIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7bX1gKSkgJiZcbiAgICAoa2V5cy5sZW5ndGggPT09IHZhbHVlcy5sZW5ndGggfHxcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBBIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBrZXlzIGFuZCB2YWx1ZXM6ICR7bX1gLFxuICAgICAgKSk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBjb3B5TWFwTWVtby5hZGQobSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmNoZWNrQ29weU1hcChjaGVja0NvcHlNYXApO1xuaGFyZGVuKGNoZWNrQ29weU1hcCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG1cbiAqIEByZXR1cm5zIHttIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlNYXAgPSBtID0+IGNoZWNrQ29weU1hcChtLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmhhcmRlbihpc0NvcHlNYXApO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHthc3NlcnRzIG0gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlNYXAgPSBtID0+IHtcbiAgY2hlY2tDb3B5TWFwKG0sIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weU1hcChhc3NlcnRDb3B5TWFwKTtcbmhhcmRlbihhc3NlcnRDb3B5TWFwKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5TWFwS2V5cyA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICByZXR1cm4gbS5wYXlsb2FkLmtleXM7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwS2V5cyhnZXRDb3B5TWFwS2V5cyk7XG5oYXJkZW4oZ2V0Q29weU1hcEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge1ZbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlNYXBWYWx1ZXMgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgcmV0dXJuIG0ucGF5bG9hZC52YWx1ZXM7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwVmFsdWVzKGdldENvcHlNYXBWYWx1ZXMpO1xuaGFyZGVuKGdldENvcHlNYXBWYWx1ZXMpO1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYSBDb3B5TWFwJ3MgZW50cmllcyBpbiBzdG9yYWdlIG9yZGVyLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0FycmF5PFtLLFZdPn1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlNYXBFbnRyeUFycmF5ID0gbSA9PiB7XG4gIGFzc2VydENvcHlNYXAobSk7XG4gIGNvbnN0IHtcbiAgICBwYXlsb2FkOiB7IGtleXMsIHZhbHVlcyB9LFxuICB9ID0gbTtcbiAgcmV0dXJuIGhhcmRlbihrZXlzLm1hcCgoa2V5LCBpKSA9PiBba2V5LCB2YWx1ZXNbaV1dKSk7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwRW50cnlBcnJheShnZXRDb3B5TWFwRW50cnlBcnJheSk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJ5QXJyYXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlNYXBFbnRyaWVzID0gbSA9PiB7XG4gIGFzc2VydENvcHlNYXAobSk7XG4gIGNvbnN0IHtcbiAgICBwYXlsb2FkOiB7IGtleXMsIHZhbHVlcyB9LFxuICB9ID0gbTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovIChrZXlzKTtcbiAgcmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICByZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmF0b3InLCB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFtLLFZdLHZvaWQ+fSAqL1xuICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogW2tleXNbaV0sIHZhbHVlc1tpXV0gfSk7XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5nZXRDb3B5TWFwRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlNYXBLZXkgPSAobSwgZm4pID0+XG4gIGdldENvcHlNYXBLZXlzKG0pLmV2ZXJ5KChrZXksIGluZGV4KSA9PiBmbihrZXksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weU1hcEtleShldmVyeUNvcHlNYXBLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyh2YWx1ZTogViwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgZXZlcnlDb3B5TWFwVmFsdWUgPSAobSwgZm4pID0+XG4gIGdldENvcHlNYXBWYWx1ZXMobSkuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gZm4odmFsdWUsIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weU1hcFZhbHVlKGV2ZXJ5Q29weU1hcFZhbHVlKTtcbmhhcmRlbihldmVyeUNvcHlNYXBWYWx1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IGNvcHlNYXBLZXlTZXQgPSBtID0+XG4gIC8qIEEgY29weU1hcCdzIGtleXMgYXJlIGFscmVhZHkgaW4gdGhlIGludGVybmFsIGZvcm0gdXNlZCBieSBjb3B5U2V0cy4qL1xuICBtYWtlVGFnZ2VkKCdjb3B5U2V0JywgbS5wYXlsb2FkLmtleXMpOyRozY9fb25jZS5jb3B5TWFwS2V5U2V0KGNvcHlNYXBLZXlTZXQpO1xuaGFyZGVuKGNvcHlNYXBLZXlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBWXT59IGVudHJpZXNcbiAqIEByZXR1cm5zIHtDb3B5TWFwPEssVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weU1hcCA9IGVudHJpZXMgPT4ge1xuICAvKiBUaGlzIGlzIHdlaXJkLCBidXQgcmV2ZXJzZSByYW5rIHNvcnRpbmcgdGhlIGVudHJpZXMgaXMgYSBnb29kIGZpcnN0IHN0ZXAqL1xuICAvKiBmb3IgZ2V0dGluZyB0aGUgcmFuayBzb3J0ZWQga2V5cyB0b2dldGhlciB3aXRoIHRoZSB2YWx1ZXMqL1xuICAvKiBvcmdhbml6ZWQgYnkgdGhvc2Uga2V5cy4gQWxzbywgYW1vbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCovXG4gIC8qIGtleXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MsIHRob3NlIGFyZSByYW5rIHNvcnRlZC4qL1xuICAvKiBUT0RPIFRoaXMqL1xuICAvKiBjb3VsZCBzb2x2ZSB0aGUgY29weU1hcCBjb3ZlciBpc3N1ZSBleHBsYWluZWQgaW4gcGF0dGVybk1hdGNoZXJzLmpzLiovXG4gIC8qIEJ1dCBvbmx5IGlmIHdlIGluY2x1ZGUgdGhpcyBjcml0ZXJpYSBpbiBvdXIgdmFsaWRhdGlvbiBvZiBjb3B5TWFwcywqL1xuICAvKiB3aGljaCB3ZSBjdXJyZW50bHkgZG8gbm90LiovXG4gIGNvbnN0IHNvcnRlZEVudHJpZXMgPSBzb3J0QnlSYW5rKGVudHJpZXMsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGNvbnN0IGtleXMgPSBzb3J0ZWRFbnRyaWVzLm1hcCgoW2ssIF92XSkgPT4gayk7XG4gIGNvbnN0IHZhbHVlcyA9IHNvcnRlZEVudHJpZXMubWFwKChbX2ssIHZdKSA9PiB2KTtcbiAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnY29weU1hcCcsIHsga2V5cywgdmFsdWVzIH0pO1xuICBhc3NlcnRDb3B5TWFwKHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5tYWtlQ29weU1hcChtYWtlQ29weU1hcCk7XG5oYXJkZW4obWFrZUNvcHlNYXApO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyBSZWN1ciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogYGNoZWNrS2V5SW50ZXJuYWxgIGlzIG9ubHkgY2FsbGVkIGlmIGB2YWxgIGlzIFBhc3NhYmxlIGJ1dCBpcyBub3QgYW4gQXRvbS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlJbnRlcm5hbCA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGNvbnN0IGNoZWNrSXQgPSBjaGlsZCA9PiBjaGVja0tleShjaGlsZCwgY2hlY2spO1xuXG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgLyogQSByZW1vdGFibGUgaXMgYSBTY2FsYXJLZXkgYnV0IG5vdCBhbiBBdG9tLCBzbyB3ZSBwaWNrIGl0IHVwIGhlcmUuKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgLyogQSBjb3B5UmVjb3JkIGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHZhbCkuZXZlcnkoY2hlY2tJdCk7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgIC8qIEEgY29weUFycmF5IGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbiAgICAgIHJldHVybiB2YWwuZXZlcnkoY2hlY2tJdCk7XG4gICAgfVxuICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgIGNvbnN0IHRhZyA9IGdldFRhZyh2YWwpO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tDb3B5U2V0KHZhbCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrQ29weUJhZyh2YWwsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjaGVja0NvcHlNYXAodmFsLCBjaGVjaykgJiZcbiAgICAgICAgICAgIC8qIEZvciBhIGNvcHlNYXAgdG8gYmUgYSBrZXksIGFsbCBpdHMga2V5cyBhbmQgdmFsdWVzIG11c3QqL1xuICAgICAgICAgICAgLyogYmUga2V5cy4gS2V5cyBhbHJlYWR5IGNoZWNrZWQgYnkgYGNoZWNrQ29weU1hcGAgc2luY2UqL1xuICAgICAgICAgICAgLyogdGhhdCdzIGEgY29weU1hcCByZXF1aXJlbWVudCBpbiBnZW5lcmFsLiovXG4gICAgICAgICAgICBldmVyeUNvcHlNYXBWYWx1ZSh2YWwsIGNoZWNrSXQpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNoZWNrICE9PSBpZGVudENoZWNrZXIgJiZcbiAgICAgICAgICAgIGNoZWNrKGZhbHNlLCBYYEEgcGFzc2FibGUgdGFnZ2VkICR7cSh0YWcpfSBpcyBub3QgYSBrZXk6ICR7dmFsfWApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjYXNlICdlcnJvcic6XG4gICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBrZXlgKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLyogVW5leHBlY3RlZCB0YWdzIGFyZSBqdXN0IG5vbi1rZXlzLCBidXQgYW4gdW5leHBlY3RlZCBwYXNzU3R5bGUqL1xuICAgICAgLyogaXMgYWx3YXlzIGFuIGVycm9yLiovXG4gICAgICB0aHJvdyBGYWlsYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHt2YWx9YDtcbiAgICB9XG4gIH1cbn07XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjaGVja1NjYWxhcktleSI6WyJjaGVja1NjYWxhcktleSJdLCJpc1NjYWxhcktleSI6WyJpc1NjYWxhcktleSJdLCJhc3NlcnRTY2FsYXJLZXkiOlsiYXNzZXJ0U2NhbGFyS2V5Il0sImNoZWNrS2V5IjpbImNoZWNrS2V5Il0sImlzS2V5IjpbImlzS2V5Il0sImFzc2VydEtleSI6WyJhc3NlcnRLZXkiXSwiY2hlY2tDb3B5U2V0IjpbImNoZWNrQ29weVNldCJdLCJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0Il0sImFzc2VydENvcHlTZXQiOlsiYXNzZXJ0Q29weVNldCJdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyJdLCJldmVyeUNvcHlTZXRLZXkiOlsiZXZlcnlDb3B5U2V0S2V5Il0sIm1ha2VDb3B5U2V0IjpbIm1ha2VDb3B5U2V0Il0sImNoZWNrQ29weUJhZyI6WyJjaGVja0NvcHlCYWciXSwiaXNDb3B5QmFnIjpbImlzQ29weUJhZyJdLCJhc3NlcnRDb3B5QmFnIjpbImFzc2VydENvcHlCYWciXSwiZ2V0Q29weUJhZ0VudHJpZXMiOlsiZ2V0Q29weUJhZ0VudHJpZXMiXSwiZXZlcnlDb3B5QmFnRW50cnkiOlsiZXZlcnlDb3B5QmFnRW50cnkiXSwibWFrZUNvcHlCYWciOlsibWFrZUNvcHlCYWciXSwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiOlsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSwiY2hlY2tDb3B5TWFwIjpbImNoZWNrQ29weU1hcCJdLCJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIl0sImFzc2VydENvcHlNYXAiOlsiYXNzZXJ0Q29weU1hcCJdLCJnZXRDb3B5TWFwS2V5cyI6WyJnZXRDb3B5TWFwS2V5cyJdLCJnZXRDb3B5TWFwVmFsdWVzIjpbImdldENvcHlNYXBWYWx1ZXMiXSwiZ2V0Q29weU1hcEVudHJ5QXJyYXkiOlsiZ2V0Q29weU1hcEVudHJ5QXJyYXkiXSwiZ2V0Q29weU1hcEVudHJpZXMiOlsiZ2V0Q29weU1hcEVudHJpZXMiXSwiZXZlcnlDb3B5TWFwS2V5IjpbImV2ZXJ5Q29weU1hcEtleSJdLCJldmVyeUNvcHlNYXBWYWx1ZSI6WyJldmVyeUNvcHlNYXBWYWx1ZSJdLCJjb3B5TWFwS2V5U2V0IjpbImNvcHlNYXBLZXlTZXQiXSwibWFrZUNvcHlNYXAiOlsibWFrZUNvcHlNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/9srkD8oAAA/KAAALQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb21wYXJlS2V5cy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIiwiLi9jaGVja0tleS5qcyIsIi4va2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiXSwiZXhwb3J0cyI6WyJiYWdDb21wYXJlIiwiY29tcGFyZUtleXMiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiLCJzZXRDb21wYXJlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsZ2V0VGFnLGNvbXBhcmVOdW1lcmljcyxjb21wYXJlUmFuayxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMscSxGYWlsLGFzc2VydEtleSxnZXRDb3B5QmFnRW50cmllcyxnZXRDb3B5TWFwRW50cnlBcnJheSxnZXRDb3B5U2V0S2V5cyxtYWtlQ29tcGFyZUNvbGxlY3Rpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJjb21wYXJlTnVtZXJpY3NcIixbJGjNj19hID0+IChjb21wYXJlTnVtZXJpY3MgPSAkaM2PX2EpXV0sW1wiY29tcGFyZVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlUmFuayA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIixbJGjNj19hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRozY9fYSldXSxbXCJnZXRDb3B5TWFwRW50cnlBcnJheVwiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyeUFycmF5ID0gJGjNj19hKV1dLFtcImdldENvcHlTZXRLZXlzXCIsWyRozY9fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaM2PX2EpXV1dXSxbXCIuL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzXCIsIFtbXCJtYWtlQ29tcGFyZUNvbGxlY3Rpb25cIixbJGjNj19hID0+IChtYWtlQ29tcGFyZUNvbGxlY3Rpb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge0NvcHlTZXQsIEtleSwgS2V5Q29tcGFyZX0gZnJvbSAnLi4vdHlwZXMuanMnICovXG5cbi8qKlxuICogQ29weVNldCBYIGlzIHNtYWxsZXIgdGhhbiBDb3B5U2V0IFkgaWZmIGFsbCBvZiB0aGVzZSBjb25kaXRpb25zIGhvbGQ6XG4gKiAxLiBGb3IgZXZlcnkgeCBpbiBYLCB4IGlzIGFsc28gaW4gWS5cbiAqIDIuIFRoZXJlIGlzIGEgeSBpbiBZIHRoYXQgaXMgbm90IGluIFguXG4gKlxuICogWCBpcyBlcXVpdmFsZW50IHRvIFkgaWZmIHRoZSBjb25kaXRpb24gMSBob2xkcyBidXQgY29uZGl0aW9uIDIgZG9lcyBub3QuXG4gKi9cbiAgICAgICBjb25zdCBzZXRDb21wYXJlID0gbWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuICAvKiogQHR5cGUgezxLIGV4dGVuZHMgS2V5PihzOiBDb3B5U2V0PEs+KSA9PiBBcnJheTxbSywgMV0+fSAqLyAoXG4gICAgcyA9PiBoYXJkZW4oZ2V0Q29weVNldEtleXMocykubWFwKGtleSA9PiBba2V5LCAxXSkpXG4gICksXG4gIDAsXG4gIGNvbXBhcmVOdW1lcmljcyxcbik7JGjNj19vbmNlLnNldENvbXBhcmUoc2V0Q29tcGFyZSk7XG5oYXJkZW4oc2V0Q29tcGFyZSk7XG5cbi8qKlxuICogQ29weUJhZyBYIGlzIHNtYWxsZXIgdGhhbiBDb3B5QmFnIFkgaWZmIGFsbCBvZiB0aGVzZSBjb25kaXRpb25zIGhvbGRcbiAqICh3aGVyZSBgY291bnQoQSwgYSlgIGlzIHNob3J0aGFuZCBmb3IgdGhlIGNvdW50IGFzc29jaWF0ZWQgd2l0aCBgYWAgaW4gYEFgKTpcbiAqIDEuIEZvciBldmVyeSB4IGluIFgsIHggaXMgYWxzbyBpbiBZIGFuZCBjb3VudChYLCB4KSA8PSBjb3VudChZLCB4KS5cbiAqIDIuIFRoZXJlIGlzIGEgeSBpbiBZIHN1Y2ggdGhhdCB5IGlzIG5vdCBpbiBYIG9yIGNvdW50KFgsIHkpIDwgY291bnQoWSwgeSkuXG4gKlxuICogWCBpcyBlcXVpdmFsZW50IHRvIFkgaWZmIHRoZSBjb25kaXRpb24gMSBob2xkcyBidXQgY29uZGl0aW9uIDIgZG9lcyBub3QuXG4gKi9cbiAgICAgICBjb25zdCBiYWdDb21wYXJlID0gbWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuICBnZXRDb3B5QmFnRW50cmllcyxcbiAgMG4sXG4gIGNvbXBhcmVOdW1lcmljcyxcbik7JGjNj19vbmNlLmJhZ0NvbXBhcmUoYmFnQ29tcGFyZSk7XG5oYXJkZW4oYmFnQ29tcGFyZSk7XG5cbi8qIFRPRE8gVGhlIGRlc2lyZWQgc2VtYW50aWNzIGZvciBDb3B5TWFwIGNvbXBhcmlzb24gaGF2ZSBub3QgeWV0IGJlZW4gZGVjaWRlZC4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MzcjcHVsbHJlcXVlc3RyZXZpZXctMTU5NjU5NTQxMSovXG4vKiBUaGUgYmVsb3cgaXMgYSBjdXJyZW50bHktdW51c2VkIGV4dGVuc2lvbiBvZiBDb3B5QmFnIHNlbWFudGljcyAoaS5lLiwgYWJzZW50Ki9cbi8qIGVudHJpZXMgdHJlYXRlZCBhcyBwcmVzZW50IHdpdGggYSB2YWx1ZSB0aGF0IGlzIHNtYWxsZXIgdGhhbiBldmVyeXRoaW5nKS4qL1xuLyoqXG4gKiBBIHVuaXF1ZSBsb2NhbCB2YWx1ZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gbm90IGV4aXN0IGluIGFueSBpbmJvdW5kIGRhdGFcbiAqIHN0cnVjdHVyZSAod2hpY2ggd291bGQgbm90IGJlIHRoZSBjYXNlIGlmIHdlIHVzZWQgYFN5bWJvbC5mb3JgKS5cbiAqIE5vdGUgdGhhdCBgQUJTRU5UYCBpcyBub3QgcGFzc2FibGUsIGFuZCBzbyBvbmx5IGV4aXN0cyBhdCB0aGUgSlMgbGV2ZWwgb2ZcbiAqIGFic3RyYWN0aW9uLCBub3QgcGFzcy1zdHlsZS5cbiAqL1xuY29uc3QgQUJTRU5UID0gU3ltYm9sKCdhYnNlbnQnKTtcblxuLyoqXG4gKiBDb3B5TWFwIFggaXMgc21hbGxlciB0aGFuIENvcHlNYXAgWSBpZmYgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnMgaG9sZDpcbiAqIDEuIFggYW5kIFkgYXJlIGJvdGggS2V5cyAoaS5lLiwgbmVpdGhlciBjb250YWlucyBub24tY29tcGFyYWJsZSBkYXRhKS5cbiAqIDIuIEZvciBldmVyeSB4IGluIFgsIHggaXMgYWxzbyBpbiBZIGFuZCBYW3hdIGlzIHNtYWxsZXIgdGhhbiBvciBlcXVpdmFsZW50IHRvIFlbeF0uXG4gKiAzLiBUaGVyZSBpcyBhIHkgaW4gWSBzdWNoIHRoYXQgeSBpcyBub3QgaW4gWCBvciBYW3ldIGlzIHNtYWxsZXIgdGhhbiBZW3ldLlxuICpcbiAqIFggaXMgZXF1aXZhbGVudCB0byBZIGlmZiBjb25kaXRpb25zIDEgYW5kIDIgaG9sZCBidXQgY29uZGl0aW9uIDMgZG9lcyBub3QuXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZSovXG5jb25zdCBfbWFwQ29tcGFyZSA9IG1ha2VDb21wYXJlQ29sbGVjdGlvbihcbiAgZ2V0Q29weU1hcEVudHJ5QXJyYXksXG4gIEFCU0VOVCxcbiAgKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSkgPT4ge1xuICAgIGlmIChsZWZ0VmFsdWUgPT09IEFCU0VOVCAmJiByaWdodFZhbHVlID09PSBBQlNFTlQpIHtcbiAgICAgIHRocm93IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgYWJzZW50IGVudHJ5IHBhaXJgO1xuICAgIH0gZWxzZSBpZiAobGVmdFZhbHVlID09PSBBQlNFTlQpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKHJpZ2h0VmFsdWUgPT09IEFCU0VOVCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICByZXR1cm4gY29tcGFyZUtleXMobGVmdFZhbHVlLCByaWdodFZhbHVlKTtcbiAgICB9XG4gIH0sXG4pO1xuaGFyZGVuKF9tYXBDb21wYXJlKTtcblxuLyoqIEB0eXBlIHtLZXlDb21wYXJlfSAqL1xuICAgICAgIGNvbnN0IGNvbXBhcmVLZXlzID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGFzc2VydEtleShsZWZ0KTtcbiAgYXNzZXJ0S2V5KHJpZ2h0KTtcbiAgY29uc3QgbGVmdFN0eWxlID0gcGFzc1N0eWxlT2YobGVmdCk7XG4gIGNvbnN0IHJpZ2h0U3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodCk7XG4gIGlmIChsZWZ0U3R5bGUgIT09IHJpZ2h0U3R5bGUpIHtcbiAgICAvKiBEaWZmZXJlbnQgcGFzc1N0eWxlcyBhcmUgaW5jb21tZW5zdXJhdGUqL1xuICAgIHJldHVybiBOYU47XG4gIH1cbiAgc3dpdGNoIChsZWZ0U3R5bGUpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgIGNhc2UgJ251bGwnOlxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdieXRlQXJyYXknOlxuICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgIC8qIGZvciB0aGVzZSwga2V5cyBjb21wYXJlIHRoZSBzYW1lIGFzIHJhbmsqL1xuICAgICAgcmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQsIHJpZ2h0KTtcbiAgICB9XG4gICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgY29uc3QgcmFua0NvbXAgPSBjb21wYXJlUmFuayhsZWZ0LCByaWdodCk7XG4gICAgICBpZiAocmFua0NvbXAgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKGxlZnQpIHx8IE51bWJlci5pc05hTihyaWdodCkpIHtcbiAgICAgICAgLyogTmFOIGlzIGVxdWFsIHRvIGl0c2VsZiwgYnV0IGluY29tbWVuc3VyYXRlIHdpdGggZXZlcnl0aGluZyBlbHNlKi9cbiAgICAgICAgYXNzZXJ0KCFOdW1iZXIuaXNOYU4obGVmdCkgfHwgIU51bWJlci5pc05hTihyaWdodCkpO1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgLyogQW1vbmcgbm9uLU5hTiBudW1iZXJzLCBrZXkgb3JkZXIgaXMgdGhlIHNhbWUgYXMgcmFuayBvcmRlci4gTm90ZSB0aGF0Ki9cbiAgICAgIC8qIGluIGJvdGggb3JkZXJzLCBgLTBgIGlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzIGFzIGAwYC4qL1xuICAgICAgcmV0dXJuIHJhbmtDb21wO1xuICAgIH1cbiAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICBpZiAobGVmdCA9PT0gcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICAvKiBJZiB0d28gcmVtb3RhYmxlcyBhcmUgbm90IGlkZW50aWNhbCwgdGhlbiBhcyBrZXlzIHRoZXkgYXJlKi9cbiAgICAgIC8qIGluY29tbWVuc3VyYXRlLiovXG4gICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAvKiBMZXhpY29ncmFwaGljIGJ5IGtleSBvcmRlci4gUmFuayBvcmRlciBvZiBhcnJheXMgaXMgbGV4aWNvZ3JhcGhpYyBieSovXG4gICAgICAvKiByYW5rIG9yZGVyLiovXG4gICAgICAvKiBCZWNhdXNlIHRoZSBpbnZhcmlhbnRzIGFib3ZlIGFwcGx5IHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXksKi9cbiAgICAgIC8qIHRoZXkgYXBwbHkgdG8gdGhlIGFycmF5IGFzIGEgd2hvbGUuKi9cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJlS2V5cyhsZWZ0W2ldLCByaWdodFtpXSk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgYXJlIGtleUVRLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4gICAgICAvKiBUaHVzLCBpZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBpcyBzbWFsbGVyIHRoYW4gWS4qL1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICByZXR1cm4gY29tcGFyZVJhbmsobGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAvKiBQYXJldG8gcGFydGlhbCBvcmRlciBjb21wYXJpc29uLiovXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IGxlZnROYW1lcyA9IHJlY29yZE5hbWVzKGxlZnQpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCByaWdodE5hbWVzID0gcmVjb3JkTmFtZXMocmlnaHQpO1xuXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgaWYgKCFrZXlFUShsZWZ0TmFtZXMsIHJpZ2h0TmFtZXMpKSB7XG4gICAgICAgIC8qIElmIHRoZXkgZG8gbm90IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0aWVzLCovXG4gICAgICAgIC8qIHRoZXkgYXJlIGluY29tbWVuc3VyYXRlLiovXG4gICAgICAgIC8qIE5vdGUgdGhhdCByYW5rIHNvcnRpbmcgb2YgY29weVJlY29yZHMgZ3JvdXBzIGFsbCBjb3B5UmVjb3JkcyB3aXRoKi9cbiAgICAgICAgLyogdGhlIHNhbWUga2V5cyB0b2dldGhlciwgZW5hYmxpbmcgcmFuZ2Ugc2VhcmNoaW5nIG92ZXIgY29weVJlY29yZHMqL1xuICAgICAgICAvKiB0byBhdm9pZCBtb3JlIGlycmVsZXZhbnQgb25lcy4qL1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCBsZWZ0VmFsdWVzID0gcmVjb3JkVmFsdWVzKGxlZnQsIGxlZnROYW1lcyk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IHJpZ2h0VmFsdWVzID0gcmVjb3JkVmFsdWVzKHJpZ2h0LCByaWdodE5hbWVzKTtcbiAgICAgIC8qIFByZXN1bWUgdGhhdCBib3RoIGNvcHlSZWNvcmRzIGhhdmUgdGhlIHNhbWUga2V5IG9yZGVyKi9cbiAgICAgIC8qIHVudGlsIGVuY291bnRlcmluZyBhIHByb3BlcnR5IGRpc3Byb3ZpbmcgdGhhdCBoeXBvdGhlc2lzLiovXG4gICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVmdFZhbHVlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBjb21wID0gY29tcGFyZUtleXMobGVmdFZhbHVlc1tpXSwgcmlnaHRWYWx1ZXNbaV0pO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGNvbXApKSB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0ICE9PSBjb21wICYmIGNvbXAgIT09IDApIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBjb21wO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgIChyZXN1bHQgPT09IC0xICYmIGNvbXAgPT09IDEpIHx8IChyZXN1bHQgPT09IDEgJiYgY29tcCA9PT0gLTEpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBJZiBjb3B5UmVjb3JkIFggaXMgc21hbGxlciB0aGFuIGNvcHlSZWNvcmQgWSwgdGhlbiB0aGV5IG11c3QgaGF2ZSB0aGUqL1xuICAgICAgLyogc2FtZSBwcm9wZXJ0eSBuYW1lcyBhbmQgZXZlcnkgdmFsdWUgaW4gWCBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8qL1xuICAgICAgLyogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gWSAod2l0aCBhdCBsZWFzdCBvbmUgdmFsdWUgc21hbGxlcikuKi9cbiAgICAgIC8qIFRoZSByYW5rIG9yZGVyIG9mIFggYW5kIFkgaXMgYmFzZWQgb24gbGV4aWNvZ3JhcGhpYyByYW5rIG9yZGVyIG9mKi9cbiAgICAgIC8qIHRoZWlyIHZhbHVlcywgYXMgb3JnYW5pemVkIGJ5IHJldmVyc2UgbGV4aWNvZ3JhcGhpYyBvcmRlciBvZiB0aGVpciovXG4gICAgICAvKiBwcm9wZXJ0eSBuYW1lcy4qL1xuICAgICAgLyogVGh1cyBpZiBjb21wYXJlS2V5cyhYLFkpIDwgMCB0aGVuIGNvbXBhcmVSYW5rKFgsWSkgPCAwLiovXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IGxlZnRUYWcgPSBnZXRUYWcobGVmdCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IHJpZ2h0VGFnID0gZ2V0VGFnKHJpZ2h0KTtcbiAgICAgIGlmIChsZWZ0VGFnICE9PSByaWdodFRhZykge1xuICAgICAgICAvKiBkaWZmZXJlbnQgdGFncyBhcmUgaW5jb21tZW5zdXJhdGUqL1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChsZWZ0VGFnKSB7XG4gICAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICAgICAgcmV0dXJuIHNldENvbXBhcmUobGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICAgICAgcmV0dXJuIGJhZ0NvbXBhcmUobGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgLyogVE9ETyBUaGUgZGVzaXJlZCBzZW1hbnRpY3MgZm9yIENvcHlNYXAgY29tcGFyaXNvbiBoYXZlIG5vdCB5ZXQgYmVlbiBkZWNpZGVkLiovXG4gICAgICAgICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MzcjcHVsbHJlcXVlc3RyZXZpZXctMTU5NjU5NTQxMSovXG4gICAgICAgICAgdGhyb3cgRmFpbGBNYXAgY29tcGFyaXNvbiBub3QgeWV0IGltcGxlbWVudGVkOiAke2xlZnR9IHZzICR7cmlnaHR9YDtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBGYWlsYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShsZWZ0U3R5bGUpfTogJHtsZWZ0fWA7XG4gICAgfVxuICB9XG59OyRozY9fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG4gICAgICAgY29uc3Qga2V5TFQgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA8IDA7JGjNj19vbmNlLmtleUxUKGtleUxUKTtcbmhhcmRlbihrZXlMVCk7XG5cbiAgICAgICBjb25zdCBrZXlMVEUgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA8PSAwOyRozY9fb25jZS5rZXlMVEUoa2V5TFRFKTtcbmhhcmRlbihrZXlMVEUpO1xuXG4gICAgICAgY29uc3Qga2V5RVEgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA9PT0gMDskaM2PX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuICAgICAgIGNvbnN0IGtleUdURSA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID49IDA7JGjNj19vbmNlLmtleUdURShrZXlHVEUpO1xuaGFyZGVuKGtleUdURSk7XG5cbiAgICAgICBjb25zdCBrZXlHVCA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID4gMDskaM2PX29uY2Uua2V5R1Qoa2V5R1QpO1xuaGFyZGVuKGtleUdUKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNldENvbXBhcmUiOlsic2V0Q29tcGFyZSJdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiXSwiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiXSwia2V5TFQiOlsia2V5TFQiXSwia2V5TFRFIjpbImtleUxURSJdLCJrZXlFUSI6WyJrZXlFUSJdLCJrZXlHVEUiOlsia2V5R1RFIl0sImtleUdUIjpbImtleUdUIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADRbU2NNFQAATRUAACkAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29weUJhZy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0QmFnRW50cmllcyIsImFzc2VydE5vRHVwbGljYXRlS2V5cyIsImNoZWNrQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyIsIm1ha2VCYWdPZkVudHJpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLFg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIixbJGjNj19hID0+IChpc1JhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICogQGltcG9ydCB7Q2hlY2tlciwgRnVsbENvbXBhcmV9IGZyb20gJ0BlbmRvL21hcnNoYWwnXG4gKiBAaW1wb3J0IHtDb3B5QmFnLCBLZXl9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlIHwgdW5kZWZpbmVkfSBmdWxsQ29tcGFyZSBJZiBwcm92aWRlZCBhbmQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHlcbiAqIGtub3duIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0XG4gKiByYXRoZXIgdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZVxuICogYXJyYXkgZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUta2V5cyBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlS2V5cyA9IChiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSwgY2hlY2spID0+IHtcbiAgLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbiAgLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuICAvKiBUT0RPIE9uY2UgYWxsIG91ciB0b29saW5nIGlzIHJlYWR5IGZvciBgJiY9YCwgdGhlIGZvbGxvd2luZyovXG4gIC8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuICBmdWxsQ29tcGFyZSA9IGZ1bGxDb21wYXJlIHx8IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgLyogU2luY2UgdGhlIGtleSBpcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gdGhlIHZhbHVlICh0aGUgY291bnQpLCovXG4gIC8qIHNvcnRpbmcgYnkgZnVsbE9yZGVyIGlzIGd1YXJhbnRlZWQgdG8gbWFrZSBkdXBsaWNhdGUga2V5cyovXG4gIC8qIGFkamFjZW50IGluZGVwZW5kZW50IG9mIHRoZWlyIGNvdW50cy4qL1xuICBiYWdFbnRyaWVzID0gc29ydEJ5UmFuayhiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBiYWdFbnRyaWVzO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgazAgPSBiYWdFbnRyaWVzW2kgLSAxXVswXTtcbiAgICBjb25zdCBrMSA9IGJhZ0VudHJpZXNbaV1bMF07XG4gICAgaWYgKGZ1bGxDb21wYXJlKGswLCBrMSkgPT09IDApIHtcbiAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IFtmdWxsQ29tcGFyZV1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlLCBhc3NlcnRDaGVja2VyKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRozY9fb25jZS5hc3NlcnROb0R1cGxpY2F0ZUtleXMoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKTtcbiAgICAgICBjb25zdCBjaGVja0JhZ0VudHJpZXMgPSAoYmFnRW50cmllcywgY2hlY2spID0+IHtcbiAgaWYgKHBhc3NTdHlsZU9mKGJhZ0VudHJpZXMpICE9PSAnY29weUFycmF5Jykge1xuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGZhbHNlLFxuICAgICAgWGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtiYWdFbnRyaWVzfWAsXG4gICAgKTtcbiAgfVxuICBpZiAoIWlzUmFua1NvcnRlZChiYWdFbnRyaWVzLCBjb21wYXJlQW50aVJhbmspKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7YmFnRW50cmllc31gLFxuICAgICk7XG4gIH1cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBiYWdFbnRyaWVzKSB7XG4gICAgaWYgKFxuICAgICAgcGFzc1N0eWxlT2YoZW50cnkpICE9PSAnY29weUFycmF5JyB8fFxuICAgICAgZW50cnkubGVuZ3RoICE9PSAyIHx8XG4gICAgICB0eXBlb2YgZW50cnlbMV0gIT09ICdiaWdpbnQnXG4gICAgKSB7XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgYmUgcGFpciBvZiBhIGtleSBhbmQgYSBiaWdpbnQgcmVwcmVzZW50aW5nIGEgY291bnQ6ICR7ZW50cnl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChlbnRyeVsxXSA8IDEpIHtcbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBoYXZlIGEgcG9zaXRpdmUgY291bnQ6ICR7ZW50cnl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIEtleSB0eXBlcyovXG4gIHJldHVybiBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLCB1bmRlZmluZWQsIGNoZWNrKTtcbn07JGjNj19vbmNlLmNoZWNrQmFnRW50cmllcyhjaGVja0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNoZWNrQmFnRW50cmllcyk7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnMtY2hlY2sgLS0gZG9lc24ndCB1bmRlcnN0YW5kIGFzc2VydHMqL1xuLyoqXG4gKiBAcGFyYW0ge1tQYXNzYWJsZSxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHthc3NlcnRzIGJhZ0VudHJpZXMgaXMgW1Bhc3NhYmxlLGJpZ2ludF1bXX1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEJhZ0VudHJpZXMgPSBiYWdFbnRyaWVzID0+IHtcbiAgY2hlY2tCYWdFbnRyaWVzKGJhZ0VudHJpZXMsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0QmFnRW50cmllcyhhc3NlcnRCYWdFbnRyaWVzKTtcbmhhcmRlbihhc3NlcnRCYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgYmlnaW50XT59IGJhZ0VudHJpZXNMaXN0XG4gKi9cbiAgICAgICBjb25zdCBjb2VyY2VUb0JhZ0VudHJpZXMgPSBiYWdFbnRyaWVzTGlzdCA9PiB7XG4gIGNvbnN0IGJhZ0VudHJpZXMgPSBzb3J0QnlSYW5rKGJhZ0VudHJpZXNMaXN0LCBjb21wYXJlQW50aVJhbmspO1xuICBhc3NlcnRCYWdFbnRyaWVzKGJhZ0VudHJpZXMpO1xuICByZXR1cm4gYmFnRW50cmllcztcbn07JGjNj19vbmNlLmNvZXJjZVRvQmFnRW50cmllcyhjb2VyY2VUb0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNvZXJjZVRvQmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUJhZ09mRW50cmllcyA9IGJhZ0VudHJ5SXRlciA9PlxuICBtYWtlVGFnZ2VkKCdjb3B5QmFnJywgY29lcmNlVG9CYWdFbnRyaWVzKGJhZ0VudHJ5SXRlcikpOyRozY9fb25jZS5tYWtlQmFnT2ZFbnRyaWVzKG1ha2VCYWdPZkVudHJpZXMpO1xuaGFyZGVuKG1ha2VCYWdPZkVudHJpZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIjpbImFzc2VydE5vRHVwbGljYXRlS2V5cyJdLCJjaGVja0JhZ0VudHJpZXMiOlsiY2hlY2tCYWdFbnRyaWVzIl0sImFzc2VydEJhZ0VudHJpZXMiOlsiYXNzZXJ0QmFnRW50cmllcyJdLCJjb2VyY2VUb0JhZ0VudHJpZXMiOlsiY29lcmNlVG9CYWdFbnRyaWVzIl0sIm1ha2VCYWdPZkVudHJpZXMiOlsibWFrZUJhZ09mRW50cmllcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAsI4MmLBEAACwRAAApAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlTZXQuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydEVsZW1lbnRzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVzIiwiY2hlY2tFbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiLCJtYWtlU2V0T2ZFbGVtZW50cyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcImlzUmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKiBAaW1wb3J0IHtDaGVja2VyLCBGdWxsQ29tcGFyZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCdcbiAqIEBpbXBvcnQge0NvcHlTZXQsIEtleX0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgZWxlbWVudHNgIGlzIGFscmVhZHkga25vd25cbiAqIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0IHJhdGhlclxuICogdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZSBhcnJheVxuICogZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZXMgPSAoZWxlbWVudHMsIGZ1bGxDb21wYXJlLCBjaGVjaykgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4gIC8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbiAgLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG4gIGZ1bGxDb21wYXJlID0gZnVsbENvbXBhcmUgfHwgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuICBlbGVtZW50cyA9IHNvcnRCeVJhbmsoZWxlbWVudHMsIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGVsZW1lbnRzO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgazAgPSBlbGVtZW50c1tpIC0gMV07XG4gICAgY29uc3QgazEgPSBlbGVtZW50c1tpXTtcbiAgICBpZiAoZnVsbENvbXBhcmUoazAsIGsxKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYHZhbHVlIGhhcyBkdXBsaWNhdGUga2V5czogJHtrMH1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gW2Z1bGxDb21wYXJlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnROb0R1cGxpY2F0ZXMgPSAoZWxlbWVudHMsIGZ1bGxDb21wYXJlID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLCBmdWxsQ29tcGFyZSwgYXNzZXJ0Q2hlY2tlcik7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjNj19vbmNlLmFzc2VydE5vRHVwbGljYXRlcyhhc3NlcnROb0R1cGxpY2F0ZXMpO1xuICAgICAgIGNvbnN0IGNoZWNrRWxlbWVudHMgPSAoZWxlbWVudHMsIGNoZWNrKSA9PiB7XG4gIGlmIChwYXNzU3R5bGVPZihlbGVtZW50cykgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7ZWxlbWVudHN9YCxcbiAgICApO1xuICB9XG4gIGlmICghaXNSYW5rU29ydGVkKGVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmspKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtlbGVtZW50c31gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLCB1bmRlZmluZWQsIGNoZWNrKTtcbn07JGjNj19vbmNlLmNoZWNrRWxlbWVudHMoY2hlY2tFbGVtZW50cyk7XG5oYXJkZW4oY2hlY2tFbGVtZW50cyk7XG5cbiAgICAgICBjb25zdCBhc3NlcnRFbGVtZW50cyA9IGVsZW1lbnRzID0+IHtcbiAgY2hlY2tFbGVtZW50cyhlbGVtZW50cywgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRFbGVtZW50cyhhc3NlcnRFbGVtZW50cyk7XG5oYXJkZW4oYXNzZXJ0RWxlbWVudHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50c0xpc3RcbiAqL1xuICAgICAgIGNvbnN0IGNvZXJjZVRvRWxlbWVudHMgPSBlbGVtZW50c0xpc3QgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IHNvcnRCeVJhbmsoZWxlbWVudHNMaXN0LCBjb21wYXJlQW50aVJhbmspO1xuICBhc3NlcnRFbGVtZW50cyhlbGVtZW50cyk7XG4gIHJldHVybiBlbGVtZW50cztcbn07JGjNj19vbmNlLmNvZXJjZVRvRWxlbWVudHMoY29lcmNlVG9FbGVtZW50cyk7XG5oYXJkZW4oY29lcmNlVG9FbGVtZW50cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXRPZkVsZW1lbnRzID0gZWxlbWVudEl0ZXIgPT5cbiAgbWFrZVRhZ2dlZCgnY29weVNldCcsIGNvZXJjZVRvRWxlbWVudHMoZWxlbWVudEl0ZXIpKTskaM2PX29uY2UubWFrZVNldE9mRWxlbWVudHMobWFrZVNldE9mRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VTZXRPZkVsZW1lbnRzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADbNZpAwyIAAMMiAAA5AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyIsIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMiLCJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLG1ha2VJdGVyYXRvcixtYWtlQXJyYXlJdGVyYXRvcixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzXCIsIFtbXCJtYWtlSXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlSXRlcmF0b3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbWFrZS1hcnJheS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUFycmF5SXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlQXJyYXlJdGVyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIFJlZmluZXMgYSBzZXF1ZW5jZSBvZiBlbnRyaWVzIHRoYXQgaXMgYWxyZWFkeSBzb3J0ZWQgb3ZlciBpdHMga2V5cyBieSB0aGVcbiAqIGByYW5rQ29tcGFyZWAgcHJlb3JkZXIsIHdoZXJlIHRoZXJlIG1heSBiZSBpbnRlcm5hbCBydW5zIHRpZWQgZm9yIHRoZSBzYW1lXG4gKiByYW5rLCBpbnRvIGFuIGl0ZXJhYmxlIHRoYXQgcmVzb2x2ZXMgdGhvc2UgdGllcyB1c2luZyBgZnVsbENvbXBhcmVgLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVj11bmtub3duXVxuICogQHBhcmFtIHtBcnJheTxbS2V5LCBWXT59IGVudHJpZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlSXRlcmF0b3I8W0tleSwgVl0+fVxuICovXG5jb25zdCBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzID0gKGVudHJpZXMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBLZXkgdHlwZXMqL1xuICBhc3NlcnRSYW5rU29ydGVkKGVudHJpZXMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGVudHJpZXM7XG4gIGxldCBpID0gMDtcbiAgbGV0IHNhbWVSYW5rSXRlcmF0b3I7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4ge1xuICAgIGlmIChzYW1lUmFua0l0ZXJhdG9yKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzYW1lUmFua0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHNhbWVSYW5rSXRlcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV07XG4gICAgICAvKiBMb29rIGFoZWFkIGZvciBzYW1lLXJhbmsgdGllcy4qL1xuICAgICAgbGV0IGogPSBpICsgMTtcbiAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICYmIHJhbmtDb21wYXJlKGVudHJ5WzBdLCBlbnRyaWVzW2pdWzBdKSA9PT0gMCkge1xuICAgICAgICBqICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgLyogTm8gdGllcyBmb3VuZC4qL1xuICAgICAgICBpID0gajtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogZW50cnkgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0aWVzID0gZW50cmllcy5zbGljZShpLCBqKTtcbiAgICAgIGkgPSBqO1xuXG4gICAgICAvKiBTb3J0IHRoZSB0aWVzIGJ5IGBmdWxsQ29tcGFyZWAsIGVuZm9yY2Uga2V5IHVuaXF1ZW5lc3MsIGFuZCBkZWxlZ2F0ZSB0byovXG4gICAgICAvKiBhIHN1Yi1pdGVyYXRvci4qL1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggS2V5IHR5cGVzKi9cbiAgICAgIGNvbnN0IHNvcnRlZFRpZXMgPSBzb3J0QnlSYW5rKHRpZXMsIGZ1bGxDb21wYXJlKTtcbiAgICAgIGZvciAobGV0IGsgPSAxOyBrIDwgc29ydGVkVGllcy5sZW5ndGg7IGsgKz0gMSkge1xuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBLZXkgdHlwZXMqL1xuICAgICAgICBjb25zdCBba2V5MF0gPSBzb3J0ZWRUaWVzW2sgLSAxXTtcbiAgICAgICAgY29uc3QgW2tleTFdID0gc29ydGVkVGllc1trXTtcbiAgICAgICAgTWF0aC5zaWduKGZ1bGxDb21wYXJlKGtleTAsIGtleTEpKSB8fFxuICAgICAgICAgIEZhaWxgRHVwbGljYXRlIGVudHJ5IGtleTogJHtrZXkwfWA7XG4gICAgICB9XG4gICAgICBzYW1lUmFua0l0ZXJhdG9yID0gbWFrZUFycmF5SXRlcmF0b3Ioc29ydGVkVGllcyk7XG4gICAgICByZXR1cm4gc2FtZVJhbmtJdGVyYXRvci5uZXh0KCk7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICB9KTtcbn07XG5oYXJkZW4oZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyk7XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IG1lcmdlcyByZXZlcnNlLXJhbmstc29ydGVkIFtrZXksIHZhbHVlXSBlbnRyaWVzIG9mXG4gKiB0d28gS2V5Q29sbGVjdGlvbnMgaW50byBhIHJldmVyc2UtZnVsbC1zb3J0ZWQgW2tleSwgdmFsdWUxLCB2YWx1ZTJdIGVudHJpZXNcbiAqIGJ5IHRoZSBrZXkgdGhleSBoYXZlIGluIGNvbW1vbiwgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBmb3IgYW4gYWJzZW50IGVudHJ5IGluXG4gKiBlaXRoZXIgY29sbGVjdGlvbiBhcyBgYWJzZW50VmFsdWVgLlxuICpcbiAqIEB0ZW1wbGF0ZSBbQz1LZXlDb2xsZWN0aW9uXVxuICogQHRlbXBsYXRlIFtWPXVua25vd25dXG4gKiBAcGFyYW0ge0N9IGMxXG4gKiBAcGFyYW0ge0N9IGMyXG4gKiBAcGFyYW0geyhjb2xsZWN0aW9uOiBDKSA9PiBBcnJheTxbS2V5LCBWXT59IGdldEVudHJpZXNcbiAqIEBwYXJhbSB7YW55fSBhYnNlbnRWYWx1ZVxuICogQHJldHVybnMge0l0ZXJhYmxlSXRlcmF0b3I8W0tleSwgViB8IGFic2VudFZhbHVlLCBWIHwgYWJzZW50VmFsdWVdPn1cbiAqL1xuICAgICAgIGNvbnN0IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzID0gKFxuICBjMSxcbiAgYzIsXG4gIGdldEVudHJpZXMsXG4gIGFic2VudFZhbHVlLFxuKSA9PiB7XG4gIGNvbnN0IGUxID0gZ2V0RW50cmllcyhjMSk7XG4gIGNvbnN0IGUyID0gZ2V0RW50cmllcyhjMik7XG5cbiAgLyogRXN0YWJsaXNoIGEgaGlzdG9yeS1kZXBlbmRlbnQgY29tcGFyaXNvbiBzY29wZWQgdG8gdGhlIGFjdGl2ZSBpbnZvY2F0aW9uKi9cbiAgLyogYW5kIHVzZSBpdCB0byBtYXAgcmV2ZXJzZS1wcmVvcmRlcmVkIGVudHJpZXMgaW50byBhbiBpdGVyYXRvciB3aXRoIGEqL1xuICAvKiBuYXJyb3dlciB0b3RhbCBvcmRlci4qL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG4gIGNvbnN0IHggPSBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKGUxLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeSA9IGdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXMoZTIsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuXG4gIC8qIE1haW50YWluIGEgc2luZ2xlLXJlc3VsdCB7IGRvbmUsIGtleSwgdmFsdWUgfSBidWZmZXIgZm9yIGVhY2ggaXRlcmF0b3IqL1xuICAvKiBzbyB0aGV5IGNhbiBiZSBtZXJnZWQuKi9cbiAgbGV0IHhEb25lO1xuICBsZXQgeEtleTtcbiAgbGV0IHhWYWx1ZTtcbiAgbGV0IHlEb25lO1xuICBsZXQgeUtleTtcbiAgbGV0IHlWYWx1ZTtcbiAgY29uc3Qgbm9uRW50cnkgPSBbdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xuICBjb25zdCBuZXh0WCA9ICgpID0+IHtcbiAgICAheERvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFggbXVzdCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgY29uc3QgcmVzdWx0ID0geFZhbHVlO1xuICAgICh7IGRvbmU6IHhEb25lLCB2YWx1ZTogW3hLZXksIHhWYWx1ZV0gPSBub25FbnRyeSB9ID0geC5uZXh0KCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG5leHRYKCk7XG4gIGNvbnN0IG5leHRZID0gKCkgPT4ge1xuICAgICF5RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WSBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICBjb25zdCByZXN1bHQgPSB5VmFsdWU7XG4gICAgKHsgZG9uZTogeURvbmUsIHZhbHVlOiBbeUtleSwgeVZhbHVlXSA9IG5vbkVudHJ5IH0gPSB5Lm5leHQoKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbmV4dFkoKTtcbiAgcmV0dXJuIG1ha2VJdGVyYXRvcigoKSA9PiB7XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAvKiogQHR5cGUge1tLZXksIFYgfCBhYnNlbnRWYWx1ZSwgViB8IGFic2VudFZhbHVlXX0gKi9cbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKHhEb25lICYmIHlEb25lKSB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIHZhbHVlID0gW3VuZGVmaW5lZCwgYWJzZW50VmFsdWUsIGFic2VudFZhbHVlXTtcbiAgICB9IGVsc2UgaWYgKHhEb25lKSB7XG4gICAgICB2YWx1ZSA9IFt5S2V5LCBhYnNlbnRWYWx1ZSwgbmV4dFkoKV07XG4gICAgfSBlbHNlIGlmICh5RG9uZSkge1xuICAgICAgdmFsdWUgPSBbeEtleSwgbmV4dFgoKSwgYWJzZW50VmFsdWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBDb21wYXJlIHRoZSBrZXlzIHRvIGRldGVybWluZSBpZiB3ZSBzaG91bGQgcmV0dXJuIGEgbWVyZ2VkIHJlc3VsdCovXG4gICAgICAvKiBvciBhIG9uZS1zaWRlZCByZXN1bHQuKi9cbiAgICAgIGNvbnN0IGNvbXAgPSBmdWxsQ29tcGFyZSh4S2V5LCB5S2V5KTtcbiAgICAgIGlmIChjb21wID09PSAwKSB7XG4gICAgICAgIHZhbHVlID0gW3hLZXksIG5leHRYKCksIG5leHRZKCldO1xuICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkge1xuICAgICAgICB2YWx1ZSA9IFt4S2V5LCBuZXh0WCgpLCBhYnNlbnRWYWx1ZV07XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPiAwKSB7XG4gICAgICAgIHZhbHVlID0gW3lLZXksIGFic2VudFZhbHVlLCBuZXh0WSgpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEZhaWxgVW5leHBlY3RlZCBrZXkgY29tcGFyaXNvbiAke3EoY29tcCl9IGZvciAke3hLZXl9IHZzICR7eUtleX1gO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHsgZG9uZSwgdmFsdWUgfSk7XG4gIH0pO1xufTskaM2PX29uY2UuZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMoZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMpO1xuaGFyZGVuKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyB0d28gS2V5Q29sbGVjdGlvbnMgb2YgdGhlIHNhbWUgdHlwZSB1c2luZ1xuICogdGhlIHByb3ZpZGVkIGVudHJpZXMgZmFjdG9yeSBhbmQgc2FtZS1rZXkgZW50cnkgdmFsdWUgY29tcGFyYXRvciAod2hlcmUgdGhlXG4gKiB2YWx1ZSBmb3IgYW4gYWJzZW50IGVudHJ5IGluIG9uZSBjb2xsZWN0aW9uIGlzIGBhYnNlbnRWYWx1ZWApLlxuICpcbiAqIElmIHRoZSBjb3JyZXNwb25kaW5nIGVudHJpZXMgZm9yIGFueSBzaW5nbGUga2V5IGFyZSBpbmNvbXBhcmFibGUgb3IgdGhlXG4gKiBjb21wYXJpc29uIHJlc3VsdCBoYXMgdGhlIG9wcG9zaXRlIHNpZ24gb2YgdGhlIHJlc3VsdCBmb3IgYSBkaWZmZXJlbnQga2V5LFxuICogdGhlbiB0aGUgS2V5Q29sbGVjdGlvbnMgYXJlIGluY29tcGFyYWJsZS4gT3RoZXJ3aXNlLCB0aGUgY29sbGVjdGlvbnMgY29tcGFyZVxuICogYnkgdGhlIHJlc3VsdCBvZiBhbnkgbm9uLWVxdWFsIGVudHJ5IGNvbXBhcmlzb24sIG9yIGNvbXBhcmUgZXF1YWwgaWYgdGhlcmUgaXNcbiAqIG5vIG5vbi1lcXVhbCBlbnRyeSBjb21wYXJpc29uIHJlc3VsdC5cbiAqIEZvciBleGFtcGxlLCBnaXZlbiBDb3B5QmFncyBYIGFuZCBZIGFuZCBhIHZhbHVlIGNvbXBhcmF0b3IgdGhhdCBnb2VzIGJ5IGNvdW50XG4gKiAoZGVmYXVsdGluZyBhYnNlbnQga2V5cyB0byBhIGNvdW50IG9mIDApLCBYIGlzIHNtYWxsZXIgdGhhbiBZIChgcmVzdWx0IDwgMGApXG4gKiBpZmYgdGhlcmUgYXJlIG5vIGtleXMgaW4gWCB0aGF0IGFyZSBlaXRoZXIgYWJzZW50IGZyb20gWVxuICogKGBjb21wYXJlVmFsdWVzKHhDb3VudCwgYWJzZW50VmFsdWUpID4gMGApIG9yIHByZXNlbnQgaW4gWSB3aXRoIGEgbG93ZXIgY291bnRcbiAqIChgY29tcGFyZVZhbHVlcyh4Q291bnQsIHlDb3VudCkgPiAwYCkgQU5EIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBrZXkgaW4gWSB0aGF0XG4gKiBpcyBlaXRoZXIgYWJzZW50IGZyb20gWCAoYGNvbXBhcmVWYWx1ZXMoYWJzZW50VmFsdWUsIHlDb3VudCkgPCAwYCkgb3IgcHJlc2VudFxuICogd2l0aCBhIGxvd2VyIGNvdW50IChgY29tcGFyZVZhbHVlcyh4Q291bnQsIHlDb3VudCkgPCAwYCkuXG4gKlxuICogVGhpcyBjYW4gYmUgZ2VuZXJhbGl6ZWQgdG8gdmlydHVhbCBjb2xsZWN0aW9ucyBpbiB0aGUgZnV0dXJlIGJ5IHJlcGxhY2luZ1xuICogYGdldEVudHJpZXMgPT4gQXJyYXlgIHdpdGggYGdlbmVyYXRlRW50cmllcyA9PiBJdGVyYWJsZUl0ZXJhdG9yYC5cbiAqXG4gKiBAdGVtcGxhdGUgW0M9S2V5Q29sbGVjdGlvbl1cbiAqIEB0ZW1wbGF0ZSBbVj11bmtub3duXVxuICogQHBhcmFtIHsoY29sbGVjdGlvbjogQykgPT4gQXJyYXk8W0tleSwgVl0+fSBnZXRFbnRyaWVzXG4gKiBAcGFyYW0ge1Z9IGFic2VudFZhbHVlXG4gKiBAcGFyYW0ge0tleUNvbXBhcmV9IGNvbXBhcmVWYWx1ZXNcbiAqIEByZXR1cm5zIHsobGVmdDogQywgcmlnaHQ6IEMpID0+IEtleUNvbXBhcmlzb259XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29tcGFyZUNvbGxlY3Rpb24gPSAoZ2V0RW50cmllcywgYWJzZW50VmFsdWUsIGNvbXBhcmVWYWx1ZXMpID0+XG4gIGhhcmRlbigobGVmdCwgcmlnaHQpID0+IHtcbiAgICBjb25zdCBtZXJnZWQgPSBnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhcbiAgICAgIGxlZnQsXG4gICAgICByaWdodCxcbiAgICAgIGdldEVudHJpZXMsXG4gICAgICBhYnNlbnRWYWx1ZSxcbiAgICApO1xuICAgIGxldCBsZWZ0SXNCaWdnZXIgPSBmYWxzZTtcbiAgICBsZXQgcmlnaHRJc0JpZ2dlciA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgW19rZXksIGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZV0gb2YgbWVyZ2VkKSB7XG4gICAgICBjb25zdCBjb21wID0gY29tcGFyZVZhbHVlcyhsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpO1xuICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlKi9cbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgIC8qIEJhc2VkIG9uIHRoaXMga2V5LCBsZWZ0IDwgcmlnaHQuKi9cbiAgICAgICAgcmlnaHRJc0JpZ2dlciA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPiAwKSB7XG4gICAgICAgIC8qIEJhc2VkIG9uIHRoaXMga2V5LCBsZWZ0ID4gcmlnaHQuKi9cbiAgICAgICAgbGVmdElzQmlnZ2VyID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE51bWJlci5pc05hTihjb21wKSB8fFxuICAgICAgICAgIC8qIHByZXR0aWVyLWlnbm9yZSovXG4gICAgICAgICAgRmFpbGBVbmV4cGVjdGVkIHZhbHVlIGNvbXBhcmlzb24gJHtxKGNvbXApfSBmb3IgJHtsZWZ0VmFsdWV9IHZzICR7cmlnaHRWYWx1ZX1gO1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgaWYgKGxlZnRJc0JpZ2dlciAmJiByaWdodElzQmlnZ2VyKSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgfVxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG4gICAgcmV0dXJuIGxlZnRJc0JpZ2dlciA/IDEgOiByaWdodElzQmlnZ2VyID8gLTEgOiAwO1xuICB9KTskaM2PX29uY2UubWFrZUNvbXBhcmVDb2xsZWN0aW9uKG1ha2VDb21wYXJlQ29sbGVjdGlvbik7XG5oYXJkZW4obWFrZUNvbXBhcmVDb2xsZWN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIjpbImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIl0sIm1ha2VDb21wYXJlQ29sbGVjdGlvbiI6WyJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmcQ4AVcoAABXKAAANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNEaXNqb2ludCIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmsscSxGYWlsLGFzc2VydE5vRHVwbGljYXRlS2V5cyxtYWtlQmFnT2ZFbnRyaWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZUtleXNcIixbJGjNj19hID0+IChhc3NlcnROb0R1cGxpY2F0ZUtleXMgPSAkaM2PX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLFskaM2PX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RnVsbENvbXBhcmUsIFJhbmtDb21wYXJlfSBmcm9tICdAZW5kby9tYXJzaGFsJ1xuICogQGltcG9ydCB7S2V5fSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKiBCYXNlZCBvbiBtZXJnZS1zZXQtb3BlcmF0b3JzLmpzLCBidXQgYWx0ZXJlZCBmb3IgdGhlIGJhZyByZXByZXNlbnRhdGlvbi4qL1xuLyogVE9ETyBzaGFyZSBtb3JlIGNvZGUgd2l0aCB0aGF0IGZpbGUgYW5kIGtleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzLiovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlXG4gKiB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBiYWdFbnRyaWVzIHdob3NlIGtleXMgYXJlIHRpZWQgZm9yIHRoZSBzYW1lXG4gKiByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgYmFnRW50cmllcyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGJhZ0VudHJpZXNgIGFycmF5XG4gKiBhY2NvcmRpbmdcbiAqIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50XT59XG4gKi9cbmNvbnN0IGJhZ1dpbmRvd1Jlc29ydCA9IChiYWdFbnRyaWVzLCByYW5rQ29tcGFyZSwgZnVsbENvbXBhcmUpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChiYWdFbnRyaWVzLCByYW5rQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBiYWdFbnRyaWVzO1xuICBsZXQgaSA9IDA7XG4gIGxldCBvcHRJbm5lckl0ZXJhdG9yO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT5cbiAgICAgIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAob3B0SW5uZXJJdGVyYXRvcikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoKi9cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGJhZ0VudHJpZXNbaV07XG4gICAgICAgICAgICBsZXQgaiA9IGkgKyAxO1xuICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICBqIDwgbGVuZ3RoICYmXG4gICAgICAgICAgICAgIHJhbmtDb21wYXJlKGVudHJ5WzBdLCBiYWdFbnRyaWVzW2pdWzBdKSA9PT0gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID09PSBpICsgMSkge1xuICAgICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogZW50cnkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaW1pbGFyUnVuID0gYmFnRW50cmllcy5zbGljZShpLCBqKTtcbiAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgY29uc3QgcmVzb3J0ZWQgPSBzb3J0QnlSYW5rKHNpbWlsYXJSdW4sIGZ1bGxDb21wYXJlKTtcbiAgICAgICAgICAgIC8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbiAgICAgICAgICAgIC8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbiAgICAgICAgICAgIC8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbiAgICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlS2V5cyhyZXNvcnRlZCwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuICAgICAgICAgICAgLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4gICAgICAgICAgICAvKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4gICAgICAgICAgICAvKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbiAgICAgICAgICAgIC8qIGFzIGlzLiovXG4gICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gcmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IFtudWxsLCAwbl0gfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHhiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geWJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlID0gKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIGNvbnN0IHhzID0gYmFnV2luZG93UmVzb3J0KHhiYWdFbnRyaWVzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeXMgPSBiYWdXaW5kb3dSZXNvcnQoeWJhZ0VudHJpZXMsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgLyogVGhlc2Ugc2l4IGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbiAgICAgIC8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4gICAgICAvKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbiAgICAgIC8qKiBAdHlwZSB7VH0gKi9cbiAgICAgIGxldCB4O1xuICAgICAgbGV0IHhjO1xuICAgICAgbGV0IHhEb25lO1xuICAgICAgLyoqIEB0eXBlIHtUfSAqL1xuICAgICAgbGV0IHk7XG4gICAgICBsZXQgeWM7XG4gICAgICBsZXQgeURvbmU7XG5cbiAgICAgIGNvbnN0IHhpID0geHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoe1xuICAgICAgICAgIGRvbmU6IHhEb25lLFxuICAgICAgICAgIHZhbHVlOiBbeCwgeGNdLFxuICAgICAgICB9ID0geGkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WCgpO1xuXG4gICAgICBjb25zdCB5aSA9IHlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IG5leHRZID0gKCkgPT4ge1xuICAgICAgICAheURvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICAgICAgKHtcbiAgICAgICAgICBkb25lOiB5RG9uZSxcbiAgICAgICAgICB2YWx1ZTogW3ksIHljXSxcbiAgICAgICAgfSA9IHlpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFkoKTtcblxuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAvKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xuICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICBpZiAoeERvbmUgJiYgeURvbmUpIHtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xuICAgICAgICAgICAgdmFsdWUgPSBbbnVsbCwgMG4sIDBuXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHhEb25lKSB7XG4gICAgICAgICAgICAvKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbiAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCB5Y107XG4gICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeURvbmUpIHtcbiAgICAgICAgICAgIC8qIG9ubHkgeHMgYXJlIGxlZnQqL1xuICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIDBuXTtcbiAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBmdWxsQ29tcGFyZSh4LCB5KTtcbiAgICAgICAgICAgIGlmIChjb21wID09PSAwKSB7XG4gICAgICAgICAgICAgIC8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIHljXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgICAgICAgLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCB4YywgMG5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuICAgICAgICAgICAgICBjb21wID4gMCB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG4gICAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCB5Y107XG4gICAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lLCB2YWx1ZSB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufTtcbmhhcmRlbihtZXJnZSk7XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNTdXBlcnNldCBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc1N1cGVyYmFnID0geHlpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjIDwgeWMpIHtcbiAgICAgIC8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNEaXNqb2ludCBhcyB3ZWxsLiovXG4vKiBUaGUgY29kZSBpcyBpZGVudGljYWwuKi9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBiYWdJdGVySXNEaXNqb2ludCA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA+PSAxbiAmJiB5YyA+PSAxbikge1xuICAgICAgLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnQsYmlnaW50XVtdfSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJVbmlvbiA9IHh5aSA9PiB7XG4gIC8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICByZXN1bHQucHVzaChbbSwgeGMgKyB5Y10pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVySW50ZXJzZWN0aW9uID0geHlpID0+IHtcbiAgLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGNvbnN0IG1jID0geGMgPD0geWMgPyB4YyA6IHljO1xuICAgIHJlc3VsdC5wdXNoKFttLCBtY10pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdCA9IHh5aSA9PiB7XG4gIC8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBjb25zdCBtYyA9IHhjIC0geWM7XG4gICAgbWMgPj0gMG4gfHwgRmFpbGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbiAgICBpZiAobWMgPj0gMW4pIHtcbiAgICAgIC8qIHRoZSB4IHdhcyBub3QgaW4geSovXG4gICAgICByZXN1bHQucHVzaChbbSwgbWNdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IG1lcmdlaWZ5ID0gYmFnSXRlck9wID0+ICh4YmFnRW50cmllcywgeWJhZ0VudHJpZXMpID0+XG4gIGJhZ0l0ZXJPcChtZXJnZSh4YmFnRW50cmllcywgeWJhZ0VudHJpZXMpKTtcblxuY29uc3QgYmFnRW50cmllc0lzU3VwZXJiYWcgPSBtZXJnZWlmeShiYWdJdGVySXNTdXBlcmJhZyk7XG5jb25zdCBiYWdFbnRyaWVzSXNEaXNqb2ludCA9IG1lcmdlaWZ5KGJhZ0l0ZXJJc0Rpc2pvaW50KTtcbmNvbnN0IGJhZ0VudHJpZXNVbmlvbiA9IG1lcmdlaWZ5KGJhZ0l0ZXJVbmlvbik7XG5jb25zdCBiYWdFbnRyaWVzSW50ZXJzZWN0aW9uID0gbWVyZ2VpZnkoYmFnSXRlckludGVyc2VjdGlvbik7XG5jb25zdCBiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdCA9IG1lcmdlaWZ5KGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3QmFnaWZ5ID0gYmFnRW50cmllc09wID0+ICh4YmFnLCB5YmFnKSA9PlxuICBiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLCB5YmFnLnBheWxvYWQpO1xuXG5jb25zdCBiYWdpZnkgPSBiYWdFbnRyaWVzT3AgPT4gKHhiYWcsIHliYWcpID0+XG4gIG1ha2VCYWdPZkVudHJpZXMoYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCwgeWJhZy5wYXlsb2FkKSk7XG5cbiAgICAgICBjb25zdCBiYWdJc1N1cGVyYmFnID0gcmF3QmFnaWZ5KGJhZ0VudHJpZXNJc1N1cGVyYmFnKTskaM2PX29uY2UuYmFnSXNTdXBlcmJhZyhiYWdJc1N1cGVyYmFnKTtcbiAgICAgICBjb25zdCBiYWdJc0Rpc2pvaW50ID0gcmF3QmFnaWZ5KGJhZ0VudHJpZXNJc0Rpc2pvaW50KTskaM2PX29uY2UuYmFnSXNEaXNqb2ludChiYWdJc0Rpc2pvaW50KTtcbiAgICAgICBjb25zdCBiYWdVbmlvbiA9IGJhZ2lmeShiYWdFbnRyaWVzVW5pb24pOyRozY9fb25jZS5iYWdVbmlvbihiYWdVbmlvbik7XG4gICAgICAgY29uc3QgYmFnSW50ZXJzZWN0aW9uID0gYmFnaWZ5KGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24pOyRozY9fb25jZS5iYWdJbnRlcnNlY3Rpb24oYmFnSW50ZXJzZWN0aW9uKTtcbiAgICAgICBjb25zdCBiYWdEaXNqb2ludFN1YnRyYWN0ID0gYmFnaWZ5KGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2UuYmFnRGlzam9pbnRTdWJ0cmFjdChiYWdEaXNqb2ludFN1YnRyYWN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyJdLCJiYWdJc0Rpc2pvaW50IjpbImJhZ0lzRGlzam9pbnQiXSwiYmFnVW5pb24iOlsiYmFnVW5pb24iXSwiYmFnSW50ZXJzZWN0aW9uIjpbImJhZ0ludGVyc2VjdGlvbiJdLCJiYWdEaXNqb2ludFN1YnRyYWN0IjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdB+PGWUvAABlLwAANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlTZXQuanMiXSwiZXhwb3J0cyI6WyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzVW5pb24iLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLHEsRmFpbCxhc3NlcnROb0R1cGxpY2F0ZXMsbWFrZVNldE9mRWxlbWVudHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlc1wiLFskaM2PX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlcyA9ICRozY9fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLFskaM2PX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0Z1bGxDb21wYXJlLCBSYW5rQ29tcGFyZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCdcbiAqIEBpbXBvcnQge0tleUNvbXBhcmlzb259IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qIFRPRE8gc2hhcmUgbW9yZSBjb2RlIHdpdGgga2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMuKi9cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGVsZW1lbnRzIHRpZWQgZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBlbGVtZW50cyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGVsZW1lbnRzYCBhcnJheSBhY2NvcmRpbmdcbiAqICB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCB3aW5kb3dSZXNvcnQgPSAoZWxlbWVudHMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKGVsZW1lbnRzLCByYW5rQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBlbGVtZW50cztcbiAgbGV0IGkgPSAwO1xuICBsZXQgb3B0SW5uZXJJdGVyYXRvcjtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+XG4gICAgICBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKG9wdElubmVySXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgIG9wdElubmVySXRlcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCovXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50c1tpXTtcbiAgICAgICAgICAgIGxldCBqID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoaiA8IGxlbmd0aCAmJiByYW5rQ29tcGFyZSh2YWx1ZSwgZWxlbWVudHNbal0pID09PSAwKSB7XG4gICAgICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID09PSBpICsgMSkge1xuICAgICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNpbWlsYXJSdW4gPSBlbGVtZW50cy5zbGljZShpLCBqKTtcbiAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgY29uc3QgcmVzb3J0ZWQgPSBzb3J0QnlSYW5rKHNpbWlsYXJSdW4sIGZ1bGxDb21wYXJlKTtcbiAgICAgICAgICAgIC8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbiAgICAgICAgICAgIC8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbiAgICAgICAgICAgIC8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbiAgICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlcyhyZXNvcnRlZCwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuICAgICAgICAgICAgLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4gICAgICAgICAgICAvKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4gICAgICAgICAgICAvKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbiAgICAgICAgICAgIC8qIGFzIGlzLiovXG4gICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gcmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1RbXX0geGVsZW1lbnRzXG4gKiBAcGFyYW0ge1RbXX0geWVsZW1lbnRzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZSA9ICh4ZWxlbWVudHMsIHllbGVtZW50cykgPT4ge1xuICAvKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuICAvKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIGNvbnN0IHhzID0gd2luZG93UmVzb3J0KHhlbGVtZW50cywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHlzID0gd2luZG93UmVzb3J0KHllbGVtZW50cywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAvKiBUaGVzZSBmb3VyIGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbiAgICAgIC8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4gICAgICAvKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbiAgICAgIC8qKiBAdHlwZSB7VH0gKi9cbiAgICAgIGxldCB4O1xuICAgICAgbGV0IHhEb25lO1xuICAgICAgLyoqIEB0eXBlIHtUfSAqL1xuICAgICAgbGV0IHk7XG4gICAgICBsZXQgeURvbmU7XG5cbiAgICAgIGNvbnN0IHhpID0geHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoeyBkb25lOiB4RG9uZSwgdmFsdWU6IHggfSA9IHhpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFgoKTtcblxuICAgICAgY29uc3QgeWkgPSB5c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBuZXh0WSA9ICgpID0+IHtcbiAgICAgICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgICAgICh7IGRvbmU6IHlEb25lLCB2YWx1ZTogeSB9ID0geWkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WSgpO1xuXG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIC8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG4gICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgIGlmICh4RG9uZSAmJiB5RG9uZSkge1xuICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG4gICAgICAgICAgICB2YWx1ZSA9IFtudWxsLCAwbiwgMG5dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeERvbmUpIHtcbiAgICAgICAgICAgIC8qIG9ubHkgeXMgYXJlIGxlZnQqL1xuICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIDFuXTtcbiAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh5RG9uZSkge1xuICAgICAgICAgICAgLyogb25seSB4cyBhcmUgbGVmdCovXG4gICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMG5dO1xuICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29tcCA9IGZ1bGxDb21wYXJlKHgsIHkpO1xuICAgICAgICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgICAgICAgLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMW5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkge1xuICAgICAgICAgICAgICAvKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG4gICAgICAgICAgICAgIHZhbHVlID0gW3gsIDFuLCAwbl07XG4gICAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG4gICAgICAgICAgICAgIGNvbXAgPiAwIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbiAgICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIDFuXTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmUsIHZhbHVlIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59O1xuaGFyZGVuKG1lcmdlKTtcblxuY29uc3QgaXRlcklzU3VwZXJzZXQgPSB4eWkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIF95Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID09PSAwbikge1xuICAgICAgLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGl0ZXJJc0Rpc2pvaW50ID0geHlpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDFuICYmIHljID49IDFuKSB7XG4gICAgICAvKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7S2V5Q29tcGFyaXNvbn1cbiAqL1xuY29uc3QgaXRlckNvbXBhcmUgPSB4eWkgPT4ge1xuICBsZXQgbG9uZVkgPSBmYWxzZTtcbiAgbGV0IGxvbmVYID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA9PT0gMG4pIHtcbiAgICAgIC8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xuICAgICAgbG9uZVkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoeWMgPT09IDBuKSB7XG4gICAgICAvKiBzb21ldGhpbmcgaW4geCBpcyBub3QgaW4geSwgc28geSBpcyBub3QgYSBzdXBlcnNldCBvZiB4Ki9cbiAgICAgIGxvbmVYID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGxvbmVYICYmIGxvbmVZKSB7XG4gICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgfVxuICBpZiAobG9uZVgpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIGlmIChsb25lWSkge1xuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIHtcbiAgICAoIWxvbmVYICYmICFsb25lWSkgfHxcbiAgICAgIEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsIGxvbmVZXSl9YDtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlclVuaW9uID0geHlpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDBuKSB7XG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgeWMgPj0gMG4gfHwgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG4gICAgICAvKiBpZiB4IGFuZCB5IHdlcmUgYm90aCByZWFkeSwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCBhbmQqL1xuICAgICAgLyogYWJvdmUgY2xhdXNlIGFscmVhZHkgdG9vayBjYXJlIG9mIGl0LiBPdGhlcndpc2UgcHVzaCBoZXJlLiovXG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFVuaW9uID0geHlpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgeGMgPT09IDBuIHx8IHljID09PSAwbiB8fCBGYWlsYFNldHMgbXVzdCBub3QgaGF2ZSBjb21tb24gZWxlbWVudHM6ICR7bX1gO1xuICAgIGlmICh4YyA+PSAxbikge1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHljID49IDFuIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVySW50ZXJzZWN0aW9uID0geHlpID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDFuICYmIHljID49IDFuKSB7XG4gICAgICAvKiBJZiB0aGV5IGFyZSBib3RoIHByZXNlbnQsIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQqL1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyRGlzam9pbnRTdWJ0cmFjdCA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIHhjID49IDFuIHx8IEZhaWxgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG4gICAgaWYgKHljID09PSAwbikge1xuICAgICAgLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgbWVyZ2VpZnkgPSBpdGVyT3AgPT4gKHhlbGVtZW50cywgeWVsZW1lbnRzKSA9PlxuICBpdGVyT3AobWVyZ2UoeGVsZW1lbnRzLCB5ZWxlbWVudHMpKTtcblxuICAgICAgIGNvbnN0IGVsZW1lbnRzSXNTdXBlcnNldCA9IG1lcmdlaWZ5KGl0ZXJJc1N1cGVyc2V0KTskaM2PX29uY2UuZWxlbWVudHNJc1N1cGVyc2V0KGVsZW1lbnRzSXNTdXBlcnNldCk7XG4gICAgICAgY29uc3QgZWxlbWVudHNJc0Rpc2pvaW50ID0gbWVyZ2VpZnkoaXRlcklzRGlzam9pbnQpOyRozY9fb25jZS5lbGVtZW50c0lzRGlzam9pbnQoZWxlbWVudHNJc0Rpc2pvaW50KTtcbiAgICAgICBjb25zdCBlbGVtZW50c0NvbXBhcmUgPSBtZXJnZWlmeShpdGVyQ29tcGFyZSk7JGjNj19vbmNlLmVsZW1lbnRzQ29tcGFyZShlbGVtZW50c0NvbXBhcmUpO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzVW5pb24gPSBtZXJnZWlmeShpdGVyVW5pb24pOyRozY9fb25jZS5lbGVtZW50c1VuaW9uKGVsZW1lbnRzVW5pb24pO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzRGlzam9pbnRVbmlvbiA9IG1lcmdlaWZ5KGl0ZXJEaXNqb2ludFVuaW9uKTskaM2PX29uY2UuZWxlbWVudHNEaXNqb2ludFVuaW9uKGVsZW1lbnRzRGlzam9pbnRVbmlvbik7XG4gICAgICAgY29uc3QgZWxlbWVudHNJbnRlcnNlY3Rpb24gPSBtZXJnZWlmeShpdGVySW50ZXJzZWN0aW9uKTskaM2PX29uY2UuZWxlbWVudHNJbnRlcnNlY3Rpb24oZWxlbWVudHNJbnRlcnNlY3Rpb24pO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9IG1lcmdlaWZ5KGl0ZXJEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2UuZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd1NldGlmeSA9IGVsZW1lbnRzT3AgPT4gKHhzZXQsIHlzZXQpID0+XG4gIGVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLCB5c2V0LnBheWxvYWQpO1xuXG5jb25zdCBzZXRpZnkgPSBlbGVtZW50c09wID0+ICh4c2V0LCB5c2V0KSA9PlxuICBtYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50c09wKHhzZXQucGF5bG9hZCwgeXNldC5wYXlsb2FkKSk7XG5cbiAgICAgICBjb25zdCBzZXRJc1N1cGVyc2V0ID0gcmF3U2V0aWZ5KGVsZW1lbnRzSXNTdXBlcnNldCk7JGjNj19vbmNlLnNldElzU3VwZXJzZXQoc2V0SXNTdXBlcnNldCk7XG4gICAgICAgY29uc3Qgc2V0SXNEaXNqb2ludCA9IHJhd1NldGlmeShlbGVtZW50c0lzRGlzam9pbnQpOyRozY9fb25jZS5zZXRJc0Rpc2pvaW50KHNldElzRGlzam9pbnQpO1xuICAgICAgIGNvbnN0IHNldFVuaW9uID0gc2V0aWZ5KGVsZW1lbnRzVW5pb24pOyRozY9fb25jZS5zZXRVbmlvbihzZXRVbmlvbik7XG4gICAgICAgY29uc3Qgc2V0RGlzam9pbnRVbmlvbiA9IHNldGlmeShlbGVtZW50c0Rpc2pvaW50VW5pb24pOyRozY9fb25jZS5zZXREaXNqb2ludFVuaW9uKHNldERpc2pvaW50VW5pb24pO1xuICAgICAgIGNvbnN0IHNldEludGVyc2VjdGlvbiA9IHNldGlmeShlbGVtZW50c0ludGVyc2VjdGlvbik7JGjNj19vbmNlLnNldEludGVyc2VjdGlvbihzZXRJbnRlcnNlY3Rpb24pO1xuICAgICAgIGNvbnN0IHNldERpc2pvaW50U3VidHJhY3QgPSBzZXRpZnkoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2Uuc2V0RGlzam9pbnRTdWJ0cmFjdChzZXREaXNqb2ludFN1YnRyYWN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCJdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIl0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiJdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0Il0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCJdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiJdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiJdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXRpaQisvAAArLwAANgAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIi4vcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4va2V5cy9jaGVja0tleS5qcyJdLCJleHBvcnRzIjpbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG9iamVjdE1hcCxBcmdHdWFyZExpc3RTaGFwZSxBd2FpdEFyZ0d1YXJkU2hhcGUsSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsSW50ZXJmYWNlR3VhcmRTaGFwZSxNLE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLE1ldGhvZEd1YXJkU2hhcGUsUmF3R3VhcmRTaGFwZSxTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxTeW5jVmFsdWVHdWFyZFNoYXBlLGFzc2VydEF3YWl0QXJnR3VhcmQsbWF0Y2hlcyxtdXN0TWF0Y2gsZ2V0Q29weU1hcEtleXMsbWFrZUNvcHlNYXA7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiLi9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIkFyZ0d1YXJkTGlzdFNoYXBlXCIsWyRozY9fYSA9PiAoQXJnR3VhcmRMaXN0U2hhcGUgPSAkaM2PX2EpXV0sW1wiQXdhaXRBcmdHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoQXdhaXRBcmdHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlXCIsWyRozY9fYSA9PiAoSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUgPSAkaM2PX2EpXV0sW1wiSW50ZXJmYWNlR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKEludGVyZmFjZUd1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGVcIixbJGjNj19hID0+IChNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9ICRozY9fYSldXSxbXCJNZXRob2RHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoTWV0aG9kR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJSYXdHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoUmF3R3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZVwiLFskaM2PX2EgPT4gKFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlID0gJGjNj19hKV1dLFtcIlN5bmNWYWx1ZUd1YXJkU2hhcGVcIixbJGjNj19hID0+IChTeW5jVmFsdWVHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcImFzc2VydEF3YWl0QXJnR3VhcmRcIixbJGjNj19hID0+IChhc3NlcnRBd2FpdEFyZ0d1YXJkID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImdldENvcHlNYXBLZXlzXCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEtleXMgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlNYXBcIixbJGjNj19hID0+IChtYWtlQ29weU1hcCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVNZXRob2ROYW1lfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0F3YWl0QXJnR3VhcmQsIEF3YWl0QXJnR3VhcmRQYXlsb2FkLCBJbnRlcmZhY2VHdWFyZCwgSW50ZXJmYWNlR3VhcmRQYXlsb2FkLCBNZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRQYXlsb2FkfSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKiBUaGUgZ2V0Kkd1YXJkUGF5bG9hZCBmdW5jdGlvbnMgZXhpc3QgdG8gYWRhcHQgdG8gdGhlIHdvcmxkcyBib3RoKi9cbi8qIGJlZm9yZSBhbmQgYWZ0ZXIgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMiAuIFdoZW4qL1xuLyogZ2l2ZW4gc29tZXRoaW5nIHRoYXQgd291bGQgYmUgdGhlIGV4cGVjdGVkIGd1YXJkIGluIGVpdGhlciB3b3JsZCwqL1xuLyogaXQgcmV0dXJucyBhICpHdWFyZFBheWxvYWQgdGhhdCBpcyB2YWxpZCBpbiB0aGUgY3VycmVudCB3b3JsZC4gVGh1cyovXG4vKiBpdCBoZWxwcyBuZXcgY29uc3VtZXJzIG9mIHRoZXNlIGd1YXJkcyBjb3BlIHdpdGggb2xkIGNvZGUgdGhhdCovXG4vKiB3b3VsZCBjb25zdHJ1Y3QgYW5kIHNlbmQgdGhlc2UgZ3VhcmRzLiovXG5cbi8qIEJlY2F1c2UgdGhlIG1haW4gdXNlIGNhc2UgZm9yIHRoaXMgbGVnYWN5IGFkYXB0YXRpb24gaXMgaW4gQGVuZG8vZXhvKi9cbi8qIG9yIHBhY2thZ2VzIHRoYXQgZGVwZW5kIG9uIGl0LCB0aGUgdGVzdHMgZm9yIHRoaXMgbGVnYWN5IGFkYXB0YXRpb24qL1xuLyogYXJlIGZvdW5kIGluIHRoZSBAZW5kby9leG8gYHRlc3QtbGVnYWN5LWd1YXJkLXRvbGVyYW5jZS5qc2AuKi9cblxuLyogVW5saWtlIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSwgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSwqL1xuLyogYW5kIExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGUsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGEqL1xuLyogTGVnYWN5UmF3R3VhcmRTaGFwZSwgYmVjYXVzZSByYXcgZ3VhcmRzIHdlcmUgaW50cm9kdWNlZCBhdCovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xODMxICwgd2hpY2ggd2FzIG1lcmdlZCB3ZWxsIGFmdGVyKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIgLiBUaHVzLCB0aGVyZSB3YXMgbmV2ZXIgYSovXG4vKiBga2xhc3M6YCBmb3JtIG9mIHRoZSByYXcgZ3VhcmQuKi9cblxuLyogVE9ETyBBdCBzdWNoIGEgdGltZSB0aGF0IHdlIGRlY2lkZSB3ZSBubyBsb25nZXIgbmVlZCB0byBzdXBwb3J0IGNvZGUqL1xuLyogcHJlY2VkaW5nIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIgb3IgZ3VhcmQgZGF0YSovXG4vKiBnZW5lcmF0ZWQgYnkgdGhhdCBjb2RlLCBhbGwgdGhlIGFkYXB0YXRpb24gY29tcGxleGl0eSBpbiB0aGlzIGZpbGUqL1xuLyogc2hvdWxkIGJlIGRlbGV0ZWQuKi9cblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIEF3YWl0QXJnR3VhcmRQYXlsb2FkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUgPSBoYXJkZW4oe1xuICBrbGFzczogJ2F3YWl0QXJnJyxcbiAgYXJnR3VhcmQ6IE0ucGF0dGVybigpLFxufSk7XG5cbi8qKlxuICogQnkgdXNpbmcgdGhpcyBhYnN0cmFjdGlvbiByYXRoZXIgdGhhbiBhY2Nlc3NpbmcgdGhlIHByb3BlcnRpZXMgZGlyZWN0bHksXG4gKiB3ZSBzbW9vdGggdGhlIHRyYW5zaXRpb24gdG8gaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMixcbiAqIHRvbGVyYXRpbmcgYm90aCB0aGUgbGVnYWN5IGFuZCBjdXJyZW50IGd1YXJkIHNoYXBlcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGVjaG5pY2FsbHksIHRvbGVyYXRpbmcgdGhlIG9sZCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGVcbiAqIGlzIGFuIGV4cGxvaXRhYmxlIGJ1ZywgaW4gdGhhdCBhIHJlY29yZCB0aGF0IG1hdGNoZXMgdGhpc1xuICogc2hhcGUgaXMgYWxzbyBhIHZhbGlkIHBhcmFtZXRlciBwYXR0ZXJuIHRoYXQgc2hvdWxkIGFsbG93XG4gKiBhbiBhcmd1bWVudCB0aGF0IG1hdGNoZXMgdGhhdCBwYXR0ZXJuLCBpLmUuLCBhIGNvcHlSZWNvcmQgYXJndW1lbnQgdGhhdFxuICogYXQgbGVhc3QgY29udGFpbnMgYSBga2xhc3M6ICdhd2FpdEFyZ0d1YXJkJ2AgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtBd2FpdEFyZ0d1YXJkfSBhd2FpdEFyZ0d1YXJkXG4gKiBAcmV0dXJucyB7QXdhaXRBcmdHdWFyZFBheWxvYWR9XG4gKi9cbiAgICAgICBjb25zdCBnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCA9IGF3YWl0QXJnR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhhd2FpdEFyZ0d1YXJkLCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUpKSB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICBjb25zdCB7IGtsYXNzOiBfLCAuLi5wYXlsb2FkIH0gPSBhd2FpdEFyZ0d1YXJkO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cbiAgYXNzZXJ0QXdhaXRBcmdHdWFyZChhd2FpdEFyZ0d1YXJkKTtcbiAgcmV0dXJuIGF3YWl0QXJnR3VhcmQucGF5bG9hZDtcbn07JGjNj19vbmNlLmdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKTtcbmhhcmRlbihnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCk7XG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBTeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lTeW5jTWV0aG9kR3VhcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBrbGFzczogJ21ldGhvZEd1YXJkJyxcbiAgICBjYWxsS2luZDogJ3N5bmMnLFxuICAgIGFyZ0d1YXJkczogU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG4gICAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG4gIH0sXG4gIHtcbiAgICBvcHRpb25hbEFyZ0d1YXJkczogU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG4gICAgcmVzdEFyZ0d1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuKTtcblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIEFyZ0d1YXJkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lBcmdHdWFyZFNoYXBlID0gTS5vcihcbiAgUmF3R3VhcmRTaGFwZSxcbiAgQXdhaXRBcmdHdWFyZFNoYXBlLFxuICBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUsXG4gIE0ucGF0dGVybigpLFxuKTtcbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBBcmdHdWFyZExpc3RTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeUFyZ0d1YXJkTGlzdFNoYXBlID0gTS5hcnJheU9mKExlZ2FjeUFyZ0d1YXJkU2hhcGUpO1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggQXN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeUFzeW5jTWV0aG9kR3VhcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBrbGFzczogJ21ldGhvZEd1YXJkJyxcbiAgICBjYWxsS2luZDogJ2FzeW5jJyxcbiAgICBhcmdHdWFyZHM6IExlZ2FjeUFyZ0d1YXJkTGlzdFNoYXBlLFxuICAgIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuICB7XG4gICAgb3B0aW9uYWxBcmdHdWFyZHM6IEFyZ0d1YXJkTGlzdFNoYXBlLFxuICAgIHJlc3RBcmdHdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbik7XG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBNZXRob2RHdWFyZFBheWxvYWRTaGFwZSovXG4vKiBiZWNhdXNlIHRoaXMgb25lIG5lZWRzIHRvIGJlIHN0YWJsZSBhbmQgYWNjb21tb2RhdGUgbmVzdGVkIGxlZ2FjeSwqL1xuLyogd2hlbiB0aGF0J3MgYW4gaXNzdWUuKi9cbmNvbnN0IExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUgPSBNLm9yKFxuICBMZWdhY3lTeW5jTWV0aG9kR3VhcmRTaGFwZSxcbiAgTGVnYWN5QXN5bmNNZXRob2RHdWFyZFNoYXBlLFxuKTtcblxuY29uc3QgYWRhcHRMZWdhY3lBcmdHdWFyZCA9IGFyZ0d1YXJkID0+XG4gIG1hdGNoZXMoYXJnR3VhcmQsIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSlcbiAgICA/IE0uYXdhaXQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoYXJnR3VhcmQpLmFyZ0d1YXJkKVxuICAgIDogYXJnR3VhcmQ7XG5cbi8qKlxuICogQnkgdXNpbmcgdGhpcyBhYnN0cmFjdGlvbiByYXRoZXIgdGhhbiBhY2Nlc3NpbmcgdGhlIHByb3BlcnRpZXMgZGlyZWN0bHksXG4gKiB3ZSBzbW9vdGggdGhlIHRyYW5zaXRpb24gdG8gaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMixcbiAqIHRvbGVyYXRpbmcgYm90aCB0aGUgbGVnYWN5IGFuZCBjdXJyZW50IGd1YXJkIHNoYXBlcy5cbiAqXG4gKiBVbmxpa2UgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlLCB0b2xlcmF0aW5nIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGVcbiAqIGRvZXMgbm90IHNlZW0gbGlrZSBhIGN1cnJlbnRseSBleHBsb2l0YWJsZSBidWcsIGJlY2F1c2UgdGhlcmUgaXMgbm90XG4gKiBjdXJyZW50bHkgYW55IGNvbnRleHQgd2hlcmUgZWl0aGVyIGEgbWV0aG9kR3VhcmQgb3IgYSBjb3B5UmVjb3JkIHdvdWxkXG4gKiBib3RoIGJlIG1lYW5pbmdmdWwuXG4gKlxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqIEByZXR1cm5zIHtNZXRob2RHdWFyZFBheWxvYWR9XG4gKi9cbiAgICAgICBjb25zdCBnZXRNZXRob2RHdWFyZFBheWxvYWQgPSBtZXRob2RHdWFyZCA9PiB7XG4gIGlmIChtYXRjaGVzKG1ldGhvZEd1YXJkLCBNZXRob2RHdWFyZFNoYXBlKSkge1xuICAgIHJldHVybiBtZXRob2RHdWFyZC5wYXlsb2FkO1xuICB9XG4gIG11c3RNYXRjaChtZXRob2RHdWFyZCwgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSwgJ2xlZ2FjeU1ldGhvZEd1YXJkJyk7XG4gIGNvbnN0IHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIGtsYXNzOiBfLFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgY2FsbEtpbmQsXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICByZXR1cm5HdWFyZCxcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIHJlc3RBcmdHdWFyZCxcbiAgfSA9IG1ldGhvZEd1YXJkO1xuICBsZXQge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgYXJnR3VhcmRzLFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gIH0gPSBtZXRob2RHdWFyZDtcbiAgaWYgKGNhbGxLaW5kID09PSAnYXN5bmMnKSB7XG4gICAgYXJnR3VhcmRzID0gYXJnR3VhcmRzLm1hcChhZGFwdExlZ2FjeUFyZ0d1YXJkKTtcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyA9XG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyAmJiBvcHRpb25hbEFyZ0d1YXJkcy5tYXAoYWRhcHRMZWdhY3lBcmdHdWFyZCk7XG4gIH1cbiAgY29uc3QgcGF5bG9hZCA9IGhhcmRlbih7XG4gICAgY2FsbEtpbmQsXG4gICAgYXJnR3VhcmRzLFxuICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICAgIHJlc3RBcmdHdWFyZCxcbiAgICByZXR1cm5HdWFyZCxcbiAgfSk7XG4gIC8qIGVuc3VyZSB0aGUgYWRhcHRhdGlvbiBzdWNjZWVkZWQuKi9cbiAgbXVzdE1hdGNoKHBheWxvYWQsIE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLCAnaW50ZXJuYWxNZXRob2RHdWFyZEFkYXB0b3InKTtcbiAgcmV0dXJuIHBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRNZXRob2RHdWFyZFBheWxvYWQoZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKTtcbmhhcmRlbihnZXRNZXRob2RHdWFyZFBheWxvYWQpO1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGtsYXNzOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VOYW1lOiBNLnN0cmluZygpLFxuICAgIG1ldGhvZEd1YXJkczogTS5yZWNvcmRPZihcbiAgICAgIE0uc3RyaW5nKCksXG4gICAgICBNLm9yKE1ldGhvZEd1YXJkU2hhcGUsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUpLFxuICAgICksXG4gIH0sXG4gIHtcbiAgICBkZWZhdWx0R3VhcmRzOiBNLm9yKE0udW5kZWZpbmVkKCksICdwYXNzYWJsZScsICdyYXcnKSxcbiAgICBzbG9wcHk6IE0uYm9vbGVhbigpLFxuICAgIC8qIFRoZXJlIGlzIG5vIG5lZWQgdG8gYWNjb21tb2RhdGUgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSBpbiovXG4gICAgLyogdGhpcyBwb3NpdGlvbiwgc2luY2UgYHN5bWJvbE1ldGhvZEd1YXJkcyBoYXBwZW5lZCovXG4gICAgLyogYWZ0ZXIgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMiovXG4gICAgc3ltYm9sTWV0aG9kR3VhcmRzOiBNLm1hcE9mKE0uc3ltYm9sKCksIE1ldGhvZEd1YXJkU2hhcGUpLFxuICB9LFxuKTtcblxuY29uc3QgYWRhcHRNZXRob2RHdWFyZCA9IG1ldGhvZEd1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMobWV0aG9kR3VhcmQsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUpKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbEtpbmQsXG4gICAgICBhcmdHdWFyZHMsXG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgICAgcmVzdEFyZ0d1YXJkID0gTS5hbnkoKSxcbiAgICAgIHJldHVybkd1YXJkLFxuICAgIH0gPSBnZXRNZXRob2RHdWFyZFBheWxvYWQobWV0aG9kR3VhcmQpO1xuICAgIGNvbnN0IG1DYWxsID0gY2FsbEtpbmQgPT09ICdzeW5jJyA/IE0uY2FsbCA6IE0uY2FsbFdoZW47XG4gICAgcmV0dXJuIG1DYWxsKC4uLmFyZ0d1YXJkcylcbiAgICAgIC5vcHRpb25hbCguLi5vcHRpb25hbEFyZ0d1YXJkcylcbiAgICAgIC5yZXN0KHJlc3RBcmdHdWFyZClcbiAgICAgIC5yZXR1cm5zKHJldHVybkd1YXJkKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kR3VhcmQ7XG59O1xuXG4vKipcbiAqIEJ5IHVzaW5nIHRoaXMgYWJzdHJhY3Rpb24gcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSBwcm9wZXJ0aWVzIGRpcmVjdGx5LFxuICogd2Ugc21vb3RoIHRoZSB0cmFuc2l0aW9uIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIsXG4gKiB0b2xlcmF0aW5nIGJvdGggdGhlIGxlZ2FjeSBhbmQgY3VycmVudCBndWFyZCBzaGFwZXMuXG4gKlxuICogVW5saWtlIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSwgdG9sZXJhdGluZyBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlXG4gKiBkb2VzIG5vdCBzZWVtIGxpa2UgYSBjdXJyZW50bHkgZXhwbG9pdGFibGUgYnVnLCBiZWNhdXNlIHRoZXJlIGlzIG5vdFxuICogY3VycmVudGx5IGFueSBjb250ZXh0IHdoZXJlIGVpdGhlciBhbiBpbnRlcmZhY2VHdWFyZCBvciBhIGNvcHlSZWNvcmQgd291bGRcbiAqIGJvdGggYmUgbWVhbmluZ2Z1bC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxSZW1vdGFibGVNZXRob2ROYW1lLCBNZXRob2RHdWFyZD59IFtUPVJlY29yZDxSZW1vdGFibGVNZXRob2ROYW1lLCBNZXRob2RHdWFyZD5dXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkPFQ+fSBpbnRlcmZhY2VHdWFyZFxuICogQHJldHVybnMge0ludGVyZmFjZUd1YXJkUGF5bG9hZDxUPn1cbiAqL1xuICAgICAgIGNvbnN0IGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9IGludGVyZmFjZUd1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMoaW50ZXJmYWNlR3VhcmQsIEludGVyZmFjZUd1YXJkU2hhcGUpKSB7XG4gICAgcmV0dXJuIGludGVyZmFjZUd1YXJkLnBheWxvYWQ7XG4gIH1cbiAgbXVzdE1hdGNoKGludGVyZmFjZUd1YXJkLCBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlLCAnbGVnYWN5SW50ZXJmYWNlR3VhcmQnKTtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG4gIGxldCB7IGtsYXNzOiBfLCBpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIC4uLnJlc3QgfSA9IGludGVyZmFjZUd1YXJkO1xuICBtZXRob2RHdWFyZHMgPSBvYmplY3RNYXAobWV0aG9kR3VhcmRzLCBhZGFwdE1ldGhvZEd1YXJkKTtcbiAgY29uc3QgcGF5bG9hZCA9IGhhcmRlbih7XG4gICAgaW50ZXJmYWNlTmFtZSxcbiAgICBtZXRob2RHdWFyZHMsXG4gICAgLi4ucmVzdCxcbiAgfSk7XG4gIG11c3RNYXRjaChcbiAgICBwYXlsb2FkLFxuICAgIEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlLFxuICAgICdpbnRlcm5hbEludGVyZmFjZUd1YXJkQWRhcHRvcicsXG4gICk7XG4gIHJldHVybiBwYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCk7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKTtcblxuY29uc3QgZW1wdHlDb3B5TWFwID0gbWFrZUNvcHlNYXAoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZUd1YXJkXG4gKiBAcmV0dXJucyB7KHN0cmluZyB8IHN5bWJvbClbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldEludGVyZmFjZU1ldGhvZEtleXMgPSBpbnRlcmZhY2VHdWFyZCA9PiB7XG4gIGNvbnN0IHsgbWV0aG9kR3VhcmRzLCBzeW1ib2xNZXRob2RHdWFyZHMgPSBlbXB0eUNvcHlNYXAgfSA9XG4gICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGludGVyZmFjZUd1YXJkKTtcbiAgLyoqIEB0eXBlIHsoc3RyaW5nIHwgc3ltYm9sKVtdfSAqL1xuICAvKiBUT0RPIGF0LXRzLWV4cGVjdC1lcnJvciB3b3JrcyBsb2NhbGx5IGJ1dCBub3QgZnJvbSBAZW5kby9leG8qL1xuICAvKiBAdHMtaWdub3JlIGluZmVyZW5jZSBpcyB0b28gd2VhayB0byBzZWUgdGhpcyBpcyBvayovXG4gIHJldHVybiBoYXJkZW4oW1xuICAgIC4uLlJlZmxlY3Qub3duS2V5cyhtZXRob2RHdWFyZHMpLFxuICAgIC4uLmdldENvcHlNYXBLZXlzKHN5bWJvbE1ldGhvZEd1YXJkcyksXG4gIF0pO1xufTskaM2PX29uY2UuZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyhnZXRJbnRlcmZhY2VNZXRob2RLZXlzKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VNZXRob2RLZXlzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIjpbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIl0sImdldE1ldGhvZEd1YXJkUGF5bG9hZCI6WyJnZXRNZXRob2RHdWFyZFBheWxvYWQiXSwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIjpbImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCJdLCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIjpbImdldEludGVyZmFjZU1ldGhvZEtleXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZqTue74yAQC+MgEANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIiwiQGVuZG8vY29tbW9uL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIiwiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL21hcnNoYWwiLCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiXSwiZXhwb3J0cyI6WyJBcmdHdWFyZExpc3RTaGFwZSIsIkF3YWl0QXJnR3VhcmRTaGFwZSIsIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIiwiSW50ZXJmYWNlR3VhcmRTaGFwZSIsIk0iLCJNZXRob2RHdWFyZFBheWxvYWRTaGFwZSIsIk1ldGhvZEd1YXJkU2hhcGUiLCJSYXdHdWFyZFNoYXBlIiwiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiLCJTeW5jVmFsdWVHdWFyZFNoYXBlIiwiYXNzZXJ0QXdhaXRBcmdHdWFyZCIsImFzc2VydEludGVyZmFjZUd1YXJkIiwiYXNzZXJ0TWV0aG9kR3VhcmQiLCJhc3NlcnRQYXR0ZXJuIiwiYXNzZXJ0UmF3R3VhcmQiLCJjaGVja01hdGNoZXMiLCJjb250YWluZXJIYXNTcGxpdCIsImRlZmF1bHRMaW1pdHMiLCJnZXRSYW5rQ292ZXIiLCJpc0F3YWl0QXJnR3VhcmQiLCJpc1BhdHRlcm4iLCJpc1Jhd0d1YXJkIiwia2luZE9mIiwibWF0Y2hlcyIsIm11c3RNYXRjaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsYixYLEZhaWwsbWFrZUVycm9yLGFubm90YXRlRXJyb3IsaWRlbnRDaGVja2VyLGFwcGx5TGFiZWxpbmdFcnJvcixmcm9tVW5pcXVlRW50cmllcyxsaXN0RGlmZmVyZW5jZSxhc3NlcnRDaGVja2VyLEZhcixnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsY29tcGFyZVJhbmssZ2V0UGFzc1N0eWxlQ292ZXIsaW50ZXJzZWN0UmFua0NvdmVycyx1bmlvblJhbmtDb3ZlcnMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLHFwLGtleUVRLGtleUdULGtleUdURSxrZXlMVCxrZXlMVEUsYXNzZXJ0S2V5LGNoZWNrS2V5LGlzS2V5LGNoZWNrU2NhbGFyS2V5LGNoZWNrQ29weVNldCxjaGVja0NvcHlNYXAsY29weU1hcEtleVNldCxjaGVja0NvcHlCYWcsZ2V0Q29weU1hcEVudHJ5QXJyYXksbWFrZUNvcHlNYXAsbWFrZUNvcHlTZXQsbWFrZUNvcHlCYWcsZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImJcIixbJGjNj19hID0+IChiID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIixbJGjNj19hID0+IChpZGVudENoZWNrZXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanNcIiwgW1tcImFwcGx5TGFiZWxpbmdFcnJvclwiLFskaM2PX2EgPT4gKGFwcGx5TGFiZWxpbmdFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzXCIsIFtbXCJmcm9tVW5pcXVlRW50cmllc1wiLFskaM2PX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbW1wibGlzdERpZmZlcmVuY2VcIixbJGjNj19hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dLFtcImdldFBhc3NTdHlsZUNvdmVyXCIsWyRozY9fYSA9PiAoZ2V0UGFzc1N0eWxlQ292ZXIgPSAkaM2PX2EpXV0sW1wiaW50ZXJzZWN0UmFua0NvdmVyc1wiLFskaM2PX2EgPT4gKGludGVyc2VjdFJhbmtDb3ZlcnMgPSAkaM2PX2EpXV0sW1widW5pb25SYW5rQ292ZXJzXCIsWyRozY9fYSA9PiAodW5pb25SYW5rQ292ZXJzID0gJGjNj19hKV1dLFtcInJlY29yZE5hbWVzXCIsWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsWyRozY9fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjNj19hKV1dLFtcInFwXCIsWyRozY9fYSA9PiAocXAgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcImtleUdUXCIsWyRozY9fYSA9PiAoa2V5R1QgPSAkaM2PX2EpXV0sW1wia2V5R1RFXCIsWyRozY9fYSA9PiAoa2V5R1RFID0gJGjNj19hKV1dLFtcImtleUxUXCIsWyRozY9fYSA9PiAoa2V5TFQgPSAkaM2PX2EpXV0sW1wia2V5TFRFXCIsWyRozY9fYSA9PiAoa2V5TFRFID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImNoZWNrS2V5XCIsWyRozY9fYSA9PiAoY2hlY2tLZXkgPSAkaM2PX2EpXV0sW1wiaXNLZXlcIixbJGjNj19hID0+IChpc0tleSA9ICRozY9fYSldXSxbXCJjaGVja1NjYWxhcktleVwiLFskaM2PX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcImNoZWNrQ29weVNldFwiLFskaM2PX2EgPT4gKGNoZWNrQ29weVNldCA9ICRozY9fYSldXSxbXCJjaGVja0NvcHlNYXBcIixbJGjNj19hID0+IChjaGVja0NvcHlNYXAgPSAkaM2PX2EpXV0sW1wiY29weU1hcEtleVNldFwiLFskaM2PX2EgPT4gKGNvcHlNYXBLZXlTZXQgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsWyRozY9fYSA9PiAoY2hlY2tDb3B5QmFnID0gJGjNj19hKV1dLFtcImdldENvcHlNYXBFbnRyeUFycmF5XCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJ5QXJyYXkgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlNYXBcIixbJGjNj19hID0+IChtYWtlQ29weU1hcCA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5QmFnXCIsWyRozY9fYSA9PiAobWFrZUNvcHlCYWcgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzXCIsIFtbXCJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllc1wiLFskaM2PX2EgPT4gKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NoZWNrZXIsIENvcHlBcnJheSwgQ29weVJlY29yZCwgQ29weVRhZ2dlZCwgUGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKiBAaW1wb3J0IHtDb3B5U2V0LCBDb3B5QmFnLCBBcmdHdWFyZCwgQXdhaXRBcmdHdWFyZCwgQ2hlY2tQYXR0ZXJuLCBHZXRSYW5rQ292ZXIsIEludGVyZmFjZUd1YXJkLCBNYXRjaGVyTmFtZXNwYWNlLCBNZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRNYWtlciwgUGF0dGVybiwgUmF3R3VhcmQsIFN5bmNWYWx1ZUd1YXJkLCBLaW5kLCBMaW1pdHMsIEFsbExpbWl0cywgS2V5LCBEZWZhdWx0R3VhcmRUeXBlfSBmcm9tICcuLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge01hdGNoSGVscGVyLCBQYXR0ZXJuS2l0fSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbmNvbnN0IHsgZW50cmllcywgdmFsdWVzLCBoYXNPd24gfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqIEB0eXBlIHtXZWFrU2V0PFBhdHRlcm4+fSAqL1xuY29uc3QgcGF0dGVybk1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogRm9yIGZvcndhcmQgcmVmZXJlbmNlcyB0byBgTWAgKi9cbmxldCBNTTtcblxuLyoqXG4gKiBUaGUgYWN0dWFsIGRlZmF1bHQgdmFsdWVzIGhlcmUgYXJlLCBhdCB0aGUgcHJlc2VudCB0aW1lLCBmYWlybHlcbiAqIGFyYml0cmFyeSBjaG9pY2VzIGFuZCBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IHNldHRsZSBkb3duLiBPZiBjb3Vyc2VcbiAqIGF0IHNvbWUgcG9pbnQgd2UnbGwgbmVlZCB0byBzdG9wIGNoYW5naW5nIHRoZW0uIEJ1dCB3ZSBzaG91bGQgZmlyc3RcbiAqIHNlZSBob3cgb3VyIHN5c3RlbSBob2xkcyB1cCB3aXRoIHRoZXNlIGNob2ljZXMuIFRoZSBtYWluIGNyaXRlcmlhXG4gKiBpcyB0aGF0IHRoZXkgYmUgYmlnIGVub3VnaCB0aGF0IFwibm9ybWFsXCIgaW5ub2NlbnQgcHJvZ3JhbXMgcmFyZWx5XG4gKiBlbmNvdW50ZXIgdGhlc2UgbGltaXRzLlxuICpcbiAqIEV4cG9ydGVkIHByaW1hcmlseSBmb3IgdGVzdGluZy5cbiAqL1xuICAgICAgIGNvbnN0IGRlZmF1bHRMaW1pdHMgPSBoYXJkZW4oe1xuICBkZWNpbWFsRGlnaXRzTGltaXQ6IDEwMCxcbiAgc3RyaW5nTGVuZ3RoTGltaXQ6IDEwMF8wMDAsXG4gIHN5bWJvbE5hbWVMZW5ndGhMaW1pdDogMTAwLFxuICBudW1Qcm9wZXJ0aWVzTGltaXQ6IDgwLFxuICBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdDogMTAwLFxuICBhcnJheUxlbmd0aExpbWl0OiAxMF8wMDAsXG4gIGJ5dGVMZW5ndGhMaW1pdDogMTAwXzAwMCxcbiAgbnVtU2V0RWxlbWVudHNMaW1pdDogMTBfMDAwLFxuICBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0OiAxMF8wMDAsXG4gIG51bU1hcEVudHJpZXNMaW1pdDogNTAwMCxcbn0pO1xuXG4vKipcbiAqIFVzZSB0aGUgcmVzdWx0IG9ubHkgdG8gZ2V0IHRoZSBsaW1pdHMgeW91IG5lZWQgYnkgZGVzdHJ1Y3R1cmluZy5cbiAqIFRodXMsIHRoZSByZXN1bHQgb25seSBuZWVkcyB0byBzdXBwb3J0IGRlc3RydWN0dXJpbmcuIFRoZSBjdXJyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiB1c2VzIGluaGVyaXRhbmNlIGFzIGEgY2hlYXAgaGFjay5cbiAqXG4gKiBAcGFyYW0ge0xpbWl0c30gW2xpbWl0c11cbiAqIEByZXR1cm5zIHtBbGxMaW1pdHN9XG4gKi8kaM2PX29uY2UuZGVmYXVsdExpbWl0cyhkZWZhdWx0TGltaXRzKTtcbmNvbnN0IGxpbWl0ID0gKGxpbWl0cyA9IHt9KSA9PlxuICAvKiogQHR5cGUge0FsbExpbWl0c30gKi8gKGhhcmRlbih7IF9fcHJvdG9fXzogZGVmYXVsdExpbWl0cywgLi4ubGltaXRzIH0pKTtcblxuY29uc3QgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQgPSAoXG4gIHBheWxvYWQsXG4gIG1haW5QYXlsb2FkU2hhcGUsXG4gIGNoZWNrLFxuICBsYWJlbCxcbikgPT4ge1xuICBhc3NlcnQoQXJyYXkuaXNBcnJheShtYWluUGF5bG9hZFNoYXBlKSk7XG4gIGlmICghQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3EobGFiZWwpfSBwYXlsb2FkIG11c3QgYmUgYW4gYXJyYXk6ICR7cGF5bG9hZH1gKTtcbiAgfVxuXG4gIC8qIFdhcyB0aGUgZm9sbG93aW5nLCBidXQgaXRzIG92ZXJ1c2Ugb2YgcGF0dGVybnMgY2F1c2VkIGFuIGluZmluaXRlIHJlZ3Jlc3MqL1xuICAvKiBjb25zdCBwYXlsb2FkTGltaXRTaGFwZSA9IGhhcmRlbigqL1xuICAvKiBNLnNwbGl0KCovXG4gIC8qIG1haW5QYXlsb2FkU2hhcGUsKi9cbiAgLyogTS5wYXJ0aWFsKGhhcmRlbihbTS5yZWNvcmRPZihNLnN0cmluZygpLCBNLm51bWJlcigpKV0pLCBoYXJkZW4oW10pKSwqL1xuICAvKiApLCovXG4gIC8qICk7Ki9cbiAgLyogcmV0dXJuIGNoZWNrTWF0Y2hlcyhwYXlsb2FkLCBwYXlsb2FkTGltaXRTaGFwZSwgY2hlY2ssIGxhYmVsKTsqL1xuXG4gIGNvbnN0IG1haW5MZW5ndGggPSBtYWluUGF5bG9hZFNoYXBlLmxlbmd0aDtcbiAgaWYgKCEocGF5bG9hZC5sZW5ndGggPT09IG1haW5MZW5ndGggfHwgcGF5bG9hZC5sZW5ndGggPT09IG1haW5MZW5ndGggKyAxKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuICB9XG4gIGNvbnN0IGxpbWl0cyA9IHBheWxvYWRbbWFpbkxlbmd0aF07XG4gIHBheWxvYWQgPSBoYXJkZW4ocGF5bG9hZC5zbGljZSgwLCBtYWluTGVuZ3RoKSk7XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gIGlmICghY2hlY2tNYXRjaGVzKHBheWxvYWQsIG1haW5QYXlsb2FkU2hhcGUsIGNoZWNrLCBsYWJlbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGxpbWl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIChcbiAgICAocGFzc1N0eWxlT2YobGltaXRzKSA9PT0gJ2NvcHlSZWNvcmQnIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpICYmXG4gICAgZW50cmllcyhsaW1pdHMpLmV2ZXJ5KFxuICAgICAgKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgcGFzc1N0eWxlT2YodmFsdWUpID09PSAnbnVtYmVyJyB8fFxuICAgICAgICBjaGVjayhmYWxzZSwgWGBWYWx1ZSBvZiBsaW1pdCAke3Eoa2V5KX0gYnV0IGJlIGEgbnVtYmVyOiAke3EodmFsdWUpfWApLFxuICAgIClcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHBhcmFtIHtudW1iZXJ9IGRlY2ltYWxEaWdpdHNMaW1pdFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG5jb25zdCBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdCA9IChzcGVjaW1lbiwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVjaykgPT4ge1xuICBpZiAoXG4gICAgTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKE51bWJlcihzcGVjaW1lbikpKSkgKyAxIDw9XG4gICAgZGVjaW1hbERpZ2l0c0xpbWl0XG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBjaGVjayhcbiAgICBmYWxzZSxcbiAgICBYYGJpZ2ludCAke3NwZWNpbWVufSBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke2RlY2ltYWxEaWdpdHNMaW1pdH0gZGlnaXRzYCxcbiAgKTtcbn07XG5cbi8qKlxuICogQHJldHVybnMge1BhdHRlcm5LaXR9XG4gKi9cbmNvbnN0IG1ha2VQYXR0ZXJuS2l0ID0gKCkgPT4ge1xuICAvKipcbiAqIElmIHRoaXMgaXMgYSByZWNvZ25pemVkIG1hdGNoIHRhZywgcmV0dXJuIHRoZSBNYXRjaEhlbHBlci5cbiAqIE90aGVyd2lzZSByZXN1bHQgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEByZXR1cm5zIHtNYXRjaEhlbHBlciB8IHVuZGVmaW5lZH1cbiAqL1xuICBjb25zdCBtYXliZU1hdGNoSGVscGVyID0gdGFnID0+XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICBIZWxwZXJzQnlNYXRjaFRhZ1t0YWddO1xuXG4gIC8qKlxuICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIGFic2VuY2UgYnkgcmV0dXJuaW5nIGB1bmRlZmluZWRgLFxuICogZXZlbiB0aG91Z2ggYHVuZGVmaW5lZGAgaXMgYSB2YWxpZCBwYXR0ZXJuLiBUbyBldmFkZSB0aGlzIGNvbmZ1c2lvbixcbiAqIHRvIHJlZ2lzdGVyIGEgcGF5bG9hZCBzaGFwZSB3aXRoIHRoYXQgbWVhbmluZywgdXNlIGBNTS51bmRlZmluZWQoKWAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge1BhdHRlcm4gfCB1bmRlZmluZWR9XG4gKi9cbiAgY29uc3QgbWF5YmVQYXlsb2FkU2hhcGUgPSB0YWcgPT5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIEd1YXJkUGF5bG9hZFNoYXBlc1t0YWddO1xuXG4gIC8qKiBAdHlwZSB7TWFwPEtpbmQsIHVua25vd24+fSAqL1xuICBjb25zdCBzaW5nbGV0b25LaW5kcyA9IG5ldyBNYXAoW1xuICAgIFsnbnVsbCcsIG51bGxdLFxuICAgIFsndW5kZWZpbmVkJywgdW5kZWZpbmVkXSxcbiAgXSk7XG5cbiAgLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxDb3B5VGFnZ2VkLCBLaW5kPn1cbiAqIE9ubHkgZm9yIHRhZ2dlZCByZWNvcmRzIG9mIHJlY29nbml6ZWQga2luZHMgd2hvc2Ugc3RvcmUtbGV2ZWwgaW52YXJpYW50c1xuICogaGF2ZSBhbHJlYWR5IGJlZW4gY2hlY2tlZC5cbiAqL1xuICBjb25zdCB0YWdNZW1vID0gbmV3IFdlYWtNYXAoKTtcblxuICAvKipcbiAqIENoZWNrcyBvbmx5IHJlY29nbml6ZWQgdGFncywgYW5kIG9ubHkgaWYgdGhlIHRhZ2dlZFxuICogcGFzc2VzIHRoZSBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHRhZ2dlZFxuICogQHBhcmFtIHtLaW5kfSB0YWdcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrVGFnZ2VkID0gKHRhZ2dlZCwgdGFnLCBjaGVjaykgPT4ge1xuICAgIGNvbnN0IG1hdGNoSGVscGVyID0gbWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuICAgIGlmIChtYXRjaEhlbHBlcikge1xuICAgICAgLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbiAgICAgIC8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG4gICAgICByZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQodGFnZ2VkLnBheWxvYWQsIGNoZWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGF5bG9hZFNoYXBlID0gbWF5YmVQYXlsb2FkU2hhcGUodGFnKTtcbiAgICAgIGlmIChwYXlsb2FkU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgICByZXR1cm4gY2hlY2tNYXRjaGVzKHRhZ2dlZC5wYXlsb2FkLCBwYXlsb2FkU2hhcGUsIGNoZWNrLCB0YWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29weVNldCh0YWdnZWQsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgIHJldHVybiBjaGVja0NvcHlCYWcodGFnZ2VkLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICByZXR1cm4gY2hlY2tDb3B5TWFwKHRhZ2dlZCwgY2hlY2spO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgWGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX06ICR7dGFnZ2VkfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICogUmV0dXJucyBvbmx5IGEgcmVjb2duaXplZCBraW5kLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW4gcGFzc2VzIHRoZVxuICogaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqIE90aGVyd2lzZSwgYGNoZWNrKGZhbHNlLCAuLi4pYCBhbmQgcmV0dXJucyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge0tpbmQgfCB1bmRlZmluZWR9XG4gKi9cbiAgY29uc3Qga2luZE9mID0gKHNwZWNpbWVuLCBjaGVjayA9IGlkZW50Q2hlY2tlcikgPT4ge1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbiAgICBpZiAocGFzc1N0eWxlICE9PSAndGFnZ2VkJykge1xuICAgICAgcmV0dXJuIHBhc3NTdHlsZTtcbiAgICB9XG4gICAgLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgc3BlY2ltZW4gaXMgd2VsbCBmb3JtZWQqL1xuICAgIC8qIGFzIGEgdGFnZ2VkIHJlY29yZCwgd2hpY2ggaXMgZGVmaW5lZCBhdCB0aGUgbWFyc2hhbCBsZXZlbCBvZiBhYnN0cmFjdGlvbiwqL1xuICAgIC8qIHNpbmNlIGBwYXNzU3R5bGVPZmAgY2hlY2tzIHRob3NlIGludmFyaWFudHMuKi9cbiAgICBpZiAodGFnTWVtby5oYXMoc3BlY2ltZW4pKSB7XG4gICAgICByZXR1cm4gdGFnTWVtby5nZXQoc3BlY2ltZW4pO1xuICAgIH1cbiAgICBjb25zdCB0YWcgPSBnZXRUYWcoc3BlY2ltZW4pO1xuICAgIGlmIChjaGVja1RhZ2dlZChzcGVjaW1lbiwgdGFnLCBjaGVjaykpIHtcbiAgICAgIHRhZ01lbW8uc2V0KHNwZWNpbWVuLCB0YWcpO1xuICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG4gICAgaWYgKGNoZWNrICE9PSBpZGVudENoZWNrZXIpIHtcbiAgICAgIGNoZWNrKGZhbHNlLCBYYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfWApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuICBoYXJkZW4oa2luZE9mKTtcblxuICAvKipcbiAqIENoZWNrcyBvbmx5IHJlY29nbml6ZWQga2luZHMsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lblxuICogcGFzc2VzIHRoZSBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtLaW5kfSBraW5kXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja0tpbmQgPSAoc3BlY2ltZW4sIGtpbmQsIGNoZWNrKSA9PiB7XG4gICAgLyogY2hlY2sgbnVsbCBhbmQgdW5kZWZpbmVkIGFzIEtleXMqL1xuICAgIGlmIChzaW5nbGV0b25LaW5kcy5oYXMoa2luZCkpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHNpbmdsZXRvbktpbmRzLmdldChraW5kKSwgY2hlY2spO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWxLaW5kID0ga2luZE9mKHNwZWNpbWVuLCBjaGVjayk7XG4gICAgaWYgKGtpbmQgPT09IHJlYWxLaW5kKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNoZWNrICE9PSBpZGVudENoZWNrZXIpIHtcbiAgICAgIC8qIGBraW5kYCBhbmQgYHJlYWxLaW5kYCBjYW4gYmUgZW1iZWRkZWQgd2l0aG91dCBxdW90ZXMqL1xuICAgICAgLyogYmVjYXVzZSB0aGV5IGFyZSBkcmF3biBmcm9tIHRoZSBlbnVtZXJhdGVkIGNvbGxlY3Rpb24gb2Yga25vd24gS2luZHMuKi9cbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7YihyZWFsS2luZCl9ICR7c3BlY2ltZW59IC0gTXVzdCBiZSBhICR7YihraW5kKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tpbmR9IGtpbmRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGlzS2luZCA9IChzcGVjaW1lbiwga2luZCkgPT4gY2hlY2tLaW5kKHNwZWNpbWVuLCBraW5kLCBpZGVudENoZWNrZXIpO1xuXG4gIC8qKlxuICogQ2hlY2tzIGlmIGEgcGF0dGVybiBtYXRjaGVzIG9ubHkgYHVuZGVmaW5lZGAuXG4gKlxuICogQHBhcmFtIHthbnl9IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGlzVW5kZWZpbmVkUGF0dCA9IHBhdHQgPT5cbiAgICBwYXR0ID09PSB1bmRlZmluZWQgfHxcbiAgICAoaXNLaW5kKHBhdHQsICdtYXRjaDpraW5kJykgJiYgcGF0dC5wYXlsb2FkID09PSAndW5kZWZpbmVkJyk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2V5fSBrZXlBc1BhdHRlcm5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrQXNLZXlQYXR0ID0gKHNwZWNpbWVuLCBrZXlBc1BhdHRlcm4sIGNoZWNrKSA9PiB7XG4gICAgaWYgKGlzS2V5KHNwZWNpbWVuKSAmJiBrZXlFUShzcGVjaW1lbiwga2V5QXNQYXR0ZXJuKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICAvKiBXaGVuIHRoZSBtaXNtYXRjaCBvY2N1cnMgYWdhaW5zdCBhIGtleSB1c2VkIGFzIGEgcGF0dGVybiwqL1xuICAgICAgLyogdGhlIHBhdHRlcm4gc2hvdWxkIHN0aWxsIGJlIHJlZGFjdGVkLiovXG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmU6ICR7a2V5QXNQYXR0ZXJufWApXG4gICAgKTtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBpc1BhdHRlcm4gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKiBAdHlwZSB7Q2hlY2tQYXR0ZXJufSAqL1xuICBjb25zdCBjaGVja1BhdHRlcm4gPSAocGF0dCwgY2hlY2spID0+IHtcbiAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgIC8qIEFsbCBrZXlzIGFyZSBwYXR0ZXJucy4gRm9yIHRoZXNlLCB0aGUga2V5TWVtbyB3aWxsIGRvLiovXG4gICAgICAvKiBBbGwgcHJpbWl0aXZlcyB0aGF0IGFyZSBwYXR0ZXJucyBhcmUgYWxzbyBrZXlzLCB3aGljaCB0aGlzKi9cbiAgICAgIC8qIGFsc28gdGFrZXMgY2FyZSBvZiB3aXRob3V0IG1lbW8uIFRoZSByZXN0IG9mIG91ciBjaGVja2luZyBsb2dpYyovXG4gICAgICAvKiBpcyBvbmx5IGNvbmNlcm5lZCB3aXRoIG5vbi1rZXkgcGF0dGVybnMuKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocGF0dGVybk1lbW8uaGFzKHBhdHQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICBjb25zdCByZXN1bHQgPSBjaGVja1BhdHRlcm5JbnRlcm5hbChwYXR0LCBjaGVjayk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcGF0dGVybk1lbW8uYWRkKHBhdHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dCAtIGtub3duIG5vdCB0byBiZSBhIGtleSwgYW5kIHRoZXJlZm9yZSBrbm93blxuICogbm90IHRvIGJlIHByaW1pdGl2ZS5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGNoZWNrUGF0dGVybkludGVybmFsID0gKHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgLyogUHVycG9zZWx5IHBhcmFsbGVscyBjaGVja0tleS4gVE9ETyByZXVzZSBtb3JlIGxvZ2ljIGJldHdlZW4gdGhlbS4qL1xuICAgIC8qIE1vc3Qgb2YgdGhlIHRleHQgb2YgdGhlIHN3aXRjaCBiZWxvdyBub3QgZGVhbGluZyB3aXRoIG1hdGNoZXJzIGlzKi9cbiAgICAvKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbiAgICBjb25zdCBjaGVja0l0ID0gY2hpbGQgPT4gY2hlY2tQYXR0ZXJuKGNoaWxkLCBjaGVjayk7XG5cbiAgICBjb25zdCBraW5kID0ga2luZE9mKHBhdHQsIGNoZWNrKTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIC8qIEEgY29weVJlY29yZCBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbiAgICAgICAgLyogcGF0dGVybnMqL1xuICAgICAgICByZXR1cm4gdmFsdWVzKHBhdHQpLmV2ZXJ5KGNoZWNrSXQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICAvKiBBIGNvcHlBcnJheSBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbiAgICAgICAgLyogcGF0dGVybnMqL1xuICAgICAgICByZXR1cm4gcGF0dC5ldmVyeShjaGVja0l0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgIC8qIEEgY29weU1hcCdzIGtleXMgYXJlIGtleXMgYW5kIHRoZXJlZm9yZSBhbHJlYWR5IGtub3duIHRvIGJlKi9cbiAgICAgICAgLyogcGF0dGVybnMuKi9cbiAgICAgICAgLyogQSBjb3B5TWFwIGlzIGEgcGF0dGVybiBpZiBpdHMgdmFsdWVzIGFyZSBwYXR0ZXJucy4qL1xuICAgICAgICByZXR1cm4gY2hlY2tQYXR0ZXJuKHBhdHQudmFsdWVzLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGlzUGF0dGVybiA9IHBhdHQgPT4gY2hlY2tQYXR0ZXJuKHBhdHQsIGlkZW50Q2hlY2tlcik7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuICBjb25zdCBhc3NlcnRQYXR0ZXJuID0gcGF0dCA9PiB7XG4gICAgY2hlY2tQYXR0ZXJuKHBhdHQsIGFzc2VydENoZWNrZXIpO1xuICB9O1xuXG4gIC8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja01hdGNoZXMgPSAoc3BlY2ltZW4sIHBhdHRlcm4sIGNoZWNrLCBsYWJlbCA9IHVuZGVmaW5lZCkgPT5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgIGFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCwgW3NwZWNpbWVuLCBwYXR0ZXJuLCBjaGVja10sIGxhYmVsKTtcblxuICAvKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbCA9IChzcGVjaW1lbiwgcGF0dCwgY2hlY2spID0+IHtcbiAgICAvKiBXb3J0aCBiZWluZyBhIGJpdCB2ZXJib3NlIGFuZCByZXBldGl0aXZlIGluIG9yZGVyIHRvIG9wdGltaXplKi9cbiAgICBjb25zdCBwYXR0ZXJuS2luZCA9IGtpbmRPZihwYXR0LCBjaGVjayk7XG4gICAgY29uc3Qgc3BlY2ltZW5LaW5kID0ga2luZE9mKHNwZWNpbWVuKTsgLyogbWF5IGJlIHVuZGVmaW5lZCovXG4gICAgc3dpdGNoIChwYXR0ZXJuS2luZCkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6IHtcbiAgICAgICAgcmV0dXJuIEZhaWxgcGF0dGVybiBleHBlY3RlZDogJHtwYXR0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICByZXR1cm4gRmFpbGBwcm9taXNlcyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIHJldHVybiBGYWlsYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgY2FzZSAnYnl0ZUFycmF5JzpcbiAgICAgIGNhc2UgJ2NvcHlTZXQnOlxuICAgICAgY2FzZSAnY29weUJhZyc6XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIC8qIFRoZXNlIGtpbmRzIGFyZSBuZWNlc3NhcmlseSBrZXlzKi9cbiAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgICAgIC8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuICAgICAgICAgIC8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbiAgICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BlY2ltZW5LaW5kICE9PSAnY29weUFycmF5Jykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5QXJyYXkgdG8gbWF0Y2ggYSBjb3B5QXJyYXkgcGF0dGVybjogJHtxcChcbiAgICAgICAgICAgICAgcGF0dCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBwYXR0O1xuICAgICAgICBpZiAoc3BlY2ltZW4ubGVuZ3RoICE9PSBsZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgQXJyYXkgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGFzIGxvbmcgYXMgY29weUFycmF5IHBhdHRlcm46ICR7cXAoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0dC5ldmVyeSgocCwgaSkgPT4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuW2ldLCBwLCBjaGVjaywgaSkpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAgICAgLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4gICAgICAgICAgLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xuICAgICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5UmVjb3JkJykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5UmVjb3JkIHRvIG1hdGNoIGEgY29weVJlY29yZCBwYXR0ZXJuOiAke3FwKFxuICAgICAgICAgICAgICBwYXR0LFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLyogVE9ETyBEZXRlY3QgYW5kIGFjY3VtdWxhdGUgZGlmZmVyZW5jZSBpbiBvbmUgcGFzcy4qL1xuICAgICAgICAvKiBSYXRoZXIgdGhhbiB1c2luZyB0d28gY2FsbHMgdG8gYGxpc3REaWZmZXJlbmNlYCB0byBkZXRlY3QgYW5kKi9cbiAgICAgICAgLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbiAgICAgICAgLyogaW4gc29ydGVkIG9yZGVyLCB3ZSBzaG91bGQgaW5zdGVhZCB1c2UgYW4gYWxnb3JpdGhtIGxpa2UqL1xuICAgICAgICAvKiBgaXRlckRpc2pvaW50VW5pb25gIGZyb20gbWVyZ2Utc29ydC1vcGVyYXRvcnMuanMqL1xuICAgICAgICBjb25zdCBzcGVjaW1lbk5hbWVzID0gcmVjb3JkTmFtZXMoc3BlY2ltZW4pO1xuICAgICAgICBjb25zdCBwYXR0TmFtZXMgPSByZWNvcmROYW1lcyhwYXR0KTtcbiAgICAgICAgY29uc3QgbWlzc2luZyA9IGxpc3REaWZmZXJlbmNlKHBhdHROYW1lcywgc3BlY2ltZW5OYW1lcyk7XG4gICAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBoYXZlIG1pc3NpbmcgcHJvcGVydGllcyAke3EobWlzc2luZyl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVuZXhwZWN0ZWQgPSBsaXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLCBwYXR0TmFtZXMpO1xuICAgICAgICBpZiAodW5leHBlY3RlZC5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3Qgbm90IGhhdmUgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3EoXG4gICAgICAgICAgICAgIHVuZXhwZWN0ZWQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzcGVjaW1lblZhbHVlcyA9IHJlY29yZFZhbHVlcyhzcGVjaW1lbiwgc3BlY2ltZW5OYW1lcyk7XG4gICAgICAgIGNvbnN0IHBhdHRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMocGF0dCwgcGF0dE5hbWVzKTtcbiAgICAgICAgcmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsIGkpID0+XG4gICAgICAgICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLCBwYXR0VmFsdWVzW2ldLCBjaGVjaywgbGFiZWwpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAgICAgLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4gICAgICAgICAgLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xuICAgICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5TWFwJykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5TWFwIHRvIG1hdGNoIGEgY29weU1hcCBwYXR0ZXJuOiAke3FwKFxuICAgICAgICAgICAgICBwYXR0LFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLyogQ29tcGFyZSBrZXlzIGFzIGNvcHlTZXRzKi9cbiAgICAgICAgY29uc3QgcGF0dEtleVNldCA9IGNvcHlNYXBLZXlTZXQocGF0dCk7XG4gICAgICAgIGNvbnN0IHNwZWNpbWVuS2V5U2V0ID0gY29weU1hcEtleVNldChzcGVjaW1lbik7XG4gICAgICAgIGlmICghY2hlY2tNYXRjaGVzKHNwZWNpbWVuS2V5U2V0LCBwYXR0S2V5U2V0LCBjaGVjaykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLyogQ29tcGFyZSB2YWx1ZXMgYXMgY29weUFycmF5cyBhZnRlciBhcHBseWluZyBhIHNoYXJlZCB0b3RhbCBvcmRlci4qL1xuICAgICAgICAvKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBhbnRpUmFua09yZGVyIHNvcnRpbmcgb2YgZWFjaCBtYXAncyovXG4gICAgICAgIC8qIGVudHJpZXMgaXMgYSBwcmVvcmRlciB0aGF0IGFkbWl0cyB0aWVzLiovXG4gICAgICAgIGNvbnN0IHBhdHRWYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgc3BlY2ltZW5WYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZW50cnlQYWlycyA9IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKFxuICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgc3BlY2ltZW4sXG4gICAgICAgICAgZ2V0Q29weU1hcEVudHJ5QXJyYXksXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IFtfa2V5LCBwYXR0VmFsdWUsIHNwZWNpbWVuVmFsdWVdIG9mIGVudHJ5UGFpcnMpIHtcbiAgICAgICAgICBwYXR0VmFsdWVzLnB1c2gocGF0dFZhbHVlKTtcbiAgICAgICAgICBzcGVjaW1lblZhbHVlcy5wdXNoKHNwZWNpbWVuVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGVja01hdGNoZXMoaGFyZGVuKHNwZWNpbWVuVmFsdWVzKSwgaGFyZGVuKHBhdHRWYWx1ZXMpLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IG1hdGNoSGVscGVyID0gbWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG4gICAgICAgIGlmIChtYXRjaEhlbHBlcikge1xuICAgICAgICAgIHJldHVybiBtYXRjaEhlbHBlci5jaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQucGF5bG9hZCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgbWF0Y2hlcyA9IChzcGVjaW1lbiwgcGF0dCkgPT5cbiAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGlkZW50Q2hlY2tlcik7XG5cbiAgLyoqXG4gKiBSZXR1cm5pbmcgbm9ybWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MuIE1hdGNoIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5XG4gKiB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKi9cbiAgY29uc3QgbXVzdE1hdGNoID0gKHNwZWNpbWVuLCBwYXR0LCBsYWJlbCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGxldCBpbm5lckVycm9yO1xuICAgIHRyeSB7XG4gICAgICBpZiAoY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBpZGVudENoZWNrZXIsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICBpbm5lckVycm9yID0gZXI7XG4gICAgfVxuICAgIC8qIHNob3VsZCBvbmx5IHRocm93Ki9cbiAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGFzc2VydENoZWNrZXIsIGxhYmVsKTtcbiAgICBjb25zdCBvdXRlckVycm9yID0gbWFrZUVycm9yKFxuICAgICAgWGBpbnRlcm5hbDogJHtsYWJlbH06IGluY29uc2lzdGVudCBwYXR0ZXJuIG1hdGNoOiAke3FwKHBhdHQpfWAsXG4gICAgKTtcbiAgICBpZiAoaW5uZXJFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbm5vdGF0ZUVycm9yKG91dGVyRXJyb3IsIFhgY2F1c2VkIGJ5ICR7aW5uZXJFcnJvcn1gKTtcbiAgICB9XG4gICAgdGhyb3cgb3V0ZXJFcnJvcjtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBnZXRSYW5rQ292ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKiBAdHlwZSB7R2V0UmFua0NvdmVyfSAqL1xuICBjb25zdCBnZXRSYW5rQ292ZXIgPSAocGF0dCwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVQYXNzYWJsZShwYXR0KTtcbiAgICAgIGlmIChlbmNvZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtlbmNvZGVkLCBgJHtlbmNvZGVkfX5gXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGF0dCk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuICAgICAgICAvKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4gICAgICAgIC8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuICAgICAgICAvKiovXG4gICAgICAgIC8qIGNvbnN0IHJhbmtDb3ZlcnMgPSBwYXR0Lm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpOyovXG4gICAgICAgIC8qIHJldHVybiBoYXJkZW4oWyovXG4gICAgICAgIC8qIHJhbmtDb3ZlcnMubWFwKChbbGVmdCwgX3JpZ2h0XSkgPT4gbGVmdCksKi9cbiAgICAgICAgLyogcmFua0NvdmVycy5tYXAoKFtfbGVmdCwgcmlnaHRdKSA9PiByaWdodCksKi9cbiAgICAgICAgLyogXSk7Ki9cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4gICAgICAgIC8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbiAgICAgICAgLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuICAgICAgICAvKiovXG4gICAgICAgIC8qIGNvbnN0IHBhdHRLZXlzID0gb3duS2V5cyhwYXR0KTsqL1xuICAgICAgICAvKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuICAgICAgICAvKiBjb25zdCBbbGVmdEVudHJpZXNMaW1pdCwgcmlnaHRFbnRyaWVzTGltaXRdID0qL1xuICAgICAgICAvKiBnZXRSYW5rQ292ZXIocGF0dEVudHJpZXMpOyovXG4gICAgICAgIC8qIHJldHVybiBoYXJkZW4oWyovXG4gICAgICAgIC8qIGZyb21VbmlxdWVFbnRyaWVzKGxlZnRFbnRyaWVzTGltaXQpLCovXG4gICAgICAgIC8qIGZyb21VbmlxdWVFbnRyaWVzKHJpZ2h0RW50cmllc0xpbWl0KSwqL1xuICAgICAgICAvKiBdKTsqL1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHBhdHQpO1xuICAgICAgICBjb25zdCBtYXRjaEhlbHBlciA9IG1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbiAgICAgICAgaWYgKG1hdGNoSGVscGVyKSB7XG4gICAgICAgICAgLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbiAgICAgICAgICAvKiB0aGUgdmFyaW91cyBwYXR0ZXJuTm9kZXMqL1xuICAgICAgICAgIHJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLCBlbmNvZGVQYXNzYWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgICAgLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuICAgICAgICAgICAgLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuICAgICAgICAgICAgLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuICAgICAgICAgICAgLyoqL1xuICAgICAgICAgICAgLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4gICAgICAgICAgICAvKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbiAgICAgICAgICAgIC8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbiAgICAgICAgICAgIC8qIGBgYGpzKi9cbiAgICAgICAgICAgIC8qIHBhdHQucGF5bG9hZC5sZW5ndGggPT09IDEgfHwqL1xuICAgICAgICAgICAgLyogRmFpbGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YDsqL1xuICAgICAgICAgICAgLyogYGBgKi9cbiAgICAgICAgICAgIC8qKi9cbiAgICAgICAgICAgIC8qIGNvbnN0IFtsZWZ0RWxlbWVudExpbWl0LCByaWdodEVsZW1lbnRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbiAgICAgICAgICAgIC8qIHBhdHQucGF5bG9hZFswXSwqL1xuICAgICAgICAgICAgLyogKTsqL1xuICAgICAgICAgICAgLyogcmV0dXJuIGhhcmRlbihbKi9cbiAgICAgICAgICAgIC8qIG1ha2VDb3B5U2V0KFtsZWZ0RWxlbWVudExpbWl0XSksKi9cbiAgICAgICAgICAgIC8qIG1ha2VDb3B5U2V0KFtyaWdodEVsZW1lbnRMaW1pdF0pLCovXG4gICAgICAgICAgICAvKiBdKTsqL1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgICAvKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4gICAgICAgICAgICAvKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4gICAgICAgICAgICAvKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlNYXBzLiovXG4gICAgICAgICAgICAvKiovXG4gICAgICAgICAgICAvKiAvLyBBIG1hdGNoaW5nIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMsIG9yIGF0IG1vc3Qgb25lKi9cbiAgICAgICAgICAgIC8qIC8vIG5vbi1rZXkga2V5IHBhdHRlcm4uIFRodXMgd2UgY2FuIGFzc3VtZSB0aGF0IHZhbHVlIHBvc2l0aW9ucyovXG4gICAgICAgICAgICAvKiAvLyBtYXRjaCAxLXRvLTEuKi9cbiAgICAgICAgICAgIC8qIC8vKi9cbiAgICAgICAgICAgIC8qIC8vIFRPRE8gSSBtYXkgYmUgb3Zlcmxvb2tpbmcgdGhhdCB0aGUgbGVzcyBwcmVjaXNlIHJhbmtPcmRlciovXG4gICAgICAgICAgICAvKiAvLyBlcXVpdmFsZW5jZSBjbGFzcyBtYXkgY2F1c2UgdmFsdWVzIHRvIGJlIG91dCBvZiBvcmRlciwqL1xuICAgICAgICAgICAgLyogLy8gbWFraW5nIHRoaXMgcmFua0NvdmVyIG5vdCBhY3R1YWxseSBjb3Zlci4gSW4gdGhhdCBjYXNlLCBmb3IqL1xuICAgICAgICAgICAgLyogLy8gYWxsIHRoZSB2YWx1ZXMgZm9yIGtleXMgYXQgdGhlIHNhbWUgcmFuaywgd2Ugc2hvdWxkIHVuaW9uIHRoZWlyKi9cbiAgICAgICAgICAgIC8qIC8vIHJhbmsgY292ZXJzLiBUT0RPIFBPU1NJQkxFIFNJTEVOVCBDT1JSRUNUTkVTUyBCVUcqL1xuICAgICAgICAgICAgLyogLy8qL1xuICAgICAgICAgICAgLyogLy8gSWYgdGhpcyBpcyBhIGJ1ZywgaXQgcHJvYmFibHkgYWZmZWN0cyB0aGUgZ2V0UmFua0NvdmVyKi9cbiAgICAgICAgICAgIC8qIC8vIGNhc2VzIG9mIG1hdGNoTFRFSGVscGVyIGFuZCBtYXRjaEdURUhlbHBlciBvbiBjb3B5TWFwIGFzKi9cbiAgICAgICAgICAgIC8qIC8vIHdlbGwuIFNlZSBtYWtlQ29weU1hcCBmb3IgYW4gaWRlYSBvbiBmaXhpbmcqL1xuICAgICAgICAgICAgLyogLy8gdGhpcyBidWcuKi9cbiAgICAgICAgICAgIC8qIGNvbnN0IFtsZWZ0UGF5bG9hZExpbWl0LCByaWdodFBheWxvYWRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbiAgICAgICAgICAgIC8qIHBhdHQucGF5bG9hZCwqL1xuICAgICAgICAgICAgLyogZW5jb2RlUGFzc2FibGUsKi9cbiAgICAgICAgICAgIC8qICk7Ki9cbiAgICAgICAgICAgIC8qIHJldHVybiBoYXJkZW4oWyovXG4gICAgICAgICAgICAvKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgbGVmdFBheWxvYWRMaW1pdCksKi9cbiAgICAgICAgICAgIC8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCByaWdodFBheWxvYWRMaW1pdCksKi9cbiAgICAgICAgICAgIC8qIF0pOyovXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYnJlYWs7IC8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7IC8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYnJlYWs7IC8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGFycmF5XG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxQcmVmaXhdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuID0gKGFycmF5LCBwYXR0LCBjaGVjaywgbGFiZWxQcmVmaXggPSAnJykgPT4ge1xuICAgIGlmIChpc0tpbmQocGF0dCwgJ21hdGNoOmFueScpKSB7XG4gICAgICAvKiBpZiB0aGUgcGF0dGVybiBpcyBNLmFueSgpLCB3ZSBrbm93IGl0cyB0cnVlKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXkuZXZlcnkoKGVsLCBpKSA9PlxuICAgICAgY2hlY2tNYXRjaGVzKGVsLCBwYXR0LCBjaGVjaywgYCR7bGFiZWxQcmVmaXh9WyR7aX1dYCksXG4gICAgKTtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQW55SGVscGVyID0gRmFyKCdtYXRjaDphbnkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKF9zcGVjaW1lbiwgX21hdGNoZXJQYXlsb2FkLCBfY2hlY2spID0+IHRydWUsXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKG1hdGNoZXJQYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIG1hdGNoZXJQYXlsb2FkID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYG1hdGNoOmFueSBwYXlsb2FkOiAke21hdGNoZXJQYXlsb2FkfSAtIE11c3QgYmUgdW5kZWZpbmVkYCksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+IFsnJywgJ3snXSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hBbmRIZWxwZXIgPSBGYXIoJ21hdGNoOmFuZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHBhdHRzLCBjaGVjaykgPT4ge1xuICAgICAgcmV0dXJuIHBhdHRzLmV2ZXJ5KHBhdHQgPT4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBjaGVjaykpO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKGFsbGVnZWRQYXR0cywgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IGNoZWNrSXQgPSBwYXR0ID0+IGNoZWNrUGF0dGVybihwYXR0LCBjaGVjayk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAocGFzc1N0eWxlT2YoYWxsZWdlZFBhdHRzKSA9PT0gJ2NvcHlBcnJheScgfHxcbiAgICAgICAgICBjaGVjayhmYWxzZSwgWGBOZWVkcyBhcnJheSBvZiBzdWItcGF0dGVybnM6ICR7cXAoYWxsZWdlZFBhdHRzKX1gKSkgJiZcbiAgICAgICAgYWxsZWdlZFBhdHRzLmV2ZXJ5KGNoZWNrSXQpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChwYXR0cywgZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzKFxuICAgICAgICBjb21wYXJlUmFuayxcbiAgICAgICAgcGF0dHMubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSksXG4gICAgICApLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaE9ySGVscGVyID0gRmFyKCdtYXRjaDpvciBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHBhdHRzLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHBhdHRzO1xuICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgWGAke3NwZWNpbWVufSAtIG5vIHBhdHRlcm4gZGlzanVuY3RzIHRvIG1hdGNoOiAke3FwKHBhdHRzKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLyogU3BlY2lhbCBjYXNlIGRpc2p1bmN0aW9ucyByZXByZXNlbnRpbmcgYSBzaW5nbGUgb3B0aW9uYWwgcGF0dGVybiBmb3IqL1xuICAgICAgLyogYmV0dGVyIGVycm9yIG1lc3NhZ2VzLiovXG4gICAgICBjb25zdCBiaW5hcnlVbmRlZlBhdHRJZHggPVxuICAgICAgICBwYXR0cy5sZW5ndGggPT09IDJcbiAgICAgICAgICA/IHBhdHRzLmZpbmRJbmRleChwYXR0ID0+IGlzVW5kZWZpbmVkUGF0dChwYXR0KSlcbiAgICAgICAgICA6IC0xO1xuICAgICAgaWYgKGJpbmFyeVVuZGVmUGF0dElkeCAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBzcGVjaW1lbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0c1sxIC0gYmluYXJ5VW5kZWZQYXR0SWR4XSwgY2hlY2spXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGF0dHMuc29tZShwYXR0ID0+IG1hdGNoZXMoc3BlY2ltZW4sIHBhdHQpKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgbWF0Y2ggb25lIG9mICR7cXAocGF0dHMpfWApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogbWF0Y2hBbmRIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbiAgICBnZXRSYW5rQ292ZXI6IChwYXR0cywgZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICB1bmlvblJhbmtDb3ZlcnMoXG4gICAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgICBwYXR0cy5tYXAocCA9PiBnZXRSYW5rQ292ZXIocCwgZW5jb2RlUGFzc2FibGUpKSxcbiAgICAgICksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoTm90SGVscGVyID0gRmFyKCdtYXRjaDpub3QgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBwYXR0LCBjaGVjaykgPT4ge1xuICAgICAgaWYgKG1hdGNoZXMoc3BlY2ltZW4sIHBhdHQpKSB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBmYWlsIG5lZ2F0ZWQgcGF0dGVybjogJHtxcChwYXR0KX1gLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja1BhdHRlcm4sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfcGF0dCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJycsICd7J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU2NhbGFySGVscGVyID0gRmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tTY2FsYXJLZXkoc3BlY2ltZW4sIGNoZWNrKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWydhJywgJ3p+J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoS2V5SGVscGVyID0gRmFyKCdtYXRjaDprZXkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tLZXkoc3BlY2ltZW4sIGNoZWNrKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWydhJywgJ3p+J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoUGF0dGVybkhlbHBlciA9IEZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja1BhdHRlcm4oc3BlY2ltZW4sIGNoZWNrKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWydhJywgJ3p+J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoS2luZEhlbHBlciA9IEZhcignbWF0Y2g6a2luZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiBjaGVja0tpbmQsXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKGFsbGVnZWRLZXlLaW5kLCBjaGVjaykgPT5cbiAgICAgIHR5cGVvZiBhbGxlZ2VkS2V5S2luZCA9PT0gJ3N0cmluZycgfHxcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBtYXRjaDpraW5kOiBwYXlsb2FkOiAke2FsbGVnZWRLZXlLaW5kfSAtIEEga2luZCBuYW1lIG11c3QgYmUgYSBzdHJpbmdgLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKGtpbmQsIF9lbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgICAgbGV0IHN0eWxlO1xuICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgJ2NvcHlTZXQnOlxuICAgICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAgIHN0eWxlID0gJ3RhZ2dlZCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHN0eWxlID0ga2luZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHN0eWxlKTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFRhZ2dlZEhlbHBlciA9IEZhcignbWF0Y2g6dGFnZ2VkIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW3RhZ1BhdHQsIHBheWxvYWRQYXR0XSwgY2hlY2spID0+IHtcbiAgICAgIGlmIChwYXNzU3R5bGVPZihzcGVjaW1lbikgIT09ICd0YWdnZWQnKSB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYEV4cGVjdGVkIHRhZ2dlZCBvYmplY3QsIG5vdCAke3EoXG4gICAgICAgICAgICBwYXNzU3R5bGVPZihzcGVjaW1lbiksXG4gICAgICAgICAgKX06ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrTWF0Y2hlcyhnZXRUYWcoc3BlY2ltZW4pLCB0YWdQYXR0LCBjaGVjaywgJ3RhZycpICYmXG4gICAgICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lbi5wYXlsb2FkLCBwYXlsb2FkUGF0dCwgY2hlY2ssICdwYXlsb2FkJylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja01hdGNoZXMoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDp0YWdnZWQgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX2tpbmQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEJpZ2ludEhlbHBlciA9IEZhcignbWF0Y2g6YmlnaW50IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGRlY2ltYWxEaWdpdHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2JpZ2ludCcsIGNoZWNrKSAmJlxuICAgICAgICBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbiwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVjaylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtdKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpiaWdpbnQgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ2JpZ2ludCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaE5hdEhlbHBlciA9IEZhcignbWF0Y2g6bmF0IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGRlY2ltYWxEaWdpdHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2JpZ2ludCcsIGNoZWNrKSAmJlxuICAgICAgICBjaGVjayhcbiAgICAgICAgICAvKiogQHR5cGUge2JpZ2ludH0gKi8gKHNwZWNpbWVuKSA+PSAwbixcbiAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBub24tbmVnYXRpdmVgLFxuICAgICAgICApICYmXG4gICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOm5hdCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICAvKiBUT0RPIENvdWxkIGJlIG1vcmUgcHJlY2lzZSovXG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU3RyaW5nSGVscGVyID0gRmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgc3RyaW5nTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICAvKiBwcmV0dGllci1pZ25vcmUqL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnc3RyaW5nJywgY2hlY2spICYmXG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xuICAgICAgICAgICgvKiogQHR5cGUge3N0cmluZ30gKi8gKHNwZWNpbWVuKS5sZW5ndGggPD0gc3RyaW5nTGVuZ3RoTGltaXQgfHxcbiAgICAgICAgICBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGBzdHJpbmcgJHtzcGVjaW1lbn0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzdHJpbmdMZW5ndGhMaW1pdH1gLFxuICAgICAgICAgICkpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6c3RyaW5nIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdzdHJpbmcnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTeW1ib2xIZWxwZXIgPSBGYXIoJ21hdGNoOnN5bWJvbCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBzeW1ib2xOYW1lTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICBpZiAoIWNoZWNrS2luZChzcGVjaW1lbiwgJ3N5bWJvbCcsIGNoZWNrKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzeW1ib2xOYW1lID0gbmFtZUZvclBhc3NhYmxlU3ltYm9sKHNwZWNpbWVuKTtcblxuICAgICAgaWYgKHR5cGVvZiBzeW1ib2xOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQYXNzYWJsZSBzeW1ib2wgJHtzcGVjaW1lbn0gbXVzdCBoYXZlIGEgcGFzc2FibGUgbmFtZWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIHN5bWJvbE5hbWUubGVuZ3RoIDw9IHN5bWJvbE5hbWVMZW5ndGhMaW1pdCxcbiAgICAgICAgWGBTeW1ib2wgbmFtZSAke3EoXG4gICAgICAgICAgc3ltYm9sTmFtZSxcbiAgICAgICAgKX0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtdKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpzeW1ib2wgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ3N5bWJvbCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFJlbW90YWJsZUhlbHBlciA9IEZhcignbWF0Y2g6cmVtb3RhYmxlIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmVtb3RhYmxlRGVzYywgY2hlY2spID0+IHtcbiAgICAgIGlmIChpc0tpbmQoc3BlY2ltZW4sICdyZW1vdGFibGUnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVjayA9PT0gaWRlbnRDaGVja2VyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgbGFiZWwgfSA9IHJlbW90YWJsZURlc2M7XG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihzcGVjaW1lbik7XG4gICAgICBjb25zdCBraW5kRGV0YWlscyA9XG4gICAgICAgIHBhc3NTdHlsZSAhPT0gJ3RhZ2dlZCdcbiAgICAgICAgICA/IC8qIFBhc3Mgc3R5bGUgY2FuIGJlIGVtYmVkZGVkIGluIGRldGFpbHMgd2l0aG91dCBxdW90ZXMuKi9cbiAgICAgICAgICAgIGIocGFzc1N0eWxlKVxuICAgICAgICAgIDogLyogVGFnIG11c3QgYmUgcXVvdGVkIGJlY2F1c2UgaXQgaXMgcG90ZW50aWFsbHkgYXR0YWNrZXItY29udHJvbGxlZCovXG4gICAgICAgICAgICAvKiAodW5saWtlIGBraW5kT2ZgLCB0aGlzIGRvZXMgbm90IHJlamVjdCB1bnJlY29nbml6ZWQgdGFncykuKi9cbiAgICAgICAgICAgIHEoZ2V0VGFnKHNwZWNpbWVuKSk7XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAvKiBgbGFiZWxgIGNhbiBiZSBlbWJlZGRlZCB3aXRob3V0IHF1b3RlcyBiZWNhdXNlIGl0IGlzIHByb3ZpZGVkIGJ5Ki9cbiAgICAgICAgLyogbG9jYWwgY29kZSBsaWtlIGBNLnJlbW90YWJsZShcIi4uLlwiKWAuKi9cbiAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSByZW1vdGFibGUgJHtiKGxhYmVsKX0sIG5vdCAke2tpbmREZXRhaWxzfWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKGFsbGVnZWRSZW1vdGFibGVEZXNjLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgYWxsZWdlZFJlbW90YWJsZURlc2MsXG4gICAgICAgIGhhcmRlbih7IGxhYmVsOiBNTS5zdHJpbmcoKSB9KSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpyZW1vdGFibGUgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX3JlbW90YWJsZURlc2MsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdyZW1vdGFibGUnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hMVEVIZWxwZXIgPSBGYXIoJ21hdGNoOmx0ZSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCwgY2hlY2spID0+XG4gICAgICBrZXlMVEUoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogKHJpZ2h0T3BlcmFuZCwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4gICAgICAvKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuICAgICAgLyogdG8gYmUgYGxldGAqL1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG4gICAgICBsZXQgW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF0gPSBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuICAgICAgY29uc3QgbmV3UmlnaHRCb3VuZCA9IGAke2VuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCl9fmA7XG4gICAgICBpZiAobmV3UmlnaHRCb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJpZ2h0Qm91bmQgPSBuZXdSaWdodEJvdW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoTFRIZWxwZXIgPSBGYXIoJ21hdGNoOmx0IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUxUKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPCAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogbWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEdURUhlbHBlciA9IEZhcignbWF0Y2g6Z3RlIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUdURShzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID49ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocmlnaHRPcGVyYW5kLCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbiAgICAgIC8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4gICAgICAvKiB0byBiZSBgbGV0YCovXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbiAgICAgIGxldCBbbGVmdEJvdW5kLCByaWdodEJvdW5kXSA9IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gICAgICBjb25zdCBuZXdMZWZ0Qm91bmQgPSBlbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpO1xuICAgICAgaWYgKG5ld0xlZnRCb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxlZnRCb3VuZCA9IG5ld0xlZnRCb3VuZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbbGVmdEJvdW5kLCByaWdodEJvdW5kXTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEdUSGVscGVyID0gRmFyKCdtYXRjaDpndCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCwgY2hlY2spID0+XG4gICAgICBrZXlHVChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID4gJHtyaWdodE9wZXJhbmR9YCksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tLZXksXG5cbiAgICBnZXRSYW5rQ292ZXI6IG1hdGNoR1RFSGVscGVyLmdldFJhbmtDb3ZlcixcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hSZWNvcmRPZkhlbHBlciA9IEZhcignbWF0Y2g6cmVjb3JkT2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IG51bVByb3BlcnRpZXNMaW1pdCwgcHJvcGVydHlOYW1lTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5UmVjb3JkJywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIG93bktleXMoc3BlY2ltZW4pLmxlbmd0aCA8PSBudW1Qcm9wZXJ0aWVzTGltaXQsXG4gICAgICAgICAgWGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG4gICAgICAgICAgICBudW1Qcm9wZXJ0aWVzTGltaXQsXG4gICAgICAgICAgKX0gcHJvcGVydGllczogJHtzcGVjaW1lbn1gLFxuICAgICAgICApICYmXG4gICAgICAgIGVudHJpZXMoc3BlY2ltZW4pLmV2ZXJ5KFxuICAgICAgICAgIChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3IoXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAga2V5Lmxlbmd0aCA8PSBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCxcbiAgICAgICAgICAgICAgICBYYFByb3BlcnR5IG5hbWUgbXVzdCBub3QgYmUgbG9uZ2VyIHRoYW4gJHtxKFxuICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG4gICAgICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICApICYmXG4gICAgICAgICAgICBjaGVja01hdGNoZXMoXG4gICAgICAgICAgICAgIGhhcmRlbihba2V5LCB2YWx1ZV0pLFxuICAgICAgICAgICAgICBoYXJkZW4oW2tleVBhdHQsIHZhbHVlUGF0dF0pLFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6cmVjb3JkT2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiBfZW50cnlQYXR0ID0+IGdldFBhc3NTdHlsZUNvdmVyKCdjb3B5UmVjb3JkJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQXJyYXlPZkhlbHBlciA9IEZhcignbWF0Y2g6YXJyYXlPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtzdWJQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBhcnJheUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgLyogcHJldHRpZXItaWdub3JlKi9cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlBcnJheScsIGNoZWNrKSAmJlxuICAgICAgICAoLyoqIEB0eXBlIHtBcnJheX0gKi8gKHNwZWNpbWVuKS5sZW5ndGggPD0gYXJyYXlMZW5ndGhMaW1pdCB8fFxuICAgICAgICAgIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YCxcbiAgICAgICAgICApKSAmJlxuICAgICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKHNwZWNpbWVuLCBzdWJQYXR0LCBjaGVjaylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDphcnJheU9mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEJ5dGVBcnJheUhlbHBlciA9IEZhcignbWF0Y2g6Ynl0ZUFycmF5IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGJ5dGVMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIC8qIHByZXR0aWVyLWlnbm9yZSovXG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdieXRlQXJyYXknLCBjaGVjaykgJiZcbiAgICAgICAgKC8qKiBAdHlwZSB7QXJyYXlCdWZmZXJ9ICovIChzcGVjaW1lbikuYnl0ZUxlbmd0aCA8PSBieXRlTGVuZ3RoTGltaXQgfHxcbiAgICAgICAgICBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGBieXRlQXJyYXkgJHtzcGVjaW1lbn0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtieXRlTGVuZ3RoTGltaXR9YCxcbiAgICAgICAgICApKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmJ5dGVBcnJheSBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYnl0ZUFycmF5JyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU2V0T2ZIZWxwZXIgPSBGYXIoJ21hdGNoOnNldE9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2tleVBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IG51bVNldEVsZW1lbnRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5U2V0JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovIChzcGVjaW1lbi5wYXlsb2FkKS5sZW5ndGggPCBudW1TZXRFbGVtZW50c0xpbWl0LFxuICAgICAgICAgIFhgU2V0IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShudW1TZXRFbGVtZW50c0xpbWl0KX0gZWxlbWVudHM6ICR7XG4gICAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLmxlbmd0aFxuICAgICAgICAgIH1gLFxuICAgICAgICApICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4ucGF5bG9hZCwga2V5UGF0dCwgY2hlY2ssICdzZXQgZWxlbWVudHMnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnNldE9mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEJhZ09mSGVscGVyID0gRmFyKCdtYXRjaDpiYWdPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtrZXlQYXR0LCBjb3VudFBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCwgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUJhZycsIGNoZWNrKSAmJlxuICAgICAgICBjaGVjayhcbiAgICAgICAgICAvKiogQHR5cGUge0FycmF5fSAqLyAoc3BlY2ltZW4ucGF5bG9hZCkubGVuZ3RoIDw9XG4gICAgICAgICAgICBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuICAgICAgICAgIFhgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbiAgICAgICAgICAgIG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsXG4gICAgICAgICAgKX0gdW5pcXVlIGVsZW1lbnRzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgc3BlY2ltZW4ucGF5bG9hZC5ldmVyeShcbiAgICAgICAgICAoW2tleSwgY291bnRdLCBpKSA9PlxuICAgICAgICAgICAgY2hlY2tNYXRjaGVzKGtleSwga2V5UGF0dCwgY2hlY2ssIGBiYWcga2V5c1ske2l9XWApICYmXG4gICAgICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3IoXG4gICAgICAgICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuICAgICAgICAgICAgICBbY291bnQsIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2tdLFxuICAgICAgICAgICAgICBgYmFnIGNvdW50c1ske2l9XWAsXG4gICAgICAgICAgICApICYmXG4gICAgICAgICAgICBjaGVja01hdGNoZXMoY291bnQsIGNvdW50UGF0dCwgY2hlY2ssIGBiYWcgY291bnRzWyR7aX1dYCksXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmJhZ09mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKipcbiAqIEBwYXJhbSB7Q29weUFycmF5fSBlbGVtZW50c1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50UGF0dFxuICogQHBhcmFtIHtiaWdpbnR9IGJvdW5kIE11c3QgYmUgPj0gMW5cbiAqIEBwYXJhbSB7Q29weUFycmF5fSBbaW5SZXN1bHRzXVxuICogQHBhcmFtIHtDb3B5QXJyYXl9IFtvdXRSZXN1bHRzXVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBlbGVtZW50c0hhc1NwbGl0ID0gKFxuICAgIGVsZW1lbnRzLFxuICAgIGVsZW1lbnRQYXR0LFxuICAgIGJvdW5kLFxuICAgIGluUmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBvdXRSZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIGNoZWNrID0gaWRlbnRDaGVja2VyLFxuICApID0+IHtcbiAgICBsZXQgY291bnQgPSAwbjtcbiAgICAvKiBTaW5jZSB0aGlzIGZlYXR1cmUgaXMgbW90aXZhdGVkIGJ5IEVSVFAncyB1c2Ugb24qL1xuICAgIC8qIG5vbi1mdW5naWJsZSAoYHNldGAsIGBjb3B5U2V0YCkgYW1vdW50cywqL1xuICAgIC8qIHRoZWlyIGFycmF5cyBzdG9yZSB0aGVpciBlbGVtZW50cyBpbiBkZWNlbmRpbmcgbGV4aWNvZ3JhcGhpYyBvcmRlci4qL1xuICAgIC8qIEJ1dCB0aGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHNvbWUgY2hvaWNlIGFtb3VuZyBlcXVhbGx5IGdvb2QgbWluaW1hbCovXG4gICAgLyogcmVzdWx0cy4gSXQgaXMgbW9yZSBpbnR1aXRpdmUgZm9yIHRoZSBjaG9pY2UgdG8gYmUgdGhlIGZpcnN0IGBib3VuZGAqL1xuICAgIC8qIG1hdGNoaW5nIGVsZW1lbnRzIGluIGFzY2VuZGluZyBsZXhpY2lncmFwaGljIG9yZGVyLCByYXRoZXIgdGhhbiovXG4gICAgLyogZGVjZW5kaW5nLiBUaHVzIHdlIGl0ZXJhdGUgYGVsZW1lbnRzYCBpbiByZXZlcnNlIG9yZGVyLiovXG4gICAgZm9yIChsZXQgaSA9IGVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoY291bnQgPCBib3VuZCkge1xuICAgICAgICBpZiAobWF0Y2hlcyhlbGVtZW50LCBlbGVtZW50UGF0dCkpIHtcbiAgICAgICAgICBjb3VudCArPSAxbjtcbiAgICAgICAgICBpZiAoaW5SZXN1bHRzKSBpblJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzKSB7XG4gICAgICAgICAgb3V0UmVzdWx0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG91dFJlc3VsdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgY291bnQgPj0gYm91bmQsXG4gICAgICBYYEhhcyBvbmx5ICR7cShjb3VudCl9IG1hdGNoZXMsIGJ1dCBuZWVkcyAke3EoYm91bmQpfWAsXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7Q29weUFycmF5PFtLZXksIGJpZ2ludF0+fSBwYWlyc1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50UGF0dFxuICogQHBhcmFtIHtiaWdpbnR9IGJvdW5kIE11c3QgYmUgPj0gMW5cbiAqIEBwYXJhbSB7Q29weUFycmF5PFtLZXksIGJpZ2ludF0+fSBbaW5SZXN1bHRzXVxuICogQHBhcmFtIHtDb3B5QXJyYXk8W0tleSwgYmlnaW50XT59IFtvdXRSZXN1bHRzXVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBwYWlyc0hhc1NwbGl0ID0gKFxuICAgIHBhaXJzLFxuICAgIGVsZW1lbnRQYXR0LFxuICAgIGJvdW5kLFxuICAgIGluUmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBvdXRSZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIGNoZWNrID0gaWRlbnRDaGVja2VyLFxuICApID0+IHtcbiAgICBsZXQgY291bnQgPSAwbjtcbiAgICAvKiBTaW5jZSB0aGlzIGZlYXR1cmUgaXMgbW90aXZhdGVkIGJ5IEVSVFAncyB1c2Ugb24qL1xuICAgIC8qIHNlbWktZnVuZ2libGUgKGBjb3B5QmFnYCkgYW1vdW50cywqL1xuICAgIC8qIHRoZWlyIGFycmF5cyBzdG9yZSB0aGVpciBlbGVtZW50cyBpbiBkZWNlbmRpbmcgbGV4aWNvZ3JhcGhpYyBvcmRlci4qL1xuICAgIC8qIEJ1dCB0aGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHNvbWUgY2hvaWNlIGFtb3VuZyBlcXVhbGx5IGdvb2QgbWluaW1hbCovXG4gICAgLyogcmVzdWx0cy4gSXQgaXMgbW9yZSBpbnR1aXRpdmUgZm9yIHRoZSBjaG9pY2UgdG8gYmUgdGhlIGZpcnN0IGBib3VuZGAqL1xuICAgIC8qIG1hdGNoaW5nIGVsZW1lbnRzIGluIGFzY2VuZGluZyBsZXhpY2lncmFwaGljIG9yZGVyLCByYXRoZXIgdGhhbiovXG4gICAgLyogZGVjZW5kaW5nLiBUaHVzIHdlIGl0ZXJhdGUgYHBhaXJzYCBpbiByZXZlcnNlIG9yZGVyLiovXG4gICAgZm9yIChsZXQgaSA9IHBhaXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICBjb25zdCBbZWxlbWVudCwgbnVtXSA9IHBhaXJzW2ldO1xuICAgICAgY29uc3QgbnVtUmVzdCA9IGJvdW5kIC0gY291bnQ7XG4gICAgICBpZiAobnVtUmVzdCA+PSAxbikge1xuICAgICAgICBpZiAobWF0Y2hlcyhlbGVtZW50LCBlbGVtZW50UGF0dCkpIHtcbiAgICAgICAgICBpZiAobnVtIDw9IG51bVJlc3QpIHtcbiAgICAgICAgICAgIGNvdW50ICs9IG51bTtcbiAgICAgICAgICAgIGlmIChpblJlc3VsdHMpIGluUmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW1dKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbnVtSW4gPSBudW1SZXN0O1xuICAgICAgICAgICAgY291bnQgKz0gbnVtSW47XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHRzKSBpblJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtUmVzdF0pO1xuICAgICAgICAgICAgaWYgKG91dFJlc3VsdHMpIG91dFJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtIC0gbnVtUmVzdF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzKSB7XG4gICAgICAgICAgb3V0UmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW1dKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRSZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBjb3VudCA+PSBib3VuZCxcbiAgICAgIFhgSGFzIG9ubHkgJHtxKGNvdW50KX0gbWF0Y2hlcywgYnV0IG5lZWRzICR7cShib3VuZCl9YCxcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICogQHR5cGVkZWYge0NvcHlBcnJheSB8IENvcHlTZXQgfCBDb3B5QmFnfSBDb250YWluZXJcbiAqIEBwYXJhbSB7Q29udGFpbmVyfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50UGF0dFxuICogQHBhcmFtIHtiaWdpbnR9IGJvdW5kIE11c3QgYmUgPj0gMW5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW25lZWRJblJlc3VsdHNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtuZWVkT3V0UmVzdWx0c11cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge1tDb250YWluZXIgfCB1bmRlZmluZWQsIENvbnRhaW5lciB8IHVuZGVmaW5lZF0gfCBmYWxzZX1cbiAqL1xuICBjb25zdCBjb250YWluZXJIYXNTcGxpdCA9IChcbiAgICBzcGVjaW1lbixcbiAgICBlbGVtZW50UGF0dCxcbiAgICBib3VuZCxcbiAgICBuZWVkSW5SZXN1bHRzID0gZmFsc2UsXG4gICAgbmVlZE91dFJlc3VsdHMgPSBmYWxzZSxcbiAgICBjaGVjayA9IGlkZW50Q2hlY2tlcixcbiAgKSA9PiB7XG4gICAgY29uc3QgaW5SZXN1bHRzID0gbmVlZEluUmVzdWx0cyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG91dFJlc3VsdHMgPSBuZWVkT3V0UmVzdWx0cyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGtpbmQgPSBraW5kT2Yoc3BlY2ltZW4pO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWVsZW1lbnRzSGFzU3BsaXQoXG4gICAgICAgICAgICBzcGVjaW1lbixcbiAgICAgICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICAgICAgYm91bmQsXG4gICAgICAgICAgICBpblJlc3VsdHMsXG4gICAgICAgICAgICBvdXRSZXN1bHRzLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAvKiBjaGVjayBsb2dpYyBhbHJlYWR5IHBlcmZvcm1lZCBieSBlbGVtZW50c0hhc1NwbGl0Ki9cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtpblJlc3VsdHMsIG91dFJlc3VsdHNdO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFlbGVtZW50c0hhc1NwbGl0KFxuICAgICAgICAgICAgc3BlY2ltZW4ucGF5bG9hZCxcbiAgICAgICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICAgICAgYm91bmQsXG4gICAgICAgICAgICBpblJlc3VsdHMsXG4gICAgICAgICAgICBvdXRSZXN1bHRzLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBpblJlc3VsdHMgJiYgbWFrZUNvcHlTZXQoaW5SZXN1bHRzKSxcbiAgICAgICAgICBvdXRSZXN1bHRzICYmIG1ha2VDb3B5U2V0KG91dFJlc3VsdHMpLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFwYWlyc0hhc1NwbGl0KFxuICAgICAgICAgICAgc3BlY2ltZW4ucGF5bG9hZCxcbiAgICAgICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICAgICAgYm91bmQsXG4gICAgICAgICAgICBpblJlc3VsdHMsXG4gICAgICAgICAgICBvdXRSZXN1bHRzLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBpblJlc3VsdHMgJiYgbWFrZUNvcHlCYWcoaW5SZXN1bHRzKSxcbiAgICAgICAgICBvdXRSZXN1bHRzICYmIG1ha2VDb3B5QmFnKG91dFJlc3VsdHMpLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgdW5leHBlY3RlZCAke3Eoa2luZCl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQ29udGFpbmVySGFzSGVscGVyID0gRmFyKCdNLmNvbnRhaW5lckhhcyBoZWxwZXInLCB7XG4gICAgLyoqXG4gKiBAcGFyYW0ge0NvcHlBcnJheSB8IENvcHlTZXQgfCBDb3B5QmFnfSBzcGVjaW1lblxuICogQHBhcmFtIHtbUGF0dGVybiwgYmlnaW50LCBMaW1pdHM/XX0gcGF5bG9hZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtlbGVtZW50UGF0dCwgYm91bmQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGtpbmQgPSBraW5kT2Yoc3BlY2ltZW4sIGNoZWNrKTtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgaWYgKFxuICAgICAgICAhYXBwbHlMYWJlbGluZ0Vycm9yKFxuICAgICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuICAgICAgICAgIFtib3VuZCwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVja10sXG4gICAgICAgICAgYCR7a2luZH0gbWF0Y2hlc2AsXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gISFjb250YWluZXJIYXNTcGxpdChcbiAgICAgICAgc3BlY2ltZW4sXG4gICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICBib3VuZCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjaGVjayxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLmd0ZSgxbildKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdNLmNvbnRhaW5lckhhcyBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6ICgpID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hNYXBPZkhlbHBlciA9IEZhcignbWF0Y2g6bWFwT2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IG51bU1hcEVudHJpZXNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlNYXAnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgLyoqIEB0eXBlIHtBcnJheX0gKi8gKHNwZWNpbWVuLnBheWxvYWQua2V5cykubGVuZ3RoIDw9XG4gICAgICAgICAgICBudW1NYXBFbnRyaWVzTGltaXQsXG4gICAgICAgICAgWGBDb3B5TWFwIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gJHtxKFxuICAgICAgICAgICAgbnVtTWFwRW50cmllc0xpbWl0LFxuICAgICAgICAgICl9IGVudHJpZXM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKSAmJlxuICAgICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQua2V5cyxcbiAgICAgICAgICBrZXlQYXR0LFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICdtYXAga2V5cycsXG4gICAgICAgICkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbiAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLnZhbHVlcyxcbiAgICAgICAgICB2YWx1ZVBhdHQsXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgJ21hcCB2YWx1ZXMnLFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDptYXBPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IF9lbnRyeVBhdHQgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybltdfSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEByZXR1cm5zIHt7XG4gKiAgIHJlcXVpcmVkU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIHJlc3RTcGVjaW1lbjogUGFzc2FibGVbXVxuICogfX1cbiAqL1xuICBjb25zdCBzcGxpdEFycmF5UGFydHMgPSAoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KSA9PiB7XG4gICAgY29uc3QgbnVtUmVxdWlyZWQgPSByZXF1aXJlZFBhdHQubGVuZ3RoO1xuICAgIGNvbnN0IG51bU9wdGlvbmFsID0gb3B0aW9uYWxQYXR0Lmxlbmd0aDtcbiAgICBjb25zdCByZXF1aXJlZFNwZWNpbWVuID0gc3BlY2ltZW4uc2xpY2UoMCwgbnVtUmVxdWlyZWQpO1xuICAgIGNvbnN0IG9wdGlvbmFsU3BlY2ltZW4gPSBzcGVjaW1lbi5zbGljZShcbiAgICAgIG51bVJlcXVpcmVkLFxuICAgICAgbnVtUmVxdWlyZWQgKyBudW1PcHRpb25hbCxcbiAgICApO1xuICAgIGNvbnN0IHJlc3RTcGVjaW1lbiA9IHNwZWNpbWVuLnNsaWNlKG51bVJlcXVpcmVkICsgbnVtT3B0aW9uYWwpO1xuICAgIHJldHVybiBoYXJkZW4oeyByZXF1aXJlZFNwZWNpbWVuLCBvcHRpb25hbFNwZWNpbWVuLCByZXN0U3BlY2ltZW4gfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiBlbGVtZW50cyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm5zIHtQYXR0ZXJuW119IFRoZSBwYXJ0aWFsUGF0dFxuICovXG4gIGNvbnN0IGFkYXB0QXJyYXlQYXR0ZXJuID0gKG9wdGlvbmFsUGF0dCwgbGVuZ3RoKSA9PlxuICAgIGhhcmRlbihvcHRpb25hbFBhdHQuc2xpY2UoMCwgbGVuZ3RoKS5tYXAocGF0dCA9PiBNTS5vcHQocGF0dCkpKTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFNwbGl0QXJyYXlIZWxwZXIgPSBGYXIoJ21hdGNoOnNwbGl0QXJyYXkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBbcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQgPSBbXSwgcmVzdFBhdHQgPSBNTS5hbnkoKV0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGlmICghY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUFycmF5JywgY2hlY2spKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgcmVxdWlyZWRTcGVjaW1lbiwgb3B0aW9uYWxTcGVjaW1lbiwgcmVzdFNwZWNpbWVuIH0gPVxuICAgICAgICBzcGxpdEFycmF5UGFydHMoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KTtcbiAgICAgIGNvbnN0IHBhcnRpYWxQYXR0ID0gYWRhcHRBcnJheVBhdHRlcm4oXG4gICAgICAgIG9wdGlvbmFsUGF0dCxcbiAgICAgICAgb3B0aW9uYWxTcGVjaW1lbi5sZW5ndGgsXG4gICAgICApO1xuICAgICAgbGV0IGFyZ051bSA9IDA7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAocmVxdWlyZWRTcGVjaW1lbi5sZW5ndGggPT09IHJlcXVpcmVkUGF0dC5sZW5ndGggfHxcbiAgICAgICAgICBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGBFeHBlY3RlZCBhdCBsZWFzdCAke3EoXG4gICAgICAgICAgICAgIHJlcXVpcmVkUGF0dC5sZW5ndGgsXG4gICAgICAgICAgICApfSBhcmd1bWVudHM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgICApKSAmJlxuICAgICAgICByZXF1aXJlZFBhdHQuZXZlcnkoKHAsIGkpID0+XG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbiAgICAgICAgICBjaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbltpXSwgcCwgY2hlY2ssIGBhcmcgJHthcmdOdW0rK31gKSxcbiAgICAgICAgKSAmJlxuICAgICAgICBwYXJ0aWFsUGF0dC5ldmVyeSgocCwgaSkgPT5cbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhvcHRpb25hbFNwZWNpbWVuW2ldLCBwLCBjaGVjaywgYGFyZyAke2FyZ051bSsrfT9gKSxcbiAgICAgICAgKSAmJlxuICAgICAgICBjaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLCByZXN0UGF0dCwgY2hlY2ssICcuLi5yZXN0JylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIC8qKlxuICogQHBhcmFtIHtBcnJheX0gc3BsaXRBcnJheVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChzcGxpdEFycmF5LCBjaGVjaykgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwYXNzU3R5bGVPZihzcGxpdEFycmF5KSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICAgICAgKHNwbGl0QXJyYXkubGVuZ3RoID49IDEgfHwgc3BsaXRBcnJheS5sZW5ndGggPD0gMylcbiAgICAgICkge1xuICAgICAgICBjb25zdCBbcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQgPSB1bmRlZmluZWQsIHJlc3RQYXR0ID0gdW5kZWZpbmVkXSA9XG4gICAgICAgICAgc3BsaXRBcnJheTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzUGF0dGVybihyZXF1aXJlZFBhdHQpICYmXG4gICAgICAgICAgcGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICAgICAgICAob3B0aW9uYWxQYXR0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChpc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSAmJlxuICAgICAgICAgICAgICBwYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpID09PSAnY29weUFycmF5JykpICYmXG4gICAgICAgICAgKHJlc3RQYXR0ID09PSB1bmRlZmluZWQgfHwgaXNQYXR0ZXJuKHJlc3RQYXR0KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCBhcnJheSwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IGFycmF5LCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbiAgICAgICAgICBzcGxpdEFycmF5LFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChbXG4gICAgICBfcmVxdWlyZWRQYXR0LFxuICAgICAgX29wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCxcbiAgICAgIF9yZXN0UGF0dCA9IHVuZGVmaW5lZCxcbiAgICBdKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5JyksXG4gIH0pO1xuXG4gIC8qKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhc3NhYmxlPn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICByZXN0U3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+XG4gKiB9fVxuICovXG4gIGNvbnN0IHNwbGl0UmVjb3JkUGFydHMgPSAoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KSA9PiB7XG4gICAgLyogTm90IGZyb3plbiEgTXV0YXRlZCBpbiBwbGFjZSovXG4gICAgLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbiAgICBjb25zdCByZXF1aXJlZEVudHJpZXMgPSBbXTtcbiAgICAvKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuICAgIGNvbnN0IG9wdGlvbmFsRW50cmllcyA9IFtdO1xuICAgIC8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG4gICAgY29uc3QgcmVzdEVudHJpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgZW50cmllcyhzcGVjaW1lbikpIHtcbiAgICAgIGlmIChoYXNPd24ocmVxdWlyZWRQYXR0LCBuYW1lKSkge1xuICAgICAgICByZXF1aXJlZEVudHJpZXMucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzT3duKG9wdGlvbmFsUGF0dCwgbmFtZSkpIHtcbiAgICAgICAgb3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0RW50cmllcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHJlcXVpcmVkU3BlY2ltZW46IGZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG4gICAgICBvcHRpb25hbFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhvcHRpb25hbEVudHJpZXMpLFxuICAgICAgcmVzdFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhyZXN0RW50cmllcyksXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiB2YWx1ZXMgd2hpY2ggYXJlIGB1bmRlZmluZWRgIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICogV2UgZW5jb2RlIHRoaXMgd2l0aCB0aGUgYE0ub3JgIHBhdHRlcm4gc28gaXQgYWxzbyBwcm9kdWNlcyBhIGdvb2RcbiAqIGNvbXByZXNzaW9uIGRpc3Rpbmd1aXNoaW5nIGB1bmRlZmluZWRgIGZyb20gYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZXNcbiAqIEByZXR1cm5zIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBUaGUgcGFydGlhbFBhdHRcbiAqL1xuICBjb25zdCBhZGFwdFJlY29yZFBhdHRlcm4gPSAob3B0aW9uYWxQYXR0LCBuYW1lcykgPT5cbiAgICBmcm9tVW5pcXVlRW50cmllcyhuYW1lcy5tYXAobmFtZSA9PiBbbmFtZSwgTU0ub3B0KG9wdGlvbmFsUGF0dFtuYW1lXSldKSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTcGxpdFJlY29yZEhlbHBlciA9IEZhcignbWF0Y2g6c3BsaXRSZWNvcmQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBbcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQgPSB7fSwgcmVzdFBhdHQgPSBNTS5hbnkoKV0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGlmICghY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weVJlY29yZCcsIGNoZWNrKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHJlcXVpcmVkU3BlY2ltZW4sIG9wdGlvbmFsU3BlY2ltZW4sIHJlc3RTcGVjaW1lbiB9ID1cbiAgICAgICAgc3BsaXRSZWNvcmRQYXJ0cyhzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpO1xuXG4gICAgICBjb25zdCBwYXJ0aWFsTmFtZXMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAob3duS2V5cyhvcHRpb25hbFNwZWNpbWVuKSk7XG4gICAgICBjb25zdCBwYXJ0aWFsUGF0dCA9IGFkYXB0UmVjb3JkUGF0dGVybihvcHRpb25hbFBhdHQsIHBhcnRpYWxOYW1lcyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBjaGVjaykgJiZcbiAgICAgICAgcGFydGlhbE5hbWVzLmV2ZXJ5KG5hbWUgPT5cbiAgICAgICAgICBjaGVja01hdGNoZXMoXG4gICAgICAgICAgICBvcHRpb25hbFNwZWNpbWVuW25hbWVdLFxuICAgICAgICAgICAgcGFydGlhbFBhdHRbbmFtZV0sXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIGAke25hbWV9P2AsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSAmJlxuICAgICAgICBjaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLCByZXN0UGF0dCwgY2hlY2ssICcuLi5yZXN0JylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIC8qKlxuICogQHBhcmFtIHtBcnJheX0gc3BsaXRBcnJheVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChzcGxpdEFycmF5LCBjaGVjaykgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwYXNzU3R5bGVPZihzcGxpdEFycmF5KSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICAgICAgKHNwbGl0QXJyYXkubGVuZ3RoID49IDEgfHwgc3BsaXRBcnJheS5sZW5ndGggPD0gMylcbiAgICAgICkge1xuICAgICAgICBjb25zdCBbcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQgPSB1bmRlZmluZWQsIHJlc3RQYXR0ID0gdW5kZWZpbmVkXSA9XG4gICAgICAgICAgc3BsaXRBcnJheTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzUGF0dGVybihyZXF1aXJlZFBhdHQpICYmXG4gICAgICAgICAgcGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSA9PT0gJ2NvcHlSZWNvcmQnICYmXG4gICAgICAgICAgKG9wdGlvbmFsUGF0dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkgJiZcbiAgICAgICAgICAgICAgcGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KSA9PT0gJ2NvcHlSZWNvcmQnKSkgJiZcbiAgICAgICAgICAocmVzdFBhdHQgPT09IHVuZGVmaW5lZCB8fCBpc1BhdHRlcm4ocmVzdFBhdHQpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG4gICAgICAgICAgc3BsaXRBcnJheSxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoW1xuICAgICAgcmVxdWlyZWRQYXR0LFxuICAgICAgX29wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCxcbiAgICAgIF9yZXN0UGF0dCA9IHVuZGVmaW5lZCxcbiAgICBdKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBNYXRjaEhlbHBlcj59ICovXG4gIGNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnID0gaGFyZGVuKHtcbiAgICAnbWF0Y2g6YW55JzogbWF0Y2hBbnlIZWxwZXIsXG4gICAgJ21hdGNoOmFuZCc6IG1hdGNoQW5kSGVscGVyLFxuICAgICdtYXRjaDpvcic6IG1hdGNoT3JIZWxwZXIsXG4gICAgJ21hdGNoOm5vdCc6IG1hdGNoTm90SGVscGVyLFxuXG4gICAgJ21hdGNoOnNjYWxhcic6IG1hdGNoU2NhbGFySGVscGVyLFxuICAgICdtYXRjaDprZXknOiBtYXRjaEtleUhlbHBlcixcbiAgICAnbWF0Y2g6cGF0dGVybic6IG1hdGNoUGF0dGVybkhlbHBlcixcbiAgICAnbWF0Y2g6a2luZCc6IG1hdGNoS2luZEhlbHBlcixcbiAgICAnbWF0Y2g6dGFnZ2VkJzogbWF0Y2hUYWdnZWRIZWxwZXIsXG4gICAgJ21hdGNoOmJpZ2ludCc6IG1hdGNoQmlnaW50SGVscGVyLFxuICAgICdtYXRjaDpuYXQnOiBtYXRjaE5hdEhlbHBlcixcbiAgICAnbWF0Y2g6c3RyaW5nJzogbWF0Y2hTdHJpbmdIZWxwZXIsXG4gICAgJ21hdGNoOnN5bWJvbCc6IG1hdGNoU3ltYm9sSGVscGVyLFxuICAgICdtYXRjaDpyZW1vdGFibGUnOiBtYXRjaFJlbW90YWJsZUhlbHBlcixcblxuICAgICdtYXRjaDpsdCc6IG1hdGNoTFRIZWxwZXIsXG4gICAgJ21hdGNoOmx0ZSc6IG1hdGNoTFRFSGVscGVyLFxuICAgICdtYXRjaDpndGUnOiBtYXRjaEdURUhlbHBlcixcbiAgICAnbWF0Y2g6Z3QnOiBtYXRjaEdUSGVscGVyLFxuXG4gICAgJ21hdGNoOmFycmF5T2YnOiBtYXRjaEFycmF5T2ZIZWxwZXIsXG4gICAgJ21hdGNoOmJ5dGVBcnJheSc6IG1hdGNoQnl0ZUFycmF5SGVscGVyLFxuICAgICdtYXRjaDpyZWNvcmRPZic6IG1hdGNoUmVjb3JkT2ZIZWxwZXIsXG4gICAgJ21hdGNoOnNldE9mJzogbWF0Y2hTZXRPZkhlbHBlcixcbiAgICAnbWF0Y2g6YmFnT2YnOiBtYXRjaEJhZ09mSGVscGVyLFxuICAgICdtYXRjaDpjb250YWluZXJIYXMnOiBtYXRjaENvbnRhaW5lckhhc0hlbHBlcixcbiAgICAnbWF0Y2g6bWFwT2YnOiBtYXRjaE1hcE9mSGVscGVyLFxuICAgICdtYXRjaDpzcGxpdEFycmF5JzogbWF0Y2hTcGxpdEFycmF5SGVscGVyLFxuICAgICdtYXRjaDpzcGxpdFJlY29yZCc6IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXIsXG4gIH0pO1xuXG4gIGNvbnN0IG1ha2VNYXRjaGVyID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICAgIGNvbnN0IG1hdGNoZXIgPSBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZCk7XG4gICAgYXNzZXJ0UGF0dGVybihtYXRjaGVyKTtcbiAgICByZXR1cm4gbWF0Y2hlcjtcbiAgfTtcblxuICBjb25zdCBtYWtlS2luZE1hdGNoZXIgPSBraW5kID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpraW5kJywga2luZCk7XG5cbiAgY29uc3QgQW55U2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6YW55JywgdW5kZWZpbmVkKTtcbiAgY29uc3QgU2NhbGFyU2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6c2NhbGFyJywgdW5kZWZpbmVkKTtcbiAgY29uc3QgS2V5U2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6a2V5JywgdW5kZWZpbmVkKTtcbiAgY29uc3QgUGF0dGVyblNoYXBlID0gbWFrZU1hdGNoZXIoJ21hdGNoOnBhdHRlcm4nLCB1bmRlZmluZWQpO1xuICBjb25zdCBCb29sZWFuU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ2Jvb2xlYW4nKTtcbiAgY29uc3QgTnVtYmVyU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ251bWJlcicpO1xuICBjb25zdCBCaWdJbnRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmJpZ2ludCcsIFtdKTtcbiAgY29uc3QgTmF0U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpuYXQnLCBbXSk7XG4gIGNvbnN0IFN0cmluZ1NoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6c3RyaW5nJywgW10pO1xuICBjb25zdCBTeW1ib2xTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnN5bWJvbCcsIFtdKTtcbiAgY29uc3QgUmVjb3JkU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpyZWNvcmRPZicsIFtBbnlTaGFwZSwgQW55U2hhcGVdKTtcbiAgY29uc3QgQXJyYXlTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmFycmF5T2YnLCBbQW55U2hhcGVdKTtcbiAgY29uc3QgQnl0ZUFycmF5U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpieXRlQXJyYXknLCBbXSk7XG4gIGNvbnN0IFNldFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6c2V0T2YnLCBbQW55U2hhcGVdKTtcbiAgY29uc3QgQmFnU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsIFtBbnlTaGFwZSwgQW55U2hhcGVdKTtcbiAgY29uc3QgTWFwU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsIFtBbnlTaGFwZSwgQW55U2hhcGVdKTtcbiAgY29uc3QgUmVtb3RhYmxlU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuICBjb25zdCBFcnJvclNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdlcnJvcicpO1xuICBjb25zdCBQcm9taXNlU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ3Byb21pc2UnKTtcbiAgY29uc3QgVW5kZWZpbmVkU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4gIC8qKlxuICogRm9yIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGF5bG9hZCBpcyB0aGUgb3B0aW9uYWwgbGltaXRzLFxuICogc28gdGhhdCB3aGVuIGl0IGlzIGB1bmRlZmluZWRgIGl0IGlzIGRyb3BwZWQgZnJvbSB0aGUgZW5kIG9mIHRoZVxuICogcGF5bG9hZHMgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXlsb2FkXG4gKi9cbiAgY29uc3QgbWFrZUxpbWl0c01hdGNoZXIgPSAodGFnLCBwYXlsb2FkKSA9PiB7XG4gICAgaWYgKHBheWxvYWRbcGF5bG9hZC5sZW5ndGggLSAxXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXlsb2FkID0gaGFyZGVuKHBheWxvYWQuc2xpY2UoMCwgcGF5bG9hZC5sZW5ndGggLSAxKSk7XG4gICAgfVxuICAgIHJldHVybiBtYWtlTWF0Y2hlcih0YWcsIHBheWxvYWQpO1xuICB9O1xuXG4gIGNvbnN0IG1ha2VSZW1vdGFibGVNYXRjaGVyID0gKGxhYmVsID0gdW5kZWZpbmVkKSA9PlxuICAgIGxhYmVsID09PSB1bmRlZmluZWRcbiAgICAgID8gUmVtb3RhYmxlU2hhcGVcbiAgICAgIDogbWFrZU1hdGNoZXIoJ21hdGNoOnJlbW90YWJsZScsIGhhcmRlbih7IGxhYmVsIH0pKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IGVtcHR5XG4gKiBAcGFyYW0ge1R9IGJhc2VcbiAqIEBwYXJhbSB7VH0gW29wdGlvbmFsXVxuICogQHBhcmFtIHtUfSBbcmVzdF1cbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbiAgY29uc3QgbWFrZVNwbGl0UGF5bG9hZCA9IChcbiAgICBlbXB0eSxcbiAgICBiYXNlLFxuICAgIG9wdGlvbmFsID0gdW5kZWZpbmVkLFxuICAgIHJlc3QgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgIGlmIChyZXN0KSB7XG4gICAgICByZXR1cm4gW2Jhc2UsIG9wdGlvbmFsIHx8IGVtcHR5LCByZXN0XTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICByZXR1cm4gW2Jhc2UsIG9wdGlvbmFsXTtcbiAgICB9XG4gICAgcmV0dXJuIFtiYXNlXTtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hlck5hbWVzcGFjZX0gKi9cbiAgY29uc3QgTSA9IGhhcmRlbih7XG4gICAgYW55OiAoKSA9PiBBbnlTaGFwZSxcbiAgICBhbmQ6ICguLi5wYXR0cykgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmFuZCcsIHBhdHRzKSxcbiAgICBvcjogKC4uLnBhdHRzKSA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6b3InLCBwYXR0cyksXG4gICAgbm90OiBzdWJQYXR0ID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpub3QnLCBzdWJQYXR0KSxcblxuICAgIHNjYWxhcjogKCkgPT4gU2NhbGFyU2hhcGUsXG4gICAga2V5OiAoKSA9PiBLZXlTaGFwZSxcbiAgICBwYXR0ZXJuOiAoKSA9PiBQYXR0ZXJuU2hhcGUsXG4gICAga2luZDogbWFrZUtpbmRNYXRjaGVyLFxuICAgIHRhZ2dlZDogKHRhZ1BhdHQgPSBNLnN0cmluZygpLCBwYXlsb2FkUGF0dCA9IE0uYW55KCkpID0+XG4gICAgICBtYWtlTWF0Y2hlcignbWF0Y2g6dGFnZ2VkJywgaGFyZGVuKFt0YWdQYXR0LCBwYXlsb2FkUGF0dF0pKSxcbiAgICBib29sZWFuOiAoKSA9PiBCb29sZWFuU2hhcGUsXG4gICAgbnVtYmVyOiAoKSA9PiBOdW1iZXJTaGFwZSxcbiAgICBiaWdpbnQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmlnaW50JywgW2xpbWl0c10pIDogQmlnSW50U2hhcGUsXG4gICAgbmF0OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm5hdCcsIFtsaW1pdHNdKSA6IE5hdFNoYXBlLFxuICAgIHN0cmluZzogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzdHJpbmcnLCBbbGltaXRzXSkgOiBTdHJpbmdTaGFwZSxcbiAgICBzeW1ib2w6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3ltYm9sJywgW2xpbWl0c10pIDogU3ltYm9sU2hhcGUsXG4gICAgcmVjb3JkOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gTS5yZWNvcmRPZihNLmFueSgpLCBNLmFueSgpLCBsaW1pdHMpIDogUmVjb3JkU2hhcGUsXG4gICAgLyogc3RydWN0OiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlSZWNvcmRzIHdpdGggYSBmaXhlZCBxdWFudGl0eSBvZiovXG4gICAgLyogZW50cmllcyB3aGVyZSB0aGUgdmFsdWVzIG1hdGNoIHBhdHRlcm5zIGZvciBjb3JyZXNwb25kaW5nIGtleXMgaXMgbWVyZWx5Ki9cbiAgICAvKiBhIGhhcmRlbmVkIG9iamVjdCB3aXRoIHBhdHRlcm5zIGluIHRoZSBwbGFjZXMgb2YgdmFsdWVzIGZvciovXG4gICAgLyogY29ycmVzcG9uZGluZyBrZXlzLiovXG4gICAgLyogRm9yIGV4YW1wbGUsIGEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weVJlY29yZHMgdGhhdCBoYXZlIGEgc3RyaW5nIHZhbHVlKi9cbiAgICAvKiBmb3IgdGhlIGtleSAneCcgYW5kIGEgbnVtYmVyIGZvciB0aGUga2V5ICd5JyBpczoqL1xuICAgIC8qIGhhcmRlbih7IHg6IE0uc3RyaW5nKCksIHk6IE0ubnVtYmVyKCkgfSkuKi9cbiAgICBhcnJheTogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IE0uYXJyYXlPZihNLmFueSgpLCBsaW1pdHMpIDogQXJyYXlTaGFwZSxcbiAgICAvKiB0dXBsZTogQSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBDb3B5QXJyYXlzIHdpdGggYSBmaXhlZCBxdWFudGl0eSBvZiB2YWx1ZXMqL1xuICAgIC8qIHRoYXQgbWF0Y2ggYSBoZXRlcm9nZW5lb3VzIGFycmF5IG9mIHBhdHRlcm5zIGlzIG1lcmVseSBhIGhhcmRlbmVkIGFycmF5Ki9cbiAgICAvKiBvZiB0aGUgcmVzcGVjdGl2ZSBwYXR0ZXJucy4qL1xuICAgIC8qIEZvciBleGFtcGxlLCBhIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlBcnJheXMgb2YgbGVuZ3RoIDIgdGhhdCBoYXZlIGEqL1xuICAgIC8qIHN0cmluZyBhdCBpbmRleCAwIGFuZCBhIG51bWJlciBhdCBpbmRleCAxIGlzOiovXG4gICAgLyogaGFyZGVuKFsgTS5zdHJpbmcoKSwgTS5udW1iZXIoKSBdKS4qL1xuICAgIGJ5dGVBcnJheTogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpieXRlQXJyYXknLCBbbGltaXRzXSkgOiBCeXRlQXJyYXlTaGFwZSxcbiAgICBzZXQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+IChsaW1pdHMgPyBNLnNldE9mKE0uYW55KCksIGxpbWl0cykgOiBTZXRTaGFwZSksXG4gICAgYmFnOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gTS5iYWdPZihNLmFueSgpLCBNLmFueSgpLCBsaW1pdHMpIDogQmFnU2hhcGUsXG4gICAgbWFwOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gTS5tYXBPZihNLmFueSgpLCBNLmFueSgpLCBsaW1pdHMpIDogTWFwU2hhcGUsXG4gICAgLyogaGV0ZXJvZ2VuZW91cyBtYXA6IEEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weU1hcHMgd2l0aCBhIGZpeGVkIHF1YW50aXR5Ki9cbiAgICAvKiBvZiBlbnRyaWVzIHdoZXJlIHRoZSB2YWx1ZSBmb3IgZWFjaCBrZXkgbWF0Y2hlcyBhIGNvcnJlc3BvbmRpbmcgcGF0dGVybiovXG4gICAgLyogaXMgbWVyZWx5IGEgKGhhcmRlbmVkKSBDb3B5TWFwIHdpdGggcGF0dGVybnMgaW5zdGVhZCBvZiB2YWx1ZXMgZm9yIHRoZSovXG4gICAgLyogY29ycmVzcG9uZGluZyBrZXlzLiovXG4gICAgLyogRm9yIGV4YW1wbGUsIGEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weU1hcHMgd2hlcmUgdGhlIHZhbHVlIGZvciB0aGUga2V5Ki9cbiAgICAvKiAneCcgaXMgYSBudW1iZXIgYW5kIHRoZSB2YWx1ZSBmb3IgdGhlIGtleSAneScgaXMgYSBzdHJpbmcgaXM6Ki9cbiAgICAvKiBtYWtlQ29weU1hcChbWyd4JywgTS5udW1iZXIoKV0sIFsneScsIE0uc3RyaW5nKCldXSkuKi9cbiAgICByZW1vdGFibGU6IG1ha2VSZW1vdGFibGVNYXRjaGVyLFxuICAgIGVycm9yOiAoKSA9PiBFcnJvclNoYXBlLFxuICAgIHByb21pc2U6ICgpID0+IFByb21pc2VTaGFwZSxcbiAgICB1bmRlZmluZWQ6ICgpID0+IFVuZGVmaW5lZFNoYXBlLFxuICAgIG51bGw6ICgpID0+IG51bGwsXG5cbiAgICBsdDogcmlnaHRPcGVyYW5kID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpsdCcsIHJpZ2h0T3BlcmFuZCksXG4gICAgbHRlOiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmx0ZScsIHJpZ2h0T3BlcmFuZCksXG4gICAgZXE6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXkoa2V5KTtcbiAgICAgIHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/IE0udW5kZWZpbmVkKCkgOiBrZXk7XG4gICAgfSxcbiAgICBuZXE6IGtleSA9PiBNLm5vdChNLmVxKGtleSkpLFxuICAgIGd0ZTogcmlnaHRPcGVyYW5kID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpndGUnLCByaWdodE9wZXJhbmQpLFxuICAgIGd0OiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmd0JywgcmlnaHRPcGVyYW5kKSxcblxuICAgIHJlY29yZE9mOiAoa2V5UGF0dCA9IE0uYW55KCksIHZhbHVlUGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpyZWNvcmRPZicsIFtrZXlQYXR0LCB2YWx1ZVBhdHQsIGxpbWl0c10pLFxuICAgIGFycmF5T2Y6IChzdWJQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmFycmF5T2YnLCBbc3ViUGF0dCwgbGltaXRzXSksXG4gICAgc2V0T2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnNldE9mJywgW2tleVBhdHQsIGxpbWl0c10pLFxuICAgIGJhZ09mOiAoa2V5UGF0dCA9IE0uYW55KCksIGNvdW50UGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiYWdPZicsIFtrZXlQYXR0LCBjb3VudFBhdHQsIGxpbWl0c10pLFxuICAgIGNvbnRhaW5lckhhczogKGVsZW1lbnRQYXR0ID0gTS5hbnkoKSwgY291bnRQYXR0ID0gMW4sIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpjb250YWluZXJIYXMnLCBbZWxlbWVudFBhdHQsIGNvdW50UGF0dCwgbGltaXRzXSksXG4gICAgbWFwT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgdmFsdWVQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm1hcE9mJywgW2tleVBhdHQsIHZhbHVlUGF0dCwgbGltaXRzXSksXG4gICAgc3BsaXRBcnJheTogKGJhc2UsIG9wdGlvbmFsID0gdW5kZWZpbmVkLCByZXN0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZU1hdGNoZXIoXG4gICAgICAgICdtYXRjaDpzcGxpdEFycmF5JyxcbiAgICAgICAgbWFrZVNwbGl0UGF5bG9hZChbXSwgYmFzZSwgb3B0aW9uYWwsIHJlc3QpLFxuICAgICAgKSxcbiAgICBzcGxpdFJlY29yZDogKGJhc2UsIG9wdGlvbmFsID0gdW5kZWZpbmVkLCByZXN0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZU1hdGNoZXIoXG4gICAgICAgICdtYXRjaDpzcGxpdFJlY29yZCcsXG4gICAgICAgIG1ha2VTcGxpdFBheWxvYWQoe30sIGJhc2UsIG9wdGlvbmFsLCByZXN0KSxcbiAgICAgICksXG4gICAgc3BsaXQ6IChiYXNlLCByZXN0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKSA9PT0gJ2NvcHlBcnJheScpIHtcbiAgICAgICAgLyogVE9ETyBhdC10cy1leHBlY3QtZXJyb3Igd29ya3MgbG9jYWxseSBidXQgbm90IGZyb20gQGVuZG8vZXhvKi9cbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG4gICAgICAgIHJldHVybiBNLnNwbGl0QXJyYXkoYmFzZSwgcmVzdCAmJiBbXSwgcmVzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTS5zcGxpdFJlY29yZChiYXNlLCByZXN0ICYmIHt9LCByZXN0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHBhcnRpYWw6IChiYXNlLCByZXN0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKSA9PT0gJ2NvcHlBcnJheScpIHtcbiAgICAgICAgLyogVE9ETyBhdC10cy1leHBlY3QtZXJyb3Igd29ya3MgbG9jYWxseSBidXQgbm90IGZyb20gQGVuZG8vZXhvKi9cbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG4gICAgICAgIHJldHVybiBNLnNwbGl0QXJyYXkoW10sIGJhc2UsIHJlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sIGJhc2UsIHJlc3QpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBlcmVmOiB0ID0+IE0ub3IodCwgTS5wcm9taXNlKCkpLFxuICAgIG9wdDogdCA9PiBNLm9yKE0udW5kZWZpbmVkKCksIHQpLFxuXG4gICAgaW50ZXJmYWNlOiAoaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCBvcHRpb25zKSA9PlxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIG1ha2VJbnRlcmZhY2VHdWFyZChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMpLFxuICAgIGNhbGw6ICguLi5hcmdQYXR0ZXJucykgPT5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBtYWtlTWV0aG9kR3VhcmRNYWtlcignc3luYycsIGFyZ1BhdHRlcm5zKSxcbiAgICBjYWxsV2hlbjogKC4uLmFyZ0d1YXJkcykgPT5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBtYWtlTWV0aG9kR3VhcmRNYWtlcignYXN5bmMnLCBhcmdHdWFyZHMpLFxuXG4gICAgYXdhaXQ6IGFyZ1BhdHRlcm4gPT5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBtYWtlQXdhaXRBcmdHdWFyZChhcmdQYXR0ZXJuKSxcbiAgICByYXc6ICgpID0+XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgbWFrZVJhd0d1YXJkKCksXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGNoZWNrTWF0Y2hlcyxcbiAgICBtYXRjaGVzLFxuICAgIG11c3RNYXRjaCxcbiAgICBhc3NlcnRQYXR0ZXJuLFxuICAgIGlzUGF0dGVybixcbiAgICBnZXRSYW5rQ292ZXIsXG4gICAgTSxcbiAgICBraW5kT2YsXG4gICAgY29udGFpbmVySGFzU3BsaXQsXG4gIH0pO1xufTtcblxuLyogT25seSBpbmNsdWRlIHRob3NlIHdob3NlIG1lYW5pbmcgaXMgaW5kZXBlbmRlbnQgb2YgYW4gaW1wdXRlZCBzb3J0IG9yZGVyKi9cbi8qIG9mIHJlbW90YWJsZXMsIG9yIG9mIGVuY29kaW5nIG9mIHBhc3NhYmxlIGFzIHNvcnRhYmxlIHN0cmluZ3MuIFRodXMsKi9cbi8qIGdldFJhbmtDb3ZlciBpcyBvbWl0dGVkLiBUbyBnZXQgb25lLCB5b3UnZCBuZWVkIHRvIGluc3RhbnRpYXRlKi9cbi8qIGBtYWtlUGF0dGVybktpdCgpYCB5b3Vyc2VsZi4gU2luY2UgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBleHRlcm5hbCovXG4vKiB1c2VzIG9mIGBnZXRSYW5rQ292ZXJgLCBmb3IgY2xhcml0eSBkdXJpbmcgZGV2ZWxvcG1lbnQsIGBtYWtlUGF0dGVybktpdGAqL1xuLyogaXMgbm90IGN1cnJlbnRseSBleHBvcnRlZC4qL1xuICAgICAgIGNvbnN0IHtcbiAgY2hlY2tNYXRjaGVzLFxuICBtYXRjaGVzLFxuICBtdXN0TWF0Y2gsXG4gIGFzc2VydFBhdHRlcm4sXG4gIGlzUGF0dGVybixcbiAgZ2V0UmFua0NvdmVyLFxuICBNLFxuICBraW5kT2YsXG4gIGNvbnRhaW5lckhhc1NwbGl0LFxufSA9IG1ha2VQYXR0ZXJuS2l0KCk7JGjNj19vbmNlLmNoZWNrTWF0Y2hlcyhjaGVja01hdGNoZXMpOyRozY9fb25jZS5tYXRjaGVzKG1hdGNoZXMpOyRozY9fb25jZS5tdXN0TWF0Y2gobXVzdE1hdGNoKTskaM2PX29uY2UuYXNzZXJ0UGF0dGVybihhc3NlcnRQYXR0ZXJuKTskaM2PX29uY2UuaXNQYXR0ZXJuKGlzUGF0dGVybik7JGjNj19vbmNlLmdldFJhbmtDb3ZlcihnZXRSYW5rQ292ZXIpOyRozY9fb25jZS5NKE0pOyRozY9fb25jZS5raW5kT2Yoa2luZE9mKTskaM2PX29uY2UuY29udGFpbmVySGFzU3BsaXQoY29udGFpbmVySGFzU3BsaXQpO1xuXG5NTSA9IE07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gR3VhcmRzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE0uYXdhaXQoLi4uKSovXG5jb25zdCBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgYXJnR3VhcmQ6IE0ucGF0dGVybigpLFxufSk7XG5cbiAgICAgICBjb25zdCBBd2FpdEFyZ0d1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOmF3YWl0QXJnR3VhcmQnKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtzcGVjaW1lbiBpcyBBd2FpdEFyZ0d1YXJkfVxuICovJGjNj19vbmNlLkF3YWl0QXJnR3VhcmRTaGFwZShBd2FpdEFyZ0d1YXJkU2hhcGUpO1xuICAgICAgIGNvbnN0IGlzQXdhaXRBcmdHdWFyZCA9IHNwZWNpbWVuID0+XG4gIG1hdGNoZXMoc3BlY2ltZW4sIEF3YWl0QXJnR3VhcmRTaGFwZSk7JGjNj19vbmNlLmlzQXdhaXRBcmdHdWFyZChpc0F3YWl0QXJnR3VhcmQpO1xuaGFyZGVuKGlzQXdhaXRBcmdHdWFyZCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBBd2FpdEFyZ0d1YXJkfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0QXdhaXRBcmdHdWFyZCA9IHNwZWNpbWVuID0+IHtcbiAgbXVzdE1hdGNoKHNwZWNpbWVuLCBBd2FpdEFyZ0d1YXJkU2hhcGUsICdhd2FpdEFyZ0d1YXJkJyk7XG59OyRozY9fb25jZS5hc3NlcnRBd2FpdEFyZ0d1YXJkKGFzc2VydEF3YWl0QXJnR3VhcmQpO1xuaGFyZGVuKGFzc2VydEF3YWl0QXJnR3VhcmQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gYXJnUGF0dGVyblxuICogQHJldHVybnMge0F3YWl0QXJnR3VhcmR9XG4gKi9cbmNvbnN0IG1ha2VBd2FpdEFyZ0d1YXJkID0gYXJnUGF0dGVybiA9PiB7XG4gIC8qKiBAdHlwZSB7QXdhaXRBcmdHdWFyZH0gKi9cbiAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnZ3VhcmQ6YXdhaXRBcmdHdWFyZCcsIHtcbiAgICBhcmdHdWFyZDogYXJnUGF0dGVybixcbiAgfSk7XG4gIGFzc2VydEF3YWl0QXJnR3VhcmQocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qIE0ucmF3KCkqL1xuXG5jb25zdCBSYXdHdWFyZFBheWxvYWRTaGFwZSA9IE0ucmVjb3JkKCk7XG5cbiAgICAgICBjb25zdCBSYXdHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDpyYXdHdWFyZCcpOyRozY9fb25jZS5SYXdHdWFyZFNoYXBlKFJhd0d1YXJkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgaXNSYXdHdWFyZCA9IHNwZWNpbWVuID0+IG1hdGNoZXMoc3BlY2ltZW4sIFJhd0d1YXJkU2hhcGUpOyRozY9fb25jZS5pc1Jhd0d1YXJkKGlzUmF3R3VhcmQpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0UmF3R3VhcmQgPSBzcGVjaW1lbiA9PlxuICBtdXN0TWF0Y2goc3BlY2ltZW4sIFJhd0d1YXJkU2hhcGUsICdyYXdHdWFyZCcpO1xuXG4vKipcbiAqIEByZXR1cm5zIHtSYXdHdWFyZH1cbiAqLyRozY9fb25jZS5hc3NlcnRSYXdHdWFyZChhc3NlcnRSYXdHdWFyZCk7XG5jb25zdCBtYWtlUmF3R3VhcmQgPSAoKSA9PiBtYWtlVGFnZ2VkKCdndWFyZDpyYXdHdWFyZCcsIHt9KTtcblxuLyogTS5jYWxsKC4uLikqL1xuLyogTS5jYWxsV2hlbiguLi4pKi9cblxuICAgICAgIGNvbnN0IFN5bmNWYWx1ZUd1YXJkU2hhcGUgPSBNLm9yKFJhd0d1YXJkU2hhcGUsIE0ucGF0dGVybigpKTskaM2PX29uY2UuU3luY1ZhbHVlR3VhcmRTaGFwZShTeW5jVmFsdWVHdWFyZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlID0gTS5hcnJheU9mKFN5bmNWYWx1ZUd1YXJkU2hhcGUpOyRozY9fb25jZS5TeW5jVmFsdWVHdWFyZExpc3RTaGFwZShTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSk7XG5cbmNvbnN0IEFyZ0d1YXJkU2hhcGUgPSBNLm9yKFJhd0d1YXJkU2hhcGUsIEF3YWl0QXJnR3VhcmRTaGFwZSwgTS5wYXR0ZXJuKCkpO1xuICAgICAgIGNvbnN0IEFyZ0d1YXJkTGlzdFNoYXBlID0gTS5hcnJheU9mKEFyZ0d1YXJkU2hhcGUpOyRozY9fb25jZS5BcmdHdWFyZExpc3RTaGFwZShBcmdHdWFyZExpc3RTaGFwZSk7XG5cbmNvbnN0IFN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9IGhhcmRlbih7XG4gIGNhbGxLaW5kOiAnc3luYycsXG4gIGFyZ0d1YXJkczogU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG4gIG9wdGlvbmFsQXJnR3VhcmRzOiBNLm9wdChTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSksXG4gIHJlc3RBcmdHdWFyZDogTS5vcHQoU3luY1ZhbHVlR3VhcmRTaGFwZSksXG4gIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxufSk7XG5cbmNvbnN0IEFzeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSBoYXJkZW4oe1xuICBjYWxsS2luZDogJ2FzeW5jJyxcbiAgYXJnR3VhcmRzOiBBcmdHdWFyZExpc3RTaGFwZSxcbiAgb3B0aW9uYWxBcmdHdWFyZHM6IE0ub3B0KEFyZ0d1YXJkTGlzdFNoYXBlKSxcbiAgcmVzdEFyZ0d1YXJkOiBNLm9wdChTeW5jVmFsdWVHdWFyZFNoYXBlKSxcbiAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG59KTtcblxuICAgICAgIGNvbnN0IE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlID0gTS5vcihcbiAgU3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLFxuICBBc3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLFxuKTskaM2PX29uY2UuTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUoTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgTWV0aG9kR3VhcmRTaGFwZSA9IE0ua2luZCgnZ3VhcmQ6bWV0aG9kR3VhcmQnKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIE1ldGhvZEd1YXJkfVxuICovJGjNj19vbmNlLk1ldGhvZEd1YXJkU2hhcGUoTWV0aG9kR3VhcmRTaGFwZSk7XG4gICAgICAgY29uc3QgYXNzZXJ0TWV0aG9kR3VhcmQgPSBzcGVjaW1lbiA9PiB7XG4gIG11c3RNYXRjaChzcGVjaW1lbiwgTWV0aG9kR3VhcmRTaGFwZSwgJ21ldGhvZEd1YXJkJyk7XG59OyRozY9fb25jZS5hc3NlcnRNZXRob2RHdWFyZChhc3NlcnRNZXRob2RHdWFyZCk7XG5oYXJkZW4oYXNzZXJ0TWV0aG9kR3VhcmQpO1xuXG4vKipcbiAqIEBwYXJhbSB7J3N5bmMnfCdhc3luYyd9IGNhbGxLaW5kXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IGFyZ0d1YXJkc1xuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBbb3B0aW9uYWxBcmdHdWFyZHNdXG4gKiBAcGFyYW0ge1N5bmNWYWx1ZUd1YXJkfSBbcmVzdEFyZ0d1YXJkXVxuICogQHJldHVybnMge01ldGhvZEd1YXJkTWFrZXJ9XG4gKi9cbmNvbnN0IG1ha2VNZXRob2RHdWFyZE1ha2VyID0gKFxuICBjYWxsS2luZCxcbiAgYXJnR3VhcmRzLFxuICBvcHRpb25hbEFyZ0d1YXJkcyA9IHVuZGVmaW5lZCxcbiAgcmVzdEFyZ0d1YXJkID0gdW5kZWZpbmVkLFxuKSA9PlxuICBoYXJkZW4oe1xuICAgIG9wdGlvbmFsOiAoLi4ub3B0QXJnR3VhcmRzKSA9PiB7XG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG4gICAgICByZXN0QXJnR3VhcmQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYG9wdGlvbmFsIGFyZyBndWFyZHMgbXVzdCBjb21lIGJlZm9yZSByZXN0IGFyZ2A7XG4gICAgICByZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoY2FsbEtpbmQsIGFyZ0d1YXJkcywgb3B0QXJnR3VhcmRzKTtcbiAgICB9LFxuICAgIHJlc3Q6IHJBcmdHdWFyZCA9PiB7XG4gICAgICByZXN0QXJnR3VhcmQgPT09IHVuZGVmaW5lZCB8fCBGYWlsYENhbiBvbmx5IGhhdmUgb25lIHJlc3QgYXJnYDtcbiAgICAgIHJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihcbiAgICAgICAgY2FsbEtpbmQsXG4gICAgICAgIGFyZ0d1YXJkcyxcbiAgICAgICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgICAgIHJBcmdHdWFyZCxcbiAgICAgICk7XG4gICAgfSxcbiAgICByZXR1cm5zOiAocmV0dXJuR3VhcmQgPSBNLnVuZGVmaW5lZCgpKSA9PiB7XG4gICAgICAvKiogQHR5cGUge01ldGhvZEd1YXJkfSAqL1xuICAgICAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnZ3VhcmQ6bWV0aG9kR3VhcmQnLCB7XG4gICAgICAgIGNhbGxLaW5kLFxuICAgICAgICBhcmdHdWFyZHMsXG4gICAgICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICAgICAgICByZXN0QXJnR3VhcmQsXG4gICAgICAgIHJldHVybkd1YXJkLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnRNZXRob2RHdWFyZChyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9KTtcblxuICAgICAgIGNvbnN0IEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGludGVyZmFjZU5hbWU6IE0uc3RyaW5nKCksXG4gICAgbWV0aG9kR3VhcmRzOiBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE1ldGhvZEd1YXJkU2hhcGUpLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdEd1YXJkczogTS5vcihNLnVuZGVmaW5lZCgpLCAncGFzc2FibGUnLCAncmF3JyksXG4gICAgc2xvcHB5OiBNLmJvb2xlYW4oKSxcbiAgICBzeW1ib2xNZXRob2RHdWFyZHM6IE0ubWFwT2YoTS5zeW1ib2woKSwgTWV0aG9kR3VhcmRTaGFwZSksXG4gIH0sXG4pOyRozY9fb25jZS5JbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZShJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBJbnRlcmZhY2VHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDppbnRlcmZhY2VHdWFyZCcpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgSW50ZXJmYWNlR3VhcmR9XG4gKi8kaM2PX29uY2UuSW50ZXJmYWNlR3VhcmRTaGFwZShJbnRlcmZhY2VHdWFyZFNoYXBlKTtcbiAgICAgICBjb25zdCBhc3NlcnRJbnRlcmZhY2VHdWFyZCA9IHNwZWNpbWVuID0+IHtcbiAgbXVzdE1hdGNoKHNwZWNpbWVuLCBJbnRlcmZhY2VHdWFyZFNoYXBlLCAnaW50ZXJmYWNlR3VhcmQnKTtcbn07JGjNj19vbmNlLmFzc2VydEludGVyZmFjZUd1YXJkKGFzc2VydEludGVyZmFjZUd1YXJkKTtcbmhhcmRlbihhc3NlcnRJbnRlcmZhY2VHdWFyZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIE1ldGhvZEd1YXJkPn0gW00gPSBSZWNvcmQ8UHJvcGVydHlLZXksIE1ldGhvZEd1YXJkPl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlcmZhY2VOYW1lXG4gKiBAcGFyYW0ge019IG1ldGhvZEd1YXJkc1xuICogQHBhcmFtIHt7IHNsb3BweT86IGJvb2xlYW4sIGRlZmF1bHRHdWFyZHM/OiBEZWZhdWx0R3VhcmRUeXBlIH19IFtvcHRpb25zXVxuICogQHJldHVybnMge0ludGVyZmFjZUd1YXJkPE0+fVxuICovXG5jb25zdCBtYWtlSW50ZXJmYWNlR3VhcmQgPSAoaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCBvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgeyBzbG9wcHkgPSBmYWxzZSwgZGVmYXVsdEd1YXJkcyA9IHNsb3BweSA/ICdwYXNzYWJsZScgOiB1bmRlZmluZWQgfSA9XG4gICAgb3B0aW9ucztcbiAgLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBzdHJpbmcta2V5ZWQgbWV0aG9kIGd1YXJkcyBhcmUgcmVwcmVzZW50ZWQgaW4qL1xuICAvKiBhIENvcHlSZWNvcmQuIEJ1dCBzeW1ib2wta2V5ZWQgbWV0aG9kcyBjYW5ub3QgYmUsIHNvIHdlIHB1dCB0aG9zZSBpbiBhKi9cbiAgLyogQ29weU1hcCB3aGVuIHByZXNlbnQuKi9cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBNZXRob2RHdWFyZD59ICovXG4gIGNvbnN0IHN0cmluZ01ldGhvZEd1YXJkcyA9IHt9O1xuICAvKiogQHR5cGUge0FycmF5PFtzeW1ib2wsIE1ldGhvZEd1YXJkXT59ICovXG4gIGNvbnN0IHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMgPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygb3duS2V5cyhtZXRob2RHdWFyZHMpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtZXRob2RHdWFyZHNbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChrZXkpXTtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJpbmdNZXRob2RHdWFyZHNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICAvKiogQHR5cGUge0ludGVyZmFjZUd1YXJkfSAqL1xuICBjb25zdCByZXN1bHQgPSBtYWtlVGFnZ2VkKCdndWFyZDppbnRlcmZhY2VHdWFyZCcsIHtcbiAgICBpbnRlcmZhY2VOYW1lLFxuICAgIG1ldGhvZEd1YXJkczogc3RyaW5nTWV0aG9kR3VhcmRzLFxuICAgIC4uLihzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzLmxlbmd0aFxuICAgICAgPyB7IHN5bWJvbE1ldGhvZEd1YXJkczogbWFrZUNvcHlNYXAoc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcykgfVxuICAgICAgOiB7fSksXG4gICAgZGVmYXVsdEd1YXJkcyxcbiAgfSk7XG4gIGFzc2VydEludGVyZmFjZUd1YXJkKHJlc3VsdCk7XG4gIHJldHVybiAvKiogQHR5cGUge0ludGVyZmFjZUd1YXJkPE0+fSAqLyAocmVzdWx0KTtcbn07XG5cbmNvbnN0IEd1YXJkUGF5bG9hZFNoYXBlcyA9IGhhcmRlbih7XG4gICdndWFyZDphd2FpdEFyZ0d1YXJkJzogQXdhaXRBcmdHdWFyZFBheWxvYWRTaGFwZSxcbiAgJ2d1YXJkOnJhd0d1YXJkJzogUmF3R3VhcmRQYXlsb2FkU2hhcGUsXG4gICdndWFyZDptZXRob2RHdWFyZCc6IE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLFxuICAnZ3VhcmQ6aW50ZXJmYWNlR3VhcmQnOiBJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSxcbn0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdExpbWl0cyI6WyJkZWZhdWx0TGltaXRzIl0sImNoZWNrTWF0Y2hlcyI6WyJjaGVja01hdGNoZXMiXSwibWF0Y2hlcyI6WyJtYXRjaGVzIl0sIm11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXSwiYXNzZXJ0UGF0dGVybiI6WyJhc3NlcnRQYXR0ZXJuIl0sImlzUGF0dGVybiI6WyJpc1BhdHRlcm4iXSwiZ2V0UmFua0NvdmVyIjpbImdldFJhbmtDb3ZlciJdLCJNIjpbIk0iXSwia2luZE9mIjpbImtpbmRPZiJdLCJjb250YWluZXJIYXNTcGxpdCI6WyJjb250YWluZXJIYXNTcGxpdCJdLCJBd2FpdEFyZ0d1YXJkU2hhcGUiOlsiQXdhaXRBcmdHdWFyZFNoYXBlIl0sImlzQXdhaXRBcmdHdWFyZCI6WyJpc0F3YWl0QXJnR3VhcmQiXSwiYXNzZXJ0QXdhaXRBcmdHdWFyZCI6WyJhc3NlcnRBd2FpdEFyZ0d1YXJkIl0sIlJhd0d1YXJkU2hhcGUiOlsiUmF3R3VhcmRTaGFwZSJdLCJpc1Jhd0d1YXJkIjpbImlzUmF3R3VhcmQiXSwiYXNzZXJ0UmF3R3VhcmQiOlsiYXNzZXJ0UmF3R3VhcmQiXSwiU3luY1ZhbHVlR3VhcmRTaGFwZSI6WyJTeW5jVmFsdWVHdWFyZFNoYXBlIl0sIlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlIjpbIlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlIl0sIkFyZ0d1YXJkTGlzdFNoYXBlIjpbIkFyZ0d1YXJkTGlzdFNoYXBlIl0sIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlIjpbIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlIl0sIk1ldGhvZEd1YXJkU2hhcGUiOlsiTWV0aG9kR3VhcmRTaGFwZSJdLCJhc3NlcnRNZXRob2RHdWFyZCI6WyJhc3NlcnRNZXRob2RHdWFyZCJdLCJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSI6WyJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSJdLCJJbnRlcmZhY2VHdWFyZFNoYXBlIjpbIkludGVyZmFjZUd1YXJkU2hhcGUiXSwiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiOlsiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAIgAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACwKxYbMJAACzCQAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRozY9fYSldXV1dLFtcIi4vc3JjL21lbW8tcmFjZS5qc1wiLCBbW1wibWVtb1JhY2VcIixbJGjNj19hID0+IChtZW1vUmFjZSA9ICRozY9fYSldXV1dLFtcIi4vc3JjL2lzLXByb21pc2UuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlUHJvbWlzZUtpdCwnbmFtZScse3ZhbHVlOlwibWFrZVByb21pc2VLaXRcIn0pOyRozY9fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywnbmFtZScse3ZhbHVlOlwicmFjZVByb21pc2VzXCJ9KTskaM2PX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7XG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtQcm9taXNlQ29uc3RydWN0b3J9ICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlID0gZ2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZSB8fCBQcm9taXNlO1xuXG4vKipcbiAqIG1ha2VQcm9taXNlS2l0KCkgYnVpbGRzIGEgUHJvbWlzZSBvYmplY3QsIGFuZCByZXR1cm5zIGEgcmVjb3JkXG4gKiBjb250YWluaW5nIHRoZSBwcm9taXNlIGl0c2VsZiwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBmYWNldHMgZm9yIHJlc29sdmluZ1xuICogYW5kIHJlamVjdGluZyBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge0lNUE9SVCgnLi9zcmMvdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+fVxuICovXG4gICAgICAgZnVuY3Rpb24gbWFrZVByb21pc2VLaXQoKSB7XG4gIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBleGVjdXRvciB9ID0gbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH0pO1xufVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLyogTkI6IEFub3RoZXIgaW1wbGVtZW50YXRpb24gZm9yIFByb21pc2UucmFjZSB3b3VsZCBiZSB0byB1c2UgdGhlIHJlbGVhc2luZyBleGVjdXRvciwqL1xuLyogSG93ZXZlciB3aGlsZSBpdCB3b3VsZCBubyBsb25nZXIgbGVhayB0aGUgcmFjZWQgcHJvbWlzZSBvYmplY3RzIHRoZW1zZWx2ZXMsIGl0IHdvdWxkKi9cbi8qIHN0aWxsIGxlYWsgcmVhY3Rpb25zIG9uIHRoZSBub24tcmVzb2x2ZWQgcHJvbWlzZXMgY29udGVuZGluZyBmb3IgdGhlIHJhY2UuKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIHtyZWFkb25seSB1bmtub3duW10gfCBbXX0gVFxuICogQHBhcmFtIHtUfSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFRbbnVtYmVyXT4+fSBBIG5ldyBQcm9taXNlLlxuICovXG4gICAgICAgZnVuY3Rpb24gcmFjZVByb21pc2VzKHZhbHVlcykge1xuICByZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSwgdmFsdWVzKSk7XG59XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA564QmQMDAAADAwAAKwAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCduYW1lJyx7dmFsdWU6XCJpc1Byb21pc2VcIn0pOyRozY9fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsvKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbWF5YmVQcm9taXNlIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7bWF5YmVQcm9taXNlIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbiAgICAgICBmdW5jdGlvbiBpc1Byb21pc2UobWF5YmVQcm9taXNlKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKSA9PT0gbWF5YmVQcm9taXNlO1xufVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMdoTZ9EFgAARBYAACoAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCBgaXNQcmltaXRpdmVgIHRoYXQncyBjdXJyZW50bHkgaW4gYEBlbmRvL3Bhc3Mtc3R5bGVgLlxuICogTGF5ZXJpbmcgY29uc3RyYWludHMgbWFrZSB0aGlzIHRyaWNreSwgd2hpY2ggaXMgd2h5IHdlIGhhdmVuJ3QgeWV0IGZpZ3VyZWRcbiAqIG91dCBob3cgdG8gZG8gdGhpcy5cbiAqXG4gKiBAdHlwZSB7KHZhbDogdW5rbm93bikgPT4gdmFsIGlzICh1bmRlZmluZWRcbiAqIHwgbnVsbFxuICogfCBib29sZWFuXG4gKiB8IG51bWJlclxuICogfCBiaWdpbnRcbiAqIHwgc3RyaW5nXG4gKiB8IHN5bWJvbCl9XG4gKi9cbmNvbnN0IGlzUHJpbWl0aXZlID0gdmFsID0+XG4gICF2YWwgfHwgKHR5cGVvZiB2YWwgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwgIT09ICdmdW5jdGlvbicpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWZlcnJlZFxuICogQHByb3BlcnR5IHsodmFsdWU/OiBJTVBPUlQoXCIuL3R5cGVzLmpzXCIpLkVSZWY8VD4gKSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcHJvcGVydHkgeyhlcnI/OiBhbnkgKSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgbmV2ZXJcbiAqICB8IHtzZXR0bGVkOiBmYWxzZSwgZGVmZXJyZWRzOiBTZXQ8RGVmZXJyZWQ+fVxuICogIHwge3NldHRsZWQ6IHRydWUsIGRlZmVycmVkcz86IHVuZGVmaW5lZH1cbiAqIH0gUHJvbWlzZU1lbW9SZWNvcmRcbiAqL1xuXG4vKiBLZXlzIGFyZSB0aGUgdmFsdWVzIHBhc3NlZCB0byByYWNlLCB2YWx1ZXMgYXJlIGEgcmVjb3JkIG9mIGRhdGEgY29udGFpbmluZyBhKi9cbi8qIHNldCBvZiBkZWZlcnJlZHMgYW5kIHdoZXRoZXIgdGhlIHZhbHVlIGhhcyBzZXR0bGVkLiovXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBQcm9taXNlTWVtb1JlY29yZD59ICovXG5jb25zdCBrbm93blByb21pc2VzID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2VNZW1vUmVjb3JkIHwgdW5kZWZpbmVkfSByZWNvcmRcbiAqIEByZXR1cm5zIHtTZXQ8RGVmZXJyZWQ+fVxuICovXG5jb25zdCBtYXJrU2V0dGxlZCA9IHJlY29yZCA9PiB7XG4gIGlmICghcmVjb3JkIHx8IHJlY29yZC5zZXR0bGVkKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgfVxuXG4gIGNvbnN0IHsgZGVmZXJyZWRzIH0gPSByZWNvcmQ7XG4gIE9iamVjdC5hc3NpZ24ocmVjb3JkLCB7XG4gICAgZGVmZXJyZWRzOiB1bmRlZmluZWQsXG4gICAgc2V0dGxlZDogdHJ1ZSxcbiAgfSk7XG4gIE9iamVjdC5mcmVlemUocmVjb3JkKTtcbiAgcmV0dXJuIGRlZmVycmVkcztcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2VNZW1vUmVjb3JkfVxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkID0gdmFsdWUgPT4ge1xuICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgLyogSWYgdGhlIGNvbnRlbmRlciBpcyBhIHByaW1pdGl2ZSwgYXR0ZW1wdGluZyB0byB1c2UgaXQgYXMgYSBrZXkgaW4gdGhlKi9cbiAgICAvKiB3ZWFrbWFwIHdvdWxkIHRocm93IGFuIGVycm9yLiBMdWNraWx5LCBpdCBpcyBzYWZlIHRvIGNhbGwqL1xuICAgIC8qIGBQcm9taXNlLnJlc29sdmUoY29udGVuZGVyKS50aGVuYCBvbiBhIHByaW1pdGl2ZSB2YWx1ZSBtdWx0aXBsZSB0aW1lcyovXG4gICAgLyogYmVjYXVzZSB0aGUgcHJvbWlzZSBmdWxmaWxscyBpbW1lZGlhdGVseS4gU28gd2UgZmFrZSBhIHNldHRsZWQgcmVjb3JkLiovXG4gICAgcmV0dXJuIGhhcmRlbih7IHNldHRsZWQ6IHRydWUgfSk7XG4gIH1cblxuICBsZXQgcmVjb3JkID0ga25vd25Qcm9taXNlcy5nZXQodmFsdWUpO1xuXG4gIGlmICghcmVjb3JkKSB7XG4gICAgcmVjb3JkID0geyBkZWZlcnJlZHM6IG5ldyBTZXQoKSwgc2V0dGxlZDogZmFsc2UgfTtcbiAgICBrbm93blByb21pc2VzLnNldCh2YWx1ZSwgcmVjb3JkKTtcbiAgICAvKiBUaGlzIGNhbGwgdG8gYHRoZW5gIGhhcHBlbnMgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB2YWx1ZS4qL1xuICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbiAgICAgIHZhbCA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeyByZXNvbHZlIH0gb2YgbWFya1NldHRsZWQocmVjb3JkKSkge1xuICAgICAgICAgIHJlc29sdmUodmFsKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVyciA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeyByZWplY3QgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVjb3JkO1xufTtcblxuY29uc3QgeyByYWNlIH0gPSB7XG4gIC8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7cmVhZG9ubHkgdW5rbm93bltdIHwgW119IFRcbiAqIEB0ZW1wbGF0ZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSBbUD1Qcm9taXNlQ29uc3RydWN0b3JdXG4gKiBAdGhpcyB7UH1cbiAqIEBwYXJhbSB7VH0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUW251bWJlcl0+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xuICByYWNlKHZhbHVlcykge1xuICAgIGxldCBkZWZlcnJlZDtcbiAgICAvKiogQHR5cGUge1suLi5UXX0gKi9cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGZpbGxlZCBieSB0aGUgbG9vcCovXG4gICAgY29uc3QgY2FjaGVkVmFsdWVzID0gW107XG4gICAgY29uc3QgQyA9IHRoaXM7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEMoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZGVmZXJyZWQgPSB7IHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICBjb25zdCB7IHNldHRsZWQsIGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChzZXR0bGVkKSB7XG4gICAgICAgICAgLyogSWYgdGhlIGNvbnRlbmRlciBpcyBzZXR0bGVkIChpbmNsdWRpbmcgcHJpbWl0aXZlcyksIGl0IGlzIHNhZmUqL1xuICAgICAgICAgIC8qIHRvIGNhbGwgYFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbmAgb24gaXQuKi9cbiAgICAgICAgICBDLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyogVGhlIGZpbmFsbHkgY2FsbGJhY2sgZXhlY3V0ZXMgd2hlbiBhbnkgdmFsdWUgc2V0dGxlcywgcHJldmVudGluZyBhbnkgb2YqL1xuICAgIC8qIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBmcm9tIHJldGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb2x2ZWQgdmFsdWUuKi9cbiAgICByZXR1cm4gcmVzdWx0LmZpbmFsbHkoKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjYWNoZWRWYWx1ZXMpIHtcbiAgICAgICAgY29uc3QgeyBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoZGVmZXJyZWRzKSB7XG4gICAgICAgICAgZGVmZXJyZWRzLmRlbGV0ZShkZWZlcnJlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbn07JGjNj19vbmNlLnJhY2UocmFjZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAifqGgdCAAAHQgAADUAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBQcm9taXNlRXhlY3V0b3IgVGhlIHByb21pc2UgZXhlY3V0b3JcbiAqIEBwYXJhbSB7KHZhbHVlOiBJTVBPUlQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKSBidWlsZHMgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIHdoaWNoIGRyb3AgcmVmZXJlbmNlc1xuICogdG8gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBnYXRoZXJlZCBmcm9tIGFuIGV4ZWN1dG9yIHRvIGJlIHVzZWQgd2l0aCBhXG4gKiBwcm9taXNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UGljazxJTVBPUlQoJy4vdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+LCAncmVzb2x2ZScgfCAncmVqZWN0Jz4gJiB7IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8VD59fVxuICovXG4gICAgICAgY29uc3QgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gKCkgPT4ge1xuICAvKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHZhbHVlOiBJTVBPUlQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkKX0gKi9cbiAgbGV0IGludGVybmFsUmVzb2x2ZTtcbiAgLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKChyZWFzb246IHVua25vd24pID0+IHZvaWQpfSAqL1xuICBsZXQgaW50ZXJuYWxSZWplY3Q7XG5cbiAgLyoqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbiAgY29uc3QgcmVzb2x2ZSA9IHZhbHVlID0+IHtcbiAgICBpZiAoaW50ZXJuYWxSZXNvbHZlKSB7XG4gICAgICBpbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVzb2x2ZSA9PT0gbnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuICBjb25zdCByZWplY3QgPSByZWFzb24gPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlamVjdCkge1xuICAgICAgaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbiAgICAgIGludGVybmFsUmVzb2x2ZSA9IG51bGw7XG4gICAgICBpbnRlcm5hbFJlamVjdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChpbnRlcm5hbFJlamVjdCA9PT0gbnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGV4ZWN1dG9yID0gKHJlcywgcmVqKSA9PiB7XG4gICAgYXNzZXJ0KGludGVybmFsUmVzb2x2ZSA9PT0gdW5kZWZpbmVkICYmIGludGVybmFsUmVqZWN0ID09PSB1bmRlZmluZWQpO1xuICAgIGludGVybmFsUmVzb2x2ZSA9IHJlcztcbiAgICBpbnRlcm5hbFJlamVjdCA9IHJlajtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgcmVzb2x2ZSwgcmVqZWN0LCBleGVjdXRvciB9KTtcbn07JGjNj19vbmNlLm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xuaGFyZGVuKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAs5nu6URwAAFEcAAAdAAAAQGVuZG8vc3RyZWFtLXYxLjIuMTMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZVBpcGUiLCJtYWtlUXVldWUiLCJtYWtlU3RyZWFtIiwibWFwUmVhZGVyIiwibWFwV3JpdGVyIiwicHJpbWUiLCJwdW1wIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxtYWtlUHJvbWlzZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogVHlwZVNjcmlwdCBSZWFkT25seSBzZW1hbnRpY3MgYXJlIG5vdCBzdWZmaWNpZW50bHkgZXhwcmVzc2l2ZSB0byBkaXN0aW5ndWlzaCovXG4vKiBhIHZhbHVlIG9uZSBwcm9taXNlcyBub3QgdG8gYWx0ZXIgZnJvbSBhIHZhbHVlIG9uZSBtdXN0IG5vdCBhbHRlciwqL1xuLyogbWFraW5nIGl0IHVzZWxlc3MuKi9cbmNvbnN0IGZyZWV6ZSA9IC8qKiBAdHlwZSB7PFQ+KHY6IFQgfCBSZWFkb25seTxUPikgPT4gVH0gKi8gKE9iamVjdC5mcmVlemUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXN5bmNRdWV1ZTxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VRdWV1ZSA9ICgpID0+IHtcbiAgbGV0IHsgcHJvbWlzZTogdGFpbFByb21pc2UsIHJlc29sdmU6IHRhaWxSZXNvbHZlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICByZXR1cm4ge1xuICAgIHB1dCh2YWx1ZSkge1xuICAgICAgY29uc3QgeyByZXNvbHZlLCBwcm9taXNlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgdGFpbFJlc29sdmUoZnJlZXplKHsgdmFsdWUsIHByb21pc2UgfSkpO1xuICAgICAgdGFpbFJlc29sdmUgPSByZXNvbHZlO1xuICAgIH0sXG4gICAgZ2V0KCkge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IHRhaWxQcm9taXNlLnRoZW4obmV4dCA9PiBuZXh0LnZhbHVlKTtcbiAgICAgIHRhaWxQcm9taXNlID0gdGFpbFByb21pc2UudGhlbihuZXh0ID0+IG5leHQucHJvbWlzZSk7XG4gICAgICByZXR1cm4gaGFyZGVuKHByb21pc2UpO1xuICAgIH0sXG4gIH07XG59OyRozY9fb25jZS5tYWtlUXVldWUobWFrZVF1ZXVlKTtcbmhhcmRlbihtYWtlUXVldWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUUmVhZFxuICogQHRlbXBsYXRlIFRXcml0ZVxuICogQHRlbXBsYXRlIFRSZWFkUmV0dXJuXG4gKiBAdGVtcGxhdGUgVFdyaXRlUmV0dXJuXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkFzeW5jU3ByaW5nPEl0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmVhZFJldHVybj4+fSBhY2tzXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkFzeW5jU2luazxJdGVyYXRvclJlc3VsdDxUV3JpdGUsIFRXcml0ZVJldHVybj4+fSBkYXRhXG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3RyZWFtID0gKGFja3MsIGRhdGEpID0+IHtcbiAgY29uc3Qgc3RyZWFtID0gaGFyZGVuKHtcbiAgICAvKipcbiAqIEBwYXJhbSB7VFdyaXRlfSB2YWx1ZVxuICovXG4gICAgbmV4dCh2YWx1ZSkge1xuICAgICAgLyogTm90ZSB0aGUgc2hhbGxvdyBmcmVlemUgc2luY2UgdmFsdWUgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgZnJlZXphYmxlKi9cbiAgICAgIC8qICh0eXBlZCBhcnJheXMgYXJlIG5vdCkuKi9cbiAgICAgIGRhdGEucHV0KGZyZWV6ZSh7IHZhbHVlLCBkb25lOiBmYWxzZSB9KSk7XG4gICAgICByZXR1cm4gYWNrcy5nZXQoKTtcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHtUV3JpdGVSZXR1cm59IHZhbHVlXG4gKi9cbiAgICByZXR1cm4odmFsdWUpIHtcbiAgICAgIGRhdGEucHV0KGZyZWV6ZSh7IHZhbHVlLCBkb25lOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICovXG4gICAgdGhyb3coZXJyb3IpIHtcbiAgICAgIGRhdGEucHV0KGhhcmRlbihQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59OyRozY9fb25jZS5tYWtlU3RyZWFtKG1ha2VTdHJlYW0pO1xuaGFyZGVuKG1ha2VTdHJlYW0pO1xuXG4vKiBKU0RvYyBUeXBlU2NyaXB0IHNlZW1zIHVuYWJsZSB0byBleHByZXNzIHRoaXMgcGFydGljdWxhciBmdW5jdGlvbidzKi9cbi8qIGVudGFuZ2xlbWVudCBvZiBxdWV1ZXMsIGJ1dCB0aGUgZGVmaW5pdGlvbiBpbiB0eXBlcy5kLnRzIHdvcmtzIGZvciB0aGUgZW5kKi9cbi8qIHVzZXIuKi9cbiAgICAgICBjb25zdCBtYWtlUGlwZSA9ICgpID0+IHtcbiAgY29uc3QgZGF0YSA9IG1ha2VRdWV1ZSgpO1xuICBjb25zdCBhY2tzID0gbWFrZVF1ZXVlKCk7XG4gIGNvbnN0IHJlYWRlciA9IG1ha2VTdHJlYW0oYWNrcywgZGF0YSk7XG4gIGNvbnN0IHdyaXRlciA9IG1ha2VTdHJlYW0oZGF0YSwgYWNrcyk7XG4gIHJldHVybiBoYXJkZW4oW3dyaXRlciwgcmVhZGVyXSk7XG59OyRozY9fb25jZS5tYWtlUGlwZShtYWtlUGlwZSk7XG5oYXJkZW4obWFrZVBpcGUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUUmVhZFxuICogQHRlbXBsYXRlIFRXcml0ZVxuICogQHRlbXBsYXRlIFRSZWFkUmV0dXJuXG4gKiBAdGVtcGxhdGUgVFdyaXRlUmV0dXJuXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlN0cmVhbTxUV3JpdGUsIFRSZWFkLCBUV3JpdGVSZXR1cm4sIFRSZWFkUmV0dXJuPn0gd3JpdGVyXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlN0cmVhbTxUUmVhZCwgVFdyaXRlLCBUUmVhZFJldHVybiwgVFdyaXRlUmV0dXJuPn0gcmVhZGVyXG4gKiBAcGFyYW0ge1RXcml0ZX0gcHJpbWVyXG4gKi9cbiAgICAgICBjb25zdCBwdW1wID0gYXN5bmMgKHdyaXRlciwgcmVhZGVyLCBwcmltZXIpID0+IHtcbiAgLyoqIEBwYXJhbSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJlYWRSZXR1cm4+Pn0gcHJvbWlzZSAqL1xuICBjb25zdCB0aWNrID0gcHJvbWlzZSA9PlxuICAgIEUud2hlbihcbiAgICAgIHByb21pc2UsXG4gICAgICByZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gd3JpdGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qIEJlaG9sZDogbXV0dWFsIHJlY3Vyc2lvbi4qL1xuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICAgICAgcmV0dXJuIHRvY2sod3JpdGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoLyoqIEB0eXBlIHtFcnJvcn0gKi8gZXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gICAgICB9LFxuICAgICk7XG4gIC8qKiBAcGFyYW0ge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VFdyaXRlLCBUV3JpdGVSZXR1cm4+Pn0gcHJvbWlzZSAqL1xuICBjb25zdCB0b2NrID0gcHJvbWlzZSA9PlxuICAgIEUud2hlbihcbiAgICAgIHByb21pc2UsXG4gICAgICByZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gcmVhZGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aWNrKHJlYWRlci5uZXh0KHJlc3VsdC52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKC8qKiBAdHlwZSB7RXJyb3J9ICovIGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiByZWFkZXIudGhyb3coZXJyb3IpO1xuICAgICAgfSxcbiAgICApO1xuICBhd2FpdCB0aWNrKHJlYWRlci5uZXh0KHByaW1lcikpO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufTskaM2PX29uY2UucHVtcChwdW1wKTtcbmhhcmRlbihwdW1wKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmV0dXJuXG4gKiBAcGFyYW0ge0FzeW5jR2VuZXJhdG9yPFRSZWFkLCBUUmV0dXJuLCBUV3JpdGU+fSBnZW5lcmF0b3JcbiAqIEBwYXJhbSB7VFdyaXRlfSBwcmltZXJcbiAqL1xuICAgICAgIGNvbnN0IHByaW1lID0gKGdlbmVyYXRvciwgcHJpbWVyKSA9PiB7XG4gIC8qIFdlIGNhcHR1cmUgdGhlIGZpcnN0IHJldHVybmVkIHByb21pc2UuKi9cbiAgY29uc3QgZmlyc3QgPSBnZW5lcmF0b3IubmV4dChwcmltZXIpO1xuICAvKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmV0dXJuPj19ICovXG4gIGxldCByZXN1bHQ7XG4gIGNvbnN0IHByaW1lZCA9IGhhcmRlbih7XG4gICAgLyoqIEBwYXJhbSB7VFdyaXRlfSB2YWx1ZSAqL1xuICAgIGFzeW5jIG5leHQodmFsdWUpIHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGplc3NpZS5qcy9zYWZlLWF3YWl0LXNlcGFyYXRvciovXG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGZpcnN0O1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLm5leHQodmFsdWUpO1xuICAgIH0sXG4gICAgLyoqIEBwYXJhbSB7VFJldHVybn0gdmFsdWUgKi9cbiAgICBhc3luYyByZXR1cm4odmFsdWUpIHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGplc3NpZS5qcy9zYWZlLWF3YWl0LXNlcGFyYXRvciovXG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGZpcnN0O1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLnJldHVybih2YWx1ZSk7XG4gICAgfSxcbiAgICAvKiogQHBhcmFtIHtFcnJvcn0gZXJyb3IgKi9cbiAgICBhc3luYyB0aHJvdyhlcnJvcikge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAamVzc2llLmpzL3NhZmUtYXdhaXQtc2VwYXJhdG9yKi9cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmlyc3Q7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLnRocm93KGVycm9yKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHByaW1lZDtcbn07JGjNj19vbmNlLnByaW1lKHByaW1lKTtcbmhhcmRlbihwcmltZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRJblxuICogQHRlbXBsYXRlIFRPdXRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZGVyPFRJbj59IHJlYWRlclxuICogQHBhcmFtIHsodmFsdWU6IFRJbikgPT4gVE91dH0gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZGVyPFRPdXQ+fVxuICovXG4gICAgICAgY29uc3QgbWFwUmVhZGVyID0gKHJlYWRlciwgdHJhbnNmb3JtKSA9PiB7XG4gIGFzeW5jIGZ1bmN0aW9uKiB0cmFuc2Zvcm1HZW5lcmF0b3IoKSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiByZWFkZXIpIHtcbiAgICAgIHlpZWxkIHRyYW5zZm9ybSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaGFyZGVuKHRyYW5zZm9ybUdlbmVyYXRvcik7XG4gIHJldHVybiBoYXJkZW4odHJhbnNmb3JtR2VuZXJhdG9yKCkpO1xufTskaM2PX29uY2UubWFwUmVhZGVyKG1hcFJlYWRlcik7XG5oYXJkZW4obWFwUmVhZGVyKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVEluXG4gKiBAdGVtcGxhdGUgVE91dFxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Xcml0ZXI8VE91dD59IHdyaXRlclxuICogQHBhcmFtIHsodmFsdWU6IFRJbikgPT4gVE91dH0gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuV3JpdGVyPFRJbj59XG4gKi9cbiAgICAgICBjb25zdCBtYXBXcml0ZXIgPSAod3JpdGVyLCB0cmFuc2Zvcm0pID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtZWRXcml0ZXIgPSBoYXJkZW4oe1xuICAgIC8qKlxuICogQHBhcmFtIHtUSW59IHZhbHVlXG4gKi9cbiAgICBhc3luYyBuZXh0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gd3JpdGVyLm5leHQodHJhbnNmb3JtKHZhbHVlKSk7XG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKi9cbiAgICBhc3luYyB0aHJvdyhlcnJvcikge1xuICAgICAgcmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSB2YWx1ZVxuICovXG4gICAgYXN5bmMgcmV0dXJuKHZhbHVlKSB7XG4gICAgICByZXR1cm4gd3JpdGVyLnJldHVybih2YWx1ZSk7XG4gICAgfSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkV3JpdGVyO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG59OyRozY9fb25jZS5tYXBXcml0ZXIobWFwV3JpdGVyKTtcbmhhcmRlbihtYXBXcml0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVF1ZXVlIjpbIm1ha2VRdWV1ZSJdLCJtYWtlU3RyZWFtIjpbIm1ha2VTdHJlYW0iXSwibWFrZVBpcGUiOlsibWFrZVBpcGUiXSwicHVtcCI6WyJwdW1wIl0sInByaW1lIjpbInByaW1lIl0sIm1hcFJlYWRlciI6WyJtYXBSZWFkZXIiXSwibWFwV3JpdGVyIjpbIm1hcFdyaXRlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADuW/a/0QEAANEBAAAcAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvbWFpbi5qc3siaW1wb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9yaW5nMC9tYWluLmpzXCIsIFtdXSxbXCIuL3JpbmcxL21haW4uanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9mAl5IEBAACBAQAAHwAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL0UuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiQGVuZG8vZmFyIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADehziD9QMAAPUDAAAsAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzeW5jR2VuZXJhdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXN5bmMgaXRlcmFibGUgdGhhdCBwcm9kdWNlcyBpdGVyYXRvciByZXN1bHRzIHZpYSBgbmV4dGAuXG4gKlxuICogVGhpcyB3b3JrcyBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgU3ltYm9sLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFRSZXR1cm5cbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4gfFxuICogICAgICAgICAgICAgICBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PlxuICogfSBuZXh0IHByb2R1Y2UgYSBzaW5nbGUtc3RlcCBpdGVyYXRvciByZXN1bHRcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG4gICAgICAgY29uc3QgYXN5bmNHZW5lcmF0ZSA9IG5leHQgPT4ge1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogYXN5bmMgKCkgPT4gaGFyZGVuKG5leHQoKSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLmFzeW5jR2VuZXJhdGUoYXN5bmNHZW5lcmF0ZSk7XG5oYXJkZW4oYXN5bmNHZW5lcmF0ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0dlbmVyYXRlIjpbImFzeW5jR2VuZXJhdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/nr5/fQBAAD0AQAAIgAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21haW4uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9tYWtlcnMuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9FLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyIsIi4vbWFrZXJzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbXV0sW1wiLi9tYWtlcnMuanNcIiwgW11dLFtcIi4vYXN5bmMtZ2VuZXJhdGUuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwxmxeDMJAAAzCQAAJAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21ha2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZU1hcCIsIm1ha2VQcm9taXNlIiwibWFrZVNldCIsIm1ha2VXZWFrTWFwIiwibWFrZVdlYWtTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cbi8qIFRoZXNlIHdvcmsgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIGBuZXdgLiovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiIC8+Ki9cblxuLyoqXG4gKiBAdHlwZSB7PFQ+KGV4ZWN1dG9yOiAoXG4gKiAgIHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZCxcbiAqICAgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkXG4gKiApID0+IHZvaWQpID0+IFByb21pc2U8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUHJvbWlzZSA9IGV4ZWN1dG9yID0+IGhhcmRlbihuZXcgUHJvbWlzZShleGVjdXRvcikpOyRozY9fb25jZS5tYWtlUHJvbWlzZShtYWtlUHJvbWlzZSk7XG5oYXJkZW4obWFrZVByb21pc2UpO1xuXG4vKiogQHR5cGVkZWYgezxLLCBWPihlbnRyaWVzPzogcmVhZG9ubHkgKHJlYWRvbmx5IFtLLCBWXSlbXSkgPT4gTWFwPEssIFY+fSBNYXBGcm9tRW50cmllcyAqL1xuLyoqIEB0eXBlZGVmIHs8SywgVj4oaXRlcmFibGU6IEl0ZXJhYmxlPHJlYWRvbmx5IFtLLCBWXT4pID0+IE1hcDxLLCBWPn0gTWFwRnJvbUl0ZXJhYmxlICovXG5cbi8qKiBAdHlwZSB7TWFwRnJvbUVudHJpZXMgJiBNYXBGcm9tSXRlcmFibGV9ICovXG4gICAgICAgY29uc3QgbWFrZU1hcCA9IGVudHJpZXNPckl0ZXJhYmxlID0+IGhhcmRlbihuZXcgTWFwKGVudHJpZXNPckl0ZXJhYmxlKSk7JGjNj19vbmNlLm1ha2VNYXAobWFrZU1hcCk7XG5oYXJkZW4obWFrZU1hcCk7XG5cbi8qKiBAdHlwZWRlZiB7PFQ+KHZhbHVlcz86IHJlYWRvbmx5IFRbXSkgPT4gU2V0PFQ+fSBTZXRGcm9tVmFsdWVzICovXG4vKiogQHR5cGVkZWYgezxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4pID0+IFNldDxUPn0gU2V0RnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1NldEZyb21WYWx1ZXMgJiBTZXRGcm9tSXRlcmFibGV9ICovXG4gICAgICAgY29uc3QgbWFrZVNldCA9IHZhbHVlcyA9PiBoYXJkZW4obmV3IFNldCh2YWx1ZXMpKTskaM2PX29uY2UubWFrZVNldChtYWtlU2V0KTtcbmhhcmRlbihtYWtlU2V0KTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7PEsgZXh0ZW5kcyB7fSwgViA9IGFueT4oXG4gKiAgICBlbnRyaWVzPzogcmVhZG9ubHkgW0ssIFZdW10gfCBudWxsXG4gKiApID0+IFdlYWtNYXA8SywgVj59IFdlYWtNYXBGcm9tRW50cmllc1xuICovXG4vKiogQHR5cGVkZWYgezxLIGV4dGVuZHMge30sIFY+KGl0ZXJhYmxlOiBJdGVyYWJsZTxbSywgVl0+KSA9PiBXZWFrTWFwPEssIFY+fSBXZWFrTWFwRnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1dlYWtNYXBGcm9tRW50cmllcyAmIFdlYWtNYXBGcm9tSXRlcmFibGV9ICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtNYXAgPSBlbnRyaWVzID0+IGhhcmRlbihuZXcgV2Vha01hcChlbnRyaWVzKSk7JGjNj19vbmNlLm1ha2VXZWFrTWFwKG1ha2VXZWFrTWFwKTtcbmhhcmRlbihtYWtlV2Vha01hcCk7XG5cbi8qKiBAdHlwZWRlZiB7PFQgZXh0ZW5kcyB7fT4odmFsdWVzPzogcmVhZG9ubHkgVFtdKSA9PiBXZWFrU2V0PFQ+fSBXZWFrU2V0RnJvbVZhbHVlcyAqL1xuLyoqIEB0eXBlZGVmIHs8VCBleHRlbmRzIHt9PihpdGVyYWJsZTogSXRlcmFibGU8VD4pID0+IFdlYWtTZXQ8VD59IFdlYWtTZXRGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7V2Vha1NldEZyb21WYWx1ZXMgJiBXZWFrU2V0RnJvbUl0ZXJhYmxlfSAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrU2V0ID0gdmFsdWVzID0+IGhhcmRlbihuZXcgV2Vha1NldCh2YWx1ZXMpKTskaM2PX29uY2UubWFrZVdlYWtTZXQobWFrZVdlYWtTZXQpO1xuaGFyZGVuKG1ha2VXZWFrU2V0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlIjpbIm1ha2VQcm9taXNlIl0sIm1ha2VNYXAiOlsibWFrZU1hcCJdLCJtYWtlU2V0IjpbIm1ha2VTZXQiXSwibWFrZVdlYWtNYXAiOlsibWFrZVdlYWtNYXAiXSwibWFrZVdlYWtTZXQiOlsibWFrZVdlYWtTZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAaVR4XlIFAABSBQAAKQAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzeyJpbXBvcnRzIjpbIi4uL3JpbmcwL21haW4uanMiXSwiZXhwb3J0cyI6WyJhc3luY0RvV2hpbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlUHJvbWlzZTskaM2PX2ltcG9ydHMoW1tcIi4uL3JpbmcwL21haW4uanNcIiwgW1tcIm1ha2VQcm9taXNlXCIsWyRozY9fYSA9PiAobWFrZVByb21pc2UgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBSZXNvbHZlIHJldHVybmVkIHByb21pc2Ugd2l0aCB1bmRlZmluZWQgd2hlbiBgYm9keWAgcmV0dXJucyBmYWxzeS5cbiAqXG4gKiBUaGlzIHdvcmtzIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBgYXdhaXRgIG5vdCBhdCB0aGUgZnVuY3Rpb24tbGV2ZWwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVCB8IFByb21pc2U8VD59IGJvZHkgcGVyZm9ybSBzaWRlLWVmZmVjdHMsIGFuZCByZXR1cm4gdHJ1dGh5IGlmXG4gKiB3ZSBzaG91bGQgcnVuIGFnYWluXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuICAgICAgIGNvbnN0IGFzeW5jRG9XaGlsZSA9IGJvZHkgPT4ge1xuICByZXR1cm4gbWFrZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGxvb3AgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkb0NvbnRpbnVlID0gYXdhaXQgYm9keSgpO1xuICAgICAgaWYgKCFkb0NvbnRpbnVlKSB7XG4gICAgICAgIC8qIFJlc29sdmUgdGhlIG91dGVybW9zdCBwcm9taXNlLiovXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvKiBEbyB0aGUgbG9vcCBhZ2Fpbi4gIFdlIGFyZSBjYXJlZnVsIG5vdCB0byBhd2FpdCBzbyB0aGF0IHdlIGRvbid0IGNyZWF0ZSBhKi9cbiAgICAgIC8qIHByb21pc2UgY2hhaW4uKi9cbiAgICAgIGxvb3AoKS5jYXRjaChyZWplY3QpO1xuICAgIH07XG5cbiAgICBsb29wKCkuY2F0Y2gocmVqZWN0KTtcbiAgfSk7XG59OyRozY9fb25jZS5hc3luY0RvV2hpbGUoYXN5bmNEb1doaWxlKTtcbmhhcmRlbihhc3luY0RvV2hpbGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNEb1doaWxlIjpbImFzeW5jRG9XaGlsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAbaDcDlgEAAJYBAAAiAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvbWFpbi5qc3siaW1wb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2FzeW5jLXRvb2xzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAA31uIFRQsAQAULAEAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAMYBI+I0BAACNAQAAIAAAAAAAAAAAAAAApIFGLAEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL2hlYXAuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIERLgEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAABMzBZHzCwAA8wsAACQAAAAAAAAAAAAAAKSBri8BAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAAAVbrH6eQIAAHkCAAAlAAAAAAAAAAAAAACkgeM7AQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAC1M1ZEhAwAAIQMAACsAAAAAAAAAAAAAAKSBnz4BAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaXMtcGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAbBWnPyIEAAAiBAAAJAAAAAAAAAAAAAAApIEJQgEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9rZXlzLmpzUEsBAh4DCgAAAAAAAAAAAKkbjar6DgAA+g4AACkAAAAAAAAAAAAAAKSBbUYBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvbWFrZS1vbmNlLmpzUEsBAh4DCgAAAAAAAAAAAAIBO5SAGgAAgBoAADIAAAAAAAAAAAAAAKSBrlUBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvcHJlcGFyZS1hdHRlbnVhdG9yLmpzUEsBAh4DCgAAAAAAAAAAAB3bPYhyFAAAchQAADEAAAAAAAAAAAAAAKSBfnABAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvcHJlcGFyZS1yZXZvY2FibGUuanNQSwECHgMKAAAAAAAAAAAAYL/aGKsNAACrDQAALQAAAAAAAAAAAAAApIE/hQEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy93YXRjaC1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAGwksGoWAgAAFgIAACgAAAAAAAAAAAAAAKSBNZMBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC96b25lLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAA4YOdgOc8AADnPAAAJgAAAAAAAAAAAAAApIGRlQEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudE1hdGguanNQSwECHgMKAAAAAAAAAAAAX+m9XnoFAAB6BQAAJwAAAAAAAAAAAAAApIG80gEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAEO9e9l0BgAAdAYAACcAAAAAAAAAAAAAAKSBe9gBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9kaXNwbGF5SW5mby5qc1BLAQIeAwoAAAAAAAAAAADzX00DTQIAAE0CAAAhAAAAAAAAAAAAAACkgTTfAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAaD6Qc8c8AADHPAAAJQAAAAAAAAAAAAAApIHA4QEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2lzc3VlcktpdC5qc1BLAQIeAwoAAAAAAAAAAABU59wlEwYAABMGAAA6AAAAAAAAAAAAAACkgcoeAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAFod70kmBgAAJgYAADoAAAAAAAAAAAAAAKSBNSUCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAGfMtfs8GAADPBgAANgAAAAAAAAAAAAAApIGzKwIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAD3cNf/9BwAA/QcAADYAAAAAAAAAAAAAAKSB1jICAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAycsRKWAUAAFgFAAAjAAAAAAAAAAAAAACkgSc7AgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudC5qc1BLAQIeAwoAAAAAAAAAAADYJ0h2vjYAAL42AAApAAAAAAAAAAAAAACkgcBAAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudExlZGdlci5qc1BLAQIeAwoAAAAAAAAAAAA+IJ6JlxwAAJccAAAhAAAAAAAAAAAAAACkgcV3AgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcHVyc2UuanNQSwECHgMKAAAAAAAAAAAAvquhcic9AAAnPQAAIQAAAAAAAAAAAAAApIGblAIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3JhdGlvLmpzUEsBAh4DCgAAAAAAAAAAAHAvFuWKBwAAigcAACQAAAAAAAAAAAAAAKSBAdICAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9zYWZlTWF0aC5qc1BLAQIeAwoAAAAAAAAAAABg5KxbGQcAABkHAAAtAAAAAAAAAAAAAACkgc3ZAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAA5frfq0AtAABALQAAJgAAAAAAAAAAAAAApIEx4QIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIG1DgMAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAAAUYC9zZLAAA2SwAACcAAAAAAAAAAAAAAKSBUhADAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jYWxsYmFjay5qc1BLAQIeAwoAAAAAAAAAAACjNk+m9QQAAPUEAAAoAAAAAAAAAAAAAACkgXA9AwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2xpLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAG0NeBXKDAAAygwAACUAAAAAAAAAAAAAAKSBq0IDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanNQSwECHgMKAAAAAAAAAAAAjb2mAa4IAACuCAAAJAAAAAAAAAAAAAAApIG4TwMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzUEsBAh4DCgAAAAAAAAAAALGT1Y5eAwAAXgMAACUAAAAAAAAAAAAAAKSBqFgDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9lcnJvcnMuanNQSwECHgMKAAAAAAAAAAAAaBzsGv4EAAD+BAAAJAAAAAAAAAAAAAAApIFJXAMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKrVr42mJQAApiUAACcAAAAAAAAAAAAAAKSBiWEDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9qcy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAAi9VLVrAcAAKwHAAAoAAAAAAAAAAAAAACkgXSHAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMva2V5TWlycm9yLmpzUEsBAh4DCgAAAAAAAAAAAKVsHvRVLQAAVS0AAC8AAAAAAAAAAAAAAKSBZo8DAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAACNFcvqnAwAApwMAADcAAAAAAAAAAAAAAKSBCL0DAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsL2luYWNjZXNzaWJsZS12YWwuanNQSwECHgMKAAAAAAAAAAAApIPPnrEDAACxAwAAMAAAAAAAAAAAAAAApIEEwQMAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvcHVyZS1kYXRhLmpzUEsBAh4DCgAAAAAAAAAAANZdM97lPAAA5TwAADYAAAAAAAAAAAAAAKSBA8UDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qc1BLAQIeAwoAAAAAAAAAAAAr7RBF8Q0AAPENAAArAAAAAAAAAAAAAACkgTwCBABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAJD9IHigQgAAoEIAACYAAAAAAAAAAAAAAKSBdhAEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRyaWNzLmpzUEsBAh4DCgAAAAAAAAAAAIq5WvK2DgAAtg4AACsAAAAAAAAAAAAAAKSBWlMEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9uYXR1cmFsLXNvcnQuanNQSwECHgMKAAAAAAAAAAAAT8Qll2pIAABqSAAAKAAAAAAAAAAAAAAApIFZYgQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3Nlcy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAADR3g3QkRIAAJESAAAsAAAAAAAAAAAAAACkgQmrBABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdGVzdGluZy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAADaiNsr1gMAANYDAAAlAAAAAAAAAAAAAACkgeS9BABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdG1wRGlyLmpzUEsBAh4DCgAAAAAAAAAAAE5ip5ahBAAAoQQAACgAAAAAAAAAAAAAAKSB/cEEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlQ2hlY2suanNQSwECHgMKAAAAAAAAAAAAq3x1xKMFAACjBQAAKQAAAAAAAAAAAAAApIHkxgQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAAAAAAAAAAAApIHOzAQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAANeHGT1wDAAAcAwAACoAAAAAAAAAAAAAAKSBbs4EAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91cGdyYWRlLWFwaS5qc1BLAQIeAwoAAAAAAAAAAAA/4UE8GRQAABkUAAAzAAAAAAAAAAAAAACkgSbbBABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNQSwECHgMKAAAAAAAAAAAAwj7tuOsHAADrBwAAJAAAAAAAAAAAAAAApIGQ7wQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALNJ/07FGwAAxRsAACcAAAAAAAAAAAAAAKSBvfcEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAbIRejM0IAADNCAAAqAAAAAAAAAAAAAACkgccTBQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvcHVibGlzaC1raXQuanNQSwECHgMKAAAAAAAAAAAALEhEN6oMAACqDAAALgAAAAAAAAAAAAAApIFCVgUAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAB65k5eJCYAACQmAAAnAAAAAAAAAAAAAACkgThjBQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVzdWIuanNQSwECHgMKAAAAAAAAAAAAZA69fPIpAADyKQAAKAAAAAAAAAAAAAAApIGhiQUAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZS5qc1BLAQIeAwoAAAAAAAAAAABXqgSRKQ0AACkNAAApAAAAAAAAAAAAAACkgdmzBQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlci5qc1BLAQIeAwoAAAAAAAAAAAB35kpGlQYAAJUGAAAkAAAAAAAAAAAAAACkgUnBBQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdG9waWMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAAAAAAAAAAAApIEgyAUAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAANxz0z1gBwAAYAcAAC0AAAAAAAAAAAAAAKSBwMkFAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAAA1mrasbRwAAG0cAAAuAAAAAAAAAAAAAACkgWvRBQBAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjMvc3JjL2ludml0YXRpb25zLmpzUEsBAh4DCgAAAAAAAAAAAFVv5/IWOgAAFjoAAC8AAAAAAAAAAAAAAKSBJO4FAEBhZ29yaWMvc21hcnQtd2FsbGV0LXYwLjUuMy9zcmMvb2ZmZXJXYXRjaGVyLmpzUEsBAh4DCgAAAAAAAAAAAOu3CuV3BwAAdwcAACkAAAAAAAAAAAAAAKSBhygGAEBhZ29yaWMvc21hcnQtd2FsbGV0LXYwLjUuMy9zcmMvb2ZmZXJzLmpzUEsBAh4DCgAAAAAAAAAAAKOf8iivxQAAr8UAAC4AAAAAAAAAAAAAAKSBRTAGAEBhZ29yaWMvc21hcnQtd2FsbGV0LXYwLjUuMy9zcmMvc21hcnRXYWxsZXQuanNQSwECHgMKAAAAAAAAAAAAIbk3A80MAADNDAAALQAAAAAAAAAAAAAApIFA9gYAQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAI/+FtDgFQAA4BUAACgAAAAAAAAAAAAAAKSBWAMHAEBhZ29yaWMvc21hcnQtd2FsbGV0LXYwLjUuMy9zcmMvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAYe3O7jQ3AAA0NwAAMAAAAAAAAAAAAAAApIF+GQcAQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS4zL3NyYy93YWxsZXRGYWN0b3J5LmpzUEsBAh4DCgAAAAAAAAAAAEcacpNGDgAARg4AACEAAAAAAAAAAAAAAKSBAFEHAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAP0kYu4gsAAOILAAAsAAAAAAAAAAAAAACkgYVfBwBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc1BLAQIeAwoAAAAAAAAAAADbxEI1bQcAAG0HAAAwAAAAAAAAAAAAAACkgbFrBwBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNQSwECHgMKAAAAAAAAAAAA16FBRuoYAADqGAAAMQAAAAAAAAAAAAAApIFscwcAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACmQkq1EREAABERAAAxAAAAAAAAAAAAAACkgaWMBwBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAPk186ftFgAA7RYAADUAAAAAAAAAAAAAAKSBBZ4HAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAJRapRtOEQAAThEAADUAAAAAAAAAAAAAAKSBRbUHAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAKpX7y7bGgAA2xoAAC4AAAAAAAAAAAAAAKSB5sYHAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIEN4gcAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAAO31mJswAgAAMAIAABwAAAAAAAAAAAAAAKSBquMHAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAtDNtlAolAAAKJQAAIwAAAAAAAAAAAAAApIEU5gcAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdGltZU1hdGguanNQSwECHgMKAAAAAAAAAAAANPYVxPMJAADzCQAAJQAAAAAAAAAAAAAApIFfCwgAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAAAAAAAAAAACkgZUVCABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAA2D1iULSwAAC0sAAAoAAAAAAAAAAAAAACkgTEXCABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAM+c6+m2CAAAtggAACQAAAAAAAAAAAAAAKSBpEMIAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADvd74wOSMAADkjAAAwAAAAAAAAAAAAAACkgZxMCABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAA+u2UbeI4AADiOAAAGwAAAAAAAAAAAAAApIEjcAgAQGFnb3JpYy92b3ctdjAuMS4wL3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAJh5zZSVAgAAlQIAAB8AAAAAAAAAAAAAAKSBPqkIAEBhZ29yaWMvdm93LXYwLjEuMC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAXT1b6EgZAABIGQAALQAAAAAAAAAAAAAApIEQrAgAQGFnb3JpYy92b3ctdjAuMS4wL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzUEsBAh4DCgAAAAAAAAAAAEYv0d7UDgAA1A4AACsAAAAAAAAAAAAAAKSBo8UIAEBhZ29yaWMvdm93LXYwLjEuMC9zcmMvcmVqZWN0aW9uLXRyYWNrZXIuanNQSwECHgMKAAAAAAAAAAAA/TsAScQdAADEHQAAIwAAAAAAAAAAAAAApIHA1AgAQGFnb3JpYy92b3ctdjAuMS4wL3NyYy9yZXRyeWFibGUuanNQSwECHgMKAAAAAAAAAAAAEXEIQSgQAAAoEAAAHwAAAAAAAAAAAAAApIHF8ggAQGFnb3JpYy92b3ctdjAuMS4wL3NyYy90b29scy5qc1BLAQIeAwoAAAAAAAAAAAAu5cbEJREAACURAAAlAAAAAAAAAAAAAACkgSoDCQBAYWdvcmljL3Zvdy12MC4xLjAvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACUAAAAAAAAAAAAAAKSBkhQJAEBhZ29yaWMvdm93LXYwLjEuMC9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAA2uU8XwkQAAAJEAAAIwAAAAAAAAAAAAAApIEtFgkAQGFnb3JpYy92b3ctdjAuMS4wL3NyYy92b3ctdXRpbHMuanNQSwECHgMKAAAAAAAAAAAArBd0IZAgAACQIAAAHQAAAAAAAAAAAAAApIF3JgkAQGFnb3JpYy92b3ctdjAuMS4wL3NyYy92b3cuanNQSwECHgMKAAAAAAAAAAAA0B3/c/slAAD7JQAAJQAAAAAAAAAAAAAApIFCRwkAQGFnb3JpYy92b3ctdjAuMS4wL3NyYy93YXRjaC11dGlscy5qc1BLAQIeAwoAAAAAAAAAAACAhdEJUR0AAFEdAAAfAAAAAAAAAAAAAACkgYBtCQBAYWdvcmljL3Zvdy12MC4xLjAvc3JjL3dhdGNoLmpzUEsBAh4DCgAAAAAAAAAAABYqDxCODQAAjg0AAB4AAAAAAAAAAAAAAKSBDosJAEBhZ29yaWMvdm93LXYwLjEuMC9zcmMvd2hlbi5qc1BLAQIeAwoAAAAAAAAAAACfCNTcvwwAAL8MAAAZAAAAAAAAAAAAAACkgdiYCQBAYWdvcmljL3Zvdy12MC4xLjAvdmF0LmpzUEsBAh4DCgAAAAAAAAAAAKGWQ5mJEQAAiREAADQAAAAAAAAAAAAAAKSBzqUJAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanNQSwECHgMKAAAAAAAAAAAAazhNcmcTAABnEwAAOQAAAAAAAAAAAAAApIGptwkAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzUEsBAh4DCgAAAAAAAAAAAEI+scmOHQAAjh0AADgAAAAAAAAAAAAAAKSBZ8sJAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9ib25kaW5nQ3VydmVzLmpzUEsBAh4DCgAAAAAAAAAAADfO1r4xFAAAMRQAADUAAAAAAAAAAAAAAKSBS+kJAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzUEsBAh4DCgAAAAAAAAAAALWYrzimCAAApggAADAAAAAAAAAAAAAAAKSBz/0JAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAB8zuEBqw8AAKsPAAA6AAAAAAAAAAAAAACkgcMGCgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJlcGFyZS1vd25hYmxlLmpzUEsBAh4DCgAAAAAAAAAAANnKq1GJNQAAiTUAADkAAAAAAAAAAAAAAKSBxhYKAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qc1BLAQIeAwoAAAAAAAAAAABoH8qu5gsAAOYLAAA1AAAAAAAAAAAAAACkgaZMCgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qc1BLAQIeAwoAAAAAAAAAAABb0apFYykAAGMpAAAzAAAAAAAAAAAAAACkgd9YCgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanNQSwECHgMKAAAAAAAAAAAAKK+k+uwEAADsBAAANwAAAAAAAAAAAAAApIGTggoAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRlTWFjaGluZS5qc1BLAQIeAwoAAAAAAAAAAACNGVQXBgYAAAYGAAA1AAAAAAAAAAAAAACkgdSHCgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qc1BLAQIeAwoAAAAAAAAAAAB71gJK6QMAAOkDAAA5AAAAAAAAAAAAAACkgS2OCgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvdGVzdEppZ0hlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAYwjL1L8JAAC/CQAAMQAAAAAAAAAAAAAApIFtkgoAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3RvcGljcy5qc1BLAQIeAwoAAAAAAAAAAADBrlNwkz0AAJM9AAA1AAAAAAAAAAAAAACkgXucCgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAB0/RLSEsAAEhLAAAlAAAAAAAAAAAAAACkgWHaCgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAANn0k7SWAQAAlgEAAB4AAAAAAAAAAAAAAKSB7CULAEBhZ29yaWMvem9uZS12MC4yLjIvZHVyYWJsZS5qc1BLAQIeAwoAAAAAAAAAAACAMlLK2hMAANoTAAAiAAAAAAAAAAAAAACkgb4nCwBAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9kdXJhYmxlLmpzUEsBAh4DCgAAAAAAAAAAANY4VALFAQAAxQEAAB8AAAAAAAAAAAAAAKSB2DsLAEBlbmRvL2NhY2hlLW1hcC12MS4xLjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAgZXu/CYnAAAmJwAAJgAAAAAAAAAAAAAApIHaPQsAQGVuZG8vY2FjaGUtbWFwLXYxLjEuMC9zcmMvY2FjaGVtYXAuanNQSwECHgMKAAAAAAAAAAAAb1Ehj2ELAABhCwAALAAAAAAAAAAAAAAApIFEZQsAQGVuZG8vY29tbW9uLXYxLjIuMTMvYXBwbHktbGFiZWxpbmctZXJyb3IuanNQSwECHgMKAAAAAAAAAAAASPhCyt0FAADdBQAAKwAAAAAAAAAAAAAApIHvcAsAQGVuZG8vY29tbW9uLXYxLjIuMTMvZnJvbS11bmlxdWUtZW50cmllcy5qc1BLAQIeAwoAAAAAAAAAAAC3lVPuJQgAACUIAAAlAAAAAAAAAAAAAACkgRV3CwBAZW5kby9jb21tb24tdjEuMi4xMy9pZGVudC1jaGVja2VyLmpzUEsBAh4DCgAAAAAAAAAAAGGv/Gq4BAAAuAQAACcAAAAAAAAAAAAAAKSBfX8LAEBlbmRvL2NvbW1vbi12MS4yLjEzL2xpc3QtZGlmZmVyZW5jZS5qc1BLAQIeAwoAAAAAAAAAAAAl7F33eQQAAHkEAAArAAAAAAAAAAAAAACkgXqECwBAZW5kby9jb21tb24tdjEuMi4xMy9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzUEsBAh4DCgAAAAAAAAAAAF02r3oGAwAABgMAACUAAAAAAAAAAAAAAKSBPIkLAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtaXRlcmF0b3IuanNQSwECHgMKAAAAAAAAAAAAduerGW8KAABvCgAAIgAAAAAAAAAAAAAApIGFjAsAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1hcC5qc1BLAQIeAwoAAAAAAAAAAAComiDaOwkAADsJAAAnAAAAAAAAAAAAAACkgTSXCwBAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWV0YS1tYXAuanNQSwECHgMKAAAAAAAAAAAA2LNBgpkFAACZBQAAJQAAAAAAAAAAAAAApIG0oAsAQGVuZG8vY29tbW9uLXYxLjIuMTMvdGhyb3ctbGFiZWxlZC5qc1BLAQIeAwoAAAAAAAAAAAA0oqGpogEAAKIBAAAiAAAAAAAAAAAAAACkgZCmCwBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALwBM4I4FgAAOBYAACwAAAAAAAAAAAAAAKSBcqgLAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvc3JjL2Vudi1vcHRpb25zLmpzUEsBAh4DCgAAAAAAAAAAAGpmduJkDQAAZA0AAB0AAAAAAAAAAAAAAKSB9L4LAEBlbmRvL2Vycm9ycy12MS4yLjEzL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAANPpRggQRwAAEEcAACMAAAAAAAAAAAAAAKSBk8wLAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACkAAAAAAAAAAAAAAKSB5BMMAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAHOVMVJyFAAAchQAACcAAAAAAAAAAAAAAKSBgxUMAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9sb2NhbC5qc1BLAQIeAwoAAAAAAAAAAACHeIi59BgAAPQYAAA1AAAAAAAAAAAAAACkgToqDABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1BLAQIeAwoAAAAAAAAAAAApE1XZ1gUAANYFAAApAAAAAAAAAAAAAACkgYFDDABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAAAzKKSOVxIAAFcSAAAtAAAAAAAAAAAAAACkgZ5JDABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAe6GgR2QCAABkAgAAIwAAAAAAAAAAAAAApIFAXAwAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAA3EXZo2ACAABgAgAAGgAAAAAAAAAAAAAApIHlXgwAQGVuZG8vZXhvLXYxLjUuMTIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAsZMQ/xAgAAAQIAAAIwAAAAAAAAAAAAAApIF9YQwAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by1tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAFaP+6y5GAAAuRgAAIgAAAAAAAAAAAAAApIHOgQwAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by10b29scy5qc1BLAQIeAwoAAAAAAAAAAADJJdo2CwUAAAsFAAAmAAAAAAAAAAAAAACkgTzIDABAZW5kby9leG8tdjEuNS4xMi9zcmMvZ2V0LWludGVyZmFjZS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAeAAAAAAAAAAAAAACkgYvNDABAZW5kby9leG8tdjEuNS4xMi9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIAAAAAAAAAAAAAAApIEfzwwAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAqSbWUJgCAACYAgAAHgAAAAAAAAAAAAAApIG10AwAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHVGf9kHCAAABwgAAB0AAAAAAAAAAAAAAKSBidMMAEBlbmRvL21hcnNoYWwtdjEuOC4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGC/aqjJfQAAyX0AACoAAAAAAAAAAAAAAKSBy9sMAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAADVwnO6F0QAABdEAAArAAAAAAAAAAAAAACkgdxZDQBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzUEsBAh4DCgAAAAAAAAAAAA1TX470RQAA9EUAAC0AAAAAAAAAAAAAAKSBPJ4NAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc1BLAQIeAwoAAAAAAAAAAABCdBXpvkIAAL5CAAAqAAAAAAAAAAAAAACkgXvkDQBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1qdXN0aW4uanNQSwECHgMKAAAAAAAAAAAAq3GB+KEJAAChCQAALQAAAAAAAAAAAAAApIGBJw4AQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAAGVYhbV8PwAAfD8AACMAAAAAAAAAAAAAAKSBbTEOAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAIGivjHoWQAA6FkAACUAAAAAAAAAAAAAAKSBKnEOAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIQAAAAAAAAAAAAAApIFVyw4AQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAOMQ3SNJDAAASQwAAB0AAAAAAAAAAAAAAKSB7MwOAEBlbmRvL25hdC12NS4xLjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAG5u3nM2CwAANgsAACAAAAAAAAAAAAAAAKSBcNkOAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAE6FbiMVDQAAFQ0AACgAAAAAAAAAAAAAAKSB5OQOAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9ieXRlQXJyYXkuanNQSwECHgMKAAAAAAAAAAAAmae90ggIAAAICAAAKAAAAAAAAAAAAAAApIE/8g4AQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAABHL7odZwsAAGcLAAApAAAAAAAAAAAAAACkgY36DgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAACeOsLT2BkAANgZAAAuAAAAAAAAAAAAAACkgTsGDwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAAGrLJkbNHQAAzR0AACQAAAAAAAAAAAAAAKSBXyAPAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9lcnJvci5qc1BLAQIeAwoAAAAAAAAAAAB7Bop6fAkAAHwJAAArAAAAAAAAAAAAAACkgW4+DwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvaXRlci1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAKEnjMn0JQAA9CUAACcAAAAAAAAAAAAAAKSBM0gPAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlLWZhci5qc1BLAQIeAwoAAAAAAAAAAACcUmBpgwUAAIMFAAApAAAAAAAAAAAAAACkgWxuDwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZVRhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAB8Jer96iEAAOohAAAwAAAAAAAAAAAAAACkgTZ0DwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAJgKOt2I/AABiPwAAKgAAAAAAAAAAAAAApIFulg8AQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAAPucn7IwLgAAMC4AACgAAAAAAAAAAAAAAKSBGNYPAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAAh4APKFIWAABSFgAAKwAAAAAAAAAAAAAApIGOBBAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3NhZmUtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAD8qNkH2w8AANsPAAAlAAAAAAAAAAAAAACkgSkbEABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc3RyaW5nLmpzUEsBAh4DCgAAAAAAAAAAAAL3NCLDFAAAwxQAACUAAAAAAAAAAAAAAKSBRysQAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAAXLhQ2WQJAABkCQAAJQAAAAAAAAAAAAAApIFNQBAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAC3XT1cJhYAACYWAAApAAAAAAAAAAAAAACkgfRJEABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAkAAAAAAAAAAAAAACkgWFgEABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAdU2S3O8OAADvDgAAHgAAAAAAAAAAAAAApIH7YRAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKohA+kLSAAAC0gAACoAAAAAAAAAAAAAAKSBJnEQAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAAD/2yuQPygAAD8oAAAtAAAAAAAAAAAAAACkgXm5EABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29tcGFyZUtleXMuanNQSwECHgMKAAAAAAAAAAAANFtTY00VAABNFQAAKQAAAAAAAAAAAAAApIED4hAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlCYWcuanNQSwECHgMKAAAAAAAAAAAALCODJiwRAAAsEQAAKQAAAAAAAAAAAAAApIGX9xAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAA2zWaQMMiAADDIgAAOQAAAAAAAAAAAAAApIEKCREAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAJnEOAFXKAAAVygAADUAAAAAAAAAAAAAAKSBJCwRAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAHQfjxllLwAAZS8AADUAAAAAAAAAAAAAAKSBzlQRAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAF0aWkIrLwAAKy8AADYAAAAAAAAAAAAAAKSBhoQRAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc1BLAQIeAwoAAAAAAAAAAABmpO57vjIBAL4yAQA1AAAAAAAAAAAAAACkgQW0EQBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAiAAAAAAAAAAAAAACkgRbnEgBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAAsCsWGzCQAAswkAACIAAAAAAAAAAAAAAKSBrugSAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA564QmQMDAAADAwAAKwAAAAAAAAAAAAAApIGh8hIAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAADHaE2fRBYAAEQWAAAqAAAAAAAAAAAAAACkge31EgBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9tZW1vLXJhY2UuanNQSwECHgMKAAAAAAAAAAAACJ+oaB0IAAAdCAAANQAAAAAAAAAAAAAApIF5DBMAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAAAAAAAAAAAApIHpFBMAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAALOZ7ulEcAABRHAAAHQAAAAAAAAAAAAAApIGFFhMAQGVuZG8vc3RyZWFtLXYxLjIuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA7lv2v9EBAADRAQAAHAAAAAAAAAAAAAAApIERMxMAamVzc2llLmpzLXYwLjMuNC9zcmMvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAAD2YCXkgQEAAIEBAAAfAAAAAAAAAAAAAACkgRw1EwBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9FLmpzUEsBAh4DCgAAAAAAAAAAAN6HOIP1AwAA9QMAACwAAAAAAAAAAAAAAKSB2jYTAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzUEsBAh4DCgAAAAAAAAAAAP56+f30AQAA9AEAACIAAAAAAAAAAAAAAKSBGTsTAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21haW4uanNQSwECHgMKAAAAAAAAAAAAwxmxeDMJAAAzCQAAJAAAAAAAAAAAAAAApIFNPRMAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAAGlUeF5SBQAAUgUAACkAAAAAAAAAAAAAAKSBwkYTAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAABtoNwOWAQAAlgEAACIAAAAAAAAAAAAAAKSBW0wTAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL21haW4uanNQSwUGAAAAAMQAxAB4QgAAMU4TAAAA","endoZipBase64Sha512":"55a0b35fdd0d37220472c9961ea7760c001e0e9e90a0bc490ddb379d24db866ae8c5a441599da64dada26aca0fdc10e9d6d34c306af12e9ecb48e539f36b4af2"};